@t3q-ui/design-system 1.58.0 → 1.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/accordion.tsx","../src/components/alertDialog.tsx","../src/components/breadcrumb.tsx","../src/components/calendar.tsx","../src/components/checkboxSection.tsx","../src/components/columnFilter/types.ts","../src/components/columnFilter/ColumnFilter.tsx","../src/components/_internal/cancelIcon.tsx","../src/utils/message.ts","../src/components/command.tsx","../src/components/tableFilterParts.tsx","../src/components/columnFilter/ColumnFilterPopover.tsx","../src/components/columnFilter/ColumnFilterTag.tsx","../src/components/columnFilter/ColumnFilterInput.tsx","../src/components/popover.tsx","../src/components/columnVisibilityFilter.tsx","../src/components/_internal/floatingLabelOutline.tsx","../src/hooks/useFloatingLabel.ts","../src/utils/word.ts","../src/components/label.tsx","../src/components/datePresets.tsx","../src/components/tableFilter.tsx","../src/components/datePicker.tsx","../src/components/textField.tsx","../src/components/iconSelect/icons.json","../src/components/iconSelect/index.tsx","../src/components/metaItem.tsx","../src/components/eventList.tsx","../src/components/pageHeaderRefreshButton.tsx","../src/components/parameterTable/cellSelection/clipboard.ts","../src/components/parameterTable/cellSelection/types.ts","../src/components/parameterTable/types.ts","../src/components/parameterTable/ParameterTableRow.tsx","../src/components/parameterTable/ParameterTable.tsx","../src/components/progress.tsx","../src/components/radio.tsx","../src/components/radioGroup.tsx","../src/components/radioSection.tsx","../src/components/multiSelect/multiSelectContext.tsx","../src/components/multiSelect/multiSelect.tsx","../src/components/_internal/labelPass.tsx","../src/components/multiSelect/multiSelectContent.tsx","../src/components/multiSelect/multiSelectEmpty.tsx","../src/components/multiSelect/multiSelectGroup.tsx","../src/components/multiSelect/multiSelectInput.tsx","../src/components/select/selectItemContent.tsx","../src/components/multiSelect/multiSelectItem.tsx","../src/components/multiSelect/multiSelectLoading.tsx","../src/components/multiSelect/multiSelectSeparator.tsx","../src/components/select/selectContext.tsx","../src/components/select/selectTrigger.tsx","../src/components/tag.tsx","../src/components/multiSelect/multiSelectTrigger.tsx","../src/components/select/select.tsx","../src/components/select/selectContent.tsx","../src/components/select/selectEmpty.tsx","../src/components/select/selectGroup.tsx","../src/components/select/selectInput.tsx","../src/components/select/selectItem.tsx","../src/components/select/selectLoading.tsx","../src/components/select/selectRadioGroup.tsx","../src/components/select/selectRadioItem.tsx","../src/components/select/selectSeparator.tsx","../src/components/select/selectValue.tsx","../src/components/sidebar/index.tsx","../src/components/range/useRangeValue.ts","../src/components/range/ticks.tsx","../src/components/range/rangeSlider.tsx","../src/components/range/useNumberInput.ts","../src/components/range/range.tsx","../src/components/switch.tsx","../src/components/switchSection.tsx","../src/components/textArea.tsx","../src/components/timePicker.tsx","../src/components/themeProvider.tsx","../src/components/toast.tsx"],"names":["React","React2","jsx","jsxs","React3","React4","Fragment","React5","React6","React7","React8","CommandPrimitive","Info","React9","React10","FOCUS_RING_MAIN_STYLE","React11","React12","Search","React13","useState","useEffect","useCallback","React14","cva","forwardRef","date","todayPosition","ChevronLeft","useMemo","FilterTitle","format","ko","value","CheckIcon","React15","CalendarIcon","React16","useRef","debounce","filteredIcons","React18","React19","RadioGroupPrimitive2","React20","MultiSelect","React21","PopoverPrimitive2","React22","React23","PopoverPrimitive3","React24","React25","React26","React27","React28","React29","React30","React31","PopoverPrimitive4","Slot","React32","PopoverPrimitive5","React33","PopoverPrimitive6","React34","PopoverPrimitive7","search","React35","React36","React37","React38","React39","React40","React41","React42","React43","ChevronDown","React44","React45","React46","Range","React47","React48","Check","React49","React50","React51","React52","sonnerToast","CircleCheck","TriangleAlert","CircleX","SonnerToaster"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst AccordionStickyContext = React.createContext(false)\n\ntype AccordionProps = React.ComponentProps<typeof AccordionPrimitive.Root> & {\n sticky?: boolean\n}\n\nfunction Accordion({ sticky = false, className, ...props }: AccordionProps) {\n return (\n <AccordionStickyContext.Provider value={sticky}>\n <AccordionPrimitive.Root\n data-slot='accordion'\n className={cn('w-full', className)}\n {...props}\n />\n </AccordionStickyContext.Provider>\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return <AccordionPrimitive.Item data-slot='accordion-item' className={cn(className)} {...props} />\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n const sticky = React.useContext(AccordionStickyContext)\n return (\n <AccordionPrimitive.Header\n className={cn(\n 'flex border-t border-sys-divider-subtle',\n sticky &&\n 'sticky top-[var(--accordion-sticky-top,0px)] z-10 bg-sys-background-blur backdrop-blur-md',\n )}\n >\n <AccordionPrimitive.Trigger\n data-slot='accordion-trigger'\n className={cn(\n 'group flex w-full items-center gap-[8px] pl-[16px] pr-[8px] py-[14px]',\n 'text-h5 text-sys-text-main text-left',\n 'cursor-pointer transition-colors',\n 'hover:bg-secondary-o10 active:bg-secondary-o20',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:-outline-offset-1 focus-visible:relative focus-visible:z-10',\n 'disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <span className='flex flex-1 items-center gap-[8px] min-w-0 [&_svg]:size-[20px] [&_svg]:shrink-0'>\n {children}\n </span>\n <span className='flex size-[24px] shrink-0 items-center justify-center rounded-small p-[6px]'>\n <ChevronDown\n className='size-[12px] transition-transform duration-200 group-data-[state=open]:rotate-180'\n aria-hidden\n />\n </span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot='accordion-content'\n className={cn(\n 'overflow-hidden text-base-regular text-sys-text-subtle',\n 'data-[state=open]:animate-accordion-down',\n 'data-[state=closed]:animate-accordion-up',\n )}\n {...props}\n >\n <div\n className={cn('flex items-center justify-center px-[16px] pt-[16px] pb-[48px]', className)}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","'use client'\n\nimport * as React from 'react'\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\nimport { cva, VariantProps } from 'class-variance-authority'\nimport { CircleCheck, CircleX, Info, TriangleAlert } from 'lucide-react'\n\nimport { useRestoreFocusToOpener } from './_internal/useRestoreFocusToOpener'\nimport { cn } from '../utils/cn'\nimport { sanitizeUserText } from '../utils/sanitizeUserText'\nimport { Button, buttonVariants } from './button'\nimport { Stack } from './stack'\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n {...props}\n className={cn(\n 'fixed inset-0 z-[var(--root-z-index)] bg-sys-blanket',\n 'data-[state=open]:animate-[fade-in_0ms_ease-out,zoom-in_0ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_0ms_ease-in,zoom-out_0ms_ease-in]',\n className,\n )}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst alertDialogContentVariants = cva(null, {\n variants: {\n width: {\n small: 'w-[400px]',\n medium: 'w-[600px]',\n large: 'w-[800px]',\n xlarge: 'w-[1000px]',\n },\n },\n defaultVariants: {\n width: 'small',\n },\n})\n\ntype AlertDialogContextType = {\n variant?: 'success' | 'info' | 'warning' | 'danger'\n}\nconst AlertDialogContext = React.createContext<AlertDialogContextType>({\n variant: 'info',\n})\n\n/**\n * 확인 대화상자 본체. 되돌릴 수 없는 행동 직전의 최종 확인에만 쓴다.\n *\n * 언제 쓰나: 삭제·중지·초기화처럼 결과가 사라지는 행동. 제목에 대상 이름을 넣고, 확인 버튼은 `danger*` variant 로 행동 이름(\"삭제\")을 쓴다.\n * 언제 안 쓰나: 입력이 필요한 작업(→ Dialog), 단순 정보 안내(→ Alert·Toast), 되돌릴 수 있는 행동(확인 없이 실행 후 Toast).\n * 대신/함께: 실수 방지가 더 필요하면 이름을 입력해야 삭제되는 방식을 소비 앱에서 더한다.\n */\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> &\n VariantProps<typeof alertDialogContentVariants> &\n AlertDialogContextType\n>(({ className, width, variant, onOpenAutoFocus, onCloseAutoFocus, ...props }, ref) => {\n // 닫힐 때 포커스를 연 요소로 돌린다 — Radix 는 Trigger 가 없으면 body 로 떨어뜨린다\n const focusHandlers = useRestoreFocusToOpener({ onOpenAutoFocus, onCloseAutoFocus })\n return (\n <AlertDialogContext.Provider value={{ variant }}>\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n {...props}\n {...focusHandlers}\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-[var(--root-z-index)] translate-x-[-50%] translate-y-[-50%] w-full max-w-[70vw]',\n 'grid gap-[16px] rounded-medium bg-sys-background p-[32px] shadow-gray-medium duration-200',\n 'data-[state=open]:animate-[fade-in_0ms_ease-out,zoom-in_0ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_0ms_ease-in,zoom-out_0ms_ease-in]',\n alertDialogContentVariants({ width }),\n className,\n )}\n />\n </AlertDialogPortal>\n </AlertDialogContext.Provider>\n )\n})\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = (props: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n {...props}\n className={cn('flex flex-col gap-[16px] text-center sm:text-left', props.className)}\n />\n)\nAlertDialogHeader.displayName = 'AlertDialogHeader'\n\nconst AlertDialogFooter = (props: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n {...props}\n className={cn('flex flex-row justify-end gap-[8px] sm:flex-row', props.className)}\n />\n)\nAlertDialogFooter.displayName = 'AlertDialogFooter'\n\nconst variantToIcon = {\n success: <CircleCheck className='text-success30' />,\n info: <Info className='text-sys-text-subtler' />,\n warning: <TriangleAlert className='text-critical30' />,\n danger: <CircleX className='text-danger30' />,\n} as const\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ children, ...props }, ref) => {\n const { variant } = React.useContext(AlertDialogContext)\n\n return (\n <Stack spacing={8}>\n {variantToIcon[variant || 'info']}\n <AlertDialogPrimitive.Title\n {...props}\n ref={ref}\n className={cn('text-h4 text-sys-text-main whitespace-pre-wrap', props.className)}\n >\n {sanitizeUserText(children)}\n </AlertDialogPrimitive.Title>\n </Stack>\n )\n})\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ children, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n {...props}\n ref={ref}\n className={cn('text-base-regular text-sys-text-main whitespace-pre-wrap', props.className)}\n >\n {sanitizeUserText(children)}\n </AlertDialogPrimitive.Description>\n))\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action> &\n Pick<VariantProps<typeof buttonVariants>, 'variant' | 'loading'>\n>(({ variant, loading, children, ...props }, ref) => {\n const { variant: dialogVariant } = React.useContext(AlertDialogContext)\n\n const buttonVariant = {\n success: 'primaryBold',\n info: 'primaryBold',\n warning: 'warningBold',\n danger: 'dangerBold',\n } as const\n\n return (\n <AlertDialogPrimitive.Action ref={ref} asChild {...props}>\n <Button variant={variant || buttonVariant[dialogVariant || 'info']} loading={loading}>\n {children}\n </Button>\n </AlertDialogPrimitive.Action>\n )\n})\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ children, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel ref={ref} asChild {...props}>\n <Button variant='secondary'>{children}</Button>\n </AlertDialogPrimitive.Cancel>\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { cn } from '../utils/cn'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip'\n\n/* -------------------------------- Breadcrumb ------------------------------ */\n\ntype BreadcrumbProps = React.ComponentPropsWithoutRef<'nav'> & {\n /** 하위 `BreadcrumbSeparator` 의 기본 구분자 (children 을 넘기지 않은 Separator 에 적용) */\n separator?: React.ReactNode\n}\n\nconst BreadcrumbSeparatorContext = React.createContext<React.ReactNode>(undefined)\n\nconst Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({ className, separator, ...props }, ref) => (\n <BreadcrumbSeparatorContext.Provider value={separator}>\n <nav ref={ref} aria-label='breadcrumb' className={cn('w-fit', className)} {...props} />\n </BreadcrumbSeparatorContext.Provider>\n ),\n)\nBreadcrumb.displayName = 'Breadcrumb'\n\n/* ------------------------------ BreadcrumbList ---------------------------- */\n\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol ref={ref} className={cn('flex items-center gap-[4px]', className)} {...props} />\n ),\n)\nBreadcrumbList.displayName = 'BreadcrumbList'\n\n/* ------------------------------ BreadcrumbItem ---------------------------- */\n\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li ref={ref} className={cn('flex items-center gap-[4px]', className)} {...props} />\n ),\n)\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nconst ICON_SLOT_CLASS = 'inline-flex shrink-0 items-center justify-center size-[16px]'\n\nfunction extractTruncateText(children: React.ReactNode): string {\n if (typeof children === 'string') return children\n if (React.isValidElement(children)) {\n const inner = (children.props as { children?: React.ReactNode })?.children\n if (typeof inner === 'string') return inner\n }\n return ''\n}\n\nfunction wrapAsChildWithIcons(\n children: React.ReactNode,\n leftIcon: React.ReactNode,\n rightIcon: React.ReactNode,\n): React.ReactNode {\n if (!React.isValidElement(children)) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Breadcrumb] asChild 와 함께 leftIcon/rightIcon 을 쓰려면 자식이 단일 React element 여야 합니다.',\n )\n }\n return children\n }\n const element = children as React.ReactElement<{ children?: React.ReactNode }>\n return React.cloneElement(element, {\n children: (\n <>\n {leftIcon ? <span className={ICON_SLOT_CLASS}>{leftIcon}</span> : null}\n {element.props.children}\n {rightIcon ? <span className={ICON_SLOT_CLASS}>{rightIcon}</span> : null}\n </>\n ),\n })\n}\n\n/* ------------------------------ BreadcrumbLink ---------------------------- */\n\ntype BreadcrumbLinkProps = React.ComponentPropsWithoutRef<'a'> & {\n asChild?: boolean\n truncate?: boolean\n maxLength?: number\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n}\n\nconst BreadcrumbLink = React.forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n (\n {\n className,\n asChild = false,\n truncate = false,\n maxLength = 20,\n leftIcon,\n rightIcon,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'a'\n\n const textContent = extractTruncateText(children)\n const isTruncated = truncate && textContent.length > maxLength\n const truncatedText = isTruncated ? textContent.slice(0, maxLength) : textContent\n\n const truncatedBody = (\n <span className='inline-flex items-center gap-[2px]'>\n <span className='whitespace-pre'>{truncatedText}</span>\n <span>...</span>\n </span>\n )\n\n const truncatedAsChildElement =\n isTruncated && React.isValidElement(children)\n ? React.cloneElement(\n children as React.ReactElement<{ children?: React.ReactNode }>,\n undefined,\n truncatedBody,\n )\n : children\n\n const linkBody = isTruncated ? truncatedBody : children\n\n const compChildren = (() => {\n if (asChild && (leftIcon || rightIcon)) {\n return wrapAsChildWithIcons(truncatedAsChildElement, leftIcon, rightIcon)\n }\n if (asChild) {\n return truncatedAsChildElement\n }\n return (\n <>\n {leftIcon ? <span className={ICON_SLOT_CLASS}>{leftIcon}</span> : null}\n {linkBody}\n {rightIcon ? <span className={ICON_SLOT_CLASS}>{rightIcon}</span> : null}\n </>\n )\n })()\n\n const linkContent = (\n <Comp\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-[4px] rounded-[3px]',\n // 2026-10-17 8차 E1: 헤더 틴트(#f4f8ff) 위에서 primary30 은 4.38:1 → primary40(6.67:1)\n 'whitespace-pre text-small-medium text-primary40',\n 'decoration-solid [text-decoration-skip-ink:none]',\n 'hover:underline',\n 'active:text-primary50 active:underline',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-sys-focus-ring-main',\n 'transition-colors',\n className,\n )}\n {...props}\n >\n {compChildren}\n </Comp>\n )\n\n if (isTruncated) {\n return (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>{linkContent}</TooltipTrigger>\n <TooltipContent className='px-[6px] py-[4px] rounded-[6px]'>\n <p className='whitespace-pre-wrap'>{textContent}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n }\n\n return linkContent\n },\n)\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\n/* ------------------------------ BreadcrumbPage ---------------------------- */\n\ntype BreadcrumbPageProps = React.ComponentPropsWithoutRef<'span'> & {\n truncate?: boolean\n maxLength?: number\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n}\n\nconst BreadcrumbPage = React.forwardRef<HTMLSpanElement, BreadcrumbPageProps>(\n (\n { className, truncate = false, maxLength = 20, leftIcon, rightIcon, children, ...props },\n ref,\n ) => {\n const textContent = extractTruncateText(children)\n const isTruncated = truncate && textContent.length > maxLength\n const truncatedText = isTruncated ? textContent.slice(0, maxLength) : textContent\n\n const pageBody = isTruncated ? (\n <span className='inline-flex items-center gap-[2px]'>\n <span className='whitespace-pre'>{truncatedText}</span>\n <span>...</span>\n </span>\n ) : (\n children\n )\n\n const pageContent = (\n <span\n ref={ref}\n role='link'\n aria-disabled='true'\n aria-current='page'\n className={cn(\n 'inline-flex items-center gap-[4px] whitespace-pre text-small-medium text-sys-text-subtle',\n className,\n )}\n {...props}\n >\n {leftIcon ? <span className={ICON_SLOT_CLASS}>{leftIcon}</span> : null}\n {pageBody}\n {rightIcon ? <span className={ICON_SLOT_CLASS}>{rightIcon}</span> : null}\n </span>\n )\n\n if (isTruncated) {\n return (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>{pageContent}</TooltipTrigger>\n <TooltipContent className='px-[6px] py-[4px] rounded-[6px]'>\n <p className='whitespace-pre-wrap'>{textContent}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n }\n\n return pageContent\n },\n)\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\n/* --------------------------- BreadcrumbSeparator -------------------------- */\n\ntype BreadcrumbSeparatorProps = React.ComponentPropsWithoutRef<'li'>\n\n// <ol> 의 직계 자식이 되므로 <li> 로 렌더한다 (span 이면 잘못된 목록 마크업)\nconst BreadcrumbSeparator = React.forwardRef<HTMLLIElement, BreadcrumbSeparatorProps>(\n ({ className, children, ...props }, ref) => {\n const separator = React.useContext(BreadcrumbSeparatorContext)\n return (\n <li\n ref={ref}\n role='presentation'\n aria-hidden='true'\n className={cn(\n 'inline-flex items-center text-small-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n {children ?? separator ?? '/'}\n </li>\n )\n },\n)\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { CaptionProps, DayPicker, useNavigation } from 'react-day-picker'\nimport { addYears, format, subYears } from 'date-fns'\nimport { ko } from 'date-fns/locale'\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport { IconButton } from './iconButton'\n\n// ============================================================================\n// Types & Context\n// ============================================================================\n\ntype CalendarView = 'days' | 'months' | 'years'\n\nconst CalendarViewContext = React.createContext<{\n setView: (view: CalendarView) => void\n numberOfMonths: number\n baseDisplayMonth: Date\n}>({ setView: () => {}, numberOfMonths: 1, baseDisplayMonth: new Date() })\n\n// ============================================================================\n// CalendarCaption — 모듈 레벨 선언 (BP-1: 참조 안정성)\n// ============================================================================\n\nfunction CalendarCaption({ displayMonth }: CaptionProps) {\n const { setView, numberOfMonths, baseDisplayMonth } = React.useContext(CalendarViewContext)\n const { goToMonth, previousMonth, nextMonth } = useNavigation()\n const caption = format(displayMonth, 'yyyy년 M월', { locale: ko })\n\n const isMultiMonth = numberOfMonths > 1\n const isFirstMonth =\n displayMonth.getFullYear() === baseDisplayMonth.getFullYear() &&\n displayMonth.getMonth() === baseDisplayMonth.getMonth()\n const showLeftNav = !isMultiMonth || isFirstMonth\n const showRightNav = !isMultiMonth || !isFirstMonth\n\n return (\n <div className='flex justify-between items-center pb-[12px] px-[8px]'>\n {/* 좌측 nav 그룹 */}\n <div className='flex items-center gap-[4px]'>\n {showLeftNav ? (\n <>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => goToMonth(subYears(displayMonth, 1))}\n aria-label='이전 년도'\n >\n <ChevronsLeft className='text-secondary60' />\n </IconButton>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => previousMonth && goToMonth(previousMonth)}\n aria-label='이전 월'\n >\n <ChevronLeft className='text-secondary60' />\n </IconButton>\n </>\n ) : (\n <div className='w-[60px]' />\n )}\n </div>\n\n {/* 캡션 (클릭 → months view) */}\n <button\n type='button'\n onClick={() => setView('months')}\n className='text-h6 text-secondary60 hover:text-primary40 cursor-pointer leading-[24px]'\n >\n {caption}\n </button>\n\n {/* 우측 nav 그룹 */}\n <div className='flex items-center gap-[4px]'>\n {showRightNav ? (\n <>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => nextMonth && goToMonth(nextMonth)}\n aria-label='다음 월'\n >\n <ChevronRight className='text-secondary60' />\n </IconButton>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => goToMonth(addYears(displayMonth, 1))}\n aria-label='다음 년도'\n >\n <ChevronsRight className='text-secondary60' />\n </IconButton>\n </>\n ) : (\n <div className='w-[60px]' />\n )}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// MonthsView\n// ============================================================================\n\ninterface MonthsViewProps {\n displayYear: number\n selectedMonth: number\n onSelectMonth: (month: number) => void\n onYearChange: (year: number) => void\n onViewChange: (view: CalendarView) => void\n}\n\nfunction MonthsView({\n displayYear,\n selectedMonth,\n onSelectMonth,\n onYearChange,\n onViewChange,\n}: MonthsViewProps) {\n const months = React.useMemo(() => Array.from({ length: 12 }, (_, i) => i), [])\n const rows = React.useMemo(\n () => [months.slice(0, 3), months.slice(3, 6), months.slice(6, 9), months.slice(9, 12)],\n [months],\n )\n const now = new Date()\n const isCurrentYear = displayYear === now.getFullYear()\n const currentMonth = now.getMonth()\n\n return (\n <>\n {/* 헤더: < 2024년 > */}\n <div className='flex justify-between items-center pb-[12px] px-[8px]'>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onYearChange(displayYear - 1)}\n aria-label='이전 년도'\n >\n <ChevronLeft className='text-secondary60' />\n </IconButton>\n <button\n type='button'\n onClick={() => onViewChange('years')}\n className='text-h6 text-secondary60 hover:text-primary40 cursor-pointer leading-[24px]'\n >\n {displayYear}년\n </button>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onYearChange(displayYear + 1)}\n aria-label='다음 년도'\n >\n <ChevronRight className='text-secondary60' />\n </IconButton>\n </div>\n\n {/* 4×3 월 그리드 */}\n <div\n role='grid'\n aria-label={`${displayYear}년 월 선택`}\n className='flex flex-col gap-[4px] py-[4px]'\n >\n {rows.map((row, ri) => (\n <div key={ri} role='row' className='flex justify-between'>\n {row.map((month) => {\n const isSelected = month === selectedMonth\n const isToday = isCurrentYear && month === currentMonth\n\n return (\n <div key={month} role='gridcell' className='flex-1'>\n <button\n type='button'\n onClick={() => onSelectMonth(month)}\n className={cn(\n 'min-h-[32px] w-full py-[4px] rounded-xsmall',\n 'text-base-regular text-sys-text-subtle',\n 'cursor-pointer hover:bg-secondary-o10 active:bg-secondary-o20 transition-colors',\n isSelected && '!text-primary40 !text-base-semibold',\n isToday &&\n !isSelected &&\n 'text-base-semibold relative after:content-[\"\"] after:absolute after:rounded-full after:h-[2px] after:w-[24px] after:bottom-[2px] after:left-1/2 after:-translate-x-1/2 after:bg-primary20',\n )}\n >\n {month + 1}월\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </>\n )\n}\n\n// ============================================================================\n// YearsView\n// ============================================================================\n\ninterface YearsViewProps {\n displayYear: number\n onSelectYear: (year: number) => void\n onRangeChange: (startYear: number) => void\n}\n\nfunction YearsView({ displayYear, onSelectYear, onRangeChange }: YearsViewProps) {\n const startYear = Math.floor(displayYear / 12) * 12\n const years = React.useMemo(\n () => Array.from({ length: 12 }, (_, i) => startYear + i),\n [startYear],\n )\n const rows = React.useMemo(\n () => [years.slice(0, 3), years.slice(3, 6), years.slice(6, 9), years.slice(9, 12)],\n [years],\n )\n const currentYear = new Date().getFullYear()\n\n return (\n <>\n {/* 헤더: < 시작년 - 끝년 > */}\n <div className='flex justify-between items-center pb-[12px] px-[8px]'>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onRangeChange(startYear - 12)}\n aria-label='이전 12년'\n >\n <ChevronLeft className='text-secondary60' />\n </IconButton>\n <span className='text-h6 text-secondary60 leading-[24px]'>\n {startYear}년 - {startYear + 11}년\n </span>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onRangeChange(startYear + 12)}\n aria-label='다음 12년'\n >\n <ChevronRight className='text-secondary60' />\n </IconButton>\n </div>\n\n {/* 4×3 년도 그리드 */}\n <div\n role='grid'\n aria-label={`${startYear}년 - ${startYear + 11}년 선택`}\n className='flex flex-col gap-[4px] py-[4px]'\n >\n {rows.map((row, ri) => (\n <div key={ri} role='row' className='flex justify-between'>\n {row.map((year) => {\n const isCurrentYr = year === currentYear\n\n return (\n <div key={year} role='gridcell' className='flex-1'>\n <button\n type='button'\n onClick={() => onSelectYear(year)}\n className={cn(\n 'min-h-[32px] w-full py-[4px] rounded-xsmall',\n 'text-base-regular text-sys-text-subtle',\n 'cursor-pointer hover:bg-secondary-o10 active:bg-secondary-o20 transition-colors',\n isCurrentYr &&\n 'text-base-semibold relative after:content-[\"\"] after:absolute after:rounded-full after:h-[2px] after:w-[24px] after:bottom-[2px] after:left-1/2 after:-translate-x-1/2 after:bg-primary20',\n )}\n >\n {year}년\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </>\n )\n}\n\n// ============================================================================\n// Calendar (Main)\n// ============================================================================\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker> & {\n className?: string\n classNames?: React.ComponentProps<typeof DayPicker>['classNames']\n showOutsideDays?: boolean\n /** 뷰 전환 비활성화 (항상 days view만 표시) */\n disableViewSwitching?: boolean\n}\n\nfunction Calendar({\n classNames: classNamesProp,\n className,\n showOutsideDays = true,\n disableViewSwitching = false,\n ...dayPickerProps\n}: CalendarProps) {\n const numberOfMonths = (dayPickerProps as { numberOfMonths?: number }).numberOfMonths ?? 1\n const [view, setView] = React.useState<CalendarView>('days')\n const [displayMonth, setDisplayMonth] = React.useState<Date>(\n dayPickerProps.defaultMonth ?? new Date(),\n )\n\n // 외부 month prop 동기화 (controlled mode 지원)\n const externalMonth = dayPickerProps.month\n React.useEffect(() => {\n if (externalMonth) setDisplayMonth(externalMonth)\n }, [externalMonth])\n\n const handleMonthChange = React.useCallback(\n (month: Date) => {\n setDisplayMonth(month)\n ;(dayPickerProps as { onMonthChange?: (month: Date) => void }).onMonthChange?.(month)\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [(dayPickerProps as { onMonthChange?: (month: Date) => void }).onMonthChange],\n )\n\n // view 전환 알림 (BP-4)\n const viewLabel =\n view === 'days'\n ? format(displayMonth, 'yyyy년 M월', { locale: ko })\n : view === 'months'\n ? `${displayMonth.getFullYear()}년 월 선택`\n : '년도 선택'\n\n // View 전환 핸들러\n const effectiveSetView = React.useMemo(\n () => (disableViewSwitching ? () => {} : setView),\n [disableViewSwitching],\n )\n\n const handleMonthSelect = React.useCallback((month: number) => {\n setDisplayMonth((prev) => new Date(prev.getFullYear(), month, 1))\n setView('days')\n }, [])\n\n const handleYearSelect = React.useCallback((year: number) => {\n setDisplayMonth((prev) => new Date(year, prev.getMonth(), 1))\n setView('months')\n }, [])\n\n const handleMonthsYearChange = React.useCallback((year: number) => {\n setDisplayMonth((prev) => new Date(year, prev.getMonth(), 1))\n }, [])\n\n const handleYearsRangeChange = React.useCallback((startYear: number) => {\n setDisplayMonth((prev) => new Date(startYear, prev.getMonth(), 1))\n }, [])\n\n // outside day 클릭 → 해당 월로 네비게이션\n const handleDayClick = React.useCallback(\n (date: Date, modifiers: Record<string, boolean>, e: React.MouseEvent) => {\n if (modifiers.outside) {\n const newMonth = new Date(date.getFullYear(), date.getMonth(), 1)\n handleMonthChange(newMonth)\n }\n // 외부 onDayClick 콜백 체이닝\n ;(dayPickerProps as { onDayClick?: (...args: unknown[]) => void }).onDayClick?.(\n date,\n modifiers,\n e,\n )\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [handleMonthChange, (dayPickerProps as { onDayClick?: unknown }).onDayClick],\n )\n\n const contextValue = React.useMemo(\n () => ({ setView: effectiveSetView, numberOfMonths, baseDisplayMonth: displayMonth }),\n [effectiveSetView, numberOfMonths, displayMonth],\n )\n\n return (\n <div\n className={cn(\n 'p-[24px]',\n numberOfMonths === 1 ? 'w-[342px]' : 'w-auto min-w-[342px]',\n className,\n )}\n >\n {/* View 전환 알림 (BP-4: aria-live) */}\n <span className='sr-only' aria-live='polite'>\n {viewLabel}\n </span>\n\n {view === 'days' && (\n <CalendarViewContext.Provider value={contextValue}>\n <DayPicker\n fixedWeeks\n showOutsideDays={showOutsideDays}\n locale={ko}\n classNames={{\n root: 'p-0 w-full',\n months: cn('flex gap-[16px]', numberOfMonths === 1 ? 'flex-col' : 'flex-row'),\n month: 'flex flex-col flex-1 min-w-[294px]',\n // caption/nav classNames은 커스텀 Caption이 대체하므로 미사용\n table: 'w-full border-collapse',\n head: '[&>tr]:flex',\n head_cell: 'text-sys-text-subtle text-small-bold flex-1 py-[8px]',\n row: 'flex w-full',\n cell: 'relative p-0 text-center flex-1 focus-within:z-20 [aria-selected]:bg-primary-o10',\n day: cn(\n 'min-h-[32px] w-full py-[4px] text-base-regular text-sys-text-subtle bg-none border-none rounded-xsmall',\n 'cursor-pointer hover:bg-secondary-o10 active:bg-secondary-o20 transition-colors',\n ),\n day_range_start: '!rounded-r-none bg-primary-o20',\n day_range_end: '!rounded-l-none bg-primary-o20',\n day_selected:\n 'bg-primary-o10 !text-primary40 !text-base-regular hover:bg-primary-o20',\n day_today: cn(\n 'rdp-day_today !text-base-semibold relative',\n 'after:content-[\"\"] after:absolute after:rounded-full after:h-[2px] after:w-[24px] after:bottom-[2px] after:left-1/2 after:-translate-x-1/2 after:bg-primary20',\n ),\n // 이웃 달 날짜는 클릭 가능한 버튼이라 대비 4.5:1 대상 — disabled 토큰(1.5:1) 대신 subtler(5.3:1)\n day_outside: 'rdp-day_outside !text-sys-text-subtler',\n day_range_middle: 'bg-primary-o10 !rounded-none',\n day_disabled: '!text-sys-text-disabled',\n day_hidden: 'invisible',\n ...classNamesProp,\n }}\n components={{\n Caption: CalendarCaption,\n }}\n {...dayPickerProps}\n month={displayMonth}\n onMonthChange={handleMonthChange}\n onDayClick={handleDayClick}\n />\n </CalendarViewContext.Provider>\n )}\n\n {view === 'months' && (\n <MonthsView\n displayYear={displayMonth.getFullYear()}\n selectedMonth={displayMonth.getMonth()}\n onSelectMonth={handleMonthSelect}\n onYearChange={handleMonthsYearChange}\n onViewChange={effectiveSetView}\n />\n )}\n\n {view === 'years' && (\n <YearsView\n displayYear={displayMonth.getFullYear()}\n onSelectYear={handleYearSelect}\n onRangeChange={handleYearsRangeChange}\n />\n )}\n </div>\n )\n}\n\nexport { Calendar }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\n/* -------------------------------------------------------------------------- */\n/* CheckboxSectionGroup */\n/* -------------------------------------------------------------------------- */\n\ntype CheckboxSectionGroupContextValue = {\n value: string[]\n onValueChange?: (value: string[]) => void\n disabled?: boolean\n /** 5개 이상 세로 쌓기일 때 카드 안을 한 줄(제목 · 설명)로 */\n stacked: boolean\n}\nconst CheckboxSectionGroupContext = React.createContext<CheckboxSectionGroupContextValue | null>(\n null,\n)\n\ninterface CheckboxSectionGroupProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** 선택된 값들. controlled 전제 */\n value: string[]\n /** 카드를 누를 때 바뀐 값 목록 */\n onValueChange?: (value: string[]) => void\n /** 가로(기본)·세로 배치 */\n orientation?: 'horizontal' | 'vertical'\n /** 그룹 전체 비활성 */\n disabled?: boolean\n}\n\n/**\n * 카드형 체크박스(CheckboxSection)들을 묶는 그룹 — 제목·설명이 붙는 복수 선택(알림 채널, 포함할 산출물 종류).\n *\n * 언제 쓰나: 선택지 2~4개에 각각 제목과 한 줄 설명이 붙고 여러 개를 고를 수 있을 때(dl-ui-v3 의 카드형 선택 관례를 복수 선택으로).\n * 가로 배치는 개수로 정한다 — 2~3개 한 줄(n 등분), 4개 2×2, 5개 이상 세로 쌓기(카드 안은 제목 · 설명 가로), 카드 사이 8px — RadioSectionGroup 과 같은 규칙(2026-10-21 19차: 한 줄 4px 로 몰려 \"cards sit too close together\"·\"uneven internal heights\").\n * 언제 안 쓰나: 하나만 고르면 RadioSectionGroup, 설명 없는 짧은 옵션은 Checkbox, 선택지가 많으면 MultiSelect, 켜기/끄기 하나는 SwitchSection.\n * 대신/함께: `role='group'` 이므로 이름은 `aria-labelledby`(FormLabel 의 id) 또는 `aria-label` 로 준다. 카드마다 Tab 으로 가고 Space 로 켜고 끈다. 폼에서는 `FormField` 의 `field.value`(string[])·`field.onChange` 를 `value`·`onValueChange` 에 연결한다.\n */\nfunction CheckboxSectionGroup({\n className,\n value,\n onValueChange,\n orientation = 'horizontal',\n disabled,\n children,\n ...props\n}: CheckboxSectionGroupProps) {\n const count = React.Children.count(children)\n // 가로 배치는 개수로 정한다 — RadioSectionGroup 과 같은 규칙(2~3 한 줄, 4 는 2×2, 5+ 세로 쌓기). 간격 8: 4 는 \"cards sit too close together\"(2026-10-21 19차)\n const stacked = orientation === 'horizontal' && count >= 5\n const effectiveOrientation = stacked ? 'vertical' : orientation\n const layoutClass =\n effectiveOrientation === 'vertical'\n ? 'flex flex-col'\n : count === 4\n ? 'grid w-full grid-cols-2'\n : count === 3\n ? 'grid w-full grid-cols-3'\n : count === 2\n ? 'grid w-full grid-cols-2'\n : 'flex w-full'\n return (\n <CheckboxSectionGroupContext.Provider value={{ value, onValueChange, disabled, stacked }}>\n <div\n role='group'\n data-slot='checkbox-section-group'\n className={cn('items-stretch gap-[8px]', layoutClass, className)}\n {...props}\n >\n {children}\n </div>\n </CheckboxSectionGroupContext.Provider>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* CheckboxSection */\n/* -------------------------------------------------------------------------- */\n\ninterface CheckboxSectionProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'value' | 'title' | 'type'\n> {\n /** 그룹의 value 배열과 맞출 값 */\n value: string\n /** 카드 제목 */\n title: React.ReactNode\n /** 한 줄 설명 */\n description?: React.ReactNode\n disabled?: boolean\n}\n\n/** 카드 안 체크 표시 — Checkbox 와 같은 모양의 표시 전용 요소(버튼 안에 버튼을 넣지 않는다) */\nfunction CheckMark({ checked, disabled }: { checked: boolean; disabled?: boolean }) {\n return (\n <span\n aria-hidden='true'\n className={cn(\n 'flex h-[16px] w-[16px] shrink-0 items-center justify-center rounded-xsmall border-[2px]',\n !checked && 'border-sys-divider-main bg-sys-background',\n checked && !disabled && 'border-primary30 bg-primary30',\n checked && disabled && 'border-primary-o20 bg-primary-o20',\n !checked && disabled && 'opacity-50',\n )}\n >\n {checked ? (\n <svg\n width='10'\n height='8'\n viewBox='0 0 10 8'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M9.2953 0.828385C9.68583 1.21891 9.68583 1.85207 9.2953 2.2426L4.24923 7.28867C4.24704 7.2909 4.24484 7.29313 4.24262 7.29534C4.04812 7.48985 3.79342 7.58748 3.53848 7.58823C3.28155 7.589 3.02438 7.49137 2.82835 7.29534C2.82614 7.29313 2.82394 7.29092 2.82176 7.28869L0.707088 5.17402C0.316564 4.7835 0.316564 4.15033 0.707088 3.75981C1.09761 3.36928 1.73078 3.36928 2.1213 3.75981L3.53549 5.17399L7.88109 0.828385C8.27161 0.437861 8.90478 0.437861 9.2953 0.828385Z'\n className='fill-sys-background'\n />\n </svg>\n ) : null}\n </span>\n )\n}\n\n/**\n * 카드형 체크박스 — 제목 + 설명이 있는 카드 안에 체크 표시. `CheckboxSectionGroup` 안에서 `value` 로 쓴다.\n *\n * 언제 쓰나: 설명이 붙는 복수 선택의 한 항목(RadioSection 의 복수 선택판). 카드 전체가 눌리고, 선택되면 2px 주조색 테두리(padding 으로 보정해 layout shift 없음).\n * 언제 안 쓰나: 그룹 밖 단독(→ Checkbox + Label), 하나만 고를 때(→ RadioSection).\n * 대신/함께: 네이티브 `<button role='checkbox'>` 라 Tab 으로 이동, Space·Enter 로 켜고 끈다. 안의 체크 표시는 표시 전용이다.\n */\nfunction CheckboxSection({\n value,\n title,\n description,\n disabled: disabledProp = false,\n className,\n onClick,\n ...props\n}: CheckboxSectionProps) {\n const group = React.useContext(CheckboxSectionGroupContext)\n const checked = group?.value.includes(value) ?? false\n const disabled = disabledProp || Boolean(group?.disabled)\n // 그룹이 5개 이상을 세로로 쌓을 때는 카드 안을 한 줄(제목 · 설명)로 — RadioSection 과 같은 규칙\n const stacked = Boolean(group?.stacked)\n\n const cardClassName = cn(\n 'bg-sys-background flex w-full flex-col items-start overflow-clip rounded-medium text-left appearance-none',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n // 테두리는 선택 여부와 무관하게 1px(layout shift 0) — 선택은 색 + 연한 채움으로. RadioSection·SwitchSection 과 같은 규칙(16차 D2 에서 빠진 것을 2026-10-20 17차에 맞춤 —\n // 체크박스 카드와 라디오 카드가 한 폼에 오면 \"noticeably different border and selection treatments\" 로 감점)\n 'border p-[12px]',\n !checked && 'border-sys-divider-main',\n checked && !disabled && 'border-primary30 bg-primary-o10',\n checked && disabled && 'border-primary-o20',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n className,\n )\n\n return (\n <button\n type='button'\n role='checkbox'\n aria-checked={checked}\n disabled={disabled}\n data-state={checked ? 'checked' : 'unchecked'}\n data-slot='checkbox-section'\n className={cardClassName}\n onClick={(e) => {\n onClick?.(e)\n if (e.defaultPrevented || disabled || !group) return\n group.onValueChange?.(\n checked ? group.value.filter((v) => v !== value) : [...group.value, value],\n )\n }}\n {...props}\n >\n <span className='flex w-full items-start gap-[4px]'>\n <span className='flex size-[24px] shrink-0 items-center justify-center p-[4px]'>\n <CheckMark checked={checked} disabled={disabled} />\n </span>\n <span\n data-slot='checkbox-section-text'\n className={cn(\n 'flex min-w-0 flex-1',\n stacked\n ? 'flex-row flex-wrap items-baseline gap-x-[12px] gap-y-[2px]'\n : 'flex-col items-start gap-[4px]',\n )}\n >\n <span\n className={cn(\n 'block break-keep text-h5 wrap-break-word',\n stacked ? 'shrink-0' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-main',\n )}\n >\n {title}\n </span>\n {description ? (\n <span\n className={cn(\n 'block break-keep text-base-regular wrap-break-word',\n stacked ? 'min-w-0 flex-1' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-subtle',\n )}\n >\n {description}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n )\n}\n\nexport { CheckboxSection, CheckboxSectionGroup }\nexport type { CheckboxSectionGroupProps, CheckboxSectionProps }\n","/**\n * ColumnFilter 컴포넌트 타입 정의\n * 테이블/카드 목록 상단의 복합 검색 컴포넌트\n */\n\n// 컬럼 타입 정의\nexport type ColumnType = 'string' | 'number' | 'date' | 'select'\n\n// 문자열 연산자\nexport type StringOperator = '=' | '!=' | 'contains' | 'not_contains'\n\n// 숫자 연산자\nexport type NumberOperator = '=' | '!=' | '>' | '<' | '>=' | '<='\n\n// 통합 연산자 타입\nexport type Operator = StringOperator | NumberOperator\n\n// 컬럼 타입별 연산자 override\nexport type OperatorOverridesByType = Partial<Record<ColumnType, Operator[]>>\n\n// 컬럼 key별 연산자 override\nexport type OperatorOverridesByColumn = Partial<Record<string, Operator[]>>\n\n// 컬럼 정의\nexport interface ColumnDefinition {\n /** 컬럼 고유 키 */\n key: string\n /** 표시될 컬럼명 */\n label: string\n /** 컬럼 데이터 타입 */\n type: ColumnType\n /** select 타입일 경우 선택 옵션 */\n options?: { value: string; label: string }[]\n /** 컬럼 설명 (툴팁 등에 사용) */\n description?: string\n}\n\n// 필터 조건\nexport interface FilterCondition {\n /** 고유 ID */\n id: string\n /** 컬럼 키 */\n column: string\n /** 연산자 */\n operator: Operator\n /** 필터 값 */\n value: string | number\n}\n\n// 현재 편집 중인 필터 상태\nexport interface EditingFilter {\n /** 기존 필터 편집 시 원본 ID (신규면 undefined) */\n id?: string\n /** 선택된 컬럼 키 */\n column?: string\n /** 선택된 연산자 */\n operator?: Operator\n /** 입력 중인 값 */\n value?: string\n}\n\n// 팝오버 상태\nexport type PopoverType = 'column' | 'operator' | 'search' | 'value' | null\nexport type PopoverTrigger = 'input' | 'button' | null\nexport type AutocompleteFocusMode = 'input' | 'option'\n\n// 값 자동완성 제안 항목\nexport interface ValueSuggestion {\n /** 커밋되는 실제 값 */\n value: string\n /** 팝오버에 표시되는 텍스트 */\n label: string\n}\n\n// 팝오버 위치\nexport interface PopoverPosition {\n x: number\n y: number\n}\n\n// Context 타입\nexport interface ColumnFilterContextType {\n // 상태\n disabled?: boolean\n columns: ColumnDefinition[]\n filters: FilterCondition[]\n searchQuery: string\n\n // 현재 편집 중인 필터\n editingFilter: EditingFilter | null\n\n // 팝오버 상태\n activePopover: PopoverType\n popoverTrigger: PopoverTrigger\n popoverPosition: PopoverPosition | null\n\n // 액션\n addFilter: (filter: Omit<FilterCondition, 'id'>) => void\n removeFilter: (id: string) => void\n updateFilter: (id: string, updates: Partial<FilterCondition>) => void\n resetFilters: () => void\n setSearchQuery: (query: string) => void\n\n // 편집 액션\n selectColumn: (columnKey: string) => void\n selectOperator: (operator: Operator) => void\n setEditingValue: (value: string) => void\n commitFilter: () => void\n cancelEditing: () => void\n editExistingFilter: (id: string) => void\n\n // 편집 중인 기존 필터 ID (순서 보존용)\n editingFilterId: string | null\n\n // 팝오버 액션\n openPopover: (type: PopoverType, position?: PopoverPosition, trigger?: PopoverTrigger) => void\n closePopover: () => void\n\n // input-driven 컬럼 자동완성 상태\n columnSuggestionIndex: number\n setColumnSuggestionIndex: (index: number) => void\n autocompleteFocusMode: AutocompleteFocusMode\n setAutocompleteFocusMode: (mode: AutocompleteFocusMode) => void\n\n // 값 자동완성 상태\n valueSuggestions: ValueSuggestion[]\n valueSuggestionsLoading: boolean\n valueSuggestionIndex: number\n\n // 값 자동완성 액션\n setValueSuggestionIndex: (index: number) => void\n selectValueSuggestion: (value: string) => void\n\n // 검색 자동완성 상태\n searchSuggestions: ColumnDefinition[]\n searchSuggestionIndex: number\n\n // 검색 자동완성 액션\n setSearchSuggestionIndex: (index: number) => void\n selectSearchSuggestion: (columnKey: string) => void\n\n // 유틸리티\n getColumnByKey: (key: string) => ColumnDefinition | undefined\n getOperatorsForColumn: (columnKey: string) => Operator[]\n\n // 접근성 ID\n ids: {\n inputId: string\n columnListId: string\n operatorListId: string\n searchListId: string\n valueListId: string\n getColumnOptionId: (index: number) => string\n getOperatorOptionId: (index: number) => string\n getSearchOptionId: (index: number) => string\n getValueOptionId: (index: number) => string\n }\n}\n\n// 메인 컴포넌트 Props\nexport interface ColumnFilterProps {\n /** 필터링할 컬럼 정의 */\n columns: ColumnDefinition[]\n /** 현재 필터 조건 (controlled) */\n value?: FilterCondition[]\n /** 필터 변경 콜백 */\n onChange?: (filters: FilterCondition[]) => void\n /**\n * 통합 검색 쿼리 변경 콜백.\n *\n * 제공 여부가 검색 팝오버의 Enter 동작을 가른다.\n * - 제공: 첫 제안을 선점하지 않는다. 선택 없는 Enter는 입력 텍스트로 통합 검색을 확정한다.\n * - 미제공: 팝오버가 열리면 첫 제안이 하이라이트(`aria-activedescendant`)되어\n * ArrowDown 없는 Enter가 그 컬럼의 편집으로 진입한다. 자유 텍스트를 받을 곳이 없기 때문이다.\n */\n onSearch?: (query: string) => void\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 추가 CSS 클래스 */\n className?: string\n /** 비활성화 여부 */\n disabled?: boolean\n /** 값 자동완성 콜백. select 타입에 options가 있으면 무시됨 */\n getValueSuggestions?: (columnKey: string, query: string) => Promise<string[]> | string[]\n /** 컬럼 타입별 사용 가능 연산자 override. 지정하지 않으면 기본 연산자 목록을 사용한다. */\n operatorsByType?: OperatorOverridesByType\n /** 컬럼 key별 사용 가능 연산자 override. operatorsByType보다 우선한다. */\n operatorsByColumn?: OperatorOverridesByColumn\n}\n\n// 연산자 표시 라벨\nexport const OPERATOR_LABELS: Record<Operator, string> = {\n '=': '=',\n '!=': '≠',\n contains: '포함',\n not_contains: '제외',\n '>': '>',\n '<': '<',\n '>=': '≥',\n '<=': '≤',\n}\n\n// 컬럼 타입별 사용 가능 연산자\nexport const OPERATORS_BY_TYPE: Record<ColumnType, Operator[]> = {\n string: ['=', '!=', 'contains', 'not_contains'],\n number: ['=', '!=', '<', '>', '<=', '>='],\n date: ['=', '!=', '<', '>', '<=', '>='],\n select: ['=', '!='],\n}\n\n// 컬럼 타입별 기본 연산자\nexport const DEFAULT_OPERATOR_BY_TYPE: Record<ColumnType, Operator> = {\n string: 'contains',\n number: '=',\n date: '=',\n select: '=',\n}\n\nexport function isInvalidNumberFilterValue(\n column: ColumnDefinition | undefined,\n value: string | number | undefined,\n): boolean {\n if (column?.type !== 'number' || value == null) return false\n if (typeof value === 'number') return !Number.isFinite(value)\n return value.trim().length > 0 && !Number.isFinite(Number(value))\n}\n\n/** select 컬럼에서 옵션 value 또는 label과 대소문자 무시 일치하는 옵션 */\nfunction findMatchingSelectOption(column: ColumnDefinition | undefined, value: string | number) {\n if (column?.type !== 'select' || !column.options?.length) return undefined\n const query = String(value).trim().toLowerCase()\n if (!query) return undefined\n return column.options.find(\n (option) => option.value.toLowerCase() === query || option.label.toLowerCase() === query,\n )\n}\n\n/** number 컬럼의 비숫자 값, select 컬럼의 옵션 불일치 값을 invalid로 판정한다 */\nexport function isInvalidFilterValue(\n column: ColumnDefinition | undefined,\n value: string | number | undefined,\n): boolean {\n if (isInvalidNumberFilterValue(column, value)) return true\n if (column?.type !== 'select' || !column.options?.length || value == null) return false\n if (!String(value).trim()) return false\n return !findMatchingSelectOption(column, value)\n}\n\nexport function normalizeFilterValue(\n column: ColumnDefinition | undefined,\n value: string,\n): string | number {\n // select: 옵션 label로 입력해도 실제 value로 정규화 (불일치 값은 그대로 두고 invalid로 표시)\n if (column?.type === 'select') return findMatchingSelectOption(column, value)?.value ?? value\n if (column?.type !== 'number') return value\n const numericValue = Number(value)\n return Number.isFinite(numericValue) ? numericValue : value\n}\n","'use client'\n\nimport * as React from 'react'\nimport { debounce } from 'es-toolkit'\n\nimport { cn } from '../../utils/cn'\nimport {\n type AutocompleteFocusMode,\n type ColumnDefinition,\n type ColumnFilterContextType,\n type ColumnFilterProps,\n DEFAULT_OPERATOR_BY_TYPE,\n type EditingFilter,\n type FilterCondition,\n normalizeFilterValue,\n type Operator,\n OPERATORS_BY_TYPE,\n type PopoverPosition,\n type PopoverType,\n type ValueSuggestion,\n} from './types'\n\n// Context 생성\nconst ColumnFilterContext = React.createContext<ColumnFilterContextType | null>(null)\n\n// Context Hook\nexport function useColumnFilter() {\n const context = React.useContext(ColumnFilterContext)\n if (!context) {\n throw new Error('useColumnFilter must be used within a ColumnFilterProvider')\n }\n return context\n}\n\n// ID 생성 유틸\nfunction generateId(): string {\n return `filter-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n// Provider 컴포넌트\nexport function ColumnFilter({\n columns,\n value,\n onChange,\n onSearch,\n className,\n disabled,\n getValueSuggestions,\n operatorsByType,\n operatorsByColumn,\n children,\n}: ColumnFilterProps & { children: React.ReactNode }) {\n // 필터 상태 (controlled/uncontrolled 지원)\n const [internalFilters, setInternalFilters] = React.useState<FilterCondition[]>([])\n const filters = value ?? internalFilters\n\n // 통합 검색 쿼리\n const [searchQuery, setSearchQueryState] = React.useState('')\n\n // 현재 편집 중인 필터\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null)\n\n // 편집 중인 기존 필터 ID (순서 보존용)\n const [editingFilterId, setEditingFilterId] = React.useState<string | null>(null)\n\n // 팝오버 상태\n const [activePopover, setActivePopover] = React.useState<PopoverType>(null)\n const [popoverTrigger, setPopoverTrigger] = React.useState<'input' | 'button' | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState<PopoverPosition | null>(null)\n const reactId = React.useId()\n const idPrefix = React.useMemo(() => `column-filter-${reactId.replace(/:/g, '')}`, [reactId])\n\n // input-driven 컬럼 자동완성 선택 인덱스\n const [columnSuggestionIndex, setColumnSuggestionIndex] = React.useState(-1)\n const [autocompleteFocusMode, setAutocompleteFocusMode] =\n React.useState<AutocompleteFocusMode>('input')\n\n // 값 자동완성 상태\n const [valueSuggestions, setValueSuggestions] = React.useState<ValueSuggestion[]>([])\n const [valueSuggestionsLoading, setValueSuggestionsLoading] = React.useState(false)\n const [valueSuggestionIndex, setValueSuggestionIndex] = React.useState(-1)\n\n // 디바운스 fetch (race condition 방지용 requestId)\n const requestIdRef = React.useRef(0)\n const fetchSuggestionsRef = React.useRef<ReturnType<typeof debounce> | null>(null)\n\n React.useEffect(() => {\n fetchSuggestionsRef.current = debounce(async (columnKey: string, query: string) => {\n if (!getValueSuggestions) return\n const id = ++requestIdRef.current\n try {\n const result = await Promise.resolve(getValueSuggestions(columnKey, query))\n if (requestIdRef.current === id) {\n setValueSuggestions(result.map((s) => ({ value: s, label: s })))\n setValueSuggestionsLoading(false)\n }\n } catch {\n if (requestIdRef.current === id) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n }\n }\n }, 300)\n return () => {\n fetchSuggestionsRef.current?.cancel()\n }\n }, [getValueSuggestions])\n\n // editingFilter.value 변경 시 자동완성 데이터 갱신\n React.useEffect(() => {\n if (!editingFilter?.column || !editingFilter?.operator) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n\n const column = columns.find((c) => c.key === editingFilter.column)\n if (!column || (column.type !== 'string' && column.type !== 'select')) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n\n setValueSuggestionIndex(-1)\n const query = editingFilter.value || ''\n\n // Select 컬럼: 동기 로컬 필터링 (빈 쿼리 시 전체 표시)\n if (column.type === 'select' && column.options) {\n const q = query.toLowerCase()\n const filtered = q\n ? column.options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n )\n : column.options\n setValueSuggestions(filtered.map((o) => ({ value: o.value, label: o.label })))\n setValueSuggestionsLoading(false)\n return\n }\n\n // String 컬럼: 비동기 콜백\n if (!getValueSuggestions) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n if (!query.trim()) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n\n setValueSuggestionsLoading(true)\n fetchSuggestionsRef.current?.(editingFilter.column, query)\n }, [\n editingFilter?.column,\n editingFilter?.operator,\n editingFilter?.value,\n columns,\n getValueSuggestions,\n ])\n\n // 필터 추가\n const addFilter = React.useCallback(\n (filter: Omit<FilterCondition, 'id'>) => {\n const newFilter: FilterCondition = {\n ...filter,\n id: generateId(),\n }\n const newFilters = [...filters, newFilter]\n if (value === undefined) {\n setInternalFilters(newFilters)\n }\n onChange?.(newFilters)\n },\n [filters, value, onChange],\n )\n\n // 필터 제거\n const removeFilter = React.useCallback(\n (id: string) => {\n const newFilters = filters.filter((f) => f.id !== id)\n if (value === undefined) {\n setInternalFilters(newFilters)\n }\n onChange?.(newFilters)\n },\n [filters, value, onChange],\n )\n\n // 필터 업데이트\n const updateFilter = React.useCallback(\n (id: string, updates: Partial<FilterCondition>) => {\n const newFilters = filters.map((f) => (f.id === id ? { ...f, ...updates } : f))\n if (value === undefined) {\n setInternalFilters(newFilters)\n }\n onChange?.(newFilters)\n },\n [filters, value, onChange],\n )\n\n // 검색 쿼리 설정\n const setSearchQuery = React.useCallback(\n (query: string) => {\n setSearchQueryState(query)\n onSearch?.(query)\n },\n [onSearch],\n )\n\n const getConfiguredOperators = React.useCallback(\n (column: ColumnDefinition): Operator[] => {\n const columnOperators = operatorsByColumn?.[column.key]\n if (columnOperators?.length) return columnOperators\n\n const typeOperators = operatorsByType?.[column.type]\n if (typeOperators?.length) return typeOperators\n\n return OPERATORS_BY_TYPE[column.type]\n },\n [operatorsByColumn, operatorsByType],\n )\n\n // 팝오버 열기\n const openPopover = React.useCallback(\n (type: PopoverType, position?: PopoverPosition, trigger: 'input' | 'button' | null = null) => {\n setPopoverTrigger(type ? trigger : null)\n setAutocompleteFocusMode('input')\n setActivePopover(type)\n if (position) {\n setPopoverPosition(position)\n }\n },\n [],\n )\n\n // 팝오버 닫기\n const closePopover = React.useCallback(() => {\n setActivePopover(null)\n setPopoverTrigger(null)\n setAutocompleteFocusMode('input')\n }, [])\n\n // 컬럼 선택 (타입별 기본 연산자 자동 선택 → 바로 값 입력으로 이동)\n const selectColumn = React.useCallback(\n (columnKey: string) => {\n const column = columns.find((c) => c.key === columnKey)\n if (column) {\n const operators = getConfiguredOperators(column)\n const defaultOperator = DEFAULT_OPERATOR_BY_TYPE[column.type]\n const defaultOp = operators.includes(defaultOperator) ? defaultOperator : operators[0]\n if (!defaultOp) return\n\n setEditingFilter((prev) => ({\n ...prev,\n column: columnKey,\n operator: defaultOp,\n value: prev?.column === columnKey ? (prev?.value ?? '') : '',\n }))\n closePopover() // 팝오버 닫고 바로 값 입력으로 이동\n }\n },\n [columns, getConfiguredOperators, closePopover],\n )\n\n // 연산자 선택\n const selectOperator = React.useCallback(\n (operator: Operator) => {\n setEditingFilter((prev) =>\n prev\n ? {\n ...prev,\n operator,\n }\n : null,\n )\n closePopover()\n },\n [closePopover],\n )\n\n // 편집 값 설정\n const setEditingValue = React.useCallback((newValue: string) => {\n setEditingFilter((prev) =>\n prev\n ? {\n ...prev,\n value: newValue,\n }\n : null,\n )\n }, [])\n\n // 기존 필터를 편집 모드로 전환 (제거하지 않고 숨김 → 순서 보존)\n const editExistingFilter = React.useCallback(\n (id: string) => {\n const filter = filters.find((f) => f.id === id)\n if (!filter) return\n\n setEditingFilterId(id)\n setEditingFilter({\n column: filter.column,\n operator: filter.operator,\n value: String(filter.value),\n })\n closePopover()\n },\n [filters, closePopover],\n )\n\n // 필터 확정 내부 헬퍼 (commitFilter와 selectValueSuggestion이 공유)\n const doCommitFilter = React.useCallback(\n (overrideValue?: string) => {\n // 앞뒤 공백 제거 후 검증 — 공백만 입력된 값은 커밋하지 않는다.\n // (앱 레이어가 어차피 trim 후 drop하므로, 값 없는 유령 태그를 여기서 막는다)\n const valueToCommit = (overrideValue ?? editingFilter?.value)?.trim()\n if (!editingFilter?.column || !editingFilter?.operator || !valueToCommit) return\n\n const column = columns.find((c) => c.key === editingFilter.column)\n const finalValue = normalizeFilterValue(column, valueToCommit)\n\n if (editingFilterId) {\n // 기존 필터 in-place 업데이트 (순서 보존)\n updateFilter(editingFilterId, {\n column: editingFilter.column,\n operator: editingFilter.operator,\n value: finalValue,\n })\n } else {\n // 새 필터 추가\n addFilter({\n column: editingFilter.column,\n operator: editingFilter.operator,\n value: finalValue,\n })\n }\n // 전체 편집 state 정리\n setEditingFilter(null)\n setEditingFilterId(null)\n closePopover()\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n setValueSuggestionIndex(-1)\n fetchSuggestionsRef.current?.cancel()\n },\n [editingFilter, editingFilterId, columns, addFilter, updateFilter, closePopover],\n )\n\n // 필터 확정 (엔터 키)\n const commitFilter = React.useCallback(() => doCommitFilter(), [doCommitFilter])\n\n // 값 자동완성 제안 선택 → 즉시 커밋 + 정리\n const selectValueSuggestion = React.useCallback(\n (selectedValue: string) => {\n doCommitFilter(selectedValue)\n setValueSuggestions([])\n closePopover()\n setValueSuggestionIndex(-1)\n fetchSuggestionsRef.current?.cancel()\n },\n [doCommitFilter, closePopover],\n )\n\n // 편집 취소\n const cancelEditing = React.useCallback(() => {\n setEditingFilter(null)\n setEditingFilterId(null)\n closePopover()\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n setValueSuggestionIndex(-1)\n fetchSuggestionsRef.current?.cancel()\n }, [closePopover])\n\n // 필터 초기화 (cancelEditing 뒤에 선언 — 의존성으로 참조한다)\n const resetFilters = React.useCallback(() => {\n if (value === undefined) {\n setInternalFilters([])\n }\n onChange?.([])\n setSearchQueryState('')\n onSearch?.('')\n // 편집 중 초기화 시 editingFilterId가 사라진 필터를 가리켜 입력이 하나도 렌더되지 않는다.\n // 동기 정리여야 한다 — 아래 고아 감지 effect로 미루면 초기화 버튼의 rAF 재오픈 시점에\n // 검색 입력이 아직 마운트되지 않아 재오픈이 조용히 스킵된다.\n cancelEditing()\n }, [value, onChange, onSearch, cancelEditing])\n\n // 편집 중인 기존 필터가 외부 갱신으로 사라지면 편집 상태를 정리한다.\n // 내부 경로(resetFilters·편집 취소)는 동기 정리하므로 여기 도달 시점엔 이미 null — no-op.\n // 앱이 controlled value를 밖에서 비우는 경로(앱 자체 '필터 초기화' 버튼 등) 전용 안전망.\n React.useEffect(() => {\n if (editingFilterId && !filters.some((f) => f.id === editingFilterId)) {\n cancelEditing()\n }\n }, [filters, editingFilterId, cancelEditing])\n\n // 컬럼 키로 컬럼 조회\n const getColumnByKey = React.useCallback(\n (key: string) => {\n return columns.find((c) => c.key === key)\n },\n [columns],\n )\n\n // 컬럼에 사용 가능한 연산자 조회\n const getOperatorsForColumn = React.useCallback(\n (columnKey: string) => {\n const column = columns.find((c) => c.key === columnKey)\n if (!column) return []\n return getConfiguredOperators(column)\n },\n [columns, getConfiguredOperators],\n )\n\n // 검색 자동완성: searchQuery로 매칭 컬럼 필터링 + 정렬 (시작하는 것 우선, 한국어 정렬)\n const searchSuggestions = React.useMemo(() => {\n if (!searchQuery.trim()) return []\n const query = searchQuery.trim().toLowerCase()\n const startsWith = columns\n .filter((c) => c.label.toLowerCase().startsWith(query))\n .sort((a, b) => a.label.localeCompare(b.label, 'ko'))\n const includes = columns\n .filter(\n (c) => !c.label.toLowerCase().startsWith(query) && c.label.toLowerCase().includes(query),\n )\n .sort((a, b) => a.label.localeCompare(b.label, 'ko'))\n return [...startsWith, ...includes]\n }, [columns, searchQuery])\n\n // 검색 자동완성 선택 인덱스\n const [searchSuggestionIndex, setSearchSuggestionIndex] = React.useState(-1)\n\n const hasSearchHandler = Boolean(onSearch)\n\n // 검색어 변경 시 선택 인덱스 갱신.\n // onSearch 미제공 = 자유 텍스트만으로는 필터가 성립하지 않는 소비처이므로 첫 제안을 하이라이트해\n // ArrowDown 없는 Enter가 막다른 길이 되지 않게 한다. onSearch 제공 시에는 선점하지 않아\n // Enter가 입력 텍스트로 통합 검색을 확정한다.\n React.useEffect(() => {\n setSearchSuggestionIndex(hasSearchHandler || searchSuggestions.length === 0 ? -1 : 0)\n }, [searchQuery, hasSearchHandler, searchSuggestions.length])\n\n React.useEffect(() => {\n setColumnSuggestionIndex(-1)\n setAutocompleteFocusMode('input')\n }, [searchQuery, editingFilter?.column])\n\n // 검색 자동완성 제안 선택 → 컬럼 선택 + 검색어 초기화\n const selectSearchSuggestion = React.useCallback(\n (columnKey: string) => {\n selectColumn(columnKey)\n setSearchQueryState('')\n onSearch?.('')\n setSearchSuggestionIndex(-1)\n },\n [selectColumn, onSearch],\n )\n\n const contextValue: ColumnFilterContextType = {\n disabled,\n columns,\n filters,\n searchQuery,\n editingFilter,\n editingFilterId,\n activePopover,\n popoverTrigger,\n popoverPosition,\n addFilter,\n removeFilter,\n updateFilter,\n resetFilters,\n setSearchQuery,\n selectColumn,\n selectOperator,\n setEditingValue,\n commitFilter,\n cancelEditing,\n editExistingFilter,\n openPopover,\n closePopover,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n valueSuggestions,\n valueSuggestionsLoading,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n getColumnByKey,\n getOperatorsForColumn,\n ids: {\n inputId: `${idPrefix}-input`,\n columnListId: `${idPrefix}-column-list`,\n operatorListId: `${idPrefix}-operator-list`,\n searchListId: `${idPrefix}-search-list`,\n valueListId: `${idPrefix}-value-list`,\n getColumnOptionId: (index: number) => `${idPrefix}-column-option-${index}`,\n getOperatorOptionId: (index: number) => `${idPrefix}-operator-option-${index}`,\n getSearchOptionId: (index: number) => `${idPrefix}-search-option-${index}`,\n getValueOptionId: (index: number) => `${idPrefix}-value-option-${index}`,\n },\n }\n\n return (\n <ColumnFilterContext.Provider value={contextValue}>\n <div\n data-slot='column-filter'\n data-disabled={disabled ? '' : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n 'relative w-full',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed data-[disabled]:select-none',\n className,\n )}\n >\n {children}\n </div>\n </ColumnFilterContext.Provider>\n )\n}\n\n// Root 컴포넌트의 display name\nColumnFilter.displayName = 'ColumnFilter'\n","import * as React from 'react'\n\nimport { cn } from '../../utils/cn'\n\n/** X 모양 mask (lucide X와 동일한 path, strokeWidth 3) */\nconst X_MASK = `url(\"data:image/svg+xml,${encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"black\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>',\n)}\")`\n\nexport interface CancelIconProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 아이콘 전체 크기 (px). @default 20 */\n size?: number\n /** X 아이콘 색상 오버라이드 */\n iconClassName?: string\n}\n\nconst CancelIcon = React.forwardRef<HTMLSpanElement, CancelIconProps>(\n ({ size = 20, className, iconClassName, ...props }, ref) => {\n let innerSize = Math.round(size * 0.75)\n // 서브픽셀 센터링 방지: size와 innerSize의 홀짝을 맞춤\n if (size % 2 !== innerSize % 2) innerSize -= 1\n\n return (\n <span\n ref={ref}\n aria-hidden='true'\n className={cn(\n 'inline-flex items-center justify-center align-middle rounded-full bg-current',\n className,\n )}\n style={{ width: size, height: size }}\n {...props}\n >\n <span\n className={cn('block bg-current text-sys-background', iconClassName)}\n style={{\n width: innerSize,\n height: innerSize,\n maskImage: X_MASK,\n WebkitMaskImage: X_MASK,\n maskSize: 'contain',\n WebkitMaskSize: 'contain',\n }}\n />\n </span>\n )\n },\n)\nCancelIcon.displayName = 'CancelIcon'\n\nexport { CancelIcon }\n","const message = {\n common: {\n notice_search_result_empty: '검색 결과가 없습니다.',\n notice_no_selectable_option: '선택 가능한 옵션이 없습니다.',\n },\n}\n\nexport default message\n","'use client'\n\nimport * as React from 'react'\nimport { type DialogProps } from '@radix-ui/react-dialog'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Info, Search } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport message from '../utils/message'\nimport { Dialog, DialogContent, DialogTitle } from './dialog'\nimport { Stack } from './stack'\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-small bg-sys-background text-sys-text-main',\n className,\n )}\n // 대소문자 구분 없는 부분 일치 검색 (https://github.com/shadcn-ui/ui/issues/458#issuecomment-2435721826)\n filter={(value, search) => {\n if (value.toLowerCase().includes(search.toLowerCase())) return 1\n return 0\n }}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\ntype CommandDialogProps = DialogProps & {\n /** 화면에는 보이지 않고 보조기술에만 읽히는 다이얼로그 제목 */\n title?: string\n}\n\nconst CommandDialog = ({ children, title = '명령 검색', ...props }: CommandDialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className='overflow-hidden p-0' aria-describedby={undefined}>\n <DialogTitle className='sr-only'>{title}</DialogTitle>\n <Command className='[&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-sys-text-subtle [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-[8px] [&_[cmdk-input-wrapper]_svg]:h-[20px] [&_[cmdk-input-wrapper]_svg]:w-[20px] [&_[cmdk-input]]:h-[48px] [&_[cmdk-item]]:px-[8px] [&_[cmdk-item]]:py-[12px] [&_[cmdk-item]_svg]:h-[20px] [&_[cmdk-item]_svg]:w-[20px]'>\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\ntype CommandInputProps = React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input> & {\n wrapperClassName?: string\n iconClassName?: string\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n CommandInputProps\n>(\n (\n { className, wrapperClassName, iconClassName, placeholder, 'aria-label': ariaLabel, ...props },\n ref,\n ) => (\n <div\n className={cn(\n 'flex items-center border-b border-b-sys-divider-subtle px-[12px]',\n wrapperClassName,\n )}\n >\n <Search\n aria-hidden\n className={cn('mr-[8px] h-[16px] w-[16px] shrink-0 opacity-50', iconClassName)}\n />\n <CommandPrimitive.Input\n ref={ref}\n placeholder={placeholder}\n // role=combobox 입력은 placeholder 로 이름을 얻지 못한다 — 명시적 이름을 보장한다\n aria-label={ariaLabel ?? placeholder ?? '검색'}\n className={cn(\n 'flex h-[36px] w-full border-none bg-transparent px-[12px] py-0 text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-subtler disabled:cursor-not-allowed disabled:text-sys-text-disabled',\n className,\n )}\n {...props}\n />\n </div>\n ),\n)\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className='py-[24px] text-small-medium text-sys-text-subtlest text-center'\n {...props}\n >\n <Stack justifyContent='center' alignItems='center' spacing={6}>\n <Info size={16} className='text-sys-text-subtlest shrink-0' />\n {props.children || message.common.notice_no_selectable_option}\n </Stack>\n </CommandPrimitive.Empty>\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden [&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:py-[6px] [&_[cmdk-group-heading]]:text-small-medium [&_[cmdk-group-heading]]:text-sys-text-subtle',\n className,\n )}\n {...props}\n />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n // cmdk 가 role=separator 를 강제하는데 listbox 의 허용 자식이 아니다(axe aria-required-children). 장식이므로 숨긴다\n aria-hidden\n className={cn('-mx-[4px] h-px bg-sys-divider-subtler', className)}\n {...props}\n />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-pointer gap-[4px] select-none items-center overflow-hidden rounded-xsmall px-[8px] py-[2px] text-sys-text-main text-base-regular outline-none',\n 'hover:bg-secondary-o10 active:bg-secondary-o20 data-[selected=true]:bg-secondary-o10',\n 'data-[state=checked]:text-primary40 data-[state=checked]:text-base-medium data-[state=checked]:hover:bg-primary-o10 data-[state=checked]:active:bg-primary-o20 [&[data-state=checked][data-selected=true]]:bg-primary-o10',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:-outline-offset-1',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:cursor-not-allowed data-[disabled=true]:text-sys-text-disabled data-[disabled=true]:opacity-100',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-small-regular tracking-widest text-sys-text-subtler', className)}\n {...props}\n />\n )\n}\nCommandShortcut.displayName = 'CommandShortcut'\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Button, type ButtonProps } from './button'\nimport { Checkbox } from './checkbox'\nimport { CommandInput, CommandItem } from './command'\nimport { Spinner } from './spinner'\n\ntype TableFilterItemKind = 'default' | 'checkbox' | 'operator'\n\nconst itemStateClassName = cn(\n 'hover:bg-secondary-o10 active:bg-secondary-o20 data-[selected=true]:bg-secondary-o10',\n 'data-[state=checked]:text-primary40 data-[state=checked]:hover:bg-primary-o10 data-[state=checked]:active:bg-primary-o20 [&[data-state=checked][data-selected=true]]:bg-primary-o10',\n)\n\nconst itemBaseClassName = cn(\n 'relative flex cursor-pointer select-none items-center overflow-hidden rounded-xsmall text-sys-text-main outline-none transition-colors',\n 'focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:cursor-not-allowed data-[disabled=true]:text-sys-text-disabled data-[disabled=true]:opacity-100',\n)\n\nconst itemKindClassName: Record<TableFilterItemKind, string> = {\n default: 'min-h-[28px] w-full gap-[4px] px-[8px] py-[2px] text-base-regular',\n checkbox: 'min-h-[28px] w-full gap-[4px] px-[6px] py-[2px] text-base-regular',\n operator: 'h-[28px] w-full gap-[4px] px-[8px] py-[4px] text-base-regular leading-[16px]',\n}\n\nconst operatorGlyphs: Record<string, string> = {\n '=': '=',\n '!=': '≠',\n '>': '>',\n '<': '<',\n '>=': '≥',\n '<=': '≤',\n contains: '포함',\n not_contains: '제외',\n}\n\nexport const tableFilterContentClassName = cn(\n 'flex w-[200px] flex-col items-start gap-[2px]',\n '[&_[cmdk-group-items]]:flex [&_[cmdk-group-items]]:w-[200px] [&_[cmdk-group-items]]:flex-col [&_[cmdk-group-items]]:items-start [&_[cmdk-group-items]]:gap-[2px]',\n)\n\nexport const tableFilterPopoverContentClassName = cn('!p-[8px] w-[220px] flex flex-col gap-[8px]')\n\nexport const tableFilterCommandClassName = cn('flex flex-col gap-[8px]')\n\nexport const tableFilterScrollbarClassName = cn(\n '[scrollbar-color:var(--color-sys-scroll-bar)_transparent] [scrollbar-width:thin]',\n '[&::-webkit-scrollbar]:w-[8px] [&::-webkit-scrollbar-track]:bg-transparent',\n '[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-sys-scroll-bar',\n)\n\nexport const tableFilterCommandListClassName = cn(\n 'w-[200px] max-h-[300px] overflow-y-auto overflow-x-hidden',\n tableFilterScrollbarClassName,\n)\n\n// heading 없는 CommandGroup(presentation > group)을 걷어내 listbox > option 구조를 유지하되,\n// 항목 레이아웃은 cmdk가 CommandList 안에 렌더하는 sizer div에 건다.\nexport const tableFilterCommandListSizerClassName = cn(\n '[&_[cmdk-list-sizer]]:flex [&_[cmdk-list-sizer]]:w-[200px] [&_[cmdk-list-sizer]]:flex-col',\n '[&_[cmdk-list-sizer]]:items-start [&_[cmdk-list-sizer]]:gap-[2px]',\n)\n\n/**\n * cmdk 검색 입력이 Space를 공백 문자로 흡수해 항목 토글이 Enter로만 가능한 것을 보완한다.\n * 검색어가 비어 있을 때만 Space를 가로채 하이라이트된 option을 토글한다\n * (multi-select listbox에서 Space로 option을 토글하는 것이 APG 표준 패턴).\n *\n * ponytail: 검색어 입력 중에는 공백 문자 입력이 우선이라 토글 불가. 두 동작이 같은 키를\n * 공유하는 한 분기 기준이 필요하고, 검색어 유무가 가장 적은 배선으로 얻는 신호다.\n * 검색 입력 없는 변형이 생기거나 cmdk 키 처리가 바뀌면 재확인 필요.\n */\nexport function handleTableFilterSpaceToggle(e: React.KeyboardEvent<HTMLDivElement>) {\n if (e.key !== ' ') return\n const root = e.currentTarget\n if (root.querySelector<HTMLInputElement>('[cmdk-input]')?.value) return\n const activeItem = root.querySelector<HTMLElement>('[cmdk-item][data-selected=\"true\"]')\n if (!activeItem) return\n e.preventDefault()\n activeItem.click()\n}\n\nexport const tableFilterOperatorContentClassName = cn('flex w-full flex-col items-start gap-[2px]')\n\nexport function getTableFilterOperatorGlyph(operator: string) {\n return operatorGlyphs[operator] ?? operator\n}\n\nexport function getTableFilterItemClassName({\n kind = 'default',\n selected = false,\n className,\n}: {\n kind?: TableFilterItemKind\n selected?: boolean\n className?: string\n}) {\n return cn(\n itemBaseClassName,\n itemKindClassName[kind],\n itemStateClassName,\n selected && 'text-primary40 text-base-medium',\n kind === 'operator' && 'leading-[16px]',\n className,\n )\n}\n\nexport function getTableFilterTextSlotClassName({\n selected = false,\n className,\n}: {\n selected?: boolean\n className?: string\n} = {}) {\n return cn(\n 'flex min-w-0 flex-1 items-center px-[4px]',\n selected ? 'text-base-medium text-primary40' : 'text-base-regular text-sys-text-main',\n className,\n )\n}\n\nexport interface TableFilterTriggerButtonProps extends Omit<ButtonProps, 'variant' | 'children'> {\n isSelected?: boolean\n isPlaceholder?: boolean\n rightIcon?: React.ReactNode\n children: React.ReactNode\n}\n\nexport const TableFilterTriggerButton = React.forwardRef<\n HTMLButtonElement,\n TableFilterTriggerButtonProps\n>(\n (\n { isSelected = false, isPlaceholder = false, rightIcon, className, children, ...props },\n ref,\n ) => {\n // 호출부가 role='combobox' 를 주면 자식 텍스트가 이름이 되지 않는다(axe button-name).\n // 표시 텍스트 span 을 aria-labelledby 로 연결한다. 호출부의 aria-label 이 있으면 {...props} 가 덮는다.\n const textId = React.useId()\n return (\n <Button\n ref={ref}\n variant={isSelected ? 'primary' : 'secondary'}\n className={cn(\n 'w-fit justify-between',\n isPlaceholder && !isSelected && 'text-sys-button-secondary-link-text',\n className,\n )}\n aria-labelledby={textId}\n {...props}\n >\n <span className='flex min-w-0 flex-1 items-center justify-center'>\n <span className='box-border flex h-[24px] min-w-0 flex-1 items-center justify-center px-[4px]'>\n <span className='flex min-w-0 flex-1 flex-col justify-center text-[14px] font-bold leading-[0]'>\n <span id={textId} className='text-h6 truncate'>\n {children}\n </span>\n </span>\n </span>\n </span>\n {rightIcon && (\n <span className='box-border flex h-[24px] shrink-0 items-center justify-center px-[4px]'>\n {rightIcon}\n </span>\n )}\n </Button>\n )\n },\n)\n\nTableFilterTriggerButton.displayName = 'TableFilterTriggerButton'\n\nexport type TableFilterSearchInputProps = React.ComponentPropsWithoutRef<typeof CommandInput>\n\nexport const TableFilterSearchInput = React.forwardRef<\n React.ElementRef<typeof CommandInput>,\n TableFilterSearchInputProps\n>(({ className, wrapperClassName, iconClassName, ...props }, ref) => (\n <CommandInput\n ref={ref}\n wrapperClassName={cn('h-[36px] w-[200px] shrink-0 px-[8px]', wrapperClassName)}\n iconClassName={cn('mr-[8px] h-[16px] w-[16px]', iconClassName)}\n className={cn('h-full px-0 text-base-medium', className)}\n {...props}\n />\n))\n\nTableFilterSearchInput.displayName = 'TableFilterSearchInput'\n\nexport type TableFilterCommandItemProps = React.ComponentPropsWithoutRef<typeof CommandItem> & {\n kind?: TableFilterItemKind\n isSelected?: boolean\n}\n\nexport const TableFilterCommandItem = React.forwardRef<\n React.ElementRef<typeof CommandItem>,\n TableFilterCommandItemProps\n>(({ kind = 'default', isSelected = false, className, ...props }, ref) => (\n <CommandItem\n ref={ref}\n data-state={isSelected ? 'checked' : 'unchecked'}\n className={getTableFilterItemClassName({ kind, selected: isSelected, className })}\n {...props}\n />\n))\n\nTableFilterCommandItem.displayName = 'TableFilterCommandItem'\n\nexport interface TableFilterCheckboxCommandItemProps extends Omit<\n TableFilterCommandItemProps,\n 'kind' | 'isSelected' | 'children'\n> {\n checked: boolean\n children: React.ReactNode\n contentClassName?: string\n}\n\nexport const TableFilterCheckboxCommandItem = React.forwardRef<\n React.ElementRef<typeof CommandItem>,\n TableFilterCheckboxCommandItemProps\n>(({ checked, children, className, contentClassName, ...props }, ref) => (\n <TableFilterCommandItem\n ref={ref}\n kind='checkbox'\n isSelected={checked}\n // 인터랙션 단위는 항목이지 내부 체크박스가 아니다 — 상태는 option에 싣고\n // 이름은 항목 텍스트로 계산되게 둔다.\n aria-checked={checked}\n className={className}\n {...props}\n >\n <span className='flex size-[24px] shrink-0 items-center justify-center p-[4px]'>\n {/* 장식 — 접근성 이름 없는 button[role=checkbox]가 트리에 중복 노출되는 것을 막는다 */}\n <Checkbox checked={checked} tabIndex={-1} aria-hidden />\n </span>\n <span\n className={getTableFilterTextSlotClassName({\n selected: checked,\n className: contentClassName,\n })}\n >\n {children}\n </span>\n </TableFilterCommandItem>\n))\n\nTableFilterCheckboxCommandItem.displayName = 'TableFilterCheckboxCommandItem'\n\nexport function TableFilterOperatorGlyph({\n operator,\n className,\n}: {\n operator: string\n className?: string\n}) {\n return (\n <span\n className={cn(\n 'inline-flex min-h-[16px] min-w-[16px] items-center justify-center px-[2px]',\n className,\n )}\n >\n {getTableFilterOperatorGlyph(operator)}\n </span>\n )\n}\n\nexport interface TableFilterLoadingItemProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string\n}\n\nexport function TableFilterLoadingItem({\n label = '로드 중',\n className,\n ...props\n}: TableFilterLoadingItemProps) {\n return (\n <div\n role='status'\n className={cn(\n 'flex h-[36px] w-[200px] items-center justify-center gap-[8px] overflow-hidden rounded-xsmall py-[6px] pl-[2px] pr-[6px]',\n 'text-small-medium text-sys-text-subtlest',\n className,\n )}\n {...props}\n >\n <Spinner size='medium' variant='secondary' className='shrink-0' />\n <span className='whitespace-nowrap'>{label}</span>\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Check } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport {\n getTableFilterItemClassName,\n getTableFilterTextSlotClassName,\n tableFilterContentClassName,\n TableFilterLoadingItem,\n tableFilterOperatorContentClassName,\n TableFilterOperatorGlyph,\n tableFilterScrollbarClassName,\n} from '../tableFilterParts'\nimport { useColumnFilter } from './ColumnFilter'\nimport { OPERATOR_LABELS } from './types'\n\nconst FOCUS_RING_MAIN_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-main)',\n} satisfies React.CSSProperties\n\n// 공통 팝오버 컨텐츠 스타일\nconst popoverContentStyles = cn(\n 'fixed z-[9999] rounded-medium bg-sys-background shadow-gray-small outline-none border border-sys-divider-subtler',\n 'animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n)\n\n/** 컬럼 선택 팝오버 (2-column: 목록 + 설명) */\nexport function ColumnSelectPopover() {\n const {\n columns,\n activePopover,\n popoverTrigger,\n closePopover,\n selectColumn,\n editingFilter,\n popoverPosition,\n ids,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const columnItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n const [hoveredColumn, setHoveredColumn] = React.useState<string | null>(null)\n const [focusedColumnIndex, setFocusedColumnIndex] = React.useState(0)\n\n const hoveredColumnDef = hoveredColumn ? columns.find((c) => c.key === hoveredColumn) : null\n const hasAnyDescription = columns.some((c) => c.description)\n const isInputDriven = popoverTrigger === 'input'\n const selectedColumnIndex = Math.max(\n 0,\n editingFilter?.column ? columns.findIndex((column) => column.key === editingFilter.column) : 0,\n )\n const activeColumnIndex = isInputDriven\n ? columnSuggestionIndex >= 0\n ? columnSuggestionIndex\n : 0\n : focusedColumnIndex\n\n const focusInput = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.getElementById(ids.inputId)?.focus()\n })\n }, [ids.inputId])\n\n const focusNextAfterColumn = React.useCallback(() => {\n requestAnimationFrame(() => {\n const nextElement =\n document.querySelector<HTMLInputElement>('[data-column-filter-value-input]') ??\n document.querySelector<HTMLButtonElement>('[data-operator-button]') ??\n document.getElementById(ids.inputId)\n nextElement?.focus()\n })\n }, [ids.inputId])\n\n const focusColumnItem = React.useCallback(\n (index: number) => {\n if (columns.length === 0) return\n const nextIndex = ((index % columns.length) + columns.length) % columns.length\n if (isInputDriven) {\n setAutocompleteFocusMode('option')\n setColumnSuggestionIndex(nextIndex)\n }\n setFocusedColumnIndex(nextIndex)\n setHoveredColumn(columns[nextIndex]?.key ?? null)\n requestAnimationFrame(() => {\n columnItemRefs.current[nextIndex]?.focus()\n })\n },\n [columns, isInputDriven, setAutocompleteFocusMode, setColumnSuggestionIndex],\n )\n\n const returnFocusToInput = React.useCallback(() => {\n setAutocompleteFocusMode('input')\n focusInput()\n }, [focusInput, setAutocompleteFocusMode])\n\n React.useEffect(() => {\n if (activePopover !== 'column' || columns.length === 0) return\n\n if (isInputDriven) {\n const nextIndex = columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0\n setColumnSuggestionIndex(nextIndex)\n setHoveredColumn(columns[nextIndex]?.key ?? null)\n return\n }\n\n setFocusedColumnIndex(selectedColumnIndex)\n setHoveredColumn(columns[selectedColumnIndex]?.key ?? null)\n requestAnimationFrame(() => {\n columnItemRefs.current[selectedColumnIndex]?.focus()\n })\n }, [\n activePopover,\n columns,\n selectedColumnIndex,\n isInputDriven,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n ])\n\n // 열릴 때 하이라이트된 컬럼으로 스크롤 (selectContent.tsx:27-34과 같은 패턴)\n React.useEffect(() => {\n if (activePopover !== 'column') return\n requestAnimationFrame(() => {\n popoverRef.current\n ?.querySelector('[aria-selected=\"true\"]')\n ?.scrollIntoView({ block: 'nearest' })\n })\n }, [activePopover])\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'column') return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (isInputDriven && document.getElementById(ids.inputId)?.contains(target)) {\n return\n }\n if (popoverRef.current && !popoverRef.current.contains(target)) {\n closePopover()\n }\n }\n\n // 약간의 딜레이 후 이벤트 등록 (클릭으로 열린 직후 바로 닫히는 것 방지)\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover, ids.inputId, isInputDriven])\n\n if (activePopover !== 'column' || !popoverPosition) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='column-select-popover'\n className={cn(popoverContentStyles, 'p-[8px]')}\n style={{\n top: popoverPosition.y + 8,\n left: popoverPosition.x,\n }}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div className='flex gap-[4px]'>\n {/* 왼쪽: 컬럼 목록 */}\n <div\n id={ids.columnListId}\n role={isInputDriven ? 'listbox' : 'menu'}\n className={cn(\n tableFilterContentClassName,\n 'max-h-[324px] overflow-y-auto overflow-x-hidden',\n tableFilterScrollbarClassName,\n )}\n >\n {columns.map((column, index) => {\n const isSelected = editingFilter?.column === column.key\n const isActive = index === activeColumnIndex\n\n return (\n <div\n key={column.key}\n ref={(node) => {\n columnItemRefs.current[index] = node\n }}\n id={ids.getColumnOptionId(index)}\n role={isInputDriven ? 'option' : 'menuitem'}\n tabIndex={\n isInputDriven\n ? autocompleteFocusMode === 'option' && isActive\n ? 0\n : -1\n : index === focusedColumnIndex\n ? 0\n : -1\n }\n aria-selected={isInputDriven ? isActive : undefined}\n className={getTableFilterItemClassName({\n selected: isInputDriven ? isActive : isSelected,\n })}\n onMouseDown={(e) => {\n if (isInputDriven) e.preventDefault()\n }}\n onClick={() => {\n selectColumn(column.key)\n focusNextAfterColumn()\n }}\n onMouseEnter={() => {\n setHoveredColumn(column.key)\n if (isInputDriven) {\n setColumnSuggestionIndex(index)\n } else {\n setFocusedColumnIndex(index)\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectColumn(column.key)\n focusNextAfterColumn()\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusColumnItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusColumnItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusColumnItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusColumnItem(columns.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n returnFocusToInput()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n returnFocusToInput()\n }\n return\n }\n if (\n isInputDriven &&\n e.key.length === 1 &&\n !e.metaKey &&\n !e.ctrlKey &&\n !e.altKey\n ) {\n e.preventDefault()\n returnFocusToInput()\n return\n }\n if (\n isInputDriven &&\n (e.key === 'Backspace' ||\n e.key === 'Delete' ||\n e.key === 'ArrowLeft' ||\n e.key === 'ArrowRight')\n ) {\n e.preventDefault()\n returnFocusToInput()\n }\n }}\n >\n <Check size={16} className={cn(isSelected ? 'text-primary50' : 'invisible')} />\n <span className={getTableFilterTextSlotClassName({ selected: isSelected })}>\n {column.label}\n </span>\n </div>\n )\n })}\n </div>\n\n {/* 오른쪽: 호버된 컬럼 설명 (description이 있는 컬럼이 하나라도 있을 때만) */}\n {hasAnyDescription && hoveredColumnDef?.description && (\n <div className='border-l border-sys-divider-subtler px-[16px] py-[12px] min-w-[160px] max-w-[200px]'>\n <div className='text-base-semibold text-sys-text-main pb-[4px] mb-[4px] border-b border-sys-divider-subtler'>\n {hoveredColumnDef.label}\n </div>\n <div\n className={cn(\n 'text-small-regular text-sys-text-subtler',\n 'max-h-[243px] overflow-y-auto overflow-x-hidden break-keep wrap-break-word',\n tableFilterScrollbarClassName,\n )}\n >\n {hoveredColumnDef.description}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nColumnSelectPopover.displayName = 'ColumnSelectPopover'\n\n/** 연산자 선택 팝오버 */\nexport function OperatorSelectPopover() {\n const {\n activePopover,\n closePopover,\n selectOperator,\n editingFilter,\n getOperatorsForColumn,\n popoverPosition,\n ids,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const operatorItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n const [focusedOperatorIndex, setFocusedOperatorIndex] = React.useState(0)\n\n const operators = editingFilter?.column ? getOperatorsForColumn(editingFilter.column) : []\n const selectedOperatorIndex = Math.max(\n 0,\n editingFilter?.operator ? operators.indexOf(editingFilter.operator) : 0,\n )\n\n const focusOperatorButton = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.querySelector<HTMLButtonElement>('[data-operator-button]')?.focus()\n })\n }, [])\n\n const focusNextAfterOperator = React.useCallback(() => {\n requestAnimationFrame(() => {\n const nextElement =\n document.querySelector<HTMLInputElement>('[data-column-filter-value-input]') ??\n document.querySelector<HTMLButtonElement>('[data-editing-cancel-button]') ??\n document.querySelector<HTMLButtonElement>('[data-column-filter-reset-button]')\n nextElement?.focus()\n })\n }, [])\n\n const focusOperatorItem = React.useCallback(\n (index: number) => {\n if (operators.length === 0) return\n const nextIndex = (index + operators.length) % operators.length\n setFocusedOperatorIndex(nextIndex)\n requestAnimationFrame(() => {\n operatorItemRefs.current[nextIndex]?.focus()\n })\n },\n [operators.length],\n )\n\n React.useEffect(() => {\n if (activePopover !== 'operator' || operators.length === 0) return\n\n setFocusedOperatorIndex(selectedOperatorIndex)\n requestAnimationFrame(() => {\n operatorItemRefs.current[selectedOperatorIndex]?.focus()\n })\n }, [activePopover, operators.length, selectedOperatorIndex])\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'operator') return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n closePopover()\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover])\n\n if (activePopover !== 'operator' || !popoverPosition) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='operator-select-popover'\n role='menu'\n id={ids.operatorListId}\n className={cn(popoverContentStyles, 'w-[100px] p-[8px]')}\n style={{\n top: popoverPosition.y + 8,\n left: popoverPosition.x,\n }}\n >\n <div className={tableFilterOperatorContentClassName}>\n {operators.map((operator, index) => {\n const isSelected = editingFilter?.operator === operator\n\n return (\n <div\n key={operator}\n ref={(node) => {\n operatorItemRefs.current[index] = node\n }}\n role='menuitemradio'\n id={ids.getOperatorOptionId(index)}\n tabIndex={index === focusedOperatorIndex ? 0 : -1}\n aria-checked={isSelected}\n aria-label={OPERATOR_LABELS[operator]}\n className={getTableFilterItemClassName({ kind: 'operator', selected: isSelected })}\n style={FOCUS_RING_MAIN_STYLE}\n onClick={() => {\n selectOperator(operator)\n focusNextAfterOperator()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectOperator(operator)\n focusNextAfterOperator()\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusOperatorItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusOperatorItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusOperatorItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusOperatorItem(operators.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n focusOperatorButton()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n focusOperatorButton()\n } else {\n e.preventDefault()\n focusNextAfterOperator()\n }\n }\n }}\n >\n <Check\n size={16}\n className={cn('absolute left-[8px]', isSelected ? 'text-primary50' : 'invisible')}\n />\n <span className='flex min-w-0 flex-1 items-center justify-center px-[4px]'>\n <TableFilterOperatorGlyph operator={operator} />\n </span>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nOperatorSelectPopover.displayName = 'OperatorSelectPopover'\n\n/** 검색 자동완성 팝오버 */\nexport function SearchSuggestionPopover() {\n const {\n activePopover,\n popoverPosition,\n closePopover,\n ids,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const suggestionItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n\n const focusInput = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.getElementById(ids.inputId)?.focus()\n })\n }, [ids.inputId])\n\n const focusSearchItem = React.useCallback(\n (index: number) => {\n if (searchSuggestions.length === 0) return\n const nextIndex =\n ((index % searchSuggestions.length) + searchSuggestions.length) % searchSuggestions.length\n setAutocompleteFocusMode('option')\n setSearchSuggestionIndex(nextIndex)\n requestAnimationFrame(() => {\n suggestionItemRefs.current[nextIndex]?.focus()\n })\n },\n [searchSuggestions.length, setAutocompleteFocusMode, setSearchSuggestionIndex],\n )\n\n const returnFocusToInput = React.useCallback(() => {\n setAutocompleteFocusMode('input')\n focusInput()\n }, [focusInput, setAutocompleteFocusMode])\n\n // 첫 제안 선점 여부는 onSearch 유무에 따라 ColumnFilter가 결정한다 (여기서 다시 손대지 않는다)\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'search') return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (document.getElementById(ids.inputId)?.contains(target)) {\n return\n }\n if (popoverRef.current && !popoverRef.current.contains(target)) {\n closePopover()\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover, ids.inputId])\n\n if (activePopover !== 'search' || searchSuggestions.length === 0 || !popoverPosition) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='search-suggestion-popover'\n className={cn(popoverContentStyles, 'w-[220px] p-[8px]')}\n style={{\n top: popoverPosition.y + 8,\n left: popoverPosition.x,\n }}\n >\n <div id={ids.searchListId} role='listbox' className={tableFilterContentClassName}>\n {searchSuggestions.map((column, index) => (\n <div\n key={column.key}\n ref={(node) => {\n suggestionItemRefs.current[index] = node\n }}\n id={ids.getSearchOptionId(index)}\n role='option'\n aria-selected={index === searchSuggestionIndex}\n tabIndex={\n autocompleteFocusMode === 'option' && index === searchSuggestionIndex ? 0 : -1\n }\n className={getTableFilterItemClassName({\n selected: index === searchSuggestionIndex,\n })}\n onClick={() => selectSearchSuggestion(column.key)}\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectSearchSuggestion(column.key)\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusSearchItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusSearchItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusSearchItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusSearchItem(searchSuggestions.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n returnFocusToInput()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n returnFocusToInput()\n }\n return\n }\n if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault()\n returnFocusToInput()\n return\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n returnFocusToInput()\n }\n }}\n onMouseEnter={() => setSearchSuggestionIndex(index)}\n >\n <span className={getTableFilterTextSlotClassName()}>\n <span className='truncate'>{column.label}</span>\n <span className='ml-[4px] shrink-0 text-small-regular text-sys-text-subtler'>\n 컬럼으로 필터\n </span>\n </span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nSearchSuggestionPopover.displayName = 'SearchSuggestionPopover'\n\n/** 값 자동완성 팝오버 */\nexport function ValueSuggestionPopover() {\n const {\n activePopover,\n popoverPosition,\n closePopover,\n ids,\n valueSuggestions,\n valueSuggestionsLoading,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const suggestionItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n\n const focusInput = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.getElementById(ids.inputId)?.focus()\n })\n }, [ids.inputId])\n\n const focusValueItem = React.useCallback(\n (index: number) => {\n if (valueSuggestions.length === 0) return\n const nextIndex =\n ((index % valueSuggestions.length) + valueSuggestions.length) % valueSuggestions.length\n setAutocompleteFocusMode('option')\n setValueSuggestionIndex(nextIndex)\n requestAnimationFrame(() => {\n suggestionItemRefs.current[nextIndex]?.focus()\n })\n },\n [setAutocompleteFocusMode, setValueSuggestionIndex, valueSuggestions.length],\n )\n\n const returnFocusToInput = React.useCallback(() => {\n setAutocompleteFocusMode('input')\n focusInput()\n }, [focusInput, setAutocompleteFocusMode])\n\n // 값 팝오버는 첫 제안을 선점하지 않는다 — 입력 텍스트와 대응하지 않는 제안이 선점되면\n // 사용자가 입력한 적 없는 값이 Enter로 커밋된다. 제안 선택은 ArrowDown 이후에만 일어난다.\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'value') return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (document.getElementById(ids.inputId)?.contains(target)) {\n return\n }\n if (popoverRef.current && !popoverRef.current.contains(target)) {\n closePopover()\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover, ids.inputId])\n\n if (activePopover !== 'value' || !popoverPosition) return null\n\n // 로딩 중\n if (valueSuggestionsLoading && valueSuggestions.length === 0) {\n return (\n <div\n ref={popoverRef}\n data-slot='value-suggestion-popover'\n className={cn(popoverContentStyles, 'w-[220px] p-[8px]')}\n style={{ top: popoverPosition.y + 8, left: popoverPosition.x }}\n >\n <TableFilterLoadingItem />\n </div>\n )\n }\n\n // 제안 없음\n if (valueSuggestions.length === 0) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='value-suggestion-popover'\n className={cn(\n popoverContentStyles,\n 'w-[220px] max-h-[224px] overflow-y-auto p-[8px]',\n tableFilterScrollbarClassName,\n )}\n style={{ top: popoverPosition.y + 8, left: popoverPosition.x }}\n >\n <div id={ids.valueListId} role='listbox' className={tableFilterContentClassName}>\n {valueSuggestions.map((suggestion, index) => (\n <div\n key={suggestion.value}\n ref={(node) => {\n suggestionItemRefs.current[index] = node\n }}\n id={ids.getValueOptionId(index)}\n role='option'\n aria-selected={index === valueSuggestionIndex}\n tabIndex={autocompleteFocusMode === 'option' && index === valueSuggestionIndex ? 0 : -1}\n className={getTableFilterItemClassName({\n selected: index === valueSuggestionIndex,\n })}\n onClick={() => selectValueSuggestion(suggestion.value)}\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectValueSuggestion(suggestion.value)\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusValueItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusValueItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusValueItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusValueItem(valueSuggestions.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n returnFocusToInput()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n returnFocusToInput()\n }\n return\n }\n if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault()\n returnFocusToInput()\n return\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n returnFocusToInput()\n }\n }}\n onMouseEnter={() => setValueSuggestionIndex(index)}\n >\n <span className={getTableFilterTextSlotClassName()}>\n <span className='truncate'>{suggestion.label}</span>\n </span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nValueSuggestionPopover.displayName = 'ValueSuggestionPopover'\n\n/** 통합 팝오버 래퍼 - Input과 함께 사용 */\nexport interface ColumnFilterPopoverProps {\n /** 팝오버 트리거 영역 */\n children: React.ReactNode\n /** 추가 CSS 클래스 */\n className?: string\n}\n\nexport function ColumnFilterPopover({ children, className }: ColumnFilterPopoverProps) {\n return (\n <div className={cn('relative', className)}>\n {children}\n <ColumnSelectPopover />\n <OperatorSelectPopover />\n <SearchSuggestionPopover />\n <ValueSuggestionPopover />\n </div>\n )\n}\n\nColumnFilterPopover.displayName = 'ColumnFilterPopover'\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { getTableFilterOperatorGlyph } from '../tableFilterParts'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'\nimport { useColumnFilter } from './ColumnFilter'\nimport { type FilterCondition, OPERATOR_LABELS } from './types'\n\nconst FOCUS_RING_MAIN_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-main)',\n} satisfies React.CSSProperties\n\nconst FOCUS_RING_CLASS =\n 'focus:outline-none focus-visible:relative focus-visible:z-10 focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1'\n\nexport interface ColumnFilterTagProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 필터 조건 */\n filter: FilterCondition\n /** Invalid 상태 (빨간색 테마) */\n isInvalid?: boolean\n /** 삭제(x) 버튼 처리 직후 호출 — ColumnFilterInput이 팝오버 재오픈에 사용 (#1042) */\n onRemoved?: () => void\n}\n\n/**\n * 적용된 필터 1건을 보여주는 태그. 구조는 `div > [편집 button][삭제 button]` —\n * 루트를 role=button 으로 두고 그 안에 삭제 button 을 넣으면 위젯 중첩(axe nested-interactive)이라\n * 편집 영역과 삭제 영역을 형제 버튼으로 분리한다. 루트 div 는 모양(배경·라운드)만 담당한다.\n */\nexport function ColumnFilterTag({\n filter,\n isInvalid = false,\n onRemoved, // 구조분해로 걸러낸다 — 루트 div의 {...props}로 새면 DOM unknown prop 경고\n className,\n style,\n ...props\n}: ColumnFilterTagProps) {\n const { disabled, removeFilter, getColumnByKey, editExistingFilter } = useColumnFilter()\n\n const column = getColumnByKey(filter.column)\n const columnLabel = column?.label || filter.column\n const operatorLabel = OPERATOR_LABELS[filter.operator]\n const operatorGlyph = getTableFilterOperatorGlyph(filter.operator)\n const operatorTextClassName =\n filter.operator === 'contains' ? 'text-small-regular' : 'text-base-regular'\n const filterValue = String(filter.value)\n const tooltipLabel = `${columnLabel} ${operatorLabel} ${filterValue}`\n const textColorClass = isInvalid ? 'text-danger50' : 'text-primary50'\n\n const handleRemove = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n removeFilter(filter.id)\n onRemoved?.()\n },\n [filter.id, removeFilter, onRemoved],\n )\n\n const handleEdit = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n editExistingFilter(filter.id)\n },\n [filter.id, editExistingFilter],\n )\n\n return (\n <div\n data-slot='column-filter-tag'\n className={cn(\n 'inline-flex h-[24px] max-w-full min-w-0 items-center overflow-hidden rounded-xsmall',\n isInvalid ? 'bg-danger-o10' : 'bg-primary-o10',\n 'select-none',\n className,\n )}\n style={style}\n {...props}\n >\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type='button'\n data-slot='column-filter-tag-edit'\n disabled={disabled}\n onClick={handleEdit}\n aria-label={`${tooltipLabel} 필터 편집`}\n className={cn(\n 'inline-flex h-full min-w-0 flex-1 items-center cursor-pointer',\n FOCUS_RING_CLASS,\n 'disabled:cursor-not-allowed',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n <span\n className={cn(\n // 라벨: min-w-[36px]는 글자 수 보장이 아니라 긴 값(base 수백 px)이 flex shrink 배분에서\n // 라벨을 뭉개는 것을 막는 장치 (border-box, 패딩 10px 포함).\n // 상한: 라벨바닥 + 28.2(최대 연산자 '제외' box) + 22(⊗) ≤ 100(태그 영역 바닥).\n 'min-w-[36px] truncate pl-[6px] pr-[4px]',\n 'text-base-regular',\n textColorClass,\n )}\n >\n {columnLabel}\n </span>\n\n <span\n aria-hidden\n title={operatorLabel}\n className={cn(\n 'flex h-full shrink-0 items-center justify-center p-[2px]',\n operatorTextClassName,\n textColorClass,\n )}\n >\n {operatorGlyph}\n </span>\n\n <span\n className={cn(\n // 값: 최소 폭 바닥 없음 — 바닥은 짧은 값에 빈 공간을 만들고(실측 최대 33px/태그),\n // 좁은 폭에서 ⊗ 삭제 버튼을 밀어낸다. 전문은 tooltip으로 접근 가능(키보드 포커스 포함, 실측 통과).\n // min-w-[min(N,max-content)]는 무효 CSS(min()은 length-percentage만 허용) — 재시도 금지.\n 'truncate px-[4px]',\n 'text-base-semibold',\n textColorClass,\n )}\n >\n {filterValue}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>{tooltipLabel}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <button\n type='button'\n disabled={disabled}\n onClick={handleRemove}\n className={cn(\n 'inline-flex h-full shrink-0 items-center rounded-xsmall py-[2px] pl-[2px] pr-[4px]',\n FOCUS_RING_CLASS,\n 'transition-colors group/remove',\n 'hover:bg-danger-o10 active:bg-danger-o30',\n textColorClass,\n )}\n style={FOCUS_RING_MAIN_STYLE}\n aria-label={`${columnLabel} 필터 삭제`}\n >\n <CancelIcon\n size={16}\n iconClassName={cn(\n isInvalid\n ? 'bg-sys-background bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]'\n : 'bg-sys-background bg-[image:linear-gradient(var(--color-primary-o10),var(--color-primary-o10))]',\n 'group-hover/remove:bg-sys-background hover:group-hover/remove:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]',\n 'group-active/remove:bg-sys-background active:group-active/remove:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n )}\n />\n </button>\n </div>\n )\n}\n\nColumnFilterTag.displayName = 'ColumnFilterTag'\n","'use client'\n\nimport * as React from 'react'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { getTableFilterOperatorGlyph } from '../tableFilterParts'\nimport { useColumnFilter } from './ColumnFilter'\nimport { ColumnFilterPopover } from './ColumnFilterPopover'\nimport { ColumnFilterTag } from './ColumnFilterTag'\nimport { isInvalidFilterValue, OPERATOR_LABELS } from './types'\n\nconst FOCUS_RING_MAIN_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-main)',\n} satisfies React.CSSProperties\n\nconst FOCUS_RING_BOLD_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-bold)',\n} satisfies React.CSSProperties\n\n/** 바 클릭 표면에서 제외할 인터랙티브 요소 판정 — 칩 루트는 role='button', 그 내부는 button/input뿐.\n * 바에 새 인터랙티브 요소를 추가하면 이 셀렉터를 갱신할 것. */\nconst isInteractiveTarget = (e: React.SyntheticEvent) =>\n Boolean((e.target as HTMLElement).closest('button, input, [role=\"button\"]'))\n\n/** 편집 중인 필터 태그 (in-place + 신규 공용) */\nfunction EditingTag({\n editingFilter,\n editingColumnLabel,\n editingOperatorLabel,\n handleColumnButtonClick,\n handleColumnButtonKeyDown,\n handleOperatorButtonClick,\n handleOperatorButtonKeyDown,\n handleInputChange,\n handleKeyDown,\n cancelEditing,\n inputRef,\n measureRef,\n inputWidth,\n isInvalid,\n inputId,\n inputAriaControls,\n inputActiveDescendant,\n}: {\n editingFilter: NonNullable<ReturnType<typeof useColumnFilter>['editingFilter']>\n editingColumnLabel: string | null\n editingOperatorLabel: string\n handleColumnButtonClick: (e: React.MouseEvent<HTMLButtonElement>) => void\n handleColumnButtonKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void\n handleOperatorButtonClick: (e: React.MouseEvent<HTMLButtonElement>) => void\n handleOperatorButtonKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void\n cancelEditing: () => void\n inputRef: React.Ref<HTMLInputElement>\n measureRef: React.Ref<HTMLSpanElement>\n inputWidth: number\n isInvalid: boolean\n inputId: string\n inputAriaControls?: string\n inputActiveDescendant?: string\n}) {\n const operatorTextClassName =\n editingFilter.operator === 'contains' ? 'text-small-regular' : 'text-base-regular'\n\n return (\n <div\n data-slot='column-filter-editing-tag'\n className={cn(\n 'my-[1px] inline-flex h-[24px] max-w-full min-w-0 items-center overflow-hidden rounded-xsmall',\n isInvalid ? 'bg-danger-o10' : 'bg-primary-o10',\n 'select-none',\n )}\n >\n {/* 컬럼명 (클릭으로 변경 가능) */}\n <button\n type='button'\n data-column-button\n onClick={handleColumnButtonClick}\n onKeyDown={handleColumnButtonKeyDown}\n className={cn(\n 'flex h-full shrink-0 items-center rounded-l-xsmall pl-[6px] pr-[4px] transition-colors',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n isInvalid\n ? 'hover:bg-danger-o10 active:bg-danger-o30'\n : 'hover:bg-primary-o10 active:bg-primary-o30',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n <span className={cn('text-base-regular', isInvalid ? 'text-danger50' : 'text-primary50')}>\n {editingColumnLabel}\n </span>\n </button>\n\n {/* 연산자 (클릭으로 변경 가능) */}\n <button\n type='button'\n data-operator-button\n onClick={handleOperatorButtonClick}\n onKeyDown={handleOperatorButtonKeyDown}\n aria-label={editingOperatorLabel}\n title={editingOperatorLabel}\n className={cn(\n 'flex h-full min-w-[20px] shrink-0 items-center justify-center p-[2px] transition-colors',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n isInvalid\n ? editingFilter.operator\n ? 'hover:bg-danger-o10 active:bg-danger-o30'\n : 'bg-danger-o30 hover:bg-danger-o10 active:bg-danger-o30'\n : editingFilter.operator\n ? 'hover:bg-primary-o10 active:bg-primary-o30'\n : 'bg-primary-o30 hover:bg-primary-o10 active:bg-primary-o30',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n <span\n className={cn(\n operatorTextClassName,\n isInvalid\n ? editingFilter.operator\n ? 'text-danger50'\n : 'text-danger40'\n : editingFilter.operator\n ? 'text-primary50'\n : 'text-primary40',\n )}\n >\n {editingFilter.operator\n ? getTableFilterOperatorGlyph(editingFilter.operator)\n : editingOperatorLabel}\n </span>\n </button>\n\n {/* 값 입력 필드 - 연산자 선택 후에만 표시 */}\n {editingFilter.operator && (\n <div\n className={cn(\n 'relative flex h-full min-w-0 items-center overflow-hidden rounded-xsmall px-[4px] transition-colors',\n 'focus-within:outline-solid focus-within:outline-[2px] focus-within:[outline-color:var(--color-sys-focus-ring-main)] focus-within:-outline-offset-1',\n isInvalid\n ? 'hover:bg-danger-o10 active:bg-danger-o30'\n : 'hover:bg-primary-o10 active:bg-primary-o30',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n {/* 숨겨진 측정용 span */}\n <span\n ref={measureRef}\n className='invisible absolute whitespace-pre text-base-semibold'\n aria-hidden='true'\n >\n {editingFilter.value || ''}\n </span>\n <input\n ref={inputRef}\n id={inputId}\n data-column-filter-value-input\n type='text'\n role='combobox'\n aria-expanded={Boolean(inputAriaControls)}\n aria-controls={inputAriaControls}\n aria-activedescendant={inputActiveDescendant}\n aria-autocomplete='list'\n aria-invalid={isInvalid || undefined}\n autoComplete='off'\n value={editingFilter.value || ''}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=''\n aria-label={editingColumnLabel ? `${editingColumnLabel} 값` : '필터 값'}\n className={cn(\n 'h-full bg-transparent border-none p-0 outline-none',\n 'text-base-semibold',\n isInvalid ? 'text-danger50' : 'text-primary50',\n 'min-w-[4px] max-w-full text-ellipsis',\n isInvalid ? 'placeholder:text-danger30' : 'placeholder:text-primary30',\n )}\n style={{ width: `${inputWidth}px` }}\n />\n </div>\n )}\n\n {/* 취소 버튼 */}\n <button\n type='button'\n data-editing-cancel-button\n onClick={(e) => {\n e.stopPropagation()\n cancelEditing()\n }}\n className={cn(\n 'inline-flex h-full shrink-0 items-center rounded-xsmall py-[2px] pl-[2px] pr-[4px]',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n 'transition-colors group/remove',\n 'hover:bg-danger-o10 active:bg-danger-o30',\n isInvalid ? 'text-danger50' : 'text-primary50',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n aria-label='필터 편집 취소'\n >\n <CancelIcon\n size={16}\n iconClassName={cn(\n isInvalid\n ? 'bg-sys-background bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]'\n : 'bg-sys-background bg-[image:linear-gradient(var(--color-primary-o10),var(--color-primary-o10))]',\n 'group-hover/remove:bg-sys-background hover:group-hover/remove:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]',\n 'group-active/remove:bg-sys-background active:group-active/remove:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n )}\n />\n </button>\n </div>\n )\n}\n\nexport interface ColumnFilterInputProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 플레이스홀더 텍스트 — 무엇으로 찾는지만(\"모델 이름·요청 ID 검색\"). \"…하거나 조건을 추가하세요\" 처럼 조작을 설명하지 않는다(2026-11-06 홀드아웃 20) */\n placeholder?: string\n}\n\nexport function ColumnFilterInput({\n placeholder = '검색...',\n className,\n style,\n ...props\n}: ColumnFilterInputProps) {\n const {\n disabled,\n columns,\n filters,\n searchQuery,\n editingFilter,\n editingFilterId,\n activePopover,\n popoverTrigger,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n setSearchQuery,\n selectColumn,\n setEditingValue,\n commitFilter,\n cancelEditing,\n removeFilter,\n resetFilters,\n openPopover,\n closePopover,\n getColumnByKey,\n ids,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n valueSuggestions,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n } = useColumnFilter()\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const measureRef = React.useRef<HTMLSpanElement>(null)\n const [inputWidth, setInputWidth] = React.useState(4)\n\n const openPopoverFromElement = React.useCallback(\n (\n type: 'column' | 'operator' | 'search' | 'value',\n element: HTMLElement | null,\n trigger: 'input' | 'button' | null = 'input',\n ) => {\n const rect = element?.getBoundingClientRect()\n if (!rect) return\n openPopover(type, { x: rect.left, y: rect.bottom }, trigger)\n },\n [openPopover],\n )\n\n const focusOptionById = React.useCallback((id: string) => {\n requestAnimationFrame(() => {\n document.getElementById(id)?.focus()\n })\n }, [])\n\n const focusColumnSuggestion = React.useCallback(\n (index: number) => {\n if (columns.length === 0) return\n const nextIndex = ((index % columns.length) + columns.length) % columns.length\n setAutocompleteFocusMode('option')\n setColumnSuggestionIndex(nextIndex)\n focusOptionById(ids.getColumnOptionId(nextIndex))\n },\n [columns.length, focusOptionById, ids, setAutocompleteFocusMode, setColumnSuggestionIndex],\n )\n\n const focusSearchSuggestion = React.useCallback(\n (index: number) => {\n if (searchSuggestions.length === 0) return\n const nextIndex =\n ((index % searchSuggestions.length) + searchSuggestions.length) % searchSuggestions.length\n setAutocompleteFocusMode('option')\n setSearchSuggestionIndex(nextIndex)\n focusOptionById(ids.getSearchOptionId(nextIndex))\n },\n [\n focusOptionById,\n ids,\n searchSuggestions.length,\n setAutocompleteFocusMode,\n setSearchSuggestionIndex,\n ],\n )\n\n const focusValueSuggestion = React.useCallback(\n (index: number) => {\n if (valueSuggestions.length === 0) return\n const nextIndex =\n ((index % valueSuggestions.length) + valueSuggestions.length) % valueSuggestions.length\n setAutocompleteFocusMode('option')\n setValueSuggestionIndex(nextIndex)\n focusOptionById(ids.getValueOptionId(nextIndex))\n },\n [\n focusOptionById,\n ids,\n setAutocompleteFocusMode,\n setValueSuggestionIndex,\n valueSuggestions.length,\n ],\n )\n\n // 필터 편집(태그 작성·수정)이 끝났을 때만 검색 입력으로 포커스 복원. 마운트 시에는 가져가지 않는다 —\n // 페이지가 열리자마자 검색창이 포커스를 가져가면 키보드 사용자가 제목·헤더를 건너뛰고, 첫 Tab 이 검색창을 떠나\n // 표의 셀 수십 개를 지나야 한다 (2026-10-09 실측). \"이전에 편집 중이었나\" 를 ref 로 들고 있어 StrictMode 이중 실행에도 안전하다.\n // setTimeout(0): IME compositionend 이벤트가 현재 이벤트 루프에서 처리된 후\n // 다음 macrotask에서 포커스 이동 (한글 조합 잔여 글자 누출 방지)\n const wasEditingRef = React.useRef(false)\n React.useEffect(() => {\n const editing = Boolean(editingFilter || editingFilterId)\n const shouldRestore = wasEditingRef.current && !editing\n wasEditingRef.current = editing\n if (!shouldRestore) return\n const timerId = setTimeout(() => {\n inputRef.current?.focus()\n }, 0)\n return () => clearTimeout(timerId)\n }, [editingFilter, editingFilterId])\n\n // 편집 모드에서 연산자 선택 후 입력 필드에 포커스 + select 컬럼 자동 팝오버\n React.useEffect(() => {\n if (editingFilter?.operator) {\n inputRef.current?.focus()\n inputRef.current?.select()\n // 뒤따르는 폭 측정 effect가 스크롤을 되돌리므로 다음 프레임에서 앞부분으로 되감는다\n requestAnimationFrame(() => {\n if (inputRef.current) inputRef.current.scrollLeft = 0\n })\n\n // Select 컬럼: 즉시 value 팝오버 열기\n const column = editingFilter?.column ? getColumnByKey(editingFilter.column) : null\n if (column?.type === 'select' && column.options) {\n requestAnimationFrame(() => {\n openPopoverFromElement('value', inputRef.current, 'input')\n })\n }\n }\n }, [\n editingFilterId,\n editingFilter?.operator,\n editingFilter?.column,\n getColumnByKey,\n openPopoverFromElement,\n ])\n\n // 입력 필드 너비 측정\n React.useEffect(() => {\n if (measureRef.current) {\n const width = measureRef.current.offsetWidth\n setInputWidth(Math.max(4, width))\n }\n }, [editingFilter?.value])\n\n // 편집 중인 컬럼 라벨\n const editingColumnLabel = editingFilter?.column\n ? getColumnByKey(editingFilter.column)?.label || editingFilter.column\n : null\n\n // 편집 중인 연산자 라벨\n const editingOperatorLabel = editingFilter?.operator\n ? OPERATOR_LABELS[editingFilter.operator]\n : '?' // 연산자 미선택 시 플레이스홀더\n\n // 입력 값 (편집 중이면 편집 값, 아니면 검색 쿼리)\n const inputValue = editingFilter ? editingFilter.value || '' : searchQuery\n\n // 입력 변경 핸들러\n const handleInputChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setAutocompleteFocusMode('input')\n\n if (editingFilter) {\n // 편집 모드: 필터 값 업데이트 + value 팝오버 위치\n setEditingValue(value)\n openPopoverFromElement('value', inputRef.current, 'input')\n } else {\n // 통합 검색 모드\n setSearchQuery(value)\n // 검색어가 있으면 자동완성 팝오버 열기\n if (value.trim()) {\n openPopoverFromElement('search', inputRef.current, 'input')\n } else {\n closePopover()\n }\n }\n },\n [\n editingFilter,\n setAutocompleteFocusMode,\n setEditingValue,\n setSearchQuery,\n openPopoverFromElement,\n closePopover,\n ],\n )\n\n // 키보드 핸들러\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Tab') {\n if (activePopover) closePopover()\n return\n }\n\n if (activePopover === 'column' && popoverTrigger === 'input' && columns.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n focusColumnSuggestion(\n autocompleteFocusMode === 'option'\n ? columnSuggestionIndex + 1\n : columnSuggestionIndex >= 0\n ? columnSuggestionIndex\n : 0,\n )\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n focusColumnSuggestion(\n autocompleteFocusMode === 'option'\n ? columnSuggestionIndex - 1\n : columnSuggestionIndex >= 0\n ? columnSuggestionIndex\n : columns.length - 1,\n )\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusColumnSuggestion(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusColumnSuggestion(columns.length - 1)\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n const selectedIndex = columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0\n const selectedColumn = columns[selectedIndex]\n if (selectedColumn) selectColumn(selectedColumn.key)\n return\n }\n }\n\n if (e.key === 'ArrowDown' && !activePopover) {\n e.preventDefault()\n if (editingFilter) {\n openPopoverFromElement('value', inputRef.current, 'input')\n if (valueSuggestions.length > 0 && valueSuggestionIndex < 0) {\n setValueSuggestionIndex(0)\n }\n focusValueSuggestion(valueSuggestionIndex >= 0 ? valueSuggestionIndex : 0)\n } else if (searchQuery.trim() && searchSuggestions.length > 0) {\n openPopoverFromElement('search', inputRef.current, 'input')\n setSearchSuggestionIndex(searchSuggestionIndex >= 0 ? searchSuggestionIndex : 0)\n focusSearchSuggestion(searchSuggestionIndex >= 0 ? searchSuggestionIndex : 0)\n } else {\n openPopoverFromElement('column', inputRef.current, 'input')\n setColumnSuggestionIndex(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n focusColumnSuggestion(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n }\n return\n }\n\n // 값 자동완성 키보드 내비게이션\n if (activePopover === 'value' && valueSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n focusValueSuggestion(\n autocompleteFocusMode === 'option'\n ? valueSuggestionIndex + 1\n : valueSuggestionIndex >= 0\n ? valueSuggestionIndex\n : 0,\n )\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n focusValueSuggestion(\n autocompleteFocusMode === 'option'\n ? valueSuggestionIndex - 1\n : valueSuggestionIndex >= 0\n ? valueSuggestionIndex\n : valueSuggestions.length - 1,\n )\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusValueSuggestion(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusValueSuggestion(valueSuggestions.length - 1)\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n if (valueSuggestionIndex >= 0) {\n selectValueSuggestion(valueSuggestions[valueSuggestionIndex].value)\n } else {\n // 제안 미선택 → 입력값 그대로 커밋\n commitFilter()\n }\n return\n }\n }\n\n // 검색 자동완성 키보드 내비게이션 (WAI-ARIA Combobox 패턴)\n if (activePopover === 'search' && searchSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n focusSearchSuggestion(\n autocompleteFocusMode === 'option'\n ? searchSuggestionIndex + 1\n : searchSuggestionIndex >= 0\n ? searchSuggestionIndex\n : 0,\n )\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n focusSearchSuggestion(\n autocompleteFocusMode === 'option'\n ? searchSuggestionIndex - 1\n : searchSuggestionIndex >= 0\n ? searchSuggestionIndex\n : searchSuggestions.length - 1,\n )\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusSearchSuggestion(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusSearchSuggestion(searchSuggestions.length - 1)\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n if (searchSuggestionIndex >= 0) {\n selectSearchSuggestion(searchSuggestions[searchSuggestionIndex].key)\n } else {\n closePopover() // 선택 없이 엔터 → 검색어로 통합 검색\n }\n return\n }\n }\n\n if (e.key === 'Enter') {\n e.preventDefault()\n if (editingFilter) {\n commitFilter()\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n if (activePopover) {\n closePopover()\n } else if (editingFilter) {\n cancelEditing()\n }\n if (!activePopover && !editingFilter) {\n inputRef.current?.blur()\n }\n } else if (e.key === 'Backspace' && !inputValue) {\n // 빈 입력 상태에서 Backspace: 마지막 필터 삭제 또는 편집 취소\n if (editingFilter) {\n cancelEditing()\n }\n }\n },\n [\n editingFilter,\n activePopover,\n popoverTrigger,\n autocompleteFocusMode,\n inputValue,\n columns,\n commitFilter,\n cancelEditing,\n closePopover,\n openPopoverFromElement,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n selectColumn,\n focusColumnSuggestion,\n valueSuggestions,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n focusValueSuggestion,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n focusSearchSuggestion,\n searchQuery,\n ],\n )\n\n // 편집 중 X 버튼: 기존 필터면 삭제, 신규면 생성 취소\n const handleEditingCancel = React.useCallback(() => {\n if (editingFilterId) {\n removeFilter(editingFilterId)\n }\n cancelEditing()\n }, [editingFilterId, removeFilter, cancelEditing])\n\n // 현재 입력 상태에 맞는 팝오버를 연다 — ArrowDown 분기와 같은 규칙.\n // 텍스트가 있고 매칭 제안이 있으면 search, 그 외(빈 텍스트·매칭 0건)는 column.\n // search를 열 때 인덱스는 건드리지 않는다 — 선점 여부는 ColumnFilter의 effect가 onSearch\n // 유무로 결정하며, 여기서 선점하면 onSearch 소비처의 Enter 통합 검색이 깨진다.\n const openContextualPopover = React.useCallback(() => {\n if (searchQuery.trim() && searchSuggestions.length > 0) {\n openPopoverFromElement('search', inputRef.current, 'input')\n } else {\n openPopoverFromElement('column', inputRef.current, 'input')\n setColumnSuggestionIndex(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n }\n }, [\n searchQuery,\n searchSuggestions.length,\n openPopoverFromElement,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n ])\n\n // 초기화(x) 직후 재오픈 (#1042). resetFilters가 검색어까지 비우므로 항상 column이 정답이다.\n // contextual 분기를 쓰면 안 된다 — 이 콜백의 클로저는 초기화 전 렌더의 searchQuery를 보므로\n // 텍스트가 남아 있던 상태에서는 search를 열게 되는데, 그 시점의 제안은 0건이라 아무것도 안 뜬다.\n // rAF: 칩이 사라진 뒤의 레이아웃으로 위치를 재야 한다 — 동기 측정은 삭제 전 좌표다.\n // 새 초기화·삭제 경로를 추가하면 이 헬퍼들을 호출할 것.\n const reopenColumnPopover = React.useCallback(() => {\n requestAnimationFrame(() => {\n if (!inputRef.current) return\n inputRef.current.focus()\n openPopoverFromElement('column', inputRef.current, 'input')\n setColumnSuggestionIndex(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n })\n }, [openPopoverFromElement, columnSuggestionIndex, setColumnSuggestionIndex])\n\n // 칩 삭제 직후 재오픈 (#1042). 삭제는 검색어를 바꾸지 않으므로 클로저가 안전하다 —\n // 클릭과 같은 contextual 규칙을 쓴다.\n const reopenContextualPopover = React.useCallback(() => {\n requestAnimationFrame(() => {\n if (!inputRef.current) return\n inputRef.current.focus()\n openContextualPopover()\n })\n }, [openContextualPopover])\n\n const handleSearchInputClick = React.useCallback(() => {\n if (editingFilter) return\n // 보이는 팝오버는 유지한다. 단 'search'는 제안 0건이면 렌더되지 않아 활성이어도 화면에\n // 없다 — 닫힌 것으로 취급해 contextual 오픈으로 진행한다. (무매칭 텍스트를 타이핑한 뒤엔\n // 이 비가시 'search'가 activePopover에 남고, 외부 클릭 감지는 입력 내부 클릭을 제외하므로\n // 클릭으로는 영영 해소되지 않았다)\n if (activePopover && !(activePopover === 'search' && searchSuggestions.length === 0)) return\n\n openContextualPopover()\n }, [editingFilter, activePopover, searchSuggestions.length, openContextualPopover])\n\n // 바 전체를 클릭 표면으로 만든다 — 빈 영역 클릭 시 현재 입력(편집 중이면 편집 값 입력)에 포커스.\n // mousedown에서 preventDefault해야 기존 포커스가 blur로 이탈하지 않아 포커스 링이 깜빡이지 않는다.\n const handleContainerMouseDown = React.useCallback((e: React.MouseEvent) => {\n if (isInteractiveTarget(e)) return\n e.preventDefault()\n inputRef.current?.focus()\n }, [])\n\n const handleContainerClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (isInteractiveTarget(e)) return\n if (editingFilter) return // 편집 중엔 포커스 복원만 한다\n handleSearchInputClick() // 비편집: 입력 클릭과 같은 contextual 규칙\n },\n [editingFilter, handleSearchInputClick],\n )\n\n // 컬럼 버튼 클릭 핸들러\n const handleColumnButtonClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n if (activePopover === 'column') {\n closePopover()\n } else {\n openPopoverFromElement('column', e.currentTarget, 'button')\n }\n },\n [activePopover, openPopoverFromElement, closePopover],\n )\n\n const handleColumnButtonKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n e.stopPropagation()\n openPopoverFromElement('column', e.currentTarget, 'button')\n },\n [openPopoverFromElement],\n )\n\n // 연산자 버튼 클릭 핸들러\n const handleOperatorButtonClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n if (activePopover === 'operator') {\n closePopover()\n } else {\n openPopoverFromElement('operator', e.currentTarget, 'button')\n }\n },\n [activePopover, openPopoverFromElement, closePopover],\n )\n\n const handleOperatorButtonKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n e.stopPropagation()\n openPopoverFromElement('operator', e.currentTarget, 'button')\n },\n [openPopoverFromElement],\n )\n\n // 초기화 버튼 클릭 핸들러\n const handleReset = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n resetFilters()\n reopenColumnPopover() // 포커스 복원도 여기서 함께 한다\n },\n [resetFilters, reopenColumnPopover],\n )\n\n // 필터나 검색어가 있는지 확인\n const hasContent = filters.length > 0 || searchQuery.length > 0 || Boolean(editingFilter)\n const hasFilterTokens = filters.length > 0 || Boolean(editingFilter)\n\n const getFilterInvalidState = React.useCallback(\n (filter: { column?: string; value?: string | number }) =>\n isInvalidFilterValue(filter.column ? getColumnByKey(filter.column) : undefined, filter.value),\n [getColumnByKey],\n )\n\n const searchActiveDescendant =\n activePopover === 'search' && searchSuggestionIndex >= 0\n ? ids.getSearchOptionId(searchSuggestionIndex)\n : undefined\n\n const columnActiveDescendant =\n activePopover === 'column' && popoverTrigger === 'input' && columnSuggestionIndex >= 0\n ? ids.getColumnOptionId(columnSuggestionIndex)\n : undefined\n\n const valueActiveDescendant =\n activePopover === 'value' && valueSuggestionIndex >= 0\n ? ids.getValueOptionId(valueSuggestionIndex)\n : undefined\n\n // 제안 0건이면 listbox 가 렌더되지 않으므로 가리키지 않는다 (없는 id 를 가리키면 axe aria-valid-attr-value critical)\n const searchInputAriaControls =\n activePopover === 'search' && searchSuggestions.length > 0\n ? ids.searchListId\n : activePopover === 'column' && popoverTrigger === 'input'\n ? ids.columnListId\n : undefined\n\n const searchInputActiveDescendant = searchActiveDescendant ?? columnActiveDescendant\n\n return (\n <ColumnFilterPopover>\n <div\n ref={containerRef}\n data-slot='column-filter-input'\n // 클릭 표면일 뿐 그 자체로 인터랙티브하지 않다 — 키보드 경로는 내부 input·버튼·칩이 이미 갖는다\n role='presentation'\n className={cn(\n 'flex items-center gap-[4px]',\n hasFilterTokens && 'flex-wrap',\n 'w-full min-h-[36px] rounded-small border border-sys-divider-main bg-sys-background',\n 'px-[6px] py-[4px]',\n 'focus-within:outline-solid focus-within:outline-2 focus-within:[outline-color:var(--color-sys-focus-ring-bold)] focus-within:-outline-offset-1 focus-within:border-transparent',\n 'transition-colors cursor-text',\n className,\n )}\n style={{ ...style, ...FOCUS_RING_BOLD_STYLE }}\n onMouseDown={handleContainerMouseDown}\n onClick={handleContainerClick}\n {...props}\n >\n {/* 검색 아이콘 — outer flex의 shrink-0 item(absolute 아님). 줄바꿈은 안쪽 태그 영역에서만\n 일어나 outer는 flex line 1개이므로, items-center가 컨트롤 전체 높이 기준 세로 중앙에 둔다 */}\n <Search size={20} className='text-sys-text-subtler shrink-0' />\n\n {/* 태그 + 입력 영역 */}\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-wrap items-center gap-x-[4px]',\n hasFilterTokens && 'min-w-[100px] basis-[100px]',\n )}\n >\n {/* 적용된 필터 태그들 (편집 중인 필터는 편집 태그로 교체) */}\n {filters.map((filter) =>\n filter.id === editingFilterId ? (\n <EditingTag\n key={filter.id}\n editingFilter={editingFilter!}\n editingColumnLabel={editingColumnLabel}\n editingOperatorLabel={editingOperatorLabel}\n handleColumnButtonClick={handleColumnButtonClick}\n handleColumnButtonKeyDown={handleColumnButtonKeyDown}\n handleOperatorButtonClick={handleOperatorButtonClick}\n handleOperatorButtonKeyDown={handleOperatorButtonKeyDown}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n cancelEditing={handleEditingCancel}\n inputRef={inputRef}\n measureRef={measureRef}\n inputWidth={inputWidth}\n isInvalid={getFilterInvalidState(editingFilter!)}\n inputId={ids.inputId}\n inputAriaControls={\n activePopover === 'value' && valueSuggestions.length > 0\n ? ids.valueListId\n : undefined\n }\n inputActiveDescendant={valueActiveDescendant}\n />\n ) : (\n <ColumnFilterTag\n key={filter.id}\n filter={filter}\n isInvalid={getFilterInvalidState(filter)}\n className='my-[1px]'\n // 편집 중엔 재오픈하지 않는다 — 컬럼 선택이 편집 중 필터를 변조한다\n onRemoved={editingFilter ? undefined : reopenContextualPopover}\n />\n ),\n )}\n\n {/* 새 필터 편집 태그 (editingFilterId가 없는 경우 = 신규 필터) */}\n {editingFilter && !editingFilterId && (\n <EditingTag\n editingFilter={editingFilter}\n editingColumnLabel={editingColumnLabel}\n editingOperatorLabel={editingOperatorLabel}\n handleColumnButtonClick={handleColumnButtonClick}\n handleColumnButtonKeyDown={handleColumnButtonKeyDown}\n handleOperatorButtonClick={handleOperatorButtonClick}\n handleOperatorButtonKeyDown={handleOperatorButtonKeyDown}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n cancelEditing={handleEditingCancel}\n inputRef={inputRef}\n measureRef={measureRef}\n inputWidth={inputWidth}\n isInvalid={getFilterInvalidState(editingFilter)}\n inputId={ids.inputId}\n inputAriaControls={\n activePopover === 'value' && valueSuggestions.length > 0\n ? ids.valueListId\n : undefined\n }\n inputActiveDescendant={valueActiveDescendant}\n />\n )}\n\n {/* 통합 검색 입력 필드 (편집 중이 아닐 때만 표시) */}\n {!editingFilter && (\n <input\n ref={inputRef}\n id={ids.inputId}\n data-column-filter-search-input\n type='text'\n role='combobox'\n aria-expanded={Boolean(searchInputAriaControls)}\n aria-controls={searchInputAriaControls}\n aria-activedescendant={searchInputActiveDescendant}\n aria-autocomplete='list'\n autoComplete='off'\n disabled={disabled}\n value={searchQuery}\n onClick={handleSearchInputClick}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n aria-label={placeholder || '검색'}\n className={cn(\n 'h-[26px] flex-1 min-w-[100px] bg-transparent border-none p-0 outline-none',\n 'text-base-regular text-sys-text-main placeholder:text-sys-text-subtler',\n )}\n />\n )}\n </div>\n\n {/* 초기화 버튼 */}\n {hasContent && (\n <button\n type='button'\n data-column-filter-reset-button\n disabled={disabled}\n onClick={handleReset}\n className={cn(\n 'flex items-center justify-center shrink-0 p-[2px] rounded-small',\n 'text-sys-text-subtler hover:bg-secondary-o10',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n 'transition-colors',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n aria-label='검색 초기화'\n >\n <CancelIcon size={20} />\n </button>\n )}\n </div>\n </ColumnFilterPopover>\n )\n}\n\nColumnFilterInput.displayName = 'ColumnFilterInput'\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../utils/cn'\n\ninterface PopoverContentProps extends React.ComponentPropsWithoutRef<\n typeof PopoverPrimitive.Content\n> {\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n withFitContent?: boolean\n}\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(({ align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n {...props}\n className={cn(\n 'z-[calc(var(--root-z-index)-1)] rounded-medium bg-sys-background p-[8px] shadow-gray-small color-sys-text-main outline-none border border-sys-divider-subtler',\n 'data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]',\n 'data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]',\n 'data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]',\n 'data-[side=left]:animate-[slide-in-right_150ms_ease-out]',\n 'data-[side=right]:animate-[slide-in-left_150ms_ease-out]',\n props.className,\n )}\n />\n </PopoverPrimitive.Portal>\n))\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import { useCallback, useEffect, useState } from 'react'\nimport { ListFilter } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport { Badge } from './badge'\nimport { Button } from './button'\nimport { Command, CommandEmpty, CommandGroup, CommandList } from './command'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport {\n TableFilterCheckboxCommandItem,\n tableFilterCommandClassName,\n tableFilterCommandListClassName,\n tableFilterContentClassName,\n tableFilterPopoverContentClassName,\n TableFilterSearchInput,\n} from './tableFilterParts'\n\ninterface FilterTitleType {\n title?: string\n}\n\nfunction FilterTitle({ title = '필터' }: FilterTitleType) {\n return <span className='text-small-bold-h text-sys-text-main px-[4px]'>{title}</span>\n}\n\nexport type ColumnVisibilityOption = {\n value: string\n label: string\n}\n\nexport interface ColumnVisibilityFilterProps {\n title?: string\n options: ColumnVisibilityOption[]\n value: string[]\n onChange: (selected: string[]) => void\n placeholder?: string\n emptyText?: string\n allText?: string\n className?: {\n button?: string\n PopoverContent?: string\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n searchPlaceholder?: string\n searchable?: boolean\n align?: 'start' | 'center' | 'end'\n}\n\nexport function ColumnVisibilityFilter({\n title,\n options,\n value = [],\n onChange,\n searchPlaceholder = '검색',\n emptyText = '조회 가능한 옵션이 없습니다.',\n allText = '전체 선택',\n searchable = true,\n className,\n align = 'end',\n}: ColumnVisibilityFilterProps) {\n const [open, setOpen] = useState(false)\n const [selectedValues, setSelectedValues] = useState<string[]>(value)\n\n // 외부 value prop과 내부 상태 동기화\n useEffect(() => {\n setSelectedValues(value)\n }, [value])\n\n const handleSelect = useCallback(\n (val: string) => {\n const updatedSelected = selectedValues.includes(val)\n ? selectedValues.filter((item) => item !== val)\n : [...selectedValues, val]\n\n setSelectedValues(updatedSelected)\n onChange(updatedSelected)\n },\n [selectedValues, onChange],\n )\n\n // 전체 토글 (수정된 로직)\n const toggleAll = () => {\n const allValues = options.map((option) => option.value)\n\n if (selectedValues.length === options.length) {\n // 이미 모두 선택된 상태라면 -> 모두 해제 (빈 배열)\n setSelectedValues([])\n onChange([])\n } else {\n // 그 외(일부만 선택 or 아무것도 선택 안됨) -> 모두 선택\n setSelectedValues(allValues)\n onChange(allValues)\n }\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant='secondary'\n role='combobox'\n aria-expanded={open}\n // role=combobox 는 자식 텍스트로 이름을 얻지 못한다 → 제목과 선택 수로 이름을 만든다\n aria-label={\n selectedValues.length > 0\n ? `${title ?? '컬럼 표시'} (${selectedValues.length}개 선택)`\n : (title ?? '컬럼 표시')\n }\n className={className?.button}\n >\n <ListFilter size={20} className='mr-[2px]' />\n {title}\n {selectedValues.length > 0 && (\n <Badge variant='secondary' className='ml-[4px]'>\n {selectedValues.length}\n </Badge>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n aria-label={title ?? '컬럼 표시'}\n className={cn(tableFilterPopoverContentClassName, className?.PopoverContent)}\n align={align}\n >\n <FilterTitle title={title} />\n\n <Command className={cn(tableFilterCommandClassName, className?.Command)}>\n {searchable && (\n <TableFilterSearchInput\n placeholder={searchPlaceholder}\n className={className?.CommandInput}\n />\n )}\n <CommandList className={cn(tableFilterCommandListClassName, className?.CommandList)}>\n <CommandEmpty>{emptyText}</CommandEmpty>\n <CommandGroup className={cn(tableFilterContentClassName, className?.CommandGroup)}>\n <TableFilterCheckboxCommandItem\n key='all'\n onSelect={toggleAll}\n checked={selectedValues.length === options.length}\n className={className?.CommandItem}\n >\n {allText}\n </TableFilterCheckboxCommandItem>\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n\n return (\n <TableFilterCheckboxCommandItem\n key={option.value}\n value={option.value}\n onSelect={() => handleSelect(option.value)}\n checked={isSelected}\n className={className?.CommandItem}\n >\n {option.label}\n </TableFilterCheckboxCommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\n\nexport interface FloatingLabelOutlineProps {\n /** 'standard' = three-box notched outline, 'none' = inline floating label */\n mode: 'standard' | 'none'\n label: string\n required?: boolean\n isFloating: boolean\n isMounted: boolean\n labelColorClass: string\n /** notched outline border 색상 클래스 (standard 모드 전용) */\n borderColorClass: string\n /** notched outline border 두께가 두꺼운 상태인지 (standard 모드 전용) */\n isThickBorder: boolean\n labelId: string\n}\n\nfunction FloatingLabelOutline({\n mode,\n label,\n required,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n}: FloatingLabelOutlineProps) {\n const transitionClass = cn(\n isMounted &&\n 'transition-[top,translate,scale,color] duration-150 ease-[cubic-bezier(0.4,0,0.2,1)]',\n 'motion-reduce:transition-none',\n )\n\n if (mode === 'standard') {\n return (\n <div\n className='pointer-events-none absolute inset-0 flex rounded-small'\n data-slot='notched-outline'\n >\n {/* Left border */}\n <span\n className={cn(\n 'h-full w-[8px] rounded-l-small',\n borderColorClass,\n isThickBorder\n ? 'border-t-[2px] border-b-[2px] border-l-[2px] border-r-0'\n : 'border-t border-b border-l border-r-0',\n )}\n />\n {/* Center border (notch) */}\n <span\n className={cn(\n 'h-full relative',\n borderColorClass,\n isThickBorder\n ? 'border-t-[2px] border-b-[2px] border-l-0 border-r-0'\n : 'border-t border-b border-l-0 border-r-0',\n isFloating && '!border-t-transparent',\n isMounted &&\n 'transition-[border-top-color] duration-150 ease-[cubic-bezier(0.4,0,0.2,1)]',\n 'motion-reduce:transition-none',\n )}\n >\n {/* Invisible spacer: center span의 너비를 label 텍스트에 맞추기 위한 요소 */}\n <span\n className='invisible text-small-medium px-[2px] leading-none whitespace-nowrap'\n aria-hidden='true'\n >\n {label}\n {required && '*'}\n </span>\n {/* Floating label */}\n <span\n id={labelId}\n data-slot='floating-label'\n data-floating={isFloating}\n className={cn(\n 'absolute left-0 px-[2px] whitespace-nowrap origin-left',\n 'text-small-medium leading-none -translate-y-1/2',\n isFloating\n ? cn('scale-100 -top-[2px]', isThickBorder && '-mt-[1px]')\n : 'top-[min(50%,18px)] scale-[1.167]',\n labelColorClass,\n transitionClass,\n )}\n >\n {label}\n {required && (\n <span className='text-danger30 ml-[1px]' aria-hidden='true'>\n *\n </span>\n )}\n </span>\n </span>\n {/* Right border */}\n <span\n className={cn(\n 'h-full flex-1 rounded-r-small',\n borderColorClass,\n isThickBorder\n ? 'border-t-[2px] border-b-[2px] border-r-[2px] border-l-0'\n : 'border-t border-b border-r border-l-0',\n )}\n />\n </div>\n )\n }\n\n // mode === 'none'\n return (\n <span\n id={labelId}\n data-slot='floating-label'\n data-floating={isFloating}\n className={cn(\n 'absolute left-[8px] pointer-events-none origin-left z-10',\n 'text-small-medium leading-none whitespace-nowrap -translate-y-1/2',\n isFloating ? '-top-[2px] scale-100' : 'top-[min(50%,18px)] scale-[1.167]',\n labelColorClass,\n transitionClass,\n )}\n >\n {label}\n {required && (\n <span className='text-danger30 ml-[1px]' aria-hidden='true'>\n *\n </span>\n )}\n </span>\n )\n}\n\nexport { FloatingLabelOutline }\n","'use client'\n\nimport * as React from 'react'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseFloatingLabelOptions {\n /** Floating label 텍스트. 지정 시 floating label 모드 활성화 */\n label?: string\n /** 값이 있는지 여부 */\n hasValue: boolean\n /** 드롭다운 열림 여부 (Select 전용) */\n isOpen?: boolean\n /** focus 여부 */\n isFocused?: boolean\n /** 에러 상태 */\n isInvalid?: boolean\n /** 비활성 상태 */\n isDisabled?: boolean\n /** 'standard' | 'none' */\n appearance?: string\n}\n\nexport interface UseFloatingLabelReturn {\n /** label이 활성화되었는지 */\n hasLabel: boolean\n /** label이 위로 올라간 상태인지 */\n isFloating: boolean\n /** 초기 마운트 이후인지 (transition 활성화 용도) */\n isMounted: boolean\n /** label에 적용할 색상 클래스 */\n labelColorClass: string\n /** notched outline border에 적용할 색상 클래스 */\n borderColorClass: string\n /** notched outline border 두께가 두꺼운 상태인지 (focus/invalid/open → 2px) */\n isThickBorder: boolean\n /** label 고유 ID (aria-labelledby용) */\n labelId: string\n}\n\n// ============================================================================\n// Label 색상 결정\n// ============================================================================\n\nfunction getLabelColorClass(options: {\n isDisabled?: boolean\n isInvalid?: boolean\n isOpen?: boolean\n isFocused?: boolean\n hasValue: boolean\n}): string {\n const { isDisabled, isInvalid, isOpen, isFocused, hasValue } = options\n\n if (isDisabled) return 'text-sys-text-disabled'\n if (isInvalid) {\n // 부유 상태(값 있음/열림/포커스)일 때만 빨간색, 비부유(placeholder)일 때는 회색 유지\n if (hasValue || isOpen || isFocused) return 'text-danger30'\n return 'text-sys-text-placeholder'\n }\n if (isOpen || isFocused) return 'text-sys-focus-ring-bold'\n if (hasValue) return 'text-sys-text-subtler'\n return 'text-sys-text-placeholder'\n}\n\n// ============================================================================\n// Border 색상/두께 결정 (Three-box notched outline용)\n// ============================================================================\n\nfunction getBorderColorClass(options: {\n isDisabled?: boolean\n isInvalid?: boolean\n isOpen?: boolean\n isFocused?: boolean\n}): string {\n const { isDisabled, isInvalid, isOpen, isFocused } = options\n\n if (isDisabled) return 'border-sys-divider-main'\n if (isInvalid) return 'border-danger30'\n if (isOpen || isFocused) return 'border-sys-focus-ring-bold'\n return 'border-sys-divider-main'\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useFloatingLabel(options: UseFloatingLabelOptions): UseFloatingLabelReturn {\n const {\n label,\n hasValue,\n isOpen = false,\n isFocused = false,\n isInvalid = false,\n isDisabled = false,\n } = options\n\n const hasLabel = !!label\n const isFloating = hasValue || isOpen || isFocused\n\n // 초기 마운트 시 transition 비활성화 (defaultValue 깜빡임 방지)\n const [isMounted, setIsMounted] = React.useState(false)\n React.useEffect(() => {\n // requestAnimationFrame으로 첫 paint 이후에 transition 활성화\n const id = requestAnimationFrame(() => setIsMounted(true))\n return () => cancelAnimationFrame(id)\n }, [])\n\n const labelId = React.useId()\n\n const labelColorClass = getLabelColorClass({\n isDisabled,\n isInvalid,\n isOpen,\n isFocused,\n hasValue,\n })\n\n const borderColorClass = getBorderColorClass({\n isDisabled,\n isInvalid,\n isOpen,\n isFocused,\n })\n\n const isThickBorder = !!isInvalid || isOpen || isFocused\n\n return {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n }\n}\n","const word = {\n common: {\n pickDate: '날짜 선택',\n startDate: '시작일',\n startTime: '시작 시간',\n none: '선택 안함',\n directSelect: '직접 선택',\n },\n}\n\nexport default word\n","'use client'\n\nimport { forwardRef } from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../utils/cn'\n\nconst labelVariants = cva('text-sys-text-main text-base-regular')\n\nconst Label = forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport { useCallback, useMemo, useState } from 'react'\nimport { DateRange, SelectRangeEventHandler, SelectSingleEventHandler } from 'react-day-picker'\nimport { add, addDays, differenceInCalendarDays, isSameDay, subDays } from 'date-fns'\nimport { CheckIcon, ChevronLeft } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Button } from './button'\nimport { Calendar, CalendarProps } from './calendar'\nimport { Command, CommandItem, CommandList } from './command'\nimport { Label } from './label'\nimport { Separator } from './separator'\nimport { Stack } from './stack'\n\n// 항목 레이아웃은 cmdk가 CommandList 안에 렌더하는 sizer div에 건다 (구 CommandGroup 자리)\nconst DATE_PRESETS_LIST_SIZER_CLASS =\n '[&_[cmdk-list-sizer]]:flex [&_[cmdk-list-sizer]]:flex-col [&_[cmdk-list-sizer]]:gap-[2px]'\n\nexport type DateRangePresetsProps = {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n options?: {\n value: string\n label: string\n }[]\n defaultValue?: string\n allText?: string\n calendarButtonLabel?: string\n date?: DateRange\n setDate?: SelectRangeEventHandler\n calendarProps?: CalendarProps\n todayPosition?: 'to' | 'from'\n withPresets?: boolean\n /** '선택 안함' 옵션 표시 여부 (default: true) */\n showAllOption?: boolean\n /** '직접 선택' 버튼 표시 여부 (default: true) */\n showCalendarButton?: boolean\n}\n\nconst dateRangeOptions = [\n { value: '3', label: '최근 3일' },\n { value: '7', label: '최근 7일' },\n { value: '14', label: '최근 14일' },\n { value: '30', label: '최근 30일' },\n { value: '90', label: '최근 90일' },\n]\n\nfunction DateRangePresets({\n options = dateRangeOptions,\n className,\n defaultValue,\n date,\n setDate,\n allText = word.common.none,\n calendarButtonLabel = word.common.directSelect,\n calendarProps,\n todayPosition = 'to',\n withPresets = true,\n showAllOption = true,\n showCalendarButton = true,\n}: DateRangePresetsProps) {\n // 커스텀 날짜 범위 레이블 반환\n const getMatchingDateRangeLabel = useCallback(\n (date?: DateRange, todayPosition: 'to' | 'from' = 'to') => {\n if (!date?.from || !date?.to) return undefined\n\n const today = new Date()\n\n const isMatch =\n todayPosition === 'to' ? isSameDay(date.to, today) : isSameDay(date.from, today)\n\n // to가 오늘인지 확인\n if (!isMatch) return 'custom'\n\n // from부터 today까지 몇일 차이인지 계산\n const daysDiff =\n todayPosition === 'to'\n ? differenceInCalendarDays(today, date.from)\n : differenceInCalendarDays(date.to, today)\n\n // options에서 일치하는 값 찾기\n const matched = options.find((opt) => opt.value === daysDiff.toString())\n\n return matched?.value.toString()\n },\n [options],\n )\n\n /**\n * 선택된 날짜 범위 값\n * 숫자 문자열 -> 옵션날짜 범위\n * undefined -> 선택 안함\n * 'custom' -> 직접 선택 날짜 범위\n */\n const [selectedValues, setSelectedValues] = useState<string | undefined>(\n defaultValue || getMatchingDateRangeLabel(date),\n )\n\n // 선택된 날짜 범위 초기화(선택 안함)\n function reset() {\n setSelectedValues(undefined)\n if (setDate) {\n setDate(undefined, new Date(), {}, {} as React.MouseEvent)\n }\n }\n\n // 커스텀 날짜 범위 캘린더 열림 여부\n const [isCustomCalendarOpen, setIsCustomCalendarOpen] = useState(false)\n\n if (isCustomCalendarOpen || !withPresets) {\n return (\n <Stack direction='column' spacing={8}>\n <Separator />\n <Calendar\n {...calendarProps}\n mode='range'\n selected={date}\n onSelect={setDate}\n initialFocus\n numberOfMonths={2}\n />\n {withPresets && (\n <>\n <Separator />\n <Button\n variant='secondary'\n className='self-start'\n onClick={() => setIsCustomCalendarOpen(false)}\n spacing={'compact'}\n >\n <ChevronLeft />\n 뒤로가기\n </Button>\n </>\n )}\n </Stack>\n )\n }\n\n return (\n <div className={cn('flex flex-col gap-[8px]', className?.Command)}>\n <Command>\n {/* heading 없는 CommandGroup을 걷어내 listbox > option 구조 유지. 레이아웃은 sizer에 건다 */}\n <CommandList\n label='날짜 필터'\n className={cn(\n DATE_PRESETS_LIST_SIZER_CLASS,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n {showAllOption && (\n <CommandItem\n key='none'\n onSelect={reset}\n data-state={selectedValues === undefined ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === undefined && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px] ',\n )}\n />\n <Label className='text-inherit'>{allText}</Label>\n </CommandItem>\n )}\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={() => {\n const today = new Date()\n const days = parseInt(option.value)\n\n const dateRange =\n todayPosition === 'to'\n ? { from: subDays(today, days), to: today }\n : { from: today, to: addDays(today, days) }\n\n const matchingLabel = getMatchingDateRangeLabel(dateRange, todayPosition)\n\n if (matchingLabel) {\n setSelectedValues(matchingLabel)\n }\n\n setDate?.(dateRange, new Date(), {}, {} as React.MouseEvent)\n }}\n data-state={selectedValues === option.value ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === option.value && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px]',\n )}\n />\n <Label className='text-inherit'>{option.label}</Label>\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n {showCalendarButton && (\n <Button\n variant='secondary'\n spacing='compact'\n className='w-full'\n onClick={() => {\n setIsCustomCalendarOpen(true)\n setSelectedValues('custom')\n }}\n >\n {calendarButtonLabel}\n </Button>\n )}\n </div>\n )\n}\n\nexport type DatePresetsProps = {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n options?: {\n value: Date\n label: string\n }[]\n defaultValue?: Date\n allText?: string\n calendarButtonLabel?: string\n date?: Date\n setDate?: SelectSingleEventHandler\n calendarProps?: CalendarProps\n withPresets?: boolean\n}\n\n// 모듈 로드 시점에 한 번 계산하면 탭을 하루 넘게 켜 두었을 때 날짜가 어긋나므로, 렌더할 때 오늘 기준으로 만든다\nfunction createDefaultDateOptions(today: Date) {\n return [\n { value: add(today, { weeks: 1 }), label: '1주일 후' },\n { value: add(today, { weeks: 2 }), label: '2주일 후' },\n { value: add(today, { months: 1 }), label: '1개월 후' },\n { value: add(today, { months: 6 }), label: '6개월 후' },\n { value: add(today, { years: 1 }), label: '1년 후' },\n ]\n}\n\nfunction DatePresets({\n options: optionsProp,\n className,\n defaultValue,\n date,\n setDate,\n allText = '선택 안함',\n calendarButtonLabel = '직접 선택',\n calendarProps,\n withPresets = true,\n}: DatePresetsProps) {\n // 팝오버를 열 때(마운트) 오늘 기준으로 계산\n const options = useMemo(() => optionsProp ?? createDefaultDateOptions(new Date()), [optionsProp])\n const [selectedValues, setSelectedValues] = useState<Date | undefined>(date || defaultValue)\n // 기본 옵션은 열 때마다 시각이 달라지므로 같은 날인지로 선택 여부를 판단한다\n const isSelected = (value: Date) => !!selectedValues && isSameDay(selectedValues, value)\n\n function reset() {\n setSelectedValues(undefined)\n if (setDate) {\n setDate(undefined, new Date(), {}, {} as React.MouseEvent)\n }\n }\n\n const [isCustomCalendarOpen, setIsCustomCalendarOpen] = useState(false)\n\n if (isCustomCalendarOpen || !withPresets) {\n return (\n <Stack direction='column' spacing={8}>\n <Separator />\n <Calendar\n {...calendarProps}\n mode='single'\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n {withPresets && (\n <>\n <Separator />\n <Button\n variant='secondary'\n className='self-start'\n onClick={() => setIsCustomCalendarOpen(false)}\n spacing={'compact'}\n >\n <ChevronLeft />\n 뒤로가기\n </Button>\n </>\n )}\n </Stack>\n )\n }\n\n return (\n <div className={cn('flex flex-col gap-[8px]', className?.Command)}>\n <Command>\n {/* heading 없는 CommandGroup을 걷어내 listbox > option 구조 유지. 레이아웃은 sizer에 건다 */}\n <CommandList\n label='날짜 필터'\n className={cn(\n DATE_PRESETS_LIST_SIZER_CLASS,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n <CommandItem\n key='none'\n onSelect={reset}\n data-state={selectedValues === undefined ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === undefined && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px] ',\n )}\n />\n <Label className='text-inherit'>{allText}</Label>\n </CommandItem>\n {options.map((option) => (\n <CommandItem\n key={option.value.toISOString()}\n value={option.value.toISOString()}\n onSelect={() => {\n setSelectedValues(option.value)\n if (setDate) {\n setDate(option.value, new Date(), {}, {} as React.MouseEvent)\n }\n }}\n data-state={isSelected(option.value) ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n isSelected(option.value) && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px]',\n )}\n />\n <Label className='text-inherit'>{option.label}</Label>\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n <Button\n variant='secondary'\n spacing='compact'\n className='w-full'\n onClick={() => setIsCustomCalendarOpen(true)}\n >\n {calendarButtonLabel}\n </Button>\n </div>\n )\n}\n\nexport { DatePresets, DateRangePresets }\n","'use client'\n\nimport { ReactNode, useCallback, useMemo, useState } from 'react'\nimport { format } from 'date-fns'\nimport { ko } from 'date-fns/locale'\nimport { CheckIcon, ChevronsUpDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Command, CommandEmpty, CommandList } from './command'\nimport {\n DatePresets,\n DatePresetsProps,\n DateRangePresets,\n DateRangePresetsProps,\n} from './datePresets'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport {\n getTableFilterTextSlotClassName,\n handleTableFilterSpaceToggle,\n TableFilterCheckboxCommandItem,\n tableFilterCommandClassName,\n TableFilterCommandItem,\n tableFilterCommandListClassName,\n tableFilterCommandListSizerClassName,\n TableFilterLoadingItem,\n tableFilterPopoverContentClassName,\n TableFilterSearchInput,\n TableFilterTriggerButton,\n} from './tableFilterParts'\n\n/**\n * 필터 타이틀\n */\ninterface FilterTitleType {\n title?: string\n}\n\nfunction FilterTitle({ title = '필터' }: FilterTitleType) {\n return <span className='text-small-bold-h text-sys-text-main px-[4px]'>{title}</span>\n}\n\n/**\n * 날짜 선택 옵션\n */\ntype DateRangeSelectProps = FilterTitleType &\n DateRangePresetsProps & {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n }\n label?: string\n disabled?: boolean\n }\n\nconst dateOptions = [\n { value: '3', label: '최근 3일' },\n { value: '7', label: '최근 7일' },\n { value: '14', label: '최근 14일' },\n { value: '30', label: '최근 30일' },\n { value: '90', label: '최근 90일' },\n]\n\n/**\n * 목록 필터의 기간 선택. 프리셋(오늘·7일·30일 등)을 함께 보여 준다. 폼 입력이면 DatePickerRange 를 쓴다.\n */\nfunction TableFilterDateRangeSelect({\n label = word.common.pickDate,\n className,\n disabled = false,\n ...datePresetsProps\n}: DateRangeSelectProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={Boolean(datePresetsProps?.date?.from || datePresetsProps?.date?.to)}\n isPlaceholder={!datePresetsProps?.date?.from}\n className={className?.button}\n disabled={disabled}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n {datePresetsProps?.date?.from ? (\n datePresetsProps?.date?.to ? (\n <>\n {format(datePresetsProps?.date?.from, 'LLL dd, y', { locale: ko })} -{' '}\n {format(datePresetsProps?.date?.to, 'LLL dd, y', { locale: ko })}\n </>\n ) : (\n format(datePresetsProps?.date?.from, 'LLL dd, y', { locale: ko })\n )\n ) : (\n label\n )}\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label='날짜 필터'\n className={cn('w-[220px] !p-[8px] flex flex-col gap-[8px]', className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={'날짜 필터'} />\n <DateRangePresets options={dateOptions} {...datePresetsProps} />\n </PopoverContent>\n </Popover>\n )\n}\n\n/**\n * 날짜 선택 옵션\n */\ntype DateSelectProps = FilterTitleType &\n DatePresetsProps & {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n }\n label?: string\n disabled?: boolean\n }\n\n/**\n * 목록 필터의 날짜 선택(하루). 기간이면 TableFilterDateRangeSelect, 폼 입력이면 DatePicker 를 쓴다.\n */\nfunction TableFilterDateSelect({\n label = word.common.pickDate,\n className,\n disabled = false,\n ...datePresetsProps\n}: DateSelectProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={Boolean(datePresetsProps?.date)}\n isPlaceholder={!datePresetsProps?.date}\n className={className?.button}\n disabled={disabled}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n {datePresetsProps?.date ? format(datePresetsProps.date, 'PPP', { locale: ko }) : label}\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label='날짜 필터'\n className={cn('w-[220px] !p-[8px] flex flex-col gap-[8px]', className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={'날짜 필터'} />\n <DatePresets {...datePresetsProps} />\n </PopoverContent>\n </Popover>\n )\n}\n\n/**\n * 다중 선택 옵션\n */\nexport type Option = {\n value: string\n label: string\n render?: ReactNode\n}\n\n/**\n * 필터 트리거 문구: title 이 있으면 \"{title} · {값}\" — 무엇을 거르는 필터인지 항상 보인다.\n * placeholder 는 라벨을 대신할 수 없다(값을 고르면 사라지고, 소비 코드가 \"전체\" 만 넣으면 대상이 사라진다 — 2026-10-10 Q1-B 22건).\n */\nfunction TitledValue({ title, children }: { title?: string; children: ReactNode }) {\n if (!title) return <>{children}</>\n return (\n <>\n <span className='font-normal text-sys-text-subtle'>{title}</span>\n <span aria-hidden className='px-[4px] font-normal text-sys-text-subtler'>\n ·\n </span>\n {children}\n </>\n )\n}\n\n/**\n * MultiSelect 컴포넌트의 Props\n */\ninterface MultiSelectProps extends FilterTitleType {\n /** 선택 드롭다운에 표시될 옵션 배열 */\n options: Option[]\n /** 선택이 변경될 때 호출되는 콜백 함수 */\n onChange: (selected: string[]) => void\n /** 초기 선택된 값들 */\n defaultValue?: string[]\n /** 현재 선택된 값들 (제어 컴포넌트로 사용 시) */\n value?: string[]\n /** 아무것도 고르지 않았을 때의 **값** 문구. `title` 이 있으면 트리거는 항상 \"{title} · {값}\"(예: 상태 · 전체)으로 그려지고, 이 값의 기본은 \"전체\". title 이 없으면 기본 \"선택\" */\n placeholder?: string\n /** 사용 가능한 옵션이 없을 때 표시되는 텍스트 */\n emptyText?: string\n /** 목록 안 '전체 선택' 항목의 텍스트. 트리거의 전체 상태 문구는 `placeholder`(기본 \"전체\", title 이 있으면 \"{title} · 전체\") 가 맡는다 */\n allText?: string\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n optionRender?: string\n }\n /** 검색 입력창의 placeholder 텍스트 */\n searchPlaceholder?: string\n /** 검색 입력창 표시 여부 */\n searchable?: boolean\n /** 전체 선택 해제 허용 여부 (기본값: false) */\n allowEmpty?: boolean\n /** 옵션 로딩 상태 */\n loading?: boolean\n /** 로딩 상태에 표시할 텍스트 */\n loadingText?: string\n}\n\n/**\n * 목록 화면 상단의 필터 드롭다운(복수 선택). 표의 결과를 거르는 조건에 쓴다.\n *\n * 언제 쓰나: PageHeader 의 필터 줄에서 상태·유형처럼 값 집합이 정해진 조건. 바뀌면 소비 앱이 1페이지로 되돌린다.\n * 언제 안 쓰나: 폼 입력값(→ Select·MultiSelect), 자유 텍스트 검색·컬럼별 조건(→ ColumnFilter), 날짜 범위(→ TableFilterDateRangeSelect).\n * 대신/함께: 하나만 고르는 조건은 TableFilterSingleSelect. 여러 필터를 한 번에 비우는 \"필터 초기화\" 링크를 같이 둔다.\n */\nfunction MultiSelect({\n title,\n options,\n defaultValue = [],\n value,\n onChange,\n placeholder: placeholderProp,\n emptyText = '조회 가능한 옵션이 없습니다.',\n searchPlaceholder = '검색',\n allText = '전체 선택',\n searchable = true,\n className,\n allowEmpty = false,\n loading = false,\n loadingText = '로드 중',\n}: MultiSelectProps) {\n // 빈 값 문구. title 은 TitledValue 가 항상 앞에 붙인다(\"상태 · 전체\") — 2026-10-09·10 Q1 평가: 라벨 없는 '전체' 반복 지적\n const placeholder = placeholderProp ?? (title ? '전체' : '선택')\n // 전체 선택(또는 아무것도 안 고른) 상태의 트리거 문구. 목록 안 \"전체 선택\" 항목(allText)과는 별개\n const allTriggerLabel = placeholderProp ?? (title ? '전체' : allText)\n const [open, setOpen] = useState(false)\n const [selectedValues, setSelectedValues] = useState<string[]>(value ?? defaultValue)\n\n const [prevValue, setPrevValue] = useState(value)\n\n // 외부 value prop과 내부 상태 동기화 (State From Props Pattern)\n if (value !== undefined && value !== prevValue) {\n setSelectedValues(value || [])\n setPrevValue(value)\n }\n\n const handleSelect = useCallback(\n (value: string) => {\n const updatedSelected = selectedValues.includes(value)\n ? selectedValues.filter((item) => item !== value)\n : [...selectedValues, value]\n\n setSelectedValues(updatedSelected)\n onChange(updatedSelected)\n },\n [selectedValues, onChange],\n )\n\n const selectedLabels = useMemo(\n () =>\n selectedValues\n .map((value) => options.find((option) => option.value === value)?.label)\n .filter(Boolean)\n .join(', '),\n [selectedValues, options],\n )\n\n const allValues = useMemo(() => options.map((option) => option.value), [options])\n const isAllSelected = options.length > 0 && selectedValues.length === options.length\n\n // 전체 토글\n const toggleAll = () => {\n if (isAllSelected) {\n setSelectedValues([])\n onChange([])\n } else {\n setSelectedValues(allValues)\n onChange(allValues)\n }\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={selectedValues.length > 0}\n isPlaceholder={selectedValues.length === 0}\n className={className?.button}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n <TitledValue title={title}>\n {(selectedValues.length === 0 && !allowEmpty) ||\n selectedValues.length === options.length\n ? allTriggerLabel\n : selectedValues.length > 0\n ? selectedLabels\n : placeholder}\n </TitledValue>\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label={title ?? '필터'}\n className={cn(tableFilterPopoverContentClassName, className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={title} />\n\n <Command\n className={cn(tableFilterCommandClassName, className?.Command)}\n onKeyDown={handleTableFilterSpaceToggle}\n >\n {searchable && (\n <TableFilterSearchInput\n placeholder={searchPlaceholder}\n className={className?.CommandInput}\n />\n )}\n <CommandList\n label={title ?? '필터'}\n className={cn(\n tableFilterCommandListClassName,\n tableFilterCommandListSizerClassName,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n <CommandEmpty>{emptyText}</CommandEmpty>\n {loading ? (\n <TableFilterLoadingItem label={loadingText} />\n ) : (\n <>\n <TableFilterCheckboxCommandItem\n key='all'\n onSelect={toggleAll}\n checked={isAllSelected}\n className={className?.CommandItem}\n >\n {allText}\n </TableFilterCheckboxCommandItem>\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n\n return (\n <TableFilterCheckboxCommandItem\n key={option.value}\n value={option.value}\n onSelect={() => handleSelect(option.value)}\n checked={isSelected}\n className={className?.CommandItem}\n contentClassName={cn(\n option.render && 'justify-start',\n className?.optionRender,\n )}\n >\n {option.render || option.label}\n </TableFilterCheckboxCommandItem>\n )\n })}\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n/**\n * 단일 선택 옵션\n */\n\n/**\n * MultiSelect 컴포넌트의 Props\n */\ninterface SingleSelectProps extends FilterTitleType {\n /** 선택 드롭다운에 표시될 옵션 배열 */\n options: Option[]\n /** 선택이 변경될 때 호출되는 콜백 함수 */\n onChange: (selected: Option | null) => void\n /** 초기 선택된 값 */\n value?: string\n /** 아무것도 고르지 않았을 때의 **값** 문구. `title` 이 있으면 트리거는 항상 \"{title} · {값}\"(예: 상태 · 전체)으로 그려지고, 이 값의 기본은 \"전체\". title 이 없으면 기본 \"선택\" */\n placeholder?: string\n /** 사용 가능한 옵션이 없을 때 표시되는 텍스트 */\n emptyText?: string\n /** '선택 안함' 옵션에 표시되는 텍스트 */\n allText?: string\n /** '선택 안함' 옵션 표시 여부 */\n allTextVisible?: boolean\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n /** 검색 입력창의 placeholder 텍스트 */\n searchPlaceholder?: string\n /** 검색 입력창 표시 여부 */\n searchable?: boolean\n /** 선택 시 자동으로 닫힘 여부 */\n closeOnSelect?: boolean\n /** 옵션 로딩 상태 */\n loading?: boolean\n /** 로딩 상태에 표시할 텍스트 */\n loadingText?: string\n}\n\n/**\n * 목록 필터 드롭다운(단일 선택). 언제 쓰나·안 쓰나는 TableFilterMultiSelect 와 같고, 하나만 고르는 조건(상태 등)에 쓴다. 폼 입력이면 Select.\n */\nfunction TableFilterSingleSelect({\n title,\n options,\n value = '',\n onChange,\n placeholder: placeholderProp,\n emptyText = '조회 가능한 옵션이 없습니다.',\n searchPlaceholder = '검색',\n allText = '선택 안함',\n allTextVisible = true,\n searchable = true,\n className,\n closeOnSelect = false,\n loading = false,\n loadingText = '로드 중',\n}: SingleSelectProps) {\n // 빈 값 문구. title 은 TitledValue 가 항상 앞에 붙인다(\"상태 · 전체\") — 2026-10-09·10 Q1 평가: 라벨 없는 '전체' 반복 지적\n const placeholder = placeholderProp ?? (title ? '전체' : '선택')\n const [open, setOpen] = useState(false)\n const [selectedValues, setSelectedValues] = useState<Option | null>(\n () => options.find((option) => option.value === value) ?? null,\n )\n\n const [prevValue, setPrevValue] = useState(value)\n const [prevOptions, setPrevOptions] = useState(options)\n\n if (value !== prevValue || options !== prevOptions) {\n setPrevValue(value)\n setPrevOptions(options)\n const filtered = options.filter((option) => option.value === value)\n\n if (filtered.length === 0) {\n setSelectedValues(null)\n } else {\n setSelectedValues(filtered[0])\n }\n }\n\n const handleSelect = useCallback(\n (value: Option) => {\n setSelectedValues(value)\n onChange(value)\n // Radix UI Popover closing issue fix: Defer closing to next tick\n if (closeOnSelect) setTimeout(() => setOpen(false), 0)\n },\n [onChange, closeOnSelect],\n )\n\n // 전체 토글\n const toggleAll = () => {\n setSelectedValues(null)\n onChange({ label: allText, value: '' })\n if (closeOnSelect) setTimeout(() => setOpen(false), 0)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={Boolean(selectedValues)}\n isPlaceholder={!selectedValues}\n className={className?.button}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n <TitledValue title={title}>{selectedValues?.label || placeholder}</TitledValue>\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label={title ?? '필터'}\n className={cn(tableFilterPopoverContentClassName, className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={title} />\n\n <Command\n className={cn(tableFilterCommandClassName, className?.Command)}\n onKeyDown={handleTableFilterSpaceToggle}\n >\n {searchable && (\n <TableFilterSearchInput\n placeholder={searchPlaceholder}\n className={className?.CommandInput}\n />\n )}\n <CommandList\n label={title ?? '필터'}\n className={cn(\n tableFilterCommandListClassName,\n tableFilterCommandListSizerClassName,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n <CommandEmpty>{emptyText}</CommandEmpty>\n {loading ? (\n <TableFilterLoadingItem label={loadingText} />\n ) : (\n <>\n {allTextVisible && (\n <TableFilterCommandItem\n key='all'\n onSelect={toggleAll}\n isSelected={selectedValues === null}\n className={className?.CommandItem}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === null && 'opacity-100',\n 'shrink-0 !h-[16px] !w-[16px]',\n )}\n />\n <span\n className={getTableFilterTextSlotClassName({\n selected: selectedValues === null,\n })}\n >\n {allText}\n </span>\n </TableFilterCommandItem>\n )}\n {options.map((option) => {\n const isSelected = selectedValues?.value === option.value\n\n return (\n <TableFilterCommandItem\n key={option.value}\n value={option.value}\n onSelect={() => handleSelect(option)}\n isSelected={isSelected}\n className={className?.CommandItem}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n isSelected && 'opacity-100',\n 'shrink-0 !h-[16px] !w-[16px]',\n )}\n />\n <span\n className={getTableFilterTextSlotClassName({\n selected: isSelected,\n })}\n >\n {option.render || option.label}\n </span>\n </TableFilterCommandItem>\n )\n })}\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport {\n MultiSelect as TableFilterMultiSelect,\n TableFilterSingleSelect,\n TableFilterDateSelect,\n TableFilterDateRangeSelect,\n FilterTitle as TableFilterTitle,\n}\n\n// ---------------------------------------------------------------------------\n// Deprecated 별칭 — 같은 컴포넌트가 두 이름으로 노출되면 에이전트와 사람 모두 헷갈리고,\n// `SingleSelect` 는 일반 Select 와 구분되지 않는다. 다음 메이저에서 제거한다.\n// ---------------------------------------------------------------------------\n\n/** @deprecated `TableFilterSingleSelect` 를 사용하세요. 다음 메이저 버전에서 제거됩니다. */\nconst SingleSelect = TableFilterSingleSelect\n/** @deprecated `TableFilterDateSelect` 를 사용하세요. 다음 메이저 버전에서 제거됩니다. */\nconst DateSelect = TableFilterDateSelect\n/** @deprecated `TableFilterDateRangeSelect` 를 사용하세요. 다음 메이저 버전에서 제거됩니다. */\nconst DateRangeSelect = TableFilterDateRangeSelect\n\nexport { SingleSelect, DateSelect, DateRangeSelect }\n","'use client'\n\nimport * as React from 'react'\nimport { DateRange, SelectRangeEventHandler, SelectSingleEventHandler } from 'react-day-picker'\nimport { cva } from 'class-variance-authority'\nimport { format } from 'date-fns'\nimport { Calendar as CalendarIcon } from 'lucide-react'\n\nimport { CancelIcon } from './_internal/cancelIcon'\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Calendar, CalendarProps } from './calendar'\nimport { DatePresets, DatePresetsProps, DateRangePresets } from './datePresets'\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './popover'\nimport { TableFilterTitle } from './tableFilter'\n\n// ============================================================================\n// Trigger CVA (selectTriggerVariants 패턴)\n// ============================================================================\n\n// 래퍼 div 에 적용된다 (트리거 button 과 Clear button 의 공통 부모). 포커스 링은 focus-within, 비활성은 data-disabled.\nconst datePickerTriggerVariants = cva(\n [\n 'flex w-[250px] items-center gap-[2px] bg-transparent whitespace-nowrap outline-none cursor-pointer',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10 data-[disabled]:hover:bg-sys-background',\n 'focus-within:border-[2px] focus-within:border-sys-focus-ring-bold focus-within:py-[2px] focus-within:px-[4px]',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px] focus-within:border-danger30',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\n// ============================================================================\n// DatePickerTrigger (내부 공유 컴포넌트)\n// ============================================================================\n\ninterface DatePickerTriggerProps {\n open: boolean\n hasValue: boolean\n displayText: string\n placeholder: string\n disabled?: boolean\n isInvalid?: boolean\n label?: string\n required?: boolean\n appearance?: 'standard' | 'none'\n onClear?: () => void\n onFocus?: React.FocusEventHandler<HTMLButtonElement>\n onBlur?: React.FocusEventHandler<HTMLButtonElement>\n className?: string\n}\n\nconst DatePickerTrigger = React.forwardRef<HTMLButtonElement, DatePickerTriggerProps>(\n (\n {\n open,\n hasValue,\n displayText,\n placeholder,\n disabled,\n isInvalid,\n label,\n required: requiredProp,\n appearance = 'standard',\n onClear,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n className,\n },\n ref,\n ) => {\n const [isFocused, setIsFocused] = React.useState(false)\n\n // BP-2: open state → useFloatingLabel\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n const handleClearClick = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n onClear?.()\n },\n [onClear],\n )\n\n // 트리거 button 과 Clear button 은 형제다(위젯 중첩 금지, axe nested-interactive).\n // 래퍼 div 가 모양을 담당하고, 래퍼의 빈 영역(아이콘 등)을 눌러도 트리거가 눌리도록 포워딩한다.\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const setRefs = (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLButtonElement | null>).current = node\n }\n // 마우스 편의용: 아이콘 등 래퍼의 빈 영역 클릭을 트리거로 넘긴다. 키보드·보조기기는 트리거 button 을 직접 쓴다\n const handleWrapperClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const t = e.target as HTMLElement\n if (t.closest('[data-slot=datepicker-trigger],[data-slot=datepicker-clear]')) return\n triggerRef.current?.click()\n }\n\n return (\n <PopoverAnchor asChild>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- 포인터 편의 포워딩, 실제 컨트롤은 안쪽 button */}\n <div\n data-slot='datepicker'\n data-state={open ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n className={cn(\n datePickerTriggerVariants({ appearance, isInvalid }),\n '[&_[data-placeholder]]:text-sys-text-subtler',\n (showNotchedOutline || showNoneLabel) && 'relative',\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n className,\n )}\n onClick={handleWrapperClick}\n >\n {/* FloatingLabelOutline (조건부) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n <PopoverTrigger asChild>\n <button\n ref={setRefs}\n type='button'\n data-slot='datepicker-trigger'\n data-state={open ? 'open' : 'closed'}\n aria-labelledby={hasLabel ? labelId : undefined}\n disabled={disabled}\n className={cn(\n 'flex flex-1 items-center min-h-[28px] min-w-0 px-[4px] py-[2px] text-left bg-transparent outline-none cursor-pointer',\n 'disabled:cursor-not-allowed',\n hasLabel && !hasValue && 'invisible',\n )}\n onFocus={hasLabel ? handleFocus : onFocusProp}\n onBlur={hasLabel ? handleBlur : onBlurProp}\n >\n {hasValue ? (\n <span className='truncate'>{displayText}</span>\n ) : (\n <span data-placeholder className='truncate'>\n {placeholder}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n {/* Clear 버튼 — 형제 button. 값이 없거나 비활성이면 invisible(폭 유지, 포커스 불가) */}\n {onClear && (\n <button\n type='button'\n data-slot='datepicker-clear'\n onClick={handleClearClick}\n disabled={disabled}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler cursor-pointer outline-none',\n 'focus-visible:ring-[2px] focus-visible:ring-sys-focus-ring-main',\n (!hasValue || disabled) && 'invisible',\n )}\n aria-label='날짜 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* Calendar 아이콘 (장식, 클릭은 래퍼가 트리거로 포워딩) */}\n <CalendarIcon aria-hidden className='size-[24px] shrink-0 text-sys-text-main' />\n </div>\n </PopoverAnchor>\n )\n },\n)\nDatePickerTrigger.displayName = 'DatePickerTrigger'\n\n// ============================================================================\n// DatePicker (Single)\n// ============================================================================\n\nexport type DatePickerProps = {\n date?: Date\n setDate?: SelectSingleEventHandler\n /** 클래스 오버라이드. `button` = 트리거 틀(기본 폭 250px — 폼 칸을 채우려면 `'w-full'`), `PopoverContent` = 달력 팝오버 */\n classNames?: {\n button?: string\n PopoverContent?: string\n }\n disabled?: boolean\n placeholder?: string\n withPresets?: boolean\n datePresetsProps?: Omit<DatePresetsProps, 'date' | 'setDate'>\n calendarProps?: CalendarProps\n isInvalid?: boolean\n /** Floating label 텍스트 */\n label?: string\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** 라벨 필수 표시 (*) */\n required?: boolean\n}\n\n/**\n * 날짜 하나를 고르는 입력. 트리거를 누르면 달력 팝오버가 열린다.\n *\n * 언제 쓰나: 폼의 날짜 필드(시작일·만료일·예약일). `FormField` 안에서 `FormControl` 로 감싸 오류 상태(`isInvalid`)를 받는다. 시각까지 필요하면 옆에 `TimePicker` 를 둔다.\n * 언제 안 쓰나: 기간(→ DatePickerRange), 시각만(→ TimePicker).\n * 대신/함께: 기본 폭은 250px 이다. 폼 칸을 채우려면 `classNames={{ button: 'w-full' }}`(TimePicker 는 `classNames={{ trigger: 'w-full' }}`) — 좁은 고정 폭이 두 칸 줄의 절반을 비워 감점됐다(2026-10-28 홀드아웃 14).\n */\nexport function DatePicker({\n date,\n setDate,\n classNames,\n disabled,\n placeholder = word.common.startDate,\n withPresets = false,\n datePresetsProps,\n calendarProps,\n isInvalid = false,\n label,\n appearance = 'standard',\n required,\n}: DatePickerProps) {\n // BP-2: controlled Popover\n const [open, setOpen] = React.useState(false)\n\n const handleClear = React.useCallback(() => {\n setDate?.(undefined, new Date(), {}, {} as React.MouseEvent)\n }, [setDate])\n\n const displayText = date ? format(date, 'yyyy-MM-dd') : ''\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <DatePickerTrigger\n open={open}\n hasValue={!!date}\n displayText={displayText}\n placeholder={placeholder}\n disabled={disabled}\n isInvalid={isInvalid}\n label={label}\n required={required}\n appearance={appearance}\n onClear={setDate ? handleClear : undefined}\n className={classNames?.button}\n />\n {withPresets ? (\n <PopoverContent\n aria-label='날짜 선택'\n className={cn('w-[220px] !p-[8px] flex flex-col gap-[8px]', classNames?.PopoverContent)}\n align='start'\n >\n <TableFilterTitle title={word.common.pickDate} />\n <DatePresets\n {...datePresetsProps}\n calendarProps={calendarProps}\n date={date}\n setDate={setDate}\n />\n </PopoverContent>\n ) : (\n <PopoverContent\n aria-label='날짜 선택'\n className={cn('p-0', classNames?.PopoverContent)}\n align='start'\n >\n <Calendar\n {...calendarProps}\n mode='single'\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n </PopoverContent>\n )}\n </Popover>\n )\n}\n\n// ============================================================================\n// DatePickerRange\n// ============================================================================\n\nexport type DatePickerRangeProps = {\n date: DateRange\n setDate?: SelectRangeEventHandler\n placeholder?: string\n withPresets?: boolean\n classNames?: {\n button?: string\n }\n disabled?: boolean\n isInvalid?: boolean\n /** Floating label 텍스트 */\n label?: string\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /**\n * Calendar 에 전달할 추가 props (예: `defaultMonth`, `disabled` 날짜).\n * `mode`·`selected`·`onSelect`·`numberOfMonths` 는 DatePickerRange 가 관리한다.\n * `defaultMonth` 는 선택된 시작일(`date.from`)이 없을 때만 적용된다.\n */\n calendarProps?: Omit<CalendarProps, 'mode' | 'selected' | 'onSelect' | 'numberOfMonths'>\n}\n\nexport function DatePickerRange({\n date,\n setDate,\n withPresets = false,\n placeholder = word.common.startDate,\n classNames,\n disabled,\n isInvalid = false,\n label,\n appearance = 'standard',\n required,\n calendarProps,\n}: DatePickerRangeProps) {\n // BP-2: controlled Popover\n const [open, setOpen] = React.useState(false)\n\n const handleClear = React.useCallback(() => {\n setDate?.({ from: undefined, to: undefined }, new Date(), {}, {} as React.MouseEvent)\n }, [setDate])\n\n const hasValue = !!date.from\n const displayText = date.from\n ? date.to\n ? `${format(date.from, 'yyyy-MM-dd')} ~ ${format(date.to, 'yyyy-MM-dd')}`\n : format(date.from, 'yyyy-MM-dd')\n : ''\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <DatePickerTrigger\n open={open}\n hasValue={hasValue}\n displayText={displayText}\n placeholder={placeholder}\n disabled={disabled}\n isInvalid={isInvalid}\n label={label}\n required={required}\n appearance={appearance}\n onClear={setDate ? handleClear : undefined}\n className={classNames?.button}\n />\n <PopoverContent aria-label='기간 선택' className='w-auto p-0' align='start'>\n <div className='flex'>\n {withPresets && (\n <DateRangePresets\n className={{ Command: 'w-[220px] border-r border-sys-divider-subtler p-[8px]' }}\n date={date}\n setDate={setDate}\n showAllOption={false}\n showCalendarButton={false}\n />\n )}\n <Calendar\n {...calendarProps}\n initialFocus\n mode='range'\n defaultMonth={date?.from ?? calendarProps?.defaultMonth}\n selected={date}\n onSelect={setDate}\n numberOfMonths={2}\n />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\n\nimport { CancelIcon } from './_internal/cancelIcon'\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport { useFormControlContext } from './form'\n\nconst textFieldContainerVariants = cva(\n [\n 'flex w-full items-center gap-[2px] bg-transparent',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'transition-colors',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px]',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\nexport type TextFieldProps = Omit<React.ComponentProps<'input'>, 'children'> & {\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** Floating label 텍스트 */\n label?: string\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /** Clear 버튼 표시 여부 */\n hasClearButton?: boolean\n /** 입력 필드 왼쪽 아이콘/요소 슬롯 */\n elemBeforeInput?: React.ReactNode\n /** 입력 필드 오른쪽 아이콘/요소 슬롯 */\n elemAfterInput?: React.ReactNode\n /** 에러 상태 */\n isInvalid?: boolean\n /** 컨테이너 div에 적용할 추가 className */\n containerClassName?: string\n}\n\n/**\n * 한 줄 텍스트 입력. 폼의 이름·코드·URL·숫자 같은 짧은 값에 쓴다.\n *\n * 언제 쓰나: `FormField` 안에서 `FormControl` 로 감싸 오류 상태를 받는다. 라벨은 `FormLabel` 로 두고, 독립 사용 시에만 `label`(floating) 을 쓴다.\n * 언제 안 쓰나: 여러 줄 입력(→ Textarea), 정해진 선택지(→ Select·RadioGroup), 목록 검색·필터(→ ColumnFilter·TableFilter*).\n * 대신/함께: 지우기 버튼은 `hasClearButton`, 단위·아이콘은 `elemBeforeInput`/`elemAfterInput`.\n */\nconst TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n appearance = 'standard',\n label,\n required: requiredProp,\n hasClearButton,\n elemBeforeInput,\n elemAfterInput,\n isInvalid: isInvalidProp,\n containerClassName,\n className,\n disabled,\n readOnly,\n value: valueProp,\n defaultValue,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n ...inputProps\n },\n forwardedRef,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isFocused, setIsFocused] = React.useState(false)\n\n // Controlled vs Uncontrolled hasValue tracking\n const isControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState(\n defaultValue !== undefined ? String(defaultValue) : '',\n )\n const hasValue = isControlled ? String(valueProp) !== '' : internalValue !== ''\n\n // Compose refs (forwarded ref + internal ref)\n const composedRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n ;(inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n },\n [forwardedRef],\n )\n\n // Floating label\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n // --- Handlers ---\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value)\n onChangeProp?.(e)\n },\n [isControlled, onChangeProp],\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n const handleClear = React.useCallback(() => {\n const input = inputRef.current\n if (!input) return\n\n if (!isControlled) setInternalValue('')\n\n // Set value via native setter to trigger React's onChange\n const nativeSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n if (nativeSetter) {\n nativeSetter.call(input, '')\n input.dispatchEvent(new Event('input', { bubbles: true }))\n }\n\n input.focus()\n }, [isControlled])\n\n return (\n <div\n data-slot='text-field'\n aria-disabled={disabled || undefined}\n className={cn(\n textFieldContainerVariants({ appearance, isInvalid }),\n // Focus styling (state-managed, standard appearance without notched outline only)\n isFocused &&\n !isInvalid &&\n appearance === 'standard' &&\n !showNotchedOutline &&\n 'border-[2px] border-sys-focus-ring-bold py-[2px] px-[4px]',\n // Floating label positioning\n (showNotchedOutline || showNoneLabel) && 'relative',\n // Notched outline draws border — remove container's own border\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n // Disabled / cursor\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-text',\n // disabled 시 hover 배경 무력화 (div container라 :disabled 불가 → JS 조건부; none은 원래 hover bg 없음)\n disabled && appearance !== 'none' && 'hover:bg-sys-background',\n containerClassName,\n // 외부 className 은 root container 에 적용 — FormControl 의 maxWidth 가\n // 자식 className 에 inject 되는데, wrapper div 의 폭 제어가 의도이므로\n // inner input 이 아닌 여기에 머지한다.\n className,\n )}\n >\n {/* Floating label (standard: notched outline, none: inline label) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* Left icon slot — label이 down 상태(placeholder 역할)일 때 숨김 */}\n {elemBeforeInput && (\n <span\n className={cn(\n // 아이콘은 24×24, 글자(\"개\"·\"코어\")는 줄바꿈 없이 폭이 늘어난다 — 고정 size-[24px] 는 두 글자가 두 줄로 깨졌다 (2026-10-12)\n 'shrink-0 flex items-center justify-center h-[24px] min-w-[24px] whitespace-nowrap',\n typeof elemBeforeInput === 'string' && 'px-[2px] text-sys-text-subtle',\n hasLabel && !isFloating && 'invisible',\n )}\n >\n {elemBeforeInput}\n </span>\n )}\n\n {/* Input */}\n <input\n ref={composedRef}\n disabled={disabled}\n readOnly={readOnly}\n value={isControlled ? valueProp : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-required={hasLabel && requiredProp ? true : undefined}\n className={cn(\n 'flex-1 min-w-0 bg-transparent border-none outline-none',\n 'text-base-medium text-sys-text-main',\n 'placeholder:text-sys-text-placeholder',\n 'disabled:cursor-not-allowed',\n 'px-[4px] py-[2px]',\n // When label is down (acting as placeholder), hide input's placeholder\n hasLabel && !hasValue && !isFocused && 'placeholder:text-transparent',\n )}\n {...inputProps}\n />\n\n {/* Clear button — 항상 공간 확보, 값 없으면 invisible (너비 점프 방지) */}\n {hasClearButton && (\n <button\n type='button'\n onClick={handleClear}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler',\n (!hasValue || disabled || readOnly) && 'invisible',\n )}\n aria-label='입력 지우기'\n tabIndex={-1}\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* Right icon slot */}\n {elemAfterInput && (\n <span\n className={cn(\n 'shrink-0 flex items-center justify-center h-[24px] min-w-[24px] whitespace-nowrap',\n typeof elemAfterInput === 'string' && 'px-[2px] text-sys-text-subtle',\n )}\n >\n {elemAfterInput}\n </span>\n )}\n </div>\n )\n },\n)\nTextField.displayName = 'TextField'\n\nexport { TextField }\n","{\n \"categories\": [\n \"전체\",\n \"코딩 및 개발\",\n \"디바이스\",\n \"파일 아이콘\",\n \"과학\",\n \"보안\",\n \"접근성\",\n \"계정 및 액세스\",\n \"차트\",\n \"텍스트\",\n \"디자인\"\n ],\n \"icons\": [\n { \"name\": \"ampersand\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"ampersands\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"app-window\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"app-window-mac\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-big-up\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-big-up-dash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-down-to-line\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-right-to-line\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-up-from-line\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"asterisk\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"binary\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"binoculars\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bitcoin\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"blend\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"blocks\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-check\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-copy\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-dashed\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-down\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-key\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-lock\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-marked\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-minus\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-open\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-open-check\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-open-text\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-plus\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-up\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-up2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bot\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bot-message-square\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bot-off\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"box\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"boxes\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"braces\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"brackets\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"brain-circuit\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"brain-cog\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bug\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bug-off\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bug-play\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"chevron-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-dashed\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-dot\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-dot-dashed\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-ellipsis\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-plus\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-slash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-slash2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-x\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circuit-board\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"cloud-alert\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"cloud-cog\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"code\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"code-xml\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"codepen\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"codesandbox\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"combine\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"command\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"component\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"computer\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"construction\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"container\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"copy-slash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"corner-down-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"database\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"database-backup\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"database-zap\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"diff\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"divide\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"dock\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"earth-lock\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"eclipse\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"ellipsis\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"equal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"equal-not\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-code\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-code2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-diff\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-digit\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-json\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-json2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-sliders\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-stack\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-terminal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"flag-triangle-left\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"flag-triangle-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"folder-code\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"folder-dot\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"folder-kanban\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"square-slash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"square-stack\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"square-terminal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"table-properties\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"tablet-smartphone\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"telescope\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"terminal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"toggle-left\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"toggle-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"toy-brick\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"trello\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"triangle-alert\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"unplug\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"variable\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"waypoints\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"webhook\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"webhook-off\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"workflow\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"wrench\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"camera-off\", \"category\": \"디바이스\" },\n { \"name\": \"cassette-tape\", \"category\": \"디바이스\" },\n { \"name\": \"cast\", \"category\": \"디바이스\" },\n { \"name\": \"cctv\", \"category\": \"디바이스\" },\n { \"name\": \"computer\", \"category\": \"디바이스\" },\n { \"name\": \"cpu\", \"category\": \"디바이스\" },\n { \"name\": \"database\", \"category\": \"디바이스\" },\n { \"name\": \"database-backup\", \"category\": \"디바이스\" },\n { \"name\": \"database-zap\", \"category\": \"디바이스\" },\n { \"name\": \"diamond-minus\", \"category\": \"디바이스\" },\n { \"name\": \"diamond-plus\", \"category\": \"디바이스\" },\n { \"name\": \"disc\", \"category\": \"디바이스\" },\n { \"name\": \"disc2\", \"category\": \"디바이스\" },\n { \"name\": \"disc3\", \"category\": \"디바이스\" },\n { \"name\": \"disc-album\", \"category\": \"디바이스\" },\n { \"name\": \"drill\", \"category\": \"디바이스\" },\n { \"name\": \"drum\", \"category\": \"디바이스\" },\n { \"name\": \"earth-lock\", \"category\": \"디바이스\" },\n { \"name\": \"ethernet-port\", \"category\": \"디바이스\" },\n { \"name\": \"fingerprint\", \"category\": \"디바이스\" },\n { \"name\": \"flashlight\", \"category\": \"디바이스\" },\n { \"name\": \"flashlight-off\", \"category\": \"디바이스\" },\n { \"name\": \"gamepad\", \"category\": \"디바이스\" },\n { \"name\": \"gamepad2\", \"category\": \"디바이스\" },\n { \"name\": \"globe-lock\", \"category\": \"디바이스\" },\n { \"name\": \"hard-drive\", \"category\": \"디바이스\" },\n { \"name\": \"hard-drive-download\", \"category\": \"디바이스\" },\n { \"name\": \"hard-drive-upload\", \"category\": \"디바이스\" },\n { \"name\": \"hdmi-port\", \"category\": \"디바이스\" },\n { \"name\": \"headphone-off\", \"category\": \"디바이스\" },\n { \"name\": \"headphones\", \"category\": \"디바이스\" },\n { \"name\": \"headset\", \"category\": \"디바이스\" },\n { \"name\": \"heater\", \"category\": \"디바이스\" },\n { \"name\": \"joystick\", \"category\": \"디바이스\" },\n { \"name\": \"keyboard\", \"category\": \"디바이스\" },\n { \"name\": \"keyboard-music\", \"category\": \"디바이스\" },\n { \"name\": \"keyboard-off\", \"category\": \"디바이스\" },\n { \"name\": \"laptop\", \"category\": \"디바이스\" },\n { \"name\": \"laptop-minimal\", \"category\": \"디바이스\" },\n { \"name\": \"laptop-minimal-check\", \"category\": \"디바이스\" },\n { \"name\": \"memory-stick\", \"category\": \"디바이스\" },\n { \"name\": \"mic\", \"category\": \"디바이스\" },\n { \"name\": \"mic-off\", \"category\": \"디바이스\" },\n { \"name\": \"mic-vocal\", \"category\": \"디바이스\" },\n { \"name\": \"microchip\", \"category\": \"디바이스\" },\n { \"name\": \"monitor\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-check\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-cog\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-dot\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-down\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-off\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-pause\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-play\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-smartphone\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-speaker\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-stop\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-up\", \"category\": \"디바이스\" },\n { \"name\": \"server\", \"category\": \"디바이스\" },\n { \"name\": \"server-cog\", \"category\": \"디바이스\" },\n { \"name\": \"server-crash\", \"category\": \"디바이스\" },\n { \"name\": \"server-off\", \"category\": \"디바이스\" },\n { \"name\": \"smartphone\", \"category\": \"디바이스\" },\n { \"name\": \"smartphone-charging\", \"category\": \"디바이스\" },\n { \"name\": \"smartphone-nfc\", \"category\": \"디바이스\" },\n { \"name\": \"speaker\", \"category\": \"디바이스\" },\n { \"name\": \"square-minus\", \"category\": \"디바이스\" },\n { \"name\": \"switch-camera\", \"category\": \"디바이스\" },\n { \"name\": \"tablet\", \"category\": \"디바이스\" },\n { \"name\": \"tablet-smartphone\", \"category\": \"디바이스\" },\n { \"name\": \"app-window\", \"category\": \"파일 아이콘\" },\n { \"name\": \"app-window-mac\", \"category\": \"파일 아이콘\" },\n { \"name\": \"archive\", \"category\": \"파일 아이콘\" },\n { \"name\": \"archive-restore\", \"category\": \"파일 아이콘\" },\n { \"name\": \"archive-x\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-big-down-dash\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-down-from-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-down-to-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-up-from-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-up-to-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"book-image\", \"category\": \"파일 아이콘\" },\n { \"name\": \"braces\", \"category\": \"파일 아이콘\" },\n { \"name\": \"brackets\", \"category\": \"파일 아이콘\" },\n { \"name\": \"calendar-fold\", \"category\": \"파일 아이콘\" },\n { \"name\": \"cassette-tape\", \"category\": \"파일 아이콘\" },\n { \"name\": \"chart-pie\", \"category\": \"파일 아이콘\" },\n { \"name\": \"cloud-download\", \"category\": \"파일 아이콘\" },\n { \"name\": \"cloud-upload\", \"category\": \"파일 아이콘\" },\n { \"name\": \"combine\", \"category\": \"파일 아이콘\" },\n { \"name\": \"diff\", \"category\": \"파일 아이콘\" },\n { \"name\": \"dock\", \"category\": \"파일 아이콘\" },\n { \"name\": \"download\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-archive\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-up\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-user\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-video\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-video2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-volume\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-volume2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-warning\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-x\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-x2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"files\", \"category\": \"파일 아이콘\" },\n { \"name\": \"folder\", \"category\": \"파일 아이콘\" },\n { \"name\": \"folder-archive\", \"category\": \"파일 아이콘\" },\n { \"name\": \"package\", \"category\": \"파일 아이콘\" },\n { \"name\": \"package-search\", \"category\": \"파일 아이콘\" },\n { \"name\": \"paperclip\", \"category\": \"파일 아이콘\" },\n { \"name\": \"save\", \"category\": \"파일 아이콘\" },\n { \"name\": \"trash-2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"activity\", \"category\": \"과학\" },\n { \"name\": \"atom\", \"category\": \"과학\" },\n { \"name\": \"beaker\", \"category\": \"과학\" },\n { \"name\": \"binoculars\", \"category\": \"과학\" },\n { \"name\": \"biohazard\", \"category\": \"과학\" },\n { \"name\": \"brain\", \"category\": \"과학\" },\n { \"name\": \"brain-circuit\", \"category\": \"과학\" },\n { \"name\": \"brain-cog\", \"category\": \"과학\" },\n { \"name\": \"circle-gauge\", \"category\": \"과학\" },\n { \"name\": \"circuit-board\", \"category\": \"과학\" },\n { \"name\": \"eclipse\", \"category\": \"과학\" },\n { \"name\": \"flask-conical\", \"category\": \"과학\" },\n { \"name\": \"flask-conical-off\", \"category\": \"과학\" },\n { \"name\": \"flask-round\", \"category\": \"과학\" },\n { \"name\": \"gauge\", \"category\": \"과학\" },\n { \"name\": \"microscope\", \"category\": \"과학\" },\n { \"name\": \"omega\", \"category\": \"과학\" },\n { \"name\": \"orbit\", \"category\": \"과학\" },\n { \"name\": \"pipette\", \"category\": \"과학\" },\n { \"name\": \"radiation\", \"category\": \"과학\" },\n { \"name\": \"satellite\", \"category\": \"과학\" },\n { \"name\": \"shell\", \"category\": \"과학\" },\n { \"name\": \"sigma\", \"category\": \"과학\" },\n { \"name\": \"square-activity\", \"category\": \"과학\" },\n { \"name\": \"stethoscope\", \"category\": \"과학\" },\n { \"name\": \"syringe\", \"category\": \"과학\" },\n { \"name\": \"telescope\", \"category\": \"과학\" },\n { \"name\": \"test-tube\", \"category\": \"과학\" },\n { \"name\": \"test-tube-diagonal\", \"category\": \"과학\" },\n { \"name\": \"test-tubes\", \"category\": \"과학\" },\n { \"name\": \"key\", \"category\": \"보안\" },\n { \"name\": \"key-round\", \"category\": \"보안\" },\n { \"name\": \"key-square\", \"category\": \"보안\" },\n { \"name\": \"lock\", \"category\": \"보안\" },\n { \"name\": \"lock-keyhole\", \"category\": \"보안\" },\n { \"name\": \"lock-keyhole-open\", \"category\": \"보안\" },\n { \"name\": \"lock-open\", \"category\": \"보안\" },\n { \"name\": \"radar\", \"category\": \"보안\" },\n { \"name\": \"scan\", \"category\": \"보안\" },\n { \"name\": \"scan-face\", \"category\": \"보안\" },\n { \"name\": \"scan-qr-code\", \"category\": \"보안\" },\n { \"name\": \"shield\", \"category\": \"보안\" },\n { \"name\": \"shield-alert\", \"category\": \"보안\" },\n { \"name\": \"shield-ban\", \"category\": \"보안\" },\n { \"name\": \"shield-check\", \"category\": \"보안\" },\n { \"name\": \"shield-ellipsis\", \"category\": \"보안\" },\n { \"name\": \"shield-half\", \"category\": \"보안\" },\n { \"name\": \"shield-minus\", \"category\": \"보안\" },\n { \"name\": \"shield-off\", \"category\": \"보안\" },\n { \"name\": \"shield-plus\", \"category\": \"보안\" },\n { \"name\": \"shield-question\", \"category\": \"보안\" },\n\n { \"name\": \"university\", \"category\": \"건설\" },\n { \"name\": \"building-2\", \"category\": \"건설\" },\n { \"name\": \"factory\", \"category\": \"건설\" },\n { \"name\": \"fence\", \"category\": \"건설\" },\n { \"name\": \"graduation-cap\", \"category\": \"건설\" },\n { \"name\": \"house\", \"category\": \"건설\" },\n { \"name\": \"school\", \"category\": \"건설\" },\n { \"name\": \"university\", \"category\": \"건설\" },\n\n { \"name\": \"accessibility\", \"category\": \"접근성\" },\n { \"name\": \"baby\", \"category\": \"접근성\" },\n { \"name\": \"badge-help\", \"category\": \"접근성\" },\n { \"name\": \"badge-info\", \"category\": \"접근성\" },\n { \"name\": \"circle-help\", \"category\": \"접근성\" },\n { \"name\": \"contrast\", \"category\": \"접근성\" },\n { \"name\": \"ear\", \"category\": \"접근성\" },\n { \"name\": \"ear-off\", \"category\": \"접근성\" },\n { \"name\": \"eclipse\", \"category\": \"접근성\" },\n { \"name\": \"eye\", \"category\": \"접근성\" },\n { \"name\": \"eye-closed\", \"category\": \"접근성\" },\n { \"name\": \"eye-off\", \"category\": \"접근성\" },\n { \"name\": \"glasses\", \"category\": \"접근성\" },\n { \"name\": \"hand\", \"category\": \"접근성\" },\n { \"name\": \"info\", \"category\": \"접근성\" },\n { \"name\": \"life-buoy\", \"category\": \"접근성\" },\n { \"name\": \"moon\", \"category\": \"접근성\" },\n { \"name\": \"moon-star\", \"category\": \"접근성\" },\n { \"name\": \"person-standing\", \"category\": \"접근성\" },\n { \"name\": \"scan-search\", \"category\": \"접근성\" },\n { \"name\": \"speech\", \"category\": \"접근성\" },\n { \"name\": \"sun\", \"category\": \"접근성\" },\n { \"name\": \"zoom-in\", \"category\": \"접근성\" },\n { \"name\": \"zoom-out\", \"category\": \"접근성\" },\n { \"name\": \"activity\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"at-sign\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"award\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"badge\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"badge-alert\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"ban\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bell\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bell-dot\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"book-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"building\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"building2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"cake\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"circle-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"circle-user-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"cog\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"contact\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"contact-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"cookie\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"id-card\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"inbox\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"key\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"key-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"key-square\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"link\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"link2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"log-in\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"log-out\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"mail\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-check-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-house\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-minus-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-plus-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-x-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pinned\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"menu\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"message-circle-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"notebook-tabs\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"pin\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"scan-eye\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"scan-face\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"scan-qr-code\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"settings\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"settings2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"share\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"share2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-alert\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-ban\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-ellipsis\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-half\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-off\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-question\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"slack\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"sliders-horizontal\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"sliders-vertical\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"smile\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"square-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"square-user-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"star\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"tag\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"tags\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"thumbs-down\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"thumbs-up\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"ticket\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"tickets\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"toggle-left\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"toggle-right\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"trello\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-cog\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-pen\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-cog\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-pen\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-search\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-search\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"users\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"users-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"venetian-mask\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"vibrate\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"vibrate-off\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallet\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallet-cards\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallet-minimal\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallpaper\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"waypoints\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"webhook\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"webhook-off\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wrench\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"chart-area\", \"category\": \"차트\" },\n { \"name\": \"chart-bar\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-big\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-decreasing\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-increasing\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-stacked\", \"category\": \"차트\" },\n { \"name\": \"chart-candlestick\", \"category\": \"차트\" },\n { \"name\": \"chart-column\", \"category\": \"차트\" },\n { \"name\": \"chart-column-big\", \"category\": \"차트\" },\n { \"name\": \"chart-column-stacked\", \"category\": \"차트\" },\n { \"name\": \"chart-gantt\", \"category\": \"차트\" },\n { \"name\": \"chart-line\", \"category\": \"차트\" },\n { \"name\": \"chart-network\", \"category\": \"차트\" },\n { \"name\": \"chart-no-axes-column\", \"category\": \"차트\" },\n { \"name\": \"chart-no-axes-gantt\", \"category\": \"차트\" },\n { \"name\": \"chart-pie\", \"category\": \"차트\" },\n { \"name\": \"chart-scatter\", \"category\": \"차트\" },\n { \"name\": \"chart-spline\", \"category\": \"차트\" },\n { \"name\": \"folder-kanban\", \"category\": \"차트\" },\n { \"name\": \"kanban\", \"category\": \"차트\" },\n { \"name\": \"square-chart-gantt\", \"category\": \"차트\" },\n { \"name\": \"square-dashed-kanban\", \"category\": \"차트\" },\n { \"name\": \"square-kanban\", \"category\": \"차트\" },\n { \"name\": \"trending-down\", \"category\": \"차트\" },\n { \"name\": \"trending-up\", \"category\": \"차트\" },\n { \"name\": \"trending-up-down\", \"category\": \"차트\" },\n { \"name\": \"book-plus\", \"category\": \"텍스트\" },\n { \"name\": \"book-text\", \"category\": \"텍스트\" },\n { \"name\": \"book-type\", \"category\": \"텍스트\" },\n { \"name\": \"book-x\", \"category\": \"텍스트\" },\n { \"name\": \"brush\", \"category\": \"텍스트\" },\n { \"name\": \"case-lower\", \"category\": \"텍스트\" },\n { \"name\": \"case-sensitive\", \"category\": \"텍스트\" },\n { \"name\": \"case-upper\", \"category\": \"텍스트\" },\n { \"name\": \"circle-question-mark\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-check\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-clock\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-copy\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-list\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-minus\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-paste\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-pen\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-pen-line\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-plus\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-type\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-x\", \"category\": \"텍스트\" },\n { \"name\": \"code\", \"category\": \"텍스트\" },\n { \"name\": \"code-xml\", \"category\": \"텍스트\" },\n { \"name\": \"columns-2\", \"category\": \"텍스트\" },\n { \"name\": \"columns-3\", \"category\": \"텍스트\" },\n { \"name\": \"columns-4\", \"category\": \"텍스트\" },\n { \"name\": \"list-start\", \"category\": \"텍스트\" },\n { \"name\": \"list-todo\", \"category\": \"텍스트\" },\n { \"name\": \"list-tree\", \"category\": \"텍스트\" },\n { \"name\": \"list-x\", \"category\": \"텍스트\" },\n { \"name\": \"logs\", \"category\": \"텍스트\" },\n { \"name\": \"mail\", \"category\": \"텍스트\" },\n { \"name\": \"map\", \"category\": \"텍스트\" },\n { \"name\": \"message-square-quote\", \"category\": \"텍스트\" },\n { \"name\": \"minus\", \"category\": \"텍스트\" },\n { \"name\": \"notebook\", \"category\": \"텍스트\" },\n { \"name\": \"notebook-pen\", \"category\": \"텍스트\" },\n { \"name\": \"notebook-text\", \"category\": \"텍스트\" },\n { \"name\": \"notepad-text\", \"category\": \"텍스트\" },\n { \"name\": \"a-arrow-down\", \"category\": \"디자인\" },\n { \"name\": \"a-arrow-up\", \"category\": \"디자인\" },\n { \"name\": \"a-large-small\", \"category\": \"디자인\" },\n { \"name\": \"app-window\", \"category\": \"디자인\" },\n { \"name\": \"app-window-mac\", \"category\": \"디자인\" },\n { \"name\": \"axis-3d\", \"category\": \"디자인\" },\n { \"name\": \"between-vertical-end\", \"category\": \"디자인\" },\n { \"name\": \"blend\", \"category\": \"디자인\" },\n { \"name\": \"book-type\", \"category\": \"디자인\" },\n { \"name\": \"bring-to-front\", \"category\": \"디자인\" },\n { \"name\": \"brush\", \"category\": \"디자인\" },\n { \"name\": \"chart-no-axes-gantt\", \"category\": \"디자인\" },\n { \"name\": \"columns-2\", \"category\": \"디자인\" },\n { \"name\": \"columns-3\", \"category\": \"디자인\" },\n { \"name\": \"columns-4\", \"category\": \"디자인\" },\n { \"name\": \"component\", \"category\": \"디자인\" },\n { \"name\": \"contrast\", \"category\": \"디자인\" },\n { \"name\": \"crop\", \"category\": \"디자인\" },\n { \"name\": \"cylinder\", \"category\": \"디자인\" },\n { \"name\": \"database-backup\", \"category\": \"디자인\" },\n { \"name\": \"diameter\", \"category\": \"디자인\" },\n { \"name\": \"dock\", \"category\": \"디자인\" },\n { \"name\": \"drafting-compass\", \"category\": \"디자인\" },\n { \"name\": \"dribbble\", \"category\": \"디자인\" },\n { \"name\": \"eclipse\", \"category\": \"디자인\" },\n { \"name\": \"eye\", \"category\": \"디자인\" },\n { \"name\": \"eye-closed\", \"category\": \"디자인\" },\n { \"name\": \"eye-off\", \"category\": \"디자인\" },\n { \"name\": \"figma\", \"category\": \"디자인\" },\n { \"name\": \"file-axis-3d\", \"category\": \"디자인\" },\n { \"name\": \"flip-horizontal\", \"category\": \"디자인\" },\n { \"name\": \"flip-horizontal-2\", \"category\": \"디자인\" },\n { \"name\": \"flip-vertical\", \"category\": \"디자인\" },\n { \"name\": \"flip-vertical-2\", \"category\": \"디자인\" },\n { \"name\": \"folder-kanban\", \"category\": \"디자인\" },\n { \"name\": \"frame\", \"category\": \"디자인\" },\n { \"name\": \"framer\", \"category\": \"디자인\" },\n { \"name\": \"fullscreen\", \"category\": \"디자인\" },\n { \"name\": \"gallery-horizontal\", \"category\": \"디자인\" },\n { \"name\": \"gallery-thumbnails\", \"category\": \"디자인\" },\n { \"name\": \"gallery-vertical\", \"category\": \"디자인\" },\n { \"name\": \"gallery-vertical-end\", \"category\": \"디자인\" },\n { \"name\": \"grab\", \"category\": \"디자인\" },\n { \"name\": \"grid-2x2\", \"category\": \"디자인\" },\n { \"name\": \"grid-3x3\", \"category\": \"디자인\" },\n { \"name\": \"highlighter\", \"category\": \"디자인\" },\n { \"name\": \"iteration-ccw\", \"category\": \"디자인\" },\n { \"name\": \"iteration-cw\", \"category\": \"디자인\" },\n { \"name\": \"kanban\", \"category\": \"디자인\" },\n { \"name\": \"land-plot\", \"category\": \"디자인\" },\n { \"name\": \"lasso\", \"category\": \"디자인\" },\n { \"name\": \"lasso-select\", \"category\": \"디자인\" },\n { \"name\": \"layers\", \"category\": \"디자인\" },\n { \"name\": \"layers-2\", \"category\": \"디자인\" },\n { \"name\": \"layout-dashboard\", \"category\": \"디자인\" },\n { \"name\": \"layout-grid\", \"category\": \"디자인\" },\n { \"name\": \"layout-list\", \"category\": \"디자인\" },\n { \"name\": \"layout-panel-left\", \"category\": \"디자인\" },\n { \"name\": \"loader\", \"category\": \"디자인\" },\n { \"name\": \"loader-pinwheel\", \"category\": \"디자인\" },\n { \"name\": \"magnet\", \"category\": \"디자인\" },\n { \"name\": \"maximize\", \"category\": \"디자인\" },\n { \"name\": \"maximize-2\", \"category\": \"디자인\" },\n { \"name\": \"minimize\", \"category\": \"디자인\" },\n { \"name\": \"minimize-2\", \"category\": \"디자인\" },\n { \"name\": \"move-3d\", \"category\": \"디자인\" },\n { \"name\": \"notebook\", \"category\": \"디자인\" },\n { \"name\": \"origami\", \"category\": \"디자인\" },\n { \"name\": \"paint-bucket\", \"category\": \"디자인\" },\n { \"name\": \"paint-roller\", \"category\": \"디자인\" },\n { \"name\": \"paintbrush\", \"category\": \"디자인\" },\n { \"name\": \"paintbrush-vertical\", \"category\": \"디자인\" },\n { \"name\": \"palette\", \"category\": \"디자인\" },\n { \"name\": \"panel-top\", \"category\": \"디자인\" },\n { \"name\": \"panels-top-left\", \"category\": \"디자인\" },\n { \"name\": \"paperclip\", \"category\": \"디자인\" },\n { \"name\": \"pen\", \"category\": \"디자인\" },\n { \"name\": \"pen-line\", \"category\": \"디자인\" },\n { \"name\": \"pen-off\", \"category\": \"디자인\" },\n { \"name\": \"pen-tool\", \"category\": \"디자인\" },\n { \"name\": \"pencil\", \"category\": \"디자인\" },\n { \"name\": \"pencil-line\", \"category\": \"디자인\" },\n { \"name\": \"pencil-off\", \"category\": \"디자인\" },\n { \"name\": \"pencil-ruler\", \"category\": \"디자인\" },\n { \"name\": \"pipette\", \"category\": \"디자인\" },\n { \"name\": \"presentation\", \"category\": \"디자인\" },\n { \"name\": \"proportions\", \"category\": \"디자인\" },\n { \"name\": \"radius\", \"category\": \"디자인\" },\n { \"name\": \"ratio\", \"category\": \"디자인\" },\n { \"name\": \"rectangle-horizontal\", \"category\": \"디자인\" },\n { \"name\": \"rectangle-vertical\", \"category\": \"디자인\" },\n { \"name\": \"rotate-3d\", \"category\": \"디자인\" },\n { \"name\": \"rotate-ccw\", \"category\": \"디자인\" },\n { \"name\": \"rotate-ccw-square\", \"category\": \"디자인\" },\n { \"name\": \"rotate-cw\", \"category\": \"디자인\" },\n { \"name\": \"rotate-cw-square\", \"category\": \"디자인\" },\n { \"name\": \"rows-2\", \"category\": \"디자인\" },\n { \"name\": \"rows-3\", \"category\": \"디자인\" },\n { \"name\": \"rows-4\", \"category\": \"디자인\" },\n { \"name\": \"ruler\", \"category\": \"디자인\" },\n { \"name\": \"scale-3d\", \"category\": \"디자인\" },\n { \"name\": \"scaling\", \"category\": \"디자인\" },\n { \"name\": \"scissors\", \"category\": \"디자인\" },\n { \"name\": \"scissors-line-dashed\", \"category\": \"디자인\" },\n { \"name\": \"send-to-back\", \"category\": \"디자인\" },\n { \"name\": \"ship\", \"category\": \"디자인\" },\n { \"name\": \"slice\", \"category\": \"디자인\" },\n { \"name\": \"spline\", \"category\": \"디자인\" },\n { \"name\": \"spray-can\", \"category\": \"디자인\" },\n { \"name\": \"square-chart-gantt\", \"category\": \"디자인\" },\n { \"name\": \"square-dashed\", \"category\": \"디자인\" },\n { \"name\": \"square-dashed-kanban\", \"category\": \"디자인\" },\n { \"name\": \"square-kanban\", \"category\": \"디자인\" },\n { \"name\": \"square-round-corner\", \"category\": \"디자인\" },\n { \"name\": \"square-scissors\", \"category\": \"디자인\" },\n { \"name\": \"stamp\", \"category\": \"디자인\" },\n { \"name\": \"swatch-book\", \"category\": \"디자인\" },\n { \"name\": \"tablet-smartphone\", \"category\": \"디자인\" },\n { \"name\": \"tangent\", \"category\": \"디자인\" },\n { \"name\": \"torus\", \"category\": \"디자인\" },\n { \"name\": \"view\", \"category\": \"디자인\" },\n { \"name\": \"wand\", \"category\": \"디자인\" },\n { \"name\": \"wand-sparkles\", \"category\": \"디자인\" },\n { \"name\": \"zoom-in\", \"category\": \"디자인\" },\n { \"name\": \"zoom-out\", \"category\": \"디자인\" }\n ]\n}\n","import { ChangeEvent, useEffect, useMemo, useRef, useState } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { debounce, uniqWith } from 'es-toolkit'\nimport { Info } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport message from '../../utils/message'\nimport { Button } from '../button'\nimport { LucideIcon } from '../lucideIcon'\nimport { Stack } from '../stack'\nimport { TextField } from '../textField'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'\nimport iconList from './icons.json'\n\nexport type IconSelectProps = {\n /** 선택된 아이콘 이름 (lucide kebab-case, 예: 'calendar-days') */\n value?: string | null\n /** 아이콘을 클릭하면 그 아이콘 이름으로 호출된다 */\n onValueChange?: (value: string) => void\n /** 한 줄에 보여줄 아이콘 수 @default 8 */\n iconColumnCount?: number\n /** 왼쪽에 카테고리 목록 표시 @default false */\n hasCategory?: boolean\n /** 검색 입력 숨김 @default false */\n hiddenSearch?: boolean\n}\n\nexport function IconSelect({\n iconColumnCount = 8,\n hasCategory = false,\n hiddenSearch = false,\n ...props\n}: IconSelectProps) {\n const parentRef = useRef<HTMLDivElement>(null)\n const [inputValue, setInputValue] = useState('') // 검색어 입력값\n const [searchTerm, setSearchTerm] = useState('') // 아이콘 검색어\n const [selectedCategory, setSelectedCategory] = useState<string>(iconList.categories[0]) // 선택된 카테고리\n\n const [iconColumnCountValue] = useState<number>(iconColumnCount)\n\n /**\n * 검색어 디바운스\n * 검색어 입력값이 변경되면 searchTerm도 변경\n */\n useEffect(() => {\n const debounceValue = debounce((value: string) => {\n setSearchTerm(value)\n }, 100)\n\n debounceValue(inputValue)\n }, [inputValue])\n\n /**\n * 아이콘 필터링\n * searchTerm이 있으면 searchTerm에 맞는 아이콘 필터링\n * selectedCategory가 '전체'이 아니면 selectedCategory에 맞는 아이콘 필터링\n */\n const filteredIcons = useMemo(() => {\n let result\n\n if (searchTerm) {\n const filteredIcons = iconList.icons.filter((icon) =>\n icon.name.toLowerCase().includes(searchTerm.toLowerCase()),\n )\n\n // 중복 아이콘 제거\n result = uniqWith(filteredIcons, (a, b) => a.name === b.name)\n } else if (selectedCategory !== iconList.categories[0]) {\n result = iconList.icons.filter((icon) => icon.category === selectedCategory)\n } else {\n result = iconList.icons\n }\n\n return result\n }, [searchTerm, selectedCategory])\n\n // 아이콘 리스트 최적화\n // eslint-disable-next-line react-hooks/incompatible-library\n const rowVirtualizer = useVirtualizer({\n count: Math.ceil(filteredIcons.length / iconColumnCountValue),\n getScrollElement: () => parentRef.current,\n estimateSize: () => 50, // 각 행의 실제 높이에 맞게 조정\n overscan: 10, // 더 많은 항목을 미리 로드\n })\n\n return (\n <Stack direction='column' spacing={16}>\n {!hiddenSearch && (\n <TextField\n aria-label='아이콘 검색'\n placeholder='검색어를 입력해주세요'\n value={inputValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n\n setSelectedCategory(iconList.categories[0])\n }}\n />\n )}\n <Stack direction='row' spacing={8}>\n {hasCategory && (\n <Stack\n direction='column'\n className='w-[150px] h-[300px] max-h-[300px] overflow-auto'\n spacing={6}\n >\n {iconList.categories.map((category) => (\n <Button\n key={category}\n variant='secondaryLink'\n className={cn(\n 'text-small-regular-h text-sys-text-main',\n category === selectedCategory && 'bg-primary-o10',\n )}\n onClick={() => {\n setSelectedCategory(category)\n\n // '전체'이외의 카테고리 선택 시 입력값 초기화\n if (iconList.categories[0] !== category) {\n setInputValue('')\n }\n }}\n >\n {category}\n </Button>\n ))}\n </Stack>\n )}\n <div ref={parentRef} className={cn('max-h-[300px] overflow-auto flex-1')}>\n {filteredIcons.length === 0 && (\n <Stack\n justifyContent='center'\n alignItems='center'\n spacing={6}\n className='text-sys-text-subtlest text-small-medium h-full'\n >\n <Info size={16} className='text-sys-text-subtlest shrink-0' />\n {message.common.notice_search_result_empty}\n </Stack>\n )}\n\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const startIndex = virtualRow.index * iconColumnCountValue\n const endIndex = Math.min(startIndex + iconColumnCountValue, filteredIcons.length)\n const rowIcons = filteredIcons.slice(startIndex, endIndex)\n\n return (\n <div\n key={virtualRow.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n <div\n className={cn('grid grid-cols-8')}\n style={{ gridTemplateColumns: `repeat(${iconColumnCountValue}, 1fr)` }}\n >\n {rowIcons.map((item) => (\n <TooltipProvider delayDuration={0} key={item.name}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={'secondary'}\n className={cn(\n 'flex items-center justify-center bg-sys-background py-[10px]',\n item.name === props.value && '!bg-secondary-o20',\n 'hover:bg-primary10',\n )}\n onClick={() => props.onValueChange?.(item.name)}\n type='button'\n aria-label={item.name}\n aria-pressed={item.name === props.value}\n >\n <LucideIcon iconComponentName={item.name as any} size={24} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{item.name}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ))}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </Stack>\n </Stack>\n )\n}\n","import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nexport interface MetaItemProps extends React.HTMLAttributes<HTMLDivElement> {\n label: React.ReactNode\n value: React.ReactNode\n}\n\n/**\n * 라벨·값 한 쌍의 메타 정보. 가로 나열(`MetaItem`+`MetaGroup`, 헤더용)과 세로 쌓기(`MetaRow`+`MetaList`, 상세 패널용) 두 모양이 있다.\n * 언제 쓰나: PageHeader 아래 등록자·일시 같은 메타(MetaItem). 상세 화면의 핵심 정보도 여기 한 곳 — 여러 개면 `MetaGroup` 이 가로로 흘려 다음 줄로 넘긴다(2026-10-30 사용자 결정: 헤더의 메타 자리를 두 개로 나누지 않는다). 본문 카드의 속성 묶음은 MetaList + MetaRow align='start'.\n * 언제 안 쓰나: 편집 가능한 값(폼), 열이 여러 개인 표(Table).\n * 대신/함께: MetaRow 값은 14px·라벨 12px — 행마다 값 크기를 바꾸지 않는다(패널 안 크기 차이는 심판 감점, 2026-10-18). 상태는 value 에 Badge.\n */\nfunction MetaItem({ label, value, className, ...props }: MetaItemProps) {\n return (\n // min-w-0·truncate: 줄 폭보다 긴 값은 넘치지 않고 말줄임으로 끝난다\n <div className={cn('flex h-[28px] min-w-0 items-center gap-[6px]', className)} {...props}>\n {/* 라벨 12px 은 유지하고 색만 subtler → subtle(흰 바탕 대비 4.98 → 7.19) — \"small gray text\" 감점(2026-10-18 13차) */}\n <span className='shrink-0 text-small-regular-h text-sys-text-subtle'>{label}</span>\n <span aria-hidden className='h-[11px] w-px shrink-0 bg-sys-divider-subtle' />\n <span className='min-w-0 truncate whitespace-pre text-small-medium-h text-sys-text-main'>\n {value}\n </span>\n </div>\n )\n}\n\nexport interface MetaRowProps extends React.HTMLAttributes<HTMLDivElement> {\n label: React.ReactNode\n /** 생략 시 슬롯만 우측 정렬로 렌더링됨 (Figma hasText=false 대응) */\n value?: React.ReactNode\n slotBefore?: React.ReactNode\n slotAfter?: React.ReactNode\n /**\n * 값의 자리. `end`(기본)는 라벨 100px + 값을 행 오른쪽 끝에(dl-ui-v3 시안). `start` 는 라벨 120px + 값을 라벨 바로 옆 왼쪽 정렬 —\n * 상세 패널·오른쪽 정보 열처럼 행이 넓은 곳에서 라벨과 값 사이가 비지 않는다(2026-10-16 이슈 47, 원문 심판 13회 감점). 패턴 예제는 `start`\n */\n align?: 'end' | 'start'\n /**\n * 값을 숫자 강조(20px, 탭룰러)로. 통계·건수처럼 숫자가 행의 주인공일 때만 — 예: \"사용 중인 엔드포인트 3개\", \"크기 1,280 MB\".\n * 한 패널에 한두 행만. 2026-10-17 8차 A3(디자이너 점수 역추적: 글자 크기 단계가 많은 화면이 높게 평가됨).\n * 2026-10-18 9차: 예제·스킬·스토리에서 뺐다 — 개발용 8차 심판이 패널 안 크기 차이를 \"불균일\"로 읽어 감점(타이포 3쌍·컴포넌트 2쌍). KPI 띠 같은 전용 자리가 생기기 전엔 기본으로 쓰지 않는다\n */\n emphasis?: boolean\n}\n\n/**\n * PageHeader 등의 메타 항목(`MetaItem`)들을 가로로 나열하는 컨테이너.\n * 폭이 좁아지면 줄바꿈되며, 가로 간격은 24px, 줄바꿈 시 세로 간격은 0이다. 상세 화면의 핵심 정보(ID·버전·소유자·수정일 …)도 여기 한 곳에\n * 흘려 둔다(2026-10-30 사용자 결정: 요약 상자를 따로 두지 않는다). 열을 맞춘 격자는 두지 않는다 — 1440 폭 3열이면 칸이 약 470px 라 항목 사이가\n * 벌어졌다(2026-11-06 사용자 지적, 홀드아웃 17~19 심판 \"metadata spread across very wide columns\"). dl-ui-v3 상세 화면과 같은 모양\n */\nfunction MetaGroup({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('flex flex-wrap items-center gap-x-[24px] gap-y-0', className)} {...props} />\n )\n}\n\nfunction MetaRow({\n label,\n value,\n slotBefore,\n slotAfter,\n align = 'end',\n emphasis = false,\n className,\n ...props\n}: MetaRowProps) {\n const hasValue = value !== undefined && value !== null && value !== ''\n const start = align === 'start'\n return (\n <div\n className={cn(\n // min-h: 한 줄이면 48px 그대로, 태그처럼 줄바꿈되는 값이면 자란다. 선은 Separator·표 행과 같은 토큰 (2026-10-17 이슈 47 4차)\n 'flex min-h-[48px] w-full items-center justify-between border-b border-sys-divider-subtle px-[12px] py-[8px]',\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n // 라벨 12px 유지, 색은 subtle(2026-10-18 13차 — 상세·검토 패널 라벨이 \"small gray text\" 로 읽혔다)\n 'shrink-0 text-small-regular text-sys-text-subtle',\n // start: 라벨 열 120px(긴 라벨은 열을 밀고 값은 12px 뒤에서 시작 — 겹치지 않게), end: 100px 고정\n start ? 'min-w-[120px] pr-[12px]' : 'w-[100px]',\n )}\n >\n {label}\n </span>\n <div\n className={cn(\n 'flex min-w-0 flex-1 items-center gap-[6px]',\n !hasValue && !start && 'justify-end',\n )}\n >\n {slotBefore}\n {hasValue && (\n <span\n className={cn(\n // 값 14px(라벨 12px) — 라벨과 값이 같은 크기라 위계가 없던 것을 고침(2026-10-17 8차 A2). emphasis 는 20px 탭룰러 숫자\n 'min-w-0 truncate whitespace-pre text-sys-text-main',\n emphasis ? 'text-h4 tabular-nums' : 'text-base-medium',\n start ? 'text-left' : 'flex-1 text-right',\n )}\n >\n {value}\n </span>\n )}\n {slotAfter}\n </div>\n </div>\n )\n}\n\nexport interface MetaListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 열 수(기본 1 = 세로 한 줄씩). 2 이상이면 행을 격자로 흘린다(md 2열, xl 부터 지정 열) — 전폭 본문 카드처럼 넓은 자리의 키-값 격자. 행은 `MetaRow align='start'` */\n columns?: 1 | 2 | 3 | 4\n}\n\nconst META_LIST_COLUMNS = {\n // 한 열: 마지막 줄 아래 선 없음 — 앱이 목록 밑에 Separator 를 두면 선이 두 줄로 겹쳤다(2026-11-06 홀드아웃 19 검토 패널, Opus 3). 표의 '마지막 행 선 없음'과 같은 규칙.\n // 여러 열 격자는 마지막 칸만 선이 빠지면 줄이 어긋나 그대로 둔다\n 1: 'flex flex-col [&>*:last-child]:border-b-0',\n 2: 'grid grid-cols-1 gap-x-[24px] md:grid-cols-2',\n 3: 'grid grid-cols-1 gap-x-[24px] md:grid-cols-2 xl:grid-cols-3',\n 4: 'grid grid-cols-1 gap-x-[24px] md:grid-cols-2 xl:grid-cols-4',\n} as const\n\n/**\n * `MetaRow` 를 위에서 아래로 한 줄씩 쌓는 목록. 상세 Drawer·오른쪽 정보 패널의 \"필드: 값\" 묶음.\n *\n * 언제 쓰나: Drawer 본문처럼 폭이 좁은 곳에 리소스의 필드를 나열할 때(세로 한 줄씩), 또는 `columns={3}` 으로 전폭 본문 카드의 키-값 격자. 행마다 라벨 100px + 값 오른쪽 정렬(기본) — 상세 패널·정보 열처럼 행이 넓으면 `MetaRow align='start'` 로 값을 라벨 옆에 붙인다.\n * 언제 안 쓰나: PageHeader 아래의 메타(→ MetaGroup + MetaItem, 많아도 가로로 흘린다), 표 형태 데이터(→ Table).\n * 대신/함께: `Stack` 은 기본 방향이 가로라 `<Stack>` 으로 MetaRow 를 감싸면 행이 옆으로 늘어서 잘린다 — MetaList 를 쓴다.\n */\nfunction MetaList({ className, columns = 1, ...props }: MetaListProps) {\n return <div className={cn('w-full', META_LIST_COLUMNS[columns], className)} {...props} />\n}\n\nexport { MetaGroup, MetaItem, MetaList, MetaRow }\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Badge } from './badge'\n\nexport type EventLevel = 'info' | 'success' | 'warning' | 'error'\n\nexport type EventListItem = {\n /** 항목 key */\n id: string\n /** 발생 시각. 소비 앱이 포맷해 넘긴다 (예: \"3분 전\", \"10. 12. 09:28\") */\n time: ReactNode\n /** 레벨. 왼쪽 색 띠와 Badge 색을 정한다 */\n level: EventLevel\n /** 내용 한 줄 */\n message: ReactNode\n}\n\nexport type EventListProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n /** 최신순으로 정렬해 넘긴다 */\n items: EventListItem[]\n /** 항목이 없을 때 문구. 기본 \"최근 이벤트가 없습니다.\" */\n emptyText?: ReactNode\n /** 레벨 Badge 글자. 기본 정보·성공·경고·오류 */\n levelLabels?: Partial<Record<EventLevel, ReactNode>>\n}\n\nconst LEVEL = {\n info: { variant: 'info', bar: 'border-info30', label: '정보' },\n success: { variant: 'success', bar: 'border-success30', label: '성공' },\n warning: { variant: 'warning', bar: 'border-warning30', label: '경고' },\n error: { variant: 'danger', bar: 'border-danger30', label: '오류' },\n} as const\n\n/**\n * 최근 이벤트·활동 목록. 항목마다 왼쪽 레벨 색 띠 → 레벨 Badge → 시각 → 메시지 한 줄.\n *\n * 언제 쓰나: 대시보드·상세 화면의 \"최근 이벤트/활동\" 섹션처럼 최신순 몇 개(보통 5~10개)를 한눈에 보여 줄 때. 레벨(info·success·warning·error)을 색 띠와 Badge 로 구분한다.\n * 언제 안 쓰나: 검색·필터·페이지네이션이 필요한 로그(→ ListPage·AgGridTable), 단계가 있는 진행 상황(→ 소비 앱의 스텝 표시), 사용자가 답해야 하는 알림(→ Alert·Toast).\n * 대신/함께: 시각은 소비 앱이 포맷해 `time` 에 넘긴다. 항목이 없으면 `emptyText` 를 status 로 보여 준다. 레벨 → 색은 고정이고 `className` 으로 색을 바꾸지 않는다.\n */\nexport function EventList({\n items,\n emptyText = '최근 이벤트가 없습니다.',\n levelLabels,\n className,\n ...props\n}: EventListProps) {\n if (!items.length)\n return (\n <p\n role='status'\n className={cn('py-[16px] text-center text-base-regular text-sys-text-subtle', className)}\n >\n {emptyText}\n </p>\n )\n return (\n <ul className={cn('flex w-full flex-col gap-[4px]', className)} {...props}>\n {items.map((item) => {\n const level = LEVEL[item.level]\n return (\n <li\n key={item.id}\n className={cn(\n 'flex items-start gap-[12px] border-l-[2px] py-[8px] pl-[12px]',\n level.bar,\n )}\n >\n <Badge variant={level.variant} className='shrink-0'>\n {levelLabels?.[item.level] ?? level.label}\n </Badge>\n <span className='shrink-0 text-small-regular text-sys-text-subtler'>{item.time}</span>\n <span className='min-w-0 flex-1 text-base-regular text-sys-text-main'>\n {item.message}\n </span>\n </li>\n )\n })}\n </ul>\n )\n}\n","'use client'\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { formatDistanceToNow, isValid } from 'date-fns'\nimport { ko } from 'date-fns/locale'\nimport { RefreshCw } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nexport interface PageHeaderRefreshButtonProps {\n /** 새로고침 클릭 */\n onClick: () => void\n /** 마지막 갱신 시각. 없으면 \"업데이트 전\", 1분 안이면 \"방금 업데이트\", 그 뒤로는 \"N분 전 업데이트\" (1분마다 갱신) */\n lastUpdatedAt?: Date | number | string\n /** true 면 아이콘이 돌고 버튼이 비활성 (react-query 의 isRefetching 등) */\n refreshing?: boolean\n /** 버튼 크기. default 36px, compact 28px (compact PageHeader 용) */\n size?: 'default' | 'compact'\n className?: string\n}\n\n/**\n * PageHeader `titleRight` 에 놓는 새로고침 묶음 — \"N분 전 업데이트\" 라벨 + 아이콘 버튼. 갱신 중에는 아이콘이 돌고 버튼이 잠긴다.\n *\n * 언제 쓰나: 목록·상세·대시보드처럼 서버 데이터를 다시 불러올 수 있는 화면의 헤더. `lastUpdatedAt` 에 조회 시각(react-query `dataUpdatedAt`)을, `refreshing` 에 재조회 중 여부를 넘긴다.\n * 언제 안 쓰나: 폼의 \"다시 시도\"(→ Button secondary), 표 안의 행 단위 새로고침(→ IconButton secondaryLink), 자동 폴링만 있고 사용자가 누를 일이 없는 화면.\n * 대신/함께: 텍스트 버튼으로 만들지 않는다(dl-ui-v3 헤더 관례와 통일). 라벨은 1분마다 다시 계산한다.\n */\nexport function PageHeaderRefreshButton({\n onClick,\n lastUpdatedAt,\n refreshing = false,\n size = 'default',\n className,\n}: PageHeaderRefreshButtonProps) {\n const label = useUpdatedLabel(lastUpdatedAt)\n\n return (\n <div className={cn('flex items-center gap-[4px]', className)}>\n <span className='whitespace-nowrap text-small-regular text-sys-text-subtle'>{label}</span>\n <button\n type='button'\n aria-label='새로고침'\n disabled={refreshing}\n onClick={onClick}\n className={cn(\n 'inline-flex items-center justify-center rounded-small bg-transparent text-sys-text-subtle transition-colors',\n 'hover:bg-sys-button-secondary-subtle-background-hover',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main',\n 'disabled:pointer-events-none disabled:text-sys-button-disabled-text',\n size === 'compact' ? 'size-[28px]' : 'size-[36px]',\n )}\n >\n <RefreshCw size={16} className={cn(refreshing && 'animate-spin')} />\n </button>\n </div>\n )\n}\n\n/** 상대 시각 라벨. 1분마다 다시 계산한다 */\nfunction useUpdatedLabel(lastUpdatedAt?: Date | number | string): string {\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n if (!lastUpdatedAt) return\n const timer = window.setInterval(() => setTick((prev) => prev + 1), 60_000)\n return () => window.clearInterval(timer)\n }, [lastUpdatedAt])\n\n return useMemo(() => {\n const updatedAt = parseUpdatedAt(lastUpdatedAt)\n if (!updatedAt) return '업데이트 전'\n if (Date.now() - updatedAt.getTime() < 60_000) return '방금 업데이트'\n return `${formatDistanceToNow(updatedAt, { addSuffix: true, locale: ko })} 업데이트`\n // tick 은 라벨 재계산을 위한 의존성\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastUpdatedAt, tick])\n}\n\nfunction parseUpdatedAt(value?: Date | number | string): Date | null {\n if (!value) return null\n const date = value instanceof Date ? value : new Date(value)\n return isValid(date) ? date : null\n}\n","/**\n * 셀 범위 클립보드 (TSV + 자체 JSON 멀티포맷).\n *\n * - TSV 출력은 Excel/Google Sheets 와 양방향 호환. 셀에 \\t, \\n, \" 가 포함되면 큰따옴표로 감싸고\n * 내부 \" 는 \"\" 로 escape (RFC4180-ish, 단 구분자는 \\t).\n * - 자체 JSON 포맷(`t3q.parameter-table.cells`)은 컬럼 id 정보까지 보존해 round-trip 정확.\n * 같은 컴포넌트 안에서 복사 → 붙여넣기 시 우선 매칭.\n */\n\nexport const PARAMETER_TABLE_CELLS_CLIPBOARD_KIND = 't3q.parameter-table.cells'\n\nexport type CellsClipboardPayload = {\n kind: typeof PARAMETER_TABLE_CELLS_CLIPBOARD_KIND\n version: 1\n /** column id 순서. paste 시 해당 column id 가 target table 에도 있으면 그 column 으로 정렬. */\n columns: string[]\n /** [row][col] 의 string 값 매트릭스. */\n cells: string[][]\n}\n\n/* ----------------------------- TSV ----------------------------- */\n\nconst TSV_NEEDS_QUOTE = /[\\t\\n\\r\"]/\n\nexport function serializeCellsToTsv(cells: string[][]): string {\n return cells\n .map((row) =>\n row\n .map((v) => {\n const s = v ?? ''\n if (TSV_NEEDS_QUOTE.test(s)) {\n return `\"${s.replace(/\"/g, '\"\"')}\"`\n }\n return s\n })\n .join('\\t'),\n )\n .join('\\n')\n}\n\n/** TSV 파서. quoted cell 안의 \\t / \\n / \"\" 처리. trailing newline 무시. */\nexport function parseTsv(text: string): string[][] {\n if (text == null) return []\n // CRLF → LF 정규화.\n const src = text.replace(/\\r\\n?/g, '\\n')\n const rows: string[][] = []\n let row: string[] = []\n let cell = ''\n let inQuote = false\n let i = 0\n const n = src.length\n\n while (i < n) {\n const ch = src[i]\n if (inQuote) {\n if (ch === '\"') {\n if (i + 1 < n && src[i + 1] === '\"') {\n cell += '\"'\n i += 2\n continue\n }\n inQuote = false\n i += 1\n continue\n }\n cell += ch\n i += 1\n continue\n }\n if (ch === '\"') {\n // quote 시작은 cell 의 시작 위치에서만 유효한 것이 이상적이지만,\n // Excel/Sheets 가 항상 cell 시작에서 quote 를 사용하므로 그 가정으로 충분.\n inQuote = true\n i += 1\n continue\n }\n if (ch === '\\t') {\n row.push(cell)\n cell = ''\n i += 1\n continue\n }\n if (ch === '\\n') {\n row.push(cell)\n rows.push(row)\n row = []\n cell = ''\n i += 1\n continue\n }\n cell += ch\n i += 1\n }\n // 마지막 cell flush. trailing newline 이 있었으면 row 가 비어있을 수 있음 — 그 경우는 push 하지 않음.\n if (cell !== '' || row.length > 0) {\n row.push(cell)\n rows.push(row)\n }\n return rows\n}\n\n/* ----------------------------- JSON ----------------------------- */\n\nexport function serializeCellsToJson(cells: string[][], columns: string[]): string {\n const payload: CellsClipboardPayload = {\n kind: PARAMETER_TABLE_CELLS_CLIPBOARD_KIND,\n version: 1,\n columns,\n cells,\n }\n return JSON.stringify(payload)\n}\n\nexport function parseCellsJson(text: string): CellsClipboardPayload | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n return null\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n (parsed as { kind?: unknown }).kind !== PARAMETER_TABLE_CELLS_CLIPBOARD_KIND\n ) {\n return null\n }\n const p = parsed as Partial<CellsClipboardPayload>\n if (!Array.isArray(p.columns) || !Array.isArray(p.cells)) return null\n const columns = p.columns.map((c) => String(c ?? ''))\n const cells = p.cells.map((row) => (Array.isArray(row) ? row.map((v) => String(v ?? '')) : []))\n return { kind: PARAMETER_TABLE_CELLS_CLIPBOARD_KIND, version: 1, columns, cells }\n}\n\n/* ----------------------------- Browser I/O ----------------------------- */\n\n/**\n * 클립보드에 TSV + 자체 JSON 을 동시에 write. ClipboardItem 지원 안 하는 환경은 writeText 폴백.\n * 권한 거부 등 실패 시 false 반환.\n */\nexport async function writeCellsToClipboard(tsv: string, json: string): Promise<boolean> {\n const clip = navigator.clipboard\n if (!clip) return false\n // 우선 멀티포맷 시도 (Chrome 등 modern browser).\n if (typeof clip.write === 'function' && typeof ClipboardItem !== 'undefined') {\n try {\n // 'web ' prefix 가 붙은 MIME 은 unsanitized custom format. Chromium 117+ 지원.\n const item = new ClipboardItem({\n 'text/plain': new Blob([tsv], { type: 'text/plain' }),\n 'web application/json': new Blob([json], { type: 'web application/json' }),\n })\n await clip.write([item])\n return true\n } catch {\n // 폴백으로 떨어짐.\n }\n }\n if (typeof clip.writeText === 'function') {\n try {\n await clip.writeText(tsv)\n return true\n } catch {\n return false\n }\n }\n return false\n}\n\n/** 클립보드 읽기. JSON 자체 포맷 우선, 실패 시 TSV 파싱. */\nexport async function readCellsFromClipboard(): Promise<\n { kind: 'json'; payload: CellsClipboardPayload } | { kind: 'tsv'; cells: string[][] } | null\n> {\n const clip = navigator.clipboard\n if (!clip) return null\n // 멀티포맷 시도.\n if (typeof clip.read === 'function') {\n try {\n const items = await clip.read()\n for (const item of items) {\n if (item.types.includes('web application/json')) {\n const blob = await item.getType('web application/json')\n const text = await blob.text()\n const json = parseCellsJson(text)\n if (json) return { kind: 'json', payload: json }\n }\n }\n // JSON 매칭 안 되면 text/plain 으로 폴백.\n for (const item of items) {\n if (item.types.includes('text/plain')) {\n const blob = await item.getType('text/plain')\n const text = await blob.text()\n const cells = parseTsv(text)\n if (cells.length > 0) return { kind: 'tsv', cells }\n }\n }\n } catch {\n // 권한 거부 등 — readText 폴백.\n }\n }\n if (typeof clip.readText === 'function') {\n try {\n const text = await clip.readText()\n // 자체 JSON 포맷일 수도 있으니 먼저 시도.\n const json = parseCellsJson(text)\n if (json) return { kind: 'json', payload: json }\n const cells = parseTsv(text)\n if (cells.length > 0) return { kind: 'tsv', cells }\n } catch {\n return null\n }\n }\n return null\n}\n","/** 셀 좌표 (행 인덱스, 컬럼 인덱스). 둘 다 0-based. */\nexport type CellCoord = { rowIdx: number; colIdx: number }\n\n/** 셀 선택 범위. anchor 는 드래그/Shift-arrow 의 기준점, focus 는 현재 끝점. 단일 셀이면 anchor === focus. */\nexport type CellRange = { anchor: CellCoord; focus: CellCoord }\n\n/** 정규화된 사각 영역. inclusive bounds. */\nexport type CellRect = { top: number; left: number; bottom: number; right: number }\n\nexport function normalizeRange(range: CellRange): CellRect {\n const top = Math.min(range.anchor.rowIdx, range.focus.rowIdx)\n const bottom = Math.max(range.anchor.rowIdx, range.focus.rowIdx)\n const left = Math.min(range.anchor.colIdx, range.focus.colIdx)\n const right = Math.max(range.anchor.colIdx, range.focus.colIdx)\n return { top, left, bottom, right }\n}\n\nexport function rectContains(rect: CellRect, coord: CellCoord): boolean {\n return (\n coord.rowIdx >= rect.top &&\n coord.rowIdx <= rect.bottom &&\n coord.colIdx >= rect.left &&\n coord.colIdx <= rect.right\n )\n}\n\nexport function coordEquals(a: CellCoord, b: CellCoord): boolean {\n return a.rowIdx === b.rowIdx && a.colIdx === b.colIdx\n}\n","export interface ParameterTableRow {\n id: string\n values: Record<string, string>\n}\n\nexport interface ParameterTableColumn {\n id: string\n header: string\n placeholder?: string\n width?: number | string\n required?: boolean\n}\n\n/**\n * 셀별 invalid 표시. cellErrors[rowId][colId] === true 인 셀에 빨간 테두리 강조.\n * 외부 form 검증 결과를 그대로 매핑해 controlled 로 주입한다.\n */\nexport type ParameterTableCellErrors = Record<string, Record<string, boolean>>\n\nexport type ParameterTableSpacing = 'normal' | 'compact'\n\nexport const DEFAULT_PARAMETER_TABLE_COLUMNS: ParameterTableColumn[] = [\n { id: 'key', header: 'Key' },\n { id: 'value', header: 'Value' },\n { id: 'description', header: 'Description' },\n]\n\n/**\n * 보조 컬럼 (handle / delete) 의 너비.\n * Figma `column type=handle|deleteButton` 스펙 매핑.\n */\nexport const PARAMETER_TABLE_COL_WIDTHS: Record<\n ParameterTableSpacing,\n { handle: number; delete: number }\n> = {\n normal: { handle: 48, delete: 48 },\n compact: { handle: 32, delete: 32 },\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, Trash2 } from 'lucide-react'\n\nimport { type CellCoord, type CellRect, rectContains } from './cellSelection/types'\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { IconButton } from '../iconButton'\nimport { TableCell, TableRow } from '../table'\nimport {\n PARAMETER_TABLE_COL_WIDTHS,\n type ParameterTableCellErrors,\n type ParameterTableColumn,\n type ParameterTableRow as ParameterTableRowType,\n type ParameterTableSpacing,\n} from './types'\n\nexport interface ParameterTableRowProps {\n row: ParameterTableRowType\n rowIdx: number\n columns: ParameterTableColumn[]\n spacing: ParameterTableSpacing\n withHandle: boolean\n disabled: boolean\n /** 마지막 trailing 빈 행. drag/delete 비활성, 시각적으로 hover 효과만 표시. */\n isPlaceholder: boolean\n /** 정규화된 선택 영역. 이 행이 영역 안에 들어가면 셀별 selected 상태. */\n selectionRect: CellRect | null\n /** 편집 모드에 진입한 셀. 이 행 안의 셀이면 outline 표시. 셀 안 input 은 부모의\n * 단일 floating input 이 cell 위치에 absolute positioning 으로 띄움. */\n editingCell: CellCoord | null\n /** 셀별 invalid 표시. placeholder 행은 자동 제외. */\n cellErrors?: ParameterTableCellErrors\n onCellMouseDown: (coord: CellCoord, event: React.MouseEvent) => void\n onCellMouseEnter: (coord: CellCoord) => void\n /** 셀 클릭. 이미 선택돼 있던 셀의 재클릭이면 부모가 편집 진입을 판정한다. */\n onCellClick: (coord: CellCoord, event: React.MouseEvent) => void\n onCellDoubleClick: (coord: CellCoord) => void\n onDelete: () => void\n}\n\n/**\n * Parameter Table 의 단일 행. 셀은 항상 display div 만 렌더. 편집 모드에서는\n * 부모(ParameterTable) 가 단일 floating input 을 활성 셀의 td 위에 absolute positioning\n * 으로 띄운다 — IME composition 중 input element 가 unmount/remount 되지 않으므로\n * 한국어/일본어/중국어 IME 자모 분리 문제가 원천 차단된다.\n */\nexport function ParameterTableRow({\n row,\n rowIdx,\n columns,\n spacing,\n withHandle,\n disabled,\n isPlaceholder,\n selectionRect,\n editingCell,\n cellErrors,\n onCellMouseDown,\n onCellMouseEnter,\n onCellClick,\n onCellDoubleClick,\n onDelete,\n}: ParameterTableRowProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: row.id, disabled: disabled || isPlaceholder })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n position: 'relative',\n zIndex: isDragging ? 1 : 0,\n }\n\n const iconBtnSpacing = spacing === 'compact' ? 'compact' : 'normal'\n const colWidths = PARAMETER_TABLE_COL_WIDTHS[spacing]\n\n return (\n <TableRow\n ref={setNodeRef}\n style={style}\n data-state={isDragging ? 'dragging' : isPlaceholder ? 'placeholder' : undefined}\n data-row-idx={rowIdx}\n className={cn('group', isDragging && 'bg-sys-table-press shadow-md')}\n >\n {withHandle && (\n <TableCell align='center' className='p-0' style={{ width: `${colWidths.handle}px` }}>\n <div className='flex items-center justify-center w-full h-full'>\n <button\n type='button'\n aria-label='행 순서 변경'\n disabled={isPlaceholder || disabled}\n ref={setActivatorNodeRef}\n {...attributes}\n {...listeners}\n tabIndex={isPlaceholder || disabled ? -1 : 0}\n className={cn(\n 'flex items-center justify-center p-[2px] rounded-xsmall text-sys-text-subtler',\n 'hover:bg-secondary-o10 focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n 'cursor-grab active:cursor-grabbing',\n isPlaceholder && 'invisible',\n )}\n >\n <GripVertical size={spacing === 'compact' ? 14 : 16} />\n </button>\n </div>\n </TableCell>\n )}\n\n {columns.map((col, colIdx) => {\n const coord: CellCoord = { rowIdx, colIdx }\n const isSelected =\n selectionRect != null && !isDragging ? rectContains(selectionRect, coord) : false\n const isEditing =\n editingCell != null && editingCell.rowIdx === rowIdx && editingCell.colIdx === colIdx\n const cellValue = row.values[col.id] ?? ''\n const hasError = !isPlaceholder && Boolean(cellErrors?.[row.id]?.[col.id])\n\n return (\n <TableCell\n key={col.id}\n className={cn(\n 't3q-pt-cell px-0 py-0 cursor-cell select-none',\n hasError && 't3q-pt-cell--error',\n isSelected && 't3q-pt-cell--selected',\n isEditing && 't3q-pt-cell--editing',\n )}\n style={\n col.width\n ? { width: typeof col.width === 'number' ? `${col.width}px` : col.width }\n : undefined\n }\n data-row-idx={rowIdx}\n data-col-idx={colIdx}\n data-selected={isSelected || undefined}\n data-editing={isEditing || undefined}\n data-error={hasError || undefined}\n onMouseDown={(e) => {\n if (isEditing) return\n onCellMouseDown(coord, e)\n }}\n onMouseEnter={() => {\n if (isEditing) return\n onCellMouseEnter(coord)\n }}\n onClick={(e) => {\n if (isEditing) return\n onCellClick(coord, e)\n }}\n onDoubleClick={() => {\n onCellDoubleClick(coord)\n }}\n >\n <div\n className={cn(\n 't3q-pt-cell-display px-[12px] py-[6px] text-base-medium text-sys-text-main truncate whitespace-pre',\n isEditing && 't3q-pt-cell-display--editing',\n )}\n aria-label={col.header}\n >\n {cellValue ? (\n sanitizeUserText(cellValue)\n ) : (\n <span className='text-sys-text-placeholder'>\n {/* placeholder 행은 컬럼명을 hint 로 표시. 그 외 빈 셀은 nbsp 로 line box 강제해\n 텍스트 있는 행과 baseline / 높이 일치시킴. */}\n {isPlaceholder ? (col.placeholder ?? col.header) : ' '}\n </span>\n )}\n </div>\n </TableCell>\n )\n })}\n\n <TableCell align='center' className='p-0' style={{ width: `${colWidths.delete}px` }}>\n <div className='flex items-center justify-center w-full h-full'>\n <IconButton\n type='button'\n variant='secondaryLink'\n spacing={iconBtnSpacing}\n disabled={disabled || isPlaceholder}\n onClick={onDelete}\n aria-label='행 삭제'\n tabIndex={isPlaceholder ? -1 : 0}\n className={cn(\n 'invisible group-hover:visible group-focus-within:visible',\n isPlaceholder && 'group-hover:invisible group-focus-within:invisible',\n )}\n >\n <Trash2 size={spacing === 'compact' ? 14 : 16} />\n </IconButton>\n </div>\n </TableCell>\n </TableRow>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\n\nimport {\n readCellsFromClipboard,\n serializeCellsToJson,\n serializeCellsToTsv,\n writeCellsToClipboard,\n} from './cellSelection/clipboard'\nimport { type CellCoord, type CellRange, coordEquals, normalizeRange } from './cellSelection/types'\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { Table, TableBody, TableHead, TableHeader, TableRow } from '../table'\nimport { ParameterTableRow as ParameterTableRowComponent } from './ParameterTableRow'\nimport {\n DEFAULT_PARAMETER_TABLE_COLUMNS,\n PARAMETER_TABLE_COL_WIDTHS,\n type ParameterTableCellErrors,\n type ParameterTableColumn,\n type ParameterTableRow,\n type ParameterTableSpacing,\n} from './types'\n\nimport './parameterTable.css'\n\nfunction newRowId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return `ptrow-${Math.random().toString(36).slice(2, 10)}-${Date.now().toString(36)}`\n}\n\nfunction isRowEmpty(row: ParameterTableRow, columns: ParameterTableColumn[]): boolean {\n return columns.every((col) => !row.values[col.id])\n}\n\nfunction createEmptyRow(columns: ParameterTableColumn[], id: string): ParameterTableRow {\n const values: Record<string, string> = {}\n for (const col of columns) values[col.id] = ''\n return { id, values }\n}\n\n// trailing placeholder row 의 id 를 placeholderId 로 고정해 react key 안정성 확보.\n// 마지막 row 가 비어있지 않으면 placeholderId 를 가진 새 empty row 를 append.\n// 비어있지만 id 가 다르면 id 만 placeholderId 로 교체.\nfunction normalizeTrailing(\n rows: ParameterTableRow[],\n columns: ParameterTableColumn[],\n placeholderId: string,\n): ParameterTableRow[] {\n if (rows.length === 0 || !isRowEmpty(rows[rows.length - 1], columns)) {\n return [...rows, createEmptyRow(columns, placeholderId)]\n }\n const last = rows[rows.length - 1]\n if (last.id !== placeholderId) {\n return [...rows.slice(0, -1), { ...last, id: placeholderId }]\n }\n return rows\n}\n\nconst PARAMETER_TABLE_HISTORY_LIMIT = 100\n\nfunction cloneRows(rows: ParameterTableRow[]): ParameterTableRow[] {\n return rows.map((row) => ({ ...row, values: { ...row.values } }))\n}\n\n// printable single-character key 판별 (편집 모드 자동 진입용).\n// Excel/Sheets 와 동일: 활성 셀에서 알파벳/숫자/기호 키를 누르면 편집 모드 + 그 키로 시작.\n//\n// **ASCII printable 영역만** true 반환. 한글/일본어/중국어 등 non-ASCII 키는 native IME 가\n// composition 으로 처리해야 한다. 이 검사 없이 한글 자모 (예: 'ㄱ' charCode 12593) 가 통과되면\n// preventDefault + enterEdit('ㄱ') 으로 우리가 처리하는 동시에 IME 도 native 로 composition\n// 을 시작해 첫 문자가 두 번 입력되는 현상이 발생한다 (예: \"ㄱ가\").\nfunction isPrintableKey(event: React.KeyboardEvent): boolean {\n if (event.metaKey || event.ctrlKey || event.altKey) return false\n if (event.nativeEvent.isComposing) return false\n if (event.key === 'Process') return false\n if (event.key.length !== 1) return false\n const code = event.key.charCodeAt(0)\n // ASCII printable: U+0020 ~ U+007E. 그 외는 IME 처리.\n return code >= 0x20 && code <= 0x7e\n}\n\ninterface FloatingRect {\n left: number\n top: number\n width: number\n height: number\n}\n\nexport interface ParameterTableProps {\n value?: ParameterTableRow[]\n defaultValue?: ParameterTableRow[]\n onChange?: (rows: ParameterTableRow[]) => void\n columns?: ParameterTableColumn[]\n withHandle?: boolean\n spacing?: ParameterTableSpacing\n caption?: React.ReactNode\n disabled?: boolean\n className?: string\n /**\n * 셀별 invalid 표시. cellErrors[rowId][colId] === true 인 셀에 빨간 강조.\n * trailing placeholder 행은 자동으로 제외된다.\n */\n cellErrors?: ParameterTableCellErrors\n}\n\nconst ParameterTable = React.forwardRef<HTMLDivElement, ParameterTableProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n columns = DEFAULT_PARAMETER_TABLE_COLUMNS,\n withHandle = true,\n spacing = 'compact',\n caption,\n disabled = false,\n className,\n cellErrors,\n },\n ref,\n ) => {\n const isControlled = value !== undefined\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n const floatingInputRef = React.useRef<HTMLInputElement | null>(null)\n const setRootRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n const focusFloating = React.useCallback(() => {\n floatingInputRef.current?.focus({ preventScroll: true })\n }, [])\n\n // trailing placeholder row 의 id 를 cycle 간 stable 하게 유지.\n const [placeholderId, setPlaceholderId] = React.useState(newRowId)\n\n const [internalRows, setInternalRows] = React.useState<ParameterTableRow[]>(() =>\n normalizeTrailing(defaultValue ?? [], columns, placeholderId),\n )\n\n const rows = React.useMemo(\n () => normalizeTrailing(isControlled ? value! : internalRows, columns, placeholderId),\n [isControlled, value, internalRows, columns, placeholderId],\n )\n\n const placeholderRow = rows[rows.length - 1]\n const realRows = React.useMemo(() => rows.slice(0, -1), [rows])\n const realRowIds = React.useMemo(() => realRows.map((r) => r.id), [realRows])\n\n const [rowHistory, setRowHistory] = React.useState<ParameterTableRow[][]>([])\n const [redoStack, setRedoStack] = React.useState<ParameterTableRow[][]>([])\n\n /* ----------------- Cell selection state ----------------- */\n\n /** 현재 선택 영역. null 이면 아무 셀도 활성 아님. */\n const [selection, setSelection] = React.useState<CellRange | null>(null)\n /** 편집 모드에 진입한 셀. null 이면 비편집 (= 활성 상태). */\n const [editing, setEditing] = React.useState<CellCoord | null>(null)\n /** floating input 의 value. 편집 모드 중 사용자 입력 누적. */\n const [inputValue, setInputValue] = React.useState<string>('')\n /** 활성 셀(selection.focus) 의 위치/크기. floating input position 계산. */\n const [floatingRect, setFloatingRect] = React.useState<FloatingRect | null>(null)\n /** IME composition 진행 중 플래그. nativeEvent.isComposing 보조용. */\n const composingRef = React.useRef(false)\n /** 마우스 드래그 진행 여부. */\n const draggingRef = React.useRef(false)\n /** 편집 진입 시 cursor 위치 — 'all' / 'end'. useLayoutEffect 에서 적용 후 reset. */\n const pendingCursorRef = React.useRef<'all' | 'end' | null>(null)\n /** 재클릭 편집 진입 후보. mousedown 시점에 이미 단일 선택돼 있던 셀이면 그 좌표. */\n const reclickRef = React.useRef<CellCoord | null>(null)\n /** 재클릭으로 방금 편집을 연 직후 플래그. 같은 제스처의 두 번째 mousedown 이 floating input\n * 에서 단어 선택을 거는 것만 막는다. 그 외 상황의 더블클릭 단어 선택은 그대로 둔다. */\n const reclickEnteredRef = React.useRef(false)\n\n // window mouseup 으로 dragging 종료. mousedown/mouseenter 만으로는 셀 밖에서 mouseup 시 dragging 이 stuck 됨.\n React.useEffect(() => {\n if (disabled) return\n const onUp = () => {\n draggingRef.current = false\n }\n window.addEventListener('mouseup', onUp)\n return () => window.removeEventListener('mouseup', onUp)\n }, [disabled])\n\n /* ----------------- Floating input position 동기화 ----------------- */\n // selection.focus / rows / editing 변경 시 활성 셀의 td DOM 을 querySelector 로 찾아\n // 위치/크기 측정. ref forward 패턴보다 단순하며 SortableContext 의 transform 적용\n // 직후에도 정확. useLayoutEffect 라 React commit 직후 paint 전 동기화.\n React.useLayoutEffect(() => {\n if (!selection) {\n setFloatingRect(null)\n return\n }\n const root = rootRef.current\n if (!root) return\n const { rowIdx, colIdx } = selection.focus\n const cell = root.querySelector<HTMLTableCellElement>(\n `[data-row-idx=\"${rowIdx}\"][data-col-idx=\"${colIdx}\"]`,\n )\n if (!cell) {\n setFloatingRect(null)\n return\n }\n const cr = cell.getBoundingClientRect()\n const rr = root.getBoundingClientRect()\n setFloatingRect({\n left: cr.left - rr.left,\n top: cr.top - rr.top,\n width: cr.width,\n height: cr.height,\n })\n }, [selection, rows, editing])\n\n // 편집 진입 직후 cursor 위치 (select-all / end) 적용. inputValue 가 React state 로\n // 반영된 후 한 번만 실행.\n React.useLayoutEffect(() => {\n if (editing == null) return\n const cursor = pendingCursorRef.current\n if (cursor == null) return\n const input = floatingInputRef.current\n if (!input) return\n input.focus({ preventScroll: true })\n if (cursor === 'all') {\n input.select()\n } else {\n const len = input.value.length\n input.setSelectionRange(len, len)\n }\n pendingCursorRef.current = null\n }, [editing, inputValue])\n\n /* ----------------- Row history (undo/redo) ----------------- */\n\n const pushRowHistory = React.useCallback(() => {\n const snapshot = cloneRows(realRows)\n setRowHistory((prev) => [...prev.slice(-(PARAMETER_TABLE_HISTORY_LIMIT - 1)), snapshot])\n setRedoStack([])\n }, [realRows])\n\n const emit = React.useCallback(\n (next: ParameterTableRow[]) => {\n const filled = next.some((r) => r.id === placeholderId && !isRowEmpty(r, columns))\n const pid = filled ? newRowId() : placeholderId\n if (filled) setPlaceholderId(pid)\n const normalized = normalizeTrailing(next, columns, pid)\n if (!isControlled) setInternalRows(normalized)\n onChange?.(normalized)\n },\n [isControlled, onChange, placeholderId, columns],\n )\n\n const emitRealRows = React.useCallback(\n (nextRealRows: ParameterTableRow[]) => {\n emit([...nextRealRows, placeholderRow])\n },\n [emit, placeholderRow],\n )\n\n const undoLastRowOperation = React.useCallback(() => {\n const last = rowHistory[rowHistory.length - 1]\n if (!last) return\n const restoredRows = cloneRows(last)\n const currentSnapshot = cloneRows(realRows)\n setRowHistory((prev) => prev.slice(0, -1))\n setRedoStack((prev) => [...prev.slice(-(PARAMETER_TABLE_HISTORY_LIMIT - 1)), currentSnapshot])\n emitRealRows(restoredRows)\n setSelection(null)\n setEditing(null)\n setInputValue('')\n }, [emitRealRows, realRows, rowHistory])\n\n const redoLastRowOperation = React.useCallback(() => {\n const last = redoStack[redoStack.length - 1]\n if (!last) return\n const restoredRows = cloneRows(last)\n const currentSnapshot = cloneRows(realRows)\n setRedoStack((prev) => prev.slice(0, -1))\n setRowHistory((prev) => [\n ...prev.slice(-(PARAMETER_TABLE_HISTORY_LIMIT - 1)),\n currentSnapshot,\n ])\n emitRealRows(restoredRows)\n setSelection(null)\n setEditing(null)\n setInputValue('')\n }, [emitRealRows, realRows, redoStack])\n\n const handleDelete = React.useCallback(\n (rowId: string) => {\n if (!realRows.find((r) => r.id === rowId)) return\n pushRowHistory()\n const next = rows.filter((r) => r.id !== rowId)\n emit(next)\n setSelection(null)\n setEditing(null)\n setInputValue('')\n },\n [emit, pushRowHistory, realRows, rows],\n )\n\n /* ----------------- Cell helpers ----------------- */\n\n const totalRows = rows.length\n const totalCols = columns.length\n\n const clampCoord = React.useCallback(\n (c: CellCoord): CellCoord => ({\n rowIdx: Math.max(0, Math.min(totalRows - 1, c.rowIdx)),\n colIdx: Math.max(0, Math.min(totalCols - 1, c.colIdx)),\n }),\n [totalRows, totalCols],\n )\n\n const setCellValue = React.useCallback(\n (rowIdx: number, colId: string, val: string) => {\n const target = rows[rowIdx]\n if (!target) return\n const next = rows.map((r, i) =>\n i === rowIdx ? { ...r, values: { ...r.values, [colId]: val } } : r,\n )\n emit(next)\n },\n [emit, rows],\n )\n\n const clearRange = React.useCallback(\n (range: CellRange) => {\n const rect = normalizeRange(range)\n pushRowHistory()\n const next = rows.map((row, rIdx) => {\n if (rIdx < rect.top || rIdx > rect.bottom) return row\n if (rIdx === rows.length - 1) return row\n const nextValues = { ...row.values }\n for (let c = rect.left; c <= rect.right; c++) {\n const col = columns[c]\n if (col) nextValues[col.id] = ''\n }\n return { ...row, values: nextValues }\n })\n emit(next)\n },\n [columns, emit, pushRowHistory, rows],\n )\n\n const getRangeCells = React.useCallback(\n (range: CellRange): { cells: string[][]; colIds: string[] } => {\n const rect = normalizeRange(range)\n const colIds: string[] = []\n for (let c = rect.left; c <= rect.right; c++) {\n colIds.push(columns[c]?.id ?? '')\n }\n const cells: string[][] = []\n for (let r = rect.top; r <= rect.bottom; r++) {\n const row = rows[r]\n const cellRow: string[] = []\n for (let c = rect.left; c <= rect.right; c++) {\n const col = columns[c]\n cellRow.push(col ? (row?.values?.[col.id] ?? '') : '')\n }\n cells.push(cellRow)\n }\n return { cells, colIds }\n },\n [columns, rows],\n )\n\n /* ----------------- Editing 진입 / 종료 ----------------- */\n\n /** 편집 모드 진입. cursor 위치는 'all' (Enter/F2) 또는 'end' (더블클릭). */\n const enterEdit = React.useCallback(\n (coord: CellCoord, initial: string, cursor: 'all' | 'end') => {\n setInputValue(initial)\n setEditing(coord)\n setSelection({ anchor: coord, focus: coord })\n pendingCursorRef.current = cursor\n },\n [],\n )\n\n /** 편집 commit. moveNext 가 지정되면 그 방향으로 다음 셀 선택. focus 는 항상 floating input 에 유지. */\n const commitEdit = React.useCallback(\n (\n coord: CellCoord,\n val: string,\n moveNext: 'down' | 'up' | 'right' | 'left' | 'none' = 'none',\n ) => {\n const col = columns[coord.colIdx]\n if (!col) return\n const sanitizedVal = typeof val === 'string' ? (sanitizeUserText(val) as string) : val\n const prevVal = rows[coord.rowIdx]?.values?.[col.id] ?? ''\n if (prevVal !== sanitizedVal) {\n pushRowHistory()\n setCellValue(coord.rowIdx, col.id, sanitizedVal)\n }\n setEditing(null)\n setInputValue('')\n let nextCoord = coord\n if (moveNext === 'down') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx + 1, colIdx: coord.colIdx })\n } else if (moveNext === 'up') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx - 1, colIdx: coord.colIdx })\n } else if (moveNext === 'right') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx, colIdx: coord.colIdx + 1 })\n } else if (moveNext === 'left') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx, colIdx: coord.colIdx - 1 })\n }\n setSelection({ anchor: nextCoord, focus: nextCoord })\n },\n [clampCoord, columns, pushRowHistory, rows, setCellValue],\n )\n\n const cancelEdit = React.useCallback(() => {\n setEditing(null)\n setInputValue('')\n }, [])\n\n /* ----------------- Cell mouse handlers ----------------- */\n\n const handleCellMouseDown = React.useCallback(\n (coord: CellCoord, event: React.MouseEvent) => {\n if (disabled) return\n // 편집 중이었으면 먼저 commit. 다른 셀로 이동.\n if (editing) {\n const col = columns[editing.colIdx]\n if (col) {\n const sanitizedVal =\n typeof inputValue === 'string' ? (sanitizeUserText(inputValue) as string) : inputValue\n const prevVal = rows[editing.rowIdx]?.values?.[col.id] ?? ''\n if (prevVal !== sanitizedVal) {\n pushRowHistory()\n setCellValue(editing.rowIdx, col.id, sanitizedVal)\n }\n }\n setEditing(null)\n setInputValue('')\n }\n // 아래 setSelection 이 selection 을 덮어쓰므로 \"이미 선택돼 있었는가\" 는 여기서만 판별 가능.\n reclickRef.current =\n selection && coordEquals(selection.anchor, coord) && coordEquals(selection.focus, coord)\n ? coord\n : null\n reclickEnteredRef.current = false\n event.preventDefault()\n focusFloating()\n setSelection({ anchor: coord, focus: coord })\n draggingRef.current = true\n },\n [\n columns,\n disabled,\n editing,\n focusFloating,\n inputValue,\n pushRowHistory,\n rows,\n selection,\n setCellValue,\n ],\n )\n\n const handleCellMouseEnter = React.useCallback(\n (coord: CellCoord) => {\n if (disabled) return\n if (!draggingRef.current) return\n reclickRef.current = null // 드래그로 다른 셀 진입 = 범위 선택 의도.\n if (editing) return\n setSelection((prev) => (prev ? { anchor: prev.anchor, focus: coord } : null))\n },\n [disabled, editing],\n )\n\n const handleCellDoubleClick = React.useCallback(\n (coord: CellCoord) => {\n if (disabled) return\n const col = columns[coord.colIdx]\n const row = rows[coord.rowIdx]\n if (!col || !row) return\n enterEdit(coord, row.values[col.id] ?? '', 'end')\n focusFloating()\n },\n [columns, disabled, enterEdit, focusFloating, rows],\n )\n\n /** 이미 선택된 단일 셀 재클릭 → 편집 진입. 드래그 범위 선택을 죽이지 않도록 mousedown 이\n * 아닌 click 에서 처리하고, 더블클릭의 두 번째 클릭(detail > 1)은 기존 경로에 맡긴다. */\n const handleCellClick = React.useCallback(\n (coord: CellCoord, event: React.MouseEvent) => {\n const pending = reclickRef.current\n reclickRef.current = null\n if (event.detail > 1) return\n if (!pending || !coordEquals(pending, coord)) return\n reclickEnteredRef.current = true\n handleCellDoubleClick(coord)\n },\n [handleCellDoubleClick],\n )\n\n /* ----------------- Clipboard handlers ----------------- */\n\n const copySelection = React.useCallback(async (): Promise<boolean> => {\n if (!selection) return false\n const { cells, colIds } = getRangeCells(selection)\n const tsv = serializeCellsToTsv(cells)\n const json = serializeCellsToJson(cells, colIds)\n return writeCellsToClipboard(tsv, json)\n }, [getRangeCells, selection])\n\n const cutSelection = React.useCallback(async () => {\n if (!selection) return\n const didWrite = await copySelection()\n if (!didWrite) return\n clearRange(selection)\n }, [clearRange, copySelection, selection])\n\n const pasteAtSelection = React.useCallback(async () => {\n if (disabled || !selection) return\n const result = await readCellsFromClipboard()\n if (!result) return\n const rect = normalizeRange(selection)\n const startRow = rect.top\n const startCol = rect.left\n\n const cells = result.kind === 'json' ? result.payload.cells : result.cells\n if (cells.length === 0) return\n\n pushRowHistory()\n\n const requiredRowCount = startRow + cells.length\n const nextRealRows = [...realRows]\n while (nextRealRows.length < requiredRowCount) {\n nextRealRows.push({ id: newRowId(), values: {} })\n }\n\n for (let r = 0; r < cells.length; r++) {\n const targetRowIdx = startRow + r\n const targetRow = nextRealRows[targetRowIdx]\n if (!targetRow) continue\n const nextValues = { ...targetRow.values }\n const srcRow = cells[r] ?? []\n for (let c = 0; c < srcRow.length; c++) {\n const targetColIdx = startCol + c\n const targetCol = columns[targetColIdx]\n if (!targetCol) continue\n nextValues[targetCol.id] = srcRow[c] ?? ''\n }\n nextRealRows[targetRowIdx] = { ...targetRow, values: nextValues }\n }\n\n emitRealRows(nextRealRows)\n\n const endRow = startRow + cells.length - 1\n const maxColInPaste = cells.reduce((m, r) => Math.max(m, r.length), 0)\n const endCol = startCol + maxColInPaste - 1\n const newRange: CellRange = {\n anchor: { rowIdx: startRow, colIdx: startCol },\n focus: clampCoord({ rowIdx: endRow, colIdx: endCol }),\n }\n setSelection(newRange)\n setEditing(null)\n setInputValue('')\n }, [clampCoord, columns, disabled, emitRealRows, pushRowHistory, realRows, selection])\n\n /* ----------------- IME composition handlers ----------------- */\n\n const handleCompositionStart = React.useCallback(() => {\n composingRef.current = true\n // 비편집 모드에서 IME 가 시작되면 즉시 편집 진입. 단일 input element 라 composition\n // 이 끊기지 않고 그대로 진행된다. inputValue 는 '' 로 비워 기존 cell value 를\n // 덮어쓴다 (Excel/Sheets 와 동일 — 비편집 모드의 첫 typing 은 덮어쓰기).\n // F2/더블클릭으로 미리 편집 진입한 경우 (editing != null) 는 inputValue 를 건드리지\n // 않아 기존 cell value 뒤에 한글을 이어쓸 수 있게 한다.\n if (!editing && selection && !disabled) {\n setEditing(selection.focus)\n setInputValue('')\n }\n }, [disabled, editing, selection])\n\n const handleCompositionEnd = React.useCallback(() => {\n composingRef.current = false\n // composition end 후 input.value 가 최종 텍스트. onChange 로 inputValue 동기화됨.\n // commit 은 사용자가 Enter/Tab 등으로 명시할 때만 (Excel/Sheets 와 동일).\n }, [])\n\n /* ----------------- Focus 이탈 (root 외부 pointerdown) ----------------- */\n\n // root 외부에서 mousedown 이 일어나면 (다른 ParameterTable 의 셀 / 외부 버튼 /\n // 배경 클릭 등) selection 해제 + 편집 중이면 commit. floating input 의 onBlur 에\n // 의존하지 않는 이유: 자체 mousedown 의 preventDefault + 명시적 focus() 흐름에서\n // brower 마다 blur 이벤트 발사 시점이 불안정해 적용 안 되는 케이스가 실측됨. 반면\n // document mousedown 은 항상 dispatch 되므로 견고하다.\n //\n // 같은 PT 안의 셀 클릭은 root.contains 검사로 거름.\n const editingRef = React.useRef(editing)\n const inputValueRef = React.useRef(inputValue)\n React.useEffect(() => {\n editingRef.current = editing\n inputValueRef.current = inputValue\n }, [editing, inputValue])\n\n React.useEffect(() => {\n if (disabled) return\n const handler = (event: MouseEvent) => {\n const root = rootRef.current\n if (!root) return\n const target = event.target as Node | null\n if (target && root.contains(target)) return\n // 외부 mousedown — 편집 commit + selection 해제.\n const currentEditing = editingRef.current\n const currentInputValue = inputValueRef.current\n if (currentEditing) {\n const col = columns[currentEditing.colIdx]\n if (col) {\n const sanitizedVal =\n typeof currentInputValue === 'string'\n ? (sanitizeUserText(currentInputValue) as string)\n : currentInputValue\n const prevVal = rows[currentEditing.rowIdx]?.values?.[col.id] ?? ''\n if (prevVal !== sanitizedVal) {\n pushRowHistory()\n setCellValue(currentEditing.rowIdx, col.id, sanitizedVal)\n }\n }\n setEditing(null)\n setInputValue('')\n }\n setSelection(null)\n }\n document.addEventListener('pointerdown', handler, true)\n return () => document.removeEventListener('pointerdown', handler, true)\n }, [columns, disabled, pushRowHistory, rows, setCellValue])\n\n /* ----------------- Keyboard ----------------- */\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n // IME composition 중에는 우리 핸들러 비활성. native input + IME 가 처리.\n if (event.nativeEvent.isComposing || composingRef.current) return\n\n const isMod = event.metaKey || event.ctrlKey\n const key = event.key\n\n /* ---- 편집 모드 핸들링 ---- */\n if (editing) {\n if (key === 'Enter' && !isMod && !event.altKey) {\n event.preventDefault()\n commitEdit(editing, inputValue, event.shiftKey ? 'up' : 'down')\n return\n }\n if (key === 'Tab') {\n event.preventDefault()\n commitEdit(editing, inputValue, event.shiftKey ? 'left' : 'right')\n return\n }\n if (key === 'Escape') {\n event.preventDefault()\n cancelEdit()\n return\n }\n if (key === 'ArrowDown' && !isMod && !event.altKey) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'down')\n return\n }\n if (key === 'ArrowUp' && !isMod && !event.altKey) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'up')\n return\n }\n const input = floatingInputRef.current\n if (\n key === 'ArrowLeft' &&\n !isMod &&\n !event.altKey &&\n input &&\n input.selectionStart === 0 &&\n input.selectionEnd === 0\n ) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'left')\n return\n }\n if (\n key === 'ArrowRight' &&\n !isMod &&\n !event.altKey &&\n input &&\n input.selectionStart === input.value.length &&\n input.selectionEnd === input.value.length\n ) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'right')\n return\n }\n // 그 외 키 (텍스트 편집) — native input 이 처리.\n return\n }\n\n /* ---- 비편집 모드 핸들링 ---- */\n\n // Cmd+Z (undo) / Cmd+Shift+Z (redo)\n if (isMod && key.toLowerCase() === 'z' && !event.altKey) {\n event.preventDefault()\n if (event.shiftKey) redoLastRowOperation()\n else undoLastRowOperation()\n return\n }\n\n // Cmd+C / X / V / A\n if (isMod && !event.altKey && !event.shiftKey) {\n const k = key.toLowerCase()\n if (k === 'c') {\n event.preventDefault()\n void copySelection()\n return\n }\n if (k === 'x') {\n event.preventDefault()\n void cutSelection()\n return\n }\n if (k === 'v') {\n event.preventDefault()\n void pasteAtSelection()\n return\n }\n if (k === 'a') {\n event.preventDefault()\n const lastRealRow = Math.max(0, realRows.length - 1)\n const lastCol = Math.max(0, totalCols - 1)\n setSelection({\n anchor: { rowIdx: 0, colIdx: 0 },\n focus: { rowIdx: lastRealRow, colIdx: lastCol },\n })\n return\n }\n }\n\n if (!selection) return\n const focus = selection.focus\n\n // Backspace / Delete: 선택 셀 비우기.\n if ((key === 'Backspace' || key === 'Delete') && !isMod && !event.altKey) {\n event.preventDefault()\n clearRange(selection)\n return\n }\n\n // Esc: 선택 해제.\n if (key === 'Escape') {\n event.preventDefault()\n setSelection(null)\n return\n }\n\n // F2 / Enter: 편집 진입 (cursor end).\n if (key === 'F2' || (key === 'Enter' && !event.shiftKey && !isMod && !event.altKey)) {\n event.preventDefault()\n const col = columns[focus.colIdx]\n const row = rows[focus.rowIdx]\n if (!col || !row) return\n enterEdit(focus, row.values[col.id] ?? '', 'end')\n return\n }\n\n // Shift+Enter: 위 셀로 이동.\n if (key === 'Enter' && event.shiftKey && !isMod && !event.altKey) {\n event.preventDefault()\n const next = clampCoord({ rowIdx: focus.rowIdx - 1, colIdx: focus.colIdx })\n setSelection({ anchor: next, focus: next })\n return\n }\n\n // Home / End / Cmd+Home / Cmd+End.\n if (key === 'Home' || key === 'End') {\n event.preventDefault()\n const lastRealRow = Math.max(0, realRows.length - 1)\n const lastCol = Math.max(0, totalCols - 1)\n let nextCoord: CellCoord\n if (isMod) {\n nextCoord =\n key === 'Home' ? { rowIdx: 0, colIdx: 0 } : { rowIdx: lastRealRow, colIdx: lastCol }\n } else {\n nextCoord = {\n rowIdx: focus.rowIdx,\n colIdx: key === 'Home' ? 0 : lastCol,\n }\n }\n if (event.shiftKey) {\n setSelection({ anchor: selection.anchor, focus: nextCoord })\n } else {\n setSelection({ anchor: nextCoord, focus: nextCoord })\n }\n return\n }\n\n // 화살표.\n const arrowDelta: Record<string, [number, number]> = {\n ArrowUp: [-1, 0],\n ArrowDown: [1, 0],\n ArrowLeft: [0, -1],\n ArrowRight: [0, 1],\n }\n if (arrowDelta[key]) {\n event.preventDefault()\n const [dr, dc] = arrowDelta[key]\n const lastRealRow = Math.max(0, realRows.length - 1)\n const lastCol = Math.max(0, totalCols - 1)\n let next: CellCoord\n if (isMod) {\n next = {\n rowIdx: dr === 0 ? focus.rowIdx : dr < 0 ? 0 : lastRealRow,\n colIdx: dc === 0 ? focus.colIdx : dc < 0 ? 0 : lastCol,\n }\n } else {\n next = clampCoord({ rowIdx: focus.rowIdx + dr, colIdx: focus.colIdx + dc })\n }\n if (event.shiftKey) {\n setSelection({ anchor: selection.anchor, focus: next })\n } else {\n setSelection({ anchor: next, focus: next })\n }\n return\n }\n\n // Tab / Shift+Tab.\n if (key === 'Tab') {\n event.preventDefault()\n const dc = event.shiftKey ? -1 : 1\n let nextCol = focus.colIdx + dc\n let nextRow = focus.rowIdx\n if (nextCol >= totalCols) {\n nextCol = 0\n nextRow = Math.min(totalRows - 1, nextRow + 1)\n } else if (nextCol < 0) {\n nextCol = totalCols - 1\n nextRow = Math.max(0, nextRow - 1)\n }\n const next: CellCoord = { rowIdx: nextRow, colIdx: nextCol }\n setSelection({ anchor: next, focus: next })\n return\n }\n\n // Printable key (비-IME, 비-Mod): 편집 진입 + 그 키로 시작 (덮어쓰기).\n // preventDefault 하면 native 가 input.value 에 키를 안 넣지만, 우리가 inputValue=key\n // 로 controlled state 를 설정하므로 같은 효과. cursor 는 end 로.\n if (isPrintableKey(event)) {\n event.preventDefault()\n enterEdit(focus, key, 'end')\n return\n }\n },\n [\n cancelEdit,\n clampCoord,\n clearRange,\n columns,\n commitEdit,\n copySelection,\n cutSelection,\n disabled,\n editing,\n enterEdit,\n inputValue,\n pasteAtSelection,\n realRows,\n redoLastRowOperation,\n rows,\n selection,\n totalCols,\n totalRows,\n undoLastRowOperation,\n ],\n )\n\n /* ----------------- DnD (행 드래그) ----------------- */\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n const handleDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = realRows.findIndex((r) => r.id === active.id)\n const newIndex = realRows.findIndex((r) => r.id === over.id)\n if (oldIndex === -1 || newIndex === -1) return\n const reorderedReal = arrayMove(realRows, oldIndex, newIndex)\n pushRowHistory()\n emit([...reorderedReal, placeholderRow])\n setSelection(null)\n setEditing(null)\n setInputValue('')\n },\n [realRows, placeholderRow, pushRowHistory, emit],\n )\n\n /* ----------------- Render ----------------- */\n const colWidths = PARAMETER_TABLE_COL_WIDTHS[spacing]\n const selectionRect = selection ? normalizeRange(selection) : null\n\n const floatingInputStyle: React.CSSProperties = floatingRect\n ? {\n left: `${floatingRect.left}px`,\n top: `${floatingRect.top}px`,\n width: `${floatingRect.width}px`,\n height: `${floatingRect.height}px`,\n }\n : {\n // selection 없을 땐 off-screen. focus 는 받을 수 있도록 visible 유지하지 않음.\n left: '-9999px',\n top: '-9999px',\n width: '1px',\n height: '1px',\n }\n\n return (\n <div\n ref={setRootRef}\n className={cn(\n 't3q-parameter-table w-full focus:outline-none',\n `t3q-parameter-table--${spacing}`,\n disabled && 't3q-parameter-table--disabled opacity-50 pointer-events-none',\n className,\n )}\n data-disabled={disabled || undefined}\n // opacity-50 으로 흐려진 텍스트는 비활성 영역임을 보조기기에도 알린다 (axe 는 aria-disabled 영역의 대비를 면제)\n aria-disabled={disabled || undefined}\n >\n {caption && <div className='mb-[8px] text-base-medium text-sys-text-main'>{caption}</div>}\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n {/*\n DS Table 기본은 `border-collapse: collapse`. border-collapse 는 인접 td 의 border 를\n 0.5px 씩 분배해 첫/중간/마지막 행 사이에 셀 내부 가용 height 가 sub-pixel 다르게 보이는\n 원인이 됨. `border-separate` + `border-spacing-0` 로 변경하면 각 td 가 독립 박스를 갖고\n inner content 가 정확히 같은 위치에 그려진다.\n */}\n <Table className='!border-separate !border-spacing-0'>\n <TableHeader spacing={spacing}>\n <TableRow>\n {withHandle && (\n <TableHead align='center' style={{ width: `${colWidths.handle}px` }}>\n {/* 시각적으로 빈 열이지만 스크린리더용 헤더 텍스트는 필요하다(axe empty-table-header) */}\n <span className='sr-only'>순서 변경</span>\n </TableHead>\n )}\n {columns.map((col) => (\n <TableHead\n key={col.id}\n align='left'\n style={\n col.width\n ? { width: typeof col.width === 'number' ? `${col.width}px` : col.width }\n : undefined\n }\n >\n {col.header}\n {col.required && (\n <span className='ml-[2px] text-small-medium text-danger30'>*</span>\n )}\n </TableHead>\n ))}\n <TableHead align='center' style={{ width: `${colWidths.delete}px` }}>\n <span className='sr-only'>삭제</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody spacing={spacing}>\n <SortableContext items={realRowIds} strategy={verticalListSortingStrategy}>\n {rows.map((row, rowIdx) => {\n const isPlaceholder = rowIdx === rows.length - 1\n return (\n <ParameterTableRowComponent\n key={row.id}\n row={row}\n rowIdx={rowIdx}\n columns={columns}\n spacing={spacing}\n withHandle={withHandle}\n disabled={disabled}\n isPlaceholder={isPlaceholder}\n selectionRect={selectionRect}\n editingCell={editing}\n cellErrors={cellErrors}\n onCellMouseDown={handleCellMouseDown}\n onCellMouseEnter={handleCellMouseEnter}\n onCellClick={handleCellClick}\n onCellDoubleClick={handleCellDoubleClick}\n onDelete={() => handleDelete(row.id)}\n />\n )\n })}\n </SortableContext>\n </TableBody>\n </Table>\n {/*\n 단일 floating input — 모든 셀의 편집 input 역할. 비편집 모드에서도 mount 되어\n focus 를 받음. IME composition 이 시작되면 input element 가 그대로 유지되므로\n 한국어/일본어/중국어 자모가 분리되지 않는다. 위치는 useLayoutEffect 으로 활성\n cell rect 에 동기화.\n */}\n <input\n ref={floatingInputRef}\n type='text'\n className={cn(\n 't3q-pt-floating-input text-base-medium',\n editing && 't3q-pt-floating-input--editing',\n )}\n style={floatingInputStyle}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onMouseDown={(event) => {\n // 재클릭으로 막 열린 편집 위에서 이어진 더블클릭. 단어 선택은 이 mousedown 의\n // default action 이므로 여기서만 막아 커서를 'end' 로 유지한다.\n if (reclickEnteredRef.current && event.detail > 1) event.preventDefault()\n reclickEnteredRef.current = false\n }}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n aria-label={\n editing && columns[editing.colIdx]\n ? columns[editing.colIdx].header\n : 'Parameter table cell editor'\n }\n tabIndex={disabled ? -1 : 0}\n disabled={disabled}\n autoComplete='off'\n spellCheck={false}\n />\n </DndContext>\n </div>\n )\n },\n)\nParameterTable.displayName = 'ParameterTable'\n\nexport { ParameterTable }\n","'use client'\n\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\n\nimport { cn } from '../utils/cn'\n\n/** 막대 색 — 작업 상태와 연동(실패한 작업의 막대가 파란색이면 상태와 어긋난다, 2026-10-16 이슈 47) */\nconst indicatorVariants = {\n primary: 'bg-primary30',\n success: 'bg-success30',\n warning: 'bg-warning30',\n danger: 'bg-danger30',\n} as const\n\ninterface ProgressProps extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {\n /** 진행률 (0–100). 없으면 indeterminate */\n value?: number\n /** 막대 색. 기본 `primary`. 상태 Badge 의 tone 과 맞춘다 — 실패 `danger`, 경고 `warning`, 완료 `success` */\n variant?: keyof typeof indicatorVariants\n}\n\n/**\n * 가로 진행 막대(role=progressbar). 표의 진행률 열, 자원 사용량, 작업 진행에 쓴다.\n *\n * 언제 쓰나: 0~100 의 비율을 길이로 보여 줄 때. 이름은 `aria-label` 로 준다 — 표에서는 행마다 `'GPU 사용률 46%'` 처럼 **무엇의 비율인지**.\n * 이름을 안 주면 `'46%'`(값이 없으면 `'진행 중'`)를 기본 이름으로 붙인다 — 이름 없는 progressbar 는 axe serious(aria-progressbar-name, 2026-10-20 17차). 기본 이름은 숫자뿐이라 뜻이 약하니 호출자가 주는 것이 맞다.\n * 언제 안 쓰나: 단계가 있는 진행(→ Stepper), 불확정 대기(→ Spinner).\n * 대신/함께: 막대 옆에 % 글자를 같이 둔다(`tabular-nums`). 색(`variant`)은 **값의 뜻대로** — 높을수록 좋은 비율(정상 행·통과율·완료율)은 기본(primary)이나 success, 낮을수록 좋은 값의 경고 구간만 warning·danger. 페이지·항목의 실패 상태에 맞춰 칠하지 않는다(2026-11-06 홀드아웃 20: \"정상 행 99%\" 막대가 빨강).\n */\nconst Progress = React.forwardRef<React.ElementRef<typeof ProgressPrimitive.Root>, ProgressProps>(\n ({ value, variant = 'primary', className, ...props }, ref) => {\n // 접근성 이름 — 호출자가 aria-label/aria-labelledby 를 주면 그대로, 없으면 값으로 채운다(이름 없는 progressbar 는 axe serious)\n const ariaLabel =\n props['aria-label'] ??\n (props['aria-labelledby'] ? undefined : value == null ? '진행 중' : `${Math.round(value)}%`)\n const percentage = useMemo(() => {\n const resultValue = -(100 - (value || 0))\n return `${resultValue}%`\n }, [value])\n\n return (\n <ProgressPrimitive.Root\n ref={ref}\n // value 를 Root 에 넘겨야 aria-valuenow 가 붙고 indeterminate 로 취급되지 않는다\n value={value}\n {...props}\n aria-label={ariaLabel}\n className={cn(\n 'relative h-[8px] w-full overflow-hidden rounded-full bg-secondary30',\n className,\n )}\n >\n <ProgressPrimitive.Indicator\n className={cn('h-full w-full flex-1 transition-all', indicatorVariants[variant])}\n style={{ transform: `translateX(${percentage})` }}\n />\n </ProgressPrimitive.Root>\n )\n },\n)\n\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\nexport type { ProgressProps }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\ninterface RadioProps extends React.HTMLAttributes<HTMLDivElement> {\n checked?: boolean\n disabled?: boolean\n}\n\n/**\n * 시각적 라디오 인디케이터 컴포넌트\n * RadioGroup 없이 독립적으로 사용 가능 (AG Grid 셀 렌더러 등)\n *\n * 단일 선택 라디오 버튼 하나. 보통 RadioGroup 안에서 쓴다.\n *\n * 언제 쓰나: 2~5개 선택지 중 하나를 고르고, 선택지를 한눈에 보여야 할 때.\n * 언제 안 쓰나: 선택지가 많을 때(→ Select), 복수 선택(→ Checkbox), 제목·설명이 붙은 큰 선택 카드(→ RadioSection).\n * 대신/함께: 단독으로 쓰지 말고 RadioGroup 으로 묶어 키보드 이동과 그룹 이름을 받는다.\n */\nfunction Radio({ checked = false, disabled = false, className, ...props }: RadioProps) {\n return (\n <div\n role='radio'\n aria-checked={checked}\n aria-disabled={disabled}\n data-state={checked ? 'checked' : 'unchecked'}\n className={cn(\n 'relative border-[2px] border-sys-divider-main w-[16px] h-[16px] rounded-full aspect-square shrink-0',\n !disabled && 'hover:bg-secondary-o10',\n disabled && 'border-secondary-o10 bg-secondary-o20 cursor-not-allowed',\n checked && !disabled && 'bg-primary30 border-none hover:bg-primary40',\n checked && disabled && 'bg-primary-o20 border-none',\n className,\n )}\n {...props}\n >\n {checked && (\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 w-[6px] h-[6px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-sys-background',\n )}\n />\n )}\n </div>\n )\n}\n\nexport { Radio }\n","'use client'\n\nimport * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cn } from '../utils/cn'\n\n/**\n * Radio 묶음. 폼에서 2~5개 선택지 중 하나를 고를 때 쓴다.\n *\n * 언제 쓰나: 유형·방식 선택처럼 선택지가 적고 항상 보여야 할 때. `FormField` 안에서 `onValueChange` 를 연결한다.\n * 언제 안 쓰나: 선택지가 6개 이상(→ Select), 복수 선택(→ Checkbox), 선택지마다 제목·설명이 필요한 카드형(→ RadioSectionGroup).\n * 대신/함께: 선택에 따라 아래 필드가 바뀌면 반대 분기의 값은 `reset` 으로 비운다(`trigger` 는 빈 필수 필드를 즉시 오류로 띄운다).\n */\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot='radio-group'\n className={cn('flex', className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot='radio-group-item'\n className={cn(\n 'border-[2px] border-sys-divider-main w-[16px] h-[16px] rounded-full aspect-square shrink-0 m-[4px]',\n 'hover:bg-secondary-o10 disabled:border-secondary-o10 disabled:bg-secondary-o20 disabled:cursor-not-allowed',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n 'data-[state=\"checked\"]:bg-primary30 data-[state=\"checked\"]:border-none data-[state=\"checked\"]:hover:bg-primary40 data-[state=\"checked\"]:hover:border-primary40 data-[state=\"checked\"]:disabled:bg-primary-o20 data-[state=\"checked\"]:disabled:border-none',\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot='radio-group-indicator'\n className='relative flex items-center justify-center'\n >\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 w-[6px] h-[6px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-sys-background',\n )}\n ></span>\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","'use client'\n\nimport * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cn } from '../utils/cn'\nimport { Radio } from './radio'\n\n/* -------------------------------------------------------------------------- */\n/* RadioSectionGroup */\n/* -------------------------------------------------------------------------- */\n\ntype RadioSectionGroupContextValue = {\n value?: string | null\n /** 5개 이상 자동 세로 쌓기 — 카드 안은 제목·설명을 한 줄에(가로) */\n stacked: boolean\n}\n\nconst RadioSectionGroupContext = React.createContext<RadioSectionGroupContextValue | null>(null)\n\ntype RadioSectionGroupProps = React.ComponentProps<typeof RadioGroupPrimitive.Root>\n\n/**\n * 카드형 라디오(RadioSection)들을 묶는 그룹.\n *\n * 언제 쓰나: 선택지마다 제목·설명이 붙는 유형·방식 선택(2개 이상). 설명 없는 짧은 선택은 RadioGroup, 7개 이상·검색이 필요하면 Select.\n *\n * Radix RadioGroup 위에 올려 `role='radiogroup'`, roving tabindex, 화살표 키 이동,\n * 단일 선택(value/onValueChange)을 제공한다. 자식으로 `<RadioSection value=... />` 를 둔다.\n *\n * `orientation`(기본 'horizontal')이 레이아웃과 방향키 축을 함께 결정한다:\n * - 'horizontal' → **개수에 맞춘 grid**: 1~3개 한 줄(n 등분), **4개 2×2**, **5개 이상 세로 쌓기**(카드 안은 제목·설명 가로, 방향키도 Up/Down).\n * 폼 열 720px 에 카드 4개를 한 줄에 두면 170px 씩이라 설명이 3~4줄로 접혀 \"cramped\" 로 읽혔다(한 줄 판 12차·상세 판 11차 폼, 2026-10-18 13차).\n * 2×2 에서는 Left/Right 가 DOM 순서로 돈다\n * - 'vertical' → 세로 배치(flex col) + Up/Down 으로 이동 (개수와 무관, 카드 안은 세로 그대로)\n *\n * 그룹 접근성 이름은 `aria-label`(문자열) 또는 `aria-labelledby`(id) 로 전달한다.\n * controlled 사용을 전제로 한다(`value` + `onValueChange`).\n */\nfunction RadioSectionGroup({\n className,\n value,\n orientation = 'horizontal',\n children,\n ...props\n}: RadioSectionGroupProps) {\n const count = React.Children.count(children)\n // 가로 배치는 개수로 정한다 — 5개 이상은 세로로 쌓고 방향키 축도 세로로(2026-10-18 13차, 사용자 \"radio section 이 4개 이상일 때 처리 방식\")\n const stacked = orientation === 'horizontal' && count >= 5\n const effectiveOrientation = stacked ? 'vertical' : orientation\n const layoutClass =\n effectiveOrientation === 'vertical'\n ? 'flex flex-col'\n : count === 4\n ? 'grid w-full grid-cols-2'\n : count === 3\n ? 'grid w-full grid-cols-3'\n : count === 2\n ? 'grid w-full grid-cols-2'\n : 'flex w-full'\n return (\n <RadioSectionGroupContext.Provider value={{ value, stacked }}>\n <RadioGroupPrimitive.Root\n data-slot='radio-section-group'\n value={value}\n orientation={effectiveOrientation}\n // orientation 에 맞춰 레이아웃과 방향키 축(가로=Left/Right, 세로=Up/Down)을 일치시킨다\n // 카드 사이 8: 4 는 원문 심판이 \"option-card grid has very tight gutters\" 로 감점(2026-10-18 13차 폼) → 붙어 있는 요소 간격 8 (2026-10-19 14차)\n className={cn('items-stretch gap-[8px]', layoutClass, className)}\n {...props}\n >\n {children}\n </RadioGroupPrimitive.Root>\n </RadioSectionGroupContext.Provider>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* RadioSection */\n/* -------------------------------------------------------------------------- */\n\ninterface RadioSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n title: string\n description?: string\n selected?: boolean\n disabled?: boolean\n onSelect?: () => void\n /** RadioSectionGroup 안에서 사용할 때 필수 — 그룹의 선택 value 와 매칭된다. */\n value?: string\n}\n\n/**\n * 카드형 라디오 — 제목 + 설명이 있는 카드 안에 Radio 인디케이터. 유형·방식 선택의 기본.\n *\n * 언제 쓰나: 소스 유형·공개 범위·입력 방식처럼 선택지가 2개 이상이고 선택지마다 제목과 한 줄 설명이 붙을 때 — `RadioSectionGroup` 안에 `value`·`title`·`description` 으로(dl-ui-v3 의 유형 선택 관례). 배치는 그룹이 개수로 정한다(1~3개 한 줄, 4개 2×2, 5개 이상 세로).\n * 언제 안 쓰나: 설명이 없는 짧은 선택(예·아니오, 켬·끔)은 RadioGroup, 선택지 7개 이상·검색이 필요하면 Select, 복수 선택은 Checkbox.\n * 대신/함께: 폼에서는 `FormField` 의 `field.value`/`field.onChange` 를 `RadioSectionGroup` 의 `value`/`onValueChange` 에 연결하고, 그룹에 `aria-labelledby` 로 FormLabel 의 id 를 건다(예제 form-page.tsx 의 스케줄 선택).\n *\n * 두 가지 사용 방식:\n * - **그룹 모드**: `<RadioSectionGroup>` 안에서 `value` 와 함께 사용 → Radix Item 으로 동작하여\n * role=radio / roving tabindex / aria-checked / 화살표·Space 키를 그룹이 관리한다.\n * - **단독 모드(하위호환)**: `selected` / `onSelect` 로 부모가 직접 제어. (기존 동작 그대로)\n */\nfunction RadioSection({\n title,\n description,\n selected = false,\n disabled = false,\n onSelect,\n value,\n className,\n onClick,\n onKeyDown,\n ...props\n}: RadioSectionProps) {\n const group = React.useContext(RadioSectionGroupContext)\n const inGroup = group !== null\n const isSelected = inGroup ? group.value === value : selected\n // 그룹이 5개 이상을 세로로 쌓을 때는 카드 안을 한 줄(제목 · 설명)로 — 세로 카드 5개는 너무 길다\n const stacked = inGroup && group.stacked\n\n const cardClassName = cn(\n 'bg-sys-background flex flex-col items-start overflow-clip rounded-medium w-full',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n // 테두리는 선택 여부와 무관하게 1px(layout shift 0) — 선택은 색 + 연한 채움으로. 2px 선택 테두리·연한 비선택 테두리는\n // \"heavy blue borders on selected cards\"·\"unselected radio card's faint border\" 로 두 심판 모두 감점 (2026-10-20 16차 D2)\n 'border p-[12px]',\n !isSelected && 'border-sys-divider-main',\n isSelected && !disabled && 'border-primary30 bg-primary-o10',\n isSelected && disabled && 'border-primary-o20',\n // disabled 시 포인터 이벤트 차단 — 그룹(asChild) 모드에선 네이티브 disabled 가 없어\n // 클릭 선택이 막히지 않으므로 CSS 로 차단(키보드/roving 제외는 Radix 가 처리).\n disabled ? 'cursor-not-allowed pointer-events-none' : 'cursor-pointer',\n className,\n )\n\n const body = (\n <div className='flex gap-[4px] items-start w-full'>\n <div\n className='flex items-center justify-center p-[4px] shrink-0 size-[24px]'\n aria-hidden='true'\n >\n <Radio checked={isSelected} disabled={disabled} />\n </div>\n <div\n data-slot='radio-section-text'\n className={cn(\n 'flex flex-1 min-w-0',\n stacked\n ? 'flex-row flex-wrap items-baseline gap-x-[12px] gap-y-[2px]'\n : 'flex-col gap-[4px] items-start',\n )}\n >\n <span\n className={cn(\n 'block text-h5 break-keep wrap-break-word',\n stacked ? 'shrink-0' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-main',\n )}\n >\n {title}\n </span>\n {description && (\n <span\n className={cn(\n 'block text-base-regular break-keep wrap-break-word',\n stacked ? 'min-w-0 flex-1' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-subtle',\n )}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n )\n\n // 그룹 모드: Radix Item 을 네이티브 <button> 으로 렌더(asChild 미사용).\n // Radix Radio 의 키보드 활성화(Space/Enter→native click, 화살표 selection-follows-focus)는\n // 네이티브 <button> 에 의존하므로, <div> 로 만들면 키보드 선택이 동작하지 않는다.\n if (inGroup) {\n return (\n <RadioGroupPrimitive.Item\n value={value as string}\n disabled={disabled}\n className={cn(cardClassName, 'appearance-none text-left')}\n {...(props as Omit<\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>,\n 'value' | 'disabled' | 'className' | 'children'\n >)}\n >\n {body}\n </RadioGroupPrimitive.Item>\n )\n }\n\n // 단독 모드(하위호환): 부모가 selected/onSelect 로 직접 제어\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(e)\n // radio 시맨틱: 이미 선택된 항목 재클릭은 no-op\n if (disabled || isSelected) return\n onSelect?.()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (disabled) return\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault()\n // radio 시맨틱: 이미 선택된 항목은 재선택하지 않음 (Space 스크롤 방지는 유지)\n if (isSelected) return\n onSelect?.()\n }\n }\n\n return (\n <div\n role='radio'\n aria-checked={isSelected}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n data-state={isSelected ? 'checked' : 'unchecked'}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cardClassName}\n {...props}\n >\n {body}\n </div>\n )\n}\n\nexport { RadioSection, RadioSectionGroup }\nexport type { RadioSectionProps, RadioSectionGroupProps }\n","'use client'\n\nimport * as React from 'react'\n\nimport type { MultiSelectContextValue } from './types'\n\nconst MultiSelectContext = React.createContext<MultiSelectContextValue | null>(null)\n\nexport function useMultiSelectContext() {\n const context = React.useContext(MultiSelectContext)\n if (!context) {\n throw new Error('MultiSelect compound components must be used within <MultiSelect>')\n }\n return context\n}\n\nexport { MultiSelectContext }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../../utils/cn'\nimport { MultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectContextValue, MultiSelectProps } from './types'\n\n/**\n * 드롭다운에서 여러 개를 고르는 폼 입력. 선택한 항목은 칩으로 보여 준다.\n *\n * 언제 쓰나: 태그·권한·대상 목록처럼 0개 이상을 고르는 폼 필드. 구성은 Select 와 같다(MultiSelectTrigger·Content·Item).\n * 언제 안 쓰나: 하나만 고르는 경우(→ Select), 선택지가 적어 한눈에 보여야 하는 경우(→ Checkbox 묶음), 목록 화면 필터(→ TableFilterMultiSelect).\n * 대신/함께: 칩 라벨도 마운트된 아이템에서 얻으므로 미로드 값은 `useMultiSelectContext().registerLabel` 로 등록한다.\n */\nfunction MultiSelect({\n value: controlledValue,\n defaultValue,\n onValueChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n onSearchChange,\n disabled,\n className,\n children,\n}: MultiSelectProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState<string[]>(defaultValue ?? [])\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const [searchTerm, setSearchTerm] = React.useState('')\n\n // searchTerm 이 바뀔 때마다 외부 콜백 호출.\n // typing / 토글 reset / popup close reset 모두 fire 됨.\n React.useEffect(() => {\n onSearchChange?.(searchTerm)\n }, [searchTerm, onSearchChange])\n\n const isControlledValue = controlledValue !== undefined\n const isControlledOpen = controlledOpen !== undefined\n\n const values = isControlledValue ? controlledValue : uncontrolledValue\n const open = isControlledOpen ? controlledOpen : uncontrolledOpen\n\n const [labelMap] = React.useState(() => new Map<string, string>())\n\n const registerLabel = React.useCallback(\n (itemValue: string, label: string) => {\n labelMap.set(itemValue, label)\n },\n [labelMap],\n )\n\n const handleToggleValue = React.useCallback(\n (toggleValue: string) => {\n const newValues = values.includes(toggleValue)\n ? values.filter((v) => v !== toggleValue)\n : [...values, toggleValue]\n if (!isControlledValue) {\n setUncontrolledValue(newValues)\n }\n onValueChange?.(newValues)\n setSearchTerm('')\n },\n [values, isControlledValue, onValueChange],\n )\n\n const handleRemoveValue = React.useCallback(\n (removeValue: string) => {\n const newValues = values.filter((v) => v !== removeValue)\n if (!isControlledValue) {\n setUncontrolledValue(newValues)\n }\n onValueChange?.(newValues)\n },\n [values, isControlledValue, onValueChange],\n )\n\n const handleClearAll = React.useCallback(() => {\n if (!isControlledValue) {\n setUncontrolledValue([])\n }\n onValueChange?.([])\n }, [isControlledValue, onValueChange])\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n if (!isControlledOpen) {\n setUncontrolledOpen(newOpen)\n }\n // 닫힐 때 검색어 리셋\n if (!newOpen) {\n setSearchTerm('')\n }\n onOpenChange?.(newOpen)\n },\n [isControlledOpen, onOpenChange],\n )\n\n const contextValue = React.useMemo<MultiSelectContextValue>(\n () => ({\n open,\n setOpen: handleOpenChange,\n values,\n onToggleValue: handleToggleValue,\n onRemoveValue: handleRemoveValue,\n onClearAll: handleClearAll,\n disabled,\n labelMap,\n registerLabel,\n searchTerm,\n setSearchTerm,\n }),\n [\n open,\n handleOpenChange,\n values,\n handleToggleValue,\n handleRemoveValue,\n handleClearAll,\n disabled,\n labelMap,\n registerLabel,\n searchTerm,\n ],\n )\n\n return (\n <MultiSelectContext.Provider value={contextValue}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange} modal>\n <div data-slot='multi-select' className={cn('relative', className)}>\n {children}\n </div>\n </PopoverPrimitive.Root>\n </MultiSelectContext.Provider>\n )\n}\n\nexport { MultiSelect }\n","'use client'\n\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\n/**\n * 닫힌 Select·MultiSelect 의 항목이 \"코드→이름\" 짝만 등록하게 하는 모드.\n *\n * 항목은 마운트될 때 `registerLabel` 로 이름을 알리는데 닫힌 목록은 항목을 그리지 않아, 값이 미리 정해진 폼에서 트리거가\n * 펼치기 전까지 원값('utilization', '5')을 보였다(2026-10-30 홀드아웃 17 세트 2 폼 2쌍 copy_quality). 닫혀 있는 동안 SelectContent\n * 가 children 을 이 모드로 한 번 더 그리고, 각 부품은 이 모드에서 등록만 하고 아무것도 그리지 않는다(cmdk 틀 밖이라 그릴 수도 없다).\n */\nconst LabelPassContext = React.createContext(false)\n\n/** 라벨 등록 모드인가 — true 면 항목은 등록만 하고 null, 묶음은 children 만, 나머지는 null 을 그린다 */\nexport const useLabelPass = (): boolean => React.useContext(LabelPassContext)\n\n/**\n * children 을 라벨 등록 모드로 그린다. 부품이 아닌 마크업(호출부가 SelectContent 안에 직접 넣은 `<div>` 등)이 폼 레이아웃에\n * 끼어들지 않도록 body 의 숨긴 상자에 붙인다. 서버·첫 렌더에는 그리지 않는다(마운트 뒤 effect 로 등록되는 것은 원래와 같다).\n */\nexport function LabelPass({ children }: { children: React.ReactNode }) {\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => setMounted(true), [])\n if (!mounted) return null\n return createPortal(\n <div hidden data-slot='select-label-pass'>\n <LabelPassContext.Provider value>{children}</LabelPassContext.Provider>\n </div>,\n document.body,\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { LabelPass } from '../_internal/labelPass'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectContentProps } from './types'\n\nconst MultiSelectContent = React.forwardRef<HTMLDivElement, MultiSelectContentProps>(\n ({ className, children, align = 'start', sideOffset = 4, ...props }, ref) => {\n const { open, searchTerm, setSearchTerm } = useMultiSelectContext()\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // 열릴 때 선택된 항목으로 스크롤\n React.useEffect(() => {\n if (open) {\n requestAnimationFrame(() => {\n const checkedItem = listRef.current?.querySelector('[data-state=checked]')\n if (checkedItem && typeof checkedItem.scrollIntoView === 'function') {\n checkedItem.scrollIntoView({ block: 'nearest' })\n }\n })\n }\n }, [open])\n\n return (\n <>\n {/* 닫혀 있는 동안 항목이 이름만 등록해 트리거가 펼치기 전에도 원값 대신 이름을 보인다 (2026-10-30 홀드아웃 17) */}\n {open ? null : <LabelPass>{children}</LabelPass>}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n data-slot='multi-select-content'\n // Radix Popover 콘텐츠는 role=dialog 라 이름이 필요하다(axe aria-dialog-name). 호출부 aria-label 이 있으면 {...props} 가 덮는다\n aria-label='옵션 목록'\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-[var(--root-z-index)] min-w-[var(--radix-popover-trigger-width)] origin-(--radix-popover-content-transform-origin) overflow-hidden rounded-small shadow-gray-medium bg-sys-background border border-sys-divider-subtler',\n 'data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]',\n 'data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]',\n 'data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]',\n className,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n {...props}\n >\n <CommandPrimitive\n filter={(_value, search, keywords) => {\n const lowerSearch = search.toLowerCase()\n if (keywords?.some((kw) => kw.toLowerCase().includes(lowerSearch))) return 1\n return 0\n }}\n value=''\n onValueChange={() => {}}\n >\n {/* 숨겨진 cmdk Input: trigger의 searchTerm을 cmdk 필터에 연결 */}\n <CommandPrimitive.Input\n value={searchTerm}\n onValueChange={setSearchTerm}\n className='sr-only'\n aria-hidden='true'\n tabIndex={-1}\n />\n\n {(() => {\n const inputChildren: React.ReactNode[] = []\n const restChildren: React.ReactNode[] = []\n\n React.Children.forEach(children, (child) => {\n if (\n React.isValidElement(child) &&\n (child.type as any)?.displayName === 'MultiSelectInput'\n ) {\n inputChildren.push(child)\n } else {\n restChildren.push(child)\n }\n })\n\n return (\n <>\n {inputChildren}\n <CommandPrimitive.List\n ref={listRef}\n role='listbox'\n aria-multiselectable='true'\n className='max-h-[300px] overflow-y-auto overflow-x-hidden scroll-py-1'\n >\n {restChildren}\n </CommandPrimitive.List>\n </>\n )\n })()}\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </>\n )\n },\n)\nMultiSelectContent.displayName = 'MultiSelectContent'\n\nexport { MultiSelectContent }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { MultiSelectEmptyProps } from './types'\n\nconst MultiSelectEmpty = React.forwardRef<HTMLDivElement, MultiSelectEmptyProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <CommandPrimitive.Empty\n ref={ref}\n data-slot='multi-select-empty'\n className={cn(\n 'flex items-center justify-center py-[24px] text-base-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n {children ?? '결과 없음'}\n </CommandPrimitive.Empty>\n )\n },\n)\nMultiSelectEmpty.displayName = 'MultiSelectEmpty'\n\nexport { MultiSelectEmpty }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { MultiSelectGroupProps } from './types'\n\nconst MultiSelectGroup = React.forwardRef<HTMLDivElement, MultiSelectGroupProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 묶음 안 항목만 등록되게 children 만\n if (labelPass) return <>{children}</>\n return (\n <CommandPrimitive.Group\n ref={ref}\n data-slot='multi-select-group'\n className={cn(\n '[&_[cmdk-group-heading]]:sticky [&_[cmdk-group-heading]]:top-0 [&_[cmdk-group-heading]]:z-10 [&_[cmdk-group-heading]]:bg-secondary-o10 [&_[cmdk-group-heading]]:backdrop-blur-[16px] [&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:py-[4px] [&_[cmdk-group-heading]]:text-small-medium [&_[cmdk-group-heading]]:text-sys-text-subtle',\n className,\n )}\n {...props}\n >\n {children}\n </CommandPrimitive.Group>\n )\n },\n)\nMultiSelectGroup.displayName = 'MultiSelectGroup'\n\nexport { MultiSelectGroup }\n","'use client'\n\nimport * as React from 'react'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectInputProps } from './types'\n\nconst MultiSelectInput = React.forwardRef<HTMLInputElement, MultiSelectInputProps>(\n ({ className, onChange, ...props }, ref) => {\n const { searchTerm, setSearchTerm } = useMultiSelectContext()\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchTerm(value)\n onChange?.(value)\n }\n\n const handleClear = () => {\n setSearchTerm('')\n onChange?.('')\n }\n\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div className='flex items-center border-b border-b-sys-divider-subtle px-[6px] py-[4px] gap-[4px]'>\n <Search className='shrink-0 size-[16px] text-sys-text-subtler' aria-hidden='true' />\n <div className='flex flex-1 items-center h-[28px] min-w-0 px-[4px] py-[2px]'>\n <input\n ref={ref}\n value={searchTerm}\n onChange={handleChange}\n aria-label='옵션 검색'\n className={cn(\n 'flex w-full border-none bg-transparent text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-placeholder disabled:cursor-not-allowed disabled:text-sys-text-disabled',\n className,\n )}\n {...props}\n />\n </div>\n {searchTerm && (\n <button\n type='button'\n onClick={handleClear}\n className='flex items-center justify-center shrink-0 p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler'\n aria-label='검색어 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n </div>\n )\n },\n)\nMultiSelectInput.displayName = 'MultiSelectInput'\n\nexport { MultiSelectInput }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { MetaItem, type MetaItemProps } from '../metaItem'\n\ninterface SelectItemContentProps {\n children: React.ReactNode\n description?: string\n meta?: MetaItemProps[]\n /** title 행 안, 이름 앞에 인라인으로 렌더될 슬롯 (meta/description 행은 밀지 않음) */\n elemBefore?: React.ReactNode\n elemAfter?: React.ReactNode\n disabled?: boolean\n}\n\nfunction SelectItemContent({\n children,\n description,\n meta,\n elemBefore,\n elemAfter,\n disabled,\n}: SelectItemContentProps) {\n return (\n <div\n className={cn(\n 'flex flex-col min-w-0 flex-1 items-start justify-center',\n disabled && 'text-sys-text-disabled [&_*]:text-sys-text-disabled',\n )}\n >\n <div className='flex w-full h-[28px] items-center gap-[8px]'>\n {/* 광학 보정: 뱃지(아이콘+텍스트)는 박스-중심으로 정렬돼 타이틀(text-base-semibold) 텍스트보다 살짝 높게 보인다. 3px 내려 시각 정렬하며, layout shift 없도록 transform 사용. */}\n {elemBefore && <span className='shrink-0 translate-y-[3px]'>{elemBefore}</span>}\n <span className='flex-1 truncate whitespace-pre text-base-semibold text-left'>\n {sanitizeUserText(children)}\n </span>\n {elemAfter && <span className='shrink-0'>{elemAfter}</span>}\n </div>\n {meta && meta.length > 0 && (\n <div className='flex items-start gap-[16px] shrink-0'>\n {meta.map((m, idx) => (\n <MetaItem key={`${typeof m.label === 'string' ? m.label : 'meta'}-${idx}`} {...m} />\n ))}\n </div>\n )}\n {description && (\n <span className='w-full truncate whitespace-pre text-small-regular-h text-sys-text-subtler pb-[2px]'>\n {sanitizeUserText(description)}\n </span>\n )}\n </div>\n )\n}\n\nexport { SelectItemContent }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { SelectItemContent } from '../select/selectItemContent'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectItemProps } from './types'\n\nconst MultiSelectItem = React.forwardRef<HTMLDivElement, MultiSelectItemProps>(\n (\n {\n className,\n children,\n value,\n disabled,\n description,\n textValue,\n meta,\n elemBefore,\n elemBeforeAlign = 'center',\n elemAfter,\n ...props\n },\n ref,\n ) => {\n const { values, onToggleValue, registerLabel } = useMultiSelectContext()\n const labelPass = useLabelPass()\n const isSelected = values.includes(value)\n\n // children에서 텍스트 추출 (textValue가 없는 경우)\n const resolvedTextValue = textValue ?? (typeof children === 'string' ? children : value)\n\n // trigger 표시용 라벨 등록\n React.useEffect(() => {\n registerLabel(value, resolvedTextValue)\n }, [value, resolvedTextValue, registerLabel])\n\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 등록만 하고 그리지 않는다\n if (labelPass) return null\n\n return (\n <CommandPrimitive.Item\n ref={ref}\n data-slot='multi-select-item'\n data-state={isSelected ? 'checked' : 'unchecked'}\n value={value}\n keywords={[resolvedTextValue]}\n disabled={disabled}\n onSelect={() => {\n if (!disabled) {\n onToggleValue(value)\n }\n }}\n aria-selected={isSelected}\n className={cn(\n 'relative flex w-full cursor-default items-center gap-[8px] py-[2px] px-[8px] min-h-[32px] border-b border-secondary-o20 text-base-medium text-sys-text-main outline-hidden select-none',\n 'data-[disabled=true]:pointer-events-none',\n 'hover:bg-primary10 data-[state=checked]:bg-secondary-o20 data-[state=checked]:hover:bg-secondary-o40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {/* 체크박스 인디케이터 */}\n <span\n className={cn('flex items-center justify-center size-[24px] p-[4px] shrink-0')}\n aria-hidden='true'\n >\n <span\n className={cn(\n 'flex items-center justify-center w-[16px] h-[16px] rounded-xsmall border-[2px]',\n isSelected\n ? 'bg-primary30 border-primary30'\n : 'bg-sys-background border-sys-divider-main',\n disabled && 'opacity-50',\n )}\n >\n {isSelected && (\n <svg\n width='10'\n height='8'\n viewBox='0 0 10 8'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M9.2953 0.828385C9.68583 1.21891 9.68583 1.85207 9.2953 2.2426L4.24923 7.28867C4.24704 7.2909 4.24484 7.29313 4.24262 7.29534C4.04812 7.48985 3.79342 7.58748 3.53848 7.58823C3.28155 7.589 3.02438 7.49137 2.82835 7.29534C2.82614 7.29313 2.82394 7.29092 2.82176 7.28869L0.707088 5.17402C0.316564 4.7835 0.316564 4.15033 0.707088 3.75981C1.09761 3.36928 1.73078 3.36928 2.1213 3.75981L3.53549 5.17399L7.88109 0.828385C8.27161 0.437861 8.90478 0.437861 9.2953 0.828385Z'\n fill='var(--color-sys-background)'\n />\n </svg>\n )}\n </span>\n </span>\n\n {elemBefore && elemBeforeAlign === 'center' && (\n <span className='shrink-0'>{elemBefore}</span>\n )}\n <SelectItemContent\n description={description}\n meta={meta}\n elemBefore={elemBeforeAlign === 'title' ? elemBefore : undefined}\n elemAfter={elemAfter}\n disabled={disabled}\n >\n {children}\n </SelectItemContent>\n </CommandPrimitive.Item>\n )\n },\n)\nMultiSelectItem.displayName = 'MultiSelectItem'\n\nexport { MultiSelectItem }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { Spinner } from '../spinner'\nimport type { MultiSelectLoadingProps } from './types'\n\nconst MultiSelectLoading = React.forwardRef<HTMLDivElement, MultiSelectLoadingProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='multi-select-loading'\n role='status'\n aria-live='polite'\n className={cn(\n 'flex items-center justify-center gap-[8px] py-[12px] text-small-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n <Spinner size='small' variant='secondary' />\n {children || '로드 중'}\n </div>\n )\n },\n)\nMultiSelectLoading.displayName = 'MultiSelectLoading'\n\nexport { MultiSelectLoading }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { MultiSelectSeparatorProps } from './types'\n\nconst MultiSelectSeparator = React.forwardRef<HTMLDivElement, MultiSelectSeparatorProps>(\n ({ className, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='multi-select-separator'\n className={cn('my-[4px] h-px bg-sys-divider-subtler', className)}\n {...props}\n />\n )\n },\n)\nMultiSelectSeparator.displayName = 'MultiSelectSeparator'\n\nexport { MultiSelectSeparator }\n","'use client'\n\nimport * as React from 'react'\n\nimport type { SelectContextValue } from './types'\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null)\n\nexport function useSelectContext() {\n const context = React.useContext(SelectContext)\n if (!context) {\n throw new Error('Select compound components must be used within <Select>')\n }\n return context\n}\n\nexport { SelectContext }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { cva } from 'class-variance-authority'\n\nimport { useFloatingLabel } from '../../hooks/useFloatingLabel'\nimport { cn } from '../../utils/cn'\nimport { FloatingLabelOutline } from '../_internal/floatingLabelOutline'\nimport { useFormControlContext } from '../form'\nimport { useSelectContext } from './selectContext'\nimport type { SelectTriggerProps } from './types'\n\nexport const selectTriggerVariants = cva(\n [\n 'flex w-full items-center gap-[2px] bg-transparent whitespace-nowrap outline-none cursor-pointer',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10 disabled:hover:bg-sys-background',\n 'focus:border-[2px] focus:border-sys-focus-ring-bold focus:py-[2px] focus:px-[4px]',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px] focus:border-danger30',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\nconst SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n (\n {\n className,\n children,\n appearance,\n isInvalid: isInvalidProp,\n label,\n required,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n ...props\n },\n ref,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const { open, disabled, value } = useSelectContext()\n const listboxId = React.useId()\n // role=combobox 는 자식 텍스트로 접근 가능한 이름을 얻지 못한다(axe button-name).\n // label 이 없으면 placeholder/선택값이 든 내용 영역을 aria-labelledby 로 연결한다.\n const contentId = React.useId()\n const [isFocused, setIsFocused] = React.useState(false)\n\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue: !!value,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: disabled || !!props.disabled,\n appearance: appearance ?? 'standard',\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n return (\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={ref}\n type='button'\n role='combobox'\n aria-expanded={open}\n aria-controls={listboxId}\n aria-haspopup='listbox'\n data-listbox-id={listboxId}\n aria-invalid={isInvalid || undefined}\n aria-labelledby={hasLabel ? labelId : contentId}\n aria-required={hasLabel && required ? true : undefined}\n data-slot='select-trigger'\n data-state={open ? 'open' : 'closed'}\n disabled={disabled || props.disabled}\n className={cn(\n selectTriggerVariants({ appearance, isInvalid }),\n '[&_[data-placeholder]]:text-sys-text-placeholder',\n (showNotchedOutline || showNoneLabel) && 'relative',\n // Three-box가 border를 대신 그리므로 버튼 자체 border 제거\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n className,\n )}\n {...props}\n onFocus={hasLabel ? handleFocus : onFocusProp}\n onBlur={hasLabel ? handleBlur : onBlurProp}\n >\n {/* Floating label (standard: notched outline, none: inline label) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={required}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* Content (label 모드에서 값이 없으면 숨김 - label이 placeholder 역할) */}\n <div\n id={contentId}\n className={cn(\n 'flex flex-1 items-center min-h-[28px] min-w-0 px-[4px] py-[2px]',\n hasLabel && !value && 'invisible',\n )}\n >\n {children}\n </div>\n\n {/* Chevron */}\n <svg\n viewBox='0 0 24 24'\n fill='currentColor'\n aria-hidden='true'\n className={cn('size-[24px] shrink-0 transition-transform', open && 'rotate-180')}\n >\n <path d='M7 10l5 5 5-5z' />\n </svg>\n </button>\n </PopoverPrimitive.Trigger>\n )\n },\n)\nSelectTrigger.displayName = 'SelectTrigger'\n\nexport { SelectTrigger }\n","'use client'\n\nimport * as React from 'react'\nimport { Slot, Slottable } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { CancelIcon } from './_internal/cancelIcon'\nimport { cn } from '../utils/cn'\n\nconst tagVariants = cva(\n // whitespace-nowrap: 좁은 칸에서 태그 글자가 줄바꿈되지 않게 (2026-10-19 15차 D1, Badge 와 같은 규칙)\n 'inline-flex items-center whitespace-nowrap py-[4px] text-small-bold gap-[4px] w-fit transition-colors',\n {\n variants: {\n variant: {\n primary: 'bg-primary10 text-primary50',\n primaryBold: 'bg-primary30 text-secondary10',\n secondary: 'bg-secondary-o20 text-sys-text-main',\n secondaryBold: 'bg-secondary60 text-secondary10',\n danger: 'bg-danger10 text-danger50',\n dangerBold: 'bg-danger30 text-secondary10',\n warning: 'bg-warning10 text-warning50',\n warningBold: 'bg-warning30 text-grayscale80',\n success: 'bg-success10 text-success50',\n successBold: 'bg-success30 text-secondary10',\n info: 'bg-info10 text-info50',\n infoBold: 'bg-info30 text-grayscale80',\n etc: 'bg-etc10 text-etc50',\n etcBold: 'bg-etc30 text-secondary10',\n },\n shape: {\n normal: 'rounded-xsmall',\n rounded: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n shape: 'normal',\n },\n },\n)\n\n/** variant → 태그 배경색을 text-* 클래스로 매핑 (CancelIcon의 X 색상용) */\nconst cancelIconXColor: Record<string, string> = {\n primary: 'text-primary10',\n primaryBold: 'text-primary30',\n secondary: 'text-secondary-o20',\n secondaryBold: 'text-secondary60',\n danger: 'text-danger10',\n dangerBold: 'text-danger30',\n warning: 'text-warning10',\n warningBold: 'text-warning30',\n success: 'text-success10',\n successBold: 'text-success30',\n info: 'text-info10',\n infoBold: 'text-info30',\n etc: 'text-etc10',\n etcBold: 'text-etc30',\n}\n\n/**\n * variant → 태그 글자색 (tagVariants 와 같은 값).\n * asChild + onRemove 일 때 링크 밖으로 나간 삭제 버튼이 태그와 같은 색을 이어받도록 바깥 span 에 쓴다.\n */\nconst tagTextColor: Record<string, string> = {\n primary: 'text-primary50',\n primaryBold: 'text-secondary10',\n secondary: 'text-sys-text-main',\n secondaryBold: 'text-secondary10',\n danger: 'text-danger50',\n dangerBold: 'text-secondary10',\n warning: 'text-warning50',\n warningBold: 'text-grayscale80',\n success: 'text-success50',\n successBold: 'text-secondary10',\n info: 'text-info50',\n infoBold: 'text-grayscale80',\n etc: 'text-etc50',\n etcBold: 'text-secondary10',\n}\n\n/** asChild=true일 때 Link hover 배경 (overlay 또는 flat swap) */\nconst linkHoverBg: Record<string, string> = {\n primary: 'hover:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n primaryBold:\n 'hover:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n secondary: 'hover:bg-secondary-o30',\n secondaryBold:\n 'hover:bg-[image:linear-gradient(var(--color-secondary-o30),var(--color-secondary-o30))]',\n danger: 'hover:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n dangerBold: 'hover:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n warning: 'hover:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n warningBold:\n 'hover:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n success: 'hover:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n successBold:\n 'hover:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n info: 'hover:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n infoBold: 'hover:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n etc: 'hover:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n etcBold: 'hover:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n}\n\n/** asChild=true일 때 Link press 배경 (overlay 또는 flat swap) */\nconst linkPressBg: Record<string, string> = {\n primary: 'active:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n primaryBold:\n 'active:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n secondary: 'active:bg-secondary-o50',\n secondaryBold:\n 'active:bg-[image:linear-gradient(var(--color-secondary-o50),var(--color-secondary-o50))]',\n danger: 'active:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n dangerBold: 'active:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n warning: 'active:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n warningBold:\n 'active:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n success: 'active:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n successBold:\n 'active:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n info: 'active:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n infoBold: 'active:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n etc: 'active:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n etcBold: 'active:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n}\n\n/** asChild=true일 때 Link hover 시 CancelIcon X 배경 오버라이드 */\nconst linkHoverXColor: Record<string, string> = {\n primary:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n primaryBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n secondary: 'group-hover/tag:text-secondary-o30',\n secondaryBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-secondary-o30),var(--color-secondary-o30))]',\n danger:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n dangerBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n warning:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n warningBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n success:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n successBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n info: 'group-hover/tag:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n infoBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n etc: 'group-hover/tag:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n etcBold: 'group-hover/tag:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n}\n\n/** asChild=true일 때 Link press 시 CancelIcon X 배경 오버라이드 */\nconst linkPressXColor: Record<string, string> = {\n primary:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n primaryBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n secondary: 'group-active/tag:text-secondary-o50',\n secondaryBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-secondary-o50),var(--color-secondary-o50))]',\n danger:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n dangerBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n warning:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n warningBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n success:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n successBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n info: 'group-active/tag:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n infoBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n etc: 'group-active/tag:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n etcBold: 'group-active/tag:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n}\n\nexport interface TagProps\n extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof tagVariants> {\n /** 다른 요소로 렌더링 (예: `<a>` 링크). Radix Slot 패턴 */\n asChild?: boolean\n /** 좌측 아이콘 영역. 16x16 크기로 렌더링됨 */\n elemBefore?: React.ReactNode\n /** 닫기 버튼 콜백. 전달 시 우측에 닫기 아이콘 표시 */\n onRemove?: () => void\n}\n\n/**\n * 붙이고 뗄 수 있는 라벨. 키워드·분류·선택된 항목을 나타낸다.\n *\n * 언제 쓰나: 태그 목록, MultiSelect 가 보여 주는 선택 항목, 필터 조건 칩. 제거가 가능하면 `onRemove`, 링크면 `asChild`.\n * 언제 안 쓰나: 시스템이 정하는 상태 표시(→ Badge), 행동 버튼(→ Button).\n * 대신/함께: `asChild` 와 `onRemove` 를 함께 쓰면 제거 버튼이 링크 밖 형제로 렌더된다(버튼 중첩 금지).\n */\nfunction Tag({\n className,\n variant,\n shape,\n asChild = false,\n elemBefore,\n onRemove,\n children,\n ...props\n}: TagProps) {\n const Comp = asChild ? Slot : 'div'\n const v = variant ?? 'primary'\n // 링크(asChild) 안에 삭제 <button> 을 넣으면 대화형 요소가 중첩되므로, 이 조합에서는\n // 링크와 삭제 버튼을 형제로 두고 바깥 span 이 group/tag 와 위치 기준을 맡는다\n const removeOutside = asChild && !!onRemove\n\n const removeButton = onRemove && (\n <button\n type='button'\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onRemove()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n onRemove()\n }\n }}\n className='absolute right-[4px] top-1/2 -translate-y-1/2 inline-flex items-center justify-center size-[16px] rounded-full focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[-1px] group/remove'\n aria-label='삭제'\n >\n <CancelIcon\n size={14}\n iconClassName={cn(\n cancelIconXColor[v],\n asChild && [linkHoverXColor[v], linkPressXColor[v]],\n 'group-hover/remove:bg-sys-background hover:group-hover/remove:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]',\n 'group-active/remove:bg-sys-background active:group-active/remove:bg-[image:linear-gradient(var(--color-danger-o20),var(--color-danger-o20))]',\n )}\n />\n </button>\n )\n\n const tag = (\n <Comp\n className={cn(\n tagVariants({ variant, shape }),\n elemBefore ? 'pl-[6px]' : 'pl-[8px]',\n onRemove ? 'pr-[24px]' : 'pr-[8px]',\n onRemove && !removeOutside && 'relative',\n asChild && [\n !removeOutside && 'group/tag',\n 'cursor-pointer hover:underline active:underline',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px] focus-visible:underline',\n linkHoverBg[v],\n linkPressBg[v],\n ],\n onRemove && 'transition-colors',\n onRemove &&\n !removeOutside && [\n 'has-[button:hover]:bg-sys-background has-[button:hover]:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))] has-[button:hover]:text-danger40',\n 'active:has-[button:active]:bg-sys-background active:has-[button:active]:bg-[image:linear-gradient(var(--color-danger-o20),var(--color-danger-o20))] active:has-[button:active]:text-danger40',\n ],\n removeOutside && [\n 'group-has-[button:hover]/tag:bg-sys-background group-has-[button:hover]/tag:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))] group-has-[button:hover]/tag:text-danger40',\n 'group-has-[button:active]/tag:bg-sys-background group-has-[button:active]/tag:bg-[image:linear-gradient(var(--color-danger-o20),var(--color-danger-o20))] group-has-[button:active]/tag:text-danger40',\n ],\n className,\n )}\n {...props}\n >\n {elemBefore && (\n <span className='shrink-0 inline-flex items-center size-[16px]'>{elemBefore}</span>\n )}\n <Slottable>{children}</Slottable>\n {!removeOutside && removeButton}\n </Comp>\n )\n\n if (removeOutside) {\n return (\n <span\n className={cn(\n 'group/tag relative inline-flex w-fit',\n // 삭제 버튼(currentColor)이 태그 글자색을, 삭제 hover·press 시 danger 색을 따르게 한다\n tagTextColor[v],\n 'has-[button:hover]:text-danger40 has-[button:active]:text-danger40',\n )}\n >\n {tag}\n {removeButton}\n </span>\n )\n }\n\n return tag\n}\n\nexport { Tag, tagVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { useFloatingLabel } from '../../hooks/useFloatingLabel'\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { FloatingLabelOutline } from '../_internal/floatingLabelOutline'\nimport { useFormControlContext } from '../form'\nimport { selectTriggerVariants } from '../select/selectTrigger'\nimport { Tag } from '../tag'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectTriggerProps } from './types'\n\nconst MultiSelectTrigger = React.forwardRef<HTMLDivElement, MultiSelectTriggerProps>(\n (\n {\n className,\n appearance,\n isInvalid: isInvalidProp,\n label,\n required,\n placeholder,\n elemBeforeInput,\n elemAfterInput,\n ...props\n },\n ref,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const {\n open,\n setOpen,\n values,\n disabled,\n labelMap,\n onRemoveValue,\n onClearAll,\n searchTerm,\n setSearchTerm,\n } = useMultiSelectContext()\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n const chevronOpenRef = React.useRef(false)\n const listboxId = React.useId()\n const [isFocused, setIsFocused] = React.useState(false)\n const hasValue = values.length > 0\n\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance: appearance ?? 'standard',\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleContainerClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n // 태그 삭제 버튼이나 clear 버튼 클릭 시에는 popover 열지 않음\n if ((e.target as HTMLElement).closest('button')) return\n inputRef.current?.focus()\n if (!open) setOpen(true)\n },\n [disabled, open, setOpen],\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && searchTerm === '' && values.length > 0) {\n onRemoveValue(values[values.length - 1])\n }\n if (e.key === 'Escape') {\n // 목록만 닫고 포커스는 combobox(입력)에 남긴다 (APG combobox 패턴). blur 하면 포커스가 body 로 떨어진다\n setOpen(false)\n }\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n if (!open) {\n e.preventDefault()\n setOpen(true)\n }\n }\n },\n [searchTerm, values, onRemoveValue, open, setOpen],\n )\n\n const handleContainerKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n // input에서 버블링된 이벤트는 input의 handleKeyDown이 처리하므로 무시\n if (e.target instanceof HTMLInputElement) return\n if (disabled) return\n if (e.key === 'Enter' || e.key === 'ArrowDown') {\n e.preventDefault()\n inputRef.current?.focus()\n if (!open) setOpen(true)\n }\n if (e.key === 'Escape') {\n setOpen(false)\n inputRef.current?.focus()\n }\n },\n [disabled, open, setOpen],\n )\n\n const handleInputChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.target.value)\n if (!open) setOpen(true)\n },\n [setSearchTerm, open, setOpen],\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n if (disabled) {\n e.currentTarget.blur()\n return\n }\n setIsFocused(true)\n },\n [disabled],\n )\n\n const handleBlur = React.useCallback((e: React.FocusEvent<HTMLDivElement>) => {\n // 포커스가 trigger 컨테이너 밖으로 나갈 때만 blur 처리\n if (!e.currentTarget.contains(e.relatedTarget)) {\n setIsFocused(false)\n }\n }, [])\n\n const handleClearAll = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n onClearAll()\n setSearchTerm('')\n inputRef.current?.focus()\n },\n [onClearAll, setSearchTerm],\n )\n\n const handleRemoveTag = React.useCallback(\n (value: string) => {\n onRemoveValue(value)\n inputRef.current?.focus()\n },\n [onRemoveValue],\n )\n\n return (\n <PopoverPrimitive.Anchor asChild>\n <div\n ref={ref}\n role='combobox'\n aria-expanded={open}\n aria-controls={listboxId}\n aria-haspopup='listbox'\n data-listbox-id={listboxId}\n aria-invalid={isInvalid || undefined}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-required={hasLabel && required ? true : undefined}\n data-slot='multi-select-trigger'\n data-state={open ? 'open' : 'closed'}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n className={cn(\n selectTriggerVariants({ appearance, isInvalid }),\n 'flex-wrap cursor-text',\n '[&_[data-placeholder]]:text-sys-text-placeholder',\n (showNotchedOutline || showNoneLabel) && 'relative',\n // MultiSelect 가로 패딩: border 포함 4px 유지\n showNotchedOutline\n ? '!border-0 !py-[4px] !px-[4px]'\n : isInvalid\n ? '!px-[2px]'\n : '!px-[3px] focus-within:!px-[2px]',\n !showNotchedOutline &&\n !isInvalid &&\n 'focus-within:border-[2px] focus-within:border-sys-focus-ring-bold focus-within:!py-[2px]',\n disabled && 'cursor-not-allowed opacity-50',\n // disabled 시 hover 배경 무력화 (div라 :disabled 불가 → JS 조건부; none은 원래 hover bg 없음)\n disabled && appearance !== 'none' && 'hover:bg-sys-background',\n className,\n )}\n onClick={handleContainerClick}\n onKeyDown={handleContainerKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {/* Floating label */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={required}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* 좌측 아이콘 */}\n {elemBeforeInput && (\n <span className='shrink-0 flex items-center justify-center size-[24px]'>\n {elemBeforeInput}\n </span>\n )}\n\n {/* Tags + 인라인 입력 컨테이너 */}\n <div\n className={cn(\n 'flex flex-1 flex-wrap items-center min-h-[28px] min-w-0 gap-0',\n hasLabel && !hasValue && !isFocused && !open && 'invisible',\n )}\n >\n {/* 선택된 값 태그 */}\n {values.map((val) => {\n const displayText = labelMap.get(val) ?? val\n return (\n <div key={val} className='flex p-[2px]' data-slot='multi-select-tag'>\n <Tag\n variant='primary'\n shape='normal'\n onRemove={disabled ? undefined : () => handleRemoveTag(val)}\n aria-label={disabled ? undefined : `${displayText} 삭제`}\n >\n <span className='whitespace-pre'>{sanitizeUserText(displayText)}</span>\n </Tag>\n </div>\n )\n })}\n\n {/* 인라인 검색 입력 */}\n <div className='flex-1 min-w-[60px] px-[6px]'>\n <input\n ref={inputRef}\n value={searchTerm}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={\n !hasValue && (!hasLabel || isFocused || open) ? placeholder : undefined\n }\n disabled={disabled}\n aria-label={label ?? placeholder ?? '옵션 검색'}\n data-slot='multi-select-input'\n className='visible w-full border-none bg-transparent text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-placeholder disabled:cursor-not-allowed'\n />\n </div>\n </div>\n\n {/* Clear 버튼 (값 또는 검색어가 있을 때) */}\n {(hasValue || searchTerm) && !disabled && (\n <button\n type='button'\n onClick={handleClearAll}\n className='shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler'\n aria-label='전체 삭제'\n tabIndex={-1}\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* 우측 아이콘 */}\n {elemAfterInput && (\n <span className='shrink-0 flex items-center justify-center size-[24px]'>\n {elemAfterInput}\n </span>\n )}\n\n {/* Chevron */}\n <button\n type='button'\n tabIndex={-1}\n onPointerDown={() => {\n // Radix DismissableLayer가 native pointerdown으로 외부 클릭 감지하여\n // click 이벤트 전에 setOpen(false)를 호출함.\n // pointerdown 시점의 open 상태를 ref에 캡처하여 click에서 정확히 toggle.\n chevronOpenRef.current = open\n }}\n onClick={(e) => {\n e.stopPropagation()\n if (disabled) return\n if (chevronOpenRef.current) {\n setOpen(false)\n inputRef.current?.blur()\n } else {\n setOpen(true)\n inputRef.current?.focus()\n }\n }}\n className='shrink-0 flex items-center justify-center'\n aria-label={open ? '닫기' : '열기'}\n >\n <svg\n viewBox='0 0 24 24'\n fill='currentColor'\n aria-hidden='true'\n className={cn('size-[24px] shrink-0 transition-transform', open && 'rotate-180')}\n >\n <path d='M7 10l5 5 5-5z' />\n </svg>\n </button>\n </div>\n </PopoverPrimitive.Anchor>\n )\n },\n)\nMultiSelectTrigger.displayName = 'MultiSelectTrigger'\n\nexport { MultiSelectTrigger }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../../utils/cn'\nimport { SelectContext } from './selectContext'\nimport type { SelectContextValue, SelectProps } from './types'\n\n/**\n * 드롭다운에서 하나를 고르는 폼 입력. 선택지가 정해져 있고 5개 이상일 때 쓴다.\n *\n * 언제 쓰나: 폼 안에서 `FormControl` 아래 `Select` > `SelectTrigger`(label·required) + `SelectContent` > `SelectItem`. 항목이 많으면 `SelectInput` 으로 검색, 비동기 목록은 `SelectLoading`·`SelectEmpty`.\n * 언제 안 쓰나: 선택지 2~4개(→ RadioGroup·RadioSection), 여러 개 선택(→ MultiSelect), 목록 화면 상단 필터(→ TableFilterSingleSelect), 켜고 끄기(→ Switch).\n * 대신/함께: 트리거 라벨은 `SelectItem` 에서 얻는다 — 닫혀 있어도 항목이 이름을 등록하므로 미리 정한 값도 펼치기 전에 이름으로 보인다. 목록에 아직 없는 값(비동기로 오는 항목)만 `useSelectContext().registerLabel` 로 미리 등록한다.\n */\nfunction Select({\n value: controlledValue,\n defaultValue,\n onValueChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n className,\n children,\n}: SelectProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState<string | undefined>(defaultValue)\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n\n const isControlledValue = controlledValue !== undefined\n const isControlledOpen = controlledOpen !== undefined\n\n const value = isControlledValue ? controlledValue : uncontrolledValue\n const open = isControlledOpen ? controlledOpen : uncontrolledOpen\n\n const [labelMap, setLabelMap] = React.useState(() => new Map<string, string>())\n\n const registerLabel = React.useCallback((itemValue: string, label: string) => {\n setLabelMap((prev) => {\n if (prev.get(itemValue) === label) return prev\n const next = new Map(prev)\n next.set(itemValue, label)\n return next\n })\n }, [])\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n if (!isControlledValue) {\n setUncontrolledValue(newValue)\n }\n onValueChange?.(newValue)\n },\n [isControlledValue, onValueChange],\n )\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n if (!isControlledOpen) {\n setUncontrolledOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlledOpen, onOpenChange],\n )\n\n const contextValue = React.useMemo<SelectContextValue>(\n () => ({\n open,\n setOpen: handleOpenChange,\n value,\n onValueChange: handleValueChange,\n disabled,\n labelMap,\n registerLabel,\n }),\n [open, handleOpenChange, value, handleValueChange, disabled, labelMap, registerLabel],\n )\n\n return (\n <SelectContext.Provider value={contextValue}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange} modal>\n <div data-slot='select' className={cn('relative', className)}>\n {children}\n </div>\n </PopoverPrimitive.Root>\n </SelectContext.Provider>\n )\n}\n\nexport { Select }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { LabelPass } from '../_internal/labelPass'\nimport { useSelectContext } from './selectContext'\nimport type { SelectContentProps } from './types'\n\nconst SelectContent = React.forwardRef<HTMLDivElement, SelectContentProps>(\n ({ className, children, align = 'start', sideOffset = 4, ...props }, ref) => {\n const { open } = useSelectContext()\n const [search, setSearch] = React.useState('')\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // 닫힐 때 검색 리셋\n const prevOpen = React.useRef(open)\n React.useEffect(() => {\n if (prevOpen.current && !open) {\n setSearch('')\n }\n prevOpen.current = open\n }, [open])\n\n // 열릴 때 선택된 항목으로 스크롤\n React.useEffect(() => {\n if (open) {\n requestAnimationFrame(() => {\n const checkedItem = listRef.current?.querySelector('[data-state=checked]')\n checkedItem?.scrollIntoView({ block: 'nearest' })\n })\n }\n }, [open])\n\n return (\n <>\n {/* 닫혀 있는 동안 항목이 이름만 등록해 트리거가 펼치기 전에도 원값 대신 이름을 보인다 (2026-10-30 홀드아웃 17) */}\n {open ? null : <LabelPass>{children}</LabelPass>}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n data-slot='select-content'\n // Radix Popover 콘텐츠는 role=dialog 라 이름이 필요하다(axe aria-dialog-name). 호출부 aria-label 이 있으면 {...props} 가 덮는다\n aria-label='옵션 목록'\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-[var(--root-z-index)] min-w-[var(--radix-popover-trigger-width)] origin-(--radix-popover-content-transform-origin) overflow-hidden rounded-small shadow-gray-medium bg-sys-background border border-sys-divider-subtler',\n 'data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]',\n 'data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]',\n 'data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]',\n className,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n {...props}\n >\n <CommandPrimitive\n filter={(_value, search, keywords) => {\n const lowerSearch = search.toLowerCase()\n if (keywords?.some((kw) => kw.toLowerCase().includes(lowerSearch))) return 1\n return 0\n }}\n value=''\n onValueChange={() => {}}\n >\n <SelectSearchContext.Provider value={{ search, setSearch }}>\n {(() => {\n const inputChildren: React.ReactNode[] = []\n const restChildren: React.ReactNode[] = []\n\n React.Children.forEach(children, (child) => {\n if (\n React.isValidElement(child) &&\n (child.type as any)?.displayName === 'SelectInput'\n ) {\n inputChildren.push(child)\n } else {\n restChildren.push(child)\n }\n })\n\n return (\n <>\n {inputChildren}\n <CommandPrimitive.List\n ref={listRef}\n className='max-h-[300px] overflow-y-auto overflow-x-hidden scroll-py-1'\n >\n {restChildren}\n </CommandPrimitive.List>\n </>\n )\n })()}\n </SelectSearchContext.Provider>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </>\n )\n },\n)\nSelectContent.displayName = 'SelectContent'\n\n// 검색 컨텍스트 (SelectInput, SelectEmpty에서 사용)\ninterface SelectSearchContextValue {\n search: string\n setSearch: (value: string) => void\n}\nconst SelectSearchContext = React.createContext<SelectSearchContextValue>({\n search: '',\n setSearch: () => {},\n})\n\nexport function useSelectSearch() {\n return React.useContext(SelectSearchContext)\n}\n\nexport { SelectContent, SelectSearchContext }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Info } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport message from '../../utils/message'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { Stack } from '../stack'\nimport type { SelectEmptyProps } from './types'\n\nconst SelectEmpty = React.forwardRef<HTMLDivElement, SelectEmptyProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <CommandPrimitive.Empty\n ref={ref}\n data-slot='select-empty'\n aria-live='polite'\n className={cn('py-[8px] text-small-medium text-sys-text-subtlest text-center', className)}\n {...props}\n >\n <Stack justifyContent='center' alignItems='center' spacing={6}>\n <Info size={16} className='text-sys-text-subtlest shrink-0' />\n {children || message.common.notice_search_result_empty}\n </Stack>\n </CommandPrimitive.Empty>\n )\n },\n)\nSelectEmpty.displayName = 'SelectEmpty'\n\nexport { SelectEmpty }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { SelectGroupProps } from './types'\n\nconst SelectGroup = React.forwardRef<HTMLDivElement, SelectGroupProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 묶음 안 항목만 등록되게 children 만\n if (labelPass) return <>{children}</>\n return (\n <CommandPrimitive.Group\n ref={ref}\n data-slot='select-group'\n className={cn(\n '[&_[cmdk-group-heading]]:sticky [&_[cmdk-group-heading]]:top-0 [&_[cmdk-group-heading]]:z-10 [&_[cmdk-group-heading]]:bg-secondary-o10 [&_[cmdk-group-heading]]:backdrop-blur-[16px] [&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:py-[4px] [&_[cmdk-group-heading]]:text-small-medium [&_[cmdk-group-heading]]:text-sys-text-subtle',\n className,\n )}\n {...props}\n >\n {children}\n </CommandPrimitive.Group>\n )\n },\n)\nSelectGroup.displayName = 'SelectGroup'\n\nexport { SelectGroup }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useSelectSearch } from './selectContent'\nimport type { SelectInputProps } from './types'\n\nconst SelectInput = React.forwardRef<HTMLInputElement, SelectInputProps>(\n ({ className, onChange, ...props }, ref) => {\n const { search, setSearch } = useSelectSearch()\n\n const handleChange = (value: string) => {\n setSearch(value)\n onChange?.(value)\n }\n\n const handleClear = () => {\n setSearch('')\n onChange?.('')\n }\n\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div className='flex items-center border-b border-b-sys-divider-subtle px-[6px] py-[4px] gap-[4px]'>\n <Search className='shrink-0 size-[16px] text-sys-text-subtler' aria-hidden='true' />\n <div className='flex flex-1 items-center h-[28px] min-w-0 px-[4px] py-[2px]'>\n <CommandPrimitive.Input\n ref={ref}\n value={search}\n onValueChange={handleChange}\n aria-label='옵션 검색'\n className={cn(\n 'flex w-full border-none bg-transparent text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-placeholder disabled:cursor-not-allowed disabled:text-sys-text-disabled',\n className,\n )}\n {...props}\n />\n </div>\n {search && (\n <button\n type='button'\n onClick={handleClear}\n className='flex items-center justify-center shrink-0 p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler'\n aria-label='검색어 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n </div>\n )\n },\n)\nSelectInput.displayName = 'SelectInput'\n\nexport { SelectInput }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useSelectContext } from './selectContext'\nimport { SelectItemContent } from './selectItemContent'\nimport type { SelectItemProps } from './types'\n\nconst SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(\n (\n {\n className,\n children,\n value,\n disabled,\n description,\n textValue,\n meta,\n elemBefore,\n elemBeforeAlign = 'center',\n elemAfter,\n ...props\n },\n ref,\n ) => {\n const { value: selectedValue, onValueChange, setOpen, registerLabel } = useSelectContext()\n const labelPass = useLabelPass()\n const isSelected = selectedValue === value\n\n // children에서 텍스트 추출 (textValue가 없는 경우)\n const resolvedTextValue = textValue ?? (typeof children === 'string' ? children : value)\n\n // trigger 표시용 라벨 등록\n React.useEffect(() => {\n registerLabel(value, resolvedTextValue)\n }, [value, resolvedTextValue, registerLabel])\n\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 등록만 하고 그리지 않는다\n if (labelPass) return null\n\n return (\n <CommandPrimitive.Item\n ref={ref}\n data-slot='select-item'\n data-state={isSelected ? 'checked' : 'unchecked'}\n value={value}\n keywords={[resolvedTextValue]}\n disabled={disabled}\n onSelect={() => {\n if (!disabled) {\n onValueChange(value)\n setOpen(false)\n }\n }}\n className={cn(\n 'relative flex w-full cursor-default items-center gap-[8px] py-[2px] px-[8px] min-h-[32px] border-b border-secondary-o20 text-base-medium text-sys-text-main outline-hidden select-none',\n 'data-[disabled=true]:pointer-events-none',\n 'hover:bg-primary10 data-[state=checked]:bg-secondary-o20 data-[state=checked]:hover:bg-secondary-o40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {elemBefore && elemBeforeAlign === 'center' && (\n <span className='shrink-0'>{elemBefore}</span>\n )}\n <SelectItemContent\n description={description}\n meta={meta}\n elemBefore={elemBeforeAlign === 'title' ? elemBefore : undefined}\n elemAfter={elemAfter}\n disabled={disabled}\n >\n {children}\n </SelectItemContent>\n </CommandPrimitive.Item>\n )\n },\n)\nSelectItem.displayName = 'SelectItem'\n\nexport { SelectItem }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { Spinner } from '../spinner'\nimport type { SelectLoadingProps } from './types'\n\nconst SelectLoading = React.forwardRef<HTMLDivElement, SelectLoadingProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='select-loading'\n role='status'\n aria-live='polite'\n className={cn(\n 'flex items-center justify-center gap-[8px] py-[12px] text-small-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n <Spinner size='small' variant='secondary' />\n {children || '로드 중'}\n </div>\n )\n },\n)\nSelectLoading.displayName = 'SelectLoading'\n\nexport { SelectLoading }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\n\ninterface SelectRadioGroupProps extends React.ComponentPropsWithoutRef<\n typeof CommandPrimitive.Group\n> {\n children: React.ReactNode\n}\n\nconst SelectRadioGroup = React.forwardRef<HTMLDivElement, SelectRadioGroupProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 묶음 안 항목만 등록되게 children 만\n if (labelPass) return <>{children}</>\n return (\n <CommandPrimitive.Group\n ref={ref}\n role='radiogroup'\n data-slot='select-radio-group'\n className={cn('flex flex-col', className)}\n {...props}\n >\n {children}\n </CommandPrimitive.Group>\n )\n },\n)\nSelectRadioGroup.displayName = 'SelectRadioGroup'\n\nexport { SelectRadioGroup }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useSelectContext } from './selectContext'\nimport { SelectItemContent } from './selectItemContent'\nimport type { SelectRadioItemProps } from './types'\n\nconst SelectRadioItem = React.forwardRef<HTMLDivElement, SelectRadioItemProps>(\n (\n {\n className,\n children,\n value,\n disabled,\n description,\n textValue,\n meta,\n elemBefore,\n elemBeforeAlign = 'center',\n elemAfter,\n ...props\n },\n ref,\n ) => {\n const { value: selectedValue, onValueChange, setOpen, registerLabel } = useSelectContext()\n const labelPass = useLabelPass()\n const isSelected = selectedValue === value\n\n const resolvedTextValue = textValue ?? (typeof children === 'string' ? children : value)\n\n React.useEffect(() => {\n registerLabel(value, resolvedTextValue)\n }, [value, resolvedTextValue, registerLabel])\n\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 등록만 하고 그리지 않는다\n if (labelPass) return null\n\n return (\n <CommandPrimitive.Item\n ref={ref}\n data-slot='select-item'\n data-state={isSelected ? 'checked' : 'unchecked'}\n value={value}\n keywords={[resolvedTextValue]}\n disabled={disabled}\n onSelect={() => {\n if (!disabled) {\n onValueChange(value)\n setOpen(false)\n }\n }}\n className={cn(\n 'group relative flex w-full cursor-default items-center gap-[8px] py-[2px] px-[8px] min-h-[32px] border-b border-secondary-o20 text-base-medium text-sys-text-main outline-hidden select-none',\n 'data-[disabled=true]:pointer-events-none',\n 'hover:bg-primary10 data-[state=checked]:bg-secondary-o20 data-[state=checked]:hover:bg-secondary-o40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {/* CSS-only 라디오 인디케이터 */}\n <div className='shrink-0 size-[24px] p-[4px] flex items-center justify-center'>\n <div\n className={cn(\n 'border-[2px] border-sys-divider-main w-full h-full rounded-full',\n 'group-data-[state=checked]:bg-primary30 group-data-[state=checked]:border-none',\n 'flex items-center justify-center',\n disabled && 'border-secondary-o10 bg-secondary-o20',\n )}\n >\n <div\n className={cn(\n 'hidden group-data-[state=checked]:block',\n 'w-[6px] h-[6px] rounded-full bg-sys-background',\n )}\n />\n </div>\n </div>\n {elemBefore && elemBeforeAlign === 'center' && (\n <span className='shrink-0'>{elemBefore}</span>\n )}\n <SelectItemContent\n description={description}\n meta={meta}\n elemBefore={elemBeforeAlign === 'title' ? elemBefore : undefined}\n elemAfter={elemAfter}\n disabled={disabled}\n >\n {children}\n </SelectItemContent>\n </CommandPrimitive.Item>\n )\n },\n)\nSelectRadioItem.displayName = 'SelectRadioItem'\n\nexport { SelectRadioItem }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { SelectSeparatorProps } from './types'\n\nconst SelectSeparator = React.forwardRef<HTMLDivElement, SelectSeparatorProps>(\n ({ className, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='select-separator'\n className={cn('my-[4px] h-px bg-sys-divider-subtler', className)}\n {...props}\n />\n )\n },\n)\nSelectSeparator.displayName = 'SelectSeparator'\n\nexport { SelectSeparator }\n","'use client'\n\nimport * as React from 'react'\n\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { useSelectContext } from './selectContext'\nimport type { SelectValueProps } from './types'\n\nfunction SelectValue({ placeholder }: SelectValueProps) {\n const { value, labelMap } = useSelectContext()\n\n // 라벨이 등록되어 있으면 라벨 표시, 없으면 value 자체를 폴백으로 표시\n const displayText = value ? (labelMap.get(value) ?? value) : undefined\n\n if (!value) {\n return (\n <span data-slot='select-value' data-placeholder='' className='truncate whitespace-pre'>\n {sanitizeUserText(placeholder)}\n </span>\n )\n }\n\n return (\n <span data-slot='select-value' className='truncate whitespace-pre'>\n {sanitizeUserText(displayText)}\n </span>\n )\n}\n\nexport { SelectValue }\n","'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { ChevronDown, PanelLeft } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { IconButton } from '../iconButton'\nimport { LucideIcon } from '../lucideIcon'\nimport { Separator } from '../separator'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'\n\n/* --------------------------------- Context -------------------------------- */\n\ntype SidebarContextType = {\n isOpen: boolean\n toggle: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextType | undefined>(undefined)\n\ntype SidebarProviderProps = {\n children: React.ReactNode\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nfunction SidebarProvider({\n children,\n defaultOpen = true,\n open: controlledOpen,\n onOpenChange,\n}: SidebarProviderProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n\n const isOpen = controlledOpen ?? uncontrolledOpen\n\n const toggle = React.useCallback(() => {\n const newState = !isOpen\n if (onOpenChange) {\n onOpenChange(newState)\n } else {\n setUncontrolledOpen(newState)\n }\n }, [isOpen, onOpenChange])\n\n return <SidebarContext.Provider value={{ isOpen, toggle }}>{children}</SidebarContext.Provider>\n}\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within SidebarProvider')\n }\n return context\n}\n\n/* --------------------------------- Sidebar -------------------------------- */\n\ntype SidebarProps = React.HTMLAttributes<HTMLElement> & {\n top?: number\n openWidth?: number\n closedWidth?: number\n}\n\nconst Sidebar = React.forwardRef<HTMLElement, SidebarProps>(\n ({ className, top = 0, openWidth = 240, closedWidth = 72, style, children, ...props }, ref) => {\n const { isOpen } = useSidebar()\n\n return (\n <aside\n ref={ref}\n className={cn(\n 'fixed left-0 z-[500]',\n 'bg-sys-background',\n 'flex flex-col overflow-y-auto',\n 'transition-all duration-200 ease-in-out',\n className,\n )}\n style={{\n top,\n height: `calc(100vh - ${top}px)`,\n width: isOpen ? openWidth : closedWidth,\n boxShadow: '1px 0 0 0 var(--color-sys-divider-subtler)',\n ...style,\n }}\n {...props}\n >\n {children}\n </aside>\n )\n },\n)\nSidebar.displayName = 'Sidebar'\n\n/* ------------------------------ SidebarHeader ----------------------------- */\n\ntype SidebarHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n avatar?: string\n avatarColor?: string\n title?: string\n description?: string\n openLabel?: string\n closeLabel?: string\n}\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, SidebarHeaderProps>(\n (\n {\n className,\n avatar,\n avatarColor,\n title,\n description,\n openLabel = '사이드바 열기',\n closeLabel = '사이드바 접기',\n children,\n ...props\n },\n ref,\n ) => {\n const { isOpen, toggle } = useSidebar()\n const [isHovered, setIsHovered] = React.useState(false)\n const [isFullyCollapsed, setIsFullyCollapsed] = React.useState(!isOpen)\n\n // 전환 애니메이션(200ms) 완료 후에만 호버 효과 허용\n React.useEffect(() => {\n if (!isOpen) {\n const timer = setTimeout(() => setIsFullyCollapsed(true), 200)\n return () => clearTimeout(timer)\n } else {\n setIsFullyCollapsed(false)\n }\n }, [isOpen])\n\n // children이 있으면 커스텀 렌더링\n if (children) {\n return (\n <div\n ref={ref}\n className={cn(\n 'sticky top-0 z-10',\n 'h-[72px] py-[16px] pl-[18px] pr-[16px]',\n 'flex items-center gap-[16px]',\n 'bg-secondary-o10-blur backdrop-blur-md border-b border-sys-divider-subtler',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'sticky top-0 z-10',\n 'h-[72px] py-[16px] pl-[18px] pr-[16px]',\n 'flex items-center gap-[16px]',\n 'bg-secondary-o10-blur backdrop-blur-md border-b border-sys-divider-subtler',\n !isOpen && 'cursor-pointer',\n className,\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={!isOpen ? toggle : undefined}\n role={!isOpen ? 'button' : undefined}\n aria-label={!isOpen ? openLabel : undefined}\n tabIndex={!isOpen ? 0 : undefined}\n onKeyDown={\n !isOpen\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle()\n }\n }\n : undefined\n }\n {...props}\n >\n {/* Avatar */}\n {avatar && (\n <div className='shrink-0 flex items-center justify-center size-[36px]'>\n {isFullyCollapsed && isHovered ? (\n <PanelLeft size={20} className='text-sys-text-subtle' />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'size-[36px] rounded-full',\n 'border border-sys-divider-subtler',\n 'text-h6',\n )}\n style={{\n backgroundColor: avatarColor || 'var(--color-secondary20)',\n color: 'var(--color-sys-text-normal)',\n }}\n >\n {avatar}\n </div>\n )}\n </div>\n )}\n\n {/* Title & Description */}\n {(title || description) && (\n <div\n className={cn(\n 'flex flex-col justify-center flex-1 min-w-0',\n 'transition-all duration-200',\n isOpen ? 'opacity-100 delay-150' : 'opacity-0 delay-0',\n isHovered && isOpen && 'pr-[20px]',\n )}\n >\n {title && <p className='text-h6 text-sys-text-main truncate'>{title}</p>}\n {description && (\n <p className='text-small-regular text-sys-text-subtle truncate'>{description}</p>\n )}\n </div>\n )}\n\n {/* 펼친 상태: 호버 시 토글 버튼 페이드인 */}\n {isOpen && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n variant='secondaryLink'\n shape='normal'\n spacing='compact'\n onClick={(e) => {\n e.stopPropagation()\n toggle()\n }}\n className={cn(\n 'absolute right-[8px] top-1/2 -translate-y-1/2',\n 'transition-opacity duration-150',\n isHovered ? 'opacity-100' : 'opacity-0',\n )}\n aria-label={closeLabel}\n >\n <PanelLeft size={20} />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent side='right'>{closeLabel}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )\n },\n)\nSidebarHeader.displayName = 'SidebarHeader'\n\n/* ------------------------------ SidebarToggle ----------------------------- */\n/* Header 없는 경우의 standalone toggle */\n\ntype SidebarToggleProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\n openLabel?: string\n closeLabel?: string\n}\n\nconst SidebarToggle = React.forwardRef<HTMLDivElement, SidebarToggleProps>(\n ({ className, openLabel = '사이드바 열기', closeLabel = '사이드바 접기', ...props }, ref) => {\n const { isOpen, toggle } = useSidebar()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'h-[40px] flex items-center',\n isOpen ? 'justify-end px-[8px]' : 'justify-center',\n className,\n )}\n {...props}\n >\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n variant='secondaryLink'\n shape='normal'\n spacing='compact'\n className='opacity-50 hover:opacity-100 transition-opacity duration-150'\n onClick={toggle}\n aria-label={isOpen ? closeLabel : openLabel}\n >\n <PanelLeft size={20} />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent side='right'>{isOpen ? closeLabel : openLabel}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n )\n },\n)\nSidebarToggle.displayName = 'SidebarToggle'\n\n/* ----------------------------- SidebarContent ----------------------------- */\n\nconst SidebarContent = React.forwardRef<HTMLElement, React.HTMLAttributes<HTMLElement>>(\n ({ className, ...props }, ref) => (\n <nav ref={ref} className={cn('flex-1 overflow-x-clip', className)} {...props} />\n ),\n)\nSidebarContent.displayName = 'SidebarContent'\n\n/* ----------------------------- SidebarSection ----------------------------- */\n\ntype SidebarSectionProps = React.HTMLAttributes<HTMLDivElement> & {\n title?: string\n collapsible?: boolean\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nconst SidebarSection = React.forwardRef<HTMLDivElement, SidebarSectionProps>(\n (\n {\n className,\n title,\n collapsible = false,\n defaultOpen = true,\n open: controlledOpen,\n onOpenChange,\n children,\n ...props\n },\n ref,\n ) => {\n const { isOpen: sidebarOpen } = useSidebar()\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n\n const isExpanded = controlledOpen ?? uncontrolledOpen\n\n const toggleExpanded = React.useCallback(() => {\n const next = !isExpanded\n if (onOpenChange) {\n onOpenChange(next)\n } else {\n setUncontrolledOpen(next)\n }\n }, [isExpanded, onOpenChange])\n\n // 사이드바 접힘 시 또는 collapsible 아닐 때 → 항상 열림\n const showChildren = !collapsible || !sidebarOpen || isExpanded\n\n return (\n <div ref={ref} className={cn('', className)} {...props}>\n {title && (\n <div\n className={cn(\n 'h-[40px] px-[16px] py-[12px] flex items-center gap-[12px]',\n collapsible &&\n sidebarOpen &&\n 'cursor-pointer hover:bg-sys-button-secondary-subtle-background-hover',\n )}\n role={collapsible && sidebarOpen ? 'button' : undefined}\n tabIndex={collapsible && sidebarOpen ? 0 : undefined}\n onClick={collapsible && sidebarOpen ? toggleExpanded : undefined}\n onKeyDown={\n collapsible && sidebarOpen\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggleExpanded()\n }\n }\n : undefined\n }\n >\n {sidebarOpen && (\n <span className='text-small-bold text-sys-text-subtler whitespace-nowrap'>\n {title}\n </span>\n )}\n <Separator className='flex-1' />\n {collapsible && sidebarOpen && (\n <ChevronDown\n size={14}\n className={cn(\n 'text-sys-text-subtler shrink-0 transition-transform duration-200',\n isExpanded && 'rotate-180',\n )}\n />\n )}\n </div>\n )}\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out',\n showChildren ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <ul className='flex flex-col overflow-hidden'>{children}</ul>\n </div>\n </div>\n )\n },\n)\nSidebarSection.displayName = 'SidebarSection'\n\n/* ----------------------------- SidebarMenuItem ---------------------------- */\n\ntype SidebarMenuItemProps = React.HTMLAttributes<HTMLLIElement> & {\n icon?: string\n label: string\n isActive?: boolean\n asChild?: boolean\n}\n\nconst SidebarMenuItem = React.forwardRef<HTMLLIElement, SidebarMenuItemProps>(\n ({ className, icon, label, isActive = false, asChild = false, children, ...props }, ref) => {\n const { isOpen } = useSidebar()\n\n const buttonContent = (\n <span\n className={cn(\n 'flex items-center gap-[16px] w-full',\n 'pl-[21px] pr-[6px] py-[6px]',\n 'transition-all duration-200',\n // Active state\n isActive && [\n 'bg-sys-button-primary-subtle-background',\n 'border-l-[4px] border-primary30',\n 'hover:bg-sys-button-primary-subtle-background-hover',\n 'active:bg-sys-button-primary-subtle-background-press',\n ],\n // Inactive state\n !isActive && [\n 'border-l-[4px] border-transparent',\n 'hover:bg-sys-button-secondary-subtle-background-hover',\n 'active:bg-sys-button-secondary-subtle-background-press',\n ],\n )}\n >\n {/* Icon */}\n {icon && (\n <span className='shrink-0'>\n <LucideIcon\n iconComponentName={icon}\n size={20}\n className={cn(isActive ? 'text-primary40' : 'text-sys-text-subtle')}\n />\n </span>\n )}\n\n {/* Label */}\n <span\n className={cn(\n 'flex-1 text-left whitespace-nowrap overflow-hidden',\n 'transition-opacity duration-200',\n isOpen ? 'opacity-100 delay-150' : 'opacity-0 delay-0',\n isActive ? 'text-h6 text-primary40' : 'text-base-semibold text-sys-text-subtle',\n )}\n >\n {label}\n </span>\n </span>\n )\n\n const Comp = asChild ? Slot : 'div'\n\n const content = (\n <Comp className='flex items-center w-full cursor-pointer'>\n {asChild\n ? React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n children: buttonContent,\n })\n : children\n : buttonContent}\n </Comp>\n )\n\n return (\n <li ref={ref} className={cn('', className)} {...props}>\n {!isOpen ? (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent side='right'>{label}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n content\n )}\n </li>\n )\n },\n)\nSidebarMenuItem.displayName = 'SidebarMenuItem'\n\n/* ------------------------------ SidebarFooter ----------------------------- */\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { isOpen } = useSidebar()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'sticky bottom-0 z-10 mt-auto',\n 'bg-sys-background-blur backdrop-blur-md',\n 'transition-opacity duration-200',\n isOpen ? 'opacity-100 delay-150' : 'opacity-0 delay-0',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarFooter.displayName = 'SidebarFooter'\n\nexport {\n Sidebar,\n SidebarProvider,\n useSidebar,\n SidebarHeader,\n SidebarToggle,\n SidebarContent,\n SidebarSection,\n SidebarMenuItem,\n SidebarFooter,\n}\n","'use client'\n\nimport * as React from 'react'\n\nexport interface RangeBounds {\n min: number\n max: number\n step: number\n}\n\n/** step의 소수 자릿수 — 부동소수 잔차(0.1+0.2 등) 보정에 사용 */\nexport function getDecimals(step: number): number {\n if (!Number.isFinite(step)) return 0\n const s = String(step)\n const dot = s.indexOf('.')\n return dot === -1 ? 0 : s.length - dot - 1\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\n/** step 격자에 스냅(min 기준 반올림). step<=0이면 스냅하지 않음(continuous) */\nexport function snap(value: number, min: number, step: number): number {\n if (!(step > 0)) return value\n const steps = Math.round((value - min) / step)\n return min + steps * step\n}\n\n/** 부동소수 잔차 제거 */\nexport function fixPrecision(value: number, step: number): number {\n const d = getDecimals(step)\n return d > 0 ? Number(value.toFixed(d)) : value\n}\n\n/** clamp → snap → 정밀도 보정 → 다시 clamp(스냅이 max를 넘길 수 있어 재clamp) */\nexport function normalize(value: number, { min, max, step }: RangeBounds): number {\n const snapped = snap(clamp(value, min, max), min, step)\n return clamp(fixPrecision(snapped, step), min, max)\n}\n\nexport interface UseRangeValueOptions extends RangeBounds {\n /** controlled 값 */\n value?: number\n /** uncontrolled 초기값 */\n defaultValue?: number\n onValueChange?: (value: number) => void\n}\n\nexport interface UseRangeValueReturn {\n value: number\n setValue: (next: number) => void\n increment: () => void\n decrement: () => void\n canIncrement: boolean\n canDecrement: boolean\n}\n\n/**\n * Range 합성 컴포넌트용 단일값 상태 훅.\n * controlled/uncontrolled를 모두 지원하며, 커밋 시 항상 clamp/snap/정밀도 보정을 적용한다.\n */\nexport function useRangeValue({\n value,\n defaultValue,\n min,\n max,\n step,\n onValueChange,\n}: UseRangeValueOptions): UseRangeValueReturn {\n const bounds = React.useMemo<RangeBounds>(() => ({ min, max, step }), [min, max, step])\n const isControlled = value !== undefined\n\n const [internal, setInternal] = React.useState<number>(() =>\n normalize(defaultValue ?? min, { min, max, step }),\n )\n\n const current = isControlled ? normalize(value as number, bounds) : internal\n\n const setValue = React.useCallback(\n (next: number) => {\n const normalized = normalize(next, bounds)\n if (!isControlled) setInternal(normalized)\n if (normalized !== current) onValueChange?.(normalized)\n },\n [bounds, isControlled, onValueChange, current],\n )\n\n const increment = React.useCallback(() => setValue(current + step), [setValue, current, step])\n const decrement = React.useCallback(() => setValue(current - step), [setValue, current, step])\n\n return {\n value: current,\n setValue,\n increment,\n decrement,\n canIncrement: current < max,\n canDecrement: current > min,\n }\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { getDecimals } from './useRangeValue'\n\n/**\n * 눈금/라벨 위치 지정.\n * - 숫자 `25` → 그 값 위치에 dot + 숫자 라벨 \"25\"\n * - `{ value, label }` → dot + 커스텀 라벨(ReactNode)\n * - `{ value }`(label 생략) → dot만(discrete) / 아무것도 안 그림(continuous)\n */\nexport type RangeMark = number | { value: number; label?: React.ReactNode }\n\ninterface Tick {\n value: number\n label: React.ReactNode | null\n}\n\nexport interface TicksProps {\n min: number\n max: number\n step: number\n /** 채움 판정 기준값 — 단일값 `[v]` 또는 범위 `[lo, hi]` */\n value: number[]\n /** dot 표시 여부(discrete=true, continuous=false) */\n showDots?: boolean\n disabled?: boolean\n showLabels?: boolean\n /** 라벨 표시 간격(인덱스 기준, marks 미지정 시). 기본 2 = 짝수 인덱스 + 양끝 */\n labelEvery?: number\n /** 명시적 눈금/라벨 위치. 지정 시 step 기반 기본 눈금을 대체 */\n marks?: RangeMark[]\n}\n\nfunction formatLabel(value: number, step: number): string {\n const d = getDecimals(step)\n return d > 0 ? value.toFixed(d) : String(value)\n}\n\n/** 렌더할 눈금 목록 산출: marks 우선 → continuous 양끝 → discrete step 그리드 */\nfunction buildTicks({\n min,\n max,\n step,\n showDots,\n labelEvery,\n marks,\n}: {\n min: number\n max: number\n step: number\n showDots: boolean\n labelEvery: number\n marks?: RangeMark[]\n}): Tick[] {\n // 1) 명시 marks 우선 — step 기반 기본 눈금을 대체\n if (marks !== undefined) {\n return marks\n .map(\n (m): Tick =>\n typeof m === 'number'\n ? { value: m, label: formatLabel(m, step) }\n : { value: m.value, label: m.label ?? null },\n )\n .filter((t) => t.value >= min && t.value <= max)\n }\n // 2) continuous 기본 — 양끝(min/max) 라벨만\n if (!showDots) {\n return [\n { value: min, label: formatLabel(min, step) },\n { value: max, label: formatLabel(max, step) },\n ]\n }\n // 3) discrete 기본 — step 그리드(짝수 인덱스 + 양끝 라벨)\n const n = step > 0 ? Math.round((max - min) / step) : 0\n if (!Number.isFinite(n) || n <= 0) return []\n return Array.from({ length: n + 1 }, (_, i): Tick => {\n const v = min + i * step\n const labeled = i % labelEvery === 0 || i === 0 || i === n\n return { value: v, label: labeled ? formatLabel(v, step) : null }\n })\n}\n\n/**\n * 슬라이더 눈금/라벨 오버레이. discrete는 dot+라벨, continuous는 라벨만(dot은 invisible 스페이서로 라벨 위치만 맞춤).\n * 각 눈금을 thumb와 동일 좌표(좌우 8px=thumb 절반 inset + `left:f*100%` + -translate-x-1/2)에\n * 절대배치해, thumb를 그 값으로 옮기면 눈금/숫자와 정확히 가운데 정렬된다.\n * `marks`로 위치를 명시하면 step 기반 기본 눈금을 대체한다(불균등 위치도 동일 좌표계로 정렬).\n */\nexport function Ticks({\n min,\n max,\n step,\n value,\n showDots = true,\n disabled = false,\n showLabels = true,\n labelEvery = 2,\n marks,\n}: TicksProps) {\n const ticks = buildTicks({ min, max, step, showDots, labelEvery, marks })\n if (ticks.length === 0) return null\n\n const span = max - min\n const single = value.length < 2\n const lo = single ? min : Math.min(value[0], value[1])\n const hi = single ? (value[0] ?? min) : Math.max(value[0], value[1])\n // 단일값: thumb(=hi) 왼쪽 dot이 채워짐(thumb 위치 dot은 빈 상태). 범위: 두 thumb 사이만 채워짐.\n const isFilled = (v: number) => (single ? v < hi : v > lo && v < hi)\n\n return (\n <div className='pointer-events-none absolute left-[8px] right-[8px] top-[calc(50%-1px)]'>\n {ticks.map((tick, i) => {\n const f = span === 0 ? 0 : (tick.value - min) / span\n return (\n <div\n key={i}\n className='absolute flex -translate-x-1/2 flex-col items-center gap-[16px]'\n style={{ left: `${f * 100}%` }}\n >\n <span\n className={cn(\n 'block size-[2px] shrink-0 rounded-full',\n !showDots\n ? 'invisible'\n : disabled\n ? 'bg-secondary40'\n : isFilled(tick.value)\n ? 'bg-primary20'\n : 'bg-secondary40',\n )}\n />\n {showLabels && tick.label != null && (\n <span\n className={cn(\n 'whitespace-nowrap text-center text-small-regular',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-subtle',\n )}\n >\n {tick.label}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '../../utils/cn'\nimport { type RangeMark, Ticks } from './ticks'\n\ntype RadixRootProps = React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n\nexport interface RangeSliderProps extends Omit<RadixRootProps, 'children'> {\n /** discrete: step마다 눈금/숫자, continuous: 양끝 라벨만 */\n type?: 'discrete' | 'continuous'\n /** 눈금 숫자/양끝 라벨 표시 여부 */\n showLabels?: boolean\n /** 명시적 눈금/라벨 위치. 지정 시 step 기반 기본 눈금을 대체(discrete/continuous 공통) */\n marks?: RangeMark[]\n}\n\nconst THUMB_CLASS = cn(\n 'block size-[16px] shrink-0 rounded-full bg-primary30 outline-none transition-colors cursor-pointer',\n 'hover:bg-primary40 active:bg-primary50',\n 'focus-visible:ring-[3px] focus-visible:ring-sys-focus-ring-main',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:bg-secondary50 data-[disabled]:pointer-events-none',\n)\n\n/**\n * 저수준 슬라이더 파트(Radix 기반). Track + 채움(Range) + thumb 상태머신 + 선택적 discrete/continuous 라벨.\n * thumb 상태: default(primary30) → hover(primary40) → press(primary50) → focus(+ring) → disabled(secondary50).\n * 단일값/범위([lo,hi]) 모두 지원(value 배열 길이로 thumb 개수 결정).\n */\nexport const RangeSlider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n RangeSliderProps\n>(\n (\n {\n className,\n type = 'discrete',\n showLabels = true,\n marks,\n min = 0,\n max = 100,\n step = 1,\n value,\n defaultValue,\n onValueChange,\n disabled,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n ...props\n },\n ref,\n ) => {\n const isControlled = value !== undefined\n const [internal, setInternal] = React.useState<number[]>(defaultValue ?? [min])\n const current = isControlled ? (value as number[]) : internal\n\n // thumb(role=slider)마다 접근 가능한 이름. undefined 를 명시로 넘기면 Radix 의 기본 이름까지 지워지므로\n // 항상 문자열을 만든다. 두 thumb 이상이면 최솟값/최댓값을 붙인다.\n const thumbA11yProps = (i: number, n: number) => {\n const position = n <= 1 ? '' : i === 0 ? '최솟값' : i === n - 1 ? '최댓값' : `${i + 1}번째 값`\n const label = [ariaLabel, position].filter(Boolean).join(' ') || '값'\n return ariaLabelledby\n ? { 'aria-labelledby': ariaLabelledby, 'aria-label': label }\n : { 'aria-label': label }\n }\n\n const handleChange = React.useCallback(\n (next: number[]) => {\n if (!isControlled) setInternal(next)\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n return (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex min-h-[36px] w-full touch-none select-none items-center',\n className,\n )}\n min={min}\n max={max}\n step={step}\n value={isControlled ? (value as number[]) : undefined}\n defaultValue={isControlled ? undefined : (defaultValue ?? [min])}\n onValueChange={handleChange}\n disabled={disabled}\n {...props}\n >\n <SliderPrimitive.Track className='relative h-[4px] w-full grow rounded-full bg-secondary30'>\n <SliderPrimitive.Range className='absolute h-full rounded-full bg-primary30 data-[disabled]:bg-secondary50' />\n <Ticks\n min={min}\n max={max}\n step={step}\n value={current}\n marks={marks}\n showDots={type === 'discrete'}\n disabled={disabled}\n showLabels={showLabels}\n />\n </SliderPrimitive.Track>\n {current.map((_, i) => (\n <SliderPrimitive.Thumb\n key={i}\n className={THUMB_CLASS}\n {...thumbA11yProps(i, current.length)}\n />\n ))}\n </SliderPrimitive.Root>\n )\n },\n)\nRangeSlider.displayName = 'RangeSlider'\n","'use client'\n\nimport * as React from 'react'\n\nimport { normalize } from './useRangeValue'\n\nexport interface UseNumberInputOptions {\n /** 현재 커밋된 숫자 값 */\n value: number\n /** blur/Enter 시 검증·정규화된 값으로 커밋 */\n onCommit: (value: number) => void\n min: number\n max: number\n step: number\n}\n\nexport interface NumberInputProps {\n value: string\n onChange: React.ChangeEventHandler<HTMLInputElement>\n onFocus: React.FocusEventHandler<HTMLInputElement>\n onBlur: React.FocusEventHandler<HTMLInputElement>\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>\n}\n\n/**\n * 숫자 입력(TextField/`<input>`)용 검증 로직 훅.\n * 타이핑 중에는 자유 입력을 허용하고, blur/Enter에서만 검증한다(비숫자·빈값→이전 값 롤백, 범위초과→clamp, step→snap).\n * 반환값을 그대로 입력 요소에 spread 한다: `<TextField {...useNumberInput(...)} />`.\n */\nexport function useNumberInput({\n value,\n onCommit,\n min,\n max,\n step,\n}: UseNumberInputOptions): NumberInputProps {\n const [text, setText] = React.useState<string>(() => String(value))\n const [focused, setFocused] = React.useState(false)\n\n // 포커스 중이 아닐 때만 외부 value를 입력 표시에 반영(타이핑 중 덮어쓰기 방지).\n React.useEffect(() => {\n if (!focused) setText(String(value))\n }, [value, focused])\n\n const commit = React.useCallback(() => {\n const trimmed = text.trim()\n const parsed = Number(trimmed)\n if (trimmed === '' || Number.isNaN(parsed)) {\n setText(String(value)) // 비숫자·빈값 → 이전 값으로 롤백\n return\n }\n onCommit(normalize(parsed, { min, max, step }))\n }, [text, value, onCommit, min, max, step])\n\n return {\n value: text,\n onChange: (e) => setText(e.target.value),\n onFocus: () => setFocused(true),\n onBlur: () => {\n setFocused(false)\n commit()\n },\n onKeyDown: (e) => {\n if (e.key === 'Enter') e.currentTarget.blur()\n },\n }\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Minus, Plus } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { IconButton } from '../iconButton'\nimport { TextField } from '../textField'\nimport { RangeSlider } from './rangeSlider'\nimport { type RangeMark } from './ticks'\nimport { useNumberInput } from './useNumberInput'\nimport { useRangeValue } from './useRangeValue'\n\nexport interface RangeProps {\n min?: number\n max?: number\n step?: number\n /** controlled 값 */\n value?: number\n /** uncontrolled 초기값 */\n defaultValue?: number\n onValueChange?: (value: number) => void\n /** ±버튼·숫자입력 모서리 형태 (트랙/썸/눈금엔 영향 없음) */\n shape?: 'rounded' | 'normal' | 'angled'\n /** discrete: step 눈금/숫자, continuous: 양끝 라벨만 */\n type?: 'discrete' | 'continuous'\n disabled?: boolean\n /** ± 스테퍼 버튼 표시 (기본 true) */\n hasButtonControl?: boolean\n /** 숫자 입력박스 표시 (기본 true) */\n hasCustomInput?: boolean\n /** 눈금 숫자/양끝 라벨 표시 (기본 true) */\n showLabels?: boolean\n /** 명시적 눈금/라벨 위치. 지정 시 step 기반 기본 눈금을 대체 */\n marks?: RangeMark[]\n className?: string\n /** 슬라이더 thumb 과 숫자 입력의 접근 가능한 이름 (예: '학습률') */\n 'aria-label'?: string\n /** 외부 라벨 요소의 id. 지정 시 thumb 과 숫자 입력이 그 요소로 이름을 얻는다 */\n 'aria-labelledby'?: string\n /** 숫자 입력의 name (폼 전송용) */\n name?: string\n}\n\nconst SHAPE_RADIUS = {\n rounded: 'rounded-full',\n normal: 'rounded-small',\n angled: 'rounded-none',\n} as const\n\n/**\n * Figma \"Range\" 합성 컴포넌트 — ± 스테퍼(IconButton) + 슬라이더(RangeSlider) + 숫자 입력박스(DS TextField).\n * 숫자 입력 검증은 useNumberInput 훅이 담당. 단일값 전용 — 두 thumb 범위는 저수준 `RangeSlider`를 직접 쓴다.\n */\nexport const Range = React.forwardRef<HTMLDivElement, RangeProps>(\n (\n {\n min = 0,\n max = 100,\n step = 1,\n value,\n defaultValue,\n onValueChange,\n shape = 'rounded',\n type = 'discrete',\n disabled,\n hasButtonControl = true,\n hasCustomInput = true,\n showLabels = true,\n marks,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n name,\n },\n ref,\n ) => {\n const {\n value: current,\n setValue,\n increment,\n decrement,\n canIncrement,\n canDecrement,\n } = useRangeValue({ value, defaultValue, min, max, step, onValueChange })\n\n // 숫자 입력란 검증 로직(타이핑 버퍼 + blur/Enter 커밋·롤백·clamp·snap) — TextField에 spread.\n const numberInput = useNumberInput({ value: current, onCommit: setValue, min, max, step })\n\n // IconButton은 shape가 normal/rounded만 지원 → angled(0px 각진 모서리)는 className으로 rounded-none 오버라이드.\n const iconShape = shape === 'rounded' ? 'rounded' : 'normal'\n const iconOverride = shape === 'angled' ? '!rounded-none' : undefined\n\n return (\n <div ref={ref} className={cn('flex w-full items-center gap-[16px]', className)}>\n {hasButtonControl && (\n <IconButton\n variant='primary'\n spacing='normal'\n shape={iconShape}\n className={iconOverride}\n disabled={disabled || !canDecrement}\n onClick={decrement}\n aria-label='값 감소'\n >\n <Minus size={24} />\n </IconButton>\n )}\n\n <RangeSlider\n className='min-w-0 flex-1'\n type={type}\n showLabels={showLabels}\n marks={marks}\n min={min}\n max={max}\n step={step}\n value={[current]}\n onValueChange={([v]) => setValue(v)}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n />\n\n {hasCustomInput && (\n <TextField\n appearance='standard'\n // 58×36, 값 좌측정렬(TextField 기본) — 시안과 동일. 모서리만 shape별 오버라이드.\n className={cn('w-[58px] shrink-0', SHAPE_RADIUS[shape])}\n role='spinbutton'\n inputMode='decimal'\n name={name}\n // 숫자 입력도 라벨이 필요하다(axe label). 외부 라벨이 없으면 aria-label 로, 그것도 없으면 '값'\n aria-label={ariaLabelledby ? undefined : (ariaLabel ?? '값')}\n aria-labelledby={ariaLabelledby}\n aria-valuenow={current}\n aria-valuemin={min}\n aria-valuemax={max}\n disabled={disabled}\n {...numberInput}\n />\n )}\n\n {hasButtonControl && (\n <IconButton\n variant='primary'\n spacing='normal'\n shape={iconShape}\n className={iconOverride}\n disabled={disabled || !canIncrement}\n onClick={increment}\n aria-label='값 증가'\n >\n <Plus size={24} />\n </IconButton>\n )}\n </div>\n )\n },\n)\nRange.displayName = 'Range'\n","'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\nimport { Check, X } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\ntype SwitchSize = 'small' | 'large'\n\ninterface SwitchProps extends React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root> {\n size?: SwitchSize\n showIcon?: boolean\n}\n\n/**\n * 켜고 끄는 토글. 두 상태뿐인 설정에 쓴다 — 즉시 반영이든 폼 제출값이든.\n *\n * 언제 쓰나: 알림 켜기, 공개/비공개, 규칙 사용처럼 두 상태뿐인 설정. 폼 안에서는 `SwitchSection`(박스 + 제목·설명 + Switch)으로 둔다(2026-10-14, dl-ui-v3 ToggleField 관례 — 이전 \"폼 제출값은 Checkbox\" 규칙은 폐기).\n * 언제 안 쓰나: 여러 옵션 중 복수 선택(→ Checkbox·CheckboxSectionGroup), 세 가지 이상 상태(→ RadioGroup·RadioSectionGroup·Select).\n * 대신/함께: 라벨은 `Label` 로 연결하고, 상태 텍스트(\"켜짐\")를 옆에 따로 두지 않는다.\n */\nconst Switch = React.forwardRef<React.ElementRef<typeof SwitchPrimitives.Root>, SwitchProps>(\n ({ className, size = 'small', showIcon = true, ...props }, ref) => {\n const sizeClasses: Record<\n SwitchSize,\n { root: string; thumb: string; translate: string; checkIcon: string; xIcon: string }\n > = {\n small: {\n root: 'h-[20px] w-[38px]',\n thumb: 'h-[14px] w-[14px]',\n translate: 'data-[state=checked]:translate-x-[18px]',\n checkIcon: 'left-[3px] top-1/2 -translate-y-1/2',\n xIcon: 'left-[19px] top-1/2 -translate-y-1/2',\n },\n large: {\n root: 'h-[24px] w-[45px]',\n thumb: 'h-[18px] w-[18px]',\n translate: 'data-[state=checked]:translate-x-[21px]',\n checkIcon: 'left-[5px] top-[4px]',\n xIcon: 'left-[24px] top-[4px]',\n },\n }\n\n const current = sizeClasses[size]\n\n return (\n <SwitchPrimitives.Root\n ref={ref}\n className={cn(\n 'group relative peer inline-flex shrink-0 cursor-pointer items-center rounded-full px-[3px] transition-colors',\n // 끔 트랙은 secondary50(흰 바탕·손잡이 대비 3.7:1) — secondary60 은 외곽선 폼 안에서 \"진한 토글\" 로 읽혔다 (2026-10-17 이슈 47 5차)\n 'bg-secondary50 data-[state=checked]:bg-primary30',\n 'hover:data-[state=unchecked]:bg-secondary60 hover:data-[state=checked]:bg-primary40',\n 'disabled:cursor-not-allowed disabled:data-[state=unchecked]:bg-secondary-o10 disabled:data-[state=checked]:bg-primary-o20',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-sys-focus-ring-main)] focus-visible:ring-offset-2',\n current.root,\n className,\n )}\n {...props}\n >\n {showIcon && (\n <>\n <span\n className={cn(\n 'absolute pointer-events-none flex items-center justify-center size-[16px]',\n 'opacity-0 group-data-[state=checked]:opacity-100 transition-opacity',\n 'text-sys-background',\n current.checkIcon,\n )}\n >\n <Check className='w-[16px] h-[16px] block' strokeWidth={2.5} />\n </span>\n <span\n className={cn(\n 'absolute pointer-events-none flex items-center justify-center size-[16px]',\n 'opacity-0 group-data-[state=unchecked]:opacity-100 transition-opacity',\n 'text-sys-background',\n current.xIcon,\n )}\n >\n <X className='w-[16px] h-[16px] block' strokeWidth={2.5} />\n </span>\n </>\n )}\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none relative z-10 block rounded-full bg-sys-background shadow-gray-small ring-0 transition-transform data-[state=unchecked]:translate-x-0',\n 'data-[disabled]:opacity-60',\n current.thumb,\n current.translate,\n )}\n />\n </SwitchPrimitives.Root>\n )\n },\n)\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Switch } from './switch'\n\n// Switch(button)의 HTML title 속성과 이름이 겹치므로 뺀다 — 여기서 title 은 박스 제목\ninterface SwitchSectionProps extends Omit<React.ComponentPropsWithoutRef<typeof Switch>, 'title'> {\n /** 박스 안 왼쪽의 굵은 제목 (예: \"규칙 사용\") */\n title: React.ReactNode\n /** 제목 아래 한 줄 설명 (예: \"끄면 규칙은 저장되지만 알림을 보내지 않습니다\") */\n description?: React.ReactNode\n /** 박스(바깥 div)의 className. Switch 자체는 `switchClassName` */\n className?: string\n switchClassName?: string\n}\n\n/**\n * 토글 박스 — 테두리 상자 안에 제목·설명(왼쪽)과 Switch(오른쪽). dl-ui-v3 의 ToggleField(노트북 지원, 자동 갱신 등) 관례를 TDS 로 올린 것. 테두리·패딩·글자(제목 h5·설명 base·간격 4)는 RadioSection·CheckboxSection 카드와 같다 — 한 폼에 나란히 와도 한 가족으로 보이게.\n *\n * 언제 쓰나: 켜기/끄기 하나의 설정 — 즉시 반영이든 폼 제출값이든(규칙 사용, 실패 시 알림, 노트북 지원). 폼에서는 `FormField` 의 `field.value`·`field.onChange` 를 `checked`·`onCheckedChange` 에 연결하고 `FormControl` 로 감싼다(id·aria 가 Switch 에 간다).\n * 언제 안 쓰나: 여러 옵션 중 복수 선택(→ Checkbox·CheckboxSectionGroup), 세 가지 이상 상태(→ RadioSectionGroup·Select), 라벨만 있는 짧은 동의(→ Checkbox + Label).\n * 대신/함께: 제목을 누르면 Switch 가 눌린다(label htmlFor). 바깥 FormLabel 은 필드 이름(\"알림\"), 박스 제목은 무엇을 켜는지(\"실패 시 이메일 알림 받기\").\n */\nconst SwitchSection = React.forwardRef<React.ElementRef<typeof Switch>, SwitchSectionProps>(\n (\n {\n title,\n description,\n className,\n switchClassName,\n id,\n disabled,\n size = 'large',\n showIcon = false,\n ...props\n },\n ref,\n ) => {\n const autoId = React.useId()\n const switchId = id ?? autoId\n return (\n <div\n data-slot='switch-section'\n className={cn(\n // 테두리 상자 — RadioSection 카드와 같은 선(divider-main 1px)·같은 패딩(12px) (2026-10-20 16차 D2: \"toggle card differs in padding and border weight\").\n // 채움 박스(secondary-o10)는 외곽선 폼 안에서 홀로 채워져 보였다 (2026-10-17 이슈 47 4차)\n 'flex w-full items-center justify-between gap-[16px] rounded-medium border border-sys-divider-main bg-sys-background p-[12px]',\n disabled && 'opacity-60',\n className,\n )}\n >\n {/* 글자는 RadioSection·CheckboxSection 카드와 같게(제목 text-h5 · 설명 text-base-regular · 간격 4) — h6/small 이던 때 한 폼에서\n \"toggle card uses smaller title text than the event cards\" 로 감점 (2026-10-26 22차, 21차 세트 2 component_consistency −0.78) */}\n <label\n htmlFor={switchId}\n className={cn(\n 'flex min-w-0 flex-col gap-[4px]',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n >\n <span className='break-keep text-h5 text-sys-text-main wrap-break-word'>{title}</span>\n {description ? (\n <span className='break-keep text-base-regular text-sys-text-subtle wrap-break-word'>\n {description}\n </span>\n ) : null}\n </label>\n {/* 카드 안의 토글은 large(24×45)·아이콘 없음 — small 의 썸 안 ✓/× 가 \"cramped toggle\"·\"tiny cross\" 로 감점 (2026-10-20 16차 D3). 호출자가 size·showIcon 으로 덮을 수 있다 */}\n <Switch\n ref={ref}\n id={switchId}\n disabled={disabled}\n size={size}\n showIcon={showIcon}\n className={switchClassName}\n {...props}\n />\n </div>\n )\n },\n)\nSwitchSection.displayName = 'SwitchSection'\n\nexport { SwitchSection }\nexport type { SwitchSectionProps }\n","'use client'\n\nimport * as React from 'react'\nimport TextareaAutosize, { TextareaAutosizeProps } from 'react-textarea-autosize'\nimport { cva } from 'class-variance-authority'\n\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport { useFormControlContext } from './form'\n\nconst textareaContainerVariants = cva(\n [\n 'flex w-full items-start bg-transparent',\n 'rounded-small min-h-[84px] text-base-medium text-sys-text-main',\n 'transition-colors',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px]',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\nexport type TextareaProps = Omit<TextareaAutosizeProps, 'children'> & {\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** Floating label 텍스트 */\n label?: string\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /** 에러 상태 */\n isInvalid?: boolean\n /** 컨테이너 div에 적용할 추가 className */\n containerClassName?: string\n /** 수동 리사이즈 허용 */\n resize?: boolean\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n appearance = 'standard',\n label,\n required: requiredProp,\n isInvalid: isInvalidProp,\n containerClassName,\n className,\n disabled,\n readOnly,\n resize = false,\n minRows = 3,\n maxRows,\n value: valueProp,\n defaultValue,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n style,\n ...textareaProps\n },\n forwardedRef,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const [isFocused, setIsFocused] = React.useState(false)\n\n // Controlled vs Uncontrolled hasValue tracking\n const isControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState(\n defaultValue !== undefined ? String(defaultValue) : '',\n )\n const hasValue = isControlled ? String(valueProp) !== '' : internalValue !== ''\n\n // Compose refs (forwarded ref + internal ref)\n const composedRef = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n ;(textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n },\n [forwardedRef],\n )\n\n // Floating label\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n // --- Handlers ---\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInternalValue(e.target.value)\n onChangeProp?.(e)\n },\n [isControlled, onChangeProp],\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n return (\n <div\n data-slot='textarea'\n aria-disabled={disabled || undefined}\n className={cn(\n textareaContainerVariants({ appearance, isInvalid }),\n // Focus styling (state-managed, standard appearance without notched outline only)\n isFocused &&\n !isInvalid &&\n appearance === 'standard' &&\n !showNotchedOutline &&\n 'border-[2px] border-sys-focus-ring-bold py-[2px] px-[4px]',\n // Floating label positioning\n (showNotchedOutline || showNoneLabel) && 'relative',\n // Notched outline draws border — remove container's own border\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n // Disabled / cursor\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-text',\n // disabled 시 hover 배경 무력화 (div container라 :disabled 불가 → JS 조건부; none은 원래 hover bg 없음)\n disabled && appearance !== 'none' && 'hover:bg-sys-background',\n containerClassName,\n // 외부 className 은 root container 에 적용 — FormControl 의 maxWidth 가\n // 자식 className 에 inject 되는데, wrapper div 의 폭 제어가 의도이므로\n // inner textarea 가 아닌 여기에 머지한다.\n className,\n )}\n style={{\n resize: resize ? 'vertical' : 'none',\n overflow: resize ? 'hidden' : undefined,\n }}\n >\n {/* Floating label (standard: notched outline, none: inline label) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* Textarea */}\n <TextareaAutosize\n ref={composedRef}\n minRows={minRows}\n maxRows={maxRows}\n disabled={disabled}\n readOnly={readOnly}\n value={isControlled ? valueProp : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-required={hasLabel && requiredProp ? true : undefined}\n className={cn(\n 'flex-1 min-w-0 bg-transparent border-none outline-none',\n 'text-base-medium text-sys-text-main',\n 'placeholder:text-sys-text-placeholder',\n 'disabled:cursor-not-allowed',\n 'px-[4px] py-[2px]',\n // maxRows 미지정(무한 auto-grow) 시 자체 스크롤바 숨김: 스크롤바가 뜨면 content 폭이 줄어\n // autosize 재측정과 어긋나 스크롤바가 고착되는 피드백 루프를 막는다(스크롤바 없으면 content 가\n // height 에 정확히 맞아 잘림 없음). maxRows 지정(바운드) 시엔 기본 overflow-y:auto 로 캡 초과분 스크롤.\n maxRows == null && 'overflow-hidden',\n // When label is down (acting as placeholder), hide textarea's placeholder\n hasLabel && !hasValue && !isFocused && 'placeholder:text-transparent',\n )}\n style={{\n resize: 'none',\n ...style,\n }}\n {...textareaProps}\n />\n </div>\n )\n },\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { Clock } from 'lucide-react'\n\nimport { CancelIcon } from './_internal/cancelIcon'\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './popover'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TimeValue24 = string // \"HH:mm\" e.g., \"14:33\"\n\nexport type TimeValue12 = {\n hour: number // 1-12\n minute: number // 0-59\n period: 'AM' | 'PM'\n}\n\nexport type HourType = '24hrs' | '12hrs'\n\ninterface TimePickerBaseProps {\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 비활성 상태 */\n disabled?: boolean\n /** 에러/유효하지 않은 상태 */\n isInvalid?: boolean\n /** Floating label 텍스트 */\n label?: string\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /** 분 간격. @default 5 */\n minuteStep?: number\n /** 클래스 오버라이드. `trigger` = 트리거 틀(기본 폭 160px, 12시간 180px — 폼 칸을 채우려면 `'w-full'`), `popoverContent` = 시·분 팝오버 */\n classNames?: {\n trigger?: string\n popoverContent?: string\n }\n}\n\nexport type TimePickerProps = TimePickerBaseProps &\n (\n | {\n hourType?: '24hrs'\n value?: TimeValue24\n onChange?: (value: TimeValue24 | undefined) => void\n }\n | {\n hourType: '12hrs'\n value?: TimeValue12\n onChange?: (value: TimeValue12 | undefined) => void\n }\n )\n\n// ============================================================================\n// Internal types\n// ============================================================================\n\ninterface ParsedTime {\n hour: string | null // 두 자리 문자열 (\"00\"-\"23\" 또는 \"01\"-\"12\")\n minute: string | null // 두 자리 문자열 (\"00\"-\"59\")\n period: 'AM' | 'PM' | null // 12hrs 전용\n}\n\n// ============================================================================\n// Utility functions\n// ============================================================================\n\nfunction parseTimeValue(\n value: TimeValue24 | TimeValue12 | undefined,\n hourType: HourType,\n): ParsedTime {\n if (value == null) return { hour: null, minute: null, period: null }\n\n if (hourType === '12hrs') {\n if (typeof value !== 'object') return { hour: null, minute: null, period: null }\n const v = value as TimeValue12\n if (\n typeof v.hour !== 'number' ||\n typeof v.minute !== 'number' ||\n (v.period !== 'AM' && v.period !== 'PM')\n )\n return { hour: null, minute: null, period: null }\n if (v.hour < 1 || v.hour > 12 || v.minute < 0 || v.minute > 59)\n return { hour: null, minute: null, period: null }\n return {\n hour: String(v.hour).padStart(2, '0'),\n minute: String(v.minute).padStart(2, '0'),\n period: v.period,\n }\n }\n\n // 24hrs\n if (typeof value !== 'string') return { hour: null, minute: null, period: null }\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/)\n if (!match) return { hour: null, minute: null, period: null }\n const h = parseInt(match[1], 10)\n const m = parseInt(match[2], 10)\n if (h < 0 || h > 23 || m < 0 || m > 59) return { hour: null, minute: null, period: null }\n return {\n hour: String(h).padStart(2, '0'),\n minute: String(m).padStart(2, '0'),\n period: null,\n }\n}\n\nfunction formatDisplayText(\n value: TimeValue24 | TimeValue12 | undefined,\n hourType: HourType,\n): string {\n const parsed = parseTimeValue(value, hourType)\n if (!parsed.hour || !parsed.minute) return ''\n\n if (hourType === '12hrs') {\n const periodLabel = parsed.period === 'AM' ? '오전' : '오후'\n return `${periodLabel} ${parsed.hour} : ${parsed.minute}`\n }\n return `${parsed.hour} : ${parsed.minute}`\n}\n\nfunction hasTimeValue(value: TimeValue24 | TimeValue12 | undefined, hourType: HourType): boolean {\n const parsed = parseTimeValue(value, hourType)\n return parsed.hour !== null && parsed.minute !== null\n}\n\nfunction generateHourOptions(hourType: HourType): { value: string; label: string }[] {\n if (hourType === '12hrs') {\n return Array.from({ length: 12 }, (_, i) => {\n const h = i + 1\n const val = String(h).padStart(2, '0')\n return { value: val, label: val }\n })\n }\n return Array.from({ length: 24 }, (_, i) => {\n const val = String(i).padStart(2, '0')\n return { value: val, label: val }\n })\n}\n\nfunction generateMinuteOptions(step: number): { value: string; label: string }[] {\n const safeStep = Math.max(1, Math.floor(step))\n const options: { value: string; label: string }[] = []\n for (let m = 0; m < 60; m += safeStep) {\n const val = String(m).padStart(2, '0')\n options.push({ value: val, label: val })\n }\n return options\n}\n\nconst PERIOD_OPTIONS: { value: string; label: string }[] = [\n { value: 'AM', label: '오전' },\n { value: 'PM', label: '오후' },\n]\n\n// ============================================================================\n// Trigger CVA\n// ============================================================================\n\n// 래퍼 div 에 적용된다 (트리거 button 과 Clear button 의 공통 부모). 포커스 링은 focus-within, 비활성은 data-disabled.\nconst timePickerTriggerVariants = cva(\n [\n 'flex items-center gap-[2px] bg-transparent whitespace-nowrap outline-none cursor-pointer',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10 data-[disabled]:hover:bg-sys-background',\n 'focus-within:border-[2px] focus-within:border-sys-focus-ring-bold focus-within:py-[2px] focus-within:px-[4px]',\n 'data-[state=open]:border-[2px] data-[state=open]:border-sys-focus-ring-bold data-[state=open]:py-[2px] data-[state=open]:px-[4px]',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n hourType: {\n '24hrs': 'w-[160px]',\n '12hrs': 'w-[180px]',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class:\n 'border-[2px] border-danger30 py-[2px] px-[4px] focus-within:border-danger30 data-[state=open]:border-danger30',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n hourType: '24hrs',\n },\n },\n)\n\n// ============================================================================\n// TimePickerTrigger\n// ============================================================================\n\ninterface TimePickerTriggerProps {\n open: boolean\n hasValue: boolean\n displayText: string\n placeholder: string\n disabled?: boolean\n isInvalid?: boolean\n label?: string\n required?: boolean\n appearance?: 'standard' | 'none'\n hourType?: HourType\n onClear?: () => void\n onFocus?: React.FocusEventHandler<HTMLButtonElement>\n onBlur?: React.FocusEventHandler<HTMLButtonElement>\n className?: string\n}\n\nconst TimePickerTrigger = React.forwardRef<HTMLButtonElement, TimePickerTriggerProps>(\n (\n {\n open,\n hasValue,\n displayText,\n placeholder,\n disabled,\n isInvalid,\n label,\n required: requiredProp,\n appearance = 'standard',\n hourType = '24hrs',\n onClear,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n className,\n },\n ref,\n ) => {\n const [isFocused, setIsFocused] = React.useState(false)\n\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n const handleClearClick = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n onClear?.()\n },\n [onClear],\n )\n\n // 트리거 button 과 Clear button 은 형제다(위젯 중첩 금지, axe nested-interactive).\n // 래퍼 div 가 모양을 담당하고, 래퍼의 빈 영역(아이콘 등)을 눌러도 트리거가 눌리도록 포워딩한다.\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const setRefs = (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLButtonElement | null>).current = node\n }\n // 마우스 편의용: 아이콘 등 래퍼의 빈 영역 클릭을 트리거로 넘긴다. 키보드·보조기기는 트리거 button 을 직접 쓴다\n const handleWrapperClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const t = e.target as HTMLElement\n if (t.closest('[data-slot=timepicker-trigger],[data-slot=timepicker-clear]')) return\n triggerRef.current?.click()\n }\n\n return (\n <PopoverAnchor asChild>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- 포인터 편의 포워딩, 실제 컨트롤은 안쪽 button */}\n <div\n data-slot='timepicker'\n data-state={open ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n className={cn(\n timePickerTriggerVariants({ appearance, isInvalid, hourType }),\n '[&_[data-placeholder]]:text-sys-text-subtler',\n (showNotchedOutline || showNoneLabel) && 'relative',\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n className,\n )}\n onClick={handleWrapperClick}\n >\n {/* FloatingLabelOutline (조건부) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n <PopoverTrigger asChild>\n <button\n ref={setRefs}\n type='button'\n data-slot='timepicker-trigger'\n data-state={open ? 'open' : 'closed'}\n aria-labelledby={hasLabel ? labelId : undefined}\n disabled={disabled}\n className={cn(\n 'flex flex-1 items-center min-h-[28px] min-w-0 px-[4px] py-[2px] text-left bg-transparent outline-none cursor-pointer',\n 'disabled:cursor-not-allowed',\n hasLabel && !hasValue && 'invisible',\n )}\n onFocus={hasLabel ? handleFocus : onFocusProp}\n onBlur={hasLabel ? handleBlur : onBlurProp}\n >\n {hasValue ? (\n <span className='truncate'>{displayText}</span>\n ) : (\n <span data-placeholder className='truncate'>\n {placeholder}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n {/* Clear 버튼 — 형제 button. 값이 없거나 비활성이면 invisible(폭 유지, 포커스 불가) */}\n {onClear && (\n <button\n type='button'\n data-slot='timepicker-clear'\n onClick={handleClearClick}\n disabled={disabled}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler cursor-pointer outline-none',\n 'focus-visible:ring-[2px] focus-visible:ring-sys-focus-ring-main',\n (!hasValue || disabled) && 'invisible',\n )}\n aria-label='시간 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* Clock 아이콘 (장식, 클릭은 래퍼가 트리거로 포워딩) */}\n <Clock aria-hidden className='size-[24px] shrink-0 text-sys-text-main' />\n </div>\n </PopoverAnchor>\n )\n },\n)\nTimePickerTrigger.displayName = 'TimePickerTrigger'\n\n// ============================================================================\n// TimeColumn\n// ============================================================================\n\ninterface TimeColumnProps {\n options: { value: string; label: string }[]\n selectedValue: string | null\n onSelect: (value: string) => void\n 'aria-label': string\n}\n\nfunction TimeColumn({\n options,\n selectedValue,\n onSelect,\n 'aria-label': ariaLabel,\n}: TimeColumnProps) {\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // 선택된 항목으로 스크롤\n React.useEffect(() => {\n if (!listRef.current || !selectedValue) return\n const selectedEl = listRef.current.querySelector(`[data-value=\"${selectedValue}\"]`)\n if (selectedEl && typeof selectedEl.scrollIntoView === 'function') {\n selectedEl.scrollIntoView({ block: 'nearest' })\n }\n }, [selectedValue])\n\n return (\n <div\n ref={listRef}\n role='listbox'\n aria-label={ariaLabel}\n // 스크롤 영역은 키보드로 닿아야 한다(axe scrollable-region-focusable). 화살표로 옵션 사이를 이동한다\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n const items = Array.from(\n listRef.current?.querySelectorAll<HTMLElement>('[role=\"option\"]') ?? [],\n )\n if (!items.length) return\n const cur = items.indexOf(document.activeElement as HTMLElement)\n const selected = items.findIndex((i) => i.dataset.state === 'checked')\n const start =\n cur >= 0 ? cur : selected >= 0 ? selected : e.key === 'ArrowDown' ? -1 : items.length\n const next = Math.min(\n items.length - 1,\n Math.max(0, start + (e.key === 'ArrowDown' ? 1 : -1)),\n )\n items[next]?.focus()\n }}\n className='flex-1 h-[192px] overflow-y-auto outline-none focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-sys-focus-ring-main'\n >\n {options.map((option) => (\n <div\n key={option.value}\n role='option'\n tabIndex={-1}\n aria-selected={selectedValue === option.value}\n data-value={option.value}\n data-state={selectedValue === option.value ? 'checked' : 'unchecked'}\n onClick={() => onSelect(option.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect(option.value)\n }\n }}\n className={cn(\n 'flex items-center min-h-[32px] px-[8px] py-[2px]',\n 'border-b border-secondary-o20',\n 'text-base-medium text-sys-text-main cursor-pointer select-none',\n 'hover:bg-primary10',\n selectedValue === option.value && 'bg-secondary-o20 hover:bg-secondary-o40',\n )}\n >\n {option.label}\n </div>\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// TimePicker\n// ============================================================================\n\n/**\n * 시각(시·분)을 고르는 입력. 트리거를 누르면 시·분 목록 팝오버가 열린다. `hourType` 으로 24시간·12시간.\n *\n * 언제 쓰나: 폼의 시각 필드(예약 시작·종료 시각, 실행 시각). 날짜와 함께면 `DatePicker` 옆에 둔다.\n * 언제 안 쓰나: 날짜만(→ DatePicker), 기간(→ DatePickerRange), 분 단위 지속 시간(→ TextField + 단위).\n * 대신/함께: 기본 폭은 160px(12시간 180px)이다. 폼 칸을 채우려면 `classNames={{ trigger: 'w-full' }}`(DatePicker 는 `classNames={{ button: 'w-full' }}`) — 좁은 고정 폭이 줄의 절반을 비워 감점됐다(2026-10-28 홀드아웃 14).\n */\nexport function TimePicker(props: TimePickerProps) {\n const {\n value,\n onChange,\n placeholder = word.common.startTime,\n disabled,\n isInvalid = false,\n label,\n appearance = 'standard',\n required,\n minuteStep: minuteStepProp = 5,\n classNames,\n } = props\n\n const hourType: HourType = props.hourType ?? '24hrs'\n const minuteStep = Math.max(1, Math.floor(minuteStepProp))\n\n // Popover 상태\n const [open, setOpen] = React.useState(false)\n\n // 현재 value 파싱\n const parsed = React.useMemo(() => parseTimeValue(value, hourType), [value, hourType])\n const isFilled = hasTimeValue(value, hourType)\n const displayText = React.useMemo(() => formatDisplayText(value, hourType), [value, hourType])\n\n // Pending 선택 상태 (popover 열려있는 동안)\n const [pendingHour, setPendingHour] = React.useState<string | null>(null)\n const [pendingMinute, setPendingMinute] = React.useState<string | null>(null)\n const [pendingPeriod, setPendingPeriod] = React.useState<string | null>(null)\n\n // Popover 열릴 때 pending 상태 초기화\n React.useEffect(() => {\n if (open) {\n setPendingHour(parsed.hour)\n setPendingMinute(parsed.minute)\n setPendingPeriod(parsed.period)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // 옵션 생성 (memoized)\n const hourOptions = React.useMemo(() => generateHourOptions(hourType), [hourType])\n const minuteOptions = React.useMemo(() => generateMinuteOptions(minuteStep), [minuteStep])\n\n // onChange 호출 헬퍼\n const emitChange = React.useCallback(\n (hour: string, minute: string, period: string | null) => {\n if (!onChange) return\n\n if (hourType === '12hrs') {\n const h = parseInt(hour, 10)\n const m = parseInt(minute, 10)\n ;(onChange as (v: TimeValue12 | undefined) => void)({\n hour: h,\n minute: m,\n period: (period ?? 'AM') as 'AM' | 'PM',\n })\n } else {\n ;(onChange as (v: TimeValue24 | undefined) => void)(`${hour}:${minute}`)\n }\n },\n [onChange, hourType],\n )\n\n // 컬럼 선택 시 pending 업데이트 + 완성 시 onChange 호출\n const handleHourSelect = React.useCallback(\n (val: string) => {\n setPendingHour(val)\n // 12hrs 모드에서 period가 없으면 기본 AM\n const effectivePeriod = hourType === '12hrs' ? (pendingPeriod ?? 'AM') : null\n if (pendingMinute) {\n emitChange(val, pendingMinute, effectivePeriod)\n setOpen(false)\n }\n },\n [pendingMinute, pendingPeriod, hourType, emitChange],\n )\n\n const handleMinuteSelect = React.useCallback(\n (val: string) => {\n setPendingMinute(val)\n const effectivePeriod = hourType === '12hrs' ? (pendingPeriod ?? 'AM') : null\n if (pendingHour) {\n emitChange(pendingHour, val, effectivePeriod)\n setOpen(false)\n }\n },\n [pendingHour, pendingPeriod, hourType, emitChange],\n )\n\n const handlePeriodSelect = React.useCallback(\n (val: string) => {\n setPendingPeriod(val)\n if (pendingHour && pendingMinute) {\n emitChange(pendingHour, pendingMinute, val)\n setOpen(false)\n }\n },\n [pendingHour, pendingMinute, emitChange],\n )\n\n // Clear\n const handleClear = React.useCallback(() => {\n if (hourType === '12hrs') {\n ;(onChange as ((v: TimeValue12 | undefined) => void) | undefined)?.(undefined)\n } else {\n ;(onChange as ((v: TimeValue24 | undefined) => void) | undefined)?.(undefined)\n }\n }, [onChange, hourType])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <TimePickerTrigger\n open={open}\n hasValue={isFilled}\n displayText={displayText}\n placeholder={placeholder}\n disabled={disabled}\n isInvalid={isInvalid}\n label={label}\n required={required}\n appearance={appearance}\n hourType={hourType}\n onClear={onChange ? handleClear : undefined}\n className={classNames?.trigger}\n />\n <PopoverContent\n aria-label='시간 선택'\n className={cn(\n 'p-0 !border-0 overflow-hidden min-w-[var(--radix-popover-trigger-width)]',\n classNames?.popoverContent,\n )}\n align='start'\n >\n <div className='flex gap-[4px]'>\n {hourType === '12hrs' && (\n <TimeColumn\n options={PERIOD_OPTIONS}\n selectedValue={pendingPeriod}\n onSelect={handlePeriodSelect}\n aria-label='오전/오후 선택'\n />\n )}\n <TimeColumn\n options={hourOptions}\n selectedValue={pendingHour}\n onSelect={handleHourSelect}\n aria-label='시 선택'\n />\n <TimeColumn\n options={minuteOptions}\n selectedValue={pendingMinute}\n onSelect={handleMinuteSelect}\n aria-label='분 선택'\n />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\ntype Theme = 'light' | 'dark' | 'system'\ntype ResolvedTheme = 'light' | 'dark'\n\ninterface ThemeProviderProps {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n}\n\ninterface ThemeContextValue {\n theme: Theme\n resolvedTheme: ResolvedTheme\n setTheme: (theme: Theme) => void\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined)\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction resolveTheme(theme: Theme): ResolvedTheme {\n if (theme === 'system') return getSystemTheme()\n return theme\n}\n\nfunction getStoredTheme(storageKey: string): Theme | null {\n if (typeof window === 'undefined') return null\n try {\n const stored = localStorage.getItem(storageKey)\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored\n }\n } catch {\n // localStorage 접근 불가 (SSR, 프라이버시 모드 등)\n }\n return null\n}\n\nfunction ThemeProvider({ children, defaultTheme = 'light', storageKey }: ThemeProviderProps) {\n const [theme, setThemeState] = React.useState<Theme>(() => {\n if (storageKey) {\n const stored = getStoredTheme(storageKey)\n if (stored) return stored\n }\n return defaultTheme\n })\n\n const [resolvedTheme, setResolvedTheme] = React.useState<ResolvedTheme>(() => resolveTheme(theme))\n\n // theme 변경 시 resolvedTheme 업데이트\n React.useEffect(() => {\n setResolvedTheme(resolveTheme(theme))\n }, [theme])\n\n // system 테마일 때 OS 설정 변경 감지\n React.useEffect(() => {\n if (theme !== 'system') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = (e: MediaQueryListEvent) => {\n setResolvedTheme(e.matches ? 'dark' : 'light')\n }\n\n mediaQuery.addEventListener('change', handler)\n return () => mediaQuery.removeEventListener('change', handler)\n }, [theme])\n\n // document.documentElement에 data-theme 동기화\n React.useEffect(() => {\n const root = document.documentElement\n if (resolvedTheme === 'dark') {\n root.setAttribute('data-theme', 'dark')\n } else {\n root.removeAttribute('data-theme')\n }\n\n return () => {\n root.removeAttribute('data-theme')\n }\n }, [resolvedTheme])\n\n const setTheme = React.useCallback(\n (newTheme: Theme) => {\n setThemeState(newTheme)\n if (storageKey) {\n try {\n localStorage.setItem(storageKey, newTheme)\n } catch {\n // localStorage 접근 불가\n }\n }\n },\n [storageKey],\n )\n\n const value = React.useMemo<ThemeContextValue>(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n )\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\nfunction useTheme(): ThemeContextValue {\n const context = React.useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n\nfunction useOptionalTheme(): ThemeContextValue | undefined {\n return React.useContext(ThemeContext)\n}\n\nexport { ThemeProvider, useTheme, useOptionalTheme }\nexport type { Theme, ThemeProviderProps, ThemeContextValue, ResolvedTheme }\n","'use client'\n// sonner 공식 문서 : https://sonner.emilkowal.ski/\nimport React from 'react'\nimport { CircleCheck, CircleX, Info, TriangleAlert } from 'lucide-react'\nimport { ExternalToast, toast as sonnerToast, Toaster as SonnerToaster } from 'sonner'\n\nimport { useOptionalTheme } from './themeProvider'\n\n// sonner 기본 toast 사용\n\ntype ToastVariant = 'info' | 'success' | 'error' | 'warning'\n\ninterface ToastProps {\n id: string | number\n title: string\n description?: string | null\n variant?: ToastVariant\n toastOptions?: ExternalToast\n}\n\nfunction toast({ toastOptions, variant = 'info', ...toastData }: Omit<ToastProps, 'id'>) {\n const options = {\n position: 'top-right' as const,\n closeButton: true,\n duration: 10000,\n icon: variant ? icons[variant as keyof typeof icons] : undefined,\n richColors: true,\n classNames: {\n icon: 'self-start !w-[24px] !h-[24px]',\n },\n ...toastOptions,\n }\n\n // variant에 따라 적절한 sonner 메서드 사용\n switch (variant) {\n case 'success':\n return sonnerToast.success(toastData.title, {\n description: toastData.description,\n ...options,\n })\n case 'error':\n return sonnerToast.error(toastData.title, {\n description: toastData.description,\n ...options,\n })\n case 'warning':\n return sonnerToast.warning(toastData.title, {\n description: toastData.description,\n ...options,\n })\n default:\n return sonnerToast.info(toastData.title, {\n description: toastData.description,\n ...options,\n })\n }\n}\n\nconst icons = {\n success: <CircleCheck className='text-success30' />,\n info: <Info className='text-primary30' />,\n warning: <TriangleAlert className='text-critical30' />,\n error: <CircleX className='text-danger30' />,\n}\n\n/**\n * 화면 모서리에 잠깐 떴다 사라지는 알림(sonner). 앱 루트에 한 번 두고 `toast()` 로 띄운다.\n *\n * 언제 쓰나: 저장·삭제 완료, 서버 오류처럼 지나가도 되는 결과 알림. 성공은 짧게, 오류는 원인 한 줄.\n * 언제 안 쓰나: 화면에 남아 있어야 하는 안내·오류(→ Alert), 사용자의 확인이 필요한 것(→ AlertDialog), 폼 필드 오류(→ FormMessage).\n * 대신/함께: `ThemeProvider` 안에 두어야 다크 모드를 따라간다.\n */\nconst Toaster = React.forwardRef<\n React.ElementRef<typeof SonnerToaster>,\n React.ComponentPropsWithoutRef<typeof SonnerToaster>\n>((props, ref) => {\n const theme = useOptionalTheme()?.resolvedTheme\n return <SonnerToaster ref={ref} theme={theme} {...props} />\n})\nToaster.displayName = 'Toaster'\n\nexport { toast, Toaster }\n"]}
1
+ {"version":3,"sources":["../src/components/accordion.tsx","../src/components/alertDialog.tsx","../src/components/breadcrumb.tsx","../src/components/calendar.tsx","../src/components/checkboxSection.tsx","../src/components/columnFilter/types.ts","../src/components/columnFilter/ColumnFilter.tsx","../src/components/_internal/cancelIcon.tsx","../src/utils/message.ts","../src/components/command.tsx","../src/components/tableFilterParts.tsx","../src/components/columnFilter/ColumnFilterPopover.tsx","../src/components/columnFilter/ColumnFilterTag.tsx","../src/components/columnFilter/ColumnFilterInput.tsx","../src/components/popover.tsx","../src/components/columnVisibilityFilter.tsx","../src/components/_internal/floatingLabelOutline.tsx","../src/hooks/useFloatingLabel.ts","../src/utils/word.ts","../src/components/label.tsx","../src/components/datePresets.tsx","../src/components/tableFilter.tsx","../src/components/datePicker.tsx","../src/components/textField.tsx","../src/components/iconSelect/icons.json","../src/components/iconSelect/index.tsx","../src/components/metaItem.tsx","../src/components/eventList.tsx","../src/components/pageHeaderRefreshButton.tsx","../src/components/parameterTable/cellSelection/clipboard.ts","../src/components/parameterTable/cellSelection/types.ts","../src/components/parameterTable/types.ts","../src/components/parameterTable/ParameterTableRow.tsx","../src/components/parameterTable/ParameterTable.tsx","../src/components/progress.tsx","../src/components/radio.tsx","../src/components/radioGroup.tsx","../src/components/radioSection.tsx","../src/components/multiSelect/multiSelectContext.tsx","../src/components/multiSelect/multiSelect.tsx","../src/components/_internal/labelPass.tsx","../src/components/multiSelect/multiSelectContent.tsx","../src/components/multiSelect/multiSelectEmpty.tsx","../src/components/multiSelect/multiSelectGroup.tsx","../src/components/multiSelect/multiSelectInput.tsx","../src/components/select/selectItemContent.tsx","../src/components/multiSelect/multiSelectItem.tsx","../src/components/multiSelect/multiSelectLoading.tsx","../src/components/multiSelect/multiSelectSeparator.tsx","../src/components/select/selectContext.tsx","../src/components/select/selectTrigger.tsx","../src/components/tag.tsx","../src/components/multiSelect/multiSelectTrigger.tsx","../src/components/select/select.tsx","../src/components/select/selectContent.tsx","../src/components/select/selectEmpty.tsx","../src/components/select/selectGroup.tsx","../src/components/select/selectInput.tsx","../src/components/select/selectItem.tsx","../src/components/select/selectLoading.tsx","../src/components/select/selectRadioGroup.tsx","../src/components/select/selectRadioItem.tsx","../src/components/select/selectSeparator.tsx","../src/components/select/selectValue.tsx","../src/components/sidebar/index.tsx","../src/components/range/useRangeValue.ts","../src/components/range/ticks.tsx","../src/components/range/rangeSlider.tsx","../src/components/range/useNumberInput.ts","../src/components/range/range.tsx","../src/components/switch.tsx","../src/components/switchSection.tsx","../src/components/textArea.tsx","../src/components/timePicker.tsx","../src/components/themeProvider.tsx","../src/components/toast.tsx"],"names":["React","React2","jsx","jsxs","React3","React4","Fragment","React5","React6","React7","React8","CommandPrimitive","Info","React9","React10","FOCUS_RING_MAIN_STYLE","React11","React12","Search","React13","useState","useEffect","useCallback","React14","cva","forwardRef","date","todayPosition","ChevronLeft","useMemo","FilterTitle","format","ko","value","CheckIcon","React15","CalendarIcon","React16","useRef","debounce","filteredIcons","React18","React19","RadioGroupPrimitive2","React20","MultiSelect","React21","PopoverPrimitive2","React22","React23","PopoverPrimitive3","React24","React25","React26","React27","React28","React29","React30","React31","PopoverPrimitive4","Slot","React32","PopoverPrimitive5","React33","PopoverPrimitive6","React34","PopoverPrimitive7","search","React35","React36","React37","React38","React39","React40","React41","React42","React43","ChevronDown","React44","React45","React46","Range","React47","React48","Check","React49","React50","React51","React52","sonnerToast","CircleCheck","TriangleAlert","CircleX","SonnerToaster"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAM,sBAAA,GAA+BA,sBAAc,KAAK,CAAA;AAMxD,SAAS,UAAU,EAAE,MAAA,GAAS,OAAO,SAAA,EAAW,GAAG,OAAM,EAAmB;AAC1E,EAAA,uBACE,GAAA,CAAC,sBAAA,CAAuB,QAAA,EAAvB,EAAgC,OAAO,MAAA,EACtC,QAAA,kBAAA,GAAA;AAAA,IAAoB,kBAAA,CAAA,IAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MAChC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyD;AACvD,EAAA,uBAAO,GAAA,CAAoB,kBAAA,CAAA,IAAA,EAAnB,EAAwB,WAAA,EAAU,gBAAA,EAAiB,WAAW,EAAA,CAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAClG;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4D;AAC1D,EAAA,MAAM,MAAA,GAAeA,mBAAW,sBAAsB,CAAA;AACtD,EAAA,uBACE,GAAA;AAAA,IAAoB,kBAAA,CAAA,MAAA;AAAA,IAAnB;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,yCAAA;AAAA,QACA,MAAA,IACE;AAAA,OACJ;AAAA,MAEA,QAAA,kBAAA,IAAA;AAAA,QAAoB,kBAAA,CAAA,OAAA;AAAA,QAAnB;AAAA,UACC,WAAA,EAAU,mBAAA;AAAA,UACV,SAAA,EAAW,EAAA;AAAA,YACT,uEAAA;AAAA,YACA,sCAAA;AAAA,YACA,kCAAA;AAAA,YACA,gDAAA;AAAA,YACA,iJAAA;AAAA,YACA,kDAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG,KAAA;AAAA,UAEJ,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iFAAA,EACb,QAAA,EACH,CAAA;AAAA,4BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6EAAA,EACd,QAAA,kBAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,kFAAA;AAAA,gBACV,aAAA,EAAW;AAAA;AAAA,aACb,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4D;AAC1D,EAAA,uBACE,GAAA;AAAA,IAAoB,kBAAA,CAAA,OAAA;AAAA,IAAnB;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wDAAA;AAAA,QACA,0CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA;AAAA,UAExF;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;ACnFA,IAAM,WAAA,GAAmC,oBAAA,CAAA;AAEzC,IAAM,kBAAA,GAA0C,oBAAA,CAAA;AAChD,IAAM,iBAAA,GAAyC,oBAAA,CAAA;AAE/C,IAAM,kBAAA,GAA2BC,mBAG/B,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BC,GAAAA;AAAA,EAAsB,oBAAA,CAAA,OAAA;AAAA,EAArB;AAAA,IACE,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAA;AAAA,MACT,sDAAA;AAAA,MACA,uEAAA;AAAA,MACA,yEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA;AACF,CACD;AACD,kBAAA,CAAmB,cAAmC,oBAAA,CAAA,OAAA,CAAQ,WAAA;AAE9D,IAAM,0BAAA,GAA6B,IAAI,IAAA,EAAM;AAAA,EAC3C,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ,WAAA;AAAA,MACR,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;AAKD,IAAM,qBAA2BD,OAAA,CAAA,aAAA,CAAsC;AAAA,EACrE,OAAA,EAAS;AACX,CAAC,CAAA;AASD,IAAM,kBAAA,GAA2BA,OAAA,CAAA,UAAA,CAK/B,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,eAAA,EAAiB,gBAAA,EAAkB,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAErF,EAAA,MAAM,aAAA,GAAgB,uBAAA,CAAwB,EAAE,eAAA,EAAiB,kBAAkB,CAAA;AACnF,EAAA,uBACEC,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,EAAE,OAAA,EAAQ,EAC5C,QAAA,kBAAAC,IAAAA,CAAC,iBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,IAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,oBACpBA,GAAAA;AAAA,MAAsB,oBAAA,CAAA,OAAA;AAAA,MAArB;AAAA,QACE,GAAG,KAAA;AAAA,QACH,GAAG,aAAA;AAAA,QACJ,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,8GAAA;AAAA,UACA,2FAAA;AAAA,UACA,uEAAA;AAAA,UACA,yEAAA;AAAA,UACA,0BAAA,CAA2B,EAAE,KAAA,EAAO,CAAA;AAAA,UACpC;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAC;AACD,kBAAA,CAAmB,cAAmC,oBAAA,CAAA,OAAA,CAAQ,WAAA;AAE9D,IAAM,iBAAA,GAAoB,CAAC,KAAA,qBACzBA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACE,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAA,CAAG,mDAAA,EAAqD,KAAA,CAAM,SAAS;AAAA;AACpF;AAEF,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAEhC,IAAM,iBAAA,GAAoB,CAAC,KAAA,qBACzBA,GAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACE,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAA,CAAG,iDAAA,EAAmD,KAAA,CAAM,SAAS;AAAA;AAClF;AAEF,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAEhC,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,kBAASA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAU,gBAAA,EAAiB,CAAA;AAAA,EACjD,IAAA,kBAAMA,GAAAA,CAAC,IAAA,EAAA,EAAK,WAAU,uBAAA,EAAwB,CAAA;AAAA,EAC9C,OAAA,kBAASA,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAU,iBAAA,EAAkB,CAAA;AAAA,EACpD,MAAA,kBAAQA,GAAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,eAAA,EAAgB;AAC7C,CAAA;AAEA,IAAM,gBAAA,GAAyBD,mBAG7B,CAAC,EAAE,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AACjC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAUA,OAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA;AAEvD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,CAAA,EACb,QAAA,EAAA;AAAA,IAAA,aAAA,CAAc,WAAW,MAAM,CAAA;AAAA,oBAChCD,GAAAA;AAAA,MAAsB,oBAAA,CAAA,KAAA;AAAA,MAArB;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,gDAAA,EAAkD,KAAA,CAAM,SAAS,CAAA;AAAA,QAE9E,2BAAiB,QAAQ;AAAA;AAAA;AAC5B,GAAA,EACF,CAAA;AAEJ,CAAC;AACD,gBAAA,CAAiB,cAAmC,oBAAA,CAAA,KAAA,CAAM,WAAA;AAE1D,IAAM,sBAAA,GAA+BD,mBAGnC,CAAC,EAAE,UAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACzBC,GAAAA;AAAA,EAAsB,oBAAA,CAAA,WAAA;AAAA,EAArB;AAAA,IACE,GAAG,KAAA;AAAA,IACJ,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,0DAAA,EAA4D,KAAA,CAAM,SAAS,CAAA;AAAA,IAExF,2BAAiB,QAAQ;AAAA;AAC5B,CACD;AACD,sBAAA,CAAuB,cAAmC,oBAAA,CAAA,WAAA,CAAY,WAAA;AAEtE,IAAM,iBAAA,GAA0BD,OAAA,CAAA,UAAA,CAI9B,CAAC,EAAE,OAAA,EAAS,SAAS,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACnD,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAUA,mBAAW,kBAAkB,CAAA;AAEtE,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,OAAA,EAAS,aAAA;AAAA,IACT,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,uBACEC,IAAsB,oBAAA,CAAA,MAAA,EAArB,EAA4B,KAAU,OAAA,EAAO,IAAA,EAAE,GAAG,KAAA,EACjD,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,OAAA,EAAS,WAAW,aAAA,CAAc,aAAA,IAAiB,MAAM,CAAA,EAAG,OAAA,EACjE,UACH,CAAA,EACF,CAAA;AAEJ,CAAC;AACD,iBAAA,CAAkB,cAAmC,oBAAA,CAAA,MAAA,CAAO,WAAA;AAE5D,IAAM,iBAAA,GAA0BD,OAAA,CAAA,UAAA,CAG9B,CAAC,EAAE,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBACzBC,GAAAA,CAAsB,oBAAA,CAAA,MAAA,EAArB,EAA4B,GAAA,EAAU,OAAA,EAAO,IAAA,EAAE,GAAG,KAAA,EACjD,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,WAAA,EAAa,QAAA,EAAS,CAAA,EACxC,CACD;AACD,iBAAA,CAAkB,cAAmC,oBAAA,CAAA,MAAA,CAAO,WAAA;ACzK5D,IAAM,0BAAA,GAAmCE,sBAA+B,MAAS,CAAA;AAEjF,IAAM,UAAA,GAAmBA,OAAA,CAAA,UAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBACnCF,GAAAA,CAAC,0BAAA,CAA2B,QAAA,EAA3B,EAAoC,KAAA,EAAO,SAAA,EAC1C,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,YAAA,EAAW,YAAA,EAAa,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA,EACvF;AAEJ;AACA,UAAA,CAAW,WAAA,GAAc,YAAA;AAIzB,IAAM,cAAA,GAAuBE,OAAA,CAAA,UAAA;AAAA,EAC3B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxBF,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAU,SAAA,EAAW,EAAA,CAAG,+BAA+B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAEtF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;AAI7B,IAAM,cAAA,GAAuBE,OAAA,CAAA,UAAA;AAAA,EAC3B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxBF,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAU,SAAA,EAAW,EAAA,CAAG,+BAA+B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAEtF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;AAE7B,IAAM,eAAA,GAAkB,8DAAA;AAExB,SAAS,oBAAoB,QAAA,EAAmC;AAC9D,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,OAAO,QAAA;AACzC,EAAA,IAAUE,OAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,EAAG;AAClC,IAAA,MAAM,KAAA,GAAS,SAAS,KAAA,EAA0C,QAAA;AAClE,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAAA,EACxC;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,oBAAA,CACP,QAAA,EACA,QAAA,EACA,SAAA,EACiB;AACjB,EAAA,IAAI,CAAOA,OAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,EAAG;AACnC,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AAEzC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,QAAA;AAChB,EAAA,OAAaA,qBAAa,OAAA,EAAS;AAAA,IACjC,QAAA,kBACED,IAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,QAAA,mBAAWD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,eAAA,EAAkB,oBAAS,CAAA,GAAU,IAAA;AAAA,MACjE,QAAQ,KAAA,CAAM,QAAA;AAAA,MACd,4BAAYA,GAAAA,CAAC,UAAK,SAAA,EAAW,eAAA,EAAkB,qBAAU,CAAA,GAAU;AAAA,KAAA,EACtE;AAAA,GAEH,CAAA;AACH;AAYA,IAAM,cAAA,GAAuBE,OAAA,CAAA,UAAA;AAAA,EAC3B,CACE;AAAA,IACE,SAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,SAAA,GAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,GAAA;AAE9B,IAAA,MAAM,WAAA,GAAc,oBAAoB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,QAAA,IAAY,WAAA,CAAY,MAAA,GAAS,SAAA;AACrD,IAAA,MAAM,gBAAgB,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,WAAA;AAEtE,IAAA,MAAM,aAAA,mBACJD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,sBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,KAAA,EAAG;AAAA,KAAA,EACX,CAAA;AAGF,IAAA,MAAM,uBAAA,GACJ,WAAA,IAAqBE,OAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,GAClCA,OAAA,CAAA,YAAA;AAAA,MACJ,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,GACA,QAAA;AAEN,IAAA,MAAM,QAAA,GAAW,cAAc,aAAA,GAAgB,QAAA;AAE/C,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,IAAI,OAAA,KAAY,YAAY,SAAA,CAAA,EAAY;AACtC,QAAA,OAAO,oBAAA,CAAqB,uBAAA,EAAyB,QAAA,EAAU,SAAS,CAAA;AAAA,MAC1E;AACA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAO,uBAAA;AAAA,MACT;AACA,MAAA,uBACED,KAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,QAAA,mBAAWD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,eAAA,EAAkB,oBAAS,CAAA,GAAU,IAAA;AAAA,QACjE,QAAA;AAAA,QACA,4BAAYA,GAAAA,CAAC,UAAK,SAAA,EAAW,eAAA,EAAkB,qBAAU,CAAA,GAAU;AAAA,OAAA,EACtE,CAAA;AAAA,IAEJ,CAAA,GAAG;AAEH,IAAA,MAAM,8BACJA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,kDAAA;AAAA;AAAA,UAEA,iDAAA;AAAA,UACA,kDAAA;AAAA,UACA,iBAAA;AAAA,UACA,wCAAA;AAAA,UACA,wFAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,KACH;AAGF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EAAgB,eAAe,GAAA,EAC9B,QAAA,kBAAAC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,wBACrCA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,iCAAA,EACxB,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,WAAA,EAAY,CAAA,EAClD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;AAW7B,IAAM,cAAA,GAAuBE,OAAA,CAAA,UAAA;AAAA,EAC3B,CACE,EAAE,SAAA,EAAW,QAAA,GAAW,KAAA,EAAO,SAAA,GAAY,EAAA,EAAI,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,IACjF,GAAA,KACG;AACH,IAAA,MAAM,WAAA,GAAc,oBAAoB,QAAQ,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,QAAA,IAAY,WAAA,CAAY,MAAA,GAAS,SAAA;AACrD,IAAA,MAAM,gBAAgB,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,WAAA;AAEtE,IAAA,MAAM,WAAW,WAAA,mBACfD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EACd,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,sBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,KAAA,EAAG;AAAA,KAAA,EACX,CAAA,GAEA,QAAA;AAGF,IAAA,MAAM,8BACJC,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,MAAA;AAAA,QACL,eAAA,EAAc,MAAA;AAAA,QACd,cAAA,EAAa,MAAA;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,UACT,0FAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,mBAAWD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,eAAA,EAAkB,oBAAS,CAAA,GAAU,IAAA;AAAA,UACjE,QAAA;AAAA,UACA,4BAAYA,GAAAA,CAAC,UAAK,SAAA,EAAW,eAAA,EAAkB,qBAAU,CAAA,GAAU;AAAA;AAAA;AAAA,KACtE;AAGF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EAAgB,eAAe,GAAA,EAC9B,QAAA,kBAAAC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,wBACrCA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,iCAAA,EACxB,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,WAAA,EAAY,CAAA,EAClD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;AAO7B,IAAM,mBAAA,GAA4BE,OAAA,CAAA,UAAA;AAAA,EAChC,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,SAAA,GAAkBA,mBAAW,0BAA0B,CAAA;AAC7D,IAAA,uBACEF,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,cAAA;AAAA,QACL,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACT,kEAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,sBAAY,SAAA,IAAa;AAAA;AAAA,KAC5B;AAAA,EAEJ;AACF;AACA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;AC7PlC,IAAM,mBAAA,GAA4BG,OAAA,CAAA,aAAA,CAI/B,EAAE,OAAA,EAAS,MAAM;AAAC,CAAA,EAAG,gBAAgB,CAAA,EAAG,gBAAA,kBAAkB,IAAI,IAAA,IAAQ,CAAA;AAMzE,SAAS,eAAA,CAAgB,EAAE,YAAA,EAAa,EAAiB;AACvD,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAgB,gBAAA,EAAiB,GAAUA,mBAAW,mBAAmB,CAAA;AAC1F,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,SAAA,KAAc,aAAA,EAAc;AAC9D,EAAA,MAAM,UAAU,MAAA,CAAO,YAAA,EAAc,sBAAY,EAAE,MAAA,EAAQ,IAAI,CAAA;AAE/D,EAAA,MAAM,eAAe,cAAA,GAAiB,CAAA;AACtC,EAAA,MAAM,YAAA,GACJ,YAAA,CAAa,WAAA,EAAY,KAAM,gBAAA,CAAiB,WAAA,EAAY,IAC5D,YAAA,CAAa,QAAA,EAAS,KAAM,gBAAA,CAAiB,QAAA,EAAS;AACxD,EAAA,MAAM,WAAA,GAAc,CAAC,YAAA,IAAgB,YAAA;AACrC,EAAA,MAAM,YAAA,GAAe,CAAC,YAAA,IAAgB,CAAC,YAAA;AAEvC,EAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EAEb,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EACZ,wCACCC,IAAAA,CAAAG,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,SAAS,MAAM,SAAA,CAAU,QAAA,CAAS,YAAA,EAAc,CAAC,CAAC,CAAA;AAAA,UAClD,YAAA,EAAW,2BAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA,OAC7C;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,aAAA,IAAiB,SAAA,CAAU,aAAa,CAAA;AAAA,UACvD,YAAA,EAAW,qBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA;AAC5C,KAAA,EACF,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,CAAA,EAE9B,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC/B,SAAA,EAAU,6EAAA;AAAA,QAET,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAGAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACZ,QAAA,EAAA,YAAA,mBACCC,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,SAAA,IAAa,SAAA,CAAU,SAAS,CAAA;AAAA,UAC/C,YAAA,EAAW,qBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA,OAC7C;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,SAAS,MAAM,SAAA,CAAU,QAAA,CAAS,YAAA,EAAc,CAAC,CAAC,CAAA;AAAA,UAClD,YAAA,EAAW,2BAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA;AAC9C,KAAA,EACF,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,CAAA,EAE9B;AAAA,GAAA,EACF,CAAA;AAEJ;AAcA,SAAS,UAAA,CAAW;AAAA,EAClB,WAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,MAAA,GAAeG,OAAA,CAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAC9E,EAAA,MAAM,IAAA,GAAaA,OAAA,CAAA,OAAA;AAAA,IACjB,MAAM,CAAC,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACtF,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,aAAA,GAAgB,WAAA,KAAgB,GAAA,CAAI,WAAA,EAAY;AACtD,EAAA,MAAM,YAAA,GAAe,IAAI,QAAA,EAAS;AAElC,EAAA,uBACEF,IAAAA,CAAAG,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,YAAA,CAAa,WAAA,GAAc,CAAC,CAAA;AAAA,UAC3C,YAAA,EAAW,2BAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA,OAC5C;AAAA,sBACAC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,UACnC,SAAA,EAAU,6EAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,WAAA;AAAA,YAAY;AAAA;AAAA;AAAA,OACf;AAAA,sBACAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,YAAA,CAAa,WAAA,GAAc,CAAC,CAAA;AAAA,UAC3C,YAAA,EAAW,2BAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA;AAC7C,KAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,GAAG,WAAW,CAAA,0BAAA,CAAA;AAAA,QAC1B,SAAA,EAAU,kCAAA;AAAA,QAET,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,uBACdA,GAAAA,CAAC,KAAA,EAAA,EAAa,IAAA,EAAK,OAAM,SAAA,EAAU,sBAAA,EAChC,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,KAAA,KAAU;AAClB,UAAA,MAAM,aAAa,KAAA,KAAU,aAAA;AAC7B,UAAA,MAAM,OAAA,GAAU,iBAAiB,KAAA,KAAU,YAAA;AAE3C,UAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAgB,MAAK,UAAA,EAAW,SAAA,EAAU,UACzC,QAAA,kBAAAC,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,cAClC,SAAA,EAAW,EAAA;AAAA,gBACT,6CAAA;AAAA,gBACA,wCAAA;AAAA,gBACA,iFAAA;AAAA,gBACA,UAAA,IAAc,qCAAA;AAAA,gBACd,OAAA,IACE,CAAC,UAAA,IACD;AAAA,eACJ;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,KAAA,GAAQ,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,eAdL,KAgBV,CAAA;AAAA,QAEJ,CAAC,CAAA,EAAA,EAxBO,EAyBV,CACD;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAYA,SAAS,SAAA,CAAU,EAAE,WAAA,EAAa,YAAA,EAAc,eAAc,EAAmB;AAC/E,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,EAAE,CAAA,GAAI,EAAA;AACjD,EAAA,MAAM,KAAA,GAAcE,OAAA,CAAA,OAAA;AAAA,IAClB,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,GAAY,CAAC,CAAA;AAAA,IACxD,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,IAAA,GAAaA,OAAA,CAAA,OAAA;AAAA,IACjB,MAAM,CAAC,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAClF,CAAC,KAAK;AAAA,GACR;AACA,EAAA,MAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE3C,EAAA,uBACEF,IAAAA,CAAAG,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,aAAA,CAAc,SAAA,GAAY,EAAE,CAAA;AAAA,UAC3C,YAAA,EAAW,uBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA,OAC5C;AAAA,sBACAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,QAAU,WAAA;AAAA,QAAK,SAAA,GAAY,EAAA;AAAA,QAAG;AAAA,OAAA,EACjC,CAAA;AAAA,sBACAD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,eAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,MAAM,aAAA,CAAc,SAAA,GAAY,EAAE,CAAA;AAAA,UAC3C,YAAA,EAAW,uBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,kBAAA,EAAmB;AAAA;AAAA;AAC7C,KAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,CAAA,EAAG,SAAS,CAAA,SAAA,EAAO,YAAY,EAAE,CAAA,mBAAA,CAAA;AAAA,QAC7C,SAAA,EAAU,kCAAA;AAAA,QAET,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,uBACdA,GAAAA,CAAC,KAAA,EAAA,EAAa,IAAA,EAAK,OAAM,SAAA,EAAU,sBAAA,EAChC,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,UAAA,MAAM,cAAc,IAAA,KAAS,WAAA;AAE7B,UAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAe,MAAK,UAAA,EAAW,SAAA,EAAU,UACxC,QAAA,kBAAAC,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cAChC,SAAA,EAAW,EAAA;AAAA,gBACT,6CAAA;AAAA,gBACA,wCAAA;AAAA,gBACA,iFAAA;AAAA,gBACA,WAAA,IACE;AAAA,eACJ;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,IAAA;AAAA,gBAAK;AAAA;AAAA;AAAA,eAZA,IAcV,CAAA;AAAA,QAEJ,CAAC,CAAA,EAAA,EArBO,EAsBV,CACD;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAcA,SAAS,QAAA,CAAS;AAAA,EAChB,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,oBAAA,GAAuB,KAAA;AAAA,EACvB,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAM,cAAA,GAAkB,eAA+C,cAAA,IAAkB,CAAA;AACzF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUE,iBAAuB,MAAM,CAAA;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAUA,OAAA,CAAA,QAAA;AAAA,IAC5C,cAAA,CAAe,YAAA,oBAAgB,IAAI,IAAA;AAAK,GAC1C;AAGA,EAAA,MAAM,gBAAgB,cAAA,CAAe,KAAA;AACrC,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,aAAA,kBAA+B,aAAa,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,KAAA,KAAgB;AACf,MAAA,eAAA,CAAgB,KAAK,CAAA;AACpB,MAAC,cAAA,CAA6D,gBAAgB,KAAK,CAAA;AAAA,IACtF,CAAA;AAAA;AAAA,IAEA,CAAE,eAA6D,aAAa;AAAA,GAC9E;AAGA,EAAA,MAAM,YACJ,IAAA,KAAS,MAAA,GACL,MAAA,CAAO,YAAA,EAAc,sBAAY,EAAE,MAAA,EAAQ,EAAA,EAAI,IAC/C,IAAA,KAAS,QAAA,GACP,GAAG,YAAA,CAAa,WAAA,EAAa,CAAA,0BAAA,CAAA,GAC7B,2BAAA;AAGR,EAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,OAAA;AAAA,IAC7B,MAAO,uBAAuB,MAAM;AAAA,IAAC,CAAA,GAAI,OAAA;AAAA,IACzC,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA,CAAY,CAAC,KAAA,KAAkB;AAC7D,IAAA,eAAA,CAAgB,CAAC,SAAS,IAAI,IAAA,CAAK,KAAK,WAAA,EAAY,EAAG,KAAA,EAAO,CAAC,CAAC,CAAA;AAChE,IAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,WAAA,CAAY,CAAC,IAAA,KAAiB;AAC3D,IAAA,eAAA,CAAgB,CAAC,SAAS,IAAI,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,EAAS,EAAG,CAAC,CAAC,CAAA;AAC5D,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAA,GAA+BA,OAAA,CAAA,WAAA,CAAY,CAAC,IAAA,KAAiB;AACjE,IAAA,eAAA,CAAgB,CAAC,SAAS,IAAI,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,EAAS,EAAG,CAAC,CAAC,CAAA;AAAA,EAC9D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAA,GAA+BA,OAAA,CAAA,WAAA,CAAY,CAAC,SAAA,KAAsB;AACtE,IAAA,eAAA,CAAgB,CAAC,SAAS,IAAI,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,EAAS,EAAG,CAAC,CAAC,CAAA;AAAA,EACnE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,IAAA,EAAY,SAAA,EAAoC,CAAA,KAAwB;AACvE,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,QAAA,EAAS,EAAG,CAAC,CAAA;AAChE,QAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,MAC5B;AAEC,MAAC,cAAA,CAAiE,UAAA;AAAA,QACjE,IAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAEA,CAAC,iBAAA,EAAoB,cAAA,CAA4C,UAAU;AAAA,GAC7E;AAEA,EAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,OAAA;AAAA,IACzB,OAAO,EAAE,OAAA,EAAS,gBAAA,EAAkB,cAAA,EAAgB,kBAAkB,YAAA,EAAa,CAAA;AAAA,IACnF,CAAC,gBAAA,EAAkB,cAAA,EAAgB,YAAY;AAAA,GACjD;AAEA,EAAA,uBACEF,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,UAAA;AAAA,QACA,cAAA,KAAmB,IAAI,WAAA,GAAc,sBAAA;AAAA,QACrC;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,WAAA,EAAU,UACjC,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,QAEC,IAAA,KAAS,0BACRA,GAAAA,CAAC,oBAAoB,QAAA,EAApB,EAA6B,KAAA,EAAO,YAAA,EACnC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAU,IAAA;AAAA,YACV,eAAA;AAAA,YACA,MAAA,EAAQ,EAAA;AAAA,YACR,UAAA,EAAY;AAAA,cACV,IAAA,EAAM,YAAA;AAAA,cACN,QAAQ,EAAA,CAAG,iBAAA,EAAmB,cAAA,KAAmB,CAAA,GAAI,aAAa,UAAU,CAAA;AAAA,cAC5E,KAAA,EAAO,oCAAA;AAAA;AAAA,cAEP,KAAA,EAAO,wBAAA;AAAA,cACP,IAAA,EAAM,aAAA;AAAA,cACN,SAAA,EAAW,sDAAA;AAAA,cACX,GAAA,EAAK,aAAA;AAAA,cACL,IAAA,EAAM,kFAAA;AAAA,cACN,GAAA,EAAK,EAAA;AAAA,gBACH,wGAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,eAAA,EAAiB,gCAAA;AAAA,cACjB,aAAA,EAAe,gCAAA;AAAA,cACf,YAAA,EACE,wEAAA;AAAA,cACF,SAAA,EAAW,EAAA;AAAA,gBACT,4CAAA;AAAA,gBACA;AAAA,eACF;AAAA;AAAA,cAEA,WAAA,EAAa,wCAAA;AAAA,cACb,gBAAA,EAAkB,8BAAA;AAAA,cAClB,YAAA,EAAc,yBAAA;AAAA,cACd,UAAA,EAAY,WAAA;AAAA,cACZ,GAAG;AAAA,aACL;AAAA,YACA,UAAA,EAAY;AAAA,cACV,OAAA,EAAS;AAAA,aACX;AAAA,YACC,GAAG,cAAA;AAAA,YACJ,KAAA,EAAO,YAAA;AAAA,YACP,aAAA,EAAe,iBAAA;AAAA,YACf,UAAA,EAAY;AAAA;AAAA,SACd,EACF,CAAA;AAAA,QAGD,IAAA,KAAS,4BACRA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAa,aAAa,WAAA,EAAY;AAAA,YACtC,aAAA,EAAe,aAAa,QAAA,EAAS;AAAA,YACrC,aAAA,EAAe,iBAAA;AAAA,YACf,YAAA,EAAc,sBAAA;AAAA,YACd,YAAA,EAAc;AAAA;AAAA,SAChB;AAAA,QAGD,IAAA,KAAS,2BACRA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAa,aAAa,WAAA,EAAY;AAAA,YACtC,YAAA,EAAc,gBAAA;AAAA,YACd,aAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GAEJ;AAEJ;ACxbA,IAAM,2BAAA,GAAoCK,OAAA,CAAA,aAAA;AAAA,EACxC;AACF,CAAA;AAwBA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,SAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8B;AAC5B,EAAA,MAAM,KAAA,GAAcA,OAAA,CAAA,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,WAAA,KAAgB,YAAA,IAAgB,KAAA,IAAS,CAAA;AACzD,EAAA,MAAM,oBAAA,GAAuB,UAAU,UAAA,GAAa,WAAA;AACpD,EAAA,MAAM,WAAA,GACJ,oBAAA,KAAyB,UAAA,GACrB,eAAA,GACA,KAAA,KAAU,CAAA,GACR,yBAAA,GACA,KAAA,KAAU,CAAA,GACR,yBAAA,GACA,KAAA,KAAU,CAAA,GACR,yBAAA,GACA,aAAA;AACZ,EAAA,uBACEL,GAAAA,CAAC,2BAAA,CAA4B,QAAA,EAA5B,EAAqC,KAAA,EAAO,EAAE,KAAA,EAAO,aAAA,EAAe,QAAA,EAAU,OAAA,EAAQ,EACrF,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,wBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,WAAA,EAAa,SAAS,CAAA;AAAA,MAC9D,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAoBA,SAAS,SAAA,CAAU,EAAE,OAAA,EAAS,QAAA,EAAS,EAA6C;AAClF,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,yFAAA;AAAA,QACA,CAAC,OAAA,IAAW,2CAAA;AAAA,QACZ,OAAA,IAAW,CAAC,QAAA,IAAY,+BAAA;AAAA,QACxB,WAAW,QAAA,IAAY,mCAAA;AAAA,QACvB,CAAC,WAAW,QAAA,IAAY;AAAA,OAC1B;AAAA,MAEC,oCACCA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAO,GAAA;AAAA,UACP,OAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAM,4BAAA;AAAA,UAEN,QAAA,kBAAAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAS,SAAA;AAAA,cACT,QAAA,EAAS,SAAA;AAAA,cACT,CAAA,EAAE,mdAAA;AAAA,cACF,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,OACF,GACE;AAAA;AAAA,GACN;AAEJ;AASA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAU,YAAA,GAAe,KAAA;AAAA,EACzB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,KAAA,GAAcK,mBAAW,2BAA2B,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA;AAChD,EAAA,MAAM,QAAA,GAAW,YAAA,IAAgB,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA;AAExD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAEtC,EAAA,MAAM,aAAA,GAAgB,EAAA;AAAA,IACpB,2GAAA;AAAA,IACA,0GAAA;AAAA;AAAA;AAAA,IAGA,iBAAA;AAAA,IACA,CAAC,OAAA,IAAW,yBAAA;AAAA,IACZ,OAAA,IAAW,CAAC,QAAA,IAAY,iCAAA;AAAA,IACxB,WAAW,QAAA,IAAY,oBAAA;AAAA,IACvB,WAAW,oBAAA,GAAuB,gBAAA;AAAA,IAClC;AAAA,GACF;AAEA,EAAA,uBACEL,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,UAAA;AAAA,MACL,cAAA,EAAc,OAAA;AAAA,MACd,QAAA;AAAA,MACA,YAAA,EAAY,UAAU,SAAA,GAAY,WAAA;AAAA,MAClC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,aAAA;AAAA,MACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,OAAA,GAAU,CAAC,CAAA;AACX,QAAA,IAAI,CAAA,CAAE,gBAAA,IAAoB,QAAA,IAAY,CAAC,KAAA,EAAO;AAC9C,QAAA,KAAA,CAAM,aAAA;AAAA,UACJ,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,KAAK,CAAA,GAAI,CAAC,GAAG,KAAA,CAAM,OAAO,KAAK;AAAA,SAC3E;AAAA,MACF,CAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACd,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,UAAK,SAAA,EAAU,+DAAA,EACd,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAkB,QAAA,EAAoB,CAAA,EACnD,CAAA;AAAA,wBACAC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,uBAAA;AAAA,YACV,SAAA,EAAW,EAAA;AAAA,cACT,qBAAA;AAAA,cACA,UACI,4DAAA,GACA;AAAA,aACN;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,0CAAA;AAAA,oBACA,UAAU,UAAA,GAAa,QAAA;AAAA,oBACvB,WAAW,wBAAA,GAA2B;AAAA,mBACxC;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,cACC,8BACCA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,oDAAA;AAAA,oBACA,UAAU,gBAAA,GAAmB,QAAA;AAAA,oBAC7B,WAAW,wBAAA,GAA2B;AAAA,mBACxC;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH,GACE;AAAA;AAAA;AAAA;AACN,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;AC7BO,IAAM,eAAA,GAA4C;AAAA,EACvD,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,YAAA,EAAc,cAAA;AAAA,EACd,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM;AACR;AAGO,IAAM,iBAAA,GAAoD;AAAA,EAC/D,MAAA,EAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,YAAY,cAAc,CAAA;AAAA,EAC9C,QAAQ,CAAC,GAAA,EAAK,MAAM,GAAA,EAAK,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,EACxC,MAAM,CAAC,GAAA,EAAK,MAAM,GAAA,EAAK,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,EACtC,MAAA,EAAQ,CAAC,GAAA,EAAK,IAAI;AACpB;AAGO,IAAM,wBAAA,GAAyD;AAAA,EACpE,MAAA,EAAQ,UAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,IAAA,EAAM,GAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,0BAAA,CACd,QACA,KAAA,EACS;AACT,EAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,IAAY,KAAA,IAAS,MAAM,OAAO,KAAA;AACvD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,SAAiB,CAAC,MAAA,CAAO,SAAS,KAAK,CAAA;AAC5D,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAClE;AAGA,SAAS,wBAAA,CAAyB,QAAsC,KAAA,EAAwB;AAC9F,EAAA,IAAI,QAAQ,IAAA,KAAS,QAAA,IAAY,CAAC,MAAA,CAAO,OAAA,EAAS,QAAQ,OAAO,MAAA;AACjE,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,OAAO,OAAA,CAAQ,IAAA;AAAA,IACpB,CAAC,MAAA,KAAW,MAAA,CAAO,KAAA,CAAM,WAAA,OAAkB,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,KAAM;AAAA,GACrF;AACF;AAGO,SAAS,oBAAA,CACd,QACA,KAAA,EACS;AACT,EAAA,IAAI,0BAAA,CAA2B,MAAA,EAAQ,KAAK,CAAA,EAAG,OAAO,IAAA;AACtD,EAAA,IAAI,MAAA,EAAQ,SAAS,QAAA,IAAY,CAAC,OAAO,OAAA,EAAS,MAAA,IAAU,KAAA,IAAS,IAAA,EAAM,OAAO,KAAA;AAClF,EAAA,IAAI,CAAC,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,IAAQ,OAAO,KAAA;AAClC,EAAA,OAAO,CAAC,wBAAA,CAAyB,MAAA,EAAQ,KAAK,CAAA;AAChD;AAEO,SAAS,oBAAA,CACd,QACA,KAAA,EACiB;AAEjB,EAAA,IAAI,MAAA,EAAQ,SAAS,QAAA,EAAU,OAAO,yBAAyB,MAAA,EAAQ,KAAK,GAAG,KAAA,IAAS,KAAA;AACxF,EAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,GAAI,YAAA,GAAe,KAAA;AACxD;AC1OA,IAAM,mBAAA,GAA4BM,sBAA8C,IAAI,CAAA;AAG7E,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,OAAA,GAAgBA,mBAAW,mBAAmB,CAAA;AACpD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACxE;AAGO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAAsD;AAEpD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAUA,OAAA,CAAA,QAAA,CAA4B,EAAE,CAAA;AAClF,EAAA,MAAM,UAAU,KAAA,IAAS,eAAA;AAGzB,EAAA,MAAM,CAAC,WAAA,EAAa,mBAAmB,CAAA,GAAUA,iBAAS,EAAE,CAAA;AAG5D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,iBAA+B,IAAI,CAAA;AAGnF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAUA,iBAAwB,IAAI,CAAA;AAGhF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,iBAAsB,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAUA,iBAAoC,IAAI,CAAA;AAC1F,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAUA,iBAAiC,IAAI,CAAA;AACzF,EAAA,MAAM,UAAgBA,OAAA,CAAA,KAAA,EAAM;AAC5B,EAAA,MAAM,QAAA,GAAiBA,OAAA,CAAA,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA,CAAA,EAAI,CAAC,OAAO,CAAC,CAAA;AAG5F,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAUA,iBAAS,EAAE,CAAA;AAC3E,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAC9CA,iBAAgC,OAAO,CAAA;AAG/C,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,OAAA,CAAA,QAAA,CAA4B,EAAE,CAAA;AACpF,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAClF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAUA,iBAAS,EAAE,CAAA;AAGzE,EAAA,MAAM,YAAA,GAAqBA,eAAO,CAAC,CAAA;AACnC,EAAA,MAAM,mBAAA,GAA4BA,eAA2C,IAAI,CAAA;AAEjF,EAAMA,kBAAU,MAAM;AACpB,IAAA,mBAAA,CAAoB,OAAA,GAAU,QAAA,CAAS,OAAO,SAAA,EAAmB,KAAA,KAAkB;AACjF,MAAA,IAAI,CAAC,mBAAA,EAAqB;AAC1B,MAAA,MAAM,EAAA,GAAK,EAAE,YAAA,CAAa,OAAA;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,QAAQ,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAC,CAAA;AAC1E,QAAA,IAAI,YAAA,CAAa,YAAY,EAAA,EAAI;AAC/B,UAAA,mBAAA,CAAoB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,CAAE,CAAC,CAAA;AAC/D,UAAA,0BAAA,CAA2B,KAAK,CAAA;AAAA,QAClC;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,YAAA,CAAa,YAAY,EAAA,EAAI;AAC/B,UAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,UAAA,0BAAA,CAA2B,KAAK,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF,GAAG,GAAG,CAAA;AACN,IAAA,OAAO,MAAM;AACX,MAAA,mBAAA,CAAoB,SAAS,MAAA,EAAO;AAAA,IACtC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAGxB,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,aAAA,EAAe,MAAA,IAAU,CAAC,eAAe,QAAA,EAAU;AACtD,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,GAAA,KAAQ,cAAc,MAAM,CAAA;AACjE,IAAA,IAAI,CAAC,MAAA,IAAW,MAAA,CAAO,SAAS,QAAA,IAAY,MAAA,CAAO,SAAS,QAAA,EAAW;AACrE,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,cAAc,KAAA,IAAS,EAAA;AAGrC,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,OAAA,EAAS;AAC9C,MAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,MAAA,MAAM,QAAA,GAAW,CAAA,GACb,MAAA,CAAO,OAAA,CAAQ,MAAA;AAAA,QACb,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,SAAS,CAAC;AAAA,UAE9E,MAAA,CAAO,OAAA;AACX,MAAA,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,CAAE,CAAC,CAAA;AAC7E,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACjB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,0BAAA,CAA2B,IAAI,CAAA;AAC/B,IAAA,mBAAA,CAAoB,OAAA,GAAU,aAAA,CAAc,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC3D,CAAA,EAAG;AAAA,IACD,aAAA,EAAe,MAAA;AAAA,IACf,aAAA,EAAe,QAAA;AAAA,IACf,aAAA,EAAe,KAAA;AAAA,IACf,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,SAAA,GAAkBA,OAAA,CAAA,WAAA;AAAA,IACtB,CAAC,MAAA,KAAwC;AACvC,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,GAAG,MAAA;AAAA,QACH,IAAI,UAAA;AAAW,OACjB;AACA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAA,EAAS,SAAS,CAAA;AACzC,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,kBAAA,CAAmB,UAAU,CAAA;AAAA,MAC/B;AACA,MAAA,QAAA,GAAW,UAAU,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ;AAAA,GAC3B;AAGA,EAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,WAAA;AAAA,IACzB,CAAC,EAAA,KAAe;AACd,MAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACpD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,kBAAA,CAAmB,UAAU,CAAA;AAAA,MAC/B;AACA,MAAA,QAAA,GAAW,UAAU,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ;AAAA,GAC3B;AAGA,EAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,WAAA;AAAA,IACzB,CAAC,IAAY,OAAA,KAAsC;AACjD,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,OAAA,KAAY,CAAE,CAAA;AAC9E,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,kBAAA,CAAmB,UAAU,CAAA;AAAA,MAC/B;AACA,MAAA,QAAA,GAAW,UAAU,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ;AAAA,GAC3B;AAGA,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,KAAA,KAAkB;AACjB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,sBAAA,GAA+BA,OAAA,CAAA,WAAA;AAAA,IACnC,CAAC,MAAA,KAAyC;AACxC,MAAA,MAAM,eAAA,GAAkB,iBAAA,GAAoB,MAAA,CAAO,GAAG,CAAA;AACtD,MAAA,IAAI,eAAA,EAAiB,QAAQ,OAAO,eAAA;AAEpC,MAAA,MAAM,aAAA,GAAgB,eAAA,GAAkB,MAAA,CAAO,IAAI,CAAA;AACnD,MAAA,IAAI,aAAA,EAAe,QAAQ,OAAO,aAAA;AAElC,MAAA,OAAO,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,mBAAmB,eAAe;AAAA,GACrC;AAGA,EAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,IACxB,CAAC,IAAA,EAAmB,QAAA,EAA4B,OAAA,GAAqC,IAAA,KAAS;AAC5F,MAAA,iBAAA,CAAkB,IAAA,GAAO,UAAU,IAAI,CAAA;AACvC,MAAA,wBAAA,CAAyB,OAAO,CAAA;AAChC,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,kBAAA,CAAmB,QAAQ,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,YAAA,GAAqBA,oBAAY,MAAM;AAC3C,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,WAAA;AAAA,IACzB,CAAC,SAAA,KAAsB;AACrB,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,SAAS,CAAA;AACtD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,SAAA,GAAY,uBAAuB,MAAM,CAAA;AAC/C,QAAA,MAAM,eAAA,GAAkB,wBAAA,CAAyB,MAAA,CAAO,IAAI,CAAA;AAC5D,QAAA,MAAM,YAAY,SAAA,CAAU,QAAA,CAAS,eAAe,CAAA,GAAI,eAAA,GAAkB,UAAU,CAAC,CAAA;AACrF,QAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,QAAA,gBAAA,CAAiB,CAAC,IAAA,MAAU;AAAA,UAC1B,GAAG,IAAA;AAAA,UACH,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU,SAAA;AAAA,UACV,OAAO,IAAA,EAAM,MAAA,KAAW,SAAA,GAAa,IAAA,EAAM,SAAS,EAAA,GAAM;AAAA,SAC5D,CAAE,CAAA;AACF,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,sBAAA,EAAwB,YAAY;AAAA,GAChD;AAGA,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,QAAA,KAAuB;AACtB,MAAA,gBAAA;AAAA,QAAiB,CAAC,SAChB,IAAA,GACI;AAAA,UACE,GAAG,IAAA;AAAA,UACH;AAAA,SACF,GACA;AAAA,OACN;AACA,MAAA,YAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAGA,EAAA,MAAM,eAAA,GAAwBA,OAAA,CAAA,WAAA,CAAY,CAAC,QAAA,KAAqB;AAC9D,IAAA,gBAAA;AAAA,MAAiB,CAAC,SAChB,IAAA,GACI;AAAA,QACE,GAAG,IAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACT,GACA;AAAA,KACN;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,kBAAA,GAA2BA,OAAA,CAAA,WAAA;AAAA,IAC/B,CAAC,EAAA,KAAe;AACd,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,MAAA,gBAAA,CAAiB;AAAA,QACf,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,KAAK;AAAA,OAC3B,CAAA;AACD,MAAA,YAAA,EAAa;AAAA,IACf,CAAA;AAAA,IACA,CAAC,SAAS,YAAY;AAAA,GACxB;AAGA,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,aAAA,KAA2B;AAG1B,MAAA,MAAM,aAAA,GAAA,CAAiB,aAAA,IAAiB,aAAA,EAAe,KAAA,GAAQ,IAAA,EAAK;AACpE,MAAA,IAAI,CAAC,aAAA,EAAe,MAAA,IAAU,CAAC,aAAA,EAAe,QAAA,IAAY,CAAC,aAAA,EAAe;AAE1E,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,GAAA,KAAQ,cAAc,MAAM,CAAA;AACjE,MAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,MAAA,EAAQ,aAAa,CAAA;AAE7D,MAAA,IAAI,eAAA,EAAiB;AAEnB,QAAA,YAAA,CAAa,eAAA,EAAiB;AAAA,UAC5B,QAAQ,aAAA,CAAc,MAAA;AAAA,UACtB,UAAU,aAAA,CAAc,QAAA;AAAA,UACxB,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,SAAA,CAAU;AAAA,UACR,QAAQ,aAAA,CAAc,MAAA;AAAA,UACtB,UAAU,aAAA,CAAc,QAAA;AAAA,UACxB,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAEA,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,YAAA,EAAa;AACb,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,MAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,MAAA,mBAAA,CAAoB,SAAS,MAAA,EAAO;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,eAAA,EAAiB,OAAA,EAAS,SAAA,EAAW,cAAc,YAAY;AAAA,GACjF;AAGA,EAAA,MAAM,eAAqBA,OAAA,CAAA,WAAA,CAAY,MAAM,gBAAe,EAAG,CAAC,cAAc,CAAC,CAAA;AAG/E,EAAA,MAAM,qBAAA,GAA8BA,OAAA,CAAA,WAAA;AAAA,IAClC,CAAC,aAAA,KAA0B;AACzB,MAAA,cAAA,CAAe,aAAa,CAAA;AAC5B,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,YAAA,EAAa;AACb,MAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,MAAA,mBAAA,CAAoB,SAAS,MAAA,EAAO;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAGA,EAAA,MAAM,aAAA,GAAsBA,oBAAY,MAAM;AAC5C,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,YAAA,EAAa;AACb,IAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,IAAA,0BAAA,CAA2B,KAAK,CAAA;AAChC,IAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,IAAA,mBAAA,CAAoB,SAAS,MAAA,EAAO;AAAA,EACtC,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,MAAM,YAAA,GAAqBA,oBAAY,MAAM;AAC3C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,IACvB;AACA,IAAA,QAAA,GAAW,EAAE,CAAA;AACb,IAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,IAAA,QAAA,GAAW,EAAE,CAAA;AAIb,IAAA,aAAA,EAAc;AAAA,EAChB,GAAG,CAAC,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,aAAa,CAAC,CAAA;AAK7C,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,eAAA,IAAmB,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,EAAG;AACrE,MAAA,aAAA,EAAc;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,aAAa,CAAC,CAAA;AAG5C,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,GAAA,KAAgB;AACf,MAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,qBAAA,GAA8BA,OAAA,CAAA,WAAA;AAAA,IAClC,CAAC,SAAA,KAAsB;AACrB,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,SAAS,CAAA;AACtD,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,MAAA,OAAO,uBAAuB,MAAM,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,SAAS,sBAAsB;AAAA,GAClC;AAGA,EAAA,MAAM,iBAAA,GAA0BA,gBAAQ,MAAM;AAC5C,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,SAAU,EAAC;AACjC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAK,CAAE,WAAA,EAAY;AAC7C,IAAA,MAAM,UAAA,GAAa,QAChB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,UAAA,CAAW,KAAK,CAAC,CAAA,CACrD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAM,aAAA,CAAc,CAAA,CAAE,KAAA,EAAO,IAAI,CAAC,CAAA;AACtD,IAAA,MAAM,WAAW,OAAA,CACd,MAAA;AAAA,MACC,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,WAAA,EAAY,CAAE,UAAA,CAAW,KAAK,KAAK,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,SAAS,KAAK;AAAA,KACzF,CACC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAA,EAAO,IAAI,CAAC,CAAA;AACtD,IAAA,OAAO,CAAC,GAAG,UAAA,EAAY,GAAG,QAAQ,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,OAAA,EAAS,WAAW,CAAC,CAAA;AAGzB,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAUA,iBAAS,EAAE,CAAA;AAE3E,EAAA,MAAM,gBAAA,GAAmB,QAAQ,QAAQ,CAAA;AAMzC,EAAMA,kBAAU,MAAM;AACpB,IAAA,wBAAA,CAAyB,gBAAA,IAAoB,iBAAA,CAAkB,MAAA,KAAW,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,EACtF,GAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAE5D,EAAMA,kBAAU,MAAM;AACpB,IAAA,wBAAA,CAAyB,EAAE,CAAA;AAC3B,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,WAAA,EAAa,aAAA,EAAe,MAAM,CAAC,CAAA;AAGvC,EAAA,MAAM,sBAAA,GAA+BA,OAAA,CAAA,WAAA;AAAA,IACnC,CAAC,SAAA,KAAsB;AACrB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,QAAA,GAAW,EAAE,CAAA;AACb,MAAA,wBAAA,CAAyB,EAAE,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,cAAc,QAAQ;AAAA,GACzB;AAEA,EAAA,MAAM,YAAA,GAAwC;AAAA,IAC5C,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA,uBAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,qBAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,GAAG,QAAQ,CAAA,MAAA,CAAA;AAAA,MACpB,YAAA,EAAc,GAAG,QAAQ,CAAA,YAAA,CAAA;AAAA,MACzB,cAAA,EAAgB,GAAG,QAAQ,CAAA,cAAA,CAAA;AAAA,MAC3B,YAAA,EAAc,GAAG,QAAQ,CAAA,YAAA,CAAA;AAAA,MACzB,WAAA,EAAa,GAAG,QAAQ,CAAA,WAAA,CAAA;AAAA,MACxB,mBAAmB,CAAC,KAAA,KAAkB,CAAA,EAAG,QAAQ,kBAAkB,KAAK,CAAA,CAAA;AAAA,MACxE,qBAAqB,CAAC,KAAA,KAAkB,CAAA,EAAG,QAAQ,oBAAoB,KAAK,CAAA,CAAA;AAAA,MAC5E,mBAAmB,CAAC,KAAA,KAAkB,CAAA,EAAG,QAAQ,kBAAkB,KAAK,CAAA,CAAA;AAAA,MACxE,kBAAkB,CAAC,KAAA,KAAkB,CAAA,EAAG,QAAQ,iBAAiB,KAAK,CAAA;AAAA;AACxE,GACF;AAEA,EAAA,uBACEN,GAAAA,CAAC,mBAAA,CAAoB,UAApB,EAA6B,KAAA,EAAO,cACnC,QAAA,kBAAAA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,eAAA,EAAe,WAAW,EAAA,GAAK,MAAA;AAAA,MAC/B,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,SAAA,EAAW,EAAA;AAAA,QACT,iBAAA;AAAA,QACA,+HAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAGA,YAAA,CAAa,WAAA,GAAc,cAAA;AC5gB3B,IAAM,SAAS,CAAA,wBAAA,EAA2B,kBAAA;AAAA,EACxC;AACF,CAAC,CAAA,EAAA,CAAA;AASD,IAAM,UAAA,GAAmBO,OAAA,CAAA,UAAA;AAAA,EACvB,CAAC,EAAE,IAAA,GAAO,EAAA,EAAI,WAAW,aAAA,EAAe,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC1D,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AAEtC,IAAA,IAAI,IAAA,GAAO,CAAA,KAAM,SAAA,GAAY,CAAA,EAAG,SAAA,IAAa,CAAA;AAE7C,IAAA,uBACEP,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,aAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACT,8EAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,QAClC,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,aAAa,CAAA;AAAA,YACnE,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,SAAA;AAAA,cACP,MAAA,EAAQ,SAAA;AAAA,cACR,SAAA,EAAW,MAAA;AAAA,cACX,eAAA,EAAiB,MAAA;AAAA,cACjB,QAAA,EAAU,SAAA;AAAA,cACV,cAAA,EAAgB;AAAA;AAClB;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AACA,UAAA,CAAW,WAAA,GAAc,YAAA;AAOzB,IAAM,gBAAA,GAAmB,kBAAA;AACzB,IAAM,kBAAA,GACJ,yHAAA;;;ACzDF,IAAM,OAAA,GAAU;AAAA,EACd,MAAA,EAAQ;AAAA,IACN,0BAAA,EAA4B,2DAAA;AAAA,IAC5B,2BAAA,EAA6B;AAAA;AAEjC,CAAA;AAEA,IAAO,eAAA,GAAQ,OAAA;ACKf,IAAM,OAAA,GAAgBQ,mBAGpB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BR,GAAAA;AAAA,EAACS,SAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,gGAAA;AAAA,MACA;AAAA,KACF;AAAA,IAEA,MAAA,EAAQ,CAAC,KAAA,EAAO,MAAA,KAAW;AACzB,MAAA,IAAI,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,OAAO,WAAA,EAAa,GAAG,OAAO,CAAA;AAC/D,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,OAAA,CAAQ,cAAcA,SAAA,CAAiB,WAAA;AAOvC,IAAM,aAAA,GAAgB,CAAC,EAAE,QAAA,EAAU,QAAQ,2BAAA,EAAS,GAAG,OAAM,KAA0B;AACrF,EAAA,uBACET,GAAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,KAAA,EACV,QAAA,kBAAAC,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,qBAAA,EAAsB,kBAAA,EAAkB,MAAA,EAC/D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACxCA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,uZAChB,QAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAOA,IAAM,YAAA,GAAqBQ,OAAA,CAAA,UAAA;AAAA,EAIzB,CACE,EAAE,SAAA,EAAW,gBAAA,EAAkB,aAAA,EAAe,WAAA,EAAa,YAAA,EAAc,SAAA,EAAW,GAAG,KAAA,EAAM,EAC7F,GAAA,qBAEAP,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAW,EAAA,CAAG,gDAAA,EAAkD,aAAa;AAAA;AAAA,SAC/E;AAAA,wBACAA,GAAAA;AAAA,UAACS,SAAA,CAAiB,KAAA;AAAA,UAAjB;AAAA,YACC,GAAA;AAAA,YACA,WAAA;AAAA,YAEA,YAAA,EAAY,aAAa,WAAA,IAAe,cAAA;AAAA,YACxC,SAAA,EAAW,EAAA;AAAA,cACT,+MAAA;AAAA,cACA;AAAA,aACF;AAAA,YACC,GAAG;AAAA;AAAA;AACN;AAAA;AAAA;AAGN;AAEA,YAAA,CAAa,WAAA,GAAcA,UAAiB,KAAA,CAAM,WAAA;AAElD,IAAM,WAAA,GAAoBD,mBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BR,GAAAA;AAAA,EAACS,SAAA,CAAiB,IAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA,CAAG,iDAAA,EAAmD,SAAS,CAAA;AAAA,IACzE,GAAG;AAAA;AACN,CACD;AAED,WAAA,CAAY,WAAA,GAAcA,UAAiB,IAAA,CAAK,WAAA;AAEhD,IAAM,YAAA,GAAqBD,OAAA,CAAA,UAAA,CAGzB,CAAC,KAAA,EAAO,wBACRR,GAAAA;AAAA,EAACS,SAAA,CAAiB,KAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAU,gEAAA;AAAA,IACT,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAAR,KAAC,KAAA,EAAA,EAAM,cAAA,EAAe,UAAS,UAAA,EAAW,QAAA,EAAS,SAAS,CAAA,EAC1D,QAAA,EAAA;AAAA,sBAAAD,IAACU,IAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,iCAAA,EAAkC,CAAA;AAAA,MAC3D,KAAA,CAAM,QAAA,IAAY,eAAA,CAAQ,MAAA,CAAO;AAAA,KAAA,EACpC;AAAA;AACF,CACD;AAED,YAAA,CAAa,WAAA,GAAcD,UAAiB,KAAA,CAAM,WAAA;AAElD,IAAM,YAAA,GAAqBD,mBAGzB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BR,GAAAA;AAAA,EAACS,SAAA,CAAiB,KAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,8KAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AAED,YAAA,CAAa,WAAA,GAAcA,UAAiB,KAAA,CAAM,WAAA;AAElD,IAAM,gBAAA,GAAyBD,mBAG7B,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BR,GAAAA;AAAA,EAACS,SAAA,CAAiB,SAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IAEA,aAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,EAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA;AAAA,IAC/D,GAAG;AAAA;AACN,CACD;AACD,gBAAA,CAAiB,WAAA,GAAcA,UAAiB,SAAA,CAAU,WAAA;AAE1D,IAAM,WAAA,GAAoBD,mBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BR,GAAAA;AAAA,EAACS,SAAA,CAAiB,IAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,2KAAA;AAAA,MACA,sFAAA;AAAA,MACA,2NAAA;AAAA,MACA,uGAAA;AAAA,MACA,+JAAA;AAAA,MACA,8CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AAED,WAAA,CAAY,WAAA,GAAcA,UAAiB,IAAA,CAAK,WAAA;AAEhD,IAAM,kBAAkB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,KAA6C;AAC1F,EAAA,uBACET,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,kEAAA,EAAoE,SAAS,CAAA;AAAA,MAC1F,GAAG;AAAA;AAAA,GACN;AAEJ;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;ACxK9B,IAAM,kBAAA,GAAqB,EAAA;AAAA,EACzB,sFAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,iBAAA,GAAoB,EAAA;AAAA,EACxB,wIAAA;AAAA,EACA,wJAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,iBAAA,GAAyD;AAAA,EAC7D,OAAA,EAAS,mEAAA;AAAA,EACT,QAAA,EAAU,mEAAA;AAAA,EACV,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,cAAA,GAAyC;AAAA,EAC7C,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,QAAA;AAAA,EACN,GAAA,EAAK,GAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,YAAA,EAAc;AAChB,CAAA;AAEO,IAAM,2BAAA,GAA8B,EAAA;AAAA,EACzC,+CAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,kCAAA,GAAqC,GAAG,4CAA4C,CAAA;AAE1F,IAAM,2BAAA,GAA8B,GAAG,yBAAyB,CAAA;AAEhE,IAAM,6BAAA,GAAgC,EAAA;AAAA,EAC3C,kFAAA;AAAA,EACA,4EAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,+BAAA,GAAkC,EAAA;AAAA,EAC7C,2DAAA;AAAA,EACA;AACF,CAAA;AAIO,IAAM,oCAAA,GAAuC,EAAA;AAAA,EAClD,2FAAA;AAAA,EACA;AACF,CAAA;AAWO,SAAS,6BAA6B,CAAA,EAAwC;AACnF,EAAA,IAAI,CAAA,CAAE,QAAQ,GAAA,EAAK;AACnB,EAAA,MAAM,OAAO,CAAA,CAAE,aAAA;AACf,EAAA,IAAI,IAAA,CAAK,aAAA,CAAgC,cAAc,CAAA,EAAG,KAAA,EAAO;AACjE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAA2B,mCAAmC,CAAA;AACtF,EAAA,IAAI,CAAC,UAAA,EAAY;AACjB,EAAA,CAAA,CAAE,cAAA,EAAe;AACjB,EAAA,UAAA,CAAW,KAAA,EAAM;AACnB;AAEO,IAAM,mCAAA,GAAsC,GAAG,4CAA4C,CAAA;AAE3F,SAAS,4BAA4B,QAAA,EAAkB;AAC5D,EAAA,OAAO,cAAA,CAAe,QAAQ,CAAA,IAAK,QAAA;AACrC;AAEO,SAAS,2BAAA,CAA4B;AAAA,EAC1C,IAAA,GAAO,SAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAIG;AACD,EAAA,OAAO,EAAA;AAAA,IACL,iBAAA;AAAA,IACA,kBAAkB,IAAI,CAAA;AAAA,IACtB,kBAAA;AAAA,IACA,QAAA,IAAY,iCAAA;AAAA,IACZ,SAAS,UAAA,IAAc,gBAAA;AAAA,IACvB;AAAA,GACF;AACF;AAEO,SAAS,+BAAA,CAAgC;AAAA,EAC9C,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,GAGI,EAAC,EAAG;AACN,EAAA,OAAO,EAAA;AAAA,IACL,2CAAA;AAAA,IACA,WAAW,iCAAA,GAAoC,sCAAA;AAAA,IAC/C;AAAA,GACF;AACF;AASO,IAAM,wBAAA,GAAiCW,OAAA,CAAA,UAAA;AAAA,EAI5C,CACE,EAAE,UAAA,GAAa,KAAA,EAAO,aAAA,GAAgB,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EACtF,GAAA,KACG;AAGH,IAAA,MAAM,SAAeA,OAAA,CAAA,KAAA,EAAM;AAC3B,IAAA,uBACEV,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA,EAAS,aAAa,SAAA,GAAY,WAAA;AAAA,QAClC,SAAA,EAAW,EAAA;AAAA,UACT,uBAAA;AAAA,UACA,aAAA,IAAiB,CAAC,UAAA,IAAc,qCAAA;AAAA,UAChC;AAAA,SACF;AAAA,QACA,iBAAA,EAAiB,MAAA;AAAA,QAChB,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EACd,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8EAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+EAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAI,MAAA,EAAQ,WAAU,kBAAA,EACzB,QAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAAA,UACC,6BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0EACb,QAAA,EAAA,SAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF,CAAA;AAEA,wBAAA,CAAyB,WAAA,GAAc,0BAAA;AAIhC,IAAM,sBAAA,GAA+BW,OAAA,CAAA,UAAA,CAG1C,CAAC,EAAE,SAAA,EAAW,gBAAA,EAAkB,aAAA,EAAe,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC3DX,GAAAA;AAAA,EAAC,YAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,gBAAA,EAAkB,EAAA,CAAG,sCAAA,EAAwC,gBAAgB,CAAA;AAAA,IAC7E,aAAA,EAAe,EAAA,CAAG,4BAAA,EAA8B,aAAa,CAAA;AAAA,IAC7D,SAAA,EAAW,EAAA,CAAG,8BAAA,EAAgC,SAAS,CAAA;AAAA,IACtD,GAAG;AAAA;AACN,CACD,CAAA;AAED,sBAAA,CAAuB,WAAA,GAAc,wBAAA;AAO9B,IAAM,sBAAA,GAA+BW,OAAA,CAAA,UAAA,CAG1C,CAAC,EAAE,IAAA,GAAO,SAAA,EAAW,UAAA,GAAa,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,wBAChEX,GAAAA;AAAA,EAAC,WAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,YAAA,EAAY,aAAa,SAAA,GAAY,WAAA;AAAA,IACrC,WAAW,2BAAA,CAA4B,EAAE,MAAM,QAAA,EAAU,UAAA,EAAY,WAAW,CAAA;AAAA,IAC/E,GAAG;AAAA;AACN,CACD,CAAA;AAED,sBAAA,CAAuB,WAAA,GAAc,wBAAA;AAW9B,IAAM,8BAAA,GAAuCW,OAAA,CAAA,UAAA,CAGlD,CAAC,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,gBAAA,EAAkB,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC/DV,IAAAA;AAAA,EAAC,sBAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,IAAA,EAAK,UAAA;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IAGZ,cAAA,EAAc,OAAA;AAAA,IACd,SAAA;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+DAAA,EAEd,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAkB,QAAA,EAAU,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,CAAA,EACxD,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,WAAW,+BAAA,CAAgC;AAAA,YACzC,QAAA,EAAU,OAAA;AAAA,YACV,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,UAEA;AAAA;AAAA;AACH;AAAA;AACF,CACD,CAAA;AAED,8BAAA,CAA+B,WAAA,GAAc,gCAAA;AAEtC,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,4EAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,sCAA4B,QAAQ;AAAA;AAAA,GACvC;AAEJ;AAMO,SAAS,sBAAA,CAAuB;AAAA,EACrC,KAAA,GAAQ,qBAAA;AAAA,EACR,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgC;AAC9B,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,yHAAA;AAAA,QACA,0CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAD,IAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,UAAS,OAAA,EAAQ,WAAA,EAAY,WAAU,UAAA,EAAW,CAAA;AAAA,wBAChEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAqB,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GAC7C;AAEJ;ACpRA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,YAAA,EAAc;AAChB,CAAA;AAGA,IAAM,oBAAA,GAAuB,EAAA;AAAA,EAC3B,kHAAA;AAAA,EACA;AACF,CAAA;AAGO,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,GAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAgB;AACpB,EAAA,MAAM,UAAA,GAAmBY,eAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,MAAA,CAAqC,EAAE,CAAA;AACpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,iBAAwB,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAUA,iBAAS,CAAC,CAAA;AAEpE,EAAA,MAAM,gBAAA,GAAmB,gBAAgB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ,aAAa,CAAA,GAAI,IAAA;AACxF,EAAA,MAAM,oBAAoB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC3D,EAAA,MAAM,gBAAgB,cAAA,KAAmB,OAAA;AACzC,EAAA,MAAM,sBAAsB,IAAA,CAAK,GAAA;AAAA,IAC/B,CAAA;AAAA,IACA,aAAA,EAAe,MAAA,GAAS,OAAA,CAAQ,SAAA,CAAU,CAAC,WAAW,MAAA,CAAO,GAAA,KAAQ,aAAA,CAAc,MAAM,CAAA,GAAI;AAAA,GAC/F;AACA,EAAA,MAAM,iBAAA,GAAoB,aAAA,GACtB,qBAAA,IAAyB,CAAA,GACvB,wBACA,CAAA,GACF,kBAAA;AAEJ,EAAA,MAAM,UAAA,GAAmBA,oBAAY,MAAM;AACzC,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG,KAAA,EAAM;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAA,CAAI,OAAO,CAAC,CAAA;AAEhB,EAAA,MAAM,oBAAA,GAA6BA,oBAAY,MAAM;AACnD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,MAAM,WAAA,GACJ,QAAA,CAAS,aAAA,CAAgC,kCAAkC,CAAA,IAC3E,QAAA,CAAS,aAAA,CAAiC,wBAAwB,CAAA,IAClE,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACrC,MAAA,WAAA,EAAa,KAAA,EAAM;AAAA,IACrB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAA,CAAI,OAAO,CAAC,CAAA;AAEhB,EAAA,MAAM,eAAA,GAAwBA,OAAA,CAAA,WAAA;AAAA,IAC5B,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,aAAc,KAAA,GAAQ,OAAA,CAAQ,MAAA,GAAU,OAAA,CAAQ,UAAU,OAAA,CAAQ,MAAA;AACxE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,QAAA,wBAAA,CAAyB,SAAS,CAAA;AAAA,MACpC;AACA,MAAA,qBAAA,CAAsB,SAAS,CAAA;AAC/B,MAAA,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,EAAG,GAAA,IAAO,IAAI,CAAA;AAChD,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,cAAA,CAAe,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,EAAM;AAAA,MAC3C,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,aAAA,EAAe,wBAAA,EAA0B,wBAAwB;AAAA,GAC7E;AAEA,EAAA,MAAM,kBAAA,GAA2BA,oBAAY,MAAM;AACjD,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAChC,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAA,EAAY,wBAAwB,CAAC,CAAA;AAEzC,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,aAAA,KAAkB,QAAA,IAAY,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAExD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,SAAA,GAAY,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAA;AACvE,MAAA,wBAAA,CAAyB,SAAS,CAAA;AAClC,MAAA,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,EAAG,GAAA,IAAO,IAAI,CAAA;AAChD,MAAA;AAAA,IACF;AAEA,IAAA,qBAAA,CAAsB,mBAAmB,CAAA;AACzC,IAAA,gBAAA,CAAiB,OAAA,CAAQ,mBAAmB,CAAA,EAAG,GAAA,IAAO,IAAI,CAAA;AAC1D,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,cAAA,CAAe,OAAA,CAAQ,mBAAmB,CAAA,EAAG,KAAA,EAAM;AAAA,IACrD,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,aAAA;AAAA,IACA,OAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAChC,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,UAAA,CAAW,OAAA,EACP,cAAc,wBAAwB,CAAA,EACtC,eAAe,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,IACzC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAEhC,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,aAAA,IAAiB,SAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3E,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,OAAA,IAAW,CAAC,WAAW,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9D,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,cAAc,GAAA,CAAI,OAAA,EAAS,aAAa,CAAC,CAAA;AAE5D,EAAA,IAAI,aAAA,KAAkB,QAAA,IAAY,CAAC,eAAA,EAAiB,OAAO,IAAA;AAE3D,EAAA,uBACEZ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA;AAAA,MAC7C,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,gBAAgB,CAAA,GAAI,CAAA;AAAA,QACzB,MAAM,eAAA,CAAgB;AAAA,OACxB;AAAA,MACA,YAAA,EAAc,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,MAEzC,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAEb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAI,GAAA,CAAI,YAAA;AAAA,YACR,IAAA,EAAM,gBAAgB,SAAA,GAAY,MAAA;AAAA,YAClC,SAAA,EAAW,EAAA;AAAA,cACT,2BAAA;AAAA,cACA,iDAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC9B,cAAA,MAAM,UAAA,GAAa,aAAA,EAAe,MAAA,KAAW,MAAA,CAAO,GAAA;AACpD,cAAA,MAAM,WAAW,KAAA,KAAU,iBAAA;AAE3B,cAAA,uBACEC,IAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,oBAAA,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,kBAClC,CAAA;AAAA,kBACA,EAAA,EAAI,GAAA,CAAI,iBAAA,CAAkB,KAAK,CAAA;AAAA,kBAC/B,IAAA,EAAM,gBAAgB,QAAA,GAAW,UAAA;AAAA,kBACjC,QAAA,EACE,gBACI,qBAAA,KAA0B,QAAA,IAAY,WACpC,CAAA,GACA,EAAA,GACF,KAAA,KAAU,kBAAA,GACR,CAAA,GACA,EAAA;AAAA,kBAER,eAAA,EAAe,gBAAgB,QAAA,GAAW,MAAA;AAAA,kBAC1C,WAAW,2BAAA,CAA4B;AAAA,oBACrC,QAAA,EAAU,gBAAgB,QAAA,GAAW;AAAA,mBACtC,CAAA;AAAA,kBACD,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,oBAAA,IAAI,aAAA,IAAiB,cAAA,EAAe;AAAA,kBACtC,CAAA;AAAA,kBACA,SAAS,MAAM;AACb,oBAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,oBAAA,oBAAA,EAAqB;AAAA,kBACvB,CAAA;AAAA,kBACA,cAAc,MAAM;AAClB,oBAAA,gBAAA,CAAiB,OAAO,GAAG,CAAA;AAC3B,oBAAA,IAAI,aAAA,EAAe;AACjB,sBAAA,wBAAA,CAAyB,KAAK,CAAA;AAAA,oBAChC,CAAA,MAAO;AACL,sBAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,oBAC7B;AAAA,kBACF,CAAA;AAAA,kBACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,oBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACvB,sBAAA,oBAAA,EAAqB;AACrB,sBAAA;AAAA,oBACF;AACA,oBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,YAAA,EAAc;AACnD,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzB,sBAAA;AAAA,oBACF;AACA,oBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,QAAQ,WAAA,EAAa;AAChD,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzB,sBAAA;AAAA,oBACF;AACA,oBAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,sBAAA;AAAA,oBACF;AACA,oBAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,eAAA,CAAgB,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClC,sBAAA;AAAA,oBACF;AACA,oBAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,YAAA,EAAa;AACb,sBAAA,kBAAA,EAAmB;AACnB,sBAAA;AAAA,oBACF;AACA,oBAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,sBAAA,YAAA,EAAa;AACb,sBAAA,IAAI,EAAE,QAAA,EAAU;AACd,wBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,wBAAA,kBAAA,EAAmB;AAAA,sBACrB;AACA,sBAAA;AAAA,oBACF;AACA,oBAAA,IACE,aAAA,IACA,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,CAAA,IACjB,CAAC,CAAA,CAAE,OAAA,IACH,CAAC,CAAA,CAAE,OAAA,IACH,CAAC,EAAE,MAAA,EACH;AACA,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,kBAAA,EAAmB;AACnB,sBAAA;AAAA,oBACF;AACA,oBAAA,IACE,aAAA,KACC,CAAA,CAAE,GAAA,KAAQ,WAAA,IACT,CAAA,CAAE,GAAA,KAAQ,QAAA,IACV,CAAA,CAAE,GAAA,KAAQ,WAAA,IACV,CAAA,CAAE,GAAA,KAAQ,YAAA,CAAA,EACZ;AACA,sBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,sBAAA,kBAAA,EAAmB;AAAA,oBACrB;AAAA,kBACF,CAAA;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAD,GAAAA,CAAC,SAAM,IAAA,EAAM,EAAA,EAAI,WAAW,EAAA,CAAG,UAAA,GAAa,gBAAA,GAAmB,WAAW,CAAA,EAAG,CAAA;AAAA,oCAC7EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,+BAAA,CAAgC,EAAE,QAAA,EAAU,UAAA,EAAY,CAAA,EACtE,QAAA,EAAA,MAAA,CAAO,KAAA,EACV;AAAA;AAAA,iBAAA;AAAA,gBArGK,MAAA,CAAO;AAAA,eAsGd;AAAA,YAEJ,CAAC;AAAA;AAAA,SACH;AAAA,QAGC,qBAAqB,gBAAA,EAAkB,WAAA,oBACtCC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qFAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACZ,2BAAiB,KAAA,EACpB,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,0CAAA;AAAA,gBACA,4EAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEC,QAAA,EAAA,gBAAA,CAAiB;AAAA;AAAA;AACpB,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;AAG3B,SAAS,qBAAA,GAAwB;AACtC,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAgB;AACpB,EAAA,MAAM,UAAA,GAAmBY,eAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,MAAA,CAAqC,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAUA,iBAAS,CAAC,CAAA;AAExE,EAAA,MAAM,YAAY,aAAA,EAAe,MAAA,GAAS,sBAAsB,aAAA,CAAc,MAAM,IAAI,EAAC;AACzF,EAAA,MAAM,wBAAwB,IAAA,CAAK,GAAA;AAAA,IACjC,CAAA;AAAA,IACA,eAAe,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA,GAAI;AAAA,GACxE;AAEA,EAAA,MAAM,mBAAA,GAA4BA,oBAAY,MAAM;AAClD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,aAAA,CAAiC,wBAAwB,CAAA,EAAG,KAAA,EAAM;AAAA,IAC7E,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,sBAAA,GAA+BA,oBAAY,MAAM;AACrD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,MAAM,WAAA,GACJ,QAAA,CAAS,aAAA,CAAgC,kCAAkC,CAAA,IAC3E,QAAA,CAAS,aAAA,CAAiC,8BAA8B,CAAA,IACxE,QAAA,CAAS,aAAA,CAAiC,mCAAmC,CAAA;AAC/E,MAAA,WAAA,EAAa,KAAA,EAAM;AAAA,IACrB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,SAAA,GAAA,CAAa,KAAA,GAAQ,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU,MAAA;AACzD,MAAA,uBAAA,CAAwB,SAAS,CAAA;AACjC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,gBAAA,CAAiB,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,EAAM;AAAA,MAC7C,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,UAAU,MAAM;AAAA,GACnB;AAEA,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,aAAA,KAAkB,UAAA,IAAc,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAE5D,IAAA,uBAAA,CAAwB,qBAAqB,CAAA;AAC7C,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,gBAAA,CAAiB,OAAA,CAAQ,qBAAqB,CAAA,EAAG,KAAA,EAAM;AAAA,IACzD,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,aAAA,EAAe,SAAA,CAAU,MAAA,EAAQ,qBAAqB,CAAC,CAAA;AAG3D,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,kBAAkB,UAAA,EAAY;AAElC,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,IAAI,UAAA,CAAW,WAAW,CAAC,UAAA,CAAW,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACxE,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,YAAY,CAAC,CAAA;AAEhC,EAAA,IAAI,aAAA,KAAkB,UAAA,IAAc,CAAC,eAAA,EAAiB,OAAO,IAAA;AAE7D,EAAA,uBACEZ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,yBAAA;AAAA,MACV,IAAA,EAAK,MAAA;AAAA,MACL,IAAI,GAAA,CAAI,cAAA;AAAA,MACR,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,mBAAmB,CAAA;AAAA,MACvD,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,gBAAgB,CAAA,GAAI,CAAA;AAAA,QACzB,MAAM,eAAA,CAAgB;AAAA,OACxB;AAAA,MAEA,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,qCACb,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,KAAU;AAClC,QAAA,MAAM,UAAA,GAAa,eAAe,QAAA,KAAa,QAAA;AAE/C,QAAA,uBACEC,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,cAAA,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,YACpC,CAAA;AAAA,YACA,IAAA,EAAK,eAAA;AAAA,YACL,EAAA,EAAI,GAAA,CAAI,mBAAA,CAAoB,KAAK,CAAA;AAAA,YACjC,QAAA,EAAU,KAAA,KAAU,oBAAA,GAAuB,CAAA,GAAI,EAAA;AAAA,YAC/C,cAAA,EAAc,UAAA;AAAA,YACd,YAAA,EAAY,gBAAgB,QAAQ,CAAA;AAAA,YACpC,WAAW,2BAAA,CAA4B,EAAE,MAAM,UAAA,EAAY,QAAA,EAAU,YAAY,CAAA;AAAA,YACjF,KAAA,EAAO,qBAAA;AAAA,YACP,SAAS,MAAM;AACb,cAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,cAAA,sBAAA,EAAuB;AAAA,YACzB,CAAA;AAAA,YACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,gBAAA,sBAAA,EAAuB;AACvB,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,YAAA,EAAc;AACnD,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AAC3B,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,QAAQ,WAAA,EAAa;AAChD,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AAC3B,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,iBAAA,CAAkB,SAAA,CAAU,SAAS,CAAC,CAAA;AACtC,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,YAAA,EAAa;AACb,gBAAA,mBAAA,EAAoB;AACpB,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,gBAAA,YAAA,EAAa;AACb,gBAAA,IAAI,EAAE,QAAA,EAAU;AACd,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,mBAAA,EAAoB;AAAA,gBACtB,CAAA,MAAO;AACL,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,sBAAA,EAAuB;AAAA,gBACzB;AAAA,cACF;AAAA,YACF,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,EAAA;AAAA,kBACN,SAAA,EAAW,EAAA,CAAG,qBAAA,EAAuB,UAAA,GAAa,mBAAmB,WAAW;AAAA;AAAA,eAClF;AAAA,8BACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DACd,QAAA,kBAAAA,GAAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAoB,CAAA,EAChD;AAAA;AAAA,WAAA;AAAA,UAlEK;AAAA,SAmEP;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAEA,qBAAA,CAAsB,WAAA,GAAc,uBAAA;AAG7B,SAAS,uBAAA,GAA0B;AACxC,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAgB;AACpB,EAAA,MAAM,UAAA,GAAmBY,eAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,kBAAA,GAA2BA,OAAA,CAAA,MAAA,CAAqC,EAAE,CAAA;AAExE,EAAA,MAAM,UAAA,GAAmBA,oBAAY,MAAM;AACzC,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG,KAAA,EAAM;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAA,CAAI,OAAO,CAAC,CAAA;AAEhB,EAAA,MAAM,eAAA,GAAwBA,OAAA,CAAA,WAAA;AAAA,IAC5B,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACpC,MAAA,MAAM,aACF,KAAA,GAAQ,iBAAA,CAAkB,MAAA,GAAU,iBAAA,CAAkB,UAAU,iBAAA,CAAkB,MAAA;AACtF,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,MAAA,wBAAA,CAAyB,SAAS,CAAA;AAClC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,EAAM;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,iBAAA,CAAkB,MAAA,EAAQ,wBAAA,EAA0B,wBAAwB;AAAA,GAC/E;AAEA,EAAA,MAAM,kBAAA,GAA2BA,oBAAY,MAAM;AACjD,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAChC,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAA,EAAY,wBAAwB,CAAC,CAAA;AAKzC,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAEhC,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,SAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,OAAA,IAAW,CAAC,WAAW,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9D,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,YAAA,EAAc,GAAA,CAAI,OAAO,CAAC,CAAA;AAE7C,EAAA,IAAI,kBAAkB,QAAA,IAAY,iBAAA,CAAkB,WAAW,CAAA,IAAK,CAAC,iBAAiB,OAAO,IAAA;AAE7F,EAAA,uBACEZ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,2BAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,mBAAmB,CAAA;AAAA,MACvD,KAAA,EAAO;AAAA,QACL,GAAA,EAAK,gBAAgB,CAAA,GAAI,CAAA;AAAA,QACzB,MAAM,eAAA,CAAgB;AAAA,OACxB;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,IAAI,YAAA,EAAc,IAAA,EAAK,SAAA,EAAU,SAAA,EAAW,6BAClD,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAC,MAAA,EAAQ,0BAC9BA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,YAAA,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,UACtC,CAAA;AAAA,UACA,EAAA,EAAI,GAAA,CAAI,iBAAA,CAAkB,KAAK,CAAA;AAAA,UAC/B,IAAA,EAAK,QAAA;AAAA,UACL,iBAAe,KAAA,KAAU,qBAAA;AAAA,UACzB,QAAA,EACE,qBAAA,KAA0B,QAAA,IAAY,KAAA,KAAU,wBAAwB,CAAA,GAAI,EAAA;AAAA,UAE9E,WAAW,2BAAA,CAA4B;AAAA,YACrC,UAAU,KAAA,KAAU;AAAA,WACrB,CAAA;AAAA,UACD,OAAA,EAAS,MAAM,sBAAA,CAAuB,MAAA,CAAO,GAAG,CAAA;AAAA,UAChD,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,UACrC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,sBAAA,CAAuB,OAAO,GAAG,CAAA;AACjC,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,YAAA,EAAc;AACnD,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,QAAQ,WAAA,EAAa;AAChD,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,eAAA,CAAgB,QAAQ,CAAC,CAAA;AACzB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,eAAA,CAAgB,CAAC,CAAA;AACjB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,eAAA,CAAgB,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAC5C,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,YAAA,EAAa;AACb,cAAA,kBAAA,EAAmB;AACnB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,cAAA,YAAA,EAAa;AACb,cAAA,IAAI,EAAE,QAAA,EAAU;AACd,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,kBAAA,EAAmB;AAAA,cACrB;AACA,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,MAAA,EAAQ;AAC/D,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,kBAAA,EAAmB;AACnB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,QAAA,EAAU;AAC/C,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,kBAAA,EAAmB;AAAA,YACrB;AAAA,UACF,CAAA;AAAA,UACA,YAAA,EAAc,MAAM,wBAAA,CAAyB,KAAK,CAAA;AAAA,UAElD,QAAA,kBAAAC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,iCAAgC,EAC/C,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,KAAA,EAAM,CAAA;AAAA,4BACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAA6D,QAAA,EAAA,uCAAA,EAE7E;AAAA,WAAA,EACF;AAAA,SAAA;AAAA,QAxEK,MAAA,CAAO;AAAA,OA0Ef,CAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAEA,uBAAA,CAAwB,WAAA,GAAc,yBAAA;AAG/B,SAAS,sBAAA,GAAyB;AACvC,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAA;AAAA,IACA,gBAAA;AAAA,IACA,uBAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAgB;AACpB,EAAA,MAAM,UAAA,GAAmBY,eAAuB,IAAI,CAAA;AACpD,EAAA,MAAM,kBAAA,GAA2BA,OAAA,CAAA,MAAA,CAAqC,EAAE,CAAA;AAExE,EAAA,MAAM,UAAA,GAAmBA,oBAAY,MAAM;AACzC,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG,KAAA,EAAM;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAA,CAAI,OAAO,CAAC,CAAA;AAEhB,EAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACnC,MAAA,MAAM,aACF,KAAA,GAAQ,gBAAA,CAAiB,MAAA,GAAU,gBAAA,CAAiB,UAAU,gBAAA,CAAiB,MAAA;AACnF,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,MAAA,uBAAA,CAAwB,SAAS,CAAA;AACjC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,EAAM;AAAA,MAC/C,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,wBAAA,EAA0B,uBAAA,EAAyB,gBAAA,CAAiB,MAAM;AAAA,GAC7E;AAEA,EAAA,MAAM,kBAAA,GAA2BA,oBAAY,MAAM;AACjD,IAAA,wBAAA,CAAyB,OAAO,CAAA;AAChC,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAA,EAAY,wBAAwB,CAAC,CAAA;AAMzC,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAE/B,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,SAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAW,OAAA,IAAW,CAAC,WAAW,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9D,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AAAA,IAC3D,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,YAAA,EAAc,GAAA,CAAI,OAAO,CAAC,CAAA;AAE7C,EAAA,IAAI,aAAA,KAAkB,OAAA,IAAW,CAAC,eAAA,EAAiB,OAAO,IAAA;AAG1D,EAAA,IAAI,uBAAA,IAA2B,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AAC5D,IAAA,uBACEZ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,WAAA,EAAU,0BAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,mBAAmB,CAAA;AAAA,QACvD,KAAA,EAAO,EAAE,GAAA,EAAK,eAAA,CAAgB,IAAI,CAAA,EAAG,IAAA,EAAM,gBAAgB,CAAA,EAAE;AAAA,QAE7D,QAAA,kBAAAA,IAAC,sBAAA,EAAA,EAAuB;AAAA;AAAA,KAC1B;AAAA,EAEJ;AAGA,EAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE1C,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oBAAA;AAAA,QACA,iDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,GAAA,EAAK,eAAA,CAAgB,IAAI,CAAA,EAAG,IAAA,EAAM,gBAAgB,CAAA,EAAE;AAAA,MAE7D,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,IAAI,WAAA,EAAa,IAAA,EAAK,SAAA,EAAU,SAAA,EAAW,6BACjD,QAAA,EAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,UAAA,EAAY,0BACjCA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,GAAA,EAAK,CAAC,IAAA,KAAS;AACb,YAAA,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,UACtC,CAAA;AAAA,UACA,EAAA,EAAI,GAAA,CAAI,gBAAA,CAAiB,KAAK,CAAA;AAAA,UAC9B,IAAA,EAAK,QAAA;AAAA,UACL,iBAAe,KAAA,KAAU,oBAAA;AAAA,UACzB,QAAA,EAAU,qBAAA,KAA0B,QAAA,IAAY,KAAA,KAAU,uBAAuB,CAAA,GAAI,EAAA;AAAA,UACrF,WAAW,2BAAA,CAA4B;AAAA,YACrC,UAAU,KAAA,KAAU;AAAA,WACrB,CAAA;AAAA,UACD,OAAA,EAAS,MAAM,qBAAA,CAAsB,UAAA,CAAW,KAAK,CAAA;AAAA,UACrD,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,UACrC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,qBAAA,CAAsB,WAAW,KAAK,CAAA;AACtC,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,YAAA,EAAc;AACnD,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,cAAA,CAAe,QAAQ,CAAC,CAAA;AACxB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,QAAQ,WAAA,EAAa;AAChD,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,cAAA,CAAe,QAAQ,CAAC,CAAA;AACxB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,cAAA,CAAe,CAAC,CAAA;AAChB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,cAAA,CAAe,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAC1C,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,YAAA,EAAa;AACb,cAAA,kBAAA,EAAmB;AACnB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,cAAA,YAAA,EAAa;AACb,cAAA,IAAI,EAAE,QAAA,EAAU;AACd,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,kBAAA,EAAmB;AAAA,cACrB;AACA,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,MAAA,EAAQ;AAC/D,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,kBAAA,EAAmB;AACnB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,QAAA,EAAU;AAC/C,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,kBAAA,EAAmB;AAAA,YACrB;AAAA,UACF,CAAA;AAAA,UACA,YAAA,EAAc,MAAM,uBAAA,CAAwB,KAAK,CAAA;AAAA,UAEjD,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,+BAAA,EAAgC,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,UAAA,CAAW,OAAM,CAAA,EAC/C;AAAA,SAAA;AAAA,QAnEK,UAAA,CAAW;AAAA,OAqEnB,CAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAEA,sBAAA,CAAuB,WAAA,GAAc,wBAAA;AAU9B,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAU,SAAA,EAAU,EAA6B;AACrF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACrC,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,oBACDD,IAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,oBACvBA,IAAC,uBAAA,EAAA,EAAwB,CAAA;AAAA,oBACzBA,IAAC,sBAAA,EAAA,EAAuB;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAEA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;ACp1BlC,IAAMa,sBAAAA,GAAwB;AAAA,EAC5B,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,gBAAA,GACJ,qNAAA;AAgBK,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA;AAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,kBAAA,KAAuB,eAAA,EAAgB;AAEvF,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,KAAA,IAAS,MAAA,CAAO,MAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA;AACrD,EAAA,MAAM,aAAA,GAAgB,2BAAA,CAA4B,MAAA,CAAO,QAAQ,CAAA;AACjE,EAAA,MAAM,qBAAA,GACJ,MAAA,CAAO,QAAA,KAAa,UAAA,GAAa,oBAAA,GAAuB,mBAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AACvC,EAAA,MAAM,eAAe,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,aAAa,IAAI,WAAW,CAAA,CAAA;AACnE,EAAA,MAAM,cAAA,GAAiB,YAAY,eAAA,GAAkB,gBAAA;AAErD,EAAA,MAAM,YAAA,GAAqBC,OAAA,CAAA,WAAA;AAAA,IACzB,CAAC,CAAA,KAAwB;AACvB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,YAAA,CAAa,OAAO,EAAE,CAAA;AACtB,MAAA,SAAA,IAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,MAAA,CAAO,EAAA,EAAI,YAAA,EAAc,SAAS;AAAA,GACrC;AAEA,EAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,IACvB,CAAC,CAAA,KAAwB;AACvB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,MAAA,CAAO,EAAA,EAAI,kBAAkB;AAAA,GAChC;AAEA,EAAA,uBACEb,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qFAAA;AAAA,QACA,YAAY,eAAA,GAAkB,gBAAA;AAAA,QAC9B,aAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAD,IAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,GAAA,EAC9B,QAAA,kBAAAC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAC,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,wBAAA;AAAA,cACV,QAAA;AAAA,cACA,OAAA,EAAS,UAAA;AAAA,cACT,YAAA,EAAY,GAAG,YAAY,CAAA,0BAAA,CAAA;AAAA,cAC3B,SAAA,EAAW,EAAA;AAAA,gBACT,+DAAA;AAAA,gBACA,gBAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,KAAA,EAAOY,sBAAAA;AAAA,cAEP,QAAA,EAAA;AAAA,gCAAAb,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA,sBAIT,yCAAA;AAAA,sBACA,mBAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA;AAAA,iBACH;AAAA,gCAEAA,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAW,IAAA;AAAA,oBACX,KAAA,EAAO,aAAA;AAAA,oBACP,SAAA,EAAW,EAAA;AAAA,sBACT,0DAAA;AAAA,sBACA,qBAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA;AAAA,iBACH;AAAA,gCAEAA,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA,sBAIT,mBAAA;AAAA,sBACA,oBAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,WACF,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,YAAA,EAAa;AAAA,SAAA,EAChC,CAAA,EACF,CAAA;AAAA,wBAEAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA;AAAA,YACA,OAAA,EAAS,YAAA;AAAA,YACT,SAAA,EAAW,EAAA;AAAA,cACT,oFAAA;AAAA,cACA,gBAAA;AAAA,cACA,gCAAA;AAAA,cACA,0CAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,KAAA,EAAOa,sBAAAA;AAAA,YACP,YAAA,EAAY,GAAG,WAAW,CAAA,0BAAA,CAAA;AAAA,YAE1B,QAAA,kBAAAb,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,aAAA,EAAe,EAAA;AAAA,kBACb,YACI,+FAAA,GACA,iGAAA;AAAA,kBACJ,2IAAA;AAAA,kBACA;AAAA;AACF;AAAA;AACF;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AC5J9B,IAAMa,sBAAAA,GAAwB;AAAA,EAC5B,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,YAAA,EAAc;AAChB,CAAA;AAIA,IAAM,mBAAA,GAAsB,CAAC,CAAA,KAC3B,OAAA,CAAS,EAAE,MAAA,CAAuB,OAAA,CAAQ,gCAAgC,CAAC,CAAA;AAG7E,SAAS,UAAA,CAAW;AAAA,EAClB,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,yBAAA;AAAA,EACA,yBAAA;AAAA,EACA,2BAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAkBG;AACD,EAAA,MAAM,qBAAA,GACJ,aAAA,CAAc,QAAA,KAAa,UAAA,GAAa,oBAAA,GAAuB,mBAAA;AAEjE,EAAA,uBACEZ,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,2BAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,8FAAA;AAAA,QACA,YAAY,eAAA,GAAkB,gBAAA;AAAA,QAC9B;AAAA,OACF;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,oBAAA,EAAkB,IAAA;AAAA,YAClB,OAAA,EAAS,uBAAA;AAAA,YACT,SAAA,EAAW,yBAAA;AAAA,YACX,SAAA,EAAW,EAAA;AAAA,cACT,wFAAA;AAAA,cACA,2KAAA;AAAA,cACA,YACI,0CAAA,GACA;AAAA,aACN;AAAA,YACA,KAAA,EAAOa,sBAAAA;AAAA,YAEP,QAAA,kBAAAb,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,qBAAqB,SAAA,GAAY,eAAA,GAAkB,gBAAgB,CAAA,EACpF,QAAA,EAAA,kBAAA,EACH;AAAA;AAAA,SACF;AAAA,wBAGAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,sBAAA,EAAoB,IAAA;AAAA,YACpB,OAAA,EAAS,yBAAA;AAAA,YACT,SAAA,EAAW,2BAAA;AAAA,YACX,YAAA,EAAY,oBAAA;AAAA,YACZ,KAAA,EAAO,oBAAA;AAAA,YACP,SAAA,EAAW,EAAA;AAAA,cACT,yFAAA;AAAA,cACA,2KAAA;AAAA,cACA,YACI,aAAA,CAAc,QAAA,GACZ,6CACA,wDAAA,GACF,aAAA,CAAc,WACZ,4CAAA,GACA;AAAA,aACR;AAAA,YACA,KAAA,EAAOa,sBAAAA;AAAA,YAEP,QAAA,kBAAAb,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,qBAAA;AAAA,kBACA,YACI,aAAA,CAAc,QAAA,GACZ,kBACA,eAAA,GACF,aAAA,CAAc,WACZ,gBAAA,GACA;AAAA,iBACR;AAAA,gBAEC,QAAA,EAAA,aAAA,CAAc,QAAA,GACX,2BAAA,CAA4B,aAAA,CAAc,QAAQ,CAAA,GAClD;AAAA;AAAA;AACN;AAAA,SACF;AAAA,QAGC,aAAA,CAAc,4BACbC,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,qGAAA;AAAA,cACA,oJAAA;AAAA,cACA,YACI,0CAAA,GACA;AAAA,aACN;AAAA,YACA,KAAA,EAAOY,sBAAAA;AAAA,YAGP,QAAA,EAAA;AAAA,8BAAAb,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,UAAA;AAAA,kBACL,SAAA,EAAU,sDAAA;AAAA,kBACV,aAAA,EAAY,MAAA;AAAA,kBAEX,wBAAc,KAAA,IAAS;AAAA;AAAA,eAC1B;AAAA,8BACAA,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,QAAA;AAAA,kBACL,EAAA,EAAI,OAAA;AAAA,kBACJ,gCAAA,EAA8B,IAAA;AAAA,kBAC9B,IAAA,EAAK,MAAA;AAAA,kBACL,IAAA,EAAK,UAAA;AAAA,kBACL,eAAA,EAAe,QAAQ,iBAAiB,CAAA;AAAA,kBACxC,eAAA,EAAe,iBAAA;AAAA,kBACf,uBAAA,EAAuB,qBAAA;AAAA,kBACvB,mBAAA,EAAkB,MAAA;AAAA,kBAClB,gBAAc,SAAA,IAAa,MAAA;AAAA,kBAC3B,YAAA,EAAa,KAAA;AAAA,kBACb,KAAA,EAAO,cAAc,KAAA,IAAS,EAAA;AAAA,kBAC9B,QAAA,EAAU,iBAAA;AAAA,kBACV,SAAA,EAAW,aAAA;AAAA,kBACX,WAAA,EAAY,EAAA;AAAA,kBACZ,YAAA,EAAY,kBAAA,GAAqB,CAAA,EAAG,kBAAkB,CAAA,OAAA,CAAA,GAAO,qBAAA;AAAA,kBAC7D,SAAA,EAAW,EAAA;AAAA,oBACT,oDAAA;AAAA,oBACA,oBAAA;AAAA,oBACA,YAAY,eAAA,GAAkB,gBAAA;AAAA,oBAC9B,sCAAA;AAAA,oBACA,YAAY,2BAAA,GAA8B;AAAA,mBAC5C;AAAA,kBACA,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA;AAAK;AAAA;AACpC;AAAA;AAAA,SACF;AAAA,wBAIFA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,4BAAA,EAA0B,IAAA;AAAA,YAC1B,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,aAAA,EAAc;AAAA,YAChB,CAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,oFAAA;AAAA,cACA,2KAAA;AAAA,cACA,gCAAA;AAAA,cACA,0CAAA;AAAA,cACA,YAAY,eAAA,GAAkB;AAAA,aAChC;AAAA,YACA,KAAA,EAAOa,sBAAAA;AAAA,YACP,YAAA,EAAW,wCAAA;AAAA,YAEX,QAAA,kBAAAb,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,aAAA,EAAe,EAAA;AAAA,kBACb,YACI,+FAAA,GACA,iGAAA;AAAA,kBACJ,2IAAA;AAAA,kBACA;AAAA;AACF;AAAA;AACF;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAOO,SAAS,iBAAA,CAAkB;AAAA,EAChC,WAAA,GAAc,iBAAA;AAAA,EACd,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,qBAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAgB;AAEpB,EAAA,MAAM,QAAA,GAAiBe,eAAyB,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAqBA,eAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,UAAA,GAAmBA,eAAwB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,iBAAS,CAAC,CAAA;AAEpD,EAAA,MAAM,sBAAA,GAA+BA,OAAA,CAAA,WAAA;AAAA,IACnC,CACE,IAAA,EACA,OAAA,EACA,OAAA,GAAqC,OAAA,KAClC;AACH,MAAA,MAAM,IAAA,GAAO,SAAS,qBAAA,EAAsB;AAC5C,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,WAAA,CAAY,IAAA,EAAM,EAAE,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,EAAO,EAAG,OAAO,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,eAAA,GAAwBA,OAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AACxD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG,KAAA,EAAM;AAAA,IACrC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,qBAAA,GAA8BA,OAAA,CAAA,WAAA;AAAA,IAClC,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,aAAc,KAAA,GAAQ,OAAA,CAAQ,MAAA,GAAU,OAAA,CAAQ,UAAU,OAAA,CAAQ,MAAA;AACxE,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,MAAA,wBAAA,CAAyB,SAAS,CAAA;AAClC,MAAA,eAAA,CAAgB,GAAA,CAAI,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,CAAC,OAAA,CAAQ,MAAA,EAAQ,eAAA,EAAiB,GAAA,EAAK,0BAA0B,wBAAwB;AAAA,GAC3F;AAEA,EAAA,MAAM,qBAAA,GAA8BA,OAAA,CAAA,WAAA;AAAA,IAClC,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACpC,MAAA,MAAM,aACF,KAAA,GAAQ,iBAAA,CAAkB,MAAA,GAAU,iBAAA,CAAkB,UAAU,iBAAA,CAAkB,MAAA;AACtF,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,MAAA,wBAAA,CAAyB,SAAS,CAAA;AAClC,MAAA,eAAA,CAAgB,GAAA,CAAI,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,IACA;AAAA,MACE,eAAA;AAAA,MACA,GAAA;AAAA,MACA,iBAAA,CAAkB,MAAA;AAAA,MAClB,wBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,oBAAA,GAA6BA,OAAA,CAAA,WAAA;AAAA,IACjC,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACnC,MAAA,MAAM,aACF,KAAA,GAAQ,gBAAA,CAAiB,MAAA,GAAU,gBAAA,CAAiB,UAAU,gBAAA,CAAiB,MAAA;AACnF,MAAA,wBAAA,CAAyB,QAAQ,CAAA;AACjC,MAAA,uBAAA,CAAwB,SAAS,CAAA;AACjC,MAAA,eAAA,CAAgB,GAAA,CAAI,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAAA,IACjD,CAAA;AAAA,IACA;AAAA,MACE,eAAA;AAAA,MACA,GAAA;AAAA,MACA,wBAAA;AAAA,MACA,uBAAA;AAAA,MACA,gBAAA,CAAiB;AAAA;AACnB,GACF;AAOA,EAAA,MAAM,aAAA,GAAsBA,eAAO,KAAK,CAAA;AACxC,EAAMA,kBAAU,MAAM;AACpB,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,aAAA,IAAiB,eAAe,CAAA;AACxD,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,OAAA,IAAW,CAAC,OAAA;AAChD,IAAA,aAAA,CAAc,OAAA,GAAU,OAAA;AACxB,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,IAC1B,GAAG,CAAC,CAAA;AACJ,IAAA,OAAO,MAAM,aAAa,OAAO,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,aAAA,EAAe,eAAe,CAAC,CAAA;AAGnC,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,MAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAEzB,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,UAAA,GAAa,CAAA;AAAA,MACtD,CAAC,CAAA;AAGD,MAAA,MAAM,SAAS,aAAA,EAAe,MAAA,GAAS,cAAA,CAAe,aAAA,CAAc,MAAM,CAAA,GAAI,IAAA;AAC9E,MAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,OAAA,EAAS;AAC/C,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,sBAAA,CAAuB,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,QAC3D,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,eAAA;AAAA,IACA,aAAA,EAAe,QAAA;AAAA,IACf,aAAA,EAAe,MAAA;AAAA,IACf,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,KAAA,GAAQ,WAAW,OAAA,CAAQ,WAAA;AACjC,MAAA,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,KAAK,CAAC,CAAA;AAGzB,EAAA,MAAM,kBAAA,GAAqB,eAAe,MAAA,GACtC,cAAA,CAAe,cAAc,MAAM,CAAA,EAAG,KAAA,IAAS,aAAA,CAAc,MAAA,GAC7D,IAAA;AAGJ,EAAA,MAAM,uBAAuB,aAAA,EAAe,QAAA,GACxC,eAAA,CAAgB,aAAA,CAAc,QAAQ,CAAA,GACtC,GAAA;AAGJ,EAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,aAAA,CAAc,KAAA,IAAS,EAAA,GAAK,WAAA;AAG/D,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,CAAA,KAA2C;AAC1C,MAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,MAAA,wBAAA,CAAyB,OAAO,CAAA;AAEhC,MAAA,IAAI,aAAA,EAAe;AAEjB,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA,sBAAA,CAAuB,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,MAC3D,CAAA,MAAO;AAEL,QAAA,cAAA,CAAe,KAAK,CAAA;AAEpB,QAAA,IAAI,KAAA,CAAM,MAAK,EAAG;AAChB,UAAA,sBAAA,CAAuB,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,QAC5D,CAAA,MAAO;AACL,UAAA,YAAA,EAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,aAAA;AAAA,MACA,wBAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA;AACF,GACF;AAGA,EAAA,MAAM,aAAA,GAAsBA,OAAA,CAAA,WAAA;AAAA,IAC1B,CAAC,CAAA,KAA6C;AAC5C,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,QAAA,IAAI,eAAe,YAAA,EAAa;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,kBAAkB,QAAA,IAAY,cAAA,KAAmB,OAAA,IAAW,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClF,QAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA;AAAA,YACE,0BAA0B,QAAA,GACtB,qBAAA,GAAwB,CAAA,GACxB,qBAAA,IAAyB,IACvB,qBAAA,GACA;AAAA,WACR;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA;AAAA,YACE,qBAAA,KAA0B,WACtB,qBAAA,GAAwB,CAAA,GACxB,yBAAyB,CAAA,GACvB,qBAAA,GACA,QAAQ,MAAA,GAAS;AAAA,WACzB;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA,CAAsB,CAAC,CAAA;AACvB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA,CAAsB,OAAA,CAAQ,SAAS,CAAC,CAAA;AACxC,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,aAAA,GAAgB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAA;AAC3E,UAAA,MAAM,cAAA,GAAiB,QAAQ,aAAa,CAAA;AAC5C,UAAA,IAAI,cAAA,EAAgB,YAAA,CAAa,cAAA,CAAe,GAAG,CAAA;AACnD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,aAAA,EAAe;AAC3C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,sBAAA,CAAuB,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AACzD,UAAA,IAAI,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,oBAAA,GAAuB,CAAA,EAAG;AAC3D,YAAA,uBAAA,CAAwB,CAAC,CAAA;AAAA,UAC3B;AACA,UAAA,oBAAA,CAAqB,oBAAA,IAAwB,CAAA,GAAI,oBAAA,GAAuB,CAAC,CAAA;AAAA,QAC3E,WAAW,WAAA,CAAY,IAAA,EAAK,IAAK,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAC7D,UAAA,sBAAA,CAAuB,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC1D,UAAA,wBAAA,CAAyB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAC,CAAA;AAC/E,UAAA,qBAAA,CAAsB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAC,CAAA;AAAA,QAC9E,CAAA,MAAO;AACL,UAAA,sBAAA,CAAuB,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC1D,UAAA,wBAAA,CAAyB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAC,CAAA;AAC/E,UAAA,qBAAA,CAAsB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAC,CAAA;AAAA,QAC9E;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,aAAA,KAAkB,OAAA,IAAW,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAC5D,QAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,oBAAA;AAAA,YACE,0BAA0B,QAAA,GACtB,oBAAA,GAAuB,CAAA,GACvB,oBAAA,IAAwB,IACtB,oBAAA,GACA;AAAA,WACR;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,oBAAA;AAAA,YACE,qBAAA,KAA0B,WACtB,oBAAA,GAAuB,CAAA,GACvB,wBAAwB,CAAA,GACtB,oBAAA,GACA,iBAAiB,MAAA,GAAS;AAAA,WAClC;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,oBAAA,CAAqB,CAAC,CAAA;AACtB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,oBAAA,CAAqB,gBAAA,CAAiB,SAAS,CAAC,CAAA;AAChD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,wBAAwB,CAAA,EAAG;AAC7B,YAAA,qBAAA,CAAsB,gBAAA,CAAiB,oBAAoB,CAAA,CAAE,KAAK,CAAA;AAAA,UACpE,CAAA,MAAO;AAEL,YAAA,YAAA,EAAa;AAAA,UACf;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,aAAA,KAAkB,QAAA,IAAY,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AAC9D,QAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA;AAAA,YACE,0BAA0B,QAAA,GACtB,qBAAA,GAAwB,CAAA,GACxB,qBAAA,IAAyB,IACvB,qBAAA,GACA;AAAA,WACR;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA;AAAA,YACE,qBAAA,KAA0B,WACtB,qBAAA,GAAwB,CAAA,GACxB,yBAAyB,CAAA,GACvB,qBAAA,GACA,kBAAkB,MAAA,GAAS;AAAA,WACnC;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA,CAAsB,CAAC,CAAA;AACvB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACnB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,qBAAA,CAAsB,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAClD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,yBAAyB,CAAA,EAAG;AAC9B,YAAA,sBAAA,CAAuB,iBAAA,CAAkB,qBAAqB,CAAA,CAAE,GAAG,CAAA;AAAA,UACrE,CAAA,MAAO;AACL,YAAA,YAAA,EAAa;AAAA,UACf;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,YAAA,EAAa;AAAA,QACf;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,YAAA,EAAa;AAAA,QACf,WAAW,aAAA,EAAe;AACxB,UAAA,aAAA,EAAc;AAAA,QAChB;AACA,QAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,aAAA,EAAe;AACpC,UAAA,QAAA,CAAS,SAAS,IAAA,EAAK;AAAA,QACzB;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,UAAA,EAAY;AAE/C,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,aAAA,EAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,aAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA,wBAAA;AAAA,MACA,YAAA;AAAA,MACA,qBAAA;AAAA,MACA,gBAAA;AAAA,MACA,oBAAA;AAAA,MACA,uBAAA;AAAA,MACA,qBAAA;AAAA,MACA,oBAAA;AAAA,MACA,iBAAA;AAAA,MACA,qBAAA;AAAA,MACA,wBAAA;AAAA,MACA,sBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA;AACF,GACF;AAGA,EAAA,MAAM,mBAAA,GAA4BA,oBAAY,MAAM;AAClD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,YAAA,CAAa,eAAe,CAAA;AAAA,IAC9B;AACA,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,eAAA,EAAiB,YAAA,EAAc,aAAa,CAAC,CAAA;AAMjD,EAAA,MAAM,qBAAA,GAA8BA,oBAAY,MAAM;AACpD,IAAA,IAAI,WAAA,CAAY,IAAA,EAAK,IAAK,iBAAA,CAAkB,SAAS,CAAA,EAAG;AACtD,MAAA,sBAAA,CAAuB,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,IAC5D,CAAA,MAAO;AACL,MAAA,sBAAA,CAAuB,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC1D,MAAA,wBAAA,CAAyB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAC,CAAA;AAAA,IACjF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,iBAAA,CAAkB,MAAA;AAAA,IAClB,sBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAOD,EAAA,MAAM,mBAAA,GAA4BA,oBAAY,MAAM;AAClD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,MAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,MAAA,sBAAA,CAAuB,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC1D,MAAA,wBAAA,CAAyB,qBAAA,IAAyB,CAAA,GAAI,qBAAA,GAAwB,CAAC,CAAA;AAAA,IACjF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,sBAAA,EAAwB,qBAAA,EAAuB,wBAAwB,CAAC,CAAA;AAI5E,EAAA,MAAM,uBAAA,GAAgCA,oBAAY,MAAM;AACtD,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,MAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,MAAA,qBAAA,EAAsB;AAAA,IACxB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAA,MAAM,sBAAA,GAA+BA,oBAAY,MAAM;AACrD,IAAA,IAAI,aAAA,EAAe;AAKnB,IAAA,IAAI,iBAAiB,EAAE,aAAA,KAAkB,QAAA,IAAY,iBAAA,CAAkB,WAAW,CAAA,CAAA,EAAI;AAEtF,IAAA,qBAAA,EAAsB;AAAA,EACxB,GAAG,CAAC,aAAA,EAAe,eAAe,iBAAA,CAAkB,MAAA,EAAQ,qBAAqB,CAAC,CAAA;AAIlF,EAAA,MAAM,wBAAA,GAAiCA,OAAA,CAAA,WAAA,CAAY,CAAC,CAAA,KAAwB;AAC1E,IAAA,IAAI,mBAAA,CAAoB,CAAC,CAAA,EAAG;AAC5B,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,oBAAA,GAA6BA,OAAA,CAAA,WAAA;AAAA,IACjC,CAAC,CAAA,KAAwB;AACvB,MAAA,IAAI,mBAAA,CAAoB,CAAC,CAAA,EAAG;AAC5B,MAAA,IAAI,aAAA,EAAe;AACnB,MAAA,sBAAA,EAAuB;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,eAAe,sBAAsB;AAAA,GACxC;AAGA,EAAA,MAAM,uBAAA,GAAgCA,OAAA,CAAA,WAAA;AAAA,IACpC,CAAC,CAAA,KAA2C;AAC1C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,QAAA,YAAA,EAAa;AAAA,MACf,CAAA,MAAO;AACL,QAAA,sBAAA,CAAuB,QAAA,EAAU,CAAA,CAAE,aAAA,EAAe,QAAQ,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,sBAAA,EAAwB,YAAY;AAAA,GACtD;AAEA,EAAA,MAAM,yBAAA,GAAkCA,OAAA,CAAA,WAAA;AAAA,IACtC,CAAC,CAAA,KAA8C;AAC7C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAClD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,sBAAA,CAAuB,QAAA,EAAU,CAAA,CAAE,aAAA,EAAe,QAAQ,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,CAAC,sBAAsB;AAAA,GACzB;AAGA,EAAA,MAAM,yBAAA,GAAkCA,OAAA,CAAA,WAAA;AAAA,IACtC,CAAC,CAAA,KAA2C;AAC1C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,QAAA,YAAA,EAAa;AAAA,MACf,CAAA,MAAO;AACL,QAAA,sBAAA,CAAuB,UAAA,EAAY,CAAA,CAAE,aAAA,EAAe,QAAQ,CAAA;AAAA,MAC9D;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,sBAAA,EAAwB,YAAY;AAAA,GACtD;AAEA,EAAA,MAAM,2BAAA,GAAoCA,OAAA,CAAA,WAAA;AAAA,IACxC,CAAC,CAAA,KAA8C;AAC7C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAClD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,sBAAA,CAAuB,UAAA,EAAY,CAAA,CAAE,aAAA,EAAe,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,CAAC,sBAAsB;AAAA,GACzB;AAGA,EAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,IACxB,CAAC,CAAA,KAAwB;AACvB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,YAAA,EAAa;AACb,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,cAAc,mBAAmB;AAAA,GACpC;AAGA,EAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,GAAS,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA,IAAK,QAAQ,aAAa,CAAA;AACxF,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,QAAQ,aAAa,CAAA;AAEnE,EAAA,MAAM,qBAAA,GAA8BA,OAAA,CAAA,WAAA;AAAA,IAClC,CAAC,MAAA,KACC,oBAAA,CAAqB,MAAA,CAAO,MAAA,GAAS,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,EAAW,MAAA,CAAO,KAAK,CAAA;AAAA,IAC9F,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,sBAAA,GACJ,kBAAkB,QAAA,IAAY,qBAAA,IAAyB,IACnD,GAAA,CAAI,iBAAA,CAAkB,qBAAqB,CAAA,GAC3C,MAAA;AAEN,EAAA,MAAM,sBAAA,GACJ,aAAA,KAAkB,QAAA,IAAY,cAAA,KAAmB,OAAA,IAAW,yBAAyB,CAAA,GACjF,GAAA,CAAI,iBAAA,CAAkB,qBAAqB,CAAA,GAC3C,MAAA;AAEN,EAAA,MAAM,qBAAA,GACJ,kBAAkB,OAAA,IAAW,oBAAA,IAAwB,IACjD,GAAA,CAAI,gBAAA,CAAiB,oBAAoB,CAAA,GACzC,MAAA;AAGN,EAAA,MAAM,uBAAA,GACJ,aAAA,KAAkB,QAAA,IAAY,iBAAA,CAAkB,MAAA,GAAS,CAAA,GACrD,GAAA,CAAI,YAAA,GACJ,aAAA,KAAkB,QAAA,IAAY,cAAA,KAAmB,OAAA,GAC/C,IAAI,YAAA,GACJ,MAAA;AAER,EAAA,MAAM,8BAA8B,sBAAA,IAA0B,sBAAA;AAE9D,EAAA,uBACEf,GAAAA,CAAC,mBAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,WAAA,EAAU,qBAAA;AAAA,MAEV,IAAA,EAAK,cAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACT,6BAAA;AAAA,QACA,eAAA,IAAmB,WAAA;AAAA,QACnB,oFAAA;AAAA,QACA,mBAAA;AAAA,QACA,gLAAA;AAAA,QACA,+BAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,GAAG,qBAAA,EAAsB;AAAA,MAC5C,WAAA,EAAa,wBAAA;AAAA,MACb,OAAA,EAAS,oBAAA;AAAA,MACR,GAAG,KAAA;AAAA,MAIJ,QAAA,EAAA;AAAA,wBAAAD,IAACgB,MAAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,WAAU,gCAAA,EAAiC,CAAA;AAAA,wBAG7Df,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,wDAAA;AAAA,cACA,eAAA,IAAmB;AAAA,aACrB;AAAA,YAGC,QAAA,EAAA;AAAA,cAAA,OAAA,CAAQ,GAAA;AAAA,gBAAI,CAAC,MAAA,KACZ,MAAA,CAAO,EAAA,KAAO,kCACZD,GAAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBAEC,aAAA;AAAA,oBACA,kBAAA;AAAA,oBACA,oBAAA;AAAA,oBACA,uBAAA;AAAA,oBACA,yBAAA;AAAA,oBACA,yBAAA;AAAA,oBACA,2BAAA;AAAA,oBACA,iBAAA;AAAA,oBACA,aAAA;AAAA,oBACA,aAAA,EAAe,mBAAA;AAAA,oBACf,QAAA;AAAA,oBACA,UAAA;AAAA,oBACA,UAAA;AAAA,oBACA,SAAA,EAAW,sBAAsB,aAAc,CAAA;AAAA,oBAC/C,SAAS,GAAA,CAAI,OAAA;AAAA,oBACb,mBACE,aAAA,KAAkB,OAAA,IAAW,iBAAiB,MAAA,GAAS,CAAA,GACnD,IAAI,WAAA,GACJ,MAAA;AAAA,oBAEN,qBAAA,EAAuB;AAAA,mBAAA;AAAA,kBArBlB,MAAA,CAAO;AAAA,oCAwBdA,GAAAA;AAAA,kBAAC,eAAA;AAAA,kBAAA;AAAA,oBAEC,MAAA;AAAA,oBACA,SAAA,EAAW,sBAAsB,MAAM,CAAA;AAAA,oBACvC,SAAA,EAAU,UAAA;AAAA,oBAEV,SAAA,EAAW,gBAAgB,MAAA,GAAY;AAAA,mBAAA;AAAA,kBALlC,MAAA,CAAO;AAAA;AAMd,eAEJ;AAAA,cAGC,aAAA,IAAiB,CAAC,eAAA,oBACjBA,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,aAAA;AAAA,kBACA,kBAAA;AAAA,kBACA,oBAAA;AAAA,kBACA,uBAAA;AAAA,kBACA,yBAAA;AAAA,kBACA,yBAAA;AAAA,kBACA,2BAAA;AAAA,kBACA,iBAAA;AAAA,kBACA,aAAA;AAAA,kBACA,aAAA,EAAe,mBAAA;AAAA,kBACf,QAAA;AAAA,kBACA,UAAA;AAAA,kBACA,UAAA;AAAA,kBACA,SAAA,EAAW,sBAAsB,aAAa,CAAA;AAAA,kBAC9C,SAAS,GAAA,CAAI,OAAA;AAAA,kBACb,mBACE,aAAA,KAAkB,OAAA,IAAW,iBAAiB,MAAA,GAAS,CAAA,GACnD,IAAI,WAAA,GACJ,MAAA;AAAA,kBAEN,qBAAA,EAAuB;AAAA;AAAA,eACzB;AAAA,cAID,CAAC,iCACAA,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,QAAA;AAAA,kBACL,IAAI,GAAA,CAAI,OAAA;AAAA,kBACR,iCAAA,EAA+B,IAAA;AAAA,kBAC/B,IAAA,EAAK,MAAA;AAAA,kBACL,IAAA,EAAK,UAAA;AAAA,kBACL,eAAA,EAAe,QAAQ,uBAAuB,CAAA;AAAA,kBAC9C,eAAA,EAAe,uBAAA;AAAA,kBACf,uBAAA,EAAuB,2BAAA;AAAA,kBACvB,mBAAA,EAAkB,MAAA;AAAA,kBAClB,YAAA,EAAa,KAAA;AAAA,kBACb,QAAA;AAAA,kBACA,KAAA,EAAO,WAAA;AAAA,kBACP,OAAA,EAAS,sBAAA;AAAA,kBACT,QAAA,EAAU,iBAAA;AAAA,kBACV,SAAA,EAAW,aAAA;AAAA,kBACX,WAAA;AAAA,kBACA,cAAY,WAAA,IAAe,cAAA;AAAA,kBAC3B,SAAA,EAAW,EAAA;AAAA,oBACT,2EAAA;AAAA,oBACA;AAAA;AACF;AAAA;AACF;AAAA;AAAA,SAEJ;AAAA,QAGC,8BACCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,iCAAA,EAA+B,IAAA;AAAA,YAC/B,QAAA;AAAA,YACA,OAAA,EAAS,WAAA;AAAA,YACT,SAAA,EAAW,EAAA;AAAA,cACT,iEAAA;AAAA,cACA,8CAAA;AAAA,cACA,2KAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,KAAA,EAAOa,sBAAAA;AAAA,YACP,YAAA,EAAW,iCAAA;AAAA,YAEX,QAAA,kBAAAb,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACxB;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ;AAEA,iBAAA,CAAkB,WAAA,GAAc,mBAAA;ACj7BhC,IAAM,iBAAuBiB,OAAA,CAAA,UAAA,CAG3B,CAAC,EAAE,KAAA,GAAQ,UAAU,UAAA,GAAa,CAAA,EAAG,GAAG,KAAA,IAAS,GAAA,qBACjDjB,GAAAA,CAAkB,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAA,GAAAA;AAAA,EAAkB,gBAAA,CAAA,OAAA;AAAA,EAAjB;AAAA,IACC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACC,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAA;AAAA,MACT,+JAAA;AAAA,MACA,2EAAA;AAAA,MACA,6EAAA;AAAA,MACA,0DAAA;AAAA,MACA,0DAAA;AAAA,MACA,0DAAA;AAAA,MACA,0DAAA;AAAA,MACA,KAAA,CAAM;AAAA;AACR;AACF,CAAA,EACF,CACD;AAED,cAAA,CAAe,cAA+B,gBAAA,CAAA,OAAA,CAAQ,WAAA;AACtD,IAAM,OAAA,GAA2B,gBAAA,CAAA;AACjC,IAAM,cAAA,GAAkC,gBAAA,CAAA;AACxC,IAAM,aAAA,GAAiC,gBAAA,CAAA;ACrBvC,SAAS,WAAA,CAAY,EAAE,KAAA,GAAQ,cAAA,EAAK,EAAoB;AACtD,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAiD,QAAA,EAAA,KAAA,EAAM,CAAA;AAChF;AA6BO,SAAS,sBAAA,CAAuB;AAAA,EACrC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,QAAA;AAAA,EACA,iBAAA,GAAoB,cAAA;AAAA,EACpB,SAAA,GAAY,8EAAA;AAAA,EACZ,OAAA,GAAU,2BAAA;AAAA,EACV,UAAA,GAAa,IAAA;AAAA,EACb,SAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAAgC;AAC9B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAmB,KAAK,CAAA;AAGpE,EAAAC,UAAU,MAAM;AACd,IAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,YAAA,GAAeC,WAAAA;AAAA,IACnB,CAAC,GAAA,KAAgB;AACf,MAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,QAAA,CAAS,GAAG,IAC/C,cAAA,CAAe,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,GAAG,CAAA,GAC5C,CAAC,GAAG,gBAAgB,GAAG,CAAA;AAE3B,MAAA,iBAAA,CAAkB,eAAe,CAAA;AACjC,MAAA,QAAA,CAAS,eAAe,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,gBAAgB,QAAQ;AAAA,GAC3B;AAGA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,KAAK,CAAA;AAEtD,IAAA,IAAI,cAAA,CAAe,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AAE5C,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb,CAAA,MAAO;AAEL,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEnB,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAC,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QAEf,YAAA,EACE,cAAA,CAAe,MAAA,GAAS,CAAA,GACpB,CAAA,EAAG,KAAA,IAAS,2BAAO,CAAA,EAAA,EAAK,cAAA,CAAe,MAAM,CAAA,oBAAA,CAAA,GAC5C,KAAA,IAAS,2BAAA;AAAA,QAEhB,WAAW,SAAA,EAAW,MAAA;AAAA,QAEtB,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI,WAAU,UAAA,EAAW,CAAA;AAAA,UAC1C,KAAA;AAAA,UACA,cAAA,CAAe,MAAA,GAAS,CAAA,oBACvBA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,UAAA,EAClC,QAAA,EAAA,cAAA,CAAe,MAAA,EAClB;AAAA;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,oBACAC,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,cAAY,KAAA,IAAS,2BAAA;AAAA,QACrB,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAA,EAAW,cAAc,CAAA;AAAA,QAC3E,KAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,eAAY,KAAA,EAAc,CAAA;AAAA,0BAE3BC,KAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,GAAG,2BAAA,EAA6B,SAAA,EAAW,OAAO,CAAA,EACnE,QAAA,EAAA;AAAA,YAAA,UAAA,oBACCD,GAAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,WAAA,EAAa,iBAAA;AAAA,gBACb,WAAW,SAAA,EAAW;AAAA;AAAA,aACxB;AAAA,4BAEFC,KAAC,WAAA,EAAA,EAAY,SAAA,EAAW,GAAG,+BAAA,EAAiC,SAAA,EAAW,WAAW,CAAA,EAChF,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,gBAAc,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,8BACzBC,KAAC,YAAA,EAAA,EAAa,SAAA,EAAW,GAAG,2BAAA,EAA6B,SAAA,EAAW,YAAY,CAAA,EAC9E,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,8BAAA;AAAA,kBAAA;AAAA,oBAEC,QAAA,EAAU,SAAA;AAAA,oBACV,OAAA,EAAS,cAAA,CAAe,MAAA,KAAW,OAAA,CAAQ,MAAA;AAAA,oBAC3C,WAAW,SAAA,EAAW,WAAA;AAAA,oBAErB,QAAA,EAAA;AAAA,mBAAA;AAAA,kBALG;AAAA,iBAMN;AAAA,gBACC,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,kBAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAEvD,kBAAA,uBACEA,GAAAA;AAAA,oBAAC,8BAAA;AAAA,oBAAA;AAAA,sBAEC,OAAO,MAAA,CAAO,KAAA;AAAA,sBACd,QAAA,EAAU,MAAM,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAAA,sBACzC,OAAA,EAAS,UAAA;AAAA,sBACT,WAAW,SAAA,EAAW,WAAA;AAAA,sBAErB,QAAA,EAAA,MAAA,CAAO;AAAA,qBAAA;AAAA,oBANH,MAAA,CAAO;AAAA,mBAOd;AAAA,gBAEJ,CAAC;AAAA,eAAA,EACH;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACpJA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,eAAA,GAAkB,EAAA;AAAA,IACtB,SAAA,IACE,sFAAA;AAAA,IACF;AAAA,GACF;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,uBACEC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,yDAAA;AAAA,QACV,WAAA,EAAU,iBAAA;AAAA,QAGV,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,gCAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,gBACI,yDAAA,GACA;AAAA;AACN;AAAA,WACF;AAAA,0BAEAC,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,iBAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,gBACI,qDAAA,GACA,yCAAA;AAAA,gBACJ,UAAA,IAAc,uBAAA;AAAA,gBACd,SAAA,IACE,6EAAA;AAAA,gBACF;AAAA,eACF;AAAA,cAGA,QAAA,EAAA;AAAA,gCAAAA,IAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,qEAAA;AAAA,oBACV,aAAA,EAAY,MAAA;AAAA,oBAEX,QAAA,EAAA;AAAA,sBAAA,KAAA;AAAA,sBACA,QAAA,IAAY;AAAA;AAAA;AAAA,iBACf;AAAA,gCAEAA,IAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,EAAA,EAAI,OAAA;AAAA,oBACJ,WAAA,EAAU,gBAAA;AAAA,oBACV,eAAA,EAAe,UAAA;AAAA,oBACf,SAAA,EAAW,EAAA;AAAA,sBACT,wDAAA;AAAA,sBACA,iDAAA;AAAA,sBACA,UAAA,GACI,EAAA,CAAG,sBAAA,EAAwB,aAAA,IAAiB,WAAW,CAAA,GACvD,mCAAA;AAAA,sBACJ,eAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA,sBAAA,KAAA;AAAA,sBACA,QAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EAAyB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAE5D;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA,WACF;AAAA,0BAEAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,+BAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,gBACI,yDAAA,GACA;AAAA;AACN;AAAA;AACF;AAAA;AAAA,KACF;AAAA,EAEJ;AAGA,EAAA,uBACEC,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,OAAA;AAAA,MACJ,WAAA,EAAU,gBAAA;AAAA,MACV,eAAA,EAAe,UAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA,QACT,0DAAA;AAAA,QACA,mEAAA;AAAA,QACA,aAAa,sBAAA,GAAyB,mCAAA;AAAA,QACtC,eAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QACA,QAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EAAyB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAE5D;AAAA;AAAA;AAAA,GAEJ;AAEJ;ACzFA,SAAS,mBAAmB,OAAA,EAMjB;AACT,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,UAAS,GAAI,OAAA;AAE/D,EAAA,IAAI,YAAY,OAAO,wBAAA;AACvB,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,IAAI,QAAA,IAAY,MAAA,IAAU,SAAA,EAAW,OAAO,eAAA;AAC5C,IAAA,OAAO,2BAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,IAAU,WAAW,OAAO,0BAAA;AAChC,EAAA,IAAI,UAAU,OAAO,uBAAA;AACrB,EAAA,OAAO,2BAAA;AACT;AAMA,SAAS,oBAAoB,OAAA,EAKlB;AACT,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,MAAA,EAAQ,WAAU,GAAI,OAAA;AAErD,EAAA,IAAI,YAAY,OAAO,yBAAA;AACvB,EAAA,IAAI,WAAW,OAAO,iBAAA;AACtB,EAAA,IAAI,MAAA,IAAU,WAAW,OAAO,4BAAA;AAChC,EAAA,OAAO,yBAAA;AACT;AAMO,SAAS,iBAAiB,OAAA,EAA0D;AACzF,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,GAAS,KAAA;AAAA,IACT,SAAA,GAAY,KAAA;AAAA,IACZ,SAAA,GAAY,KAAA;AAAA,IACZ,UAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,KAAA;AACnB,EAAA,MAAM,UAAA,GAAa,YAAY,MAAA,IAAU,SAAA;AAGzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUqB,iBAAS,KAAK,CAAA;AACtD,EAAMA,kBAAU,MAAM;AAEpB,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,MAAM,YAAA,CAAa,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAgBA,OAAA,CAAA,KAAA,EAAM;AAE5B,EAAA,MAAM,kBAAkB,kBAAA,CAAmB;AAAA,IACzC,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,mBAAmB,mBAAA,CAAoB;AAAA,IAC3C,UAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,SAAA,IAAa,MAAA,IAAU,SAAA;AAE/C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACzIA,IAAM,IAAA,GAAO;AAAA,EACX,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,2BAAA;AAAA,IACV,SAAA,EAAW,oBAAA;AAAA,IACX,SAAA,EAAW,2BAAA;AAAA,IACX,IAAA,EAAM,2BAAA;AAAA,IACN,YAAA,EAAc;AAAA;AAElB,CAAA;AAEA,IAAO,YAAA,GAAQ,IAAA;ACFf,IAAM,aAAA,GAAgBC,IAAI,sCAAsC,CAAA;AAEhE,IAAM,KAAA,GAAQC,WAGZ,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BvB,GAAAA,CAAgB,qBAAf,EAAoB,GAAA,EAAU,WAAW,EAAA,CAAG,aAAA,IAAiB,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CACtF;AACD,KAAA,CAAM,cAA6B,cAAA,CAAA,IAAA,CAAK,WAAA;ACCxC,IAAM,6BAAA,GACJ,2FAAA;AA6BF,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAQ;AAAA,EAC7B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAQ;AAAA,EAC7B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,uBAAA,EAAS;AAAA,EAC/B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,uBAAA,EAAS;AAAA,EAC/B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,uBAAA;AACxB,CAAA;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,OAAA,GAAU,gBAAA;AAAA,EACV,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,aAAK,MAAA,CAAO,IAAA;AAAA,EACtB,mBAAA,GAAsB,aAAK,MAAA,CAAO,YAAA;AAAA,EAClC,aAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,WAAA,GAAc,IAAA;AAAA,EACd,aAAA,GAAgB,IAAA;AAAA,EAChB,kBAAA,GAAqB;AACvB,CAAA,EAA0B;AAExB,EAAA,MAAM,yBAAA,GAA4BoB,WAAAA;AAAA,IAChC,CAACI,KAAAA,EAAkBC,cAAAA,GAA+B,IAAA,KAAS;AACzD,MAAA,IAAI,CAACD,KAAAA,EAAM,IAAA,IAAQ,CAACA,KAAAA,EAAM,IAAI,OAAO,MAAA;AAErC,MAAA,MAAM,KAAA,uBAAY,IAAA,EAAK;AAEvB,MAAA,MAAM,OAAA,GACJC,cAAAA,KAAkB,IAAA,GAAO,SAAA,CAAUD,KAAAA,CAAK,EAAA,EAAI,KAAK,CAAA,GAAI,SAAA,CAAUA,KAAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAGjF,MAAA,IAAI,CAAC,SAAS,OAAO,QAAA;AAGrB,MAAA,MAAM,QAAA,GACJC,cAAAA,KAAkB,IAAA,GACd,wBAAA,CAAyB,KAAA,EAAOD,KAAAA,CAAK,IAAI,CAAA,GACzC,wBAAA,CAAyBA,KAAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAG7C,MAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,KAAA,KAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAEvE,MAAA,OAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAQA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIN,QAAAA;AAAA,IAC1C,YAAA,IAAgB,0BAA0B,IAAI;AAAA,GAChD;AAGA,EAAA,SAAS,KAAA,GAAQ;AACf,IAAA,iBAAA,CAAkB,MAAS,CAAA;AAC3B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,wBAAW,IAAI,IAAA,IAAQ,EAAC,EAAG,EAAsB,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtE,EAAA,IAAI,oBAAA,IAAwB,CAAC,WAAA,EAAa;AACxC,IAAA,uBACEjB,IAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,SAAS,CAAA,EACjC,QAAA,EAAA;AAAA,sBAAAD,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,sBACXA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACE,GAAG,aAAA;AAAA,UACJ,IAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,OAAA;AAAA,UACV,YAAA,EAAY,IAAA;AAAA,UACZ,cAAA,EAAgB;AAAA;AAAA,OAClB;AAAA,MACC,WAAA,oBACCC,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAJ,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,wBACXC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,SAAA,EAAU,YAAA;AAAA,YACV,OAAA,EAAS,MAAM,uBAAA,CAAwB,KAAK,CAAA;AAAA,YAC5C,OAAA,EAAS,SAAA;AAAA,YAET,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC0B,aAAA,EAAY,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA;AAEjB,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEzB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,yBAAA,EAA2B,SAAA,EAAW,OAAO,CAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,WAEC,QAAA,kBAAAC,IAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,2BAAA;AAAA,QACN,SAAA,EAAW,EAAA;AAAA,UACT,6BAAA;AAAA,UACA,SAAA,EAAW,YAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACb;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,aAAA,oBACCA,IAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cAEC,QAAA,EAAU,KAAA;AAAA,cACV,YAAA,EAAY,cAAA,KAAmB,MAAA,GAAY,SAAA,GAAY,WAAA;AAAA,cACvD,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,WAAW,CAAA;AAAA,cAEpC,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,WAAA;AAAA,sBACA,mBAAmB,MAAA,IAAa,aAAA;AAAA,sBAChC;AAAA;AACF;AAAA,iBACF;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,gBAAgB,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA,aAAA;AAAA,YAZrC;AAAA,WAaN;AAAA,UAED,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZC,IAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cAEC,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,UAAU,MAAM;AACd,gBAAA,MAAM,KAAA,uBAAY,IAAA,EAAK;AACvB,gBAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAElC,gBAAA,MAAM,YACJ,aAAA,KAAkB,IAAA,GACd,EAAE,IAAA,EAAM,OAAA,CAAQ,OAAO,IAAI,CAAA,EAAG,IAAI,KAAA,EAAM,GACxC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAI,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,EAAE;AAE9C,gBAAA,MAAM,aAAA,GAAgB,yBAAA,CAA0B,SAAA,EAAW,aAAa,CAAA;AAExE,gBAAA,IAAI,aAAA,EAAe;AACjB,kBAAA,iBAAA,CAAkB,aAAa,CAAA;AAAA,gBACjC;AAEA,gBAAA,OAAA,GAAU,2BAAW,IAAI,IAAA,IAAQ,EAAC,EAAG,EAAsB,CAAA;AAAA,cAC7D,CAAA;AAAA,cACA,YAAA,EAAY,cAAA,KAAmB,MAAA,CAAO,KAAA,GAAQ,SAAA,GAAY,WAAA;AAAA,cAC1D,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,WAAW,CAAA;AAAA,cAEpC,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,WAAA;AAAA,sBACA,cAAA,KAAmB,OAAO,KAAA,IAAS,aAAA;AAAA,sBACnC;AAAA;AACF;AAAA,iBACF;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,cAAA,EAAgB,iBAAO,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YA7BzC,MAAA,CAAO;AAAA,WA+Bf;AAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,IACC,sCACCA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAU,QAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,UAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,QAC5B,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AAyBA,SAAS,yBAAyB,KAAA,EAAa;AAC7C,EAAA,OAAO;AAAA,IACL,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAQ;AAAA,IAClD,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAQ;AAAA,IAClD,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAQ;AAAA,IACnD,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,EAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAQ;AAAA,IACnD,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,EAAE,OAAO,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,gBAAA;AAAO,GACnD;AACF;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,OAAA,EAAS,WAAA;AAAA,EACT,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,2BAAA;AAAA,EACV,mBAAA,GAAsB,2BAAA;AAAA,EACtB,aAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAqB;AAEnB,EAAA,MAAM,OAAA,GAAU2B,OAAAA,CAAQ,MAAM,WAAA,IAAe,wBAAA,iBAAyB,IAAI,IAAA,EAAM,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAChG,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIT,QAAAA,CAA2B,QAAQ,YAAY,CAAA;AAE3F,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAgB,CAAC,CAAC,cAAA,IAAkB,SAAA,CAAU,gBAAgB,KAAK,CAAA;AAEvF,EAAA,SAAS,KAAA,GAAQ;AACf,IAAA,iBAAA,CAAkB,MAAS,CAAA;AAC3B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,wBAAW,IAAI,IAAA,IAAQ,EAAC,EAAG,EAAsB,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEtE,EAAA,IAAI,oBAAA,IAAwB,CAAC,WAAA,EAAa;AACxC,IAAA,uBACEjB,IAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,SAAS,CAAA,EACjC,QAAA,EAAA;AAAA,sBAAAD,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,sBACXA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACE,GAAG,aAAA;AAAA,UACJ,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,OAAA;AAAA,UACV,YAAA,EAAY;AAAA;AAAA,OACd;AAAA,MACC,WAAA,oBACCC,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAJ,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,wBACXC,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,SAAA,EAAU,YAAA;AAAA,YACV,OAAA,EAAS,MAAM,uBAAA,CAAwB,KAAK,CAAA;AAAA,YAC5C,OAAA,EAAS,SAAA;AAAA,YAET,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC0B,aAAA,EAAY,CAAA;AAAA,cAAE;AAAA;AAAA;AAAA;AAEjB,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEzB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,yBAAA,EAA2B,SAAA,EAAW,OAAO,CAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,WAEC,QAAA,kBAAAC,IAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,2BAAA;AAAA,QACN,SAAA,EAAW,EAAA;AAAA,UACT,6BAAA;AAAA,UACA,SAAA,EAAW,YAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACb;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cAEC,QAAA,EAAU,KAAA;AAAA,cACV,YAAA,EAAY,cAAA,KAAmB,MAAA,GAAY,SAAA,GAAY,WAAA;AAAA,cACvD,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,WAAW,CAAA;AAAA,cAEpC,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,WAAA;AAAA,sBACA,mBAAmB,MAAA,IAAa,aAAA;AAAA,sBAChC;AAAA;AACF;AAAA,iBACF;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,gBAAgB,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA,aAAA;AAAA,YAZrC;AAAA,WAaN;AAAA,UACC,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZC,IAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cAEC,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY;AAAA,cAChC,UAAU,MAAM;AACd,gBAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAC9B,gBAAA,IAAI,OAAA,EAAS;AACX,kBAAA,OAAA,CAAQ,MAAA,CAAO,uBAAO,IAAI,IAAA,IAAQ,EAAC,EAAG,EAAsB,CAAA;AAAA,gBAC9D;AAAA,cACF,CAAA;AAAA,cACA,YAAA,EAAY,UAAA,CAAW,MAAA,CAAO,KAAK,IAAI,SAAA,GAAY,WAAA;AAAA,cACnD,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,WAAW,CAAA;AAAA,cAEpC,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,EAAA;AAAA,sBACT,WAAA;AAAA,sBACA,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,IAAK,aAAA;AAAA,sBAC5B;AAAA;AACF;AAAA,iBACF;AAAA,gCACAA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,cAAA,EAAgB,iBAAO,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YAlBzC,MAAA,CAAO,MAAM,WAAA;AAAY,WAoBjC;AAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,MAAM,uBAAA,CAAwB,IAAI,CAAA;AAAA,QAE1C,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;ACrVA,SAAS4B,YAAAA,CAAY,EAAE,KAAA,GAAQ,cAAA,EAAK,EAAoB;AACtD,EAAA,uBAAO5B,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAiD,QAAA,EAAA,KAAA,EAAM,CAAA;AAChF;AAgBA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAQ;AAAA,EAC7B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,sBAAA,EAAQ;AAAA,EAC7B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,uBAAA,EAAS;AAAA,EAC/B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,uBAAA,EAAS;AAAA,EAC/B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,uBAAA;AACxB,CAAA;AAKA,SAAS,0BAAA,CAA2B;AAAA,EAClC,KAAA,GAAQ,aAAK,MAAA,CAAO,QAAA;AAAA,EACpB,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,SAAS,KAAK,CAAA;AAEtC,EAAA,uBACEjB,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,YAAY,OAAA,CAAQ,gBAAA,EAAkB,MAAM,IAAA,IAAQ,gBAAA,EAAkB,MAAM,EAAE,CAAA;AAAA,QAC9E,aAAA,EAAe,CAAC,gBAAA,EAAkB,IAAA,EAAM,IAAA;AAAA,QACxC,WAAW,SAAA,EAAW,MAAA;AAAA,QACtB,QAAA;AAAA,QACA,SAAA,kBAAWA,GAAAA,CAAC,cAAA,EAAA,EAAe,WAAU,oBAAA,EAAqB,CAAA;AAAA,QAEzD,QAAA,EAAA,gBAAA,EAAkB,MAAM,IAAA,GACvB,gBAAA,EAAkB,MAAM,EAAA,mBACtBC,IAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAAyB,MAAAA,CAAO,kBAAkB,IAAA,EAAM,IAAA,EAAM,aAAa,EAAE,MAAA,EAAQC,IAAI,CAAA;AAAA,UAAE,IAAA;AAAA,UAAG,GAAA;AAAA,UACrED,MAAAA,CAAO,kBAAkB,IAAA,EAAM,EAAA,EAAI,aAAa,EAAE,MAAA,EAAQC,IAAI;AAAA,SAAA,EACjE,CAAA,GAEAD,MAAAA,CAAO,gBAAA,EAAkB,IAAA,EAAM,IAAA,EAAM,aAAa,EAAE,MAAA,EAAQC,EAAAA,EAAI,CAAA,GAGlE;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,oBACA7B,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,2BAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAA,EAAW,cAAc,CAAA;AAAA,QACrF,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC4B,YAAAA,EAAA,EAAY,KAAA,EAAO,2BAAA,EAAS,CAAA;AAAA,0BAC7B5B,GAAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,WAAA,EAAc,GAAG,gBAAA,EAAkB;AAAA;AAAA;AAAA;AAChE,GAAA,EACF,CAAA;AAEJ;AAmBA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,KAAA,GAAQ,aAAK,MAAA,CAAO,QAAA;AAAA,EACpB,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,SAAS,KAAK,CAAA;AAEtC,EAAA,uBACEjB,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,UAAA,EAAY,OAAA,CAAQ,gBAAA,EAAkB,IAAI,CAAA;AAAA,QAC1C,aAAA,EAAe,CAAC,gBAAA,EAAkB,IAAA;AAAA,QAClC,WAAW,SAAA,EAAW,MAAA;AAAA,QACtB,QAAA;AAAA,QACA,SAAA,kBAAWA,GAAAA,CAAC,cAAA,EAAA,EAAe,WAAU,oBAAA,EAAqB,CAAA;AAAA,QAEzD,QAAA,EAAA,gBAAA,EAAkB,IAAA,GAAO6B,MAAAA,CAAO,gBAAA,CAAiB,IAAA,EAAM,OAAO,EAAE,MAAA,EAAQC,EAAAA,EAAI,CAAA,GAAI;AAAA;AAAA,KACnF,EACF,CAAA;AAAA,oBACA7B,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,2BAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAA,EAAW,cAAc,CAAA;AAAA,QACrF,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC4B,YAAAA,EAAA,EAAY,KAAA,EAAO,2BAAA,EAAS,CAAA;AAAA,0BAC7B5B,GAAAA,CAAC,WAAA,EAAA,EAAa,GAAG,gBAAA,EAAkB;AAAA;AAAA;AAAA;AACrC,GAAA,EACF,CAAA;AAEJ;AAeA,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,QAAA,EAAS,EAA4C;AACjF,EAAA,IAAI,CAAC,KAAA,EAAO,uBAAOA,GAAAA,CAAAI,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAC/B,EAAA,uBACEH,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC1DA,GAAAA,CAAC,MAAA,EAAA,EAAK,eAAW,IAAA,EAAC,SAAA,EAAU,8CAA6C,QAAA,EAAA,MAAA,EAEzE,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;AAkDA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAe,EAAC;AAAA,EAChB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,EAAa,eAAA;AAAA,EACb,SAAA,GAAY,8EAAA;AAAA,EACZ,iBAAA,GAAoB,cAAA;AAAA,EACpB,OAAA,GAAU,2BAAA;AAAA,EACV,UAAA,GAAa,IAAA;AAAA,EACb,SAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAU,KAAA;AAAA,EACV,WAAA,GAAc;AAChB,CAAA,EAAqB;AAEnB,EAAA,MAAM,WAAA,GAAc,eAAA,KAAoB,KAAA,GAAQ,cAAA,GAAO,cAAA,CAAA;AAEvD,EAAA,MAAM,eAAA,GAAkB,eAAA,KAAoB,KAAA,GAAQ,cAAA,GAAO,OAAA,CAAA;AAC3D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAmB,SAAS,YAAY,CAAA;AAEpF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGhD,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,SAAA,EAAW;AAC9C,IAAA,iBAAA,CAAkB,KAAA,IAAS,EAAE,CAAA;AAC7B,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,MAAM,YAAA,GAAeE,WAAAA;AAAA,IACnB,CAACW,MAAAA,KAAkB;AACjB,MAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,QAAA,CAASA,MAAK,IACjD,cAAA,CAAe,MAAA,CAAO,CAAC,IAAA,KAAS,SAASA,MAAK,CAAA,GAC9C,CAAC,GAAG,gBAAgBA,MAAK,CAAA;AAE7B,MAAA,iBAAA,CAAkB,eAAe,CAAA;AACjC,MAAA,QAAA,CAAS,eAAe,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,gBAAgB,QAAQ;AAAA,GAC3B;AAEA,EAAA,MAAM,cAAA,GAAiBJ,OAAAA;AAAA,IACrB,MACE,cAAA,CACG,GAAA,CAAI,CAACI,MAAAA,KAAU,OAAA,CAAQ,KAAK,CAAC,MAAA,KAAW,OAAO,KAAA,KAAUA,MAAK,GAAG,KAAK,CAAA,CACtE,OAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAAA,IACd,CAAC,gBAAgB,OAAO;AAAA,GAC1B;AAEA,EAAA,MAAM,SAAA,GAAYJ,OAAAA,CAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,KAAK,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAChF,EAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,cAAA,CAAe,WAAW,OAAA,CAAQ,MAAA;AAG9E,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE1B,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,UAAA,EAAY,eAAe,MAAA,GAAS,CAAA;AAAA,QACpC,aAAA,EAAe,eAAe,MAAA,KAAW,CAAA;AAAA,QACzC,WAAW,SAAA,EAAW,MAAA;AAAA,QACtB,SAAA,kBAAWA,GAAAA,CAAC,cAAA,EAAA,EAAe,WAAU,oBAAA,EAAqB,CAAA;AAAA,QAE1D,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,OACT,QAAA,EAAA,cAAA,CAAe,MAAA,KAAW,KAAK,CAAC,UAAA,IAClC,cAAA,CAAe,MAAA,KAAW,QAAQ,MAAA,GAC9B,eAAA,GACA,eAAe,MAAA,GAAS,CAAA,GACtB,iBACA,WAAA,EACR;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAC,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,cAAY,KAAA,IAAS,cAAA;AAAA,QACrB,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAA,EAAW,cAAc,CAAA;AAAA,QAC3E,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC4B,YAAAA,EAAA,EAAY,KAAA,EAAc,CAAA;AAAA,0BAE3B3B,IAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAA,EAAW,OAAO,CAAA;AAAA,cAC7D,SAAA,EAAW,4BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACCD,GAAAA;AAAA,kBAAC,sBAAA;AAAA,kBAAA;AAAA,oBACC,WAAA,EAAa,iBAAA;AAAA,oBACb,WAAW,SAAA,EAAW;AAAA;AAAA,iBACxB;AAAA,gCAEFC,IAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,OAAO,KAAA,IAAS,cAAA;AAAA,oBAChB,SAAA,EAAW,EAAA;AAAA,sBACT,+BAAA;AAAA,sBACA,oCAAA;AAAA,sBACA,SAAA,EAAW,YAAA;AAAA,sBACX,SAAA,EAAW;AAAA,qBACb;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAD,GAAAA,CAAC,gBAAc,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACxB,OAAA,mBACCA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO,aAAa,CAAA,mBAE5CC,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wCAAAJ,GAAAA;AAAA,0BAAC,8BAAA;AAAA,0BAAA;AAAA,4BAEC,QAAA,EAAU,SAAA;AAAA,4BACV,OAAA,EAAS,aAAA;AAAA,4BACT,WAAW,SAAA,EAAW,WAAA;AAAA,4BAErB,QAAA,EAAA;AAAA,2BAAA;AAAA,0BALG;AAAA,yBAMN;AAAA,wBACC,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,0BAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAEvD,0BAAA,uBACEA,GAAAA;AAAA,4BAAC,8BAAA;AAAA,4BAAA;AAAA,8BAEC,OAAO,MAAA,CAAO,KAAA;AAAA,8BACd,QAAA,EAAU,MAAM,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA;AAAA,8BACzC,OAAA,EAAS,UAAA;AAAA,8BACT,WAAW,SAAA,EAAW,WAAA;AAAA,8BACtB,gBAAA,EAAkB,EAAA;AAAA,gCAChB,OAAO,MAAA,IAAU,eAAA;AAAA,gCACjB,SAAA,EAAW;AAAA,+BACb;AAAA,8BAEC,QAAA,EAAA,MAAA,CAAO,UAAU,MAAA,CAAO;AAAA,6BAAA;AAAA,4BAVpB,MAAA,CAAO;AAAA,2BAWd;AAAA,wBAEJ,CAAC;AAAA,uBAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA;AACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAgDA,SAAS,uBAAA,CAAwB;AAAA,EAC/B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,QAAA;AAAA,EACA,WAAA,EAAa,eAAA;AAAA,EACb,SAAA,GAAY,8EAAA;AAAA,EACZ,iBAAA,GAAoB,cAAA;AAAA,EACpB,OAAA,GAAU,2BAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,UAAA,GAAa,IAAA;AAAA,EACb,SAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,OAAA,GAAU,KAAA;AAAA,EACV,WAAA,GAAc;AAChB,CAAA,EAAsB;AAEpB,EAAA,MAAM,WAAA,GAAc,eAAA,KAAoB,KAAA,GAAQ,cAAA,GAAO,cAAA,CAAA;AACvD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA;AAAA,IAC1C,MAAM,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,KAAA,KAAU,KAAK,CAAA,IAAK;AAAA,GAC5D;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,OAAO,CAAA;AAEtD,EAAA,IAAI,KAAA,KAAU,SAAA,IAAa,OAAA,KAAY,WAAA,EAAa;AAClD,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,cAAA,CAAe,OAAO,CAAA;AACtB,IAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,KAAK,CAAA;AAElE,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAeE,WAAAA;AAAA,IACnB,CAACW,MAAAA,KAAkB;AACjB,MAAA,iBAAA,CAAkBA,MAAK,CAAA;AACvB,MAAA,QAAA,CAASA,MAAK,CAAA;AAEd,MAAA,IAAI,eAAe,UAAA,CAAW,MAAM,OAAA,CAAQ,KAAK,GAAG,CAAC,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,CAAC,UAAU,aAAa;AAAA,GAC1B;AAGA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AACtC,IAAA,IAAI,eAAe,UAAA,CAAW,MAAM,OAAA,CAAQ,KAAK,GAAG,CAAC,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,uBACE9B,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,UAAA,EAAY,QAAQ,cAAc,CAAA;AAAA,QAClC,eAAe,CAAC,cAAA;AAAA,QAChB,WAAW,SAAA,EAAW,MAAA;AAAA,QACtB,SAAA,kBAAWA,GAAAA,CAAC,cAAA,EAAA,EAAe,WAAU,oBAAA,EAAqB,CAAA;AAAA,QAE1D,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAe,QAAA,EAAA,cAAA,EAAgB,SAAS,WAAA,EAAY;AAAA;AAAA,KACnE,EACF,CAAA;AAAA,oBACAC,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,cAAY,KAAA,IAAS,cAAA;AAAA,QACrB,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAA,EAAW,cAAc,CAAA;AAAA,QAC3E,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC4B,YAAAA,EAAA,EAAY,KAAA,EAAc,CAAA;AAAA,0BAE3B3B,IAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA,CAAG,2BAAA,EAA6B,SAAA,EAAW,OAAO,CAAA;AAAA,cAC7D,SAAA,EAAW,4BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACCD,GAAAA;AAAA,kBAAC,sBAAA;AAAA,kBAAA;AAAA,oBACC,WAAA,EAAa,iBAAA;AAAA,oBACb,WAAW,SAAA,EAAW;AAAA;AAAA,iBACxB;AAAA,gCAEFC,IAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBACC,OAAO,KAAA,IAAS,cAAA;AAAA,oBAChB,SAAA,EAAW,EAAA;AAAA,sBACT,+BAAA;AAAA,sBACA,oCAAA;AAAA,sBACA,SAAA,EAAW,YAAA;AAAA,sBACX,SAAA,EAAW;AAAA,qBACb;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAD,GAAAA,CAAC,gBAAc,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACxB,OAAA,mBACCA,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO,aAAa,CAAA,mBAE5CC,IAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,wBAAA,cAAA,oBACCH,IAAAA;AAAA,0BAAC,sBAAA;AAAA,0BAAA;AAAA,4BAEC,QAAA,EAAU,SAAA;AAAA,4BACV,YAAY,cAAA,KAAmB,IAAA;AAAA,4BAC/B,WAAW,SAAA,EAAW,WAAA;AAAA,4BAEtB,QAAA,EAAA;AAAA,8CAAAD,GAAAA;AAAA,gCAACgC,SAAAA;AAAA,gCAAA;AAAA,kCACC,SAAA,EAAW,EAAA;AAAA,oCACT,WAAA;AAAA,oCACA,mBAAmB,IAAA,IAAQ,aAAA;AAAA,oCAC3B;AAAA;AACF;AAAA,+BACF;AAAA,8CACAhC,GAAAA;AAAA,gCAAC,MAAA;AAAA,gCAAA;AAAA,kCACC,WAAW,+BAAA,CAAgC;AAAA,oCACzC,UAAU,cAAA,KAAmB;AAAA,mCAC9B,CAAA;AAAA,kCAEA,QAAA,EAAA;AAAA;AAAA;AACH;AAAA,2BAAA;AAAA,0BAlBI;AAAA,yBAmBN;AAAA,wBAED,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,0BAAA,MAAM,UAAA,GAAa,cAAA,EAAgB,KAAA,KAAU,MAAA,CAAO,KAAA;AAEpD,0BAAA,uBACEC,IAAAA;AAAA,4BAAC,sBAAA;AAAA,4BAAA;AAAA,8BAEC,OAAO,MAAA,CAAO,KAAA;AAAA,8BACd,QAAA,EAAU,MAAM,YAAA,CAAa,MAAM,CAAA;AAAA,8BACnC,UAAA;AAAA,8BACA,WAAW,SAAA,EAAW,WAAA;AAAA,8BAEtB,QAAA,EAAA;AAAA,gDAAAD,GAAAA;AAAA,kCAACgC,SAAAA;AAAA,kCAAA;AAAA,oCACC,SAAA,EAAW,EAAA;AAAA,sCACT,WAAA;AAAA,sCACA,UAAA,IAAc,aAAA;AAAA,sCACd;AAAA;AACF;AAAA,iCACF;AAAA,gDACAhC,GAAAA;AAAA,kCAAC,MAAA;AAAA,kCAAA;AAAA,oCACC,WAAW,+BAAA,CAAgC;AAAA,sCACzC,QAAA,EAAU;AAAA,qCACX,CAAA;AAAA,oCAEA,QAAA,EAAA,MAAA,CAAO,UAAU,MAAA,CAAO;AAAA;AAAA;AAC3B;AAAA,6BAAA;AAAA,4BAnBK,MAAA,CAAO;AAAA,2BAoBd;AAAA,wBAEJ,CAAC;AAAA,uBAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA;AACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAgBA,IAAM,YAAA,GAAe;AAErB,IAAM,UAAA,GAAa;AAEnB,IAAM,eAAA,GAAkB;ACllBxB,IAAM,yBAAA,GAA4BsB,GAAAA;AAAA,EAChC;AAAA,IACE,oGAAA;AAAA,IACA,gEAAA;AAAA,IACA,+DAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV;AAAA,IACE,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR,oEAAA;AAAA,UACA,gEAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,UAAA,EAAY,UAAA;AAAA,QACZ,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW;AAAA;AACb;AAEJ,CAAA;AAsBA,IAAM,iBAAA,GAA0BW,OAAA,CAAA,UAAA;AAAA,EAC9B,CACE;AAAA,IACE,IAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,UAAA,GAAa,UAAA;AAAA,IACb,OAAA;AAAA,IACA,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAGtD,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB;AAAA,MACnB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAC,QAEhB,CAAC,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,KAAe,MAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,KAAe,MAAA;AAEjD,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,WAAA,GAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,UAAA,GAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,WAAA;AAAA,MAC7B,CAAC,CAAA,KAAwB;AACvB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,IAAU;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAIA,IAAA,MAAM,UAAA,GAAmBA,eAAiC,IAAI,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAmC;AAClD,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,WAAA,IAC9B,GAAA,EAAM,GAAA,CAAyD,OAAA,GAAU,IAAA;AAAA,IACpF,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAwC;AAClE,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,6DAA6D,CAAA,EAAG;AAC9E,MAAA,UAAA,CAAW,SAAS,KAAA,EAAM;AAAA,IAC5B,CAAA;AAEA,IAAA,uBACEjC,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAO,MAEpB,QAAA,kBAAAC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,QAC5B,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,SAAA,EAAW,EAAA;AAAA,UACT,yBAAA,CAA0B,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AAAA,UACnD,gBAAA;AAAA,UACA,8CAAA;AAAA,UAAA,CACC,sBAAsB,aAAA,KAAkB,UAAA;AAAA,UACzC,kBAAA,IAAsB,+BAAA;AAAA,UACtB;AAAA,SACF;AAAA,QACA,OAAA,EAAS,kBAAA;AAAA,QAGP,QAAA,EAAA;AAAA,UAAA,CAAA,kBAAA,IAAsB,kCACtBD,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,qBAAqB,UAAA,GAAa,MAAA;AAAA,cACxC,KAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,UAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BAGFA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,MACrB,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,oBAAA;AAAA,cACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,cAC5B,iBAAA,EAAiB,WAAW,OAAA,GAAU,MAAA;AAAA,cACtC,QAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,sHAAA;AAAA,gBACA,6BAAA;AAAA,gBACA,QAAA,IAAY,CAAC,QAAA,IAAY;AAAA,eAC3B;AAAA,cACA,OAAA,EAAS,WAAW,WAAA,GAAc,WAAA;AAAA,cAClC,MAAA,EAAQ,WAAW,UAAA,GAAa,UAAA;AAAA,cAE/B,QAAA,EAAA,QAAA,mBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAY,QAAA,EAAA,WAAA,EAAY,CAAA,mBAExCA,IAAC,MAAA,EAAA,EAAK,kBAAA,EAAgB,IAAA,EAAC,SAAA,EAAU,YAC9B,QAAA,EAAA,WAAA,EACH;AAAA;AAAA,WAEJ,EACF,CAAA;AAAA,UAGC,2BACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,kBAAA;AAAA,cACV,OAAA,EAAS,gBAAA;AAAA,cACT,QAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,0IAAA;AAAA,gBACA,iEAAA;AAAA,gBACA,kBAAA;AAAA,gBAAA,CACC,CAAC,YAAY,QAAA,KAAa;AAAA,eAC7B;AAAA,cACA,YAAA,EAAW,iCAAA;AAAA,cAEX,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,WACxB;AAAA,0BAIFA,GAAAA,CAACkC,UAAA,EAAA,EAAa,aAAA,EAAW,IAAA,EAAC,WAAU,yCAAA,EAA0C;AAAA;AAAA;AAAA,KAChF,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAmCzB,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,aAAK,MAAA,CAAO,SAAA;AAAA,EAC1B,WAAA,GAAc,KAAA;AAAA,EACd,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA;AAAA,EACA,UAAA,GAAa,UAAA;AAAA,EACb;AACF,CAAA,EAAoB;AAElB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUD,iBAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAoBA,oBAAY,MAAM;AAC1C,IAAA,OAAA,GAAU,wBAAW,IAAI,IAAA,IAAQ,EAAC,EAAG,EAAsB,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,WAAA,GAAc,IAAA,GAAOJ,MAAAA,CAAO,IAAA,EAAM,YAAY,CAAA,GAAI,EAAA;AAExD,EAAA,uBACE5B,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA,EAAU,CAAC,CAAC,IAAA;AAAA,QACZ,WAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA,EAAS,UAAU,WAAA,GAAc,MAAA;AAAA,QACjC,WAAW,UAAA,EAAY;AAAA;AAAA,KACzB;AAAA,IACC,8BACCC,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,2BAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,UAAA,EAAY,cAAc,CAAA;AAAA,QACtF,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAD,IAAC4B,YAAAA,EAAA,EAAiB,KAAA,EAAO,YAAA,CAAK,OAAO,QAAA,EAAU,CAAA;AAAA,0BAC/C5B,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACE,GAAG,gBAAA;AAAA,cACJ,aAAA;AAAA,cACA,IAAA;AAAA,cACA;AAAA;AAAA;AACF;AAAA;AAAA,wBAGFA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,2BAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,UAAA,EAAY,cAAc,CAAA;AAAA,QAC/C,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,aAAA;AAAA,YACJ,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,IAAA;AAAA,YACV,QAAA,EAAU,OAAA;AAAA,YACV,YAAA,EAAY;AAAA;AAAA;AACd;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AA8BO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,WAAA,GAAc,aAAK,MAAA,CAAO,SAAA;AAAA,EAC1B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA;AAAA,EACA,UAAA,GAAa,UAAA;AAAA,EACb,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AAEvB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUiC,iBAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAoBA,oBAAY,MAAM;AAC1C,IAAA,OAAA,GAAU,EAAE,IAAA,EAAM,MAAA,EAAW,EAAA,EAAI,MAAA,EAAU,kBAAG,IAAI,IAAA,EAAK,EAAG,EAAC,EAAG,EAAsB,CAAA;AAAA,EACtF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,IAAA,CAAK,IAAA;AACxB,EAAA,MAAM,WAAA,GAAc,KAAK,IAAA,GACrB,IAAA,CAAK,KACH,CAAA,EAAGJ,MAAAA,CAAO,IAAA,CAAK,IAAA,EAAM,YAAY,CAAC,MAAMA,MAAAA,CAAO,IAAA,CAAK,IAAI,YAAY,CAAC,KACrEA,MAAAA,CAAO,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA,GAChC,EAAA;AAEJ,EAAA,uBACE5B,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA,EAAS,UAAU,WAAA,GAAc,MAAA;AAAA,QACjC,WAAW,UAAA,EAAY;AAAA;AAAA,KACzB;AAAA,oBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,YAAA,EAAW,2BAAA,EAAQ,SAAA,EAAU,YAAA,EAAa,KAAA,EAAM,OAAA,EAC9D,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACZ,QAAA,EAAA;AAAA,MAAA,WAAA,oBACCD,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAE,OAAA,EAAS,uDAAA,EAAwD;AAAA,UAC9E,IAAA;AAAA,UACA,OAAA;AAAA,UACA,aAAA,EAAe,KAAA;AAAA,UACf,kBAAA,EAAoB;AAAA;AAAA,OACtB;AAAA,sBAEFA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACE,GAAG,aAAA;AAAA,UACJ,YAAA,EAAY,IAAA;AAAA,UACZ,IAAA,EAAK,OAAA;AAAA,UACL,YAAA,EAAc,IAAA,EAAM,IAAA,IAAQ,aAAA,EAAe,YAAA;AAAA,UAC3C,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,OAAA;AAAA,UACV,cAAA,EAAgB;AAAA;AAAA;AAClB,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACnbA,IAAM,0BAAA,GAA6BsB,GAAAA;AAAA,EACjC;AAAA,IACE,mDAAA;AAAA,IACA,gEAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV;AAAA,IACE,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR,oEAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,UAAA,EAAY,UAAA;AAAA,QACZ,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW;AAAA;AACb;AAEJ,CAAA;AA4BA,IAAM,SAAA,GAAkBa,OAAA,CAAA,UAAA;AAAA,EACtB,CACE;AAAA,IACE,UAAA,GAAa,UAAA;AAAA,IACb,KAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,cAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA,EAAW,aAAA;AAAA,IACX,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,YAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR,GAAG;AAAA,KAEL,YAAA,KACG;AACH,IAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,IAAA,MAAM,SAAA,GAAY,aAAA,IAAiB,WAAA,EAAa,SAAA,IAAa,KAAA;AAC7D,IAAA,MAAM,QAAA,GAAiBA,eAAyB,IAAI,CAAA;AACpD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAGtD,IAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,OAAA,CAAA,QAAA;AAAA,MAC9C,YAAA,KAAiB,MAAA,GAAY,MAAA,CAAO,YAAY,CAAA,GAAI;AAAA,KACtD;AACA,IAAA,MAAM,WAAW,YAAA,GAAe,MAAA,CAAO,SAAS,CAAA,KAAM,KAAK,aAAA,KAAkB,EAAA;AAG7E,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,IAAA,KAAkC;AAChC,QAAC,SAA6D,OAAA,GAAU,IAAA;AACzE,QAAA,IAAI,OAAO,YAAA,KAAiB,UAAA,EAAY,YAAA,CAAa,IAAI,CAAA;AAAA,aAAA,IAChD,YAAA;AACP,UAAC,aAAiE,OAAA,GAAU,IAAA;AAAA,MAChF,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAGA,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB;AAAA,MACnB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAC,QAEhB,CAAC,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,KAAe,MAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,KAAe,MAAA;AAIjD,IAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,WAAA;AAAA,MACzB,CAAC,CAAA,KAA2C;AAC1C,QAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAClD,QAAA,YAAA,GAAe,CAAC,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,cAAc,YAAY;AAAA,KAC7B;AAEA,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,CAAA,KAA0C;AACzC,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,WAAA,GAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,KAA0C;AACzC,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,UAAA,GAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,WAAA,GAAoBA,oBAAY,MAAM;AAC1C,MAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,EAAE,CAAA;AAGtC,MAAA,MAAM,eAAe,MAAA,CAAO,wBAAA,CAAyB,gBAAA,CAAiB,SAAA,EAAW,OAAO,CAAA,EAAG,GAAA;AAC3F,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,IAAA,CAAK,OAAO,EAAE,CAAA;AAC3B,QAAA,KAAA,CAAM,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC3D;AAEA,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,IAAA,uBACElC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,SAAA,EAAW,EAAA;AAAA,UACT,0BAAA,CAA2B,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AAAA,UACpD,gBAAA;AAAA;AAAA,UAEA,aACE,CAAC,SAAA,IACD,UAAA,KAAe,UAAA,IACf,CAAC,kBAAA,IACD,2DAAA;AAAA;AAAA,UAAA,CAED,sBAAsB,aAAA,KAAkB,UAAA;AAAA;AAAA,UAEzC,kBAAA,IAAsB,+BAAA;AAAA;AAAA,UAEtB,WAAW,+BAAA,GAAkC,aAAA;AAAA;AAAA,UAE7C,QAAA,IAAY,eAAe,MAAA,IAAU,yBAAA;AAAA,UACrC,kBAAA;AAAA;AAAA;AAAA;AAAA,UAIA;AAAA,SACF;AAAA,QAGE,QAAA,EAAA;AAAA,UAAA,CAAA,kBAAA,IAAsB,kCACtBD,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,qBAAqB,UAAA,GAAa,MAAA;AAAA,cACxC,KAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,UAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UAID,mCACCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA;AAAA,gBAET,mFAAA;AAAA,gBACA,OAAO,oBAAoB,QAAA,IAAY,+BAAA;AAAA,gBACvC,QAAA,IAAY,CAAC,UAAA,IAAc;AAAA,eAC7B;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BAIFA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,WAAA;AAAA,cACL,QAAA;AAAA,cACA,QAAA;AAAA,cACA,KAAA,EAAO,eAAe,SAAA,GAAY,MAAA;AAAA,cAClC,YAAA,EAAc,CAAC,YAAA,GAAe,YAAA,GAAe,MAAA;AAAA,cAC7C,QAAA,EAAU,YAAA;AAAA,cACV,OAAA,EAAS,WAAA;AAAA,cACT,MAAA,EAAQ,UAAA;AAAA,cACR,iBAAA,EAAiB,WAAW,OAAA,GAAU,MAAA;AAAA,cACtC,eAAA,EAAe,QAAA,IAAY,YAAA,GAAe,IAAA,GAAO,MAAA;AAAA,cACjD,SAAA,EAAW,EAAA;AAAA,gBACT,wDAAA;AAAA,gBACA,qCAAA;AAAA,gBACA,uCAAA;AAAA,gBACA,6BAAA;AAAA,gBACA,mBAAA;AAAA;AAAA,gBAEA,QAAA,IAAY,CAAC,QAAA,IAAY,CAAC,SAAA,IAAa;AAAA,eACzC;AAAA,cACC,GAAG;AAAA;AAAA,WACN;AAAA,UAGC,kCACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,WAAA;AAAA,cACT,SAAA,EAAW,EAAA;AAAA,gBACT,8GAAA;AAAA,gBACA,kBAAA;AAAA,gBAAA,CACC,CAAC,QAAA,IAAY,QAAA,IAAY,QAAA,KAAa;AAAA,eACzC;AAAA,cACA,YAAA,EAAW,iCAAA;AAAA,cACX,QAAA,EAAU,EAAA;AAAA,cAEV,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,WACxB;AAAA,UAID,kCACCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,mFAAA;AAAA,gBACA,OAAO,mBAAmB,QAAA,IAAY;AAAA,eACxC;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;;;ACrSxB,IAAA,aAAA,GAAA;AAAA,EACE,UAAA,EAAc;AAAA,IACZ,cAAA;AAAA,IACA,kCAAA;AAAA,IACA,0BAAA;AAAA,IACA,iCAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA;AAAA,IACA,wCAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAClD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACrD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACtD,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACvD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACtD,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,kCAAA,EAAU;AAAA,IACzC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,kCAAA,EAAU;AAAA,IACxC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACnD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAClD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,kCAAA,EAAU;AAAA,IACvC,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACtD,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,kCAAA,EAAU;AAAA,IACvC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,kCAAA,EAAU;AAAA,IACzC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,kCAAA,EAAU;AAAA,IACvC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACrD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACnD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,kCAAA,EAAU;AAAA,IACxC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACrD,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACnD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,kCAAA,EAAU;AAAA,IACxC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,kCAAA,EAAU;AAAA,IACxC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,kCAAA,EAAU;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACtD,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACvD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACjD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACnD,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACpD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,kCAAA,EAAU;AAAA,IACrD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAChD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,kCAAA,EAAU;AAAA,IAClD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC7C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC3C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC/C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC5C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,kCAAA,EAAU;AAAA,IAC1C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,0BAAA,EAAO;AAAA,IACrC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,0BAAA,EAAO;AAAA,IACrC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,0BAAA,EAAO;AAAA,IACzC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,0BAAA,EAAO;AAAA,IACpC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,0BAAA,EAAO;AAAA,IACzC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAChD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,0BAAA,EAAO;AAAA,IACrC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,0BAAA,EAAO;AAAA,IACtC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,0BAAA,EAAO;AAAA,IACtC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,0BAAA,EAAO;AAAA,IACtC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,0BAAA,EAAO;AAAA,IACrC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC5C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC/C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,0BAAA,EAAO;AAAA,IACxC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,0BAAA,EAAO;AAAA,IACzC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,0BAAA,EAAO;AAAA,IACpD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAClD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC1C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,0BAAA,EAAO;AAAA,IACxC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,0BAAA,EAAO;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,0BAAA,EAAO;AAAA,IACzC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,0BAAA,EAAO;AAAA,IACzC,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC/C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,0BAAA,EAAO;AAAA,IACvC,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC/C,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,0BAAA,EAAO;AAAA,IACrD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,0BAAA,EAAO;AAAA,IACpC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,0BAAA,EAAO;AAAA,IACxC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC1C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC1C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,0BAAA,EAAO;AAAA,IACxC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC5C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,0BAAA,EAAO;AAAA,IACnD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAChD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,0BAAA,EAAO;AAAA,IACvC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC3C,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,0BAAA,EAAO;AAAA,IACpD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC/C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,0BAAA,EAAO;AAAA,IACxC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC7C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAC9C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,0BAAA,EAAO;AAAA,IACvC,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,0BAAA,EAAO;AAAA,IAClD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC7C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACjD,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC1C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAClD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC5C,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACtD,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACvD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACrD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACrD,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACnD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC7C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,iCAAA,EAAS;AAAA,IACzC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC3C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAChD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAChD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC5C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACjD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC/C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC1C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,iCAAA,EAAS;AAAA,IACvC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,iCAAA,EAAS;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC3C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,iCAAA,EAAS;AAAA,IACvC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC/C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC1C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC5C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC7C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC9C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC9C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC/C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC/C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,iCAAA,EAAS;AAAA,IACzC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC1C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,iCAAA,EAAS;AAAA,IACxC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,iCAAA,EAAS;AAAA,IACzC,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACjD,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC1C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,iCAAA,EAAS;AAAA,IACjD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC5C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,iCAAA,EAAS;AAAA,IACvC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,iCAAA,EAAS;AAAA,IAC1C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,cAAA,EAAK;AAAA,IACvC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,cAAA,EAAK;AAAA,IACnC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,cAAA,EAAK;AAAA,IACrC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,cAAA,EAAK;AAAA,IACtC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,cAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,cAAA,EAAK;AAAA,IAC1C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,cAAA,EAAK;AAAA,IACtC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC9C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,cAAA,EAAK;AAAA,IAC1C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,cAAA,EAAK;AAAA,IACtC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,cAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,cAAA,EAAK;AAAA,IAClC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,cAAA,EAAK;AAAA,IACnC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,cAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,cAAA,EAAK;AAAA,IACnC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,cAAA,EAAK;AAAA,IACrC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC9C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,cAAA,EAAK;AAAA,IAC1C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,cAAA,EAAK;AAAA,IAC1C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,cAAA,EAAK;AAAA,IAE9C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,cAAA,EAAK;AAAA,IACtC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC7C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,cAAA,EAAK;AAAA,IACpC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,cAAA,EAAK;AAAA,IACrC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IAEzC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,wCAAA,EAAW;AAAA,IACxC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACnD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACnD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACtD,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,wCAAA,EAAW;AAAA,IACxC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,wCAAA,EAAW;AAAA,IACxC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACxD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACrD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACrD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,wCAAA,EAAW;AAAA,IACxC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACpD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACpD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACvD,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACrD,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACtD,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,wCAAA,EAAW;AAAA,IACxC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,wCAAA,EAAW;AAAA,IACzC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC7C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC/C,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACrD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACnD,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACrD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACnD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACpD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACtD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC1C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,wCAAA,EAAW;AAAA,IAClD,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACjD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,wCAAA,EAAW;AAAA,IACnD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC9C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,wCAAA,EAAW;AAAA,IAChD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,wCAAA,EAAW;AAAA,IAC3C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,cAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,cAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,cAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,cAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC/C,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,cAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,cAAA,EAAK;AAAA,IAC1C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,EAAK;AAAA,IACzC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,cAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,cAAA,EAAK;AAAA,IAClD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,cAAA,EAAK;AAAA,IACxC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC3C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,cAAA,EAAK;AAAA,IACrC,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,cAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,cAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,cAAA,EAAK;AAAA,IAC1C,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,cAAA,EAAK;AAAA,IAC/C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAClD,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnC,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC9C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAChD,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACjD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAClD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAClD,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAChD,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAChD,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACjD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnD,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,KAAA,EAAO,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAClD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC1C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACjD,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAChD,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA,EAAM;AAAA,IACxC,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,cAAA,EAAgB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC5C,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,QAAA,EAAU,QAAA,EAAY,oBAAA,EAAM;AAAA,IACtC,EAAE,IAAA,EAAQ,WAAA,EAAa,QAAA,EAAY,oBAAA,EAAM;AAAA,IACzC,EAAE,IAAA,EAAQ,oBAAA,EAAsB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAClD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,sBAAA,EAAwB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpD,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,qBAAA,EAAuB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACnD,EAAE,IAAA,EAAQ,iBAAA,EAAmB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC/C,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,aAAA,EAAe,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC3C,EAAE,IAAA,EAAQ,mBAAA,EAAqB,QAAA,EAAY,oBAAA,EAAM;AAAA,IACjD,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,OAAA,EAAS,QAAA,EAAY,oBAAA,EAAM;AAAA,IACrC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,MAAA,EAAQ,QAAA,EAAY,oBAAA,EAAM;AAAA,IACpC,EAAE,IAAA,EAAQ,eAAA,EAAiB,QAAA,EAAY,oBAAA,EAAM;AAAA,IAC7C,EAAE,IAAA,EAAQ,SAAA,EAAW,QAAA,EAAY,oBAAA,EAAM;AAAA,IACvC,EAAE,IAAA,EAAQ,UAAA,EAAY,QAAA,EAAY,oBAAA;AAAM;AAE5C,CAAA;ACplBO,SAAS,UAAA,CAAW;AAAA,EACzB,eAAA,GAAkB,CAAA;AAAA,EAClB,WAAA,GAAc,KAAA;AAAA,EACd,YAAA,GAAe,KAAA;AAAA,EACf,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,SAAA,GAAYoC,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIlB,SAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,kBAAkB,mBAAmB,CAAA,GAAIA,SAAiB,aAAA,CAAS,UAAA,CAAW,CAAC,CAAC,CAAA;AAEvF,EAAA,MAAM,CAAC,oBAAoB,CAAA,GAAIA,QAAAA,CAAiB,eAAe,CAAA;AAM/D,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgBkB,QAAAA,CAAS,CAAC,KAAA,KAAkB;AAChD,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,GAAG,GAAG,CAAA;AAEN,IAAA,aAAA,CAAc,UAAU,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAOf,EAAA,MAAM,aAAA,GAAgBV,QAAQ,MAAM;AAClC,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAMW,cAAAA,GAAgB,cAAS,KAAA,CAAM,MAAA;AAAA,QAAO,CAAC,SAC3C,IAAA,CAAK,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa;AAAA,OAC3D;AAGA,MAAA,MAAA,GAAS,QAAA,CAASA,gBAAe,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,KAAS,EAAE,IAAI,CAAA;AAAA,IAC9D,CAAA,MAAA,IAAW,gBAAA,KAAqB,aAAA,CAAS,UAAA,CAAW,CAAC,CAAA,EAAG;AACtD,MAAA,MAAA,GAAS,cAAS,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,gBAAgB,CAAA;AAAA,IAC7E,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,aAAA,CAAS,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAIjC,EAAA,MAAM,iBAAiB,cAAA,CAAe;AAAA,IACpC,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,oBAAoB,CAAA;AAAA,IAC5D,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA;AAAA,IAClC,cAAc,MAAM,EAAA;AAAA;AAAA,IACpB,QAAA,EAAU;AAAA;AAAA,GACX,CAAA;AAED,EAAA,uBACErC,IAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,SAAS,EAAA,EAChC,QAAA,EAAA;AAAA,IAAA,CAAC,gCACAD,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,iCAAA;AAAA,QACX,WAAA,EAAY,+DAAA;AAAA,QACZ,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAqC;AAC9C,UAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAE5B,UAAA,mBAAA,CAAoB,aAAA,CAAS,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,QAC5C;AAAA;AAAA,KACF;AAAA,oBAEFC,IAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,KAAA,EAAM,SAAS,CAAA,EAC7B,QAAA,EAAA;AAAA,MAAA,WAAA,oBACCD,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,QAAA;AAAA,UACV,SAAA,EAAU,iDAAA;AAAA,UACV,OAAA,EAAS,CAAA;AAAA,UAER,QAAA,EAAA,aAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,6BACxBA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAQ,eAAA;AAAA,cACR,SAAA,EAAW,EAAA;AAAA,gBACT,yCAAA;AAAA,gBACA,aAAa,gBAAA,IAAoB;AAAA,eACnC;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,mBAAA,CAAoB,QAAQ,CAAA;AAG5B,gBAAA,IAAI,aAAA,CAAS,UAAA,CAAW,CAAC,CAAA,KAAM,QAAA,EAAU;AACvC,kBAAA,aAAA,CAAc,EAAE,CAAA;AAAA,gBAClB;AAAA,cACF,CAAA;AAAA,cAEC,QAAA,EAAA;AAAA,aAAA;AAAA,YAfI;AAAA,WAiBR;AAAA;AAAA,OACH;AAAA,sBAEFC,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,SAAA,EAAW,EAAA,CAAG,oCAAoC,CAAA,EACpE,QAAA,EAAA;AAAA,QAAA,aAAA,CAAc,MAAA,KAAW,qBACxBA,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,cAAA,EAAe,QAAA;AAAA,YACf,UAAA,EAAW,QAAA;AAAA,YACX,OAAA,EAAS,CAAA;AAAA,YACT,SAAA,EAAU,iDAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAD,IAACU,IAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,iCAAA,EAAkC,CAAA;AAAA,cAC3D,gBAAQ,MAAA,CAAO;AAAA;AAAA;AAAA,SAClB;AAAA,wBAGFV,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,CAAA,EAAG,cAAA,CAAe,YAAA,EAAc,CAAA,EAAA,CAAA;AAAA,cACxC,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU;AAAA,aACZ;AAAA,YAEC,QAAA,EAAA,cAAA,CAAe,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,UAAA,KAAe;AACpD,cAAA,MAAM,UAAA,GAAa,WAAW,KAAA,GAAQ,oBAAA;AACtC,cAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,oBAAA,EAAsB,cAAc,MAAM,CAAA;AACjF,cAAA,MAAM,QAAA,GAAW,aAAA,CAAc,KAAA,CAAM,UAAA,EAAY,QAAQ,CAAA;AAEzD,cAAA,uBACEA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,KAAA,EAAO;AAAA,oBACL,QAAA,EAAU,UAAA;AAAA,oBACV,GAAA,EAAK,CAAA;AAAA,oBACL,IAAA,EAAM,CAAA;AAAA,oBACN,KAAA,EAAO,MAAA;AAAA,oBACP,MAAA,EAAQ,CAAA,EAAG,UAAA,CAAW,IAAI,CAAA,EAAA,CAAA;AAAA,oBAC1B,SAAA,EAAW,CAAA,WAAA,EAAc,UAAA,CAAW,KAAK,CAAA,GAAA;AAAA,mBAC3C;AAAA,kBAEA,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAW,GAAG,kBAAkB,CAAA;AAAA,sBAChC,KAAA,EAAO,EAAE,mBAAA,EAAqB,CAAA,OAAA,EAAU,oBAAoB,CAAA,MAAA,CAAA,EAAS;AAAA,sBAEpE,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,qBACbA,GAAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,CAAA,EAC9B,QAAA,kBAAAC,IAAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wCAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAS,WAAA;AAAA,4BACT,SAAA,EAAW,EAAA;AAAA,8BACT,8DAAA;AAAA,8BACA,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,KAAA,IAAS,mBAAA;AAAA,8BAC7B;AAAA,6BACF;AAAA,4BACA,OAAA,EAAS,MAAM,KAAA,CAAM,aAAA,GAAgB,KAAK,IAAI,CAAA;AAAA,4BAC9C,IAAA,EAAK,QAAA;AAAA,4BACL,cAAY,IAAA,CAAK,IAAA;AAAA,4BACjB,cAAA,EAAc,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,KAAA;AAAA,4BAElC,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,mBAAmB,IAAA,CAAK,IAAA,EAAa,MAAM,EAAA,EAAI;AAAA;AAAA,yBAC7D,EACF,CAAA;AAAA,wCACAA,GAAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK;AAAA,uBAAA,EAC7B,CAAA,EAAA,EAnBsC,IAAA,CAAK,IAoB7C,CACD;AAAA;AAAA;AACH,iBAAA;AAAA,gBArCK,UAAA,CAAW;AAAA,eAsClB;AAAA,YAEJ,CAAC;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC1LA,SAAS,SAAS,EAAE,KAAA,EAAO,OAAO,SAAA,EAAW,GAAG,OAAM,EAAkB;AACtE,EAAA;AAAA;AAAA,oBAEEC,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,8CAAA,EAAgD,SAAS,CAAA,EAAI,GAAG,KAAA,EAEjF,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAC5EA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,8CAAA,EAA+C,CAAA;AAAA,sBAC3EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0EACb,QAAA,EAAA,KAAA,EACH;AAAA,KAAA,EACF;AAAA;AAEJ;AA2BA,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAyC;AAChF,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,kDAAA,EAAoD,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAElG;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiB;AACf,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AACpE,EAAA,MAAM,QAAQ,KAAA,KAAU,OAAA;AACxB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA;AAAA,QAET,6GAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA;AAAA,cAET,kDAAA;AAAA;AAAA,cAEA,QAAQ,yBAAA,GAA4B;AAAA,aACtC;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAC,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,4CAAA;AAAA,cACA,CAAC,QAAA,IAAY,CAAC,KAAA,IAAS;AAAA,aACzB;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,cACA,4BACCD,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA;AAAA,oBAET,oDAAA;AAAA,oBACA,WAAW,sBAAA,GAAyB,kBAAA;AAAA,oBACpC,QAAQ,WAAA,GAAc;AAAA,mBACxB;AAAA,kBAEC,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,cAED;AAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAOA,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA,EAGxB,CAAA,EAAG,2CAAA;AAAA,EACH,CAAA,EAAG,8CAAA;AAAA,EACH,CAAA,EAAG,6DAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AASA,SAAS,SAAS,EAAE,SAAA,EAAW,UAAU,CAAA,EAAG,GAAG,OAAM,EAAkB;AACrE,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,iBAAA,CAAkB,OAAO,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AACzF;AChHA,IAAM,KAAA,GAAQ;AAAA,EACZ,MAAM,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,eAAA,EAAiB,OAAO,cAAA,EAAK;AAAA,EAC3D,SAAS,EAAE,OAAA,EAAS,WAAW,GAAA,EAAK,kBAAA,EAAoB,OAAO,cAAA,EAAK;AAAA,EACpE,SAAS,EAAE,OAAA,EAAS,WAAW,GAAA,EAAK,kBAAA,EAAoB,OAAO,cAAA,EAAK;AAAA,EACpE,OAAO,EAAE,OAAA,EAAS,UAAU,GAAA,EAAK,iBAAA,EAAmB,OAAO,cAAA;AAC7D,CAAA;AASO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,SAAA,GAAY,iEAAA;AAAA,EACZ,WAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA;AACT,IAAA,uBACEA,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,EAAA,CAAG,8DAAA,EAAgE,SAAS,CAAA;AAAA,QAEtF,QAAA,EAAA;AAAA;AAAA,KACH;AAEJ,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA,EAAI,GAAG,KAAA,EACjE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC9B,IAAA,uBACEC,IAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,EAAA;AAAA,UACT,+DAAA;AAAA,UACA,KAAA,CAAM;AAAA,SACR;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,SAAA,EAAU,UAAA,EACtC,QAAA,EAAA,WAAA,GAAc,IAAA,CAAK,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,EACtC,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EAAqD,eAAK,IAAA,EAAK,CAAA;AAAA,0BAC/EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EACb,eAAK,OAAA,EACR;AAAA;AAAA,OAAA;AAAA,MAZK,IAAA,CAAK;AAAA,KAaZ;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACrDO,SAAS,uBAAA,CAAwB;AAAA,EACtC,OAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,IAAA,GAAO,SAAA;AAAA,EACP;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,KAAA,GAAQ,gBAAgB,aAAa,CAAA;AAE3C,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,6BAAA,EAA+B,SAAS,CAAA,EACzD,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2DAAA,EAA6D,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACnFA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,0BAAA;AAAA,QACX,QAAA,EAAU,UAAA;AAAA,QACV,OAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,6GAAA;AAAA,UACA,uDAAA;AAAA,UACA,uEAAA;AAAA,UACA,qEAAA;AAAA,UACA,IAAA,KAAS,YAAY,aAAA,GAAgB;AAAA,SACvC;AAAA,QAEA,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU,IAAA,EAAM,IAAI,SAAA,EAAW,EAAA,CAAG,UAAA,IAAc,cAAc,CAAA,EAAG;AAAA;AAAA;AACpE,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,gBAAgB,aAAA,EAAgD;AACvE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIkB,SAAS,CAAC,CAAA;AAElC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,WAAA,CAAY,MAAM,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA,EAAG,GAAM,CAAA;AAC1E,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAOQ,QAAQ,MAAM;AACnB,IAAA,MAAM,SAAA,GAAY,eAAe,aAAa,CAAA;AAC9C,IAAA,IAAI,CAAC,WAAW,OAAO,iCAAA;AACvB,IAAA,IAAI,KAAK,GAAA,EAAI,GAAI,UAAU,OAAA,EAAQ,GAAI,KAAQ,OAAO,uCAAA;AACtD,IAAA,OAAO,CAAA,EAAG,oBAAoB,SAAA,EAAW,EAAE,WAAW,IAAA,EAAM,MAAA,EAAQG,EAAAA,EAAI,CAAC,CAAA,yBAAA,CAAA;AAAA,EAG3E,CAAA,EAAG,CAAC,aAAA,EAAe,IAAI,CAAC,CAAA;AAC1B;AAEA,SAAS,eAAe,KAAA,EAA6C;AACnE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,OAAO,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AAC3D,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,IAAA;AAChC;;;AC1EO,IAAM,oCAAA,GAAuC,2BAAA;AAapD,IAAM,eAAA,GAAkB,WAAA;AAEjB,SAAS,oBAAoB,KAAA,EAA2B;AAC7D,EAAA,OAAO,KAAA,CACJ,GAAA;AAAA,IAAI,CAAC,GAAA,KACJ,GAAA,CACG,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,IAAI,CAAA,IAAK,EAAA;AACf,MAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,EAAG;AAC3B,QAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA,CACA,IAAA,CAAK,GAAI;AAAA,GACd,CACC,KAAK,IAAI,CAAA;AACd;AAGO,SAAS,SAAS,IAAA,EAA0B;AACjD,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,EAAC;AAE1B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAA;AACvC,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,IAAI,MAAgB,EAAC;AACrB,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,IAAI,GAAA,CAAI,MAAA;AAEd,EAAA,OAAO,IAAI,CAAA,EAAG;AACZ,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,IAAI,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACnC,UAAA,IAAA,IAAQ,GAAA;AACR,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAA,IAAQ,EAAA;AACR,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK;AAGd,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAM;AACf,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,GAAA,GAAM,EAAC;AACP,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAA,IAAQ,EAAA;AACR,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AAEA,EAAA,IAAI,IAAA,KAAS,EAAA,IAAM,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,oBAAA,CAAqB,OAAmB,OAAA,EAA2B;AACjF,EAAA,MAAM,OAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,oCAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAC/B;AAEO,SAAS,eAAe,IAAA,EAA4C;AACzE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IACE,CAAC,MAAA,IACD,OAAO,WAAW,QAAA,IACjB,MAAA,CAA8B,SAAS,oCAAA,EACxC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,IAAK,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG,OAAO,IAAA;AACjE,EAAA,MAAM,OAAA,GAAU,EAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAS,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAA,GAAI,EAAG,CAAA;AAC9F,EAAA,OAAO,EAAE,IAAA,EAAM,oCAAA,EAAsC,OAAA,EAAS,CAAA,EAAG,SAAS,KAAA,EAAM;AAClF;AAQA,eAAsB,qBAAA,CAAsB,KAAa,IAAA,EAAgC;AACvF,EAAA,MAAM,OAAO,SAAA,CAAU,SAAA;AACvB,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,UAAA,IAAc,OAAO,kBAAkB,WAAA,EAAa;AAC5E,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,GAAO,IAAI,aAAA,CAAc;AAAA,QAC7B,YAAA,EAAc,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,QACpD,sBAAA,EAAwB,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,sBAAA,EAAwB;AAAA,OAC1E,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAC,IAAI,CAAC,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,SAAA,KAAc,UAAA,EAAY;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAU,GAAG,CAAA;AACxB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAGA,eAAsB,sBAAA,GAEpB;AACA,EAAA,MAAM,OAAO,SAAA,CAAU,SAAA;AACvB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,sBAAsB,CAAA,EAAG;AAC/C,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,sBAAsB,CAAA;AACtD,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,UAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,UAAA,IAAI,MAAM,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,QACjD;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,EAAG;AACrC,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AAC5C,UAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,UAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAC3B,UAAA,IAAI,MAAM,MAAA,GAAS,CAAA,SAAU,EAAE,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,UAAA,EAAY;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AAEjC,MAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,MAAA,IAAI,MAAM,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAC/C,MAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAC3B,MAAA,IAAI,MAAM,MAAA,GAAS,CAAA,SAAU,EAAE,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;;;AC3MO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,MAAM,MAAM,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,MAAM,MAAM,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,MAAM,MAAM,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,MAAM,MAAM,CAAA;AAC9D,EAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AACpC;AAEO,SAAS,YAAA,CAAa,MAAgB,KAAA,EAA2B;AACtE,EAAA,OACE,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,GAAA,IACrB,MAAM,MAAA,IAAU,IAAA,CAAK,MAAA,IACrB,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,IAAA,IACrB,KAAA,CAAM,UAAU,IAAA,CAAK,KAAA;AAEzB;AAEO,SAAS,WAAA,CAAY,GAAc,CAAA,EAAuB;AAC/D,EAAA,OAAO,EAAE,MAAA,KAAW,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA;AACjD;;;ACPO,IAAM,+BAAA,GAA0D;AAAA,EACrE,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAAA,EAC3B,EAAE,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAQ;AAAA,EAC/B,EAAE,EAAA,EAAI,aAAA,EAAe,MAAA,EAAQ,aAAA;AAC/B;AAMO,IAAM,0BAAA,GAGT;AAAA,EACF,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAQ,EAAA,EAAG;AAAA,EACjC,OAAA,EAAS,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAQ,EAAA;AACjC,CAAA;ACaO,SAAS,iBAAA,CAAkB;AAAA,EAChC,GAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,YAAY,EAAE,EAAA,EAAI,IAAI,EAAA,EAAI,QAAA,EAAU,QAAA,IAAY,aAAA,EAAe,CAAA;AAEnE,EAAA,MAAM,KAAA,GAA6B;AAAA,IACjC,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3C,UAAA;AAAA,IACA,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,IAC5B,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,aAAa,CAAA,GAAI;AAAA,GAC3B;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAA,KAAY,SAAA,GAAY,SAAA,GAAY,QAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,2BAA2B,OAAO,CAAA;AAEpD,EAAA,uBACE7B,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA;AAAA,MACA,YAAA,EAAY,UAAA,GAAa,UAAA,GAAa,aAAA,GAAgB,aAAA,GAAgB,MAAA;AAAA,MACtE,cAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,UAAA,IAAc,8BAA8B,CAAA;AAAA,MAElE,QAAA,EAAA;AAAA,QAAA,UAAA,oBACCD,IAAC,SAAA,EAAA,EAAU,KAAA,EAAM,UAAS,SAAA,EAAU,KAAA,EAAM,OAAO,EAAE,KAAA,EAAO,GAAG,SAAA,CAAU,MAAM,MAAK,EAChF,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,kCAAA;AAAA,YACX,UAAU,aAAA,IAAiB,QAAA;AAAA,YAC3B,GAAA,EAAK,mBAAA;AAAA,YACJ,GAAG,UAAA;AAAA,YACH,GAAG,SAAA;AAAA,YACJ,QAAA,EAAU,aAAA,IAAiB,QAAA,GAAW,EAAA,GAAK,CAAA;AAAA,YAC3C,SAAA,EAAW,EAAA;AAAA,cACT,+EAAA;AAAA,cACA,iIAAA;AAAA,cACA,oCAAA;AAAA,cACA,aAAA,IAAiB;AAAA,aACnB;AAAA,YAEA,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAM,OAAA,KAAY,SAAA,GAAY,KAAK,EAAA,EAAI;AAAA;AAAA,WAEzD,CAAA,EACF,CAAA;AAAA,QAGD,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,EAAK,MAAA,KAAW;AAC5B,UAAA,MAAM,KAAA,GAAmB,EAAE,MAAA,EAAQ,MAAA,EAAO;AAC1C,UAAA,MAAM,UAAA,GACJ,iBAAiB,IAAA,IAAQ,CAAC,aAAa,YAAA,CAAa,aAAA,EAAe,KAAK,CAAA,GAAI,KAAA;AAC9E,UAAA,MAAM,YACJ,WAAA,IAAe,IAAA,IAAQ,YAAY,MAAA,KAAW,MAAA,IAAU,YAAY,MAAA,KAAW,MAAA;AACjF,UAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,IAAK,EAAA;AACxC,UAAA,MAAM,QAAA,GAAW,CAAC,aAAA,IAAiB,OAAA,CAAQ,UAAA,GAAa,IAAI,EAAE,CAAA,GAAI,GAAA,CAAI,EAAE,CAAC,CAAA;AAEzE,UAAA,uBACEA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAW,EAAA;AAAA,gBACT,+CAAA;AAAA,gBACA,QAAA,IAAY,oBAAA;AAAA,gBACZ,UAAA,IAAc,uBAAA;AAAA,gBACd,SAAA,IAAa;AAAA,eACf;AAAA,cACA,KAAA,EACE,GAAA,CAAI,KAAA,GACA,EAAE,OAAO,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,GAAG,GAAA,CAAI,KAAK,CAAA,EAAA,CAAA,GAAO,GAAA,CAAI,OAAM,GACtE,MAAA;AAAA,cAEN,cAAA,EAAc,MAAA;AAAA,cACd,cAAA,EAAc,MAAA;AAAA,cACd,iBAAe,UAAA,IAAc,MAAA;AAAA,cAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,cAC3B,cAAY,QAAA,IAAY,MAAA;AAAA,cACxB,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,gBAAA,IAAI,SAAA,EAAW;AACf,gBAAA,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,cAC1B,CAAA;AAAA,cACA,cAAc,MAAM;AAClB,gBAAA,IAAI,SAAA,EAAW;AACf,gBAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,cACxB,CAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,IAAI,SAAA,EAAW;AACf,gBAAA,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,cACtB,CAAA;AAAA,cACA,eAAe,MAAM;AACnB,gBAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,cACzB,CAAA;AAAA,cAEA,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,oGAAA;AAAA,oBACA,SAAA,IAAa;AAAA,mBACf;AAAA,kBACA,cAAY,GAAA,CAAI,MAAA;AAAA,kBAEf,QAAA,EAAA,SAAA,GACC,gBAAA,CAAiB,SAAS,CAAA,mBAE1BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAGb,QAAA,EAAA,aAAA,GAAiB,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,SAAU,GAAA,EACrD;AAAA;AAAA;AAEJ,aAAA;AAAA,YAjDK,GAAA,CAAI;AAAA,WAkDX;AAAA,QAEJ,CAAC,CAAA;AAAA,wBAEDA,IAAC,SAAA,EAAA,EAAU,KAAA,EAAM,UAAS,SAAA,EAAU,KAAA,EAAM,OAAO,EAAE,KAAA,EAAO,GAAG,SAAA,CAAU,MAAM,MAAK,EAChF,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,eAAA;AAAA,YACR,OAAA,EAAS,cAAA;AAAA,YACT,UAAU,QAAA,IAAY,aAAA;AAAA,YACtB,OAAA,EAAS,QAAA;AAAA,YACT,YAAA,EAAW,qBAAA;AAAA,YACX,QAAA,EAAU,gBAAgB,EAAA,GAAK,CAAA;AAAA,YAC/B,SAAA,EAAW,EAAA;AAAA,cACT,0DAAA;AAAA,cACA,aAAA,IAAiB;AAAA,aACnB;AAAA,YAEA,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,MAAM,OAAA,KAAY,SAAA,GAAY,KAAK,EAAA,EAAI;AAAA;AAAA,WAEnD,CAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACrKA,SAAS,QAAA,GAAmB;AAC1B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AAC5E,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AACA,EAAA,OAAO,SAAS,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AACpF;AAEA,SAAS,UAAA,CAAW,KAAwB,OAAA,EAA0C;AACpF,EAAA,OAAO,OAAA,CAAQ,MAAM,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,CAAA;AACnD;AAEA,SAAS,cAAA,CAAe,SAAiC,EAAA,EAA+B;AACtF,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,GAAI,EAAA;AAC5C,EAAA,OAAO,EAAE,IAAI,MAAA,EAAO;AACtB;AAKA,SAAS,iBAAA,CACP,IAAA,EACA,OAAA,EACA,aAAA,EACqB;AACrB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AACpE,IAAA,OAAO,CAAC,GAAG,IAAA,EAAM,cAAA,CAAe,OAAA,EAAS,aAAa,CAAC,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,EAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,aAAA,EAAe,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,UAAU,IAAA,EAAgD;AACjE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,EAAE,GAAG,GAAA,CAAI,MAAA,IAAS,CAAE,CAAA;AAClE;AASA,SAAS,eAAe,KAAA,EAAqC;AAC3D,EAAA,IAAI,MAAM,OAAA,IAAW,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,QAAQ,OAAO,KAAA;AAC3D,EAAA,IAAI,KAAA,CAAM,WAAA,CAAY,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,SAAA,EAAW,OAAO,KAAA;AACpC,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACnC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAEnC,EAAA,OAAO,IAAA,IAAQ,MAAQ,IAAA,IAAQ,GAAA;AACjC;AA0BA,IAAM,cAAA,GAAuB,OAAA,CAAA,UAAA;AAAA,EAC3B,CACE;AAAA,IACE,KAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,GAAU,+BAAA;AAAA,IACV,UAAA,GAAa,IAAA;AAAA,IACb,OAAA,GAAU,SAAA;AAAA,IACV,OAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,IAAA,MAAM,OAAA,GAAgB,eAA8B,IAAI,CAAA;AACxD,IAAA,MAAM,gBAAA,GAAyB,eAAgC,IAAI,CAAA;AACnE,IAAA,MAAM,UAAA,GAAmB,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,IAAA,KAAgC;AAC/B,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,QAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,aAAA,IAC9B,GAAA,MAAS,OAAA,GAAU,IAAA;AAAA,MAC9B,CAAA;AAAA,MACA,CAAC,GAAG;AAAA,KACN;AACA,IAAA,MAAM,aAAA,GAAsB,oBAAY,MAAM;AAC5C,MAAA,gBAAA,CAAiB,OAAA,EAAS,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IACzD,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,iBAAS,QAAQ,CAAA;AAEjE,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,OAAA,CAAA,QAAA;AAAA,MAA8B,MAC1E,iBAAA,CAAkB,YAAA,IAAgB,EAAC,EAAG,SAAS,aAAa;AAAA,KAC9D;AAEA,IAAA,MAAM,IAAA,GAAa,OAAA,CAAA,OAAA;AAAA,MACjB,MAAM,iBAAA,CAAkB,YAAA,GAAe,KAAA,GAAS,YAAA,EAAc,SAAS,aAAa,CAAA;AAAA,MACpF,CAAC,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,SAAS,aAAa;AAAA,KAC5D;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAiB,OAAA,CAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAmB,OAAA,CAAA,OAAA,CAAQ,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE5E,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,OAAA,CAAA,QAAA,CAAgC,EAAE,CAAA;AAC5E,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,OAAA,CAAA,QAAA,CAAgC,EAAE,CAAA;AAK1E,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,iBAA2B,IAAI,CAAA;AAEvE,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,iBAA2B,IAAI,CAAA;AAEnE,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,iBAAiB,EAAE,CAAA;AAE7D,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,iBAA8B,IAAI,CAAA;AAEhF,IAAA,MAAM,YAAA,GAAqB,eAAO,KAAK,CAAA;AAEvC,IAAA,MAAM,WAAA,GAAoB,eAAO,KAAK,CAAA;AAEtC,IAAA,MAAM,gBAAA,GAAyB,eAA6B,IAAI,CAAA;AAEhE,IAAA,MAAM,UAAA,GAAmB,eAAyB,IAAI,CAAA;AAGtD,IAAA,MAAM,iBAAA,GAA0B,eAAO,KAAK,CAAA;AAG5C,IAAM,kBAAU,MAAM;AACpB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AAAA,MACxB,CAAA;AACA,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACvC,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAI,CAAA;AAAA,IACzD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAMb,IAAM,wBAAgB,MAAM;AAC1B,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,SAAA,CAAU,KAAA;AACrC,MAAA,MAAM,OAAO,IAAA,CAAK,aAAA;AAAA,QAChB,CAAA,eAAA,EAAkB,MAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,EAAA;AAAA,OACpD;AACA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,KAAK,qBAAA,EAAsB;AACtC,MAAA,MAAM,EAAA,GAAK,KAAK,qBAAA,EAAsB;AACtC,MAAA,eAAA,CAAgB;AAAA,QACd,IAAA,EAAM,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,IAAA;AAAA,QACnB,GAAA,EAAK,EAAA,CAAG,GAAA,GAAM,EAAA,CAAG,GAAA;AAAA,QACjB,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,QAAQ,EAAA,CAAG;AAAA,OACZ,CAAA;AAAA,IACH,CAAA,EAAG,CAAC,SAAA,EAAW,IAAA,EAAM,OAAO,CAAC,CAAA;AAI7B,IAAM,wBAAgB,MAAM;AAC1B,MAAA,IAAI,WAAW,IAAA,EAAM;AACrB,MAAA,MAAM,SAAS,gBAAA,CAAiB,OAAA;AAChC,MAAA,IAAI,UAAU,IAAA,EAAM;AACpB,MAAA,MAAM,QAAQ,gBAAA,CAAiB,OAAA;AAC/B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AACnC,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,KAAA,CAAM,MAAA,EAAO;AAAA,MACf,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA;AACxB,QAAA,KAAA,CAAM,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,MAClC;AACA,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,IAC7B,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAIxB,IAAA,MAAM,cAAA,GAAuB,oBAAY,MAAM;AAC7C,MAAA,MAAM,QAAA,GAAW,UAAU,QAAQ,CAAA;AACnC,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,GAAoC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvF,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,MAAM,IAAA,GAAa,OAAA,CAAA,WAAA;AAAA,MACjB,CAAC,IAAA,KAA8B;AAC7B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,aAAA,IAAiB,CAAC,UAAA,CAAW,CAAA,EAAG,OAAO,CAAC,CAAA;AACjF,QAAA,MAAM,GAAA,GAAM,MAAA,GAAS,QAAA,EAAS,GAAI,aAAA;AAClC,QAAA,IAAI,MAAA,mBAAyB,GAAG,CAAA;AAChC,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,EAAM,OAAA,EAAS,GAAG,CAAA;AACvD,QAAA,IAAI,CAAC,YAAA,EAAc,eAAA,CAAgB,UAAU,CAAA;AAC7C,QAAA,QAAA,GAAW,UAAU,CAAA;AAAA,MACvB,CAAA;AAAA,MACA,CAAC,YAAA,EAAc,QAAA,EAAU,aAAA,EAAe,OAAO;AAAA,KACjD;AAEA,IAAA,MAAM,YAAA,GAAqB,OAAA,CAAA,WAAA;AAAA,MACzB,CAAC,YAAA,KAAsC;AACrC,QAAA,IAAA,CAAK,CAAC,GAAG,YAAA,EAAc,cAAc,CAAC,CAAA;AAAA,MACxC,CAAA;AAAA,MACA,CAAC,MAAM,cAAc;AAAA,KACvB;AAEA,IAAA,MAAM,oBAAA,GAA6B,oBAAY,MAAM;AACnD,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAC7C,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,YAAA,GAAe,UAAU,IAAI,CAAA;AACnC,MAAA,MAAM,eAAA,GAAkB,UAAU,QAAQ,CAAA;AAC1C,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACzC,MAAA,YAAA,CAAa,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,GAAoC,CAAA,EAAG,eAAe,CAAC,CAAA;AAC7F,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,UAAU,CAAC,CAAA;AAEvC,IAAA,MAAM,oBAAA,GAA6B,oBAAY,MAAM;AACnD,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC3C,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,YAAA,GAAe,UAAU,IAAI,CAAA;AACnC,MAAA,MAAM,eAAA,GAAkB,UAAU,QAAQ,CAAA;AAC1C,MAAA,YAAA,CAAa,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AAAA,QACtB,GAAG,IAAA,CAAK,KAAA,CAAM,GAAoC,CAAA;AAAA,QAClD;AAAA,OACD,CAAA;AACD,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,SAAS,CAAC,CAAA;AAEtC,IAAA,MAAM,YAAA,GAAqB,OAAA,CAAA,WAAA;AAAA,MACzB,CAAC,KAAA,KAAkB;AACjB,QAAA,IAAI,CAAC,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,CAAA,EAAG;AAC3C,QAAA,cAAA,EAAe;AACf,QAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9C,QAAA,IAAA,CAAK,IAAI,CAAA;AACT,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,aAAA,CAAc,EAAE,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,IAAI;AAAA,KACvC;AAIA,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA;AACvB,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAE1B,IAAA,MAAM,UAAA,GAAmB,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,MAA6B;AAAA,QAC5B,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,QACrD,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,CAAE,MAAM,CAAC;AAAA,OACvD,CAAA;AAAA,MACA,CAAC,WAAW,SAAS;AAAA,KACvB;AAEA,IAAA,MAAM,YAAA,GAAqB,OAAA,CAAA,WAAA;AAAA,MACzB,CAAC,MAAA,EAAgB,KAAA,EAAe,GAAA,KAAgB;AAC9C,QAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,CAAA,EAAG,CAAA,KACxB,MAAM,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,EAAE,GAAG,EAAE,MAAA,EAAQ,CAAC,KAAK,GAAG,GAAA,IAAM,GAAI;AAAA,SACnE;AACA,QAAA,IAAA,CAAK,IAAI,CAAA;AAAA,MACX,CAAA;AAAA,MACA,CAAC,MAAM,IAAI;AAAA,KACb;AAEA,IAAA,MAAM,UAAA,GAAmB,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,KAAA,KAAqB;AACpB,QAAA,MAAM,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,QAAA,cAAA,EAAe;AACf,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,IAAA,KAAS;AACnC,UAAA,IAAI,OAAO,IAAA,CAAK,GAAA,IAAO,IAAA,GAAO,IAAA,CAAK,QAAQ,OAAO,GAAA;AAClD,UAAA,IAAI,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,GAAA;AACrC,UAAA,MAAM,UAAA,GAAa,EAAE,GAAG,GAAA,CAAI,MAAA,EAAO;AACnC,UAAA,KAAA,IAAS,IAAI,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK;AAC5C,YAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,YAAA,IAAI,GAAA,EAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,GAAI,EAAA;AAAA,UAChC;AACA,UAAA,OAAO,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAW;AAAA,QACtC,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,IAAI,CAAA;AAAA,MACX,CAAA;AAAA,MACA,CAAC,OAAA,EAAS,IAAA,EAAM,cAAA,EAAgB,IAAI;AAAA,KACtC;AAEA,IAAA,MAAM,aAAA,GAAsB,OAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,KAAA,KAA8D;AAC7D,QAAA,MAAM,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,QAAA,MAAM,SAAmB,EAAC;AAC1B,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK;AAC5C,UAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,MAAM,EAAE,CAAA;AAAA,QAClC;AACA,QAAA,MAAM,QAAoB,EAAC;AAC3B,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,GAAA,EAAK,CAAA,IAAK,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC5C,UAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,UAAA,MAAM,UAAoB,EAAC;AAC3B,UAAA,KAAA,IAAS,IAAI,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK;AAC5C,YAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,YAAA,OAAA,CAAQ,IAAA,CAAK,MAAO,GAAA,EAAK,MAAA,GAAS,IAAI,EAAE,CAAA,IAAK,KAAM,EAAE,CAAA;AAAA,UACvD;AACA,UAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,QACpB;AACA,QAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,SAAS,IAAI;AAAA,KAChB;AAKA,IAAA,MAAM,SAAA,GAAkB,OAAA,CAAA,WAAA;AAAA,MACtB,CAAC,KAAA,EAAkB,OAAA,EAAiB,MAAA,KAA0B;AAC5D,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC5C,QAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAAA,MAC7B,CAAA;AAAA,MACA;AAAC,KACH;AAGA,IAAA,MAAM,UAAA,GAAmB,OAAA,CAAA,WAAA;AAAA,MACvB,CACE,KAAA,EACA,GAAA,EACA,QAAA,GAAsD,MAAA,KACnD;AACH,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAChC,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAM,eAAe,OAAO,GAAA,KAAQ,QAAA,GAAY,gBAAA,CAAiB,GAAG,CAAA,GAAe,GAAA;AACnF,QAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,MAAM,GAAG,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,IAAK,EAAA;AACxD,QAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,UAAA,cAAA,EAAe;AACf,UAAA,YAAA,CAAa,KAAA,CAAM,MAAA,EAAQ,GAAA,CAAI,EAAA,EAAI,YAAY,CAAA;AAAA,QACjD;AACA,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,UAAA,SAAA,GAAY,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,QAC3E,CAAA,MAAA,IAAW,aAAa,IAAA,EAAM;AAC5B,UAAA,SAAA,GAAY,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,QAC3E,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,UAAA,SAAA,GAAY,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA;AAAA,QAC3E,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,UAAA,SAAA,GAAY,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA;AAAA,QAC3E;AACA,QAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,WAAW,CAAA;AAAA,MACtD,CAAA;AAAA,MACA,CAAC,UAAA,EAAY,OAAA,EAAS,cAAA,EAAgB,MAAM,YAAY;AAAA,KAC1D;AAEA,IAAA,MAAM,UAAA,GAAmB,oBAAY,MAAM;AACzC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA,EAAG,EAAE,CAAA;AAIL,IAAA,MAAM,mBAAA,GAA4B,OAAA,CAAA,WAAA;AAAA,MAChC,CAAC,OAAkB,KAAA,KAA4B;AAC7C,QAAA,IAAI,QAAA,EAAU;AAEd,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAClC,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,MAAM,eACJ,OAAO,UAAA,KAAe,QAAA,GAAY,gBAAA,CAAiB,UAAU,CAAA,GAAe,UAAA;AAC9E,YAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,MAAM,GAAG,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,IAAK,EAAA;AAC1D,YAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,cAAA,cAAA,EAAe;AACf,cAAA,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,EAAA,EAAI,YAAY,CAAA;AAAA,YACnD;AAAA,UACF;AACA,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,aAAA,CAAc,EAAE,CAAA;AAAA,QAClB;AAEA,QAAA,UAAA,CAAW,OAAA,GACT,SAAA,IAAa,WAAA,CAAY,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA,IAAK,WAAA,CAAY,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA,GACnF,KAAA,GACA,IAAA;AACN,QAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAC5B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,EAAc;AACd,QAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC5C,QAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAAA,MACxB,CAAA;AAAA,MACA;AAAA,QACE,OAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA,cAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,oBAAA,GAA6B,OAAA,CAAA,WAAA;AAAA,MACjC,CAAC,KAAA,KAAqB;AACpB,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,YAAA,CAAa,CAAC,IAAA,KAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM,GAAI,IAAK,CAAA;AAAA,MAC9E,CAAA;AAAA,MACA,CAAC,UAAU,OAAO;AAAA,KACpB;AAEA,IAAA,MAAM,qBAAA,GAA8B,OAAA,CAAA,WAAA;AAAA,MAClC,CAAC,KAAA,KAAqB;AACpB,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAChC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC7B,QAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,EAAK;AAClB,QAAA,SAAA,CAAU,OAAO,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA,IAAK,IAAI,KAAK,CAAA;AAChD,QAAA,aAAA,EAAc;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,eAAe,IAAI;AAAA,KACpD;AAIA,IAAA,MAAM,eAAA,GAAwB,OAAA,CAAA,WAAA;AAAA,MAC5B,CAAC,OAAkB,KAAA,KAA4B;AAC7C,QAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACtB,QAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,CAAY,OAAA,EAAS,KAAK,CAAA,EAAG;AAC9C,QAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B,CAAA;AAAA,MACA,CAAC,qBAAqB;AAAA,KACxB;AAIA,IAAA,MAAM,aAAA,GAAsB,oBAAY,YAA8B;AACpE,MAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,cAAc,SAAS,CAAA;AACjD,MAAA,MAAM,GAAA,GAAM,oBAAoB,KAAK,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,KAAA,EAAO,MAAM,CAAA;AAC/C,MAAA,OAAO,qBAAA,CAAsB,KAAK,IAAI,CAAA;AAAA,IACxC,CAAA,EAAG,CAAC,aAAA,EAAe,SAAS,CAAC,CAAA;AAE7B,IAAA,MAAM,YAAA,GAAqB,oBAAY,YAAY;AACjD,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,MAAM,QAAA,GAAW,MAAM,aAAA,EAAc;AACrC,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,UAAA,CAAW,SAAS,CAAA;AAAA,IACtB,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,SAAS,CAAC,CAAA;AAEzC,IAAA,MAAM,gBAAA,GAAyB,oBAAY,YAAY;AACrD,MAAA,IAAI,QAAA,IAAY,CAAC,SAAA,EAAW;AAC5B,MAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,EAAuB;AAC5C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAA,GAAO,eAAe,SAAS,CAAA;AACrC,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AACtB,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AAEtB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,KAAS,SAAS,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAA,CAAO,KAAA;AACrE,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,MAAA,cAAA,EAAe;AAEf,MAAA,MAAM,gBAAA,GAAmB,WAAW,KAAA,CAAM,MAAA;AAC1C,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,QAAQ,CAAA;AACjC,MAAA,OAAO,YAAA,CAAa,SAAS,gBAAA,EAAkB;AAC7C,QAAA,YAAA,CAAa,IAAA,CAAK,EAAE,EAAA,EAAI,QAAA,IAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,MAClD;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,eAAe,QAAA,GAAW,CAAA;AAChC,QAAA,MAAM,SAAA,GAAY,aAAa,YAAY,CAAA;AAC3C,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,MAAM,UAAA,GAAa,EAAE,GAAG,SAAA,CAAU,MAAA,EAAO;AACzC,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,IAAK,EAAC;AAC5B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,UAAA,MAAM,eAAe,QAAA,GAAW,CAAA;AAChC,UAAA,MAAM,SAAA,GAAY,QAAQ,YAAY,CAAA;AACtC,UAAA,IAAI,CAAC,SAAA,EAAW;AAChB,UAAA,UAAA,CAAW,SAAA,CAAU,EAAE,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAAA,QAC1C;AACA,QAAA,YAAA,CAAa,YAAY,CAAA,GAAI,EAAE,GAAG,SAAA,EAAW,QAAQ,UAAA,EAAW;AAAA,MAClE;AAEA,MAAA,YAAA,CAAa,YAAY,CAAA;AAEzB,MAAA,MAAM,MAAA,GAAS,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,CAAA;AACzC,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AACrE,MAAA,MAAM,MAAA,GAAS,WAAW,aAAA,GAAgB,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAsB;AAAA,QAC1B,MAAA,EAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,QAC7C,OAAO,UAAA,CAAW,EAAE,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ;AAAA,OACtD;AACA,MAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,EAAS,UAAU,YAAA,EAAc,cAAA,EAAgB,QAAA,EAAU,SAAS,CAAC,CAAA;AAIrF,IAAA,MAAM,sBAAA,GAA+B,oBAAY,MAAM;AACrD,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAMvB,MAAA,IAAI,CAAC,OAAA,IAAW,SAAA,IAAa,CAAC,QAAA,EAAU;AACtC,QAAA,UAAA,CAAW,UAAU,KAAK,CAAA;AAC1B,QAAA,aAAA,CAAc,EAAE,CAAA;AAAA,MAClB;AAAA,IACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,CAAC,CAAA;AAEjC,IAAA,MAAM,oBAAA,GAA6B,oBAAY,MAAM;AACnD,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AAAA,IAGzB,CAAA,EAAG,EAAE,CAAA;AAWL,IAAA,MAAM,UAAA,GAAmB,eAAO,OAAO,CAAA;AACvC,IAAA,MAAM,aAAA,GAAsB,eAAO,UAAU,CAAA;AAC7C,IAAM,kBAAU,MAAM;AACpB,MAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,MAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAAA,IAC1B,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,IAAM,kBAAU,MAAM;AACpB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAsB;AACrC,QAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,QAAA,IAAI,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAErC,QAAA,MAAM,iBAAiB,UAAA,CAAW,OAAA;AAClC,QAAA,MAAM,oBAAoB,aAAA,CAAc,OAAA;AACxC,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA;AACzC,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,MAAM,eACJ,OAAO,iBAAA,KAAsB,QAAA,GACxB,gBAAA,CAAiB,iBAAiB,CAAA,GACnC,iBAAA;AACN,YAAA,MAAM,OAAA,GAAU,KAAK,cAAA,CAAe,MAAM,GAAG,MAAA,GAAS,GAAA,CAAI,EAAE,CAAA,IAAK,EAAA;AACjE,YAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,cAAA,cAAA,EAAe;AACf,cAAA,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,GAAA,CAAI,EAAA,EAAI,YAAY,CAAA;AAAA,YAC1D;AAAA,UACF;AACA,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,aAAA,CAAc,EAAE,CAAA;AAAA,QAClB;AACA,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA;AACA,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,OAAA,EAAS,IAAI,CAAA;AACtD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,SAAS,IAAI,CAAA;AAAA,IACxE,GAAG,CAAC,OAAA,EAAS,UAAU,cAAA,EAAgB,IAAA,EAAM,YAAY,CAAC,CAAA;AAI1D,IAAA,MAAM,aAAA,GAAsB,OAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,KAAA,KAAiD;AAChD,QAAA,IAAI,QAAA,EAAU;AAEd,QAAA,IAAI,KAAA,CAAM,WAAA,CAAY,WAAA,IAAe,YAAA,CAAa,OAAA,EAAS;AAE3D,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA;AACrC,QAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAGlB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,IAAI,QAAQ,OAAA,IAAW,CAAC,KAAA,IAAS,CAAC,MAAM,MAAA,EAAQ;AAC9C,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,KAAA,CAAM,QAAA,GAAW,OAAO,MAAM,CAAA;AAC9D,YAAA;AAAA,UACF;AACA,UAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,KAAA,CAAM,QAAA,GAAW,SAAS,OAAO,CAAA;AACjE,YAAA;AAAA,UACF;AACA,UAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,EAAW;AACX,YAAA;AAAA,UACF;AACA,UAAA,IAAI,QAAQ,WAAA,IAAe,CAAC,KAAA,IAAS,CAAC,MAAM,MAAA,EAAQ;AAClD,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,MAAM,CAAA;AACtC,YAAA;AAAA,UACF;AACA,UAAA,IAAI,QAAQ,SAAA,IAAa,CAAC,KAAA,IAAS,CAAC,MAAM,MAAA,EAAQ;AAChD,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,IAAI,CAAA;AACpC,YAAA;AAAA,UACF;AACA,UAAA,MAAM,QAAQ,gBAAA,CAAiB,OAAA;AAC/B,UAAA,IACE,GAAA,KAAQ,WAAA,IACR,CAAC,KAAA,IACD,CAAC,KAAA,CAAM,MAAA,IACP,KAAA,IACA,KAAA,CAAM,cAAA,KAAmB,CAAA,IACzB,KAAA,CAAM,iBAAiB,CAAA,EACvB;AACA,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,MAAM,CAAA;AACtC,YAAA;AAAA,UACF;AACA,UAAA,IACE,QAAQ,YAAA,IACR,CAAC,KAAA,IACD,CAAC,MAAM,MAAA,IACP,KAAA,IACA,KAAA,CAAM,cAAA,KAAmB,MAAM,KAAA,CAAM,MAAA,IACrC,MAAM,YAAA,KAAiB,KAAA,CAAM,MAAM,MAAA,EACnC;AACA,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,UAAA,CAAW,OAAA,EAAS,YAAY,OAAO,CAAA;AACvC,YAAA;AAAA,UACF;AAEA,UAAA;AAAA,QACF;AAKA,QAAA,IAAI,SAAS,GAAA,CAAI,WAAA,OAAkB,GAAA,IAAO,CAAC,MAAM,MAAA,EAAQ;AACvD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAI,KAAA,CAAM,UAAU,oBAAA,EAAqB;AAAA,eACpC,oBAAA,EAAqB;AAC1B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,SAAS,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,MAAM,QAAA,EAAU;AAC7C,UAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,KAAK,aAAA,EAAc;AACnB,YAAA;AAAA,UACF;AACA,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,KAAK,YAAA,EAAa;AAClB,YAAA;AAAA,UACF;AACA,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,KAAK,gBAAA,EAAiB;AACtB,YAAA;AAAA,UACF;AACA,UAAA,IAAI,MAAM,GAAA,EAAK;AACb,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AACnD,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,CAAC,CAAA;AACzC,YAAA,YAAA,CAAa;AAAA,cACX,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,cAC/B,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,QAAQ,OAAA;AAAQ,aAC/C,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AAGxB,QAAA,IAAA,CAAK,GAAA,KAAQ,eAAe,GAAA,KAAQ,QAAA,KAAa,CAAC,KAAA,IAAS,CAAC,MAAM,MAAA,EAAQ;AACxE,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,UAAA,CAAW,SAAS,CAAA;AACpB,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAS,GAAA,KAAQ,OAAA,IAAW,CAAC,KAAA,CAAM,QAAA,IAAY,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,MAAA,EAAS;AACnF,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC7B,UAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,EAAK;AAClB,UAAA,SAAA,CAAU,OAAO,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA,IAAK,IAAI,KAAK,CAAA;AAChD,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,KAAQ,WAAW,KAAA,CAAM,QAAA,IAAY,CAAC,KAAA,IAAS,CAAC,MAAM,MAAA,EAAQ;AAChE,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,IAAA,GAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC1E,UAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC1C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,KAAA,EAAO;AACnC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AACnD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,CAAC,CAAA;AACzC,UAAA,IAAI,SAAA;AACJ,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,SAAA,GACE,GAAA,KAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,GAAI,EAAE,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAQ;AAAA,UACvF,CAAA,MAAO;AACL,YAAA,SAAA,GAAY;AAAA,cACV,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,MAAA,EAAQ,GAAA,KAAQ,MAAA,GAAS,CAAA,GAAI;AAAA,aAC/B;AAAA,UACF;AACA,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,UAC7D,CAAA,MAAO;AACL,YAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,WAAW,CAAA;AAAA,UACtD;AACA,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,UAAA,GAA+C;AAAA,UACnD,OAAA,EAAS,CAAC,EAAA,EAAI,CAAC,CAAA;AAAA,UACf,SAAA,EAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,UAChB,SAAA,EAAW,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,UACjB,UAAA,EAAY,CAAC,CAAA,EAAG,CAAC;AAAA,SACnB;AACA,QAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,WAAW,GAAG,CAAA;AAC/B,UAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AACnD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,CAAC,CAAA;AACzC,UAAA,IAAI,IAAA;AACJ,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,IAAA,GAAO;AAAA,cACL,QAAQ,EAAA,KAAO,CAAA,GAAI,MAAM,MAAA,GAAS,EAAA,GAAK,IAAI,CAAA,GAAI,WAAA;AAAA,cAC/C,QAAQ,EAAA,KAAO,CAAA,GAAI,MAAM,MAAA,GAAS,EAAA,GAAK,IAAI,CAAA,GAAI;AAAA,aACjD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,GAAO,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,IAAI,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,EAAA,EAAI,CAAA;AAAA,UAC5E;AACA,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,UACxD,CAAA,MAAO;AACL,YAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,UAC5C;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,GAAW,EAAA,GAAK,CAAA;AACjC,UAAA,IAAI,OAAA,GAAU,MAAM,MAAA,GAAS,EAAA;AAC7B,UAAA,IAAI,UAAU,KAAA,CAAM,MAAA;AACpB,UAAA,IAAI,WAAW,SAAA,EAAW;AACxB,YAAA,OAAA,GAAU,CAAA;AACV,YAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,UAC/C,CAAA,MAAA,IAAW,UAAU,CAAA,EAAG;AACtB,YAAA,OAAA,GAAU,SAAA,GAAY,CAAA;AACtB,YAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AAAA,UACnC;AACA,UAAA,MAAM,IAAA,GAAkB,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAC3D,UAAA,YAAA,CAAa,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC1C,UAAA;AAAA,QACF;AAKA,QAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,SAAA,CAAU,KAAA,EAAO,KAAK,KAAK,CAAA;AAC3B,UAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,UAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,oBAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA;AACF,KACF;AAGA,IAAA,MAAM,OAAA,GAAU,UAAA;AAAA,MACd,SAAA,CAAU,eAAe,EAAE,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAA,IAAK,CAAA;AAAA,MAClE,SAAA,CAAU,cAAA,EAAgB,EAAE,gBAAA,EAAkB,6BAA6B;AAAA,KAC7E;AAEA,IAAA,MAAM,aAAA,GAAsB,OAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,KAAA,KAAwB;AACvB,QAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,QAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,EAAA,KAAO,KAAK,EAAA,EAAI;AACpC,QAAA,MAAM,QAAA,GAAW,SAAS,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,EAAE,CAAA;AAC7D,QAAA,MAAM,QAAA,GAAW,SAAS,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AAC3D,QAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,EAAA,EAAI;AACxC,QAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAC5D,QAAA,cAAA,EAAe;AACf,QAAA,IAAA,CAAK,CAAC,GAAG,aAAA,EAAe,cAAc,CAAC,CAAA;AACvC,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,aAAA,CAAc,EAAE,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,cAAA,EAAgB,cAAA,EAAgB,IAAI;AAAA,KACjD;AAGA,IAAA,MAAM,SAAA,GAAY,2BAA2B,OAAO,CAAA;AACpD,IAAA,MAAM,aAAA,GAAgB,SAAA,GAAY,cAAA,CAAe,SAAS,CAAA,GAAI,IAAA;AAE9D,IAAA,MAAM,qBAA0C,YAAA,GAC5C;AAAA,MACE,IAAA,EAAM,CAAA,EAAG,YAAA,CAAa,IAAI,CAAA,EAAA,CAAA;AAAA,MAC1B,GAAA,EAAK,CAAA,EAAG,YAAA,CAAa,GAAG,CAAA,EAAA,CAAA;AAAA,MACxB,KAAA,EAAO,CAAA,EAAG,YAAA,CAAa,KAAK,CAAA,EAAA,CAAA;AAAA,MAC5B,MAAA,EAAQ,CAAA,EAAG,YAAA,CAAa,MAAM,CAAA,EAAA;AAAA,KAChC,GACA;AAAA;AAAA,MAEE,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,SAAA;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAEJ,IAAA,uBACEC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,+CAAA;AAAA,UACA,wBAAwB,OAAO,CAAA,CAAA;AAAA,UAC/B,QAAA,IAAY,8DAAA;AAAA,UACZ;AAAA,SACF;AAAA,QACA,iBAAe,QAAA,IAAY,MAAA;AAAA,QAE3B,iBAAe,QAAA,IAAY,MAAA;AAAA,QAE1B,QAAA,EAAA;AAAA,UAAA,OAAA,oBAAWD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAgD,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BACnFC,IAAAA,CAAC,UAAA,EAAA,EAAW,SAAkB,kBAAA,EAAoB,aAAA,EAAe,WAAW,aAAA,EAO1E,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,oCAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EACX,QAAA,kBAAAC,KAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,gBAAA,UAAA,oBACCD,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAM,QAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,MAAM,CAAA,EAAA,CAAA,IAE3D,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,SAAA,EAAU,uCAAK,CAAA,EACjC,CAAA;AAAA,gBAED,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,qBACZC,IAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBAEC,KAAA,EAAM,MAAA;AAAA,oBACN,KAAA,EACE,GAAA,CAAI,KAAA,GACA,EAAE,OAAO,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GAAW,GAAG,GAAA,CAAI,KAAK,CAAA,EAAA,CAAA,GAAO,GAAA,CAAI,OAAM,GACtE,MAAA;AAAA,oBAGL,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAI,MAAA;AAAA,sBACJ,IAAI,QAAA,oBACHD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA2C,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA,mBAAA;AAAA,kBAVzD,GAAA,CAAI;AAAA,iBAaZ,CAAA;AAAA,gCACDA,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAM,QAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,MAAM,CAAA,EAAA,CAAA,IAC3D,QAAA,kBAAAA,GAAAA,CAAC,UAAK,SAAA,EAAU,SAAA,EAAU,0BAAE,CAAA,EAC9B;AAAA,eAAA,EACF,CAAA,EACF,CAAA;AAAA,8BACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EACT,0BAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,UAAA,EAAY,UAAU,2BAAA,EAC3C,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,MAAA,KAAW;AACzB,gBAAA,MAAM,aAAA,GAAgB,MAAA,KAAW,IAAA,CAAK,MAAA,GAAS,CAAA;AAC/C,gBAAA,uBACEA,GAAAA;AAAA,kBAAC,iBAAA;AAAA,kBAAA;AAAA,oBAEC,GAAA;AAAA,oBACA,MAAA;AAAA,oBACA,OAAA;AAAA,oBACA,OAAA;AAAA,oBACA,UAAA;AAAA,oBACA,QAAA;AAAA,oBACA,aAAA;AAAA,oBACA,aAAA;AAAA,oBACA,WAAA,EAAa,OAAA;AAAA,oBACb,UAAA;AAAA,oBACA,eAAA,EAAiB,mBAAA;AAAA,oBACjB,gBAAA,EAAkB,oBAAA;AAAA,oBAClB,WAAA,EAAa,eAAA;AAAA,oBACb,iBAAA,EAAmB,qBAAA;AAAA,oBACnB,QAAA,EAAU,MAAM,YAAA,CAAa,GAAA,CAAI,EAAE;AAAA,mBAAA;AAAA,kBAf9B,GAAA,CAAI;AAAA,iBAgBX;AAAA,cAEJ,CAAC,GACH,CAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAOAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,gBAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,SAAA,EAAW,EAAA;AAAA,kBACT,wCAAA;AAAA,kBACA,OAAA,IAAW;AAAA,iBACb;AAAA,gBACA,KAAA,EAAO,kBAAA;AAAA,gBACP,KAAA,EAAO,UAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC7C,WAAA,EAAa,CAAC,KAAA,KAAU;AAGtB,kBAAA,IAAI,kBAAkB,OAAA,IAAW,KAAA,CAAM,MAAA,GAAS,CAAA,QAAS,cAAA,EAAe;AACxE,kBAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAAA,gBAC9B,CAAA;AAAA,gBACA,SAAA,EAAW,aAAA;AAAA,gBACX,kBAAA,EAAoB,sBAAA;AAAA,gBACpB,gBAAA,EAAkB,oBAAA;AAAA,gBAClB,YAAA,EACE,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAC7B,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,GACxB,6BAAA;AAAA,gBAEN,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,gBAC1B,QAAA;AAAA,gBACA,YAAA,EAAa,KAAA;AAAA,gBACb,UAAA,EAAY;AAAA;AAAA;AACd,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;ACxhC7B,IAAM,iBAAA,GAAoB;AAAA,EACxB,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAiBA,IAAM,QAAA,GAAiBuC,OAAA,CAAA,UAAA;AAAA,EACrB,CAAC,EAAE,KAAA,EAAO,OAAA,GAAU,WAAW,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAE5D,IAAA,MAAM,SAAA,GACJ,KAAA,CAAM,YAAY,CAAA,KACjB,MAAM,iBAAiB,CAAA,GAAI,MAAA,GAAY,KAAA,IAAS,OAAO,qBAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA;AACvF,IAAA,MAAM,UAAA,GAAaZ,QAAQ,MAAM;AAC/B,MAAA,MAAM,WAAA,GAAc,EAAE,GAAA,IAAO,KAAA,IAAS,CAAA,CAAA,CAAA;AACtC,MAAA,OAAO,GAAG,WAAW,CAAA,CAAA,CAAA;AAAA,IACvB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,IAAA,uBACE3B,GAAAA;AAAA,MAAmB,iBAAA,CAAA,IAAA;AAAA,MAAlB;AAAA,QACC,GAAA;AAAA,QAEA,KAAA;AAAA,QACC,GAAG,KAAA;AAAA,QACJ,YAAA,EAAY,SAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACT,qEAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAmB,iBAAA,CAAA,SAAA;AAAA,UAAlB;AAAA,YACC,SAAA,EAAW,EAAA,CAAG,qCAAA,EAAuC,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAAA,YAC/E,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,WAAA,EAAc,UAAU,CAAA,CAAA,CAAA;AAAI;AAAA;AAClD;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,cAAgC,iBAAA,CAAA,IAAA,CAAK,WAAA;AC1C9C,SAAS,KAAA,CAAM,EAAE,OAAA,GAAU,KAAA,EAAO,WAAW,KAAA,EAAO,SAAA,EAAW,GAAG,KAAA,EAAM,EAAe;AACrF,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,OAAA;AAAA,MACd,eAAA,EAAe,QAAA;AAAA,MACf,YAAA,EAAY,UAAU,SAAA,GAAY,WAAA;AAAA,MAClC,SAAA,EAAW,EAAA;AAAA,QACT,qGAAA;AAAA,QACA,CAAC,QAAA,IAAY,wBAAA;AAAA,QACb,QAAA,IAAY,0DAAA;AAAA,QACZ,OAAA,IAAW,CAAC,QAAA,IAAY,6CAAA;AAAA,QACxB,WAAW,QAAA,IAAY,4BAAA;AAAA,QACvB;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,qCACCA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT;AAAA;AACF;AAAA;AACF;AAAA,GAEJ;AAEJ;ACjCA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACEA,GAAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC9B,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACEA,GAAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,oGAAA;AAAA,QACA,4GAAA;AAAA,QACA,0GAAA;AAAA,QACA,2PAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA;AAAA,QAAqB,mBAAA,CAAA,SAAA;AAAA,QAApB;AAAA,UACC,WAAA,EAAU,uBAAA;AAAA,UACV,SAAA,EAAU,2CAAA;AAAA,UAEV,QAAA,kBAAAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT;AAAA;AACF;AAAA;AACD;AAAA;AACH;AAAA,GACF;AAEJ;ACrCA,IAAM,wBAAA,GAAiCwC,sBAAoD,IAAI,CAAA;AAqB/F,SAAS,iBAAA,CAAkB;AAAA,EACzB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,KAAA,GAAcA,OAAA,CAAA,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,WAAA,KAAgB,YAAA,IAAgB,KAAA,IAAS,CAAA;AACzD,EAAA,MAAM,oBAAA,GAAuB,UAAU,UAAA,GAAa,WAAA;AACpD,EAAA,MAAM,WAAA,GACJ,oBAAA,KAAyB,UAAA,GACrB,eAAA,GACA,KAAA,KAAU,CAAA,GACR,yBAAA,GACA,KAAA,KAAU,CAAA,GACR,yBAAA,GACA,KAAA,KAAU,CAAA,GACR,yBAAA,GACA,aAAA;AACZ,EAAA,uBACExC,GAAAA,CAAC,wBAAA,CAAyB,QAAA,EAAzB,EAAkC,OAAO,EAAE,KAAA,EAAO,OAAA,EAAQ,EACzD,QAAA,kBAAAA,GAAAA;AAAA,IAAqByC,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,KAAA;AAAA,MACA,WAAA,EAAa,oBAAA;AAAA,MAGb,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,WAAA,EAAa,SAAS,CAAA;AAAA,MAC9D,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AA4BA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM,KAAA,GAAcD,mBAAW,wBAAwB,CAAA;AACvD,EAAA,MAAM,UAAU,KAAA,KAAU,IAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,OAAA,GAAU,KAAA,CAAM,KAAA,KAAU,KAAA,GAAQ,QAAA;AAErD,EAAA,MAAM,OAAA,GAAU,WAAW,KAAA,CAAM,OAAA;AAEjC,EAAA,MAAM,aAAA,GAAgB,EAAA;AAAA,IACpB,iFAAA;AAAA,IACA,0GAAA;AAAA;AAAA;AAAA,IAGA,iBAAA;AAAA,IACA,CAAC,UAAA,IAAc,yBAAA;AAAA,IACf,UAAA,IAAc,CAAC,QAAA,IAAY,iCAAA;AAAA,IAC3B,cAAc,QAAA,IAAY,oBAAA;AAAA;AAAA;AAAA,IAG1B,WAAW,wCAAA,GAA2C,gBAAA;AAAA,IACtD;AAAA,GACF;AAEA,EAAA,MAAM,IAAA,mBACJvC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,+DAAA;AAAA,QACV,aAAA,EAAY,MAAA;AAAA,QAEZ,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,YAAY,QAAA,EAAoB;AAAA;AAAA,KAClD;AAAA,oBACAC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,qBAAA;AAAA,UACA,UACI,4DAAA,GACA;AAAA,SACN;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,0CAAA;AAAA,gBACA,UAAU,UAAA,GAAa,QAAA;AAAA,gBACvB,WAAW,wBAAA,GAA2B;AAAA,eACxC;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC,+BACCA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,oDAAA;AAAA,gBACA,UAAU,gBAAA,GAAmB,QAAA;AAAA,gBAC7B,WAAW,wBAAA,GAA2B;AAAA,eACxC;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAMF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEA,GAAAA;AAAA,MAAqByC,mBAAA,CAAA,IAAA;AAAA,MAApB;AAAA,QACC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,2BAA2B,CAAA;AAAA,QACvD,GAAI,KAAA;AAAA,QAKJ,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAGA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwC;AAC3D,IAAA,OAAA,GAAU,CAAC,CAAA;AAEX,IAAA,IAAI,YAAY,UAAA,EAAY;AAC5B,IAAA,QAAA,IAAW;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2C;AAChE,IAAA,SAAA,GAAY,CAAC,CAAA;AACb,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,OAAA,EAAS;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,IAAI,UAAA,EAAY;AAChB,MAAA,QAAA,IAAW;AAAA,IACb;AAAA,EACF,CAAA;AAEA,EAAA,uBACEzC,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,UAAA;AAAA,MACd,eAAA,EAAe,QAAA;AAAA,MACf,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,MAC1B,YAAA,EAAY,aAAa,SAAA,GAAY,WAAA;AAAA,MACrC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,aAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AChOA,IAAM,kBAAA,GAA2B0C,sBAA8C,IAAI,CAAA;AAE5E,SAAS,qBAAA,GAAwB;AACtC,EAAA,MAAM,OAAA,GAAgBA,mBAAW,kBAAkB,CAAA;AACnD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,OAAA;AACT;ACEA,SAASC,YAAAA,CAAY;AAAA,EACnB,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd,YAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,IAAUC,OAAA,CAAA,QAAA,CAAmB,YAAA,IAAgB,EAAE,CAAA;AAC7F,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,iBAAS,WAAW,CAAA;AAC1E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,iBAAS,EAAE,CAAA;AAIrD,EAAMA,kBAAU,MAAM;AACpB,IAAA,cAAA,GAAiB,UAAU,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,UAAA,EAAY,cAAc,CAAC,CAAA;AAE/B,EAAA,MAAM,oBAAoB,eAAA,KAAoB,MAAA;AAC9C,EAAA,MAAM,mBAAmB,cAAA,KAAmB,MAAA;AAE5C,EAAA,MAAM,MAAA,GAAS,oBAAoB,eAAA,GAAkB,iBAAA;AACrD,EAAA,MAAM,IAAA,GAAO,mBAAmB,cAAA,GAAiB,gBAAA;AAEjD,EAAA,MAAM,CAAC,QAAQ,CAAA,GAAUA,iBAAS,sBAAM,IAAI,KAAqB,CAAA;AAEjE,EAAA,MAAM,aAAA,GAAsBA,OAAA,CAAA,WAAA;AAAA,IAC1B,CAAC,WAAmB,KAAA,KAAkB;AACpC,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,KAAK,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,WAAA,KAAwB;AACvB,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,WAAW,IACzC,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,WAAW,CAAA,GACtC,CAAC,GAAG,QAAQ,WAAW,CAAA;AAC3B,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAAA,MAChC;AACA,MAAA,aAAA,GAAgB,SAAS,CAAA;AACzB,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,iBAAA,EAAmB,aAAa;AAAA,GAC3C;AAEA,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,WAAA,KAAwB;AACvB,MAAA,MAAM,YAAY,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,WAAW,CAAA;AACxD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAAA,MAChC;AACA,MAAA,aAAA,GAAgB,SAAS,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,iBAAA,EAAmB,aAAa;AAAA,GAC3C;AAEA,EAAA,MAAM,cAAA,GAAuBA,oBAAY,MAAM;AAC7C,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,oBAAA,CAAqB,EAAE,CAAA;AAAA,IACzB;AACA,IAAA,aAAA,GAAgB,EAAE,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAErC,EAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,WAAA;AAAA,IAC7B,CAAC,OAAA,KAAqB;AACpB,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,mBAAA,CAAoB,OAAO,CAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,aAAA,CAAc,EAAE,CAAA;AAAA,MAClB;AACA,MAAA,YAAA,GAAe,OAAO,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,kBAAkB,YAAY;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,OAAA;AAAA,IACzB,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,MAAA;AAAA,MACA,aAAA,EAAe,iBAAA;AAAA,MACf,aAAA,EAAe,iBAAA;AAAA,MACf,UAAA,EAAY,cAAA;AAAA,MACZ,QAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACE5C,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,YAAA,EAClC,QAAA,kBAAAA,GAAAA,CAAkB6C,gBAAA,CAAA,IAAA,EAAjB,EAAsB,IAAA,EAAY,YAAA,EAAc,gBAAA,EAAkB,KAAA,EAAK,IAAA,EACtE,QAAA,kBAAA7C,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,cAAA,EAAe,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAC9D,QAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA;AAEJ;AC5HA,IAAM,gBAAA,GAAyB8C,sBAAc,KAAK,CAAA;AAG3C,IAAM,YAAA,GAAe,MAAqBA,OAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA;AAMrE,SAAS,SAAA,CAAU,EAAE,QAAA,EAAS,EAAkC;AACrE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAClD,EAAMA,kBAAU,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,EAAE,CAAA;AAC1C,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,YAAA;AAAA,oBACL9C,GAAAA,CAAC,KAAA,EAAA,EAAI,MAAA,EAAM,MAAC,WAAA,EAAU,mBAAA,EACpB,QAAA,kBAAAA,GAAAA,CAAC,iBAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAK,IAAA,EAAE,UAAS,CAAA,EAC7C,CAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;ACpBA,IAAM,kBAAA,GAA2B+C,OAAA,CAAA,UAAA;AAAA,EAC/B,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,GAAQ,OAAA,EAAS,UAAA,GAAa,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC3E,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,aAAA,KAAkB,qBAAA,EAAsB;AAClE,IAAA,MAAM,OAAA,GAAgBA,eAAuB,IAAI,CAAA;AAGjD,IAAMA,kBAAU,MAAM;AACpB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAc,sBAAsB,CAAA;AACzE,UAAA,IAAI,WAAA,IAAe,OAAO,WAAA,CAAY,cAAA,KAAmB,UAAA,EAAY;AACnE,YAAA,WAAA,CAAY,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,UACjD;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,IAAA,uBACE9C,IAAAA,CAAAG,QAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,MAAA,IAAA,GAAO,IAAA,mBAAOJ,GAAAA,CAAC,SAAA,EAAA,EAAW,QAAA,EAAS,CAAA;AAAA,sBACpCA,GAAAA,CAAkBgD,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAhD,GAAAA;AAAA,QAAkBgD,gBAAA,CAAA,OAAA;AAAA,QAAjB;AAAA,UACC,GAAA;AAAA,UACA,WAAA,EAAU,sBAAA;AAAA,UAEV,YAAA,EAAW,2BAAA;AAAA,UACX,KAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,2NAAA;AAAA,YACA,2EAAA;AAAA,YACA,6EAAA;AAAA,YACA,0DAAA;AAAA,YACA,0DAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,eAAA,EAAiB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,UACxC,GAAG,KAAA;AAAA,UAEJ,QAAA,kBAAA/C,IAAAA;AAAA,YAACQ,SAAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAA,KAAa;AACpC,gBAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AACvC,gBAAA,IAAI,QAAA,EAAU,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAC,CAAA,EAAG,OAAO,CAAA;AAC3E,gBAAA,OAAO,CAAA;AAAA,cACT,CAAA;AAAA,cACA,KAAA,EAAM,EAAA;AAAA,cACN,eAAe,MAAM;AAAA,cAAC,CAAA;AAAA,cAGtB,QAAA,EAAA;AAAA,gCAAAT,GAAAA;AAAA,kBAACS,SAAAA,CAAiB,KAAA;AAAA,kBAAjB;AAAA,oBACC,KAAA,EAAO,UAAA;AAAA,oBACP,aAAA,EAAe,aAAA;AAAA,oBACf,SAAA,EAAU,SAAA;AAAA,oBACV,aAAA,EAAY,MAAA;AAAA,oBACZ,QAAA,EAAU;AAAA;AAAA,iBACZ;AAAA,gBAAA,CAEE,MAAM;AACN,kBAAA,MAAM,gBAAmC,EAAC;AAC1C,kBAAA,MAAM,eAAkC,EAAC;AAEzC,kBAAMsC,OAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAA,KAAU;AAC1C,oBAAA,IACQA,uBAAe,KAAK,CAAA,IACzB,KAAA,CAAM,IAAA,EAAc,gBAAgB,kBAAA,EACrC;AACA,sBAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,oBAC1B,CAAA,MAAO;AACL,sBAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,oBACzB;AAAA,kBACF,CAAC,CAAA;AAED,kBAAA,uBACE9C,IAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,oBAAA,aAAA;AAAA,oCACDJ,GAAAA;AAAA,sBAACS,SAAAA,CAAiB,IAAA;AAAA,sBAAjB;AAAA,wBACC,GAAA,EAAK,OAAA;AAAA,wBACL,IAAA,EAAK,SAAA;AAAA,wBACL,sBAAA,EAAqB,MAAA;AAAA,wBACrB,SAAA,EAAU,6DAAA;AAAA,wBAET,QAAA,EAAA;AAAA;AAAA;AACH,mBAAA,EACF,CAAA;AAAA,gBAEJ,CAAA;AAAG;AAAA;AAAA;AACL;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;AChGjC,IAAM,gBAAA,GAAyBwC,OAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACEjD,GAAAA;AAAA,MAACS,SAAAA,CAAiB,KAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,mFAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,QAAA,IAAY;AAAA;AAAA,KACf;AAAA,EAEJ;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACpB/B,IAAM,gBAAA,GAAyByC,OAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,uBAAOlD,GAAAA,CAAAI,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAClC,IAAA,uBACEJ,GAAAA;AAAA,MAACS,SAAAA,CAAiB,KAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,mVAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;AClB/B,IAAM,gBAAA,GAAyB0C,OAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,qBAAA,EAAsB;AAE5D,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2C;AAC/D,MAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,aAAA,CAAc,EAAE,CAAA;AAChB,MAAA,QAAA,GAAW,EAAE,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACElD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,IAACgB,MAAAA,EAAA,EAAO,SAAA,EAAU,4CAAA,EAA6C,eAAY,MAAA,EAAO,CAAA;AAAA,sBAClFhB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP,QAAA,EAAU,YAAA;AAAA,UACV,YAAA,EAAW,2BAAA;AAAA,UACX,SAAA,EAAW,EAAA;AAAA,YACT,2LAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN,EACF,CAAA;AAAA,MACC,8BACCA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,8GAAA;AAAA,UACV,YAAA,EAAW,uCAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACxB,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACzC/B,SAAS,iBAAA,CAAkB;AAAA,EACzB,QAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,yDAAA;AAAA,QACA,QAAA,IAAY;AAAA,OACd;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAEZ,QAAA,EAAA;AAAA,UAAA,UAAA,oBAAcD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA8B,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,0BACxEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACb,QAAA,EAAA,gBAAA,CAAiB,QAAQ,CAAA,EAC5B,CAAA;AAAA,UACC,6BAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,SAAA,EAAU;AAAA,SAAA,EACtD,CAAA;AAAA,QACC,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,oBACrBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,GAAA,qBACZA,GAAAA,CAAC,QAAA,EAAA,EAA2E,GAAG,CAAA,EAAA,EAAhE,CAAA,EAAG,OAAO,EAAE,KAAA,KAAU,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAW,CACnF,CAAA,EACH,CAAA;AAAA,QAED,WAAA,oBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oFAAA,EACb,QAAA,EAAA,gBAAA,CAAiB,WAAW,CAAA,EAC/B;AAAA;AAAA;AAAA,GAEJ;AAEJ;AC5CA,IAAM,eAAA,GAAwBoD,OAAA,CAAA,UAAA;AAAA,EAC5B,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA,GAAkB,QAAA;AAAA,IAClB,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,aAAA,KAAkB,qBAAA,EAAsB;AACvE,IAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAGxC,IAAA,MAAM,iBAAA,GAAoB,SAAA,KAAc,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,KAAA,CAAA;AAGlF,IAAMA,kBAAU,MAAM;AACpB,MAAA,aAAA,CAAc,OAAO,iBAAiB,CAAA;AAAA,IACxC,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAG5C,IAAA,IAAI,WAAW,OAAO,IAAA;AAEtB,IAAA,uBACEnD,IAAAA;AAAA,MAACQ,SAAAA,CAAiB,IAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,mBAAA;AAAA,QACV,YAAA,EAAY,aAAa,SAAA,GAAY,WAAA;AAAA,QACrC,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,iBAAiB,CAAA;AAAA,QAC5B,QAAA;AAAA,QACA,UAAU,MAAM;AACd,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,aAAA,CAAc,KAAK,CAAA;AAAA,UACrB;AAAA,QACF,CAAA;AAAA,QACA,eAAA,EAAe,UAAA;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,UACT,wLAAA;AAAA,UACA,0CAAA;AAAA,UACA,sGAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAAT,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,GAAG,+DAA+D,CAAA;AAAA,cAC7E,aAAA,EAAY,MAAA;AAAA,cAEZ,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,gFAAA;AAAA,oBACA,aACI,+BAAA,GACA,2CAAA;AAAA,oBACJ,QAAA,IAAY;AAAA,mBACd;AAAA,kBAEC,wCACCA,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAM,IAAA;AAAA,sBACN,MAAA,EAAO,GAAA;AAAA,sBACP,OAAA,EAAQ,UAAA;AAAA,sBACR,IAAA,EAAK,MAAA;AAAA,sBACL,KAAA,EAAM,4BAAA;AAAA,sBAEN,QAAA,kBAAAA,GAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,QAAA,EAAS,SAAA;AAAA,0BACT,QAAA,EAAS,SAAA;AAAA,0BACT,CAAA,EAAE,mdAAA;AAAA,0BACF,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AACF;AAAA;AAEJ;AAAA,WACF;AAAA,UAEC,UAAA,IAAc,oBAAoB,QAAA,oBACjCA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,0BAEzCA,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,IAAA;AAAA,cACA,UAAA,EAAY,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,MAAA;AAAA,cACvD,SAAA;AAAA,cACA,QAAA;AAAA,cAEC;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AC1G9B,IAAM,kBAAA,GAA2BqD,OAAA,CAAA,UAAA;AAAA,EAC/B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACEpD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,sBAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,8FAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,OAAA,EAAQ,SAAQ,WAAA,EAAY,CAAA;AAAA,UACzC,QAAA,IAAY;AAAA;AAAA;AAAA,KACf;AAAA,EAEJ;AACF;AACA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;ACxBjC,IAAM,oBAAA,GAA6BsD,OAAA,CAAA,UAAA;AAAA,EACjC,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACEtD,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,wBAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,SAAS,CAAA;AAAA,QAC9D,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,oBAAA,CAAqB,WAAA,GAAc,sBAAA;ACjBnC,IAAM,aAAA,GAAsBuD,sBAAyC,IAAI,CAAA;AAElE,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,OAAA,GAAgBA,mBAAW,aAAa,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,OAAA;AACT;ACDO,IAAM,qBAAA,GAAwBjC,GAAAA;AAAA,EACnC;AAAA,IACE,iGAAA;AAAA,IACA,gEAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV;AAAA,IACE,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR,oEAAA;AAAA,UACA,yDAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,UAAA,EAAY,UAAA;AAAA,QACZ,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW;AAAA;AACb;AAEJ,CAAA;AAEA,IAAM,aAAA,GAAsBkC,OAAA,CAAA,UAAA;AAAA,EAC1B,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,aAAA;AAAA,IACX,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,IAAA,MAAM,SAAA,GAAY,aAAA,IAAiB,WAAA,EAAa,SAAA,IAAa,KAAA;AAC7D,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,KAAU,gBAAA,EAAiB;AACnD,IAAA,MAAM,YAAkBA,OAAA,CAAA,KAAA,EAAM;AAG9B,IAAA,MAAM,YAAkBA,OAAA,CAAA,KAAA,EAAM;AAC9B,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAEtD,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB;AAAA,MACnB,KAAA;AAAA,MACA,QAAA,EAAU,CAAC,CAAC,KAAA;AAAA,MACZ,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,MACb,UAAA,EAAY,QAAA,IAAY,CAAC,CAAC,KAAA,CAAM,QAElC,CAAC,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,KAAe,MAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,KAAe,MAAA;AAEjD,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,WAAA,GAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,UAAA,GAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,uBACExD,GAAAA,CAAkByD,gBAAA,CAAA,OAAA,EAAjB,EAAyB,OAAA,EAAO,MAC/B,QAAA,kBAAAxD,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAe,SAAA;AAAA,QACf,eAAA,EAAc,SAAA;AAAA,QACd,iBAAA,EAAiB,SAAA;AAAA,QACjB,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,iBAAA,EAAiB,WAAW,OAAA,GAAU,SAAA;AAAA,QACtC,eAAA,EAAe,QAAA,IAAY,QAAA,GAAW,IAAA,GAAO,MAAA;AAAA,QAC7C,WAAA,EAAU,gBAAA;AAAA,QACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,QAC5B,QAAA,EAAU,YAAY,KAAA,CAAM,QAAA;AAAA,QAC5B,SAAA,EAAW,EAAA;AAAA,UACT,qBAAA,CAAsB,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AAAA,UAC/C,kDAAA;AAAA,UAAA,CACC,sBAAsB,aAAA,KAAkB,UAAA;AAAA;AAAA,UAEzC,kBAAA,IAAsB,+BAAA;AAAA,UACtB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QACJ,OAAA,EAAS,WAAW,WAAA,GAAc,WAAA;AAAA,QAClC,MAAA,EAAQ,WAAW,UAAA,GAAa,UAAA;AAAA,QAG9B,QAAA,EAAA;AAAA,UAAA,CAAA,kBAAA,IAAsB,kCACtBD,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,qBAAqB,UAAA,GAAa,MAAA;AAAA,cACxC,KAAA;AAAA,cACA,QAAA;AAAA,cACA,UAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BAIFA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,SAAA;AAAA,cACJ,SAAA,EAAW,EAAA;AAAA,gBACT,iEAAA;AAAA,gBACA,QAAA,IAAY,CAAC,KAAA,IAAS;AAAA,eACxB;AAAA,cAEC;AAAA;AAAA,WACH;AAAA,0BAGAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,cAAA;AAAA,cACL,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAW,EAAA,CAAG,2CAAA,EAA6C,IAAA,IAAQ,YAAY,CAAA;AAAA,cAE/E,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA;AAC3B;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;ACzK5B,IAAM,WAAA,GAAcsB,GAAAA;AAAA;AAAA,EAElB,uGAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,6BAAA;AAAA,QACT,WAAA,EAAa,+BAAA;AAAA,QACb,SAAA,EAAW,qCAAA;AAAA,QACX,aAAA,EAAe,iCAAA;AAAA,QACf,MAAA,EAAQ,2BAAA;AAAA,QACR,UAAA,EAAY,8BAAA;AAAA,QACZ,OAAA,EAAS,6BAAA;AAAA,QACT,WAAA,EAAa,+BAAA;AAAA,QACb,OAAA,EAAS,6BAAA;AAAA,QACT,WAAA,EAAa,+BAAA;AAAA,QACb,IAAA,EAAM,uBAAA;AAAA,QACN,QAAA,EAAU,4BAAA;AAAA,QACV,GAAA,EAAK,qBAAA;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,MACA,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,gBAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO;AAAA;AACT;AAEJ;AAGA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,gBAAA;AAAA,EACb,SAAA,EAAW,oBAAA;AAAA,EACX,aAAA,EAAe,kBAAA;AAAA,EACf,MAAA,EAAQ,eAAA;AAAA,EACR,UAAA,EAAY,eAAA;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,gBAAA;AAAA,EACb,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,gBAAA;AAAA,EACb,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAU,aAAA;AAAA,EACV,GAAA,EAAK,YAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAMA,IAAM,YAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,kBAAA;AAAA,EACb,SAAA,EAAW,oBAAA;AAAA,EACX,aAAA,EAAe,kBAAA;AAAA,EACf,MAAA,EAAQ,eAAA;AAAA,EACR,UAAA,EAAY,kBAAA;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,kBAAA;AAAA,EACb,OAAA,EAAS,gBAAA;AAAA,EACT,WAAA,EAAa,kBAAA;AAAA,EACb,IAAA,EAAM,aAAA;AAAA,EACN,QAAA,EAAU,kBAAA;AAAA,EACV,GAAA,EAAK,YAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,WAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,qFAAA;AAAA,EACT,WAAA,EACE,qFAAA;AAAA,EACF,SAAA,EAAW,wBAAA;AAAA,EACX,aAAA,EACE,yFAAA;AAAA,EACF,MAAA,EAAQ,mFAAA;AAAA,EACR,UAAA,EAAY,mFAAA;AAAA,EACZ,OAAA,EAAS,qFAAA;AAAA,EACT,WAAA,EACE,qFAAA;AAAA,EACF,OAAA,EAAS,qFAAA;AAAA,EACT,WAAA,EACE,qFAAA;AAAA,EACF,IAAA,EAAM,+EAAA;AAAA,EACN,QAAA,EAAU,+EAAA;AAAA,EACV,GAAA,EAAK,6EAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,WAAA,GAAsC;AAAA,EAC1C,OAAA,EAAS,sFAAA;AAAA,EACT,WAAA,EACE,sFAAA;AAAA,EACF,SAAA,EAAW,yBAAA;AAAA,EACX,aAAA,EACE,0FAAA;AAAA,EACF,MAAA,EAAQ,oFAAA;AAAA,EACR,UAAA,EAAY,oFAAA;AAAA,EACZ,OAAA,EAAS,sFAAA;AAAA,EACT,WAAA,EACE,sFAAA;AAAA,EACF,OAAA,EAAS,sFAAA;AAAA,EACT,WAAA,EACE,sFAAA;AAAA,EACF,IAAA,EAAM,gFAAA;AAAA,EACN,QAAA,EAAU,gFAAA;AAAA,EACV,GAAA,EAAK,8EAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,eAAA,GAA0C;AAAA,EAC9C,OAAA,EACE,+FAAA;AAAA,EACF,WAAA,EACE,+FAAA;AAAA,EACF,SAAA,EAAW,oCAAA;AAAA,EACX,aAAA,EACE,mGAAA;AAAA,EACF,MAAA,EACE,6FAAA;AAAA,EACF,UAAA,EACE,6FAAA;AAAA,EACF,OAAA,EACE,+FAAA;AAAA,EACF,WAAA,EACE,+FAAA;AAAA,EACF,OAAA,EACE,+FAAA;AAAA,EACF,WAAA,EACE,+FAAA;AAAA,EACF,IAAA,EAAM,yFAAA;AAAA,EACN,QAAA,EACE,yFAAA;AAAA,EACF,GAAA,EAAK,uFAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,eAAA,GAA0C;AAAA,EAC9C,OAAA,EACE,gGAAA;AAAA,EACF,WAAA,EACE,gGAAA;AAAA,EACF,SAAA,EAAW,qCAAA;AAAA,EACX,aAAA,EACE,oGAAA;AAAA,EACF,MAAA,EACE,8FAAA;AAAA,EACF,UAAA,EACE,8FAAA;AAAA,EACF,OAAA,EACE,gGAAA;AAAA,EACF,WAAA,EACE,gGAAA;AAAA,EACF,OAAA,EACE,gGAAA;AAAA,EACF,WAAA,EACE,gGAAA;AAAA,EACF,IAAA,EAAM,0FAAA;AAAA,EACN,QAAA,EACE,0FAAA;AAAA,EACF,GAAA,EAAK,wFAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAmBA,SAAS,GAAA,CAAI;AAAA,EACX,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAa;AACX,EAAA,MAAM,IAAA,GAAO,UAAUoC,IAAAA,GAAO,KAAA;AAC9B,EAAA,MAAM,IAAI,OAAA,IAAW,SAAA;AAGrB,EAAA,MAAM,aAAA,GAAgB,OAAA,IAAW,CAAC,CAAC,QAAA;AAEnC,EAAA,MAAM,YAAA,GAAe,4BACnB1D,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,QAAA,EAAU;AAC/C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,EAAS;AAAA,QACX;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAU,uOAAA;AAAA,MACV,YAAA,EAAW,cAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,EAAA;AAAA,UACN,aAAA,EAAe,EAAA;AAAA,YACb,iBAAiB,CAAC,CAAA;AAAA,YAClB,WAAW,CAAC,eAAA,CAAgB,CAAC,CAAA,EAAG,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,YAClD,2IAAA;AAAA,YACA;AAAA;AACF;AAAA;AACF;AAAA,GACF;AAGF,EAAA,MAAM,sBACJC,IAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,WAAA,CAAY,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,QAC9B,aAAa,UAAA,GAAa,UAAA;AAAA,QAC1B,WAAW,WAAA,GAAc,UAAA;AAAA,QACzB,QAAA,IAAY,CAAC,aAAA,IAAiB,UAAA;AAAA,QAC9B,OAAA,IAAW;AAAA,UACT,CAAC,aAAA,IAAiB,WAAA;AAAA,UAClB,iDAAA;AAAA,UACA,kIAAA;AAAA,UACA,YAAY,CAAC,CAAA;AAAA,UACb,YAAY,CAAC;AAAA,SACf;AAAA,QACA,QAAA,IAAY,mBAAA;AAAA,QACZ,QAAA,IACE,CAAC,aAAA,IAAiB;AAAA,UAChB,sKAAA;AAAA,UACA;AAAA,SACF;AAAA,QACF,aAAA,IAAiB;AAAA,UACf,oMAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,UAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAiD,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,wBAE9EA,GAAAA,CAAC,SAAA,EAAA,EAAW,QAAA,EAAS,CAAA;AAAA,QACpB,CAAC,aAAA,IAAiB;AAAA;AAAA;AAAA,GACrB;AAGF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBACEC,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,sCAAA;AAAA;AAAA,UAEA,aAAa,CAAC,CAAA;AAAA,UACd;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,OAAO,GAAA;AACT;ACxRA,IAAM,kBAAA,GAA2B0D,OAAA,CAAA,UAAA;AAAA,EAC/B,CACE;AAAA,IACE,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,aAAA;AAAA,IACX,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,IAAA,MAAM,SAAA,GAAY,aAAA,IAAiB,WAAA,EAAa,SAAA,IAAa,KAAA;AAC7D,IAAA,MAAM;AAAA,MACJ,IAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,QACE,qBAAA,EAAsB;AAE1B,IAAA,MAAM,QAAA,GAAiBA,eAAyB,IAAI,CAAA;AACpD,IAAA,MAAM,cAAA,GAAuBA,eAAO,KAAK,CAAA;AACzC,IAAA,MAAM,YAAkBA,OAAA,CAAA,KAAA,EAAM;AAC9B,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,OAAO,MAAA,GAAS,CAAA;AAEjC,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB;AAAA,MACnB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAC,QAEhB,CAAC,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,KAAe,MAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,KAAe,MAAA;AAEjD,IAAA,MAAM,oBAAA,GAA6BA,OAAA,CAAA,WAAA;AAAA,MACjC,CAAC,CAAA,KAAwC;AACvC,QAAA,IAAI,QAAA,EAAU;AAEd,QAAA,IAAK,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjD,QAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,QAAA,IAAI,CAAC,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,IAAA,EAAM,OAAO;AAAA,KAC1B;AAEA,IAAA,MAAM,aAAA,GAAsBA,OAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,CAAA,KAA6C;AAC5C,QAAA,IAAI,EAAE,GAAA,KAAQ,WAAA,IAAe,eAAe,EAAA,IAAM,MAAA,CAAO,SAAS,CAAA,EAAG;AACnE,UAAA,aAAA,CAAc,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,QACzC;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAEtB,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf;AACA,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,OAAA,EAAS;AAC9C,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAC,UAAA,EAAY,MAAA,EAAQ,aAAA,EAAe,MAAM,OAAO;AAAA,KACnD;AAEA,IAAA,MAAM,sBAAA,GAA+BA,OAAA,CAAA,WAAA;AAAA,MACnC,CAAC,CAAA,KAA2C;AAE1C,QAAA,IAAI,CAAA,CAAE,kBAAkB,gBAAA,EAAkB;AAC1C,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC9C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,UAAA,IAAI,CAAC,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,UAAA,OAAA,CAAQ,KAAK,CAAA;AACb,UAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,QAC1B;AAAA,MACF,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,IAAA,EAAM,OAAO;AAAA,KAC1B;AAEA,IAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,MAC9B,CAAC,CAAA,KAA2C;AAC1C,QAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,CAAC,aAAA,EAAe,IAAA,EAAM,OAAO;AAAA,KAC/B;AAEA,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,CAAA,KAAwC;AACvC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,CAAA,CAAE,cAAc,IAAA,EAAK;AACrB,UAAA;AAAA,QACF;AACA,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA;AAAA,MACA,CAAC,QAAQ;AAAA,KACX;AAEA,IAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA,CAAY,CAAC,CAAA,KAAwC;AAE5E,MAAA,IAAI,CAAC,CAAA,CAAE,aAAA,CAAc,QAAA,CAAS,CAAA,CAAE,aAAa,CAAA,EAAG;AAC9C,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,cAAA,GAAuBA,OAAA,CAAA,WAAA;AAAA,MAC3B,CAAC,CAAA,KAAwB;AACvB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,UAAA,EAAW;AACX,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,MAC1B,CAAA;AAAA,MACA,CAAC,YAAY,aAAa;AAAA,KAC5B;AAEA,IAAA,MAAM,eAAA,GAAwBA,OAAA,CAAA,WAAA;AAAA,MAC5B,CAAC,KAAA,KAAkB;AACjB,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,MAC1B,CAAA;AAAA,MACA,CAAC,aAAa;AAAA,KAChB;AAEA,IAAA,uBACE3D,GAAAA,CAAkB4D,gBAAA,CAAA,MAAA,EAAjB,EAAwB,OAAA,EAAO,MAC9B,QAAA,kBAAA3D,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAe,SAAA;AAAA,QACf,eAAA,EAAc,SAAA;AAAA,QACd,iBAAA,EAAiB,SAAA;AAAA,QACjB,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,iBAAA,EAAiB,WAAW,OAAA,GAAU,MAAA;AAAA,QACtC,eAAA,EAAe,QAAA,IAAY,QAAA,GAAW,IAAA,GAAO,MAAA;AAAA,QAC7C,WAAA,EAAU,sBAAA;AAAA,QACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,QAC5B,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,qBAAA,CAAsB,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AAAA,UAC/C,gBAAA;AAAA,UACA,uBAAA;AAAA,UACA,kDAAA;AAAA,UAAA,CACC,sBAAsB,aAAA,KAAkB,UAAA;AAAA;AAAA,UAEzC,kBAAA,GACI,+BAAA,GACA,SAAA,GACE,WAAA,GACA,kCAAA;AAAA,UACN,CAAC,kBAAA,IACC,CAAC,SAAA,IACD,0FAAA;AAAA,UACF,QAAA,IAAY,+BAAA;AAAA;AAAA,UAEZ,QAAA,IAAY,eAAe,MAAA,IAAU,yBAAA;AAAA,UACrC;AAAA,SACF;AAAA,QACA,OAAA,EAAS,oBAAA;AAAA,QACT,SAAA,EAAW,sBAAA;AAAA,QACX,OAAA,EAAS,WAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QACP,GAAG,KAAA;AAAA,QAGF,QAAA,EAAA;AAAA,UAAA,CAAA,kBAAA,IAAsB,kCACtBD,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,qBAAqB,UAAA,GAAa,MAAA;AAAA,cACxC,KAAA;AAAA,cACA,QAAA;AAAA,cACA,UAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UAID,mCACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDACb,QAAA,EAAA,eAAA,EACH,CAAA;AAAA,0BAIFC,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,+DAAA;AAAA,gBACA,YAAY,CAAC,QAAA,IAAY,CAAC,SAAA,IAAa,CAAC,IAAA,IAAQ;AAAA,eAClD;AAAA,cAGC,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ;AACnB,kBAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA;AACzC,kBAAA,uBACED,GAAAA,CAAC,KAAA,EAAA,EAAc,WAAU,cAAA,EAAe,WAAA,EAAU,oBAChD,QAAA,kBAAAA,GAAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAQ,SAAA;AAAA,sBACR,KAAA,EAAM,QAAA;AAAA,sBACN,QAAA,EAAU,QAAA,GAAW,MAAA,GAAY,MAAM,gBAAgB,GAAG,CAAA;AAAA,sBAC1D,YAAA,EAAY,QAAA,GAAW,MAAA,GAAY,CAAA,EAAG,WAAW,CAAA,aAAA,CAAA;AAAA,sBAEjD,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gBAAA,EAAkB,QAAA,EAAA,gBAAA,CAAiB,WAAW,CAAA,EAAE;AAAA;AAAA,uBAP1D,GASV,CAAA;AAAA,gBAEJ,CAAC,CAAA;AAAA,gCAGDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACb,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,QAAA;AAAA,oBACL,KAAA,EAAO,UAAA;AAAA,oBACP,QAAA,EAAU,iBAAA;AAAA,oBACV,SAAA,EAAW,aAAA;AAAA,oBACX,aACE,CAAC,QAAA,KAAa,CAAC,QAAA,IAAY,SAAA,IAAa,QAAQ,WAAA,GAAc,MAAA;AAAA,oBAEhE,QAAA;AAAA,oBACA,YAAA,EAAY,SAAS,WAAA,IAAe,2BAAA;AAAA,oBACpC,WAAA,EAAU,oBAAA;AAAA,oBACV,SAAA,EAAU;AAAA;AAAA,iBACZ,EACF;AAAA;AAAA;AAAA,WACF;AAAA,UAAA,CAGE,QAAA,IAAY,UAAA,KAAe,CAAC,QAAA,oBAC5BA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,cAAA;AAAA,cACT,SAAA,EAAW,EAAA;AAAA,gBACT,8GAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,YAAA,EAAW,2BAAA;AAAA,cACX,QAAA,EAAU,EAAA;AAAA,cAEV,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,WACxB;AAAA,UAID,kCACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDACb,QAAA,EAAA,cAAA,EACH,CAAA;AAAA,0BAIFA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,EAAA;AAAA,cACV,eAAe,MAAM;AAInB,gBAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,cAC3B,CAAA;AAAA,cACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,IAAI,QAAA,EAAU;AACd,gBAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,kBAAA,OAAA,CAAQ,KAAK,CAAA;AACb,kBAAA,QAAA,CAAS,SAAS,IAAA,EAAK;AAAA,gBACzB,CAAA,MAAO;AACL,kBAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,kBAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,gBAC1B;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAU,2CAAA;AAAA,cACV,YAAA,EAAY,OAAO,cAAA,GAAO,cAAA;AAAA,cAE1B,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAK,cAAA;AAAA,kBACL,aAAA,EAAY,MAAA;AAAA,kBACZ,SAAA,EAAW,EAAA,CAAG,2CAAA,EAA6C,IAAA,IAAQ,YAAY,CAAA;AAAA,kBAE/E,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA;AAC3B;AAAA;AACF;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AACF;AACA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;AC3TjC,SAAS,MAAA,CAAO;AAAA,EACd,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,GAAc,KAAA;AAAA,EACd,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU6D,iBAA6B,YAAY,CAAA;AACjG,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,iBAAS,WAAW,CAAA;AAE1E,EAAA,MAAM,oBAAoB,eAAA,KAAoB,MAAA;AAC9C,EAAA,MAAM,mBAAmB,cAAA,KAAmB,MAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,oBAAoB,eAAA,GAAkB,iBAAA;AACpD,EAAA,MAAM,IAAA,GAAO,mBAAmB,cAAA,GAAiB,gBAAA;AAEjD,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAUA,iBAAS,sBAAM,IAAI,KAAqB,CAAA;AAE9E,EAAA,MAAM,aAAA,GAAsBA,OAAA,CAAA,WAAA,CAAY,CAAC,SAAA,EAAmB,KAAA,KAAkB;AAC5E,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,KAAM,OAAO,OAAO,IAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,WAAW,KAAK,CAAA;AACzB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAA0BA,OAAA,CAAA,WAAA;AAAA,IAC9B,CAAC,QAAA,KAAqB;AACpB,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,oBAAA,CAAqB,QAAQ,CAAA;AAAA,MAC/B;AACA,MAAA,aAAA,GAAgB,QAAQ,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,mBAAmB,aAAa;AAAA,GACnC;AAEA,EAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,WAAA;AAAA,IAC7B,CAAC,OAAA,KAAqB;AACpB,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,mBAAA,CAAoB,OAAO,CAAA;AAAA,MAC7B;AACA,MAAA,YAAA,GAAe,OAAO,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,CAAC,kBAAkB,YAAY;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,OAAA;AAAA,IACzB,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,KAAA;AAAA,MACA,aAAA,EAAe,iBAAA;AAAA,MACf,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,gBAAA,EAAkB,OAAO,iBAAA,EAAmB,QAAA,EAAU,UAAU,aAAa;AAAA,GACtF;AAEA,EAAA,uBACE7D,GAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,YAAA,EAC7B,QAAA,kBAAAA,GAAAA,CAAkB8D,gBAAA,CAAA,IAAA,EAAjB,EAAsB,IAAA,EAAY,YAAA,EAAc,gBAAA,EAAkB,KAAA,EAAK,IAAA,EACtE,QAAA,kBAAA9D,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,QAAA,EAAS,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACxD,QAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA;AAEJ;AC9EA,IAAM,aAAA,GAAsB+D,OAAA,CAAA,UAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,GAAQ,OAAA,EAAS,UAAA,GAAa,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC3E,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,gBAAA,EAAiB;AAClC,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,iBAAS,EAAE,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAgBA,eAAuB,IAAI,CAAA;AAGjD,IAAA,MAAM,QAAA,GAAiBA,eAAO,IAAI,CAAA;AAClC,IAAMA,kBAAU,MAAM;AACpB,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,CAAC,IAAA,EAAM;AAC7B,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd;AACA,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,IAAMA,kBAAU,MAAM;AACpB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAc,sBAAsB,CAAA;AACzE,UAAA,WAAA,EAAa,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,QAClD,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,IAAA,uBACE9D,IAAAA,CAAAG,QAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,MAAA,IAAA,GAAO,IAAA,mBAAOJ,GAAAA,CAAC,SAAA,EAAA,EAAW,QAAA,EAAS,CAAA;AAAA,sBACpCA,GAAAA,CAAkBgE,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAhE,GAAAA;AAAA,QAAkBgE,gBAAA,CAAA,OAAA;AAAA,QAAjB;AAAA,UACC,GAAA;AAAA,UACA,WAAA,EAAU,gBAAA;AAAA,UAEV,YAAA,EAAW,2BAAA;AAAA,UACX,KAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,2NAAA;AAAA,YACA,2EAAA;AAAA,YACA,6EAAA;AAAA,YACA,0DAAA;AAAA,YACA,0DAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,eAAA,EAAiB,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,UACxC,GAAG,KAAA;AAAA,UAEJ,QAAA,kBAAAhE,GAAAA;AAAA,YAACS,SAAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,CAAC,MAAA,EAAQwD,OAAAA,EAAQ,QAAA,KAAa;AACpC,gBAAA,MAAM,WAAA,GAAcA,QAAO,WAAA,EAAY;AACvC,gBAAA,IAAI,QAAA,EAAU,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAC,CAAA,EAAG,OAAO,CAAA;AAC3E,gBAAA,OAAO,CAAA;AAAA,cACT,CAAA;AAAA,cACA,KAAA,EAAM,EAAA;AAAA,cACN,eAAe,MAAM;AAAA,cAAC,CAAA;AAAA,cAEtB,QAAA,kBAAAjE,GAAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAU,EACrD,QAAA,EAAA,CAAA,MAAM;AACN,gBAAA,MAAM,gBAAmC,EAAC;AAC1C,gBAAA,MAAM,eAAkC,EAAC;AAEzC,gBAAM+D,OAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,QAAA,EAAU,CAAC,KAAA,KAAU;AAC1C,kBAAA,IACQA,uBAAe,KAAK,CAAA,IACzB,KAAA,CAAM,IAAA,EAAc,gBAAgB,aAAA,EACrC;AACA,oBAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,kBAC1B,CAAA,MAAO;AACL,oBAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,kBACzB;AAAA,gBACF,CAAC,CAAA;AAED,gBAAA,uBACE9D,IAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,kBAAA,aAAA;AAAA,kCACDJ,GAAAA;AAAA,oBAACS,SAAAA,CAAiB,IAAA;AAAA,oBAAjB;AAAA,sBACC,GAAA,EAAK,OAAA;AAAA,sBACL,SAAA,EAAU,6DAAA;AAAA,sBAET,QAAA,EAAA;AAAA;AAAA;AACH,iBAAA,EACF,CAAA;AAAA,cAEJ,IAAG,EACL;AAAA;AAAA;AACF;AAAA,OACF,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AAO5B,IAAM,sBAA4BsD,OAAA,CAAA,aAAA,CAAwC;AAAA,EACxE,MAAA,EAAQ,EAAA;AAAA,EACR,WAAW,MAAM;AAAA,EAAC;AACpB,CAAC,CAAA;AAEM,SAAS,eAAA,GAAkB;AAChC,EAAA,OAAaA,mBAAW,mBAAmB,CAAA;AAC7C;AC1GA,IAAM,WAAA,GAAoBG,OAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACElE,GAAAA;AAAA,MAACS,SAAAA,CAAiB,KAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,cAAA;AAAA,QACV,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,+DAAA,EAAiE,SAAS,CAAA;AAAA,QACvF,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAAR,KAAC,KAAA,EAAA,EAAM,cAAA,EAAe,UAAS,UAAA,EAAW,QAAA,EAAS,SAAS,CAAA,EAC1D,QAAA,EAAA;AAAA,0BAAAD,IAACU,IAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,WAAU,iCAAA,EAAkC,CAAA;AAAA,UAC3D,QAAA,IAAY,gBAAQ,MAAA,CAAO;AAAA,SAAA,EAC9B;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;ACxB1B,IAAM,WAAA,GAAoByD,OAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,uBAAOnE,GAAAA,CAAAI,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAClC,IAAA,uBACEJ,GAAAA;AAAA,MAACS,SAAAA,CAAiB,KAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,cAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,mVAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;ACjB1B,IAAM,WAAA,GAAoB2D,OAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,eAAA,EAAgB;AAE9C,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAkB;AACtC,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,QAAA,GAAW,EAAE,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACEnE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,IAACgB,MAAAA,EAAA,EAAO,SAAA,EAAU,4CAAA,EAA6C,eAAY,MAAA,EAAO,CAAA;AAAA,sBAClFhB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DACb,QAAA,kBAAAA,GAAAA;AAAA,QAACS,SAAAA,CAAiB,KAAA;AAAA,QAAjB;AAAA,UACC,GAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,aAAA,EAAe,YAAA;AAAA,UACf,YAAA,EAAW,2BAAA;AAAA,UACX,SAAA,EAAW,EAAA;AAAA,YACT,2LAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN,EACF,CAAA;AAAA,MACC,0BACCT,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,8GAAA;AAAA,UACV,YAAA,EAAW,uCAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACxB,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;AChD1B,IAAM,UAAA,GAAmBqE,OAAA,CAAA,UAAA;AAAA,EACvB,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA,GAAkB,QAAA;AAAA,IAClB,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,eAAe,OAAA,EAAS,aAAA,KAAkB,gBAAA,EAAiB;AACzF,IAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,IAAA,MAAM,aAAa,aAAA,KAAkB,KAAA;AAGrC,IAAA,MAAM,iBAAA,GAAoB,SAAA,KAAc,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,KAAA,CAAA;AAGlF,IAAMA,kBAAU,MAAM;AACpB,MAAA,aAAA,CAAc,OAAO,iBAAiB,CAAA;AAAA,IACxC,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAG5C,IAAA,IAAI,WAAW,OAAO,IAAA;AAEtB,IAAA,uBACEpE,IAAAA;AAAA,MAACQ,SAAAA,CAAiB,IAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,aAAA;AAAA,QACV,YAAA,EAAY,aAAa,SAAA,GAAY,WAAA;AAAA,QACrC,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,iBAAiB,CAAA;AAAA,QAC5B,QAAA;AAAA,QACA,UAAU,MAAM;AACd,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,aAAA,CAAc,KAAK,CAAA;AACnB,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf;AAAA,QACF,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,wLAAA;AAAA,UACA,0CAAA;AAAA,UACA,sGAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,UAAA,IAAc,oBAAoB,QAAA,oBACjCT,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,0BAEzCA,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,IAAA;AAAA,cACA,UAAA,EAAY,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,MAAA;AAAA,cACvD,SAAA;AAAA,cACA,QAAA;AAAA,cAEC;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,UAAA,CAAW,WAAA,GAAc,YAAA;ACzEzB,IAAM,aAAA,GAAsBsE,OAAA,CAAA,UAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACErE,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,gBAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,8FAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,OAAA,EAAQ,SAAQ,WAAA,EAAY,CAAA;AAAA,UACzC,QAAA,IAAY;AAAA;AAAA;AAAA,KACf;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AClB5B,IAAM,gBAAA,GAAyBuE,OAAA,CAAA,UAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,uBAAOvE,GAAAA,CAAAI,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAClC,IAAA,uBACEJ,GAAAA;AAAA,MAACS,SAAAA,CAAiB,KAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,YAAA;AAAA,QACL,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,SAAS,CAAA;AAAA,QACvC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACrB/B,IAAM,eAAA,GAAwB+D,OAAA,CAAA,UAAA;AAAA,EAC5B,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA,GAAkB,QAAA;AAAA,IAClB,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,eAAe,OAAA,EAAS,aAAA,KAAkB,gBAAA,EAAiB;AACzF,IAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,IAAA,MAAM,aAAa,aAAA,KAAkB,KAAA;AAErC,IAAA,MAAM,iBAAA,GAAoB,SAAA,KAAc,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,KAAA,CAAA;AAElF,IAAMA,kBAAU,MAAM;AACpB,MAAA,aAAA,CAAc,OAAO,iBAAiB,CAAA;AAAA,IACxC,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,aAAa,CAAC,CAAA;AAG5C,IAAA,IAAI,WAAW,OAAO,IAAA;AAEtB,IAAA,uBACEvE,IAAAA;AAAA,MAACQ,SAAAA,CAAiB,IAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,aAAA;AAAA,QACV,YAAA,EAAY,aAAa,SAAA,GAAY,WAAA;AAAA,QACrC,KAAA;AAAA,QACA,QAAA,EAAU,CAAC,iBAAiB,CAAA;AAAA,QAC5B,QAAA;AAAA,QACA,UAAU,MAAM;AACd,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,aAAA,CAAc,KAAK,CAAA;AACnB,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACf;AAAA,QACF,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,8LAAA;AAAA,UACA,0CAAA;AAAA,UACA,sGAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAAT,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,iEAAA;AAAA,gBACA,gFAAA;AAAA,gBACA,kCAAA;AAAA,gBACA,QAAA,IAAY;AAAA,eACd;AAAA,cAEA,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,EAAA;AAAA,oBACT,yCAAA;AAAA,oBACA;AAAA;AACF;AAAA;AACF;AAAA,WACF,EACF,CAAA;AAAA,UACC,UAAA,IAAc,oBAAoB,QAAA,oBACjCA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAY,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,0BAEzCA,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA,IAAA;AAAA,cACA,UAAA,EAAY,eAAA,KAAoB,OAAA,GAAU,UAAA,GAAa,MAAA;AAAA,cACvD,SAAA;AAAA,cACA,QAAA;AAAA,cAEC;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AC1F9B,IAAM,eAAA,GAAwByE,OAAA,CAAA,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,IAAI,WAAW,OAAO,IAAA;AACtB,IAAA,uBACEzE,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,kBAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,sCAAA,EAAwC,SAAS,CAAA;AAAA,QAC9D,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;ACf9B,SAAS,WAAA,CAAY,EAAE,WAAA,EAAY,EAAqB;AACtD,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,gBAAA,EAAiB;AAG7C,EAAA,MAAM,cAAc,KAAA,GAAS,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,KAAA,GAAS,MAAA;AAE7D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,cAAA,EAAe,kBAAA,EAAiB,EAAA,EAAG,SAAA,EAAU,yBAAA,EAC1D,QAAA,EAAA,gBAAA,CAAiB,WAAW,CAAA,EAC/B,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,IAAC,MAAA,EAAA,EAAK,WAAA,EAAU,gBAAe,SAAA,EAAU,yBAAA,EACtC,QAAA,EAAA,gBAAA,CAAiB,WAAW,CAAA,EAC/B,CAAA;AAEJ;ACRA,IAAM,cAAA,GAAuB0E,sBAA8C,MAAS,CAAA;AASpF,SAAS,eAAA,CAAgB;AAAA,EACvB,QAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,IAAA,EAAM,cAAA;AAAA,EACN;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,iBAAS,WAAW,CAAA;AAE1E,EAAA,MAAM,SAAS,cAAA,IAAkB,gBAAA;AAEjC,EAAA,MAAM,MAAA,GAAeA,oBAAY,MAAM;AACrC,IAAA,MAAM,WAAW,CAAC,MAAA;AAClB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,mBAAA,CAAoB,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,uBAAO1E,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAI,QAAA,EAAS,CAAA;AACvE;AAEA,SAAS,UAAA,GAAa;AACpB,EAAA,MAAM,OAAA,GAAgB0E,mBAAW,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,OAAA;AACT;AAUA,IAAM,OAAA,GAAgBA,OAAA,CAAA,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,GAAA,GAAM,GAAG,SAAA,GAAY,GAAA,EAAK,WAAA,GAAc,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC7F,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,EAAW;AAE9B,IAAA,uBACE1E,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,sBAAA;AAAA,UACA,mBAAA;AAAA,UACA,+BAAA;AAAA,UACA,yCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAA;AAAA,UACA,MAAA,EAAQ,gBAAgB,GAAG,CAAA,GAAA,CAAA;AAAA,UAC3B,KAAA,EAAO,SAAS,SAAA,GAAY,WAAA;AAAA,UAC5B,SAAA,EAAW,4CAAA;AAAA,UACX,GAAG;AAAA,SACL;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA;AAatB,IAAM,aAAA,GAAsB0E,OAAA,CAAA,UAAA;AAAA,EAC1B,CACE;AAAA,IACE,SAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA,GAAY,uCAAA;AAAA,IACZ,UAAA,GAAa,uCAAA;AAAA,IACb,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AACtD,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,OAAA,CAAA,QAAA,CAAS,CAAC,MAAM,CAAA;AAGtE,IAAMA,kBAAU,MAAM;AACpB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,mBAAA,CAAoB,IAAI,GAAG,GAAG,CAAA;AAC7D,QAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,uBACE1E,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,mBAAA;AAAA,YACA,wCAAA;AAAA,YACA,8BAAA;AAAA,YACA,4EAAA;AAAA,YACA;AAAA,WACF;AAAA,UACC,GAAG,KAAA;AAAA,UAEH;AAAA;AAAA,OACH;AAAA,IAEJ;AAEA,IAAA,uBACEC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,mBAAA;AAAA,UACA,wCAAA;AAAA,UACA,8BAAA;AAAA,UACA,4EAAA;AAAA,UACA,CAAC,MAAA,IAAU,gBAAA;AAAA,UACX;AAAA,SACF;AAAA,QACA,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,QACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACtC,OAAA,EAAS,CAAC,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,QAC5B,IAAA,EAAM,CAAC,MAAA,GAAS,QAAA,GAAW,MAAA;AAAA,QAC3B,YAAA,EAAY,CAAC,MAAA,GAAS,SAAA,GAAY,MAAA;AAAA,QAClC,QAAA,EAAU,CAAC,MAAA,GAAS,CAAA,GAAI,MAAA;AAAA,QACxB,SAAA,EACE,CAAC,MAAA,GACG,CAAC,CAAA,KAAM;AACL,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,MAAA,EAAO;AAAA,UACT;AAAA,QACF,CAAA,GACA,MAAA;AAAA,QAEL,GAAG,KAAA;AAAA,QAGH,QAAA,EAAA;AAAA,UAAA,MAAA,oBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDACZ,QAAA,EAAA,gBAAA,IAAoB,SAAA,mBACnBA,GAAAA,CAAC,aAAU,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,oBAEtDA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,kCAAA;AAAA,gBACA,0BAAA;AAAA,gBACA,mCAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,iBAAiB,WAAA,IAAe,0BAAA;AAAA,gBAChC,KAAA,EAAO;AAAA,eACT;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH,EAEJ,CAAA;AAAA,UAAA,CAIA,KAAA,IAAS,gCACTC,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,6CAAA;AAAA,gBACA,6BAAA;AAAA,gBACA,SAAS,uBAAA,GAA0B,mBAAA;AAAA,gBACnC,aAAa,MAAA,IAAU;AAAA,eACzB;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,KAAA,oBAASD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uCAAuC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gBACnE,+BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAoD,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,WAEjF;AAAA,UAID,MAAA,oBACCA,GAAAA,CAAC,eAAA,EAAA,EAAgB,eAAe,GAAA,EAC9B,QAAA,kBAAAC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,eAAA;AAAA,gBACR,KAAA,EAAM,QAAA;AAAA,gBACN,OAAA,EAAQ,SAAA;AAAA,gBACR,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,MAAA,EAAO;AAAA,gBACT,CAAA;AAAA,gBACA,SAAA,EAAW,EAAA;AAAA,kBACT,+CAAA;AAAA,kBACA,iCAAA;AAAA,kBACA,YAAY,aAAA,GAAgB;AAAA,iBAC9B;AAAA,gBACA,YAAA,EAAY,UAAA;AAAA,gBAEZ,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,aACvB,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,SAAS,QAAA,EAAA,UAAA,EAAW;AAAA,WAAA,EAC3C,CAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AAU5B,IAAM,aAAA,GAAsB0E,OAAA,CAAA,UAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,SAAA,GAAY,uCAAA,EAAW,aAAa,uCAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/E,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AAEtC,IAAA,uBACE1E,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,4BAAA;AAAA,UACA,SAAS,sBAAA,GAAyB,gBAAA;AAAA,UAClC;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,0BAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,eAAe,GAAA,EAC9B,QAAA,kBAAAC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,eAAA;AAAA,cACR,KAAA,EAAM,QAAA;AAAA,cACN,OAAA,EAAQ,SAAA;AAAA,cACR,SAAA,EAAU,8DAAA;AAAA,cACV,OAAA,EAAS,MAAA;AAAA,cACT,YAAA,EAAY,SAAS,UAAA,GAAa,SAAA;AAAA,cAElC,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,WACvB,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,MAAK,OAAA,EAAS,QAAA,EAAA,MAAA,GAAS,aAAa,SAAA,EAAU;AAAA,SAAA,EAChE,CAAA,EACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AAI5B,IAAM,cAAA,GAAuB0E,OAAA,CAAA,UAAA;AAAA,EAC3B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB1E,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAU,SAAA,EAAW,EAAA,CAAG,0BAA0B,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO;AAElF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;AAY7B,IAAM,cAAA,GAAuB0E,OAAA,CAAA,UAAA;AAAA,EAC3B,CACE;AAAA,IACE,SAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA,GAAc,KAAA;AAAA,IACd,WAAA,GAAc,IAAA;AAAA,IACd,IAAA,EAAM,cAAA;AAAA,IACN,YAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,UAAA,EAAW;AAC3C,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,iBAAS,WAAW,CAAA;AAE1E,IAAA,MAAM,aAAa,cAAA,IAAkB,gBAAA;AAErC,IAAA,MAAM,cAAA,GAAuBA,oBAAY,MAAM;AAC7C,MAAA,MAAM,OAAO,CAAC,UAAA;AACd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,EAAG,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAG7B,IAAA,MAAM,YAAA,GAAe,CAAC,WAAA,IAAe,CAAC,WAAA,IAAe,UAAA;AAErD,IAAA,uBACEzE,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,GAAG,EAAA,EAAI,SAAS,CAAA,EAAI,GAAG,KAAA,EAC9C,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCA,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,2DAAA;AAAA,YACA,eACE,WAAA,IACA;AAAA,WACJ;AAAA,UACA,IAAA,EAAM,WAAA,IAAe,WAAA,GAAc,QAAA,GAAW,MAAA;AAAA,UAC9C,QAAA,EAAU,WAAA,IAAe,WAAA,GAAc,CAAA,GAAI,MAAA;AAAA,UAC3C,OAAA,EAAS,WAAA,IAAe,WAAA,GAAc,cAAA,GAAiB,MAAA;AAAA,UACvD,SAAA,EACE,WAAA,IAAe,WAAA,GACX,CAAC,CAAA,KAAM;AACL,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,cAAA,EAAe;AAAA,YACjB;AAAA,UACF,CAAA,GACA,MAAA;AAAA,UAGL,QAAA,EAAA;AAAA,YAAA,WAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2DACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,4BAEFA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,YAC7B,WAAA,IAAe,+BACdA,GAAAA;AAAA,cAAC2E,WAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,SAAA,EAAW,EAAA;AAAA,kBACT,kEAAA;AAAA,kBACA,UAAA,IAAc;AAAA;AAChB;AAAA;AACF;AAAA;AAAA,OAEJ;AAAA,sBAEF3E,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,EAAA;AAAA,YACT,+DAAA;AAAA,YACA,eAAe,iBAAA,GAAoB;AAAA,WACrC;AAAA,UAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iCAAiC,QAAA,EAAS;AAAA;AAAA;AAC1D,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA;AAW7B,IAAM,eAAA,GAAwB0E,OAAA,CAAA,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,QAAA,GAAW,KAAA,EAAO,OAAA,GAAU,KAAA,EAAO,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1F,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,EAAW;AAE9B,IAAA,MAAM,gCACJzE,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,qCAAA;AAAA,UACA,6BAAA;AAAA,UACA,6BAAA;AAAA;AAAA,UAEA,QAAA,IAAY;AAAA,YACV,yCAAA;AAAA,YACA,iCAAA;AAAA,YACA,qDAAA;AAAA,YACA;AAAA,WACF;AAAA;AAAA,UAEA,CAAC,QAAA,IAAY;AAAA,YACX,mCAAA;AAAA,YACA,uDAAA;AAAA,YACA;AAAA;AACF,SACF;AAAA,QAGC,QAAA,EAAA;AAAA,UAAA,IAAA,oBACCD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YACd,QAAA,kBAAAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,iBAAA,EAAmB,IAAA;AAAA,cACnB,IAAA,EAAM,EAAA;AAAA,cACN,SAAA,EAAW,EAAA,CAAG,QAAA,GAAW,gBAAA,GAAmB,sBAAsB;AAAA;AAAA,WACpE,EACF,CAAA;AAAA,0BAIFA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,oDAAA;AAAA,gBACA,iCAAA;AAAA,gBACA,SAAS,uBAAA,GAA0B,mBAAA;AAAA,gBACnC,WAAW,wBAAA,GAA2B;AAAA,eACxC;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,KACF;AAGF,IAAA,MAAM,IAAA,GAAO,UAAU0D,IAAAA,GAAO,KAAA;AAE9B,IAAA,MAAM,OAAA,mBACJ1D,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA,OAAA,GACS0E,OAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,GACrBA,OAAA,CAAA,YAAA,CAAa,QAAA,EAAgC;AAAA,MACjD,QAAA,EAAU;AAAA,KACX,CAAA,GACD,QAAA,GACF,aAAA,EACN,CAAA;AAGF,IAAA,uBACE1E,IAAC,IAAA,EAAA,EAAG,GAAA,EAAU,WAAW,EAAA,CAAG,EAAA,EAAI,SAAS,CAAA,EAAI,GAAG,OAC7C,QAAA,EAAA,CAAC,MAAA,mBACAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,eAAe,GAAA,EAC9B,QAAA,kBAAAC,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBACjCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,SAAS,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACtC,CAAA,EACF,IAEA,OAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAI9B,IAAM,aAAA,GAAsB0E,OAAA,CAAA,UAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,EAAW;AAE9B,IAAA,uBACE1E,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,8BAAA;AAAA,UACA,yCAAA;AAAA,UACA,iCAAA;AAAA,UACA,SAAS,uBAAA,GAA0B,mBAAA;AAAA,UACnC;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AC7frB,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,CAAA;AACnC,EAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AACrB,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACzB,EAAA,OAAO,GAAA,KAAQ,EAAA,GAAK,CAAA,GAAI,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA;AAC3C;AAEO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAGO,SAAS,IAAA,CAAK,KAAA,EAAe,GAAA,EAAa,IAAA,EAAsB;AACrE,EAAA,IAAI,EAAE,IAAA,GAAO,CAAA,CAAA,EAAI,OAAO,KAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,OAAO,IAAI,CAAA;AAC7C,EAAA,OAAO,MAAM,KAAA,GAAQ,IAAA;AACvB;AAGO,SAAS,YAAA,CAAa,OAAe,IAAA,EAAsB;AAChE,EAAA,MAAM,CAAA,GAAI,YAAY,IAAI,CAAA;AAC1B,EAAA,OAAO,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,KAAA;AAC5C;AAGO,SAAS,UAAU,KAAA,EAAe,EAAE,GAAA,EAAK,GAAA,EAAK,MAAK,EAAwB;AAChF,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,KAAA,EAAO,KAAK,GAAG,CAAA,EAAG,KAAK,IAAI,CAAA;AACtD,EAAA,OAAO,MAAM,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA,EAAG,KAAK,GAAG,CAAA;AACpD;AAuBO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAA8C;AAC5C,EAAA,MAAM,MAAA,GAAe4E,OAAA,CAAA,OAAA,CAAqB,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK,CAAA,EAAI,CAAC,GAAA,EAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AACtF,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAE/B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,OAAA,CAAA,QAAA;AAAA,IAAiB,MACrD,UAAU,YAAA,IAAgB,GAAA,EAAK,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM;AAAA,GACnD;AAEA,EAAA,MAAM,OAAA,GAAU,YAAA,GAAe,SAAA,CAAU,KAAA,EAAiB,MAAM,CAAA,GAAI,QAAA;AAEpE,EAAA,MAAM,QAAA,GAAiBA,OAAA,CAAA,WAAA;AAAA,IACrB,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AACzC,MAAA,IAAI,CAAC,YAAA,EAAc,WAAA,CAAY,UAAU,CAAA;AACzC,MAAA,IAAI,UAAA,KAAe,OAAA,EAAS,aAAA,GAAgB,UAAU,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,YAAA,EAAc,aAAA,EAAe,OAAO;AAAA,GAC/C;AAEA,EAAA,MAAM,SAAA,GAAkBA,OAAA,CAAA,WAAA,CAAY,MAAM,QAAA,CAAS,OAAA,GAAU,IAAI,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,IAAI,CAAC,CAAA;AAC7F,EAAA,MAAM,SAAA,GAAkBA,OAAA,CAAA,WAAA,CAAY,MAAM,QAAA,CAAS,OAAA,GAAU,IAAI,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,IAAI,CAAC,CAAA;AAE7F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAc,OAAA,GAAU,GAAA;AAAA,IACxB,cAAc,OAAA,GAAU;AAAA,GAC1B;AACF;AC/DA,SAAS,WAAA,CAAY,OAAe,IAAA,EAAsB;AACxD,EAAA,MAAM,CAAA,GAAI,YAAY,IAAI,CAAA;AAC1B,EAAA,OAAO,IAAI,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAI,OAAO,KAAK,CAAA;AAChD;AAGA,SAAS,UAAA,CAAW;AAAA,EAClB,GAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAOW;AAET,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA,CACJ,GAAA;AAAA,MACC,CAAC,MACC,OAAO,CAAA,KAAM,WACT,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,WAAA,CAAY,GAAG,IAAI,CAAA,KACtC,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,IAAA;AAAK,KACjD,CACC,OAAO,CAAC,CAAA,KAAM,EAAE,KAAA,IAAS,GAAA,IAAO,CAAA,CAAE,KAAA,IAAS,GAAG,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO;AAAA,MACL,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,WAAA,CAAY,GAAA,EAAK,IAAI,CAAA,EAAE;AAAA,MAC5C,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,WAAA,CAAY,GAAA,EAAK,IAAI,CAAA;AAAE,KAC9C;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,GAAI,IAAA,CAAK,OAAO,GAAA,GAAM,GAAA,IAAO,IAAI,CAAA,GAAI,CAAA;AACtD,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAA,IAAK,CAAA,SAAU,EAAC;AAC3C,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAI,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAY;AACnD,IAAA,MAAM,CAAA,GAAI,MAAM,CAAA,GAAI,IAAA;AACpB,IAAA,MAAM,UAAU,CAAA,GAAI,UAAA,KAAe,CAAA,IAAK,CAAA,KAAM,KAAK,CAAA,KAAM,CAAA;AACzD,IAAA,OAAO,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,UAAU,WAAA,CAAY,CAAA,EAAG,IAAI,CAAA,GAAI,IAAA,EAAK;AAAA,EAClE,CAAC,CAAA;AACH;AAQO,SAAS,KAAA,CAAM;AAAA,EACpB,GAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAa,IAAA;AAAA,EACb,UAAA,GAAa,CAAA;AAAA,EACb;AACF,CAAA,EAAe;AACb,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,GAAA,EAAK,KAAK,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA;AACxE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,OAAO,GAAA,GAAM,GAAA;AACnB,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,EAAA,GAAK,MAAA,GAAU,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAEnE,EAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAe,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA,GAAI,MAAM,CAAA,GAAI,EAAA;AAEjE,EAAA,uBACE5E,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACtB,IAAA,MAAM,IAAI,IAAA,KAAS,CAAA,GAAI,CAAA,GAAA,CAAK,IAAA,CAAK,QAAQ,GAAA,IAAO,IAAA;AAChD,IAAA,uBACEC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,iEAAA;AAAA,QACV,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,CAAA,CAAA,EAAI;AAAA,QAE7B,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,wCAAA;AAAA,gBACA,CAAC,WACG,WAAA,GACA,QAAA,GACE,mBACA,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,GACjB,cAAA,GACA;AAAA;AACV;AAAA,WACF;AAAA,UACC,UAAA,IAAc,IAAA,CAAK,KAAA,IAAS,IAAA,oBAC3BA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,kDAAA;AAAA,gBACA,WAAW,wBAAA,GAA2B;AAAA,eACxC;AAAA,cAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR;AAAA,OAAA;AAAA,MAxBG;AAAA,KA0BP;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AClIA,IAAM,WAAA,GAAc,EAAA;AAAA,EAClB,oGAAA;AAAA,EACA,wCAAA;AAAA,EACA,iEAAA;AAAA,EACA;AACF,CAAA;AAOO,IAAM,WAAA,GAAoB6E,OAAA,CAAA,UAAA;AAAA,EAI/B,CACE;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,UAAA;AAAA,IACP,UAAA,GAAa,IAAA;AAAA,IACb,KAAA;AAAA,IACA,GAAA,GAAM,CAAA;AAAA,IACN,GAAA,GAAM,GAAA;AAAA,IACN,IAAA,GAAO,CAAA;AAAA,IACP,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,cAAA;AAAA,IACnB,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,IAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAUA,iBAAmB,YAAA,IAAgB,CAAC,GAAG,CAAC,CAAA;AAC9E,IAAA,MAAM,OAAA,GAAU,eAAgB,KAAA,GAAqB,QAAA;AAIrD,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,CAAA,KAAc;AAC/C,MAAA,MAAM,QAAA,GAAW,CAAA,IAAK,CAAA,GAAI,EAAA,GAAK,CAAA,KAAM,CAAA,GAAI,oBAAA,GAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,oBAAA,GAAQ,CAAA,EAAG,IAAI,CAAC,CAAA,mBAAA,CAAA;AAC/E,MAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,EAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,QAAA;AACjE,MAAA,OAAO,cAAA,GACH,EAAE,iBAAA,EAAmB,cAAA,EAAgB,cAAc,KAAA,EAAM,GACzD,EAAE,YAAA,EAAc,KAAA,EAAM;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,WAAA;AAAA,MACzB,CAAC,IAAA,KAAmB;AAClB,QAAA,IAAI,CAAC,YAAA,EAAc,WAAA,CAAY,IAAI,CAAA;AACnC,QAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,MACtB,CAAA;AAAA,MACA,CAAC,cAAc,aAAa;AAAA,KAC9B;AAEA,IAAA,uBACE5E,IAAAA;AAAA,MAAiB,eAAA,CAAA,IAAA;AAAA,MAAhB;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,uEAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA,EAAO,eAAgB,KAAA,GAAqB,MAAA;AAAA,QAC5C,YAAA,EAAc,YAAA,GAAe,MAAA,GAAa,YAAA,IAAgB,CAAC,GAAG,CAAA;AAAA,QAC9D,aAAA,EAAe,YAAA;AAAA,QACf,QAAA;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAiB,eAAA,CAAA,KAAA,EAAhB,EAAsB,SAAA,EAAU,0DAAA,EAC/B,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAiB,eAAA,CAAA,KAAA,EAAhB,EAAsB,SAAA,EAAU,0EAAA,EAA2E,CAAA;AAAA,4BAC5GA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA;AAAA,gBACA,GAAA;AAAA,gBACA,IAAA;AAAA,gBACA,KAAA,EAAO,OAAA;AAAA,gBACP,KAAA;AAAA,gBACA,UAAU,IAAA,KAAS,UAAA;AAAA,gBACnB,QAAA;AAAA,gBACA;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,UACC,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,sBACfA,GAAAA;AAAA,YAAiB,eAAA,CAAA,KAAA;AAAA,YAAhB;AAAA,cAEC,SAAA,EAAW,WAAA;AAAA,cACV,GAAG,cAAA,CAAe,CAAA,EAAG,OAAA,CAAQ,MAAM;AAAA,aAAA;AAAA,YAF/B;AAAA,WAIR;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;ACvFnB,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAU8E,iBAAiB,MAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAGlD,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,MAAM,MAAA,GAAeA,oBAAY,MAAM;AACrC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,MAAM,MAAA,GAAS,OAAO,OAAO,CAAA;AAC7B,IAAA,IAAI,OAAA,KAAY,EAAA,IAAM,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AACrB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,UAAU,MAAA,EAAQ,EAAE,KAAK,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,UAAU,GAAA,EAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,IACvC,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,IAC9B,QAAQ,MAAM;AACZ,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,CAAA,CAAE,cAAc,IAAA,EAAK;AAAA,IAC9C;AAAA,GACF;AACF;ACtBA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ,eAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAMO,IAAMC,MAAAA,GAAcC,OAAA,CAAA,UAAA;AAAA,EACzB,CACE;AAAA,IACE,GAAA,GAAM,CAAA;AAAA,IACN,GAAA,GAAM,GAAA;AAAA,IACN,IAAA,GAAO,CAAA;AAAA,IACP,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA,GAAQ,SAAA;AAAA,IACR,IAAA,GAAO,UAAA;AAAA,IACP,QAAA;AAAA,IACA,gBAAA,GAAmB,IAAA;AAAA,IACnB,cAAA,GAAiB,IAAA;AAAA,IACjB,UAAA,GAAa,IAAA;AAAA,IACb,KAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,cAAA;AAAA,IACnB;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM;AAAA,MACJ,KAAA,EAAO,OAAA;AAAA,MACP,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,GAAI,cAAc,EAAE,KAAA,EAAO,cAAc,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,aAAA,EAAe,CAAA;AAGxE,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,EAAE,KAAA,EAAO,OAAA,EAAS,UAAU,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,CAAA;AAGzF,IAAA,MAAM,SAAA,GAAY,KAAA,KAAU,SAAA,GAAY,SAAA,GAAY,QAAA;AACpD,IAAA,MAAM,YAAA,GAAe,KAAA,KAAU,QAAA,GAAW,eAAA,GAAkB,MAAA;AAE5D,IAAA,uBACE/E,KAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,qCAAA,EAAuC,SAAS,CAAA,EAC1E,QAAA,EAAA;AAAA,MAAA,gBAAA,oBACCD,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAQ,QAAA;AAAA,UACR,KAAA,EAAO,SAAA;AAAA,UACP,SAAA,EAAW,YAAA;AAAA,UACX,QAAA,EAAU,YAAY,CAAC,YAAA;AAAA,UACvB,OAAA,EAAS,SAAA;AAAA,UACT,YAAA,EAAW,qBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,OACnB;AAAA,sBAGFA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,gBAAA;AAAA,UACV,IAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA;AAAA,UACA,GAAA;AAAA,UACA,GAAA;AAAA,UACA,IAAA;AAAA,UACA,KAAA,EAAO,CAAC,OAAO,CAAA;AAAA,UACf,eAAe,CAAC,CAAC,CAAC,CAAA,KAAM,SAAS,CAAC,CAAA;AAAA,UAClC,QAAA;AAAA,UACA,YAAA,EAAY,SAAA;AAAA,UACZ,iBAAA,EAAiB;AAAA;AAAA,OACnB;AAAA,MAEC,kCACCA,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,UAAA,EAAW,UAAA;AAAA,UAEX,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,UACtD,IAAA,EAAK,YAAA;AAAA,UACL,SAAA,EAAU,SAAA;AAAA,UACV,IAAA;AAAA,UAEA,YAAA,EAAY,cAAA,GAAiB,MAAA,GAAa,SAAA,IAAa,QAAA;AAAA,UACvD,iBAAA,EAAiB,cAAA;AAAA,UACjB,eAAA,EAAe,OAAA;AAAA,UACf,eAAA,EAAe,GAAA;AAAA,UACf,eAAA,EAAe,GAAA;AAAA,UACf,QAAA;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,MAGD,oCACCA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAQ,QAAA;AAAA,UACR,KAAA,EAAO,SAAA;AAAA,UACP,SAAA,EAAW,YAAA;AAAA,UACX,QAAA,EAAU,YAAY,CAAC,YAAA;AAAA,UACvB,OAAA,EAAS,SAAA;AAAA,UACT,YAAA,EAAW,qBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AAClB,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AACA+E,MAAAA,CAAM,WAAA,GAAc,OAAA;AC1IpB,IAAM,MAAA,GAAeE,OAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,OAAA,EAAS,WAAW,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjE,IAAA,MAAM,WAAA,GAGF;AAAA,MACF,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,mBAAA;AAAA,QACP,SAAA,EAAW,yCAAA;AAAA,QACX,SAAA,EAAW,qCAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACT;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,mBAAA;AAAA,QACP,SAAA,EAAW,yCAAA;AAAA,QACX,SAAA,EAAW,sBAAA;AAAA,QACX,KAAA,EAAO;AAAA;AACT,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAEhC,IAAA,uBACEhF,IAAAA;AAAA,MAAkB,gBAAA,CAAA,IAAA;AAAA,MAAjB;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,8GAAA;AAAA;AAAA,UAEA,kDAAA;AAAA,UACA,qFAAA;AAAA,UACA,2HAAA;AAAA,UACA,mIAAA;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA,oBACCA,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAJ,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,2EAAA;AAAA,kBACA,qEAAA;AAAA,kBACA,qBAAA;AAAA,kBACA,OAAA,CAAQ;AAAA,iBACV;AAAA,gBAEA,0BAAAA,GAAAA,CAACkF,KAAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EAA0B,aAAa,GAAA,EAAK;AAAA;AAAA,aAC/D;AAAA,4BACAlF,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,2EAAA;AAAA,kBACA,uEAAA;AAAA,kBACA,qBAAA;AAAA,kBACA,OAAA,CAAQ;AAAA,iBACV;AAAA,gBAEA,0BAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,aAAa,GAAA,EAAK;AAAA;AAAA;AAC3D,WAAA,EACF,CAAA;AAAA,0BAEFA,GAAAA;AAAA,YAAkB,gBAAA,CAAA,KAAA;AAAA,YAAjB;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,2JAAA;AAAA,gBACA,4BAAA;AAAA,gBACA,OAAA,CAAQ,KAAA;AAAA,gBACR,OAAA,CAAQ;AAAA;AACV;AAAA;AACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,cAA+B,gBAAA,CAAA,IAAA,CAAK,WAAA;ACxE3C,IAAM,aAAA,GAAsBmF,OAAA,CAAA,UAAA;AAAA,EAC1B,CACE;AAAA,IACE,KAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA,GAAO,OAAA;AAAA,IACP,QAAA,GAAW,KAAA;AAAA,IACX,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,SAAeA,OAAA,CAAA,KAAA,EAAM;AAC3B,IAAA,MAAM,WAAW,EAAA,IAAM,MAAA;AACvB,IAAA,uBACElF,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,gBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA,UAGT,8HAAA;AAAA,UACA,QAAA,IAAY,YAAA;AAAA,UACZ;AAAA,SACF;AAAA,QAIA,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,QAAA;AAAA,cACT,SAAA,EAAW,EAAA;AAAA,gBACT,iCAAA;AAAA,gBACA,WAAW,oBAAA,GAAuB;AAAA,eACpC;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uDAAA,EAAyD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,gBAC9E,8BACCA,GAAAA,CAAC,UAAK,SAAA,EAAU,mEAAA,EACb,uBACH,CAAA,GACE;AAAA;AAAA;AAAA,WACN;AAAA,0BAEAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,EAAA,EAAI,QAAA;AAAA,cACJ,QAAA;AAAA,cACA,IAAA;AAAA,cACA,QAAA;AAAA,cACA,SAAA,EAAW,eAAA;AAAA,cACV,GAAG;AAAA;AAAA;AACN;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;ACxE5B,IAAM,yBAAA,GAA4BsB,GAAAA;AAAA,EAChC;AAAA,IACE,wCAAA;AAAA,IACA,gEAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV;AAAA,IACE,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR,oEAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,UAAA,EAAY,UAAA;AAAA,QACZ,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW;AAAA;AACb;AAEJ,CAAA;AAiBA,IAAM,QAAA,GAAiB8D,OAAA,CAAA,UAAA;AAAA,EACrB,CACE;AAAA,IACE,UAAA,GAAa,UAAA;AAAA,IACb,KAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,SAAA,EAAW,aAAA;AAAA,IACX,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU,CAAA;AAAA,IACV,OAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,YAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA;AAAA,IACA,GAAG;AAAA,KAEL,YAAA,KACG;AACH,IAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,IAAA,MAAM,SAAA,GAAY,aAAA,IAAiB,WAAA,EAAa,SAAA,IAAa,KAAA;AAC7D,IAAA,MAAM,WAAA,GAAoBA,eAA4B,IAAI,CAAA;AAC1D,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAGtD,IAAA,MAAM,eAAe,SAAA,KAAc,MAAA;AACnC,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,OAAA,CAAA,QAAA;AAAA,MAC9C,YAAA,KAAiB,MAAA,GAAY,MAAA,CAAO,YAAY,CAAA,GAAI;AAAA,KACtD;AACA,IAAA,MAAM,WAAW,YAAA,GAAe,MAAA,CAAO,SAAS,CAAA,KAAM,KAAK,aAAA,KAAkB,EAAA;AAG7E,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,IAAA,KAAqC;AACnC,QAAC,YAAmE,OAAA,GAAU,IAAA;AAC/E,QAAA,IAAI,OAAO,YAAA,KAAiB,UAAA,EAAY,YAAA,CAAa,IAAI,CAAA;AAAA,aAAA,IAChD,YAAA;AACP,UAAC,aAAoE,OAAA,GAAU,IAAA;AAAA,MACnF,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAGA,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB;AAAA,MACnB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAC,QAEhB,CAAC,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,KAAe,MAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,KAAe,MAAA;AAIjD,IAAA,MAAM,YAAA,GAAqBA,OAAA,CAAA,WAAA;AAAA,MACzB,CAAC,CAAA,KAA8C;AAC7C,QAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAClD,QAAA,YAAA,GAAe,CAAC,CAAA;AAAA,MAClB,CAAA;AAAA,MACA,CAAC,cAAc,YAAY;AAAA,KAC7B;AAEA,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,CAAA,KAA6C;AAC5C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,WAAA,GAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,KAA6C;AAC5C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,UAAA,GAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,uBACEnF,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,UAAA;AAAA,QACV,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,SAAA,EAAW,EAAA;AAAA,UACT,yBAAA,CAA0B,EAAE,UAAA,EAAY,SAAA,EAAW,CAAA;AAAA;AAAA,UAEnD,aACE,CAAC,SAAA,IACD,UAAA,KAAe,UAAA,IACf,CAAC,kBAAA,IACD,2DAAA;AAAA;AAAA,UAAA,CAED,sBAAsB,aAAA,KAAkB,UAAA;AAAA;AAAA,UAEzC,kBAAA,IAAsB,+BAAA;AAAA;AAAA,UAEtB,WAAW,+BAAA,GAAkC,aAAA;AAAA;AAAA,UAE7C,QAAA,IAAY,eAAe,MAAA,IAAU,yBAAA;AAAA,UACrC,kBAAA;AAAA;AAAA;AAAA;AAAA,UAIA;AAAA,SACF;AAAA,QACA,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,SAAS,UAAA,GAAa,MAAA;AAAA,UAC9B,QAAA,EAAU,SAAS,QAAA,GAAW;AAAA,SAChC;AAAA,QAGE,QAAA,EAAA;AAAA,UAAA,CAAA,kBAAA,IAAsB,kCACtBD,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,qBAAqB,UAAA,GAAa,MAAA;AAAA,cACxC,KAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,UAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BAIFA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,WAAA;AAAA,cACL,OAAA;AAAA,cACA,OAAA;AAAA,cACA,QAAA;AAAA,cACA,QAAA;AAAA,cACA,KAAA,EAAO,eAAe,SAAA,GAAY,MAAA;AAAA,cAClC,YAAA,EAAc,CAAC,YAAA,GAAe,YAAA,GAAe,MAAA;AAAA,cAC7C,QAAA,EAAU,YAAA;AAAA,cACV,OAAA,EAAS,WAAA;AAAA,cACT,MAAA,EAAQ,UAAA;AAAA,cACR,iBAAA,EAAiB,WAAW,OAAA,GAAU,MAAA;AAAA,cACtC,eAAA,EAAe,QAAA,IAAY,YAAA,GAAe,IAAA,GAAO,MAAA;AAAA,cACjD,SAAA,EAAW,EAAA;AAAA,gBACT,wDAAA;AAAA,gBACA,qCAAA;AAAA,gBACA,uCAAA;AAAA,gBACA,6BAAA;AAAA,gBACA,mBAAA;AAAA;AAAA;AAAA;AAAA,gBAIA,WAAW,IAAA,IAAQ,iBAAA;AAAA;AAAA,gBAEnB,QAAA,IAAY,CAAC,QAAA,IAAY,CAAC,SAAA,IAAa;AAAA,eACzC;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,MAAA,EAAQ,MAAA;AAAA,gBACR,GAAG;AAAA,eACL;AAAA,cACC,GAAG;AAAA;AAAA;AACN;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA;AChKvB,SAAS,cAAA,CACP,OACA,QAAA,EACY;AACZ,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAEnE,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAC/E,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,IACE,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAClB,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,IACnB,CAAA,CAAE,MAAA,KAAW,IAAA,IAAQ,CAAA,CAAE,MAAA,KAAW,IAAA;AAEnC,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAK;AAClD,IAAA,IAAI,CAAA,CAAE,IAAA,GAAO,CAAA,IAAK,CAAA,CAAE,IAAA,GAAO,MAAM,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,EAAA;AAC1D,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAK;AAClD,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,MACpC,QAAQ,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,MACxC,QAAQ,CAAA,CAAE;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAC/E,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,qBAAqB,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAO,EAAE,MAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAC5D,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC/B,EAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,EAAA,IAAM,IAAI,CAAA,IAAK,CAAA,GAAI,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAA,EAAK;AACxF,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,IAC/B,QAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,IACjC,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,SAAS,iBAAA,CACP,OACA,QAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAC7C,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAQ,OAAO,EAAA;AAE3C,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,KAAW,IAAA,GAAO,cAAA,GAAO,cAAA;AACpD,IAAA,OAAO,GAAG,WAAW,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,GAAA,EAAM,OAAO,MAAM,CAAA,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,GAAA,EAAM,OAAO,MAAM,CAAA,CAAA;AAC1C;AAEA,SAAS,YAAA,CAAa,OAA8C,QAAA,EAA6B;AAC/F,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,IAAA,KAAS,IAAA,IAAQ,MAAA,CAAO,MAAA,KAAW,IAAA;AACnD;AAEA,SAAS,oBAAoB,QAAA,EAAwD;AACnF,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,GAAG,CAAA,KAAM;AAC1C,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,MAAM,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrC,MAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,IAClC,CAAC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,GAAG,CAAA,KAAM;AAC1C,IAAA,MAAM,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,EAClC,CAAC,CAAA;AACH;AAEA,SAAS,sBAAsB,IAAA,EAAkD;AAC/E,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAC7C,EAAA,MAAM,UAA8C,EAAC;AACrD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,QAAA,EAAU;AACrC,IAAA,MAAM,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrC,IAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,cAAA,GAAqD;AAAA,EACzD,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,cAAA,EAAK;AAAA,EAC3B,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,cAAA;AACxB,CAAA;AAOA,IAAM,yBAAA,GAA4BsB,GAAAA;AAAA,EAChC;AAAA,IACE,0FAAA;AAAA,IACA,gEAAA;AAAA,IACA,+DAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV;AAAA,IACE,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR,oEAAA;AAAA,UACA,gEAAA;AAAA,UACA,+GAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,MACA,QAAA,EAAU;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,UAAA,EAAY,UAAA;AAAA,QACZ,SAAA,EAAW,IAAA;AAAA,QACX,KAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW,KAAA;AAAA,MACX,QAAA,EAAU;AAAA;AACZ;AAEJ,CAAA;AAuBA,IAAM,iBAAA,GAA0B+D,OAAA,CAAA,UAAA;AAAA,EAC9B,CACE;AAAA,IACE,IAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,EAAU,YAAA;AAAA,IACV,UAAA,GAAa,UAAA;AAAA,IACb,QAAA,GAAW,OAAA;AAAA,IACX,OAAA;AAAA,IACA,OAAA,EAAS,WAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUA,iBAAS,KAAK,CAAA;AAEtD,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,gBAAA,CAAiB;AAAA,MACnB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAC,SAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAC,QAEhB,CAAC,CAAA;AAED,IAAA,MAAM,kBAAA,GAAqB,YAAY,UAAA,KAAe,MAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,KAAe,MAAA;AAEjD,IAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,WAAA;AAAA,MACxB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,WAAA,GAAc,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,WAAW;AAAA,KACd;AAEA,IAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,UAAA,GAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AAEA,IAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,WAAA;AAAA,MAC7B,CAAC,CAAA,KAAwB;AACvB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,IAAU;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAIA,IAAA,MAAM,UAAA,GAAmBA,eAAiC,IAAI,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAmC;AAClD,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,WAAA,IAC9B,GAAA,EAAM,GAAA,CAAyD,OAAA,GAAU,IAAA;AAAA,IACpF,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAwC;AAClE,MAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,6DAA6D,CAAA,EAAG;AAC9E,MAAA,UAAA,CAAW,SAAS,KAAA,EAAM;AAAA,IAC5B,CAAA;AAEA,IAAA,uBACErF,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAO,MAEpB,QAAA,kBAAAC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,QAC5B,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,SAAA,EAAW,EAAA;AAAA,UACT,yBAAA,CAA0B,EAAE,UAAA,EAAY,SAAA,EAAW,UAAU,CAAA;AAAA,UAC7D,gBAAA;AAAA,UACA,8CAAA;AAAA,UAAA,CACC,sBAAsB,aAAA,KAAkB,UAAA;AAAA,UACzC,kBAAA,IAAsB,+BAAA;AAAA,UACtB;AAAA,SACF;AAAA,QACA,OAAA,EAAS,kBAAA;AAAA,QAGP,QAAA,EAAA;AAAA,UAAA,CAAA,kBAAA,IAAsB,kCACtBD,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,qBAAqB,UAAA,GAAa,MAAA;AAAA,cACxC,KAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,UAAA;AAAA,cACA,SAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,0BAGFA,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,MACrB,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,oBAAA;AAAA,cACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,cAC5B,iBAAA,EAAiB,WAAW,OAAA,GAAU,MAAA;AAAA,cACtC,QAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,sHAAA;AAAA,gBACA,6BAAA;AAAA,gBACA,QAAA,IAAY,CAAC,QAAA,IAAY;AAAA,eAC3B;AAAA,cACA,OAAA,EAAS,WAAW,WAAA,GAAc,WAAA;AAAA,cAClC,MAAA,EAAQ,WAAW,UAAA,GAAa,UAAA;AAAA,cAE/B,QAAA,EAAA,QAAA,mBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAY,QAAA,EAAA,WAAA,EAAY,CAAA,mBAExCA,IAAC,MAAA,EAAA,EAAK,kBAAA,EAAgB,IAAA,EAAC,SAAA,EAAU,YAC9B,QAAA,EAAA,WAAA,EACH;AAAA;AAAA,WAEJ,EACF,CAAA;AAAA,UAGC,2BACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,kBAAA;AAAA,cACV,OAAA,EAAS,gBAAA;AAAA,cACT,QAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACT,0IAAA;AAAA,gBACA,iEAAA;AAAA,gBACA,kBAAA;AAAA,gBAAA,CACC,CAAC,YAAY,QAAA,KAAa;AAAA,eAC7B;AAAA,cACA,YAAA,EAAW,iCAAA;AAAA,cAEX,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA,WACxB;AAAA,0BAIFA,GAAAA,CAAC,KAAA,EAAA,EAAM,aAAA,EAAW,IAAA,EAAC,WAAU,yCAAA,EAA0C;AAAA;AAAA;AAAA,KACzE,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAahC,SAAS,UAAA,CAAW;AAAA,EAClB,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAAoB;AAClB,EAAA,MAAM,OAAA,GAAgBqF,eAAuB,IAAI,CAAA;AAGjD,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,CAAC,aAAA,EAAe;AACxC,IAAA,MAAM,aAAa,OAAA,CAAQ,OAAA,CAAQ,aAAA,CAAc,CAAA,aAAA,EAAgB,aAAa,CAAA,EAAA,CAAI,CAAA;AAClF,IAAA,IAAI,UAAA,IAAc,OAAO,UAAA,CAAW,cAAA,KAAmB,UAAA,EAAY;AACjE,MAAA,UAAA,CAAW,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,IAChD;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,uBACErF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,SAAA;AAAA,MAEZ,QAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,QAAQ,SAAA,EAAW;AAClD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,UAClB,OAAA,CAAQ,OAAA,EAAS,gBAAA,CAA8B,iBAAiB,KAAK;AAAC,SACxE;AACA,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,aAA4B,CAAA;AAC/D,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,SAAS,CAAA;AACrE,QAAA,MAAM,KAAA,GACJ,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,QAAA,IAAY,CAAA,GAAI,QAAA,GAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,GAAc,EAAA,GAAK,KAAA,CAAM,MAAA;AACjF,QAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,UAChB,MAAM,MAAA,GAAS,CAAA;AAAA,UACf,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,IAAS,EAAE,GAAA,KAAQ,WAAA,GAAc,IAAI,EAAA,CAAG;AAAA,SACtD;AACA,QAAA,KAAA,CAAM,IAAI,GAAG,KAAA,EAAM;AAAA,MACrB,CAAA;AAAA,MACA,SAAA,EAAU,wIAAA;AAAA,MAET,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,EAAA;AAAA,UACV,eAAA,EAAe,kBAAkB,MAAA,CAAO,KAAA;AAAA,UACxC,cAAY,MAAA,CAAO,KAAA;AAAA,UACnB,YAAA,EAAY,aAAA,KAAkB,MAAA,CAAO,KAAA,GAAQ,SAAA,GAAY,WAAA;AAAA,UACzD,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,UACpC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,YACvB;AAAA,UACF,CAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,kDAAA;AAAA,YACA,+BAAA;AAAA,YACA,gEAAA;AAAA,YACA,oBAAA;AAAA,YACA,aAAA,KAAkB,OAAO,KAAA,IAAS;AAAA,WACpC;AAAA,UAEC,QAAA,EAAA,MAAA,CAAO;AAAA,SAAA;AAAA,QArBH,MAAA,CAAO;AAAA,OAuBf;AAAA;AAAA,GACH;AAEJ;AAaO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,aAAK,MAAA,CAAO,SAAA;AAAA,IAC1B,QAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,KAAA;AAAA,IACA,UAAA,GAAa,UAAA;AAAA,IACb,QAAA;AAAA,IACA,YAAY,cAAA,GAAiB,CAAA;AAAA,IAC7B;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,QAAA,GAAqB,MAAM,QAAA,IAAY,OAAA;AAC7C,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,cAAc,CAAC,CAAA;AAGzD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUqF,iBAAS,KAAK,CAAA;AAG5C,EAAA,MAAM,MAAA,GAAeA,OAAA,CAAA,OAAA,CAAQ,MAAM,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AACrF,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,EAAO,QAAQ,CAAA;AAC7C,EAAA,MAAM,WAAA,GAAoBA,OAAA,CAAA,OAAA,CAAQ,MAAM,iBAAA,CAAkB,KAAA,EAAO,QAAQ,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAG7F,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAUA,iBAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,iBAAwB,IAAI,CAAA;AAC5E,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,iBAAwB,IAAI,CAAA;AAG5E,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAC9B,MAAA,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,IAChC;AAAA,EAEF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,MAAM,WAAA,GAAoBA,gBAAQ,MAAM,mBAAA,CAAoB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACjF,EAAA,MAAM,aAAA,GAAsBA,gBAAQ,MAAM,qBAAA,CAAsB,UAAU,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGzF,EAAA,MAAM,UAAA,GAAmBA,OAAA,CAAA,WAAA;AAAA,IACvB,CAAC,IAAA,EAAc,MAAA,EAAgB,MAAA,KAA0B;AACvD,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC3B,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA;AAC5B,QAAC,QAAA,CAAkD;AAAA,UAClD,IAAA,EAAM,CAAA;AAAA,UACN,MAAA,EAAQ,CAAA;AAAA,UACR,QAAS,MAAA,IAAU;AAAA,SACpB,CAAA;AAAA,MACH,CAAA,MAAO;AACJ,QAAC,QAAA,CAAkD,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,MACzE;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,GACrB;AAGA,EAAA,MAAM,gBAAA,GAAyBA,OAAA,CAAA,WAAA;AAAA,IAC7B,CAAC,GAAA,KAAgB;AACf,MAAA,cAAA,CAAe,GAAG,CAAA;AAElB,MAAA,MAAM,eAAA,GAAkB,QAAA,KAAa,OAAA,GAAW,aAAA,IAAiB,IAAA,GAAQ,IAAA;AACzE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,UAAA,CAAW,GAAA,EAAK,eAAe,eAAe,CAAA;AAC9C,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,aAAA,EAAe,QAAA,EAAU,UAAU;AAAA,GACrD;AAEA,EAAA,MAAM,kBAAA,GAA2BA,OAAA,CAAA,WAAA;AAAA,IAC/B,CAAC,GAAA,KAAgB;AACf,MAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,MAAA,MAAM,eAAA,GAAkB,QAAA,KAAa,OAAA,GAAW,aAAA,IAAiB,IAAA,GAAQ,IAAA;AACzE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,WAAA,EAAa,KAAK,eAAe,CAAA;AAC5C,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,aAAA,EAAe,QAAA,EAAU,UAAU;AAAA,GACnD;AAEA,EAAA,MAAM,kBAAA,GAA2BA,OAAA,CAAA,WAAA;AAAA,IAC/B,CAAC,GAAA,KAAgB;AACf,MAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,MAAA,IAAI,eAAe,aAAA,EAAe;AAChC,QAAA,UAAA,CAAW,WAAA,EAAa,eAAe,GAAG,CAAA;AAC1C,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,aAAA,EAAe,UAAU;AAAA,GACzC;AAGA,EAAA,MAAM,WAAA,GAAoBA,oBAAY,MAAM;AAC1C,IAAA,IAAI,aAAa,OAAA,EAAS;AACvB,MAAC,WAAkE,MAAS,CAAA;AAAA,IAC/E,CAAA,MAAO;AACJ,MAAC,WAAkE,MAAS,CAAA;AAAA,IAC/E;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEvB,EAAA,uBACEpF,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,cAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA,EAAU,QAAA;AAAA,QACV,WAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,WAAW,WAAA,GAAc,MAAA;AAAA,QAClC,WAAW,UAAA,EAAY;AAAA;AAAA,KACzB;AAAA,oBACAA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,2BAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,UACT,0EAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QACA,KAAA,EAAM,OAAA;AAAA,QAEN,QAAA,kBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA,KAAa,2BACZD,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,cAAA;AAAA,cACT,aAAA,EAAe,aAAA;AAAA,cACf,QAAA,EAAU,kBAAA;AAAA,cACV,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,0BAEFA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,WAAA;AAAA,cACT,aAAA,EAAe,WAAA;AAAA,cACf,QAAA,EAAU,gBAAA;AAAA,cACV,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,0BACAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,aAAA;AAAA,cACT,aAAA,EAAe,aAAA;AAAA,cACf,QAAA,EAAU,kBAAA;AAAA,cACV,YAAA,EAAW;AAAA;AAAA;AACb,SAAA,EACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AC5nBA,IAAM,YAAA,GAAqBsF,sBAA6C,MAAS,CAAA;AAEjF,SAAS,cAAA,GAAgC;AACvC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,OAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,UAAU,MAAA,GAAS,OAAA;AAC9E;AAEA,SAAS,aAAa,KAAA,EAA6B;AACjD,EAAA,IAAI,KAAA,KAAU,QAAA,EAAU,OAAO,cAAA,EAAe;AAC9C,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,UAAA,EAAkC;AACxD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAC9C,IAAA,IAAI,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,MAAA,IAAU,WAAW,QAAA,EAAU;AAClE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,EAAE,QAAA,EAAU,YAAA,GAAe,OAAA,EAAS,YAAW,EAAuB;AAC3F,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAUA,iBAAgB,MAAM;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,eAAe,UAAU,CAAA;AACxC,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AACA,IAAA,OAAO,YAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,CAAC,eAAe,gBAAgB,CAAA,GAAUA,iBAAwB,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAGjG,EAAMA,kBAAU,MAAM;AACpB,IAAA,gBAAA,CAAiB,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAMA,kBAAU,MAAM;AACpB,IAAA,IAAI,UAAU,QAAA,EAAU;AAExB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2B;AAC1C,MAAA,gBAAA,CAAiB,CAAA,CAAE,OAAA,GAAU,MAAA,GAAS,OAAO,CAAA;AAAA,IAC/C,CAAA;AAEA,IAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAC7C,IAAA,OAAO,MAAM,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAMA,kBAAU,MAAM;AACpB,IAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,IAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,cAAc,MAAM,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,gBAAgB,YAAY,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,gBAAgB,YAAY,CAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,QAAA,GAAiBA,OAAA,CAAA,WAAA;AAAA,IACrB,CAAC,QAAA,KAAoB;AACnB,MAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAI;AACF,UAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,QAC3C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,KAAA,GAAcA,OAAA,CAAA,OAAA;AAAA,IAClB,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,QAAA,EAAS,CAAA;AAAA,IACxC,CAAC,KAAA,EAAO,aAAA,EAAe,QAAQ;AAAA,GACjC;AAEA,EAAA,uBAAOtF,GAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AAEA,SAAS,QAAA,GAA8B;AACrC,EAAA,MAAM,OAAA,GAAgBsF,mBAAW,YAAY,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,gBAAA,GAAkD;AACzD,EAAA,OAAaA,mBAAW,YAAY,CAAA;AACtC;ACnGA,SAAS,MAAM,EAAE,YAAA,EAAc,UAAU,MAAA,EAAQ,GAAG,WAAU,EAA2B;AACvF,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,QAAA,EAAU,WAAA;AAAA,IACV,WAAA,EAAa,IAAA;AAAA,IACb,QAAA,EAAU,GAAA;AAAA,IACV,IAAA,EAAM,OAAA,GAAU,KAAA,CAAM,OAA6B,CAAA,GAAI,MAAA;AAAA,IACvD,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA,IACA,GAAG;AAAA,GACL;AAGA,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,SAAA;AACH,MAAA,OAAOC,OAAA,CAAY,OAAA,CAAQ,SAAA,CAAU,KAAA,EAAO;AAAA,QAC1C,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,OAAA;AACH,MAAA,OAAOA,OAAA,CAAY,KAAA,CAAM,SAAA,CAAU,KAAA,EAAO;AAAA,QACxC,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,GAAG;AAAA,OACJ,CAAA;AAAA,IACH,KAAK,SAAA;AACH,MAAA,OAAOA,OAAA,CAAY,OAAA,CAAQ,SAAA,CAAU,KAAA,EAAO;AAAA,QAC1C,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,GAAG;AAAA,OACJ,CAAA;AAAA,IACH;AACE,MAAA,OAAOA,OAAA,CAAY,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO;AAAA,QACvC,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,GAAG;AAAA,OACJ,CAAA;AAAA;AAEP;AAEA,IAAM,KAAA,GAAQ;AAAA,EACZ,yBAASvF,GAAAA,CAACwF,WAAAA,EAAA,EAAY,WAAU,gBAAA,EAAiB,CAAA;AAAA,EACjD,sBAAMxF,GAAAA,CAACU,IAAAA,EAAA,EAAK,WAAU,gBAAA,EAAiB,CAAA;AAAA,EACvC,yBAASV,GAAAA,CAACyF,aAAAA,EAAA,EAAc,WAAU,iBAAA,EAAkB,CAAA;AAAA,EACpD,uBAAOzF,GAAAA,CAAC0F,OAAAA,EAAA,EAAQ,WAAU,eAAA,EAAgB;AAC5C,CAAA;AASA,IAAM,OAAA,GAAU5F,gBAAAA,CAAM,UAAA,CAGpB,CAAC,OAAO,GAAA,KAAQ;AAChB,EAAA,MAAM,KAAA,GAAQ,kBAAiB,EAAG,aAAA;AAClC,EAAA,uBAAOE,GAAAA,CAAC2F,SAAA,EAAA,EAAc,GAAA,EAAU,KAAA,EAAe,GAAG,KAAA,EAAO,CAAA;AAC3D,CAAC;AACD,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"index.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst AccordionStickyContext = React.createContext(false)\n\ntype AccordionProps = React.ComponentProps<typeof AccordionPrimitive.Root> & {\n sticky?: boolean\n}\n\nfunction Accordion({ sticky = false, className, ...props }: AccordionProps) {\n return (\n <AccordionStickyContext.Provider value={sticky}>\n <AccordionPrimitive.Root\n data-slot='accordion'\n className={cn('w-full', className)}\n {...props}\n />\n </AccordionStickyContext.Provider>\n )\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return <AccordionPrimitive.Item data-slot='accordion-item' className={cn(className)} {...props} />\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n const sticky = React.useContext(AccordionStickyContext)\n return (\n <AccordionPrimitive.Header\n className={cn(\n 'flex border-t border-sys-divider-subtle',\n sticky &&\n 'sticky top-[var(--accordion-sticky-top,0px)] z-10 bg-sys-background-blur backdrop-blur-md',\n )}\n >\n <AccordionPrimitive.Trigger\n data-slot='accordion-trigger'\n className={cn(\n 'group flex w-full items-center gap-[8px] pl-[16px] pr-[8px] py-[14px]',\n 'text-h5 text-sys-text-main text-left',\n 'cursor-pointer transition-colors',\n 'hover:bg-secondary-o10 active:bg-secondary-o20',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:-outline-offset-1 focus-visible:relative focus-visible:z-10',\n 'disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <span className='flex flex-1 items-center gap-[8px] min-w-0 [&_svg]:size-[20px] [&_svg]:shrink-0'>\n {children}\n </span>\n <span className='flex size-[24px] shrink-0 items-center justify-center rounded-small p-[6px]'>\n <ChevronDown\n className='size-[12px] transition-transform duration-200 group-data-[state=open]:rotate-180'\n aria-hidden\n />\n </span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot='accordion-content'\n className={cn(\n 'overflow-hidden text-base-regular text-sys-text-subtle',\n 'data-[state=open]:animate-accordion-down',\n 'data-[state=closed]:animate-accordion-up',\n )}\n {...props}\n >\n <div\n className={cn('flex items-center justify-center px-[16px] pt-[16px] pb-[48px]', className)}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","'use client'\n\nimport * as React from 'react'\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\nimport { cva, VariantProps } from 'class-variance-authority'\nimport { CircleCheck, CircleX, Info, TriangleAlert } from 'lucide-react'\n\nimport { useRestoreFocusToOpener } from './_internal/useRestoreFocusToOpener'\nimport { cn } from '../utils/cn'\nimport { sanitizeUserText } from '../utils/sanitizeUserText'\nimport { Button, buttonVariants } from './button'\nimport { Stack } from './stack'\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n {...props}\n className={cn(\n 'fixed inset-0 z-[var(--root-z-index)] bg-sys-blanket',\n 'data-[state=open]:animate-[fade-in_0ms_ease-out,zoom-in_0ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_0ms_ease-in,zoom-out_0ms_ease-in]',\n className,\n )}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst alertDialogContentVariants = cva(null, {\n variants: {\n width: {\n small: 'w-[400px]',\n medium: 'w-[600px]',\n large: 'w-[800px]',\n xlarge: 'w-[1000px]',\n },\n },\n defaultVariants: {\n width: 'small',\n },\n})\n\ntype AlertDialogContextType = {\n variant?: 'success' | 'info' | 'warning' | 'danger'\n}\nconst AlertDialogContext = React.createContext<AlertDialogContextType>({\n variant: 'info',\n})\n\n/**\n * 확인 대화상자 본체. 되돌릴 수 없는 행동 직전의 최종 확인에만 쓴다.\n *\n * 언제 쓰나: 삭제·중지·초기화처럼 결과가 사라지는 행동. 제목에 대상 이름을 넣고, 확인 버튼은 `danger*` variant 로 행동 이름(\"삭제\")을 쓴다.\n * 언제 안 쓰나: 입력이 필요한 작업(→ Dialog), 단순 정보 안내(→ Alert·Toast), 되돌릴 수 있는 행동(확인 없이 실행 후 Toast).\n * 대신/함께: 실수 방지가 더 필요하면 이름을 입력해야 삭제되는 방식을 소비 앱에서 더한다.\n */\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> &\n VariantProps<typeof alertDialogContentVariants> &\n AlertDialogContextType\n>(({ className, width, variant, onOpenAutoFocus, onCloseAutoFocus, ...props }, ref) => {\n // 닫힐 때 포커스를 연 요소로 돌린다 — Radix 는 Trigger 가 없으면 body 로 떨어뜨린다\n const focusHandlers = useRestoreFocusToOpener({ onOpenAutoFocus, onCloseAutoFocus })\n return (\n <AlertDialogContext.Provider value={{ variant }}>\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n {...props}\n {...focusHandlers}\n ref={ref}\n className={cn(\n 'fixed left-[50%] top-[50%] z-[var(--root-z-index)] translate-x-[-50%] translate-y-[-50%] w-full max-w-[70vw]',\n 'grid gap-[16px] rounded-medium bg-sys-background p-[32px] shadow-gray-medium duration-200',\n 'data-[state=open]:animate-[fade-in_0ms_ease-out,zoom-in_0ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_0ms_ease-in,zoom-out_0ms_ease-in]',\n alertDialogContentVariants({ width }),\n className,\n )}\n />\n </AlertDialogPortal>\n </AlertDialogContext.Provider>\n )\n})\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = (props: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n {...props}\n className={cn('flex flex-col gap-[16px] text-center sm:text-left', props.className)}\n />\n)\nAlertDialogHeader.displayName = 'AlertDialogHeader'\n\nconst AlertDialogFooter = (props: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n {...props}\n className={cn('flex flex-row justify-end gap-[8px] sm:flex-row', props.className)}\n />\n)\nAlertDialogFooter.displayName = 'AlertDialogFooter'\n\nconst variantToIcon = {\n success: <CircleCheck className='text-success30' />,\n info: <Info className='text-sys-text-subtler' />,\n warning: <TriangleAlert className='text-critical30' />,\n danger: <CircleX className='text-danger30' />,\n} as const\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ children, ...props }, ref) => {\n const { variant } = React.useContext(AlertDialogContext)\n\n return (\n <Stack spacing={8}>\n {variantToIcon[variant || 'info']}\n <AlertDialogPrimitive.Title\n {...props}\n ref={ref}\n className={cn('text-h4 text-sys-text-main whitespace-pre-wrap', props.className)}\n >\n {sanitizeUserText(children)}\n </AlertDialogPrimitive.Title>\n </Stack>\n )\n})\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ children, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n {...props}\n ref={ref}\n className={cn('text-base-regular text-sys-text-main whitespace-pre-wrap', props.className)}\n >\n {sanitizeUserText(children)}\n </AlertDialogPrimitive.Description>\n))\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action> &\n Pick<VariantProps<typeof buttonVariants>, 'variant' | 'loading'>\n>(({ variant, loading, children, ...props }, ref) => {\n const { variant: dialogVariant } = React.useContext(AlertDialogContext)\n\n const buttonVariant = {\n success: 'primaryBold',\n info: 'primaryBold',\n warning: 'warningBold',\n danger: 'dangerBold',\n } as const\n\n return (\n <AlertDialogPrimitive.Action ref={ref} asChild {...props}>\n <Button variant={variant || buttonVariant[dialogVariant || 'info']} loading={loading}>\n {children}\n </Button>\n </AlertDialogPrimitive.Action>\n )\n})\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ children, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel ref={ref} asChild {...props}>\n <Button variant='secondary'>{children}</Button>\n </AlertDialogPrimitive.Cancel>\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { cn } from '../utils/cn'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip'\n\n/* -------------------------------- Breadcrumb ------------------------------ */\n\ntype BreadcrumbProps = React.ComponentPropsWithoutRef<'nav'> & {\n /** 하위 `BreadcrumbSeparator` 의 기본 구분자 (children 을 넘기지 않은 Separator 에 적용) */\n separator?: React.ReactNode\n}\n\nconst BreadcrumbSeparatorContext = React.createContext<React.ReactNode>(undefined)\n\nconst Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({ className, separator, ...props }, ref) => (\n <BreadcrumbSeparatorContext.Provider value={separator}>\n <nav ref={ref} aria-label='breadcrumb' className={cn('w-fit', className)} {...props} />\n </BreadcrumbSeparatorContext.Provider>\n ),\n)\nBreadcrumb.displayName = 'Breadcrumb'\n\n/* ------------------------------ BreadcrumbList ---------------------------- */\n\nconst BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol ref={ref} className={cn('flex items-center gap-[4px]', className)} {...props} />\n ),\n)\nBreadcrumbList.displayName = 'BreadcrumbList'\n\n/* ------------------------------ BreadcrumbItem ---------------------------- */\n\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li ref={ref} className={cn('flex items-center gap-[4px]', className)} {...props} />\n ),\n)\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nconst ICON_SLOT_CLASS = 'inline-flex shrink-0 items-center justify-center size-[16px]'\n\nfunction extractTruncateText(children: React.ReactNode): string {\n if (typeof children === 'string') return children\n if (React.isValidElement(children)) {\n const inner = (children.props as { children?: React.ReactNode })?.children\n if (typeof inner === 'string') return inner\n }\n return ''\n}\n\nfunction wrapAsChildWithIcons(\n children: React.ReactNode,\n leftIcon: React.ReactNode,\n rightIcon: React.ReactNode,\n): React.ReactNode {\n if (!React.isValidElement(children)) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Breadcrumb] asChild 와 함께 leftIcon/rightIcon 을 쓰려면 자식이 단일 React element 여야 합니다.',\n )\n }\n return children\n }\n const element = children as React.ReactElement<{ children?: React.ReactNode }>\n return React.cloneElement(element, {\n children: (\n <>\n {leftIcon ? <span className={ICON_SLOT_CLASS}>{leftIcon}</span> : null}\n {element.props.children}\n {rightIcon ? <span className={ICON_SLOT_CLASS}>{rightIcon}</span> : null}\n </>\n ),\n })\n}\n\n/* ------------------------------ BreadcrumbLink ---------------------------- */\n\ntype BreadcrumbLinkProps = React.ComponentPropsWithoutRef<'a'> & {\n asChild?: boolean\n truncate?: boolean\n maxLength?: number\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n}\n\nconst BreadcrumbLink = React.forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n (\n {\n className,\n asChild = false,\n truncate = false,\n maxLength = 20,\n leftIcon,\n rightIcon,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'a'\n\n const textContent = extractTruncateText(children)\n const isTruncated = truncate && textContent.length > maxLength\n const truncatedText = isTruncated ? textContent.slice(0, maxLength) : textContent\n\n const truncatedBody = (\n <span className='inline-flex items-center gap-[2px]'>\n <span className='whitespace-pre'>{truncatedText}</span>\n <span>...</span>\n </span>\n )\n\n const truncatedAsChildElement =\n isTruncated && React.isValidElement(children)\n ? React.cloneElement(\n children as React.ReactElement<{ children?: React.ReactNode }>,\n undefined,\n truncatedBody,\n )\n : children\n\n const linkBody = isTruncated ? truncatedBody : children\n\n const compChildren = (() => {\n if (asChild && (leftIcon || rightIcon)) {\n return wrapAsChildWithIcons(truncatedAsChildElement, leftIcon, rightIcon)\n }\n if (asChild) {\n return truncatedAsChildElement\n }\n return (\n <>\n {leftIcon ? <span className={ICON_SLOT_CLASS}>{leftIcon}</span> : null}\n {linkBody}\n {rightIcon ? <span className={ICON_SLOT_CLASS}>{rightIcon}</span> : null}\n </>\n )\n })()\n\n const linkContent = (\n <Comp\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-[4px] rounded-[3px]',\n // 2026-10-17 8차 E1: 헤더 틴트(#f4f8ff) 위에서 primary30 은 4.38:1 → primary40(6.67:1)\n 'whitespace-pre text-small-medium text-primary40',\n 'decoration-solid [text-decoration-skip-ink:none]',\n 'hover:underline',\n 'active:text-primary50 active:underline',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-sys-focus-ring-main',\n 'transition-colors',\n className,\n )}\n {...props}\n >\n {compChildren}\n </Comp>\n )\n\n if (isTruncated) {\n return (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>{linkContent}</TooltipTrigger>\n <TooltipContent className='px-[6px] py-[4px] rounded-[6px]'>\n <p className='whitespace-pre-wrap'>{textContent}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n }\n\n return linkContent\n },\n)\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\n/* ------------------------------ BreadcrumbPage ---------------------------- */\n\ntype BreadcrumbPageProps = React.ComponentPropsWithoutRef<'span'> & {\n truncate?: boolean\n maxLength?: number\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n}\n\nconst BreadcrumbPage = React.forwardRef<HTMLSpanElement, BreadcrumbPageProps>(\n (\n { className, truncate = false, maxLength = 20, leftIcon, rightIcon, children, ...props },\n ref,\n ) => {\n const textContent = extractTruncateText(children)\n const isTruncated = truncate && textContent.length > maxLength\n const truncatedText = isTruncated ? textContent.slice(0, maxLength) : textContent\n\n const pageBody = isTruncated ? (\n <span className='inline-flex items-center gap-[2px]'>\n <span className='whitespace-pre'>{truncatedText}</span>\n <span>...</span>\n </span>\n ) : (\n children\n )\n\n const pageContent = (\n <span\n ref={ref}\n role='link'\n aria-disabled='true'\n aria-current='page'\n className={cn(\n 'inline-flex items-center gap-[4px] whitespace-pre text-small-medium text-sys-text-subtle',\n className,\n )}\n {...props}\n >\n {leftIcon ? <span className={ICON_SLOT_CLASS}>{leftIcon}</span> : null}\n {pageBody}\n {rightIcon ? <span className={ICON_SLOT_CLASS}>{rightIcon}</span> : null}\n </span>\n )\n\n if (isTruncated) {\n return (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>{pageContent}</TooltipTrigger>\n <TooltipContent className='px-[6px] py-[4px] rounded-[6px]'>\n <p className='whitespace-pre-wrap'>{textContent}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n }\n\n return pageContent\n },\n)\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\n/* --------------------------- BreadcrumbSeparator -------------------------- */\n\ntype BreadcrumbSeparatorProps = React.ComponentPropsWithoutRef<'li'>\n\n// <ol> 의 직계 자식이 되므로 <li> 로 렌더한다 (span 이면 잘못된 목록 마크업)\nconst BreadcrumbSeparator = React.forwardRef<HTMLLIElement, BreadcrumbSeparatorProps>(\n ({ className, children, ...props }, ref) => {\n const separator = React.useContext(BreadcrumbSeparatorContext)\n return (\n <li\n ref={ref}\n role='presentation'\n aria-hidden='true'\n className={cn(\n 'inline-flex items-center text-small-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n {children ?? separator ?? '/'}\n </li>\n )\n },\n)\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { CaptionProps, DayPicker, useNavigation } from 'react-day-picker'\nimport { addYears, format, subYears } from 'date-fns'\nimport { ko } from 'date-fns/locale'\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport { IconButton } from './iconButton'\n\n// ============================================================================\n// Types & Context\n// ============================================================================\n\ntype CalendarView = 'days' | 'months' | 'years'\n\nconst CalendarViewContext = React.createContext<{\n setView: (view: CalendarView) => void\n numberOfMonths: number\n baseDisplayMonth: Date\n}>({ setView: () => {}, numberOfMonths: 1, baseDisplayMonth: new Date() })\n\n// ============================================================================\n// CalendarCaption — 모듈 레벨 선언 (BP-1: 참조 안정성)\n// ============================================================================\n\nfunction CalendarCaption({ displayMonth }: CaptionProps) {\n const { setView, numberOfMonths, baseDisplayMonth } = React.useContext(CalendarViewContext)\n const { goToMonth, previousMonth, nextMonth } = useNavigation()\n const caption = format(displayMonth, 'yyyy년 M월', { locale: ko })\n\n const isMultiMonth = numberOfMonths > 1\n const isFirstMonth =\n displayMonth.getFullYear() === baseDisplayMonth.getFullYear() &&\n displayMonth.getMonth() === baseDisplayMonth.getMonth()\n const showLeftNav = !isMultiMonth || isFirstMonth\n const showRightNav = !isMultiMonth || !isFirstMonth\n\n return (\n <div className='flex justify-between items-center pb-[12px] px-[8px]'>\n {/* 좌측 nav 그룹 */}\n <div className='flex items-center gap-[4px]'>\n {showLeftNav ? (\n <>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => goToMonth(subYears(displayMonth, 1))}\n aria-label='이전 년도'\n >\n <ChevronsLeft className='text-secondary60' />\n </IconButton>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => previousMonth && goToMonth(previousMonth)}\n aria-label='이전 월'\n >\n <ChevronLeft className='text-secondary60' />\n </IconButton>\n </>\n ) : (\n <div className='w-[60px]' />\n )}\n </div>\n\n {/* 캡션 (클릭 → months view) */}\n <button\n type='button'\n onClick={() => setView('months')}\n className='text-h6 text-secondary60 hover:text-primary40 cursor-pointer leading-[24px]'\n >\n {caption}\n </button>\n\n {/* 우측 nav 그룹 */}\n <div className='flex items-center gap-[4px]'>\n {showRightNav ? (\n <>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => nextMonth && goToMonth(nextMonth)}\n aria-label='다음 월'\n >\n <ChevronRight className='text-secondary60' />\n </IconButton>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => goToMonth(addYears(displayMonth, 1))}\n aria-label='다음 년도'\n >\n <ChevronsRight className='text-secondary60' />\n </IconButton>\n </>\n ) : (\n <div className='w-[60px]' />\n )}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// MonthsView\n// ============================================================================\n\ninterface MonthsViewProps {\n displayYear: number\n selectedMonth: number\n onSelectMonth: (month: number) => void\n onYearChange: (year: number) => void\n onViewChange: (view: CalendarView) => void\n}\n\nfunction MonthsView({\n displayYear,\n selectedMonth,\n onSelectMonth,\n onYearChange,\n onViewChange,\n}: MonthsViewProps) {\n const months = React.useMemo(() => Array.from({ length: 12 }, (_, i) => i), [])\n const rows = React.useMemo(\n () => [months.slice(0, 3), months.slice(3, 6), months.slice(6, 9), months.slice(9, 12)],\n [months],\n )\n const now = new Date()\n const isCurrentYear = displayYear === now.getFullYear()\n const currentMonth = now.getMonth()\n\n return (\n <>\n {/* 헤더: < 2024년 > */}\n <div className='flex justify-between items-center pb-[12px] px-[8px]'>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onYearChange(displayYear - 1)}\n aria-label='이전 년도'\n >\n <ChevronLeft className='text-secondary60' />\n </IconButton>\n <button\n type='button'\n onClick={() => onViewChange('years')}\n className='text-h6 text-secondary60 hover:text-primary40 cursor-pointer leading-[24px]'\n >\n {displayYear}년\n </button>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onYearChange(displayYear + 1)}\n aria-label='다음 년도'\n >\n <ChevronRight className='text-secondary60' />\n </IconButton>\n </div>\n\n {/* 4×3 월 그리드 */}\n <div\n role='grid'\n aria-label={`${displayYear}년 월 선택`}\n className='flex flex-col gap-[4px] py-[4px]'\n >\n {rows.map((row, ri) => (\n <div key={ri} role='row' className='flex justify-between'>\n {row.map((month) => {\n const isSelected = month === selectedMonth\n const isToday = isCurrentYear && month === currentMonth\n\n return (\n <div key={month} role='gridcell' className='flex-1'>\n <button\n type='button'\n onClick={() => onSelectMonth(month)}\n className={cn(\n 'min-h-[32px] w-full py-[4px] rounded-xsmall',\n 'text-base-regular text-sys-text-subtle',\n 'cursor-pointer hover:bg-secondary-o10 active:bg-secondary-o20 transition-colors',\n isSelected && '!text-primary40 !text-base-semibold',\n isToday &&\n !isSelected &&\n 'text-base-semibold relative after:content-[\"\"] after:absolute after:rounded-full after:h-[2px] after:w-[24px] after:bottom-[2px] after:left-1/2 after:-translate-x-1/2 after:bg-primary20',\n )}\n >\n {month + 1}월\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </>\n )\n}\n\n// ============================================================================\n// YearsView\n// ============================================================================\n\ninterface YearsViewProps {\n displayYear: number\n onSelectYear: (year: number) => void\n onRangeChange: (startYear: number) => void\n}\n\nfunction YearsView({ displayYear, onSelectYear, onRangeChange }: YearsViewProps) {\n const startYear = Math.floor(displayYear / 12) * 12\n const years = React.useMemo(\n () => Array.from({ length: 12 }, (_, i) => startYear + i),\n [startYear],\n )\n const rows = React.useMemo(\n () => [years.slice(0, 3), years.slice(3, 6), years.slice(6, 9), years.slice(9, 12)],\n [years],\n )\n const currentYear = new Date().getFullYear()\n\n return (\n <>\n {/* 헤더: < 시작년 - 끝년 > */}\n <div className='flex justify-between items-center pb-[12px] px-[8px]'>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onRangeChange(startYear - 12)}\n aria-label='이전 12년'\n >\n <ChevronLeft className='text-secondary60' />\n </IconButton>\n <span className='text-h6 text-secondary60 leading-[24px]'>\n {startYear}년 - {startYear + 11}년\n </span>\n <IconButton\n variant='secondaryLink'\n spacing='compact'\n onClick={() => onRangeChange(startYear + 12)}\n aria-label='다음 12년'\n >\n <ChevronRight className='text-secondary60' />\n </IconButton>\n </div>\n\n {/* 4×3 년도 그리드 */}\n <div\n role='grid'\n aria-label={`${startYear}년 - ${startYear + 11}년 선택`}\n className='flex flex-col gap-[4px] py-[4px]'\n >\n {rows.map((row, ri) => (\n <div key={ri} role='row' className='flex justify-between'>\n {row.map((year) => {\n const isCurrentYr = year === currentYear\n\n return (\n <div key={year} role='gridcell' className='flex-1'>\n <button\n type='button'\n onClick={() => onSelectYear(year)}\n className={cn(\n 'min-h-[32px] w-full py-[4px] rounded-xsmall',\n 'text-base-regular text-sys-text-subtle',\n 'cursor-pointer hover:bg-secondary-o10 active:bg-secondary-o20 transition-colors',\n isCurrentYr &&\n 'text-base-semibold relative after:content-[\"\"] after:absolute after:rounded-full after:h-[2px] after:w-[24px] after:bottom-[2px] after:left-1/2 after:-translate-x-1/2 after:bg-primary20',\n )}\n >\n {year}년\n </button>\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </>\n )\n}\n\n// ============================================================================\n// Calendar (Main)\n// ============================================================================\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker> & {\n className?: string\n classNames?: React.ComponentProps<typeof DayPicker>['classNames']\n showOutsideDays?: boolean\n /** 뷰 전환 비활성화 (항상 days view만 표시) */\n disableViewSwitching?: boolean\n}\n\nfunction Calendar({\n classNames: classNamesProp,\n className,\n showOutsideDays = true,\n disableViewSwitching = false,\n ...dayPickerProps\n}: CalendarProps) {\n const numberOfMonths = (dayPickerProps as { numberOfMonths?: number }).numberOfMonths ?? 1\n const [view, setView] = React.useState<CalendarView>('days')\n const [displayMonth, setDisplayMonth] = React.useState<Date>(\n dayPickerProps.defaultMonth ?? new Date(),\n )\n\n // 외부 month prop 동기화 (controlled mode 지원)\n const externalMonth = dayPickerProps.month\n React.useEffect(() => {\n if (externalMonth) setDisplayMonth(externalMonth)\n }, [externalMonth])\n\n const handleMonthChange = React.useCallback(\n (month: Date) => {\n setDisplayMonth(month)\n ;(dayPickerProps as { onMonthChange?: (month: Date) => void }).onMonthChange?.(month)\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [(dayPickerProps as { onMonthChange?: (month: Date) => void }).onMonthChange],\n )\n\n // view 전환 알림 (BP-4)\n const viewLabel =\n view === 'days'\n ? format(displayMonth, 'yyyy년 M월', { locale: ko })\n : view === 'months'\n ? `${displayMonth.getFullYear()}년 월 선택`\n : '년도 선택'\n\n // View 전환 핸들러\n const effectiveSetView = React.useMemo(\n () => (disableViewSwitching ? () => {} : setView),\n [disableViewSwitching],\n )\n\n const handleMonthSelect = React.useCallback((month: number) => {\n setDisplayMonth((prev) => new Date(prev.getFullYear(), month, 1))\n setView('days')\n }, [])\n\n const handleYearSelect = React.useCallback((year: number) => {\n setDisplayMonth((prev) => new Date(year, prev.getMonth(), 1))\n setView('months')\n }, [])\n\n const handleMonthsYearChange = React.useCallback((year: number) => {\n setDisplayMonth((prev) => new Date(year, prev.getMonth(), 1))\n }, [])\n\n const handleYearsRangeChange = React.useCallback((startYear: number) => {\n setDisplayMonth((prev) => new Date(startYear, prev.getMonth(), 1))\n }, [])\n\n // outside day 클릭 → 해당 월로 네비게이션\n const handleDayClick = React.useCallback(\n (date: Date, modifiers: Record<string, boolean>, e: React.MouseEvent) => {\n if (modifiers.outside) {\n const newMonth = new Date(date.getFullYear(), date.getMonth(), 1)\n handleMonthChange(newMonth)\n }\n // 외부 onDayClick 콜백 체이닝\n ;(dayPickerProps as { onDayClick?: (...args: unknown[]) => void }).onDayClick?.(\n date,\n modifiers,\n e,\n )\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [handleMonthChange, (dayPickerProps as { onDayClick?: unknown }).onDayClick],\n )\n\n const contextValue = React.useMemo(\n () => ({ setView: effectiveSetView, numberOfMonths, baseDisplayMonth: displayMonth }),\n [effectiveSetView, numberOfMonths, displayMonth],\n )\n\n return (\n <div\n className={cn(\n 'p-[24px]',\n numberOfMonths === 1 ? 'w-[342px]' : 'w-auto min-w-[342px]',\n className,\n )}\n >\n {/* View 전환 알림 (BP-4: aria-live) */}\n <span className='sr-only' aria-live='polite'>\n {viewLabel}\n </span>\n\n {view === 'days' && (\n <CalendarViewContext.Provider value={contextValue}>\n <DayPicker\n fixedWeeks\n showOutsideDays={showOutsideDays}\n locale={ko}\n classNames={{\n root: 'p-0 w-full',\n months: cn('flex gap-[16px]', numberOfMonths === 1 ? 'flex-col' : 'flex-row'),\n month: 'flex flex-col flex-1 min-w-[294px]',\n // caption/nav classNames은 커스텀 Caption이 대체하므로 미사용\n table: 'w-full border-collapse',\n head: '[&>tr]:flex',\n head_cell: 'text-sys-text-subtle text-small-bold flex-1 py-[8px]',\n row: 'flex w-full',\n cell: 'relative p-0 text-center flex-1 focus-within:z-20 [aria-selected]:bg-primary-o10',\n day: cn(\n 'min-h-[32px] w-full py-[4px] text-base-regular text-sys-text-subtle bg-none border-none rounded-xsmall',\n 'cursor-pointer hover:bg-secondary-o10 active:bg-secondary-o20 transition-colors',\n ),\n day_range_start: '!rounded-r-none bg-primary-o20',\n day_range_end: '!rounded-l-none bg-primary-o20',\n day_selected:\n 'bg-primary-o10 !text-primary40 !text-base-regular hover:bg-primary-o20',\n day_today: cn(\n 'rdp-day_today !text-base-semibold relative',\n 'after:content-[\"\"] after:absolute after:rounded-full after:h-[2px] after:w-[24px] after:bottom-[2px] after:left-1/2 after:-translate-x-1/2 after:bg-primary20',\n ),\n // 이웃 달 날짜는 클릭 가능한 버튼이라 대비 4.5:1 대상 — disabled 토큰(1.5:1) 대신 subtler(5.3:1)\n day_outside: 'rdp-day_outside !text-sys-text-subtler',\n day_range_middle: 'bg-primary-o10 !rounded-none',\n day_disabled: '!text-sys-text-disabled',\n day_hidden: 'invisible',\n ...classNamesProp,\n }}\n components={{\n Caption: CalendarCaption,\n }}\n {...dayPickerProps}\n month={displayMonth}\n onMonthChange={handleMonthChange}\n onDayClick={handleDayClick}\n />\n </CalendarViewContext.Provider>\n )}\n\n {view === 'months' && (\n <MonthsView\n displayYear={displayMonth.getFullYear()}\n selectedMonth={displayMonth.getMonth()}\n onSelectMonth={handleMonthSelect}\n onYearChange={handleMonthsYearChange}\n onViewChange={effectiveSetView}\n />\n )}\n\n {view === 'years' && (\n <YearsView\n displayYear={displayMonth.getFullYear()}\n onSelectYear={handleYearSelect}\n onRangeChange={handleYearsRangeChange}\n />\n )}\n </div>\n )\n}\n\nexport { Calendar }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\n/* -------------------------------------------------------------------------- */\n/* CheckboxSectionGroup */\n/* -------------------------------------------------------------------------- */\n\ntype CheckboxSectionGroupContextValue = {\n value: string[]\n onValueChange?: (value: string[]) => void\n disabled?: boolean\n /** 5개 이상 세로 쌓기일 때 카드 안을 한 줄(제목 · 설명)로 */\n stacked: boolean\n}\nconst CheckboxSectionGroupContext = React.createContext<CheckboxSectionGroupContextValue | null>(\n null,\n)\n\ninterface CheckboxSectionGroupProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n> {\n /** 선택된 값들. controlled 전제 */\n value: string[]\n /** 카드를 누를 때 바뀐 값 목록 */\n onValueChange?: (value: string[]) => void\n /** 가로(기본)·세로 배치 */\n orientation?: 'horizontal' | 'vertical'\n /** 그룹 전체 비활성 */\n disabled?: boolean\n}\n\n/**\n * 카드형 체크박스(CheckboxSection)들을 묶는 그룹 — 제목·설명이 붙는 복수 선택(알림 채널, 포함할 산출물 종류).\n *\n * 언제 쓰나: 선택지 2~4개에 각각 제목과 한 줄 설명이 붙고 여러 개를 고를 수 있을 때(dl-ui-v3 의 카드형 선택 관례를 복수 선택으로).\n * 가로 배치는 개수로 정한다 — 2~3개 한 줄(n 등분), 4개 2×2, 5개 이상 세로 쌓기(카드 안은 제목 · 설명 가로), 카드 사이 8px — RadioSectionGroup 과 같은 규칙(2026-10-21 19차: 한 줄 4px 로 몰려 \"cards sit too close together\"·\"uneven internal heights\").\n * 언제 안 쓰나: 하나만 고르면 RadioSectionGroup, 설명 없는 짧은 옵션은 Checkbox, 선택지가 많으면 MultiSelect, 켜기/끄기 하나는 SwitchSection.\n * 대신/함께: `role='group'` 이므로 이름은 `aria-labelledby`(FormLabel 의 id) 또는 `aria-label` 로 준다. 카드마다 Tab 으로 가고 Space 로 켜고 끈다. 폼에서는 `FormField` 의 `field.value`(string[])·`field.onChange` 를 `value`·`onValueChange` 에 연결한다.\n */\nfunction CheckboxSectionGroup({\n className,\n value,\n onValueChange,\n orientation = 'horizontal',\n disabled,\n children,\n ...props\n}: CheckboxSectionGroupProps) {\n const count = React.Children.count(children)\n // 가로 배치는 개수로 정한다 — RadioSectionGroup 과 같은 규칙(2~3 한 줄, 4 는 2×2, 5+ 세로 쌓기). 간격 8: 4 는 \"cards sit too close together\"(2026-10-21 19차)\n const stacked = orientation === 'horizontal' && count >= 5\n const effectiveOrientation = stacked ? 'vertical' : orientation\n const layoutClass =\n effectiveOrientation === 'vertical'\n ? 'flex flex-col'\n : count === 4\n ? 'grid w-full grid-cols-2'\n : count === 3\n ? 'grid w-full grid-cols-3'\n : count === 2\n ? 'grid w-full grid-cols-2'\n : 'flex w-full'\n return (\n <CheckboxSectionGroupContext.Provider value={{ value, onValueChange, disabled, stacked }}>\n <div\n role='group'\n data-slot='checkbox-section-group'\n className={cn('items-stretch gap-[8px]', layoutClass, className)}\n {...props}\n >\n {children}\n </div>\n </CheckboxSectionGroupContext.Provider>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* CheckboxSection */\n/* -------------------------------------------------------------------------- */\n\ninterface CheckboxSectionProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'value' | 'title' | 'type'\n> {\n /** 그룹의 value 배열과 맞출 값 */\n value: string\n /** 카드 제목 */\n title: React.ReactNode\n /** 한 줄 설명 */\n description?: React.ReactNode\n disabled?: boolean\n}\n\n/** 카드 안 체크 표시 — Checkbox 와 같은 모양의 표시 전용 요소(버튼 안에 버튼을 넣지 않는다) */\nfunction CheckMark({ checked, disabled }: { checked: boolean; disabled?: boolean }) {\n return (\n <span\n aria-hidden='true'\n className={cn(\n 'flex h-[16px] w-[16px] shrink-0 items-center justify-center rounded-xsmall border-[2px]',\n !checked && 'border-sys-divider-main bg-sys-background',\n checked && !disabled && 'border-primary30 bg-primary30',\n checked && disabled && 'border-primary-o20 bg-primary-o20',\n !checked && disabled && 'opacity-50',\n )}\n >\n {checked ? (\n <svg\n width='10'\n height='8'\n viewBox='0 0 10 8'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M9.2953 0.828385C9.68583 1.21891 9.68583 1.85207 9.2953 2.2426L4.24923 7.28867C4.24704 7.2909 4.24484 7.29313 4.24262 7.29534C4.04812 7.48985 3.79342 7.58748 3.53848 7.58823C3.28155 7.589 3.02438 7.49137 2.82835 7.29534C2.82614 7.29313 2.82394 7.29092 2.82176 7.28869L0.707088 5.17402C0.316564 4.7835 0.316564 4.15033 0.707088 3.75981C1.09761 3.36928 1.73078 3.36928 2.1213 3.75981L3.53549 5.17399L7.88109 0.828385C8.27161 0.437861 8.90478 0.437861 9.2953 0.828385Z'\n className='fill-sys-background'\n />\n </svg>\n ) : null}\n </span>\n )\n}\n\n/**\n * 카드형 체크박스 — 제목 + 설명이 있는 카드 안에 체크 표시. `CheckboxSectionGroup` 안에서 `value` 로 쓴다.\n *\n * 언제 쓰나: 설명이 붙는 복수 선택의 한 항목(RadioSection 의 복수 선택판). 카드 전체가 눌리고, 선택되면 2px 주조색 테두리(padding 으로 보정해 layout shift 없음).\n * 언제 안 쓰나: 그룹 밖 단독(→ Checkbox + Label), 하나만 고를 때(→ RadioSection).\n * 대신/함께: 네이티브 `<button role='checkbox'>` 라 Tab 으로 이동, Space·Enter 로 켜고 끈다. 안의 체크 표시는 표시 전용이다.\n */\nfunction CheckboxSection({\n value,\n title,\n description,\n disabled: disabledProp = false,\n className,\n onClick,\n ...props\n}: CheckboxSectionProps) {\n const group = React.useContext(CheckboxSectionGroupContext)\n const checked = group?.value.includes(value) ?? false\n const disabled = disabledProp || Boolean(group?.disabled)\n // 그룹이 5개 이상을 세로로 쌓을 때는 카드 안을 한 줄(제목 · 설명)로 — RadioSection 과 같은 규칙\n const stacked = Boolean(group?.stacked)\n\n const cardClassName = cn(\n 'bg-sys-background flex w-full flex-col items-start overflow-clip rounded-medium text-left appearance-none',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n // 테두리는 선택 여부와 무관하게 1px(layout shift 0) — 선택은 색 + 연한 채움으로. RadioSection·SwitchSection 과 같은 규칙(16차 D2 에서 빠진 것을 2026-10-20 17차에 맞춤 —\n // 체크박스 카드와 라디오 카드가 한 폼에 오면 \"noticeably different border and selection treatments\" 로 감점)\n 'border p-[12px]',\n !checked && 'border-sys-divider-main',\n checked && !disabled && 'border-primary30 bg-primary-o10',\n checked && disabled && 'border-primary-o20',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n className,\n )\n\n return (\n <button\n type='button'\n role='checkbox'\n aria-checked={checked}\n disabled={disabled}\n data-state={checked ? 'checked' : 'unchecked'}\n data-slot='checkbox-section'\n className={cardClassName}\n onClick={(e) => {\n onClick?.(e)\n if (e.defaultPrevented || disabled || !group) return\n group.onValueChange?.(\n checked ? group.value.filter((v) => v !== value) : [...group.value, value],\n )\n }}\n {...props}\n >\n <span className='flex w-full items-start gap-[4px]'>\n <span className='flex size-[24px] shrink-0 items-center justify-center p-[4px]'>\n <CheckMark checked={checked} disabled={disabled} />\n </span>\n <span\n data-slot='checkbox-section-text'\n className={cn(\n 'flex min-w-0 flex-1',\n stacked\n ? 'flex-row flex-wrap items-baseline gap-x-[12px] gap-y-[2px]'\n : 'flex-col items-start gap-[4px]',\n )}\n >\n <span\n className={cn(\n 'block break-keep text-h5 wrap-break-word',\n stacked ? 'shrink-0' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-main',\n )}\n >\n {title}\n </span>\n {description ? (\n <span\n className={cn(\n 'block break-keep text-base-regular wrap-break-word',\n stacked ? 'min-w-0 flex-1' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-subtle',\n )}\n >\n {description}\n </span>\n ) : null}\n </span>\n </span>\n </button>\n )\n}\n\nexport { CheckboxSection, CheckboxSectionGroup }\nexport type { CheckboxSectionGroupProps, CheckboxSectionProps }\n","/**\n * ColumnFilter 컴포넌트 타입 정의\n * 테이블/카드 목록 상단의 복합 검색 컴포넌트\n */\n\n// 컬럼 타입 정의\nexport type ColumnType = 'string' | 'number' | 'date' | 'select'\n\n// 문자열 연산자\nexport type StringOperator = '=' | '!=' | 'contains' | 'not_contains'\n\n// 숫자 연산자\nexport type NumberOperator = '=' | '!=' | '>' | '<' | '>=' | '<='\n\n// 통합 연산자 타입\nexport type Operator = StringOperator | NumberOperator\n\n// 컬럼 타입별 연산자 override\nexport type OperatorOverridesByType = Partial<Record<ColumnType, Operator[]>>\n\n// 컬럼 key별 연산자 override\nexport type OperatorOverridesByColumn = Partial<Record<string, Operator[]>>\n\n// 컬럼 정의\nexport interface ColumnDefinition {\n /** 컬럼 고유 키 */\n key: string\n /** 표시될 컬럼명 */\n label: string\n /** 컬럼 데이터 타입 */\n type: ColumnType\n /** select 타입일 경우 선택 옵션 */\n options?: { value: string; label: string }[]\n /** 컬럼 설명 (툴팁 등에 사용) */\n description?: string\n}\n\n// 필터 조건\nexport interface FilterCondition {\n /** 고유 ID */\n id: string\n /** 컬럼 키 */\n column: string\n /** 연산자 */\n operator: Operator\n /** 필터 값 */\n value: string | number\n}\n\n// 현재 편집 중인 필터 상태\nexport interface EditingFilter {\n /** 기존 필터 편집 시 원본 ID (신규면 undefined) */\n id?: string\n /** 선택된 컬럼 키 */\n column?: string\n /** 선택된 연산자 */\n operator?: Operator\n /** 입력 중인 값 */\n value?: string\n}\n\n// 팝오버 상태\nexport type PopoverType = 'column' | 'operator' | 'search' | 'value' | null\nexport type PopoverTrigger = 'input' | 'button' | null\nexport type AutocompleteFocusMode = 'input' | 'option'\n\n// 값 자동완성 제안 항목\nexport interface ValueSuggestion {\n /** 커밋되는 실제 값 */\n value: string\n /** 팝오버에 표시되는 텍스트 */\n label: string\n}\n\n// 팝오버 위치\nexport interface PopoverPosition {\n x: number\n y: number\n}\n\n// Context 타입\nexport interface ColumnFilterContextType {\n // 상태\n disabled?: boolean\n columns: ColumnDefinition[]\n filters: FilterCondition[]\n searchQuery: string\n\n // 현재 편집 중인 필터\n editingFilter: EditingFilter | null\n\n // 팝오버 상태\n activePopover: PopoverType\n popoverTrigger: PopoverTrigger\n popoverPosition: PopoverPosition | null\n\n // 액션\n addFilter: (filter: Omit<FilterCondition, 'id'>) => void\n removeFilter: (id: string) => void\n updateFilter: (id: string, updates: Partial<FilterCondition>) => void\n resetFilters: () => void\n setSearchQuery: (query: string) => void\n\n // 편집 액션\n selectColumn: (columnKey: string) => void\n selectOperator: (operator: Operator) => void\n setEditingValue: (value: string) => void\n commitFilter: () => void\n cancelEditing: () => void\n editExistingFilter: (id: string) => void\n\n // 편집 중인 기존 필터 ID (순서 보존용)\n editingFilterId: string | null\n\n // 팝오버 액션\n openPopover: (type: PopoverType, position?: PopoverPosition, trigger?: PopoverTrigger) => void\n closePopover: () => void\n\n // input-driven 컬럼 자동완성 상태\n columnSuggestionIndex: number\n setColumnSuggestionIndex: (index: number) => void\n autocompleteFocusMode: AutocompleteFocusMode\n setAutocompleteFocusMode: (mode: AutocompleteFocusMode) => void\n\n // 값 자동완성 상태\n valueSuggestions: ValueSuggestion[]\n valueSuggestionsLoading: boolean\n valueSuggestionIndex: number\n\n // 값 자동완성 액션\n setValueSuggestionIndex: (index: number) => void\n selectValueSuggestion: (value: string) => void\n\n // 검색 자동완성 상태\n searchSuggestions: ColumnDefinition[]\n searchSuggestionIndex: number\n\n // 검색 자동완성 액션\n setSearchSuggestionIndex: (index: number) => void\n selectSearchSuggestion: (columnKey: string) => void\n\n // 유틸리티\n getColumnByKey: (key: string) => ColumnDefinition | undefined\n getOperatorsForColumn: (columnKey: string) => Operator[]\n\n // 접근성 ID\n ids: {\n inputId: string\n columnListId: string\n operatorListId: string\n searchListId: string\n valueListId: string\n getColumnOptionId: (index: number) => string\n getOperatorOptionId: (index: number) => string\n getSearchOptionId: (index: number) => string\n getValueOptionId: (index: number) => string\n }\n}\n\n// 메인 컴포넌트 Props\nexport interface ColumnFilterProps {\n /** 필터링할 컬럼 정의 */\n columns: ColumnDefinition[]\n /** 현재 필터 조건 (controlled) */\n value?: FilterCondition[]\n /** 필터 변경 콜백 */\n onChange?: (filters: FilterCondition[]) => void\n /**\n * 통합 검색 쿼리 변경 콜백.\n *\n * 제공 여부가 검색 팝오버의 Enter 동작을 가른다.\n * - 제공: 첫 제안을 선점하지 않는다. 선택 없는 Enter는 입력 텍스트로 통합 검색을 확정한다.\n * - 미제공: 팝오버가 열리면 첫 제안이 하이라이트(`aria-activedescendant`)되어\n * ArrowDown 없는 Enter가 그 컬럼의 편집으로 진입한다. 자유 텍스트를 받을 곳이 없기 때문이다.\n */\n onSearch?: (query: string) => void\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 추가 CSS 클래스 */\n className?: string\n /** 비활성화 여부 */\n disabled?: boolean\n /** 값 자동완성 콜백. select 타입에 options가 있으면 무시됨 */\n getValueSuggestions?: (columnKey: string, query: string) => Promise<string[]> | string[]\n /** 컬럼 타입별 사용 가능 연산자 override. 지정하지 않으면 기본 연산자 목록을 사용한다. */\n operatorsByType?: OperatorOverridesByType\n /** 컬럼 key별 사용 가능 연산자 override. operatorsByType보다 우선한다. */\n operatorsByColumn?: OperatorOverridesByColumn\n}\n\n// 연산자 표시 라벨\nexport const OPERATOR_LABELS: Record<Operator, string> = {\n '=': '=',\n '!=': '≠',\n contains: '포함',\n not_contains: '제외',\n '>': '>',\n '<': '<',\n '>=': '≥',\n '<=': '≤',\n}\n\n// 컬럼 타입별 사용 가능 연산자\nexport const OPERATORS_BY_TYPE: Record<ColumnType, Operator[]> = {\n string: ['=', '!=', 'contains', 'not_contains'],\n number: ['=', '!=', '<', '>', '<=', '>='],\n date: ['=', '!=', '<', '>', '<=', '>='],\n select: ['=', '!='],\n}\n\n// 컬럼 타입별 기본 연산자\nexport const DEFAULT_OPERATOR_BY_TYPE: Record<ColumnType, Operator> = {\n string: 'contains',\n number: '=',\n date: '=',\n select: '=',\n}\n\nexport function isInvalidNumberFilterValue(\n column: ColumnDefinition | undefined,\n value: string | number | undefined,\n): boolean {\n if (column?.type !== 'number' || value == null) return false\n if (typeof value === 'number') return !Number.isFinite(value)\n return value.trim().length > 0 && !Number.isFinite(Number(value))\n}\n\n/** select 컬럼에서 옵션 value 또는 label과 대소문자 무시 일치하는 옵션 */\nfunction findMatchingSelectOption(column: ColumnDefinition | undefined, value: string | number) {\n if (column?.type !== 'select' || !column.options?.length) return undefined\n const query = String(value).trim().toLowerCase()\n if (!query) return undefined\n return column.options.find(\n (option) => option.value.toLowerCase() === query || option.label.toLowerCase() === query,\n )\n}\n\n/** number 컬럼의 비숫자 값, select 컬럼의 옵션 불일치 값을 invalid로 판정한다 */\nexport function isInvalidFilterValue(\n column: ColumnDefinition | undefined,\n value: string | number | undefined,\n): boolean {\n if (isInvalidNumberFilterValue(column, value)) return true\n if (column?.type !== 'select' || !column.options?.length || value == null) return false\n if (!String(value).trim()) return false\n return !findMatchingSelectOption(column, value)\n}\n\nexport function normalizeFilterValue(\n column: ColumnDefinition | undefined,\n value: string,\n): string | number {\n // select: 옵션 label로 입력해도 실제 value로 정규화 (불일치 값은 그대로 두고 invalid로 표시)\n if (column?.type === 'select') return findMatchingSelectOption(column, value)?.value ?? value\n if (column?.type !== 'number') return value\n const numericValue = Number(value)\n return Number.isFinite(numericValue) ? numericValue : value\n}\n","'use client'\n\nimport * as React from 'react'\nimport { debounce } from 'es-toolkit'\n\nimport { cn } from '../../utils/cn'\nimport {\n type AutocompleteFocusMode,\n type ColumnDefinition,\n type ColumnFilterContextType,\n type ColumnFilterProps,\n DEFAULT_OPERATOR_BY_TYPE,\n type EditingFilter,\n type FilterCondition,\n normalizeFilterValue,\n type Operator,\n OPERATORS_BY_TYPE,\n type PopoverPosition,\n type PopoverType,\n type ValueSuggestion,\n} from './types'\n\n// Context 생성\nconst ColumnFilterContext = React.createContext<ColumnFilterContextType | null>(null)\n\n// Context Hook\nexport function useColumnFilter() {\n const context = React.useContext(ColumnFilterContext)\n if (!context) {\n throw new Error('useColumnFilter must be used within a ColumnFilterProvider')\n }\n return context\n}\n\n// ID 생성 유틸\nfunction generateId(): string {\n return `filter-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n// Provider 컴포넌트\nexport function ColumnFilter({\n columns,\n value,\n onChange,\n onSearch,\n className,\n disabled,\n getValueSuggestions,\n operatorsByType,\n operatorsByColumn,\n children,\n}: ColumnFilterProps & { children: React.ReactNode }) {\n // 필터 상태 (controlled/uncontrolled 지원)\n const [internalFilters, setInternalFilters] = React.useState<FilterCondition[]>([])\n const filters = value ?? internalFilters\n\n // 통합 검색 쿼리\n const [searchQuery, setSearchQueryState] = React.useState('')\n\n // 현재 편집 중인 필터\n const [editingFilter, setEditingFilter] = React.useState<EditingFilter | null>(null)\n\n // 편집 중인 기존 필터 ID (순서 보존용)\n const [editingFilterId, setEditingFilterId] = React.useState<string | null>(null)\n\n // 팝오버 상태\n const [activePopover, setActivePopover] = React.useState<PopoverType>(null)\n const [popoverTrigger, setPopoverTrigger] = React.useState<'input' | 'button' | null>(null)\n const [popoverPosition, setPopoverPosition] = React.useState<PopoverPosition | null>(null)\n const reactId = React.useId()\n const idPrefix = React.useMemo(() => `column-filter-${reactId.replace(/:/g, '')}`, [reactId])\n\n // input-driven 컬럼 자동완성 선택 인덱스\n const [columnSuggestionIndex, setColumnSuggestionIndex] = React.useState(-1)\n const [autocompleteFocusMode, setAutocompleteFocusMode] =\n React.useState<AutocompleteFocusMode>('input')\n\n // 값 자동완성 상태\n const [valueSuggestions, setValueSuggestions] = React.useState<ValueSuggestion[]>([])\n const [valueSuggestionsLoading, setValueSuggestionsLoading] = React.useState(false)\n const [valueSuggestionIndex, setValueSuggestionIndex] = React.useState(-1)\n\n // 디바운스 fetch (race condition 방지용 requestId)\n const requestIdRef = React.useRef(0)\n const fetchSuggestionsRef = React.useRef<ReturnType<typeof debounce> | null>(null)\n\n React.useEffect(() => {\n fetchSuggestionsRef.current = debounce(async (columnKey: string, query: string) => {\n if (!getValueSuggestions) return\n const id = ++requestIdRef.current\n try {\n const result = await Promise.resolve(getValueSuggestions(columnKey, query))\n if (requestIdRef.current === id) {\n setValueSuggestions(result.map((s) => ({ value: s, label: s })))\n setValueSuggestionsLoading(false)\n }\n } catch {\n if (requestIdRef.current === id) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n }\n }\n }, 300)\n return () => {\n fetchSuggestionsRef.current?.cancel()\n }\n }, [getValueSuggestions])\n\n // editingFilter.value 변경 시 자동완성 데이터 갱신\n React.useEffect(() => {\n if (!editingFilter?.column || !editingFilter?.operator) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n\n const column = columns.find((c) => c.key === editingFilter.column)\n if (!column || (column.type !== 'string' && column.type !== 'select')) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n\n setValueSuggestionIndex(-1)\n const query = editingFilter.value || ''\n\n // Select 컬럼: 동기 로컬 필터링 (빈 쿼리 시 전체 표시)\n if (column.type === 'select' && column.options) {\n const q = query.toLowerCase()\n const filtered = q\n ? column.options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n )\n : column.options\n setValueSuggestions(filtered.map((o) => ({ value: o.value, label: o.label })))\n setValueSuggestionsLoading(false)\n return\n }\n\n // String 컬럼: 비동기 콜백\n if (!getValueSuggestions) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n if (!query.trim()) {\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n return\n }\n\n setValueSuggestionsLoading(true)\n fetchSuggestionsRef.current?.(editingFilter.column, query)\n }, [\n editingFilter?.column,\n editingFilter?.operator,\n editingFilter?.value,\n columns,\n getValueSuggestions,\n ])\n\n // 필터 추가\n const addFilter = React.useCallback(\n (filter: Omit<FilterCondition, 'id'>) => {\n const newFilter: FilterCondition = {\n ...filter,\n id: generateId(),\n }\n const newFilters = [...filters, newFilter]\n if (value === undefined) {\n setInternalFilters(newFilters)\n }\n onChange?.(newFilters)\n },\n [filters, value, onChange],\n )\n\n // 필터 제거\n const removeFilter = React.useCallback(\n (id: string) => {\n const newFilters = filters.filter((f) => f.id !== id)\n if (value === undefined) {\n setInternalFilters(newFilters)\n }\n onChange?.(newFilters)\n },\n [filters, value, onChange],\n )\n\n // 필터 업데이트\n const updateFilter = React.useCallback(\n (id: string, updates: Partial<FilterCondition>) => {\n const newFilters = filters.map((f) => (f.id === id ? { ...f, ...updates } : f))\n if (value === undefined) {\n setInternalFilters(newFilters)\n }\n onChange?.(newFilters)\n },\n [filters, value, onChange],\n )\n\n // 검색 쿼리 설정\n const setSearchQuery = React.useCallback(\n (query: string) => {\n setSearchQueryState(query)\n onSearch?.(query)\n },\n [onSearch],\n )\n\n const getConfiguredOperators = React.useCallback(\n (column: ColumnDefinition): Operator[] => {\n const columnOperators = operatorsByColumn?.[column.key]\n if (columnOperators?.length) return columnOperators\n\n const typeOperators = operatorsByType?.[column.type]\n if (typeOperators?.length) return typeOperators\n\n return OPERATORS_BY_TYPE[column.type]\n },\n [operatorsByColumn, operatorsByType],\n )\n\n // 팝오버 열기\n const openPopover = React.useCallback(\n (type: PopoverType, position?: PopoverPosition, trigger: 'input' | 'button' | null = null) => {\n setPopoverTrigger(type ? trigger : null)\n setAutocompleteFocusMode('input')\n setActivePopover(type)\n if (position) {\n setPopoverPosition(position)\n }\n },\n [],\n )\n\n // 팝오버 닫기\n const closePopover = React.useCallback(() => {\n setActivePopover(null)\n setPopoverTrigger(null)\n setAutocompleteFocusMode('input')\n }, [])\n\n // 컬럼 선택 (타입별 기본 연산자 자동 선택 → 바로 값 입력으로 이동)\n const selectColumn = React.useCallback(\n (columnKey: string) => {\n const column = columns.find((c) => c.key === columnKey)\n if (column) {\n const operators = getConfiguredOperators(column)\n const defaultOperator = DEFAULT_OPERATOR_BY_TYPE[column.type]\n const defaultOp = operators.includes(defaultOperator) ? defaultOperator : operators[0]\n if (!defaultOp) return\n\n setEditingFilter((prev) => ({\n ...prev,\n column: columnKey,\n operator: defaultOp,\n value: prev?.column === columnKey ? (prev?.value ?? '') : '',\n }))\n closePopover() // 팝오버 닫고 바로 값 입력으로 이동\n }\n },\n [columns, getConfiguredOperators, closePopover],\n )\n\n // 연산자 선택\n const selectOperator = React.useCallback(\n (operator: Operator) => {\n setEditingFilter((prev) =>\n prev\n ? {\n ...prev,\n operator,\n }\n : null,\n )\n closePopover()\n },\n [closePopover],\n )\n\n // 편집 값 설정\n const setEditingValue = React.useCallback((newValue: string) => {\n setEditingFilter((prev) =>\n prev\n ? {\n ...prev,\n value: newValue,\n }\n : null,\n )\n }, [])\n\n // 기존 필터를 편집 모드로 전환 (제거하지 않고 숨김 → 순서 보존)\n const editExistingFilter = React.useCallback(\n (id: string) => {\n const filter = filters.find((f) => f.id === id)\n if (!filter) return\n\n setEditingFilterId(id)\n setEditingFilter({\n column: filter.column,\n operator: filter.operator,\n value: String(filter.value),\n })\n closePopover()\n },\n [filters, closePopover],\n )\n\n // 필터 확정 내부 헬퍼 (commitFilter와 selectValueSuggestion이 공유)\n const doCommitFilter = React.useCallback(\n (overrideValue?: string) => {\n // 앞뒤 공백 제거 후 검증 — 공백만 입력된 값은 커밋하지 않는다.\n // (앱 레이어가 어차피 trim 후 drop하므로, 값 없는 유령 태그를 여기서 막는다)\n const valueToCommit = (overrideValue ?? editingFilter?.value)?.trim()\n if (!editingFilter?.column || !editingFilter?.operator || !valueToCommit) return\n\n const column = columns.find((c) => c.key === editingFilter.column)\n const finalValue = normalizeFilterValue(column, valueToCommit)\n\n if (editingFilterId) {\n // 기존 필터 in-place 업데이트 (순서 보존)\n updateFilter(editingFilterId, {\n column: editingFilter.column,\n operator: editingFilter.operator,\n value: finalValue,\n })\n } else {\n // 새 필터 추가\n addFilter({\n column: editingFilter.column,\n operator: editingFilter.operator,\n value: finalValue,\n })\n }\n // 전체 편집 state 정리\n setEditingFilter(null)\n setEditingFilterId(null)\n closePopover()\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n setValueSuggestionIndex(-1)\n fetchSuggestionsRef.current?.cancel()\n },\n [editingFilter, editingFilterId, columns, addFilter, updateFilter, closePopover],\n )\n\n // 필터 확정 (엔터 키)\n const commitFilter = React.useCallback(() => doCommitFilter(), [doCommitFilter])\n\n // 값 자동완성 제안 선택 → 즉시 커밋 + 정리\n const selectValueSuggestion = React.useCallback(\n (selectedValue: string) => {\n doCommitFilter(selectedValue)\n setValueSuggestions([])\n closePopover()\n setValueSuggestionIndex(-1)\n fetchSuggestionsRef.current?.cancel()\n },\n [doCommitFilter, closePopover],\n )\n\n // 편집 취소\n const cancelEditing = React.useCallback(() => {\n setEditingFilter(null)\n setEditingFilterId(null)\n closePopover()\n setValueSuggestions([])\n setValueSuggestionsLoading(false)\n setValueSuggestionIndex(-1)\n fetchSuggestionsRef.current?.cancel()\n }, [closePopover])\n\n // 필터 초기화 (cancelEditing 뒤에 선언 — 의존성으로 참조한다)\n const resetFilters = React.useCallback(() => {\n if (value === undefined) {\n setInternalFilters([])\n }\n onChange?.([])\n setSearchQueryState('')\n onSearch?.('')\n // 편집 중 초기화 시 editingFilterId가 사라진 필터를 가리켜 입력이 하나도 렌더되지 않는다.\n // 동기 정리여야 한다 — 아래 고아 감지 effect로 미루면 초기화 버튼의 rAF 재오픈 시점에\n // 검색 입력이 아직 마운트되지 않아 재오픈이 조용히 스킵된다.\n cancelEditing()\n }, [value, onChange, onSearch, cancelEditing])\n\n // 편집 중인 기존 필터가 외부 갱신으로 사라지면 편집 상태를 정리한다.\n // 내부 경로(resetFilters·편집 취소)는 동기 정리하므로 여기 도달 시점엔 이미 null — no-op.\n // 앱이 controlled value를 밖에서 비우는 경로(앱 자체 '필터 초기화' 버튼 등) 전용 안전망.\n React.useEffect(() => {\n if (editingFilterId && !filters.some((f) => f.id === editingFilterId)) {\n cancelEditing()\n }\n }, [filters, editingFilterId, cancelEditing])\n\n // 컬럼 키로 컬럼 조회\n const getColumnByKey = React.useCallback(\n (key: string) => {\n return columns.find((c) => c.key === key)\n },\n [columns],\n )\n\n // 컬럼에 사용 가능한 연산자 조회\n const getOperatorsForColumn = React.useCallback(\n (columnKey: string) => {\n const column = columns.find((c) => c.key === columnKey)\n if (!column) return []\n return getConfiguredOperators(column)\n },\n [columns, getConfiguredOperators],\n )\n\n // 검색 자동완성: searchQuery로 매칭 컬럼 필터링 + 정렬 (시작하는 것 우선, 한국어 정렬)\n const searchSuggestions = React.useMemo(() => {\n if (!searchQuery.trim()) return []\n const query = searchQuery.trim().toLowerCase()\n const startsWith = columns\n .filter((c) => c.label.toLowerCase().startsWith(query))\n .sort((a, b) => a.label.localeCompare(b.label, 'ko'))\n const includes = columns\n .filter(\n (c) => !c.label.toLowerCase().startsWith(query) && c.label.toLowerCase().includes(query),\n )\n .sort((a, b) => a.label.localeCompare(b.label, 'ko'))\n return [...startsWith, ...includes]\n }, [columns, searchQuery])\n\n // 검색 자동완성 선택 인덱스\n const [searchSuggestionIndex, setSearchSuggestionIndex] = React.useState(-1)\n\n const hasSearchHandler = Boolean(onSearch)\n\n // 검색어 변경 시 선택 인덱스 갱신.\n // onSearch 미제공 = 자유 텍스트만으로는 필터가 성립하지 않는 소비처이므로 첫 제안을 하이라이트해\n // ArrowDown 없는 Enter가 막다른 길이 되지 않게 한다. onSearch 제공 시에는 선점하지 않아\n // Enter가 입력 텍스트로 통합 검색을 확정한다.\n React.useEffect(() => {\n setSearchSuggestionIndex(hasSearchHandler || searchSuggestions.length === 0 ? -1 : 0)\n }, [searchQuery, hasSearchHandler, searchSuggestions.length])\n\n React.useEffect(() => {\n setColumnSuggestionIndex(-1)\n setAutocompleteFocusMode('input')\n }, [searchQuery, editingFilter?.column])\n\n // 검색 자동완성 제안 선택 → 컬럼 선택 + 검색어 초기화\n const selectSearchSuggestion = React.useCallback(\n (columnKey: string) => {\n selectColumn(columnKey)\n setSearchQueryState('')\n onSearch?.('')\n setSearchSuggestionIndex(-1)\n },\n [selectColumn, onSearch],\n )\n\n const contextValue: ColumnFilterContextType = {\n disabled,\n columns,\n filters,\n searchQuery,\n editingFilter,\n editingFilterId,\n activePopover,\n popoverTrigger,\n popoverPosition,\n addFilter,\n removeFilter,\n updateFilter,\n resetFilters,\n setSearchQuery,\n selectColumn,\n selectOperator,\n setEditingValue,\n commitFilter,\n cancelEditing,\n editExistingFilter,\n openPopover,\n closePopover,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n valueSuggestions,\n valueSuggestionsLoading,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n getColumnByKey,\n getOperatorsForColumn,\n ids: {\n inputId: `${idPrefix}-input`,\n columnListId: `${idPrefix}-column-list`,\n operatorListId: `${idPrefix}-operator-list`,\n searchListId: `${idPrefix}-search-list`,\n valueListId: `${idPrefix}-value-list`,\n getColumnOptionId: (index: number) => `${idPrefix}-column-option-${index}`,\n getOperatorOptionId: (index: number) => `${idPrefix}-operator-option-${index}`,\n getSearchOptionId: (index: number) => `${idPrefix}-search-option-${index}`,\n getValueOptionId: (index: number) => `${idPrefix}-value-option-${index}`,\n },\n }\n\n return (\n <ColumnFilterContext.Provider value={contextValue}>\n <div\n data-slot='column-filter'\n data-disabled={disabled ? '' : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n 'relative w-full',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed data-[disabled]:select-none',\n className,\n )}\n >\n {children}\n </div>\n </ColumnFilterContext.Provider>\n )\n}\n\n// Root 컴포넌트의 display name\nColumnFilter.displayName = 'ColumnFilter'\n","import * as React from 'react'\n\nimport { cn } from '../../utils/cn'\n\n/** X 모양 mask (lucide X와 동일한 path, strokeWidth 3) */\nconst X_MASK = `url(\"data:image/svg+xml,${encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"black\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>',\n)}\")`\n\nexport interface CancelIconProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 아이콘 전체 크기 (px). @default 20 */\n size?: number\n /** X 아이콘 색상 오버라이드 */\n iconClassName?: string\n}\n\nconst CancelIcon = React.forwardRef<HTMLSpanElement, CancelIconProps>(\n ({ size = 20, className, iconClassName, ...props }, ref) => {\n let innerSize = Math.round(size * 0.75)\n // 서브픽셀 센터링 방지: size와 innerSize의 홀짝을 맞춤\n if (size % 2 !== innerSize % 2) innerSize -= 1\n\n return (\n <span\n ref={ref}\n aria-hidden='true'\n className={cn(\n 'inline-flex items-center justify-center align-middle rounded-full bg-current',\n className,\n )}\n style={{ width: size, height: size }}\n {...props}\n >\n <span\n className={cn('block bg-current text-sys-background', iconClassName)}\n style={{\n width: innerSize,\n height: innerSize,\n maskImage: X_MASK,\n WebkitMaskImage: X_MASK,\n maskSize: 'contain',\n WebkitMaskSize: 'contain',\n }}\n />\n </span>\n )\n },\n)\nCancelIcon.displayName = 'CancelIcon'\n\n/**\n * 칸 겉면의 값 지우기 버튼은 칸에 마우스를 올리거나 칸 안에 포커스가 있을 때만 보인다\n * (2026-11-06 결정 — 늘 보이는 채워진 X 가 \"무겁다\"는 지적). opacity 만 바꿔 자리는 유지(레이아웃 이동 0).\n * 마우스가 없는 기기(hover: none)는 늘 보인다. 칸 래퍼에 `CLEAR_HOST_CLASS`, 버튼에 `CLEAR_REVEAL_CLASS`.\n */\nconst CLEAR_HOST_CLASS = 'group/clear-host'\nconst CLEAR_REVEAL_CLASS =\n 'opacity-0 group-hover/clear-host:opacity-100 group-focus-within/clear-host:opacity-100 [@media(hover:none)]:opacity-100'\n\nexport { CancelIcon, CLEAR_HOST_CLASS, CLEAR_REVEAL_CLASS }\n","const message = {\n common: {\n notice_search_result_empty: '검색 결과가 없습니다.',\n notice_no_selectable_option: '선택 가능한 옵션이 없습니다.',\n },\n}\n\nexport default message\n","'use client'\n\nimport * as React from 'react'\nimport { type DialogProps } from '@radix-ui/react-dialog'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Info, Search } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport message from '../utils/message'\nimport { Dialog, DialogContent, DialogTitle } from './dialog'\nimport { Stack } from './stack'\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-small bg-sys-background text-sys-text-main',\n className,\n )}\n // 대소문자 구분 없는 부분 일치 검색 (https://github.com/shadcn-ui/ui/issues/458#issuecomment-2435721826)\n filter={(value, search) => {\n if (value.toLowerCase().includes(search.toLowerCase())) return 1\n return 0\n }}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\ntype CommandDialogProps = DialogProps & {\n /** 화면에는 보이지 않고 보조기술에만 읽히는 다이얼로그 제목 */\n title?: string\n}\n\nconst CommandDialog = ({ children, title = '명령 검색', ...props }: CommandDialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className='overflow-hidden p-0' aria-describedby={undefined}>\n <DialogTitle className='sr-only'>{title}</DialogTitle>\n <Command className='[&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-sys-text-subtle [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-[8px] [&_[cmdk-input-wrapper]_svg]:h-[20px] [&_[cmdk-input-wrapper]_svg]:w-[20px] [&_[cmdk-input]]:h-[48px] [&_[cmdk-item]]:px-[8px] [&_[cmdk-item]]:py-[12px] [&_[cmdk-item]_svg]:h-[20px] [&_[cmdk-item]_svg]:w-[20px]'>\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\ntype CommandInputProps = React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input> & {\n wrapperClassName?: string\n iconClassName?: string\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n CommandInputProps\n>(\n (\n { className, wrapperClassName, iconClassName, placeholder, 'aria-label': ariaLabel, ...props },\n ref,\n ) => (\n <div\n className={cn(\n 'flex items-center border-b border-b-sys-divider-subtle px-[12px]',\n wrapperClassName,\n )}\n >\n <Search\n aria-hidden\n className={cn('mr-[8px] h-[16px] w-[16px] shrink-0 opacity-50', iconClassName)}\n />\n <CommandPrimitive.Input\n ref={ref}\n placeholder={placeholder}\n // role=combobox 입력은 placeholder 로 이름을 얻지 못한다 — 명시적 이름을 보장한다\n aria-label={ariaLabel ?? placeholder ?? '검색'}\n className={cn(\n 'flex h-[36px] w-full border-none bg-transparent px-[12px] py-0 text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-subtler disabled:cursor-not-allowed disabled:text-sys-text-disabled',\n className,\n )}\n {...props}\n />\n </div>\n ),\n)\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className='py-[24px] text-small-medium text-sys-text-subtlest text-center'\n {...props}\n >\n <Stack justifyContent='center' alignItems='center' spacing={6}>\n <Info size={16} className='text-sys-text-subtlest shrink-0' />\n {props.children || message.common.notice_no_selectable_option}\n </Stack>\n </CommandPrimitive.Empty>\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden [&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:py-[6px] [&_[cmdk-group-heading]]:text-small-medium [&_[cmdk-group-heading]]:text-sys-text-subtle',\n className,\n )}\n {...props}\n />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n // cmdk 가 role=separator 를 강제하는데 listbox 의 허용 자식이 아니다(axe aria-required-children). 장식이므로 숨긴다\n aria-hidden\n className={cn('-mx-[4px] h-px bg-sys-divider-subtler', className)}\n {...props}\n />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-pointer gap-[4px] select-none items-center overflow-hidden rounded-xsmall px-[8px] py-[2px] text-sys-text-main text-base-regular outline-none',\n 'hover:bg-secondary-o10 active:bg-secondary-o20 data-[selected=true]:bg-secondary-o10',\n 'data-[state=checked]:text-primary40 data-[state=checked]:text-base-medium data-[state=checked]:hover:bg-primary-o10 data-[state=checked]:active:bg-primary-o20 [&[data-state=checked][data-selected=true]]:bg-primary-o10',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:-outline-offset-1',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:cursor-not-allowed data-[disabled=true]:text-sys-text-disabled data-[disabled=true]:opacity-100',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-small-regular tracking-widest text-sys-text-subtler', className)}\n {...props}\n />\n )\n}\nCommandShortcut.displayName = 'CommandShortcut'\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Button, type ButtonProps } from './button'\nimport { Checkbox } from './checkbox'\nimport { CommandInput, CommandItem } from './command'\nimport { Spinner } from './spinner'\n\ntype TableFilterItemKind = 'default' | 'checkbox' | 'operator'\n\nconst itemStateClassName = cn(\n 'hover:bg-secondary-o10 active:bg-secondary-o20 data-[selected=true]:bg-secondary-o10',\n 'data-[state=checked]:text-primary40 data-[state=checked]:hover:bg-primary-o10 data-[state=checked]:active:bg-primary-o20 [&[data-state=checked][data-selected=true]]:bg-primary-o10',\n)\n\nconst itemBaseClassName = cn(\n 'relative flex cursor-pointer select-none items-center overflow-hidden rounded-xsmall text-sys-text-main outline-none transition-colors',\n 'focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n 'data-[disabled=true]:pointer-events-none data-[disabled=true]:cursor-not-allowed data-[disabled=true]:text-sys-text-disabled data-[disabled=true]:opacity-100',\n)\n\nconst itemKindClassName: Record<TableFilterItemKind, string> = {\n default: 'min-h-[28px] w-full gap-[4px] px-[8px] py-[2px] text-base-regular',\n checkbox: 'min-h-[28px] w-full gap-[4px] px-[6px] py-[2px] text-base-regular',\n operator: 'h-[28px] w-full gap-[4px] px-[8px] py-[4px] text-base-regular leading-[16px]',\n}\n\nconst operatorGlyphs: Record<string, string> = {\n '=': '=',\n '!=': '≠',\n '>': '>',\n '<': '<',\n '>=': '≥',\n '<=': '≤',\n contains: '포함',\n not_contains: '제외',\n}\n\nexport const tableFilterContentClassName = cn(\n 'flex w-[200px] flex-col items-start gap-[2px]',\n '[&_[cmdk-group-items]]:flex [&_[cmdk-group-items]]:w-[200px] [&_[cmdk-group-items]]:flex-col [&_[cmdk-group-items]]:items-start [&_[cmdk-group-items]]:gap-[2px]',\n)\n\nexport const tableFilterPopoverContentClassName = cn('!p-[8px] w-[220px] flex flex-col gap-[8px]')\n\nexport const tableFilterCommandClassName = cn('flex flex-col gap-[8px]')\n\nexport const tableFilterScrollbarClassName = cn(\n '[scrollbar-color:var(--color-sys-scroll-bar)_transparent] [scrollbar-width:thin]',\n '[&::-webkit-scrollbar]:w-[8px] [&::-webkit-scrollbar-track]:bg-transparent',\n '[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-sys-scroll-bar',\n)\n\nexport const tableFilterCommandListClassName = cn(\n 'w-[200px] max-h-[300px] overflow-y-auto overflow-x-hidden',\n tableFilterScrollbarClassName,\n)\n\n// heading 없는 CommandGroup(presentation > group)을 걷어내 listbox > option 구조를 유지하되,\n// 항목 레이아웃은 cmdk가 CommandList 안에 렌더하는 sizer div에 건다.\nexport const tableFilterCommandListSizerClassName = cn(\n '[&_[cmdk-list-sizer]]:flex [&_[cmdk-list-sizer]]:w-[200px] [&_[cmdk-list-sizer]]:flex-col',\n '[&_[cmdk-list-sizer]]:items-start [&_[cmdk-list-sizer]]:gap-[2px]',\n)\n\n/**\n * cmdk 검색 입력이 Space를 공백 문자로 흡수해 항목 토글이 Enter로만 가능한 것을 보완한다.\n * 검색어가 비어 있을 때만 Space를 가로채 하이라이트된 option을 토글한다\n * (multi-select listbox에서 Space로 option을 토글하는 것이 APG 표준 패턴).\n *\n * ponytail: 검색어 입력 중에는 공백 문자 입력이 우선이라 토글 불가. 두 동작이 같은 키를\n * 공유하는 한 분기 기준이 필요하고, 검색어 유무가 가장 적은 배선으로 얻는 신호다.\n * 검색 입력 없는 변형이 생기거나 cmdk 키 처리가 바뀌면 재확인 필요.\n */\nexport function handleTableFilterSpaceToggle(e: React.KeyboardEvent<HTMLDivElement>) {\n if (e.key !== ' ') return\n const root = e.currentTarget\n if (root.querySelector<HTMLInputElement>('[cmdk-input]')?.value) return\n const activeItem = root.querySelector<HTMLElement>('[cmdk-item][data-selected=\"true\"]')\n if (!activeItem) return\n e.preventDefault()\n activeItem.click()\n}\n\nexport const tableFilterOperatorContentClassName = cn('flex w-full flex-col items-start gap-[2px]')\n\nexport function getTableFilterOperatorGlyph(operator: string) {\n return operatorGlyphs[operator] ?? operator\n}\n\nexport function getTableFilterItemClassName({\n kind = 'default',\n selected = false,\n className,\n}: {\n kind?: TableFilterItemKind\n selected?: boolean\n className?: string\n}) {\n return cn(\n itemBaseClassName,\n itemKindClassName[kind],\n itemStateClassName,\n selected && 'text-primary40 text-base-medium',\n kind === 'operator' && 'leading-[16px]',\n className,\n )\n}\n\nexport function getTableFilterTextSlotClassName({\n selected = false,\n className,\n}: {\n selected?: boolean\n className?: string\n} = {}) {\n return cn(\n 'flex min-w-0 flex-1 items-center px-[4px]',\n selected ? 'text-base-medium text-primary40' : 'text-base-regular text-sys-text-main',\n className,\n )\n}\n\nexport interface TableFilterTriggerButtonProps extends Omit<ButtonProps, 'variant' | 'children'> {\n isSelected?: boolean\n isPlaceholder?: boolean\n rightIcon?: React.ReactNode\n children: React.ReactNode\n}\n\nexport const TableFilterTriggerButton = React.forwardRef<\n HTMLButtonElement,\n TableFilterTriggerButtonProps\n>(\n (\n { isSelected = false, isPlaceholder = false, rightIcon, className, children, ...props },\n ref,\n ) => {\n // 호출부가 role='combobox' 를 주면 자식 텍스트가 이름이 되지 않는다(axe button-name).\n // 표시 텍스트 span 을 aria-labelledby 로 연결한다. 호출부의 aria-label 이 있으면 {...props} 가 덮는다.\n const textId = React.useId()\n return (\n <Button\n ref={ref}\n variant={isSelected ? 'primary' : 'secondary'}\n className={cn(\n 'w-fit justify-between',\n isPlaceholder && !isSelected && 'text-sys-button-secondary-link-text',\n className,\n )}\n aria-labelledby={textId}\n {...props}\n >\n <span className='flex min-w-0 flex-1 items-center justify-center'>\n <span className='box-border flex h-[24px] min-w-0 flex-1 items-center justify-center px-[4px]'>\n <span className='flex min-w-0 flex-1 flex-col justify-center text-[14px] font-bold leading-[0]'>\n <span id={textId} className='text-h6 truncate'>\n {children}\n </span>\n </span>\n </span>\n </span>\n {rightIcon && (\n <span className='box-border flex h-[24px] shrink-0 items-center justify-center px-[4px]'>\n {rightIcon}\n </span>\n )}\n </Button>\n )\n },\n)\n\nTableFilterTriggerButton.displayName = 'TableFilterTriggerButton'\n\nexport type TableFilterSearchInputProps = React.ComponentPropsWithoutRef<typeof CommandInput>\n\nexport const TableFilterSearchInput = React.forwardRef<\n React.ElementRef<typeof CommandInput>,\n TableFilterSearchInputProps\n>(({ className, wrapperClassName, iconClassName, ...props }, ref) => (\n <CommandInput\n ref={ref}\n wrapperClassName={cn('h-[36px] w-[200px] shrink-0 px-[8px]', wrapperClassName)}\n iconClassName={cn('mr-[8px] h-[16px] w-[16px]', iconClassName)}\n className={cn('h-full px-0 text-base-medium', className)}\n {...props}\n />\n))\n\nTableFilterSearchInput.displayName = 'TableFilterSearchInput'\n\nexport type TableFilterCommandItemProps = React.ComponentPropsWithoutRef<typeof CommandItem> & {\n kind?: TableFilterItemKind\n isSelected?: boolean\n}\n\nexport const TableFilterCommandItem = React.forwardRef<\n React.ElementRef<typeof CommandItem>,\n TableFilterCommandItemProps\n>(({ kind = 'default', isSelected = false, className, ...props }, ref) => (\n <CommandItem\n ref={ref}\n data-state={isSelected ? 'checked' : 'unchecked'}\n className={getTableFilterItemClassName({ kind, selected: isSelected, className })}\n {...props}\n />\n))\n\nTableFilterCommandItem.displayName = 'TableFilterCommandItem'\n\nexport interface TableFilterCheckboxCommandItemProps extends Omit<\n TableFilterCommandItemProps,\n 'kind' | 'isSelected' | 'children'\n> {\n checked: boolean\n children: React.ReactNode\n contentClassName?: string\n}\n\nexport const TableFilterCheckboxCommandItem = React.forwardRef<\n React.ElementRef<typeof CommandItem>,\n TableFilterCheckboxCommandItemProps\n>(({ checked, children, className, contentClassName, ...props }, ref) => (\n <TableFilterCommandItem\n ref={ref}\n kind='checkbox'\n isSelected={checked}\n // 인터랙션 단위는 항목이지 내부 체크박스가 아니다 — 상태는 option에 싣고\n // 이름은 항목 텍스트로 계산되게 둔다.\n aria-checked={checked}\n className={className}\n {...props}\n >\n <span className='flex size-[24px] shrink-0 items-center justify-center p-[4px]'>\n {/* 장식 — 접근성 이름 없는 button[role=checkbox]가 트리에 중복 노출되는 것을 막는다 */}\n <Checkbox checked={checked} tabIndex={-1} aria-hidden />\n </span>\n <span\n className={getTableFilterTextSlotClassName({\n selected: checked,\n className: contentClassName,\n })}\n >\n {children}\n </span>\n </TableFilterCommandItem>\n))\n\nTableFilterCheckboxCommandItem.displayName = 'TableFilterCheckboxCommandItem'\n\nexport function TableFilterOperatorGlyph({\n operator,\n className,\n}: {\n operator: string\n className?: string\n}) {\n return (\n <span\n className={cn(\n 'inline-flex min-h-[16px] min-w-[16px] items-center justify-center px-[2px]',\n className,\n )}\n >\n {getTableFilterOperatorGlyph(operator)}\n </span>\n )\n}\n\nexport interface TableFilterLoadingItemProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string\n}\n\nexport function TableFilterLoadingItem({\n label = '로드 중',\n className,\n ...props\n}: TableFilterLoadingItemProps) {\n return (\n <div\n role='status'\n className={cn(\n 'flex h-[36px] w-[200px] items-center justify-center gap-[8px] overflow-hidden rounded-xsmall py-[6px] pl-[2px] pr-[6px]',\n 'text-small-medium text-sys-text-subtlest',\n className,\n )}\n {...props}\n >\n <Spinner size='medium' variant='secondary' className='shrink-0' />\n <span className='whitespace-nowrap'>{label}</span>\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Check } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport {\n getTableFilterItemClassName,\n getTableFilterTextSlotClassName,\n tableFilterContentClassName,\n TableFilterLoadingItem,\n tableFilterOperatorContentClassName,\n TableFilterOperatorGlyph,\n tableFilterScrollbarClassName,\n} from '../tableFilterParts'\nimport { useColumnFilter } from './ColumnFilter'\nimport { OPERATOR_LABELS } from './types'\n\nconst FOCUS_RING_MAIN_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-main)',\n} satisfies React.CSSProperties\n\n// 공통 팝오버 컨텐츠 스타일\nconst popoverContentStyles = cn(\n 'fixed z-[9999] rounded-medium bg-sys-background shadow-gray-small outline-none border border-sys-divider-subtler',\n 'animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n)\n\n/** 컬럼 선택 팝오버 (2-column: 목록 + 설명) */\nexport function ColumnSelectPopover() {\n const {\n columns,\n activePopover,\n popoverTrigger,\n closePopover,\n selectColumn,\n editingFilter,\n popoverPosition,\n ids,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const columnItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n const [hoveredColumn, setHoveredColumn] = React.useState<string | null>(null)\n const [focusedColumnIndex, setFocusedColumnIndex] = React.useState(0)\n\n const hoveredColumnDef = hoveredColumn ? columns.find((c) => c.key === hoveredColumn) : null\n const hasAnyDescription = columns.some((c) => c.description)\n const isInputDriven = popoverTrigger === 'input'\n const selectedColumnIndex = Math.max(\n 0,\n editingFilter?.column ? columns.findIndex((column) => column.key === editingFilter.column) : 0,\n )\n const activeColumnIndex = isInputDriven\n ? columnSuggestionIndex >= 0\n ? columnSuggestionIndex\n : 0\n : focusedColumnIndex\n\n const focusInput = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.getElementById(ids.inputId)?.focus()\n })\n }, [ids.inputId])\n\n const focusNextAfterColumn = React.useCallback(() => {\n requestAnimationFrame(() => {\n const nextElement =\n document.querySelector<HTMLInputElement>('[data-column-filter-value-input]') ??\n document.querySelector<HTMLButtonElement>('[data-operator-button]') ??\n document.getElementById(ids.inputId)\n nextElement?.focus()\n })\n }, [ids.inputId])\n\n const focusColumnItem = React.useCallback(\n (index: number) => {\n if (columns.length === 0) return\n const nextIndex = ((index % columns.length) + columns.length) % columns.length\n if (isInputDriven) {\n setAutocompleteFocusMode('option')\n setColumnSuggestionIndex(nextIndex)\n }\n setFocusedColumnIndex(nextIndex)\n setHoveredColumn(columns[nextIndex]?.key ?? null)\n requestAnimationFrame(() => {\n columnItemRefs.current[nextIndex]?.focus()\n })\n },\n [columns, isInputDriven, setAutocompleteFocusMode, setColumnSuggestionIndex],\n )\n\n const returnFocusToInput = React.useCallback(() => {\n setAutocompleteFocusMode('input')\n focusInput()\n }, [focusInput, setAutocompleteFocusMode])\n\n React.useEffect(() => {\n if (activePopover !== 'column' || columns.length === 0) return\n\n if (isInputDriven) {\n const nextIndex = columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0\n setColumnSuggestionIndex(nextIndex)\n setHoveredColumn(columns[nextIndex]?.key ?? null)\n return\n }\n\n setFocusedColumnIndex(selectedColumnIndex)\n setHoveredColumn(columns[selectedColumnIndex]?.key ?? null)\n requestAnimationFrame(() => {\n columnItemRefs.current[selectedColumnIndex]?.focus()\n })\n }, [\n activePopover,\n columns,\n selectedColumnIndex,\n isInputDriven,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n ])\n\n // 열릴 때 하이라이트된 컬럼으로 스크롤 (selectContent.tsx:27-34과 같은 패턴)\n React.useEffect(() => {\n if (activePopover !== 'column') return\n requestAnimationFrame(() => {\n popoverRef.current\n ?.querySelector('[aria-selected=\"true\"]')\n ?.scrollIntoView({ block: 'nearest' })\n })\n }, [activePopover])\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'column') return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (isInputDriven && document.getElementById(ids.inputId)?.contains(target)) {\n return\n }\n if (popoverRef.current && !popoverRef.current.contains(target)) {\n closePopover()\n }\n }\n\n // 약간의 딜레이 후 이벤트 등록 (클릭으로 열린 직후 바로 닫히는 것 방지)\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover, ids.inputId, isInputDriven])\n\n if (activePopover !== 'column' || !popoverPosition) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='column-select-popover'\n className={cn(popoverContentStyles, 'p-[8px]')}\n style={{\n top: popoverPosition.y + 8,\n left: popoverPosition.x,\n }}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div className='flex gap-[4px]'>\n {/* 왼쪽: 컬럼 목록 */}\n <div\n id={ids.columnListId}\n role={isInputDriven ? 'listbox' : 'menu'}\n className={cn(\n tableFilterContentClassName,\n 'max-h-[324px] overflow-y-auto overflow-x-hidden',\n tableFilterScrollbarClassName,\n )}\n >\n {columns.map((column, index) => {\n const isSelected = editingFilter?.column === column.key\n const isActive = index === activeColumnIndex\n\n return (\n <div\n key={column.key}\n ref={(node) => {\n columnItemRefs.current[index] = node\n }}\n id={ids.getColumnOptionId(index)}\n role={isInputDriven ? 'option' : 'menuitem'}\n tabIndex={\n isInputDriven\n ? autocompleteFocusMode === 'option' && isActive\n ? 0\n : -1\n : index === focusedColumnIndex\n ? 0\n : -1\n }\n aria-selected={isInputDriven ? isActive : undefined}\n className={getTableFilterItemClassName({\n selected: isInputDriven ? isActive : isSelected,\n })}\n onMouseDown={(e) => {\n if (isInputDriven) e.preventDefault()\n }}\n onClick={() => {\n selectColumn(column.key)\n focusNextAfterColumn()\n }}\n onMouseEnter={() => {\n setHoveredColumn(column.key)\n if (isInputDriven) {\n setColumnSuggestionIndex(index)\n } else {\n setFocusedColumnIndex(index)\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectColumn(column.key)\n focusNextAfterColumn()\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusColumnItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusColumnItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusColumnItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusColumnItem(columns.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n returnFocusToInput()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n returnFocusToInput()\n }\n return\n }\n if (\n isInputDriven &&\n e.key.length === 1 &&\n !e.metaKey &&\n !e.ctrlKey &&\n !e.altKey\n ) {\n e.preventDefault()\n returnFocusToInput()\n return\n }\n if (\n isInputDriven &&\n (e.key === 'Backspace' ||\n e.key === 'Delete' ||\n e.key === 'ArrowLeft' ||\n e.key === 'ArrowRight')\n ) {\n e.preventDefault()\n returnFocusToInput()\n }\n }}\n >\n <Check size={16} className={cn(isSelected ? 'text-primary50' : 'invisible')} />\n <span className={getTableFilterTextSlotClassName({ selected: isSelected })}>\n {column.label}\n </span>\n </div>\n )\n })}\n </div>\n\n {/* 오른쪽: 호버된 컬럼 설명 (description이 있는 컬럼이 하나라도 있을 때만) */}\n {hasAnyDescription && hoveredColumnDef?.description && (\n <div className='border-l border-sys-divider-subtler px-[16px] py-[12px] min-w-[160px] max-w-[200px]'>\n <div className='text-base-semibold text-sys-text-main pb-[4px] mb-[4px] border-b border-sys-divider-subtler'>\n {hoveredColumnDef.label}\n </div>\n <div\n className={cn(\n 'text-small-regular text-sys-text-subtler',\n 'max-h-[243px] overflow-y-auto overflow-x-hidden break-keep wrap-break-word',\n tableFilterScrollbarClassName,\n )}\n >\n {hoveredColumnDef.description}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nColumnSelectPopover.displayName = 'ColumnSelectPopover'\n\n/** 연산자 선택 팝오버 */\nexport function OperatorSelectPopover() {\n const {\n activePopover,\n closePopover,\n selectOperator,\n editingFilter,\n getOperatorsForColumn,\n popoverPosition,\n ids,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const operatorItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n const [focusedOperatorIndex, setFocusedOperatorIndex] = React.useState(0)\n\n const operators = editingFilter?.column ? getOperatorsForColumn(editingFilter.column) : []\n const selectedOperatorIndex = Math.max(\n 0,\n editingFilter?.operator ? operators.indexOf(editingFilter.operator) : 0,\n )\n\n const focusOperatorButton = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.querySelector<HTMLButtonElement>('[data-operator-button]')?.focus()\n })\n }, [])\n\n const focusNextAfterOperator = React.useCallback(() => {\n requestAnimationFrame(() => {\n const nextElement =\n document.querySelector<HTMLInputElement>('[data-column-filter-value-input]') ??\n document.querySelector<HTMLButtonElement>('[data-editing-cancel-button]') ??\n document.querySelector<HTMLButtonElement>('[data-column-filter-reset-button]')\n nextElement?.focus()\n })\n }, [])\n\n const focusOperatorItem = React.useCallback(\n (index: number) => {\n if (operators.length === 0) return\n const nextIndex = (index + operators.length) % operators.length\n setFocusedOperatorIndex(nextIndex)\n requestAnimationFrame(() => {\n operatorItemRefs.current[nextIndex]?.focus()\n })\n },\n [operators.length],\n )\n\n React.useEffect(() => {\n if (activePopover !== 'operator' || operators.length === 0) return\n\n setFocusedOperatorIndex(selectedOperatorIndex)\n requestAnimationFrame(() => {\n operatorItemRefs.current[selectedOperatorIndex]?.focus()\n })\n }, [activePopover, operators.length, selectedOperatorIndex])\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'operator') return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n closePopover()\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover])\n\n if (activePopover !== 'operator' || !popoverPosition) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='operator-select-popover'\n role='menu'\n id={ids.operatorListId}\n className={cn(popoverContentStyles, 'w-[100px] p-[8px]')}\n style={{\n top: popoverPosition.y + 8,\n left: popoverPosition.x,\n }}\n >\n <div className={tableFilterOperatorContentClassName}>\n {operators.map((operator, index) => {\n const isSelected = editingFilter?.operator === operator\n\n return (\n <div\n key={operator}\n ref={(node) => {\n operatorItemRefs.current[index] = node\n }}\n role='menuitemradio'\n id={ids.getOperatorOptionId(index)}\n tabIndex={index === focusedOperatorIndex ? 0 : -1}\n aria-checked={isSelected}\n aria-label={OPERATOR_LABELS[operator]}\n className={getTableFilterItemClassName({ kind: 'operator', selected: isSelected })}\n style={FOCUS_RING_MAIN_STYLE}\n onClick={() => {\n selectOperator(operator)\n focusNextAfterOperator()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectOperator(operator)\n focusNextAfterOperator()\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusOperatorItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusOperatorItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusOperatorItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusOperatorItem(operators.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n focusOperatorButton()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n focusOperatorButton()\n } else {\n e.preventDefault()\n focusNextAfterOperator()\n }\n }\n }}\n >\n <Check\n size={16}\n className={cn('absolute left-[8px]', isSelected ? 'text-primary50' : 'invisible')}\n />\n <span className='flex min-w-0 flex-1 items-center justify-center px-[4px]'>\n <TableFilterOperatorGlyph operator={operator} />\n </span>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nOperatorSelectPopover.displayName = 'OperatorSelectPopover'\n\n/** 검색 자동완성 팝오버 */\nexport function SearchSuggestionPopover() {\n const {\n activePopover,\n popoverPosition,\n closePopover,\n ids,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const suggestionItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n\n const focusInput = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.getElementById(ids.inputId)?.focus()\n })\n }, [ids.inputId])\n\n const focusSearchItem = React.useCallback(\n (index: number) => {\n if (searchSuggestions.length === 0) return\n const nextIndex =\n ((index % searchSuggestions.length) + searchSuggestions.length) % searchSuggestions.length\n setAutocompleteFocusMode('option')\n setSearchSuggestionIndex(nextIndex)\n requestAnimationFrame(() => {\n suggestionItemRefs.current[nextIndex]?.focus()\n })\n },\n [searchSuggestions.length, setAutocompleteFocusMode, setSearchSuggestionIndex],\n )\n\n const returnFocusToInput = React.useCallback(() => {\n setAutocompleteFocusMode('input')\n focusInput()\n }, [focusInput, setAutocompleteFocusMode])\n\n // 첫 제안 선점 여부는 onSearch 유무에 따라 ColumnFilter가 결정한다 (여기서 다시 손대지 않는다)\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'search') return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (document.getElementById(ids.inputId)?.contains(target)) {\n return\n }\n if (popoverRef.current && !popoverRef.current.contains(target)) {\n closePopover()\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover, ids.inputId])\n\n if (activePopover !== 'search' || searchSuggestions.length === 0 || !popoverPosition) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='search-suggestion-popover'\n className={cn(popoverContentStyles, 'w-[220px] p-[8px]')}\n style={{\n top: popoverPosition.y + 8,\n left: popoverPosition.x,\n }}\n >\n <div id={ids.searchListId} role='listbox' className={tableFilterContentClassName}>\n {searchSuggestions.map((column, index) => (\n <div\n key={column.key}\n ref={(node) => {\n suggestionItemRefs.current[index] = node\n }}\n id={ids.getSearchOptionId(index)}\n role='option'\n aria-selected={index === searchSuggestionIndex}\n tabIndex={\n autocompleteFocusMode === 'option' && index === searchSuggestionIndex ? 0 : -1\n }\n className={getTableFilterItemClassName({\n selected: index === searchSuggestionIndex,\n })}\n onClick={() => selectSearchSuggestion(column.key)}\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectSearchSuggestion(column.key)\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusSearchItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusSearchItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusSearchItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusSearchItem(searchSuggestions.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n returnFocusToInput()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n returnFocusToInput()\n }\n return\n }\n if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault()\n returnFocusToInput()\n return\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n returnFocusToInput()\n }\n }}\n onMouseEnter={() => setSearchSuggestionIndex(index)}\n >\n <span className={getTableFilterTextSlotClassName()}>\n <span className='truncate'>{column.label}</span>\n <span className='ml-[4px] shrink-0 text-small-regular text-sys-text-subtler'>\n 컬럼으로 필터\n </span>\n </span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nSearchSuggestionPopover.displayName = 'SearchSuggestionPopover'\n\n/** 값 자동완성 팝오버 */\nexport function ValueSuggestionPopover() {\n const {\n activePopover,\n popoverPosition,\n closePopover,\n ids,\n valueSuggestions,\n valueSuggestionsLoading,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n } = useColumnFilter()\n const popoverRef = React.useRef<HTMLDivElement>(null)\n const suggestionItemRefs = React.useRef<Array<HTMLDivElement | null>>([])\n\n const focusInput = React.useCallback(() => {\n requestAnimationFrame(() => {\n document.getElementById(ids.inputId)?.focus()\n })\n }, [ids.inputId])\n\n const focusValueItem = React.useCallback(\n (index: number) => {\n if (valueSuggestions.length === 0) return\n const nextIndex =\n ((index % valueSuggestions.length) + valueSuggestions.length) % valueSuggestions.length\n setAutocompleteFocusMode('option')\n setValueSuggestionIndex(nextIndex)\n requestAnimationFrame(() => {\n suggestionItemRefs.current[nextIndex]?.focus()\n })\n },\n [setAutocompleteFocusMode, setValueSuggestionIndex, valueSuggestions.length],\n )\n\n const returnFocusToInput = React.useCallback(() => {\n setAutocompleteFocusMode('input')\n focusInput()\n }, [focusInput, setAutocompleteFocusMode])\n\n // 값 팝오버는 첫 제안을 선점하지 않는다 — 입력 텍스트와 대응하지 않는 제안이 선점되면\n // 사용자가 입력한 적 없는 값이 Enter로 커밋된다. 제안 선택은 ArrowDown 이후에만 일어난다.\n\n // 외부 클릭 감지\n React.useEffect(() => {\n if (activePopover !== 'value') return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node | null\n if (!target) return\n if (document.getElementById(ids.inputId)?.contains(target)) {\n return\n }\n if (popoverRef.current && !popoverRef.current.contains(target)) {\n closePopover()\n }\n }\n\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClickOutside)\n }, 10)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [activePopover, closePopover, ids.inputId])\n\n if (activePopover !== 'value' || !popoverPosition) return null\n\n // 로딩 중\n if (valueSuggestionsLoading && valueSuggestions.length === 0) {\n return (\n <div\n ref={popoverRef}\n data-slot='value-suggestion-popover'\n className={cn(popoverContentStyles, 'w-[220px] p-[8px]')}\n style={{ top: popoverPosition.y + 8, left: popoverPosition.x }}\n >\n <TableFilterLoadingItem />\n </div>\n )\n }\n\n // 제안 없음\n if (valueSuggestions.length === 0) return null\n\n return (\n <div\n ref={popoverRef}\n data-slot='value-suggestion-popover'\n className={cn(\n popoverContentStyles,\n 'w-[220px] max-h-[224px] overflow-y-auto p-[8px]',\n tableFilterScrollbarClassName,\n )}\n style={{ top: popoverPosition.y + 8, left: popoverPosition.x }}\n >\n <div id={ids.valueListId} role='listbox' className={tableFilterContentClassName}>\n {valueSuggestions.map((suggestion, index) => (\n <div\n key={suggestion.value}\n ref={(node) => {\n suggestionItemRefs.current[index] = node\n }}\n id={ids.getValueOptionId(index)}\n role='option'\n aria-selected={index === valueSuggestionIndex}\n tabIndex={autocompleteFocusMode === 'option' && index === valueSuggestionIndex ? 0 : -1}\n className={getTableFilterItemClassName({\n selected: index === valueSuggestionIndex,\n })}\n onClick={() => selectValueSuggestion(suggestion.value)}\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n selectValueSuggestion(suggestion.value)\n return\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault()\n focusValueItem(index + 1)\n return\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault()\n focusValueItem(index - 1)\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusValueItem(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusValueItem(valueSuggestions.length - 1)\n return\n }\n if (e.key === 'Escape') {\n e.preventDefault()\n closePopover()\n returnFocusToInput()\n return\n }\n if (e.key === 'Tab') {\n closePopover()\n if (e.shiftKey) {\n e.preventDefault()\n returnFocusToInput()\n }\n return\n }\n if (e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault()\n returnFocusToInput()\n return\n }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n returnFocusToInput()\n }\n }}\n onMouseEnter={() => setValueSuggestionIndex(index)}\n >\n <span className={getTableFilterTextSlotClassName()}>\n <span className='truncate'>{suggestion.label}</span>\n </span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nValueSuggestionPopover.displayName = 'ValueSuggestionPopover'\n\n/** 통합 팝오버 래퍼 - Input과 함께 사용 */\nexport interface ColumnFilterPopoverProps {\n /** 팝오버 트리거 영역 */\n children: React.ReactNode\n /** 추가 CSS 클래스 */\n className?: string\n}\n\nexport function ColumnFilterPopover({ children, className }: ColumnFilterPopoverProps) {\n return (\n <div className={cn('relative', className)}>\n {children}\n <ColumnSelectPopover />\n <OperatorSelectPopover />\n <SearchSuggestionPopover />\n <ValueSuggestionPopover />\n </div>\n )\n}\n\nColumnFilterPopover.displayName = 'ColumnFilterPopover'\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { getTableFilterOperatorGlyph } from '../tableFilterParts'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'\nimport { useColumnFilter } from './ColumnFilter'\nimport { type FilterCondition, OPERATOR_LABELS } from './types'\n\nconst FOCUS_RING_MAIN_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-main)',\n} satisfies React.CSSProperties\n\nconst FOCUS_RING_CLASS =\n 'focus:outline-none focus-visible:relative focus-visible:z-10 focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1'\n\nexport interface ColumnFilterTagProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 필터 조건 */\n filter: FilterCondition\n /** Invalid 상태 (빨간색 테마) */\n isInvalid?: boolean\n /** 삭제(x) 버튼 처리 직후 호출 — ColumnFilterInput이 팝오버 재오픈에 사용 (#1042) */\n onRemoved?: () => void\n}\n\n/**\n * 적용된 필터 1건을 보여주는 태그. 구조는 `div > [편집 button][삭제 button]` —\n * 루트를 role=button 으로 두고 그 안에 삭제 button 을 넣으면 위젯 중첩(axe nested-interactive)이라\n * 편집 영역과 삭제 영역을 형제 버튼으로 분리한다. 루트 div 는 모양(배경·라운드)만 담당한다.\n */\nexport function ColumnFilterTag({\n filter,\n isInvalid = false,\n onRemoved, // 구조분해로 걸러낸다 — 루트 div의 {...props}로 새면 DOM unknown prop 경고\n className,\n style,\n ...props\n}: ColumnFilterTagProps) {\n const { disabled, removeFilter, getColumnByKey, editExistingFilter } = useColumnFilter()\n\n const column = getColumnByKey(filter.column)\n const columnLabel = column?.label || filter.column\n const operatorLabel = OPERATOR_LABELS[filter.operator]\n const operatorGlyph = getTableFilterOperatorGlyph(filter.operator)\n const operatorTextClassName =\n filter.operator === 'contains' ? 'text-small-regular' : 'text-base-regular'\n const filterValue = String(filter.value)\n const tooltipLabel = `${columnLabel} ${operatorLabel} ${filterValue}`\n const textColorClass = isInvalid ? 'text-danger50' : 'text-primary50'\n\n const handleRemove = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n removeFilter(filter.id)\n onRemoved?.()\n },\n [filter.id, removeFilter, onRemoved],\n )\n\n const handleEdit = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n editExistingFilter(filter.id)\n },\n [filter.id, editExistingFilter],\n )\n\n return (\n <div\n data-slot='column-filter-tag'\n className={cn(\n 'inline-flex h-[24px] max-w-full min-w-0 items-center overflow-hidden rounded-xsmall',\n isInvalid ? 'bg-danger-o10' : 'bg-primary-o10',\n 'select-none',\n className,\n )}\n style={style}\n {...props}\n >\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type='button'\n data-slot='column-filter-tag-edit'\n disabled={disabled}\n onClick={handleEdit}\n aria-label={`${tooltipLabel} 필터 편집`}\n className={cn(\n 'inline-flex h-full min-w-0 flex-1 items-center cursor-pointer',\n FOCUS_RING_CLASS,\n 'disabled:cursor-not-allowed',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n <span\n className={cn(\n // 라벨: min-w-[36px]는 글자 수 보장이 아니라 긴 값(base 수백 px)이 flex shrink 배분에서\n // 라벨을 뭉개는 것을 막는 장치 (border-box, 패딩 10px 포함).\n // 상한: 라벨바닥 + 28.2(최대 연산자 '제외' box) + 22(⊗) ≤ 100(태그 영역 바닥).\n 'min-w-[36px] truncate pl-[6px] pr-[4px]',\n 'text-base-regular',\n textColorClass,\n )}\n >\n {columnLabel}\n </span>\n\n <span\n aria-hidden\n title={operatorLabel}\n className={cn(\n 'flex h-full shrink-0 items-center justify-center p-[2px]',\n operatorTextClassName,\n textColorClass,\n )}\n >\n {operatorGlyph}\n </span>\n\n <span\n className={cn(\n // 값: 최소 폭 바닥 없음 — 바닥은 짧은 값에 빈 공간을 만들고(실측 최대 33px/태그),\n // 좁은 폭에서 ⊗ 삭제 버튼을 밀어낸다. 전문은 tooltip으로 접근 가능(키보드 포커스 포함, 실측 통과).\n // min-w-[min(N,max-content)]는 무효 CSS(min()은 length-percentage만 허용) — 재시도 금지.\n 'truncate px-[4px]',\n 'text-base-semibold',\n textColorClass,\n )}\n >\n {filterValue}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>{tooltipLabel}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <button\n type='button'\n disabled={disabled}\n onClick={handleRemove}\n className={cn(\n 'inline-flex h-full shrink-0 items-center rounded-xsmall py-[2px] pl-[2px] pr-[4px]',\n FOCUS_RING_CLASS,\n 'transition-colors group/remove',\n 'hover:bg-danger-o10 active:bg-danger-o30',\n textColorClass,\n )}\n style={FOCUS_RING_MAIN_STYLE}\n aria-label={`${columnLabel} 필터 삭제`}\n >\n <CancelIcon\n size={16}\n iconClassName={cn(\n isInvalid\n ? 'bg-sys-background bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]'\n : 'bg-sys-background bg-[image:linear-gradient(var(--color-primary-o10),var(--color-primary-o10))]',\n 'group-hover/remove:bg-sys-background hover:group-hover/remove:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]',\n 'group-active/remove:bg-sys-background active:group-active/remove:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n )}\n />\n </button>\n </div>\n )\n}\n\nColumnFilterTag.displayName = 'ColumnFilterTag'\n","'use client'\n\nimport * as React from 'react'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { getTableFilterOperatorGlyph } from '../tableFilterParts'\nimport { useColumnFilter } from './ColumnFilter'\nimport { ColumnFilterPopover } from './ColumnFilterPopover'\nimport { ColumnFilterTag } from './ColumnFilterTag'\nimport { isInvalidFilterValue, OPERATOR_LABELS } from './types'\n\nconst FOCUS_RING_MAIN_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-main)',\n} satisfies React.CSSProperties\n\nconst FOCUS_RING_BOLD_STYLE = {\n outlineColor: 'var(--color-sys-focus-ring-bold)',\n} satisfies React.CSSProperties\n\n/** 바 클릭 표면에서 제외할 인터랙티브 요소 판정 — 칩 루트는 role='button', 그 내부는 button/input뿐.\n * 바에 새 인터랙티브 요소를 추가하면 이 셀렉터를 갱신할 것. */\nconst isInteractiveTarget = (e: React.SyntheticEvent) =>\n Boolean((e.target as HTMLElement).closest('button, input, [role=\"button\"]'))\n\n/** 편집 중인 필터 태그 (in-place + 신규 공용) */\nfunction EditingTag({\n editingFilter,\n editingColumnLabel,\n editingOperatorLabel,\n handleColumnButtonClick,\n handleColumnButtonKeyDown,\n handleOperatorButtonClick,\n handleOperatorButtonKeyDown,\n handleInputChange,\n handleKeyDown,\n cancelEditing,\n inputRef,\n measureRef,\n inputWidth,\n isInvalid,\n inputId,\n inputAriaControls,\n inputActiveDescendant,\n}: {\n editingFilter: NonNullable<ReturnType<typeof useColumnFilter>['editingFilter']>\n editingColumnLabel: string | null\n editingOperatorLabel: string\n handleColumnButtonClick: (e: React.MouseEvent<HTMLButtonElement>) => void\n handleColumnButtonKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void\n handleOperatorButtonClick: (e: React.MouseEvent<HTMLButtonElement>) => void\n handleOperatorButtonKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void\n handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void\n cancelEditing: () => void\n inputRef: React.Ref<HTMLInputElement>\n measureRef: React.Ref<HTMLSpanElement>\n inputWidth: number\n isInvalid: boolean\n inputId: string\n inputAriaControls?: string\n inputActiveDescendant?: string\n}) {\n const operatorTextClassName =\n editingFilter.operator === 'contains' ? 'text-small-regular' : 'text-base-regular'\n\n return (\n <div\n data-slot='column-filter-editing-tag'\n className={cn(\n 'my-[1px] inline-flex h-[24px] max-w-full min-w-0 items-center overflow-hidden rounded-xsmall',\n isInvalid ? 'bg-danger-o10' : 'bg-primary-o10',\n 'select-none',\n )}\n >\n {/* 컬럼명 (클릭으로 변경 가능) */}\n <button\n type='button'\n data-column-button\n onClick={handleColumnButtonClick}\n onKeyDown={handleColumnButtonKeyDown}\n className={cn(\n 'flex h-full shrink-0 items-center rounded-l-xsmall pl-[6px] pr-[4px] transition-colors',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n isInvalid\n ? 'hover:bg-danger-o10 active:bg-danger-o30'\n : 'hover:bg-primary-o10 active:bg-primary-o30',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n <span className={cn('text-base-regular', isInvalid ? 'text-danger50' : 'text-primary50')}>\n {editingColumnLabel}\n </span>\n </button>\n\n {/* 연산자 (클릭으로 변경 가능) */}\n <button\n type='button'\n data-operator-button\n onClick={handleOperatorButtonClick}\n onKeyDown={handleOperatorButtonKeyDown}\n aria-label={editingOperatorLabel}\n title={editingOperatorLabel}\n className={cn(\n 'flex h-full min-w-[20px] shrink-0 items-center justify-center p-[2px] transition-colors',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n isInvalid\n ? editingFilter.operator\n ? 'hover:bg-danger-o10 active:bg-danger-o30'\n : 'bg-danger-o30 hover:bg-danger-o10 active:bg-danger-o30'\n : editingFilter.operator\n ? 'hover:bg-primary-o10 active:bg-primary-o30'\n : 'bg-primary-o30 hover:bg-primary-o10 active:bg-primary-o30',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n <span\n className={cn(\n operatorTextClassName,\n isInvalid\n ? editingFilter.operator\n ? 'text-danger50'\n : 'text-danger40'\n : editingFilter.operator\n ? 'text-primary50'\n : 'text-primary40',\n )}\n >\n {editingFilter.operator\n ? getTableFilterOperatorGlyph(editingFilter.operator)\n : editingOperatorLabel}\n </span>\n </button>\n\n {/* 값 입력 필드 - 연산자 선택 후에만 표시 */}\n {editingFilter.operator && (\n <div\n className={cn(\n 'relative flex h-full min-w-0 items-center overflow-hidden rounded-xsmall px-[4px] transition-colors',\n 'focus-within:outline-solid focus-within:outline-[2px] focus-within:[outline-color:var(--color-sys-focus-ring-main)] focus-within:-outline-offset-1',\n isInvalid\n ? 'hover:bg-danger-o10 active:bg-danger-o30'\n : 'hover:bg-primary-o10 active:bg-primary-o30',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n >\n {/* 숨겨진 측정용 span */}\n <span\n ref={measureRef}\n className='invisible absolute whitespace-pre text-base-semibold'\n aria-hidden='true'\n >\n {editingFilter.value || ''}\n </span>\n <input\n ref={inputRef}\n id={inputId}\n data-column-filter-value-input\n type='text'\n role='combobox'\n aria-expanded={Boolean(inputAriaControls)}\n aria-controls={inputAriaControls}\n aria-activedescendant={inputActiveDescendant}\n aria-autocomplete='list'\n aria-invalid={isInvalid || undefined}\n autoComplete='off'\n value={editingFilter.value || ''}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=''\n aria-label={editingColumnLabel ? `${editingColumnLabel} 값` : '필터 값'}\n className={cn(\n 'h-full bg-transparent border-none p-0 outline-none',\n 'text-base-semibold',\n isInvalid ? 'text-danger50' : 'text-primary50',\n 'min-w-[4px] max-w-full text-ellipsis',\n isInvalid ? 'placeholder:text-danger30' : 'placeholder:text-primary30',\n )}\n style={{ width: `${inputWidth}px` }}\n />\n </div>\n )}\n\n {/* 취소 버튼 */}\n <button\n type='button'\n data-editing-cancel-button\n onClick={(e) => {\n e.stopPropagation()\n cancelEditing()\n }}\n className={cn(\n 'inline-flex h-full shrink-0 items-center rounded-xsmall py-[2px] pl-[2px] pr-[4px]',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n 'transition-colors group/remove',\n 'hover:bg-danger-o10 active:bg-danger-o30',\n isInvalid ? 'text-danger50' : 'text-primary50',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n aria-label='필터 편집 취소'\n >\n <CancelIcon\n size={16}\n iconClassName={cn(\n isInvalid\n ? 'bg-sys-background bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]'\n : 'bg-sys-background bg-[image:linear-gradient(var(--color-primary-o10),var(--color-primary-o10))]',\n 'group-hover/remove:bg-sys-background hover:group-hover/remove:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]',\n 'group-active/remove:bg-sys-background active:group-active/remove:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n )}\n />\n </button>\n </div>\n )\n}\n\nexport interface ColumnFilterInputProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 플레이스홀더 텍스트 — 무엇으로 찾는지만(\"모델 이름·요청 ID 검색\"). \"…하거나 조건을 추가하세요\" 처럼 조작을 설명하지 않는다(2026-11-06 홀드아웃 20) */\n placeholder?: string\n}\n\nexport function ColumnFilterInput({\n placeholder = '검색...',\n className,\n style,\n ...props\n}: ColumnFilterInputProps) {\n const {\n disabled,\n columns,\n filters,\n searchQuery,\n editingFilter,\n editingFilterId,\n activePopover,\n popoverTrigger,\n autocompleteFocusMode,\n setAutocompleteFocusMode,\n setSearchQuery,\n selectColumn,\n setEditingValue,\n commitFilter,\n cancelEditing,\n removeFilter,\n resetFilters,\n openPopover,\n closePopover,\n getColumnByKey,\n ids,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n valueSuggestions,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n } = useColumnFilter()\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const measureRef = React.useRef<HTMLSpanElement>(null)\n const [inputWidth, setInputWidth] = React.useState(4)\n\n const openPopoverFromElement = React.useCallback(\n (\n type: 'column' | 'operator' | 'search' | 'value',\n element: HTMLElement | null,\n trigger: 'input' | 'button' | null = 'input',\n ) => {\n const rect = element?.getBoundingClientRect()\n if (!rect) return\n openPopover(type, { x: rect.left, y: rect.bottom }, trigger)\n },\n [openPopover],\n )\n\n const focusOptionById = React.useCallback((id: string) => {\n requestAnimationFrame(() => {\n document.getElementById(id)?.focus()\n })\n }, [])\n\n const focusColumnSuggestion = React.useCallback(\n (index: number) => {\n if (columns.length === 0) return\n const nextIndex = ((index % columns.length) + columns.length) % columns.length\n setAutocompleteFocusMode('option')\n setColumnSuggestionIndex(nextIndex)\n focusOptionById(ids.getColumnOptionId(nextIndex))\n },\n [columns.length, focusOptionById, ids, setAutocompleteFocusMode, setColumnSuggestionIndex],\n )\n\n const focusSearchSuggestion = React.useCallback(\n (index: number) => {\n if (searchSuggestions.length === 0) return\n const nextIndex =\n ((index % searchSuggestions.length) + searchSuggestions.length) % searchSuggestions.length\n setAutocompleteFocusMode('option')\n setSearchSuggestionIndex(nextIndex)\n focusOptionById(ids.getSearchOptionId(nextIndex))\n },\n [\n focusOptionById,\n ids,\n searchSuggestions.length,\n setAutocompleteFocusMode,\n setSearchSuggestionIndex,\n ],\n )\n\n const focusValueSuggestion = React.useCallback(\n (index: number) => {\n if (valueSuggestions.length === 0) return\n const nextIndex =\n ((index % valueSuggestions.length) + valueSuggestions.length) % valueSuggestions.length\n setAutocompleteFocusMode('option')\n setValueSuggestionIndex(nextIndex)\n focusOptionById(ids.getValueOptionId(nextIndex))\n },\n [\n focusOptionById,\n ids,\n setAutocompleteFocusMode,\n setValueSuggestionIndex,\n valueSuggestions.length,\n ],\n )\n\n // 필터 편집(태그 작성·수정)이 끝났을 때만 검색 입력으로 포커스 복원. 마운트 시에는 가져가지 않는다 —\n // 페이지가 열리자마자 검색창이 포커스를 가져가면 키보드 사용자가 제목·헤더를 건너뛰고, 첫 Tab 이 검색창을 떠나\n // 표의 셀 수십 개를 지나야 한다 (2026-10-09 실측). \"이전에 편집 중이었나\" 를 ref 로 들고 있어 StrictMode 이중 실행에도 안전하다.\n // setTimeout(0): IME compositionend 이벤트가 현재 이벤트 루프에서 처리된 후\n // 다음 macrotask에서 포커스 이동 (한글 조합 잔여 글자 누출 방지)\n const wasEditingRef = React.useRef(false)\n React.useEffect(() => {\n const editing = Boolean(editingFilter || editingFilterId)\n const shouldRestore = wasEditingRef.current && !editing\n wasEditingRef.current = editing\n if (!shouldRestore) return\n const timerId = setTimeout(() => {\n inputRef.current?.focus()\n }, 0)\n return () => clearTimeout(timerId)\n }, [editingFilter, editingFilterId])\n\n // 편집 모드에서 연산자 선택 후 입력 필드에 포커스 + select 컬럼 자동 팝오버\n React.useEffect(() => {\n if (editingFilter?.operator) {\n inputRef.current?.focus()\n inputRef.current?.select()\n // 뒤따르는 폭 측정 effect가 스크롤을 되돌리므로 다음 프레임에서 앞부분으로 되감는다\n requestAnimationFrame(() => {\n if (inputRef.current) inputRef.current.scrollLeft = 0\n })\n\n // Select 컬럼: 즉시 value 팝오버 열기\n const column = editingFilter?.column ? getColumnByKey(editingFilter.column) : null\n if (column?.type === 'select' && column.options) {\n requestAnimationFrame(() => {\n openPopoverFromElement('value', inputRef.current, 'input')\n })\n }\n }\n }, [\n editingFilterId,\n editingFilter?.operator,\n editingFilter?.column,\n getColumnByKey,\n openPopoverFromElement,\n ])\n\n // 입력 필드 너비 측정\n React.useEffect(() => {\n if (measureRef.current) {\n const width = measureRef.current.offsetWidth\n setInputWidth(Math.max(4, width))\n }\n }, [editingFilter?.value])\n\n // 편집 중인 컬럼 라벨\n const editingColumnLabel = editingFilter?.column\n ? getColumnByKey(editingFilter.column)?.label || editingFilter.column\n : null\n\n // 편집 중인 연산자 라벨\n const editingOperatorLabel = editingFilter?.operator\n ? OPERATOR_LABELS[editingFilter.operator]\n : '?' // 연산자 미선택 시 플레이스홀더\n\n // 입력 값 (편집 중이면 편집 값, 아니면 검색 쿼리)\n const inputValue = editingFilter ? editingFilter.value || '' : searchQuery\n\n // 입력 변경 핸들러\n const handleInputChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setAutocompleteFocusMode('input')\n\n if (editingFilter) {\n // 편집 모드: 필터 값 업데이트 + value 팝오버 위치\n setEditingValue(value)\n openPopoverFromElement('value', inputRef.current, 'input')\n } else {\n // 통합 검색 모드\n setSearchQuery(value)\n // 검색어가 있으면 자동완성 팝오버 열기\n if (value.trim()) {\n openPopoverFromElement('search', inputRef.current, 'input')\n } else {\n closePopover()\n }\n }\n },\n [\n editingFilter,\n setAutocompleteFocusMode,\n setEditingValue,\n setSearchQuery,\n openPopoverFromElement,\n closePopover,\n ],\n )\n\n // 키보드 핸들러\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Tab') {\n if (activePopover) closePopover()\n return\n }\n\n if (activePopover === 'column' && popoverTrigger === 'input' && columns.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n focusColumnSuggestion(\n autocompleteFocusMode === 'option'\n ? columnSuggestionIndex + 1\n : columnSuggestionIndex >= 0\n ? columnSuggestionIndex\n : 0,\n )\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n focusColumnSuggestion(\n autocompleteFocusMode === 'option'\n ? columnSuggestionIndex - 1\n : columnSuggestionIndex >= 0\n ? columnSuggestionIndex\n : columns.length - 1,\n )\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusColumnSuggestion(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusColumnSuggestion(columns.length - 1)\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n const selectedIndex = columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0\n const selectedColumn = columns[selectedIndex]\n if (selectedColumn) selectColumn(selectedColumn.key)\n return\n }\n }\n\n if (e.key === 'ArrowDown' && !activePopover) {\n e.preventDefault()\n if (editingFilter) {\n openPopoverFromElement('value', inputRef.current, 'input')\n if (valueSuggestions.length > 0 && valueSuggestionIndex < 0) {\n setValueSuggestionIndex(0)\n }\n focusValueSuggestion(valueSuggestionIndex >= 0 ? valueSuggestionIndex : 0)\n } else if (searchQuery.trim() && searchSuggestions.length > 0) {\n openPopoverFromElement('search', inputRef.current, 'input')\n setSearchSuggestionIndex(searchSuggestionIndex >= 0 ? searchSuggestionIndex : 0)\n focusSearchSuggestion(searchSuggestionIndex >= 0 ? searchSuggestionIndex : 0)\n } else {\n openPopoverFromElement('column', inputRef.current, 'input')\n setColumnSuggestionIndex(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n focusColumnSuggestion(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n }\n return\n }\n\n // 값 자동완성 키보드 내비게이션\n if (activePopover === 'value' && valueSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n focusValueSuggestion(\n autocompleteFocusMode === 'option'\n ? valueSuggestionIndex + 1\n : valueSuggestionIndex >= 0\n ? valueSuggestionIndex\n : 0,\n )\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n focusValueSuggestion(\n autocompleteFocusMode === 'option'\n ? valueSuggestionIndex - 1\n : valueSuggestionIndex >= 0\n ? valueSuggestionIndex\n : valueSuggestions.length - 1,\n )\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusValueSuggestion(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusValueSuggestion(valueSuggestions.length - 1)\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n if (valueSuggestionIndex >= 0) {\n selectValueSuggestion(valueSuggestions[valueSuggestionIndex].value)\n } else {\n // 제안 미선택 → 입력값 그대로 커밋\n commitFilter()\n }\n return\n }\n }\n\n // 검색 자동완성 키보드 내비게이션 (WAI-ARIA Combobox 패턴)\n if (activePopover === 'search' && searchSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n focusSearchSuggestion(\n autocompleteFocusMode === 'option'\n ? searchSuggestionIndex + 1\n : searchSuggestionIndex >= 0\n ? searchSuggestionIndex\n : 0,\n )\n return\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n focusSearchSuggestion(\n autocompleteFocusMode === 'option'\n ? searchSuggestionIndex - 1\n : searchSuggestionIndex >= 0\n ? searchSuggestionIndex\n : searchSuggestions.length - 1,\n )\n return\n }\n if (e.key === 'Home') {\n e.preventDefault()\n focusSearchSuggestion(0)\n return\n }\n if (e.key === 'End') {\n e.preventDefault()\n focusSearchSuggestion(searchSuggestions.length - 1)\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n if (searchSuggestionIndex >= 0) {\n selectSearchSuggestion(searchSuggestions[searchSuggestionIndex].key)\n } else {\n closePopover() // 선택 없이 엔터 → 검색어로 통합 검색\n }\n return\n }\n }\n\n if (e.key === 'Enter') {\n e.preventDefault()\n if (editingFilter) {\n commitFilter()\n }\n } else if (e.key === 'Escape') {\n e.preventDefault()\n if (activePopover) {\n closePopover()\n } else if (editingFilter) {\n cancelEditing()\n }\n if (!activePopover && !editingFilter) {\n inputRef.current?.blur()\n }\n } else if (e.key === 'Backspace' && !inputValue) {\n // 빈 입력 상태에서 Backspace: 마지막 필터 삭제 또는 편집 취소\n if (editingFilter) {\n cancelEditing()\n }\n }\n },\n [\n editingFilter,\n activePopover,\n popoverTrigger,\n autocompleteFocusMode,\n inputValue,\n columns,\n commitFilter,\n cancelEditing,\n closePopover,\n openPopoverFromElement,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n selectColumn,\n focusColumnSuggestion,\n valueSuggestions,\n valueSuggestionIndex,\n setValueSuggestionIndex,\n selectValueSuggestion,\n focusValueSuggestion,\n searchSuggestions,\n searchSuggestionIndex,\n setSearchSuggestionIndex,\n selectSearchSuggestion,\n focusSearchSuggestion,\n searchQuery,\n ],\n )\n\n // 편집 중 X 버튼: 기존 필터면 삭제, 신규면 생성 취소\n const handleEditingCancel = React.useCallback(() => {\n if (editingFilterId) {\n removeFilter(editingFilterId)\n }\n cancelEditing()\n }, [editingFilterId, removeFilter, cancelEditing])\n\n // 현재 입력 상태에 맞는 팝오버를 연다 — ArrowDown 분기와 같은 규칙.\n // 텍스트가 있고 매칭 제안이 있으면 search, 그 외(빈 텍스트·매칭 0건)는 column.\n // search를 열 때 인덱스는 건드리지 않는다 — 선점 여부는 ColumnFilter의 effect가 onSearch\n // 유무로 결정하며, 여기서 선점하면 onSearch 소비처의 Enter 통합 검색이 깨진다.\n const openContextualPopover = React.useCallback(() => {\n if (searchQuery.trim() && searchSuggestions.length > 0) {\n openPopoverFromElement('search', inputRef.current, 'input')\n } else {\n openPopoverFromElement('column', inputRef.current, 'input')\n setColumnSuggestionIndex(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n }\n }, [\n searchQuery,\n searchSuggestions.length,\n openPopoverFromElement,\n columnSuggestionIndex,\n setColumnSuggestionIndex,\n ])\n\n // 초기화(x) 직후 재오픈 (#1042). resetFilters가 검색어까지 비우므로 항상 column이 정답이다.\n // contextual 분기를 쓰면 안 된다 — 이 콜백의 클로저는 초기화 전 렌더의 searchQuery를 보므로\n // 텍스트가 남아 있던 상태에서는 search를 열게 되는데, 그 시점의 제안은 0건이라 아무것도 안 뜬다.\n // rAF: 칩이 사라진 뒤의 레이아웃으로 위치를 재야 한다 — 동기 측정은 삭제 전 좌표다.\n // 새 초기화·삭제 경로를 추가하면 이 헬퍼들을 호출할 것.\n const reopenColumnPopover = React.useCallback(() => {\n requestAnimationFrame(() => {\n if (!inputRef.current) return\n inputRef.current.focus()\n openPopoverFromElement('column', inputRef.current, 'input')\n setColumnSuggestionIndex(columnSuggestionIndex >= 0 ? columnSuggestionIndex : 0)\n })\n }, [openPopoverFromElement, columnSuggestionIndex, setColumnSuggestionIndex])\n\n // 칩 삭제 직후 재오픈 (#1042). 삭제는 검색어를 바꾸지 않으므로 클로저가 안전하다 —\n // 클릭과 같은 contextual 규칙을 쓴다.\n const reopenContextualPopover = React.useCallback(() => {\n requestAnimationFrame(() => {\n if (!inputRef.current) return\n inputRef.current.focus()\n openContextualPopover()\n })\n }, [openContextualPopover])\n\n const handleSearchInputClick = React.useCallback(() => {\n if (editingFilter) return\n // 보이는 팝오버는 유지한다. 단 'search'는 제안 0건이면 렌더되지 않아 활성이어도 화면에\n // 없다 — 닫힌 것으로 취급해 contextual 오픈으로 진행한다. (무매칭 텍스트를 타이핑한 뒤엔\n // 이 비가시 'search'가 activePopover에 남고, 외부 클릭 감지는 입력 내부 클릭을 제외하므로\n // 클릭으로는 영영 해소되지 않았다)\n if (activePopover && !(activePopover === 'search' && searchSuggestions.length === 0)) return\n\n openContextualPopover()\n }, [editingFilter, activePopover, searchSuggestions.length, openContextualPopover])\n\n // 바 전체를 클릭 표면으로 만든다 — 빈 영역 클릭 시 현재 입력(편집 중이면 편집 값 입력)에 포커스.\n // mousedown에서 preventDefault해야 기존 포커스가 blur로 이탈하지 않아 포커스 링이 깜빡이지 않는다.\n const handleContainerMouseDown = React.useCallback((e: React.MouseEvent) => {\n if (isInteractiveTarget(e)) return\n e.preventDefault()\n inputRef.current?.focus()\n }, [])\n\n const handleContainerClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (isInteractiveTarget(e)) return\n if (editingFilter) return // 편집 중엔 포커스 복원만 한다\n handleSearchInputClick() // 비편집: 입력 클릭과 같은 contextual 규칙\n },\n [editingFilter, handleSearchInputClick],\n )\n\n // 컬럼 버튼 클릭 핸들러\n const handleColumnButtonClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n if (activePopover === 'column') {\n closePopover()\n } else {\n openPopoverFromElement('column', e.currentTarget, 'button')\n }\n },\n [activePopover, openPopoverFromElement, closePopover],\n )\n\n const handleColumnButtonKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n e.stopPropagation()\n openPopoverFromElement('column', e.currentTarget, 'button')\n },\n [openPopoverFromElement],\n )\n\n // 연산자 버튼 클릭 핸들러\n const handleOperatorButtonClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n if (activePopover === 'operator') {\n closePopover()\n } else {\n openPopoverFromElement('operator', e.currentTarget, 'button')\n }\n },\n [activePopover, openPopoverFromElement, closePopover],\n )\n\n const handleOperatorButtonKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n e.stopPropagation()\n openPopoverFromElement('operator', e.currentTarget, 'button')\n },\n [openPopoverFromElement],\n )\n\n // 초기화 버튼 클릭 핸들러\n const handleReset = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n resetFilters()\n reopenColumnPopover() // 포커스 복원도 여기서 함께 한다\n },\n [resetFilters, reopenColumnPopover],\n )\n\n // 필터나 검색어가 있는지 확인\n const hasContent = filters.length > 0 || searchQuery.length > 0 || Boolean(editingFilter)\n const hasFilterTokens = filters.length > 0 || Boolean(editingFilter)\n\n const getFilterInvalidState = React.useCallback(\n (filter: { column?: string; value?: string | number }) =>\n isInvalidFilterValue(filter.column ? getColumnByKey(filter.column) : undefined, filter.value),\n [getColumnByKey],\n )\n\n const searchActiveDescendant =\n activePopover === 'search' && searchSuggestionIndex >= 0\n ? ids.getSearchOptionId(searchSuggestionIndex)\n : undefined\n\n const columnActiveDescendant =\n activePopover === 'column' && popoverTrigger === 'input' && columnSuggestionIndex >= 0\n ? ids.getColumnOptionId(columnSuggestionIndex)\n : undefined\n\n const valueActiveDescendant =\n activePopover === 'value' && valueSuggestionIndex >= 0\n ? ids.getValueOptionId(valueSuggestionIndex)\n : undefined\n\n // 제안 0건이면 listbox 가 렌더되지 않으므로 가리키지 않는다 (없는 id 를 가리키면 axe aria-valid-attr-value critical)\n const searchInputAriaControls =\n activePopover === 'search' && searchSuggestions.length > 0\n ? ids.searchListId\n : activePopover === 'column' && popoverTrigger === 'input'\n ? ids.columnListId\n : undefined\n\n const searchInputActiveDescendant = searchActiveDescendant ?? columnActiveDescendant\n\n return (\n <ColumnFilterPopover>\n <div\n ref={containerRef}\n data-slot='column-filter-input'\n // 클릭 표면일 뿐 그 자체로 인터랙티브하지 않다 — 키보드 경로는 내부 input·버튼·칩이 이미 갖는다\n role='presentation'\n className={cn(\n 'flex items-center gap-[4px]',\n hasFilterTokens && 'flex-wrap',\n 'w-full min-h-[36px] rounded-small border border-sys-divider-main bg-sys-background',\n 'px-[6px] py-[4px]',\n 'focus-within:outline-solid focus-within:outline-2 focus-within:[outline-color:var(--color-sys-focus-ring-bold)] focus-within:-outline-offset-1 focus-within:border-transparent',\n 'transition-colors cursor-text',\n className,\n )}\n style={{ ...style, ...FOCUS_RING_BOLD_STYLE }}\n onMouseDown={handleContainerMouseDown}\n onClick={handleContainerClick}\n {...props}\n >\n {/* 검색 아이콘 — outer flex의 shrink-0 item(absolute 아님). 줄바꿈은 안쪽 태그 영역에서만\n 일어나 outer는 flex line 1개이므로, items-center가 컨트롤 전체 높이 기준 세로 중앙에 둔다 */}\n <Search size={20} className='text-sys-text-subtler shrink-0' />\n\n {/* 태그 + 입력 영역 */}\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-wrap items-center gap-x-[4px]',\n hasFilterTokens && 'min-w-[100px] basis-[100px]',\n )}\n >\n {/* 적용된 필터 태그들 (편집 중인 필터는 편집 태그로 교체) */}\n {filters.map((filter) =>\n filter.id === editingFilterId ? (\n <EditingTag\n key={filter.id}\n editingFilter={editingFilter!}\n editingColumnLabel={editingColumnLabel}\n editingOperatorLabel={editingOperatorLabel}\n handleColumnButtonClick={handleColumnButtonClick}\n handleColumnButtonKeyDown={handleColumnButtonKeyDown}\n handleOperatorButtonClick={handleOperatorButtonClick}\n handleOperatorButtonKeyDown={handleOperatorButtonKeyDown}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n cancelEditing={handleEditingCancel}\n inputRef={inputRef}\n measureRef={measureRef}\n inputWidth={inputWidth}\n isInvalid={getFilterInvalidState(editingFilter!)}\n inputId={ids.inputId}\n inputAriaControls={\n activePopover === 'value' && valueSuggestions.length > 0\n ? ids.valueListId\n : undefined\n }\n inputActiveDescendant={valueActiveDescendant}\n />\n ) : (\n <ColumnFilterTag\n key={filter.id}\n filter={filter}\n isInvalid={getFilterInvalidState(filter)}\n className='my-[1px]'\n // 편집 중엔 재오픈하지 않는다 — 컬럼 선택이 편집 중 필터를 변조한다\n onRemoved={editingFilter ? undefined : reopenContextualPopover}\n />\n ),\n )}\n\n {/* 새 필터 편집 태그 (editingFilterId가 없는 경우 = 신규 필터) */}\n {editingFilter && !editingFilterId && (\n <EditingTag\n editingFilter={editingFilter}\n editingColumnLabel={editingColumnLabel}\n editingOperatorLabel={editingOperatorLabel}\n handleColumnButtonClick={handleColumnButtonClick}\n handleColumnButtonKeyDown={handleColumnButtonKeyDown}\n handleOperatorButtonClick={handleOperatorButtonClick}\n handleOperatorButtonKeyDown={handleOperatorButtonKeyDown}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n cancelEditing={handleEditingCancel}\n inputRef={inputRef}\n measureRef={measureRef}\n inputWidth={inputWidth}\n isInvalid={getFilterInvalidState(editingFilter)}\n inputId={ids.inputId}\n inputAriaControls={\n activePopover === 'value' && valueSuggestions.length > 0\n ? ids.valueListId\n : undefined\n }\n inputActiveDescendant={valueActiveDescendant}\n />\n )}\n\n {/* 통합 검색 입력 필드 (편집 중이 아닐 때만 표시) */}\n {!editingFilter && (\n <input\n ref={inputRef}\n id={ids.inputId}\n data-column-filter-search-input\n type='text'\n role='combobox'\n aria-expanded={Boolean(searchInputAriaControls)}\n aria-controls={searchInputAriaControls}\n aria-activedescendant={searchInputActiveDescendant}\n aria-autocomplete='list'\n autoComplete='off'\n disabled={disabled}\n value={searchQuery}\n onClick={handleSearchInputClick}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n aria-label={placeholder || '검색'}\n className={cn(\n 'h-[26px] flex-1 min-w-[100px] bg-transparent border-none p-0 outline-none',\n 'text-base-regular text-sys-text-main placeholder:text-sys-text-subtler',\n )}\n />\n )}\n </div>\n\n {/* 초기화 버튼 */}\n {hasContent && (\n <button\n type='button'\n data-column-filter-reset-button\n disabled={disabled}\n onClick={handleReset}\n className={cn(\n 'flex items-center justify-center shrink-0 p-[2px] rounded-small',\n 'text-sys-text-subtler hover:bg-secondary-o10',\n 'focus:outline-none focus-visible:outline-solid focus-visible:outline-[2px] focus-visible:[outline-color:var(--color-sys-focus-ring-main)] focus-visible:-outline-offset-1',\n 'transition-colors',\n )}\n style={FOCUS_RING_MAIN_STYLE}\n aria-label='검색 초기화'\n >\n <CancelIcon size={20} />\n </button>\n )}\n </div>\n </ColumnFilterPopover>\n )\n}\n\nColumnFilterInput.displayName = 'ColumnFilterInput'\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../utils/cn'\n\ninterface PopoverContentProps extends React.ComponentPropsWithoutRef<\n typeof PopoverPrimitive.Content\n> {\n align?: 'start' | 'center' | 'end'\n sideOffset?: number\n withFitContent?: boolean\n}\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(({ align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n {...props}\n className={cn(\n 'z-[calc(var(--root-z-index)-1)] rounded-medium bg-sys-background p-[8px] shadow-gray-small color-sys-text-main outline-none border border-sys-divider-subtler',\n 'data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]',\n 'data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]',\n 'data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]',\n 'data-[side=left]:animate-[slide-in-right_150ms_ease-out]',\n 'data-[side=right]:animate-[slide-in-left_150ms_ease-out]',\n props.className,\n )}\n />\n </PopoverPrimitive.Portal>\n))\n\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import { useCallback, useEffect, useState } from 'react'\nimport { ListFilter } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport { Badge } from './badge'\nimport { Button } from './button'\nimport { Command, CommandEmpty, CommandGroup, CommandList } from './command'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport {\n TableFilterCheckboxCommandItem,\n tableFilterCommandClassName,\n tableFilterCommandListClassName,\n tableFilterContentClassName,\n tableFilterPopoverContentClassName,\n TableFilterSearchInput,\n} from './tableFilterParts'\n\ninterface FilterTitleType {\n title?: string\n}\n\nfunction FilterTitle({ title = '필터' }: FilterTitleType) {\n return <span className='text-small-bold-h text-sys-text-main px-[4px]'>{title}</span>\n}\n\nexport type ColumnVisibilityOption = {\n value: string\n label: string\n}\n\nexport interface ColumnVisibilityFilterProps {\n title?: string\n options: ColumnVisibilityOption[]\n value: string[]\n onChange: (selected: string[]) => void\n placeholder?: string\n emptyText?: string\n allText?: string\n className?: {\n button?: string\n PopoverContent?: string\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n searchPlaceholder?: string\n searchable?: boolean\n align?: 'start' | 'center' | 'end'\n}\n\nexport function ColumnVisibilityFilter({\n title,\n options,\n value = [],\n onChange,\n searchPlaceholder = '검색',\n emptyText = '조회 가능한 옵션이 없습니다.',\n allText = '전체 선택',\n searchable = true,\n className,\n align = 'end',\n}: ColumnVisibilityFilterProps) {\n const [open, setOpen] = useState(false)\n const [selectedValues, setSelectedValues] = useState<string[]>(value)\n\n // 외부 value prop과 내부 상태 동기화\n useEffect(() => {\n setSelectedValues(value)\n }, [value])\n\n const handleSelect = useCallback(\n (val: string) => {\n const updatedSelected = selectedValues.includes(val)\n ? selectedValues.filter((item) => item !== val)\n : [...selectedValues, val]\n\n setSelectedValues(updatedSelected)\n onChange(updatedSelected)\n },\n [selectedValues, onChange],\n )\n\n // 전체 토글 (수정된 로직)\n const toggleAll = () => {\n const allValues = options.map((option) => option.value)\n\n if (selectedValues.length === options.length) {\n // 이미 모두 선택된 상태라면 -> 모두 해제 (빈 배열)\n setSelectedValues([])\n onChange([])\n } else {\n // 그 외(일부만 선택 or 아무것도 선택 안됨) -> 모두 선택\n setSelectedValues(allValues)\n onChange(allValues)\n }\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant='secondary'\n role='combobox'\n aria-expanded={open}\n // role=combobox 는 자식 텍스트로 이름을 얻지 못한다 → 제목과 선택 수로 이름을 만든다\n aria-label={\n selectedValues.length > 0\n ? `${title ?? '컬럼 표시'} (${selectedValues.length}개 선택)`\n : (title ?? '컬럼 표시')\n }\n className={className?.button}\n >\n <ListFilter size={20} className='mr-[2px]' />\n {title}\n {selectedValues.length > 0 && (\n <Badge variant='secondary' className='ml-[4px]'>\n {selectedValues.length}\n </Badge>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n aria-label={title ?? '컬럼 표시'}\n className={cn(tableFilterPopoverContentClassName, className?.PopoverContent)}\n align={align}\n >\n <FilterTitle title={title} />\n\n <Command className={cn(tableFilterCommandClassName, className?.Command)}>\n {searchable && (\n <TableFilterSearchInput\n placeholder={searchPlaceholder}\n className={className?.CommandInput}\n />\n )}\n <CommandList className={cn(tableFilterCommandListClassName, className?.CommandList)}>\n <CommandEmpty>{emptyText}</CommandEmpty>\n <CommandGroup className={cn(tableFilterContentClassName, className?.CommandGroup)}>\n <TableFilterCheckboxCommandItem\n key='all'\n onSelect={toggleAll}\n checked={selectedValues.length === options.length}\n className={className?.CommandItem}\n >\n {allText}\n </TableFilterCheckboxCommandItem>\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n\n return (\n <TableFilterCheckboxCommandItem\n key={option.value}\n value={option.value}\n onSelect={() => handleSelect(option.value)}\n checked={isSelected}\n className={className?.CommandItem}\n >\n {option.label}\n </TableFilterCheckboxCommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\n\nexport interface FloatingLabelOutlineProps {\n /** 'standard' = three-box notched outline, 'none' = inline floating label */\n mode: 'standard' | 'none'\n label: string\n required?: boolean\n isFloating: boolean\n isMounted: boolean\n labelColorClass: string\n /** notched outline border 색상 클래스 (standard 모드 전용) */\n borderColorClass: string\n /** notched outline border 두께가 두꺼운 상태인지 (standard 모드 전용) */\n isThickBorder: boolean\n labelId: string\n}\n\nfunction FloatingLabelOutline({\n mode,\n label,\n required,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n}: FloatingLabelOutlineProps) {\n const transitionClass = cn(\n isMounted &&\n 'transition-[top,translate,scale,color] duration-150 ease-[cubic-bezier(0.4,0,0.2,1)]',\n 'motion-reduce:transition-none',\n )\n\n if (mode === 'standard') {\n return (\n <div\n className='pointer-events-none absolute inset-0 flex rounded-small'\n data-slot='notched-outline'\n >\n {/* Left border */}\n <span\n className={cn(\n 'h-full w-[8px] rounded-l-small',\n borderColorClass,\n isThickBorder\n ? 'border-t-[2px] border-b-[2px] border-l-[2px] border-r-0'\n : 'border-t border-b border-l border-r-0',\n )}\n />\n {/* Center border (notch) */}\n <span\n className={cn(\n 'h-full relative',\n borderColorClass,\n isThickBorder\n ? 'border-t-[2px] border-b-[2px] border-l-0 border-r-0'\n : 'border-t border-b border-l-0 border-r-0',\n isFloating && '!border-t-transparent',\n isMounted &&\n 'transition-[border-top-color] duration-150 ease-[cubic-bezier(0.4,0,0.2,1)]',\n 'motion-reduce:transition-none',\n )}\n >\n {/* Invisible spacer: center span의 너비를 label 텍스트에 맞추기 위한 요소 */}\n <span\n className='invisible text-small-medium px-[2px] leading-none whitespace-nowrap'\n aria-hidden='true'\n >\n {label}\n {required && '*'}\n </span>\n {/* Floating label */}\n <span\n id={labelId}\n data-slot='floating-label'\n data-floating={isFloating}\n className={cn(\n 'absolute left-0 px-[2px] whitespace-nowrap origin-left',\n 'text-small-medium leading-none -translate-y-1/2',\n isFloating\n ? cn('scale-100 -top-[2px]', isThickBorder && '-mt-[1px]')\n : 'top-[min(50%,18px)] scale-[1.167]',\n labelColorClass,\n transitionClass,\n )}\n >\n {label}\n {required && (\n <span className='text-danger30 ml-[1px]' aria-hidden='true'>\n *\n </span>\n )}\n </span>\n </span>\n {/* Right border */}\n <span\n className={cn(\n 'h-full flex-1 rounded-r-small',\n borderColorClass,\n isThickBorder\n ? 'border-t-[2px] border-b-[2px] border-r-[2px] border-l-0'\n : 'border-t border-b border-r border-l-0',\n )}\n />\n </div>\n )\n }\n\n // mode === 'none'\n return (\n <span\n id={labelId}\n data-slot='floating-label'\n data-floating={isFloating}\n className={cn(\n 'absolute left-[8px] pointer-events-none origin-left z-10',\n 'text-small-medium leading-none whitespace-nowrap -translate-y-1/2',\n isFloating ? '-top-[2px] scale-100' : 'top-[min(50%,18px)] scale-[1.167]',\n labelColorClass,\n transitionClass,\n )}\n >\n {label}\n {required && (\n <span className='text-danger30 ml-[1px]' aria-hidden='true'>\n *\n </span>\n )}\n </span>\n )\n}\n\nexport { FloatingLabelOutline }\n","'use client'\n\nimport * as React from 'react'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UseFloatingLabelOptions {\n /** Floating label 텍스트. 지정 시 floating label 모드 활성화 */\n label?: string\n /** 값이 있는지 여부 */\n hasValue: boolean\n /** 드롭다운 열림 여부 (Select 전용) */\n isOpen?: boolean\n /** focus 여부 */\n isFocused?: boolean\n /** 에러 상태 */\n isInvalid?: boolean\n /** 비활성 상태 */\n isDisabled?: boolean\n /** 'standard' | 'none' */\n appearance?: string\n}\n\nexport interface UseFloatingLabelReturn {\n /** label이 활성화되었는지 */\n hasLabel: boolean\n /** label이 위로 올라간 상태인지 */\n isFloating: boolean\n /** 초기 마운트 이후인지 (transition 활성화 용도) */\n isMounted: boolean\n /** label에 적용할 색상 클래스 */\n labelColorClass: string\n /** notched outline border에 적용할 색상 클래스 */\n borderColorClass: string\n /** notched outline border 두께가 두꺼운 상태인지 (focus/invalid/open → 2px) */\n isThickBorder: boolean\n /** label 고유 ID (aria-labelledby용) */\n labelId: string\n}\n\n// ============================================================================\n// Label 색상 결정\n// ============================================================================\n\nfunction getLabelColorClass(options: {\n isDisabled?: boolean\n isInvalid?: boolean\n isOpen?: boolean\n isFocused?: boolean\n hasValue: boolean\n}): string {\n const { isDisabled, isInvalid, isOpen, isFocused, hasValue } = options\n\n if (isDisabled) return 'text-sys-text-disabled'\n if (isInvalid) {\n // 부유 상태(값 있음/열림/포커스)일 때만 빨간색, 비부유(placeholder)일 때는 회색 유지\n if (hasValue || isOpen || isFocused) return 'text-danger30'\n return 'text-sys-text-placeholder'\n }\n if (isOpen || isFocused) return 'text-sys-focus-ring-bold'\n if (hasValue) return 'text-sys-text-subtler'\n return 'text-sys-text-placeholder'\n}\n\n// ============================================================================\n// Border 색상/두께 결정 (Three-box notched outline용)\n// ============================================================================\n\nfunction getBorderColorClass(options: {\n isDisabled?: boolean\n isInvalid?: boolean\n isOpen?: boolean\n isFocused?: boolean\n}): string {\n const { isDisabled, isInvalid, isOpen, isFocused } = options\n\n if (isDisabled) return 'border-sys-divider-main'\n if (isInvalid) return 'border-danger30'\n if (isOpen || isFocused) return 'border-sys-focus-ring-bold'\n return 'border-sys-divider-main'\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useFloatingLabel(options: UseFloatingLabelOptions): UseFloatingLabelReturn {\n const {\n label,\n hasValue,\n isOpen = false,\n isFocused = false,\n isInvalid = false,\n isDisabled = false,\n } = options\n\n const hasLabel = !!label\n const isFloating = hasValue || isOpen || isFocused\n\n // 초기 마운트 시 transition 비활성화 (defaultValue 깜빡임 방지)\n const [isMounted, setIsMounted] = React.useState(false)\n React.useEffect(() => {\n // requestAnimationFrame으로 첫 paint 이후에 transition 활성화\n const id = requestAnimationFrame(() => setIsMounted(true))\n return () => cancelAnimationFrame(id)\n }, [])\n\n const labelId = React.useId()\n\n const labelColorClass = getLabelColorClass({\n isDisabled,\n isInvalid,\n isOpen,\n isFocused,\n hasValue,\n })\n\n const borderColorClass = getBorderColorClass({\n isDisabled,\n isInvalid,\n isOpen,\n isFocused,\n })\n\n const isThickBorder = !!isInvalid || isOpen || isFocused\n\n return {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n }\n}\n","const word = {\n common: {\n pickDate: '날짜 선택',\n startDate: '시작일',\n startTime: '시작 시간',\n none: '선택 안함',\n directSelect: '직접 선택',\n },\n}\n\nexport default word\n","'use client'\n\nimport { forwardRef } from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../utils/cn'\n\nconst labelVariants = cva('text-sys-text-main text-base-regular')\n\nconst Label = forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport { useCallback, useMemo, useState } from 'react'\nimport { DateRange, SelectRangeEventHandler, SelectSingleEventHandler } from 'react-day-picker'\nimport { add, addDays, differenceInCalendarDays, isSameDay, subDays } from 'date-fns'\nimport { CheckIcon, ChevronLeft } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Button } from './button'\nimport { Calendar, CalendarProps } from './calendar'\nimport { Command, CommandItem, CommandList } from './command'\nimport { Label } from './label'\nimport { Separator } from './separator'\nimport { Stack } from './stack'\n\n// 항목 레이아웃은 cmdk가 CommandList 안에 렌더하는 sizer div에 건다 (구 CommandGroup 자리)\nconst DATE_PRESETS_LIST_SIZER_CLASS =\n '[&_[cmdk-list-sizer]]:flex [&_[cmdk-list-sizer]]:flex-col [&_[cmdk-list-sizer]]:gap-[2px]'\n\nexport type DateRangePresetsProps = {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n options?: {\n value: string\n label: string\n }[]\n defaultValue?: string\n allText?: string\n calendarButtonLabel?: string\n date?: DateRange\n setDate?: SelectRangeEventHandler\n calendarProps?: CalendarProps\n todayPosition?: 'to' | 'from'\n withPresets?: boolean\n /** '선택 안함' 옵션 표시 여부 (default: true) */\n showAllOption?: boolean\n /** '직접 선택' 버튼 표시 여부 (default: true) */\n showCalendarButton?: boolean\n}\n\nconst dateRangeOptions = [\n { value: '3', label: '최근 3일' },\n { value: '7', label: '최근 7일' },\n { value: '14', label: '최근 14일' },\n { value: '30', label: '최근 30일' },\n { value: '90', label: '최근 90일' },\n]\n\nfunction DateRangePresets({\n options = dateRangeOptions,\n className,\n defaultValue,\n date,\n setDate,\n allText = word.common.none,\n calendarButtonLabel = word.common.directSelect,\n calendarProps,\n todayPosition = 'to',\n withPresets = true,\n showAllOption = true,\n showCalendarButton = true,\n}: DateRangePresetsProps) {\n // 커스텀 날짜 범위 레이블 반환\n const getMatchingDateRangeLabel = useCallback(\n (date?: DateRange, todayPosition: 'to' | 'from' = 'to') => {\n if (!date?.from || !date?.to) return undefined\n\n const today = new Date()\n\n const isMatch =\n todayPosition === 'to' ? isSameDay(date.to, today) : isSameDay(date.from, today)\n\n // to가 오늘인지 확인\n if (!isMatch) return 'custom'\n\n // from부터 today까지 몇일 차이인지 계산\n const daysDiff =\n todayPosition === 'to'\n ? differenceInCalendarDays(today, date.from)\n : differenceInCalendarDays(date.to, today)\n\n // options에서 일치하는 값 찾기\n const matched = options.find((opt) => opt.value === daysDiff.toString())\n\n return matched?.value.toString()\n },\n [options],\n )\n\n /**\n * 선택된 날짜 범위 값\n * 숫자 문자열 -> 옵션날짜 범위\n * undefined -> 선택 안함\n * 'custom' -> 직접 선택 날짜 범위\n */\n const [selectedValues, setSelectedValues] = useState<string | undefined>(\n defaultValue || getMatchingDateRangeLabel(date),\n )\n\n // 선택된 날짜 범위 초기화(선택 안함)\n function reset() {\n setSelectedValues(undefined)\n if (setDate) {\n setDate(undefined, new Date(), {}, {} as React.MouseEvent)\n }\n }\n\n // 커스텀 날짜 범위 캘린더 열림 여부\n const [isCustomCalendarOpen, setIsCustomCalendarOpen] = useState(false)\n\n if (isCustomCalendarOpen || !withPresets) {\n return (\n <Stack direction='column' spacing={8}>\n <Separator />\n <Calendar\n {...calendarProps}\n mode='range'\n selected={date}\n onSelect={setDate}\n initialFocus\n numberOfMonths={2}\n />\n {withPresets && (\n <>\n <Separator />\n <Button\n variant='secondary'\n className='self-start'\n onClick={() => setIsCustomCalendarOpen(false)}\n spacing={'compact'}\n >\n <ChevronLeft />\n 뒤로가기\n </Button>\n </>\n )}\n </Stack>\n )\n }\n\n return (\n <div className={cn('flex flex-col gap-[8px]', className?.Command)}>\n <Command>\n {/* heading 없는 CommandGroup을 걷어내 listbox > option 구조 유지. 레이아웃은 sizer에 건다 */}\n <CommandList\n label='날짜 필터'\n className={cn(\n DATE_PRESETS_LIST_SIZER_CLASS,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n {showAllOption && (\n <CommandItem\n key='none'\n onSelect={reset}\n data-state={selectedValues === undefined ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === undefined && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px] ',\n )}\n />\n <Label className='text-inherit'>{allText}</Label>\n </CommandItem>\n )}\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={() => {\n const today = new Date()\n const days = parseInt(option.value)\n\n const dateRange =\n todayPosition === 'to'\n ? { from: subDays(today, days), to: today }\n : { from: today, to: addDays(today, days) }\n\n const matchingLabel = getMatchingDateRangeLabel(dateRange, todayPosition)\n\n if (matchingLabel) {\n setSelectedValues(matchingLabel)\n }\n\n setDate?.(dateRange, new Date(), {}, {} as React.MouseEvent)\n }}\n data-state={selectedValues === option.value ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === option.value && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px]',\n )}\n />\n <Label className='text-inherit'>{option.label}</Label>\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n {showCalendarButton && (\n <Button\n variant='secondary'\n spacing='compact'\n className='w-full'\n onClick={() => {\n setIsCustomCalendarOpen(true)\n setSelectedValues('custom')\n }}\n >\n {calendarButtonLabel}\n </Button>\n )}\n </div>\n )\n}\n\nexport type DatePresetsProps = {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n options?: {\n value: Date\n label: string\n }[]\n defaultValue?: Date\n allText?: string\n calendarButtonLabel?: string\n date?: Date\n setDate?: SelectSingleEventHandler\n calendarProps?: CalendarProps\n withPresets?: boolean\n}\n\n// 모듈 로드 시점에 한 번 계산하면 탭을 하루 넘게 켜 두었을 때 날짜가 어긋나므로, 렌더할 때 오늘 기준으로 만든다\nfunction createDefaultDateOptions(today: Date) {\n return [\n { value: add(today, { weeks: 1 }), label: '1주일 후' },\n { value: add(today, { weeks: 2 }), label: '2주일 후' },\n { value: add(today, { months: 1 }), label: '1개월 후' },\n { value: add(today, { months: 6 }), label: '6개월 후' },\n { value: add(today, { years: 1 }), label: '1년 후' },\n ]\n}\n\nfunction DatePresets({\n options: optionsProp,\n className,\n defaultValue,\n date,\n setDate,\n allText = '선택 안함',\n calendarButtonLabel = '직접 선택',\n calendarProps,\n withPresets = true,\n}: DatePresetsProps) {\n // 팝오버를 열 때(마운트) 오늘 기준으로 계산\n const options = useMemo(() => optionsProp ?? createDefaultDateOptions(new Date()), [optionsProp])\n const [selectedValues, setSelectedValues] = useState<Date | undefined>(date || defaultValue)\n // 기본 옵션은 열 때마다 시각이 달라지므로 같은 날인지로 선택 여부를 판단한다\n const isSelected = (value: Date) => !!selectedValues && isSameDay(selectedValues, value)\n\n function reset() {\n setSelectedValues(undefined)\n if (setDate) {\n setDate(undefined, new Date(), {}, {} as React.MouseEvent)\n }\n }\n\n const [isCustomCalendarOpen, setIsCustomCalendarOpen] = useState(false)\n\n if (isCustomCalendarOpen || !withPresets) {\n return (\n <Stack direction='column' spacing={8}>\n <Separator />\n <Calendar\n {...calendarProps}\n mode='single'\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n {withPresets && (\n <>\n <Separator />\n <Button\n variant='secondary'\n className='self-start'\n onClick={() => setIsCustomCalendarOpen(false)}\n spacing={'compact'}\n >\n <ChevronLeft />\n 뒤로가기\n </Button>\n </>\n )}\n </Stack>\n )\n }\n\n return (\n <div className={cn('flex flex-col gap-[8px]', className?.Command)}>\n <Command>\n {/* heading 없는 CommandGroup을 걷어내 listbox > option 구조 유지. 레이아웃은 sizer에 건다 */}\n <CommandList\n label='날짜 필터'\n className={cn(\n DATE_PRESETS_LIST_SIZER_CLASS,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n <CommandItem\n key='none'\n onSelect={reset}\n data-state={selectedValues === undefined ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === undefined && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px] ',\n )}\n />\n <Label className='text-inherit'>{allText}</Label>\n </CommandItem>\n {options.map((option) => (\n <CommandItem\n key={option.value.toISOString()}\n value={option.value.toISOString()}\n onSelect={() => {\n setSelectedValues(option.value)\n if (setDate) {\n setDate(option.value, new Date(), {}, {} as React.MouseEvent)\n }\n }}\n data-state={isSelected(option.value) ? 'checked' : 'unchecked'}\n className={cn(className?.CommandItem)}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n isSelected(option.value) && 'opacity-100',\n 'shrink-0 !w-[16px] !h-[16px]',\n )}\n />\n <Label className='text-inherit'>{option.label}</Label>\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n <Button\n variant='secondary'\n spacing='compact'\n className='w-full'\n onClick={() => setIsCustomCalendarOpen(true)}\n >\n {calendarButtonLabel}\n </Button>\n </div>\n )\n}\n\nexport { DatePresets, DateRangePresets }\n","'use client'\n\nimport { ReactNode, useCallback, useMemo, useState } from 'react'\nimport { format } from 'date-fns'\nimport { ko } from 'date-fns/locale'\nimport { CheckIcon, ChevronsUpDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Command, CommandEmpty, CommandList } from './command'\nimport {\n DatePresets,\n DatePresetsProps,\n DateRangePresets,\n DateRangePresetsProps,\n} from './datePresets'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\nimport {\n getTableFilterTextSlotClassName,\n handleTableFilterSpaceToggle,\n TableFilterCheckboxCommandItem,\n tableFilterCommandClassName,\n TableFilterCommandItem,\n tableFilterCommandListClassName,\n tableFilterCommandListSizerClassName,\n TableFilterLoadingItem,\n tableFilterPopoverContentClassName,\n TableFilterSearchInput,\n TableFilterTriggerButton,\n} from './tableFilterParts'\n\n/**\n * 필터 타이틀\n */\ninterface FilterTitleType {\n title?: string\n}\n\nfunction FilterTitle({ title = '필터' }: FilterTitleType) {\n return <span className='text-small-bold-h text-sys-text-main px-[4px]'>{title}</span>\n}\n\n/**\n * 날짜 선택 옵션\n */\ntype DateRangeSelectProps = FilterTitleType &\n DateRangePresetsProps & {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n }\n label?: string\n disabled?: boolean\n }\n\nconst dateOptions = [\n { value: '3', label: '최근 3일' },\n { value: '7', label: '최근 7일' },\n { value: '14', label: '최근 14일' },\n { value: '30', label: '최근 30일' },\n { value: '90', label: '최근 90일' },\n]\n\n/**\n * 목록 필터의 기간 선택. 프리셋(오늘·7일·30일 등)을 함께 보여 준다. 폼 입력이면 DatePickerRange 를 쓴다.\n */\nfunction TableFilterDateRangeSelect({\n label = word.common.pickDate,\n className,\n disabled = false,\n ...datePresetsProps\n}: DateRangeSelectProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={Boolean(datePresetsProps?.date?.from || datePresetsProps?.date?.to)}\n isPlaceholder={!datePresetsProps?.date?.from}\n className={className?.button}\n disabled={disabled}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n {datePresetsProps?.date?.from ? (\n datePresetsProps?.date?.to ? (\n <>\n {format(datePresetsProps?.date?.from, 'LLL dd, y', { locale: ko })} -{' '}\n {format(datePresetsProps?.date?.to, 'LLL dd, y', { locale: ko })}\n </>\n ) : (\n format(datePresetsProps?.date?.from, 'LLL dd, y', { locale: ko })\n )\n ) : (\n label\n )}\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label='날짜 필터'\n className={cn('w-[220px] !p-[8px] flex flex-col gap-[8px]', className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={'날짜 필터'} />\n <DateRangePresets options={dateOptions} {...datePresetsProps} />\n </PopoverContent>\n </Popover>\n )\n}\n\n/**\n * 날짜 선택 옵션\n */\ntype DateSelectProps = FilterTitleType &\n DatePresetsProps & {\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n }\n label?: string\n disabled?: boolean\n }\n\n/**\n * 목록 필터의 날짜 선택(하루). 기간이면 TableFilterDateRangeSelect, 폼 입력이면 DatePicker 를 쓴다.\n */\nfunction TableFilterDateSelect({\n label = word.common.pickDate,\n className,\n disabled = false,\n ...datePresetsProps\n}: DateSelectProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={Boolean(datePresetsProps?.date)}\n isPlaceholder={!datePresetsProps?.date}\n className={className?.button}\n disabled={disabled}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n {datePresetsProps?.date ? format(datePresetsProps.date, 'PPP', { locale: ko }) : label}\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label='날짜 필터'\n className={cn('w-[220px] !p-[8px] flex flex-col gap-[8px]', className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={'날짜 필터'} />\n <DatePresets {...datePresetsProps} />\n </PopoverContent>\n </Popover>\n )\n}\n\n/**\n * 다중 선택 옵션\n */\nexport type Option = {\n value: string\n label: string\n render?: ReactNode\n}\n\n/**\n * 필터 트리거 문구: title 이 있으면 \"{title} · {값}\" — 무엇을 거르는 필터인지 항상 보인다.\n * placeholder 는 라벨을 대신할 수 없다(값을 고르면 사라지고, 소비 코드가 \"전체\" 만 넣으면 대상이 사라진다 — 2026-10-10 Q1-B 22건).\n */\nfunction TitledValue({ title, children }: { title?: string; children: ReactNode }) {\n if (!title) return <>{children}</>\n return (\n <>\n <span className='font-normal text-sys-text-subtle'>{title}</span>\n <span aria-hidden className='px-[4px] font-normal text-sys-text-subtler'>\n ·\n </span>\n {children}\n </>\n )\n}\n\n/**\n * MultiSelect 컴포넌트의 Props\n */\ninterface MultiSelectProps extends FilterTitleType {\n /** 선택 드롭다운에 표시될 옵션 배열 */\n options: Option[]\n /** 선택이 변경될 때 호출되는 콜백 함수 */\n onChange: (selected: string[]) => void\n /** 초기 선택된 값들 */\n defaultValue?: string[]\n /** 현재 선택된 값들 (제어 컴포넌트로 사용 시) */\n value?: string[]\n /** 아무것도 고르지 않았을 때의 **값** 문구. `title` 이 있으면 트리거는 항상 \"{title} · {값}\"(예: 상태 · 전체)으로 그려지고, 이 값의 기본은 \"전체\". title 이 없으면 기본 \"선택\" */\n placeholder?: string\n /** 사용 가능한 옵션이 없을 때 표시되는 텍스트 */\n emptyText?: string\n /** 목록 안 '전체 선택' 항목의 텍스트. 트리거의 전체 상태 문구는 `placeholder`(기본 \"전체\", title 이 있으면 \"{title} · 전체\") 가 맡는다 */\n allText?: string\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n optionRender?: string\n }\n /** 검색 입력창의 placeholder 텍스트 */\n searchPlaceholder?: string\n /** 검색 입력창 표시 여부 */\n searchable?: boolean\n /** 전체 선택 해제 허용 여부 (기본값: false) */\n allowEmpty?: boolean\n /** 옵션 로딩 상태 */\n loading?: boolean\n /** 로딩 상태에 표시할 텍스트 */\n loadingText?: string\n}\n\n/**\n * 목록 화면 상단의 필터 드롭다운(복수 선택). 표의 결과를 거르는 조건에 쓴다.\n *\n * 언제 쓰나: PageHeader 의 필터 줄에서 상태·유형처럼 값 집합이 정해진 조건. 바뀌면 소비 앱이 1페이지로 되돌린다.\n * 언제 안 쓰나: 폼 입력값(→ Select·MultiSelect), 자유 텍스트 검색·컬럼별 조건(→ ColumnFilter), 날짜 범위(→ TableFilterDateRangeSelect).\n * 대신/함께: 하나만 고르는 조건은 TableFilterSingleSelect. 여러 필터를 한 번에 비우는 \"필터 초기화\" 링크를 같이 둔다.\n */\nfunction MultiSelect({\n title,\n options,\n defaultValue = [],\n value,\n onChange,\n placeholder: placeholderProp,\n emptyText = '조회 가능한 옵션이 없습니다.',\n searchPlaceholder = '검색',\n allText = '전체 선택',\n searchable = true,\n className,\n allowEmpty = false,\n loading = false,\n loadingText = '로드 중',\n}: MultiSelectProps) {\n // 빈 값 문구. title 은 TitledValue 가 항상 앞에 붙인다(\"상태 · 전체\") — 2026-10-09·10 Q1 평가: 라벨 없는 '전체' 반복 지적\n const placeholder = placeholderProp ?? (title ? '전체' : '선택')\n // 전체 선택(또는 아무것도 안 고른) 상태의 트리거 문구. 목록 안 \"전체 선택\" 항목(allText)과는 별개\n const allTriggerLabel = placeholderProp ?? (title ? '전체' : allText)\n const [open, setOpen] = useState(false)\n const [selectedValues, setSelectedValues] = useState<string[]>(value ?? defaultValue)\n\n const [prevValue, setPrevValue] = useState(value)\n\n // 외부 value prop과 내부 상태 동기화 (State From Props Pattern)\n if (value !== undefined && value !== prevValue) {\n setSelectedValues(value || [])\n setPrevValue(value)\n }\n\n const handleSelect = useCallback(\n (value: string) => {\n const updatedSelected = selectedValues.includes(value)\n ? selectedValues.filter((item) => item !== value)\n : [...selectedValues, value]\n\n setSelectedValues(updatedSelected)\n onChange(updatedSelected)\n },\n [selectedValues, onChange],\n )\n\n const selectedLabels = useMemo(\n () =>\n selectedValues\n .map((value) => options.find((option) => option.value === value)?.label)\n .filter(Boolean)\n .join(', '),\n [selectedValues, options],\n )\n\n const allValues = useMemo(() => options.map((option) => option.value), [options])\n const isAllSelected = options.length > 0 && selectedValues.length === options.length\n\n // 전체 토글\n const toggleAll = () => {\n if (isAllSelected) {\n setSelectedValues([])\n onChange([])\n } else {\n setSelectedValues(allValues)\n onChange(allValues)\n }\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={selectedValues.length > 0}\n isPlaceholder={selectedValues.length === 0}\n className={className?.button}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n <TitledValue title={title}>\n {(selectedValues.length === 0 && !allowEmpty) ||\n selectedValues.length === options.length\n ? allTriggerLabel\n : selectedValues.length > 0\n ? selectedLabels\n : placeholder}\n </TitledValue>\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label={title ?? '필터'}\n className={cn(tableFilterPopoverContentClassName, className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={title} />\n\n <Command\n className={cn(tableFilterCommandClassName, className?.Command)}\n onKeyDown={handleTableFilterSpaceToggle}\n >\n {searchable && (\n <TableFilterSearchInput\n placeholder={searchPlaceholder}\n className={className?.CommandInput}\n />\n )}\n <CommandList\n label={title ?? '필터'}\n className={cn(\n tableFilterCommandListClassName,\n tableFilterCommandListSizerClassName,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n <CommandEmpty>{emptyText}</CommandEmpty>\n {loading ? (\n <TableFilterLoadingItem label={loadingText} />\n ) : (\n <>\n <TableFilterCheckboxCommandItem\n key='all'\n onSelect={toggleAll}\n checked={isAllSelected}\n className={className?.CommandItem}\n >\n {allText}\n </TableFilterCheckboxCommandItem>\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value)\n\n return (\n <TableFilterCheckboxCommandItem\n key={option.value}\n value={option.value}\n onSelect={() => handleSelect(option.value)}\n checked={isSelected}\n className={className?.CommandItem}\n contentClassName={cn(\n option.render && 'justify-start',\n className?.optionRender,\n )}\n >\n {option.render || option.label}\n </TableFilterCheckboxCommandItem>\n )\n })}\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n/**\n * 단일 선택 옵션\n */\n\n/**\n * MultiSelect 컴포넌트의 Props\n */\ninterface SingleSelectProps extends FilterTitleType {\n /** 선택 드롭다운에 표시될 옵션 배열 */\n options: Option[]\n /** 선택이 변경될 때 호출되는 콜백 함수 */\n onChange: (selected: Option | null) => void\n /** 초기 선택된 값 */\n value?: string\n /** 아무것도 고르지 않았을 때의 **값** 문구. `title` 이 있으면 트리거는 항상 \"{title} · {값}\"(예: 상태 · 전체)으로 그려지고, 이 값의 기본은 \"전체\". title 이 없으면 기본 \"선택\" */\n placeholder?: string\n /** 사용 가능한 옵션이 없을 때 표시되는 텍스트 */\n emptyText?: string\n /** '선택 안함' 옵션에 표시되는 텍스트 */\n allText?: string\n /** '선택 안함' 옵션 표시 여부 */\n allTextVisible?: boolean\n /** 컴포넌트의 각 부분에 대한 className 오버라이드 */\n className?: {\n button?: string\n PopoverContent?: string\n Command?: string\n CommandInput?: string\n CommandList?: string\n CommandGroup?: string\n CommandItem?: string\n }\n /** 검색 입력창의 placeholder 텍스트 */\n searchPlaceholder?: string\n /** 검색 입력창 표시 여부 */\n searchable?: boolean\n /** 선택 시 자동으로 닫힘 여부 */\n closeOnSelect?: boolean\n /** 옵션 로딩 상태 */\n loading?: boolean\n /** 로딩 상태에 표시할 텍스트 */\n loadingText?: string\n}\n\n/**\n * 목록 필터 드롭다운(단일 선택). 언제 쓰나·안 쓰나는 TableFilterMultiSelect 와 같고, 하나만 고르는 조건(상태 등)에 쓴다. 폼 입력이면 Select.\n */\nfunction TableFilterSingleSelect({\n title,\n options,\n value = '',\n onChange,\n placeholder: placeholderProp,\n emptyText = '조회 가능한 옵션이 없습니다.',\n searchPlaceholder = '검색',\n allText = '선택 안함',\n allTextVisible = true,\n searchable = true,\n className,\n closeOnSelect = false,\n loading = false,\n loadingText = '로드 중',\n}: SingleSelectProps) {\n // 빈 값 문구. title 은 TitledValue 가 항상 앞에 붙인다(\"상태 · 전체\") — 2026-10-09·10 Q1 평가: 라벨 없는 '전체' 반복 지적\n const placeholder = placeholderProp ?? (title ? '전체' : '선택')\n const [open, setOpen] = useState(false)\n const [selectedValues, setSelectedValues] = useState<Option | null>(\n () => options.find((option) => option.value === value) ?? null,\n )\n\n const [prevValue, setPrevValue] = useState(value)\n const [prevOptions, setPrevOptions] = useState(options)\n\n if (value !== prevValue || options !== prevOptions) {\n setPrevValue(value)\n setPrevOptions(options)\n const filtered = options.filter((option) => option.value === value)\n\n if (filtered.length === 0) {\n setSelectedValues(null)\n } else {\n setSelectedValues(filtered[0])\n }\n }\n\n const handleSelect = useCallback(\n (value: Option) => {\n setSelectedValues(value)\n onChange(value)\n // Radix UI Popover closing issue fix: Defer closing to next tick\n if (closeOnSelect) setTimeout(() => setOpen(false), 0)\n },\n [onChange, closeOnSelect],\n )\n\n // 전체 토글\n const toggleAll = () => {\n setSelectedValues(null)\n onChange({ label: allText, value: '' })\n if (closeOnSelect) setTimeout(() => setOpen(false), 0)\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <TableFilterTriggerButton\n role='combobox'\n aria-expanded={open}\n isSelected={Boolean(selectedValues)}\n isPlaceholder={!selectedValues}\n className={className?.button}\n rightIcon={<ChevronsUpDown className='h-4 w-4 opacity-50' />}\n >\n <TitledValue title={title}>{selectedValues?.label || placeholder}</TitledValue>\n </TableFilterTriggerButton>\n </PopoverTrigger>\n <PopoverContent\n aria-label={title ?? '필터'}\n className={cn(tableFilterPopoverContentClassName, className?.PopoverContent)}\n align='start'\n >\n <FilterTitle title={title} />\n\n <Command\n className={cn(tableFilterCommandClassName, className?.Command)}\n onKeyDown={handleTableFilterSpaceToggle}\n >\n {searchable && (\n <TableFilterSearchInput\n placeholder={searchPlaceholder}\n className={className?.CommandInput}\n />\n )}\n <CommandList\n label={title ?? '필터'}\n className={cn(\n tableFilterCommandListClassName,\n tableFilterCommandListSizerClassName,\n className?.CommandGroup,\n className?.CommandList,\n )}\n >\n <CommandEmpty>{emptyText}</CommandEmpty>\n {loading ? (\n <TableFilterLoadingItem label={loadingText} />\n ) : (\n <>\n {allTextVisible && (\n <TableFilterCommandItem\n key='all'\n onSelect={toggleAll}\n isSelected={selectedValues === null}\n className={className?.CommandItem}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n selectedValues === null && 'opacity-100',\n 'shrink-0 !h-[16px] !w-[16px]',\n )}\n />\n <span\n className={getTableFilterTextSlotClassName({\n selected: selectedValues === null,\n })}\n >\n {allText}\n </span>\n </TableFilterCommandItem>\n )}\n {options.map((option) => {\n const isSelected = selectedValues?.value === option.value\n\n return (\n <TableFilterCommandItem\n key={option.value}\n value={option.value}\n onSelect={() => handleSelect(option)}\n isSelected={isSelected}\n className={className?.CommandItem}\n >\n <CheckIcon\n className={cn(\n 'opacity-0',\n isSelected && 'opacity-100',\n 'shrink-0 !h-[16px] !w-[16px]',\n )}\n />\n <span\n className={getTableFilterTextSlotClassName({\n selected: isSelected,\n })}\n >\n {option.render || option.label}\n </span>\n </TableFilterCommandItem>\n )\n })}\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport {\n MultiSelect as TableFilterMultiSelect,\n TableFilterSingleSelect,\n TableFilterDateSelect,\n TableFilterDateRangeSelect,\n FilterTitle as TableFilterTitle,\n}\n\n// ---------------------------------------------------------------------------\n// Deprecated 별칭 — 같은 컴포넌트가 두 이름으로 노출되면 에이전트와 사람 모두 헷갈리고,\n// `SingleSelect` 는 일반 Select 와 구분되지 않는다. 다음 메이저에서 제거한다.\n// ---------------------------------------------------------------------------\n\n/** @deprecated `TableFilterSingleSelect` 를 사용하세요. 다음 메이저 버전에서 제거됩니다. */\nconst SingleSelect = TableFilterSingleSelect\n/** @deprecated `TableFilterDateSelect` 를 사용하세요. 다음 메이저 버전에서 제거됩니다. */\nconst DateSelect = TableFilterDateSelect\n/** @deprecated `TableFilterDateRangeSelect` 를 사용하세요. 다음 메이저 버전에서 제거됩니다. */\nconst DateRangeSelect = TableFilterDateRangeSelect\n\nexport { SingleSelect, DateSelect, DateRangeSelect }\n","'use client'\n\nimport * as React from 'react'\nimport { DateRange, SelectRangeEventHandler, SelectSingleEventHandler } from 'react-day-picker'\nimport { cva } from 'class-variance-authority'\nimport { format } from 'date-fns'\nimport { Calendar as CalendarIcon } from 'lucide-react'\n\nimport { CancelIcon, CLEAR_HOST_CLASS, CLEAR_REVEAL_CLASS } from './_internal/cancelIcon'\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Calendar, CalendarProps } from './calendar'\nimport { DatePresets, DatePresetsProps, DateRangePresets } from './datePresets'\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './popover'\nimport { TableFilterTitle } from './tableFilter'\n\n// ============================================================================\n// Trigger CVA (selectTriggerVariants 패턴)\n// ============================================================================\n\n// 래퍼 div 에 적용된다 (트리거 button 과 Clear button 의 공통 부모). 포커스 링은 focus-within, 비활성은 data-disabled.\nconst datePickerTriggerVariants = cva(\n [\n 'flex w-[250px] items-center gap-[2px] bg-transparent whitespace-nowrap outline-none cursor-pointer',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10 data-[disabled]:hover:bg-sys-background',\n 'focus-within:border-[2px] focus-within:border-sys-focus-ring-bold focus-within:py-[2px] focus-within:px-[4px]',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px] focus-within:border-danger30',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\n// ============================================================================\n// DatePickerTrigger (내부 공유 컴포넌트)\n// ============================================================================\n\ninterface DatePickerTriggerProps {\n open: boolean\n hasValue: boolean\n displayText: string\n placeholder: string\n disabled?: boolean\n isInvalid?: boolean\n label?: string\n required?: boolean\n appearance?: 'standard' | 'none'\n onClear?: () => void\n onFocus?: React.FocusEventHandler<HTMLButtonElement>\n onBlur?: React.FocusEventHandler<HTMLButtonElement>\n className?: string\n}\n\nconst DatePickerTrigger = React.forwardRef<HTMLButtonElement, DatePickerTriggerProps>(\n (\n {\n open,\n hasValue,\n displayText,\n placeholder,\n disabled,\n isInvalid,\n label,\n required: requiredProp,\n appearance = 'standard',\n onClear,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n className,\n },\n ref,\n ) => {\n const [isFocused, setIsFocused] = React.useState(false)\n\n // BP-2: open state → useFloatingLabel\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n const handleClearClick = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n onClear?.()\n },\n [onClear],\n )\n\n // 트리거 button 과 Clear button 은 형제다(위젯 중첩 금지, axe nested-interactive).\n // 래퍼 div 가 모양을 담당하고, 래퍼의 빈 영역(아이콘 등)을 눌러도 트리거가 눌리도록 포워딩한다.\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const setRefs = (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLButtonElement | null>).current = node\n }\n // 마우스 편의용: 아이콘 등 래퍼의 빈 영역 클릭을 트리거로 넘긴다. 키보드·보조기기는 트리거 button 을 직접 쓴다\n const handleWrapperClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const t = e.target as HTMLElement\n if (t.closest('[data-slot=datepicker-trigger],[data-slot=datepicker-clear]')) return\n triggerRef.current?.click()\n }\n\n return (\n <PopoverAnchor asChild>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- 포인터 편의 포워딩, 실제 컨트롤은 안쪽 button */}\n <div\n data-slot='datepicker'\n data-state={open ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n className={cn(\n datePickerTriggerVariants({ appearance, isInvalid }),\n CLEAR_HOST_CLASS,\n '[&_[data-placeholder]]:text-sys-text-subtler',\n (showNotchedOutline || showNoneLabel) && 'relative',\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n className,\n )}\n onClick={handleWrapperClick}\n >\n {/* FloatingLabelOutline (조건부) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n <PopoverTrigger asChild>\n <button\n ref={setRefs}\n type='button'\n data-slot='datepicker-trigger'\n data-state={open ? 'open' : 'closed'}\n aria-labelledby={hasLabel ? labelId : undefined}\n disabled={disabled}\n className={cn(\n 'flex flex-1 items-center min-h-[28px] min-w-0 px-[4px] py-[2px] text-left bg-transparent outline-none cursor-pointer',\n 'disabled:cursor-not-allowed',\n hasLabel && !hasValue && 'invisible',\n )}\n onFocus={hasLabel ? handleFocus : onFocusProp}\n onBlur={hasLabel ? handleBlur : onBlurProp}\n >\n {hasValue ? (\n <span className='truncate'>{displayText}</span>\n ) : (\n <span data-placeholder className='truncate'>\n {placeholder}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n {/* Clear 버튼 — 형제 button. 값이 없거나 비활성이면 invisible(폭 유지, 포커스 불가), 값이 있으면 마우스·포커스 때만 보임 */}\n {onClear && (\n <button\n type='button'\n data-slot='datepicker-clear'\n onClick={handleClearClick}\n disabled={disabled}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler cursor-pointer outline-none',\n 'focus-visible:ring-[2px] focus-visible:ring-sys-focus-ring-main',\n CLEAR_REVEAL_CLASS,\n (!hasValue || disabled) && 'invisible',\n )}\n aria-label='날짜 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* Calendar 아이콘 (장식, 클릭은 래퍼가 트리거로 포워딩) */}\n <CalendarIcon aria-hidden className='size-[24px] shrink-0 text-sys-text-main' />\n </div>\n </PopoverAnchor>\n )\n },\n)\nDatePickerTrigger.displayName = 'DatePickerTrigger'\n\n// ============================================================================\n// DatePicker (Single)\n// ============================================================================\n\nexport type DatePickerProps = {\n date?: Date\n setDate?: SelectSingleEventHandler\n /** 클래스 오버라이드. `button` = 트리거 틀(기본 폭 250px — 폼 칸을 채우려면 `'w-full'`), `PopoverContent` = 달력 팝오버 */\n classNames?: {\n button?: string\n PopoverContent?: string\n }\n disabled?: boolean\n placeholder?: string\n withPresets?: boolean\n datePresetsProps?: Omit<DatePresetsProps, 'date' | 'setDate'>\n calendarProps?: CalendarProps\n isInvalid?: boolean\n /** Floating label 텍스트 */\n label?: string\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** 라벨 필수 표시 (*) */\n required?: boolean\n}\n\n/**\n * 날짜 하나를 고르는 입력. 트리거를 누르면 달력 팝오버가 열린다.\n *\n * 언제 쓰나: 폼의 날짜 필드(시작일·만료일·예약일). `FormField` 안에서 `FormControl` 로 감싸 오류 상태(`isInvalid`)를 받는다. 시각까지 필요하면 옆에 `TimePicker` 를 둔다.\n * 언제 안 쓰나: 기간(→ DatePickerRange), 시각만(→ TimePicker).\n * 대신/함께: 기본 폭은 250px 이다. 폼 칸을 채우려면 `classNames={{ button: 'w-full' }}`(TimePicker 는 `classNames={{ trigger: 'w-full' }}`) — 좁은 고정 폭이 두 칸 줄의 절반을 비워 감점됐다(2026-10-28 홀드아웃 14).\n */\nexport function DatePicker({\n date,\n setDate,\n classNames,\n disabled,\n placeholder = word.common.startDate,\n withPresets = false,\n datePresetsProps,\n calendarProps,\n isInvalid = false,\n label,\n appearance = 'standard',\n required,\n}: DatePickerProps) {\n // BP-2: controlled Popover\n const [open, setOpen] = React.useState(false)\n\n const handleClear = React.useCallback(() => {\n setDate?.(undefined, new Date(), {}, {} as React.MouseEvent)\n }, [setDate])\n\n const displayText = date ? format(date, 'yyyy-MM-dd') : ''\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <DatePickerTrigger\n open={open}\n hasValue={!!date}\n displayText={displayText}\n placeholder={placeholder}\n disabled={disabled}\n isInvalid={isInvalid}\n label={label}\n required={required}\n appearance={appearance}\n onClear={setDate ? handleClear : undefined}\n className={classNames?.button}\n />\n {withPresets ? (\n <PopoverContent\n aria-label='날짜 선택'\n className={cn('w-[220px] !p-[8px] flex flex-col gap-[8px]', classNames?.PopoverContent)}\n align='start'\n >\n <TableFilterTitle title={word.common.pickDate} />\n <DatePresets\n {...datePresetsProps}\n calendarProps={calendarProps}\n date={date}\n setDate={setDate}\n />\n </PopoverContent>\n ) : (\n <PopoverContent\n aria-label='날짜 선택'\n className={cn('p-0', classNames?.PopoverContent)}\n align='start'\n >\n <Calendar\n {...calendarProps}\n mode='single'\n selected={date}\n onSelect={setDate}\n initialFocus\n />\n </PopoverContent>\n )}\n </Popover>\n )\n}\n\n// ============================================================================\n// DatePickerRange\n// ============================================================================\n\nexport type DatePickerRangeProps = {\n date: DateRange\n setDate?: SelectRangeEventHandler\n placeholder?: string\n withPresets?: boolean\n classNames?: {\n button?: string\n }\n disabled?: boolean\n isInvalid?: boolean\n /** Floating label 텍스트 */\n label?: string\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /**\n * Calendar 에 전달할 추가 props (예: `defaultMonth`, `disabled` 날짜).\n * `mode`·`selected`·`onSelect`·`numberOfMonths` 는 DatePickerRange 가 관리한다.\n * `defaultMonth` 는 선택된 시작일(`date.from`)이 없을 때만 적용된다.\n */\n calendarProps?: Omit<CalendarProps, 'mode' | 'selected' | 'onSelect' | 'numberOfMonths'>\n}\n\nexport function DatePickerRange({\n date,\n setDate,\n withPresets = false,\n placeholder = word.common.startDate,\n classNames,\n disabled,\n isInvalid = false,\n label,\n appearance = 'standard',\n required,\n calendarProps,\n}: DatePickerRangeProps) {\n // BP-2: controlled Popover\n const [open, setOpen] = React.useState(false)\n\n const handleClear = React.useCallback(() => {\n setDate?.({ from: undefined, to: undefined }, new Date(), {}, {} as React.MouseEvent)\n }, [setDate])\n\n const hasValue = !!date.from\n const displayText = date.from\n ? date.to\n ? `${format(date.from, 'yyyy-MM-dd')} ~ ${format(date.to, 'yyyy-MM-dd')}`\n : format(date.from, 'yyyy-MM-dd')\n : ''\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <DatePickerTrigger\n open={open}\n hasValue={hasValue}\n displayText={displayText}\n placeholder={placeholder}\n disabled={disabled}\n isInvalid={isInvalid}\n label={label}\n required={required}\n appearance={appearance}\n onClear={setDate ? handleClear : undefined}\n className={classNames?.button}\n />\n <PopoverContent aria-label='기간 선택' className='w-auto p-0' align='start'>\n <div className='flex'>\n {withPresets && (\n <DateRangePresets\n className={{ Command: 'w-[220px] border-r border-sys-divider-subtler p-[8px]' }}\n date={date}\n setDate={setDate}\n showAllOption={false}\n showCalendarButton={false}\n />\n )}\n <Calendar\n {...calendarProps}\n initialFocus\n mode='range'\n defaultMonth={date?.from ?? calendarProps?.defaultMonth}\n selected={date}\n onSelect={setDate}\n numberOfMonths={2}\n />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\n\nimport { CancelIcon, CLEAR_HOST_CLASS, CLEAR_REVEAL_CLASS } from './_internal/cancelIcon'\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport { useFormControlContext } from './form'\n\nconst textFieldContainerVariants = cva(\n [\n 'flex w-full items-center gap-[2px] bg-transparent',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'transition-colors',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px]',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\nexport type TextFieldProps = Omit<React.ComponentProps<'input'>, 'children'> & {\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** Floating label 텍스트 */\n label?: string\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /** Clear 버튼 표시 여부 */\n hasClearButton?: boolean\n /** 입력 필드 왼쪽 아이콘/요소 슬롯 */\n elemBeforeInput?: React.ReactNode\n /** 입력 필드 오른쪽 아이콘/요소 슬롯 */\n elemAfterInput?: React.ReactNode\n /** 에러 상태 */\n isInvalid?: boolean\n /** 컨테이너 div에 적용할 추가 className */\n containerClassName?: string\n}\n\n/**\n * 한 줄 텍스트 입력. 폼의 이름·코드·URL·숫자 같은 짧은 값에 쓴다.\n *\n * 언제 쓰나: `FormField` 안에서 `FormControl` 로 감싸 오류 상태를 받는다. 라벨은 `FormLabel` 로 두고, 독립 사용 시에만 `label`(floating) 을 쓴다.\n * 언제 안 쓰나: 여러 줄 입력(→ Textarea), 정해진 선택지(→ Select·RadioGroup), 목록 검색·필터(→ ColumnFilter·TableFilter*).\n * 대신/함께: 지우기 버튼은 `hasClearButton`, 단위·아이콘은 `elemBeforeInput`/`elemAfterInput`.\n */\nconst TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n appearance = 'standard',\n label,\n required: requiredProp,\n hasClearButton,\n elemBeforeInput,\n elemAfterInput,\n isInvalid: isInvalidProp,\n containerClassName,\n className,\n disabled,\n readOnly,\n value: valueProp,\n defaultValue,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n ...inputProps\n },\n forwardedRef,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isFocused, setIsFocused] = React.useState(false)\n\n // Controlled vs Uncontrolled hasValue tracking\n const isControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState(\n defaultValue !== undefined ? String(defaultValue) : '',\n )\n const hasValue = isControlled ? String(valueProp) !== '' : internalValue !== ''\n\n // Compose refs (forwarded ref + internal ref)\n const composedRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n ;(inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n },\n [forwardedRef],\n )\n\n // Floating label\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n // --- Handlers ---\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value)\n onChangeProp?.(e)\n },\n [isControlled, onChangeProp],\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n const handleClear = React.useCallback(() => {\n const input = inputRef.current\n if (!input) return\n\n if (!isControlled) setInternalValue('')\n\n // Set value via native setter to trigger React's onChange\n const nativeSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set\n if (nativeSetter) {\n nativeSetter.call(input, '')\n input.dispatchEvent(new Event('input', { bubbles: true }))\n }\n\n input.focus()\n }, [isControlled])\n\n return (\n <div\n data-slot='text-field'\n aria-disabled={disabled || undefined}\n className={cn(\n textFieldContainerVariants({ appearance, isInvalid }),\n CLEAR_HOST_CLASS,\n // Focus styling (state-managed, standard appearance without notched outline only)\n isFocused &&\n !isInvalid &&\n appearance === 'standard' &&\n !showNotchedOutline &&\n 'border-[2px] border-sys-focus-ring-bold py-[2px] px-[4px]',\n // Floating label positioning\n (showNotchedOutline || showNoneLabel) && 'relative',\n // Notched outline draws border — remove container's own border\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n // Disabled / cursor\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-text',\n // disabled 시 hover 배경 무력화 (div container라 :disabled 불가 → JS 조건부; none은 원래 hover bg 없음)\n disabled && appearance !== 'none' && 'hover:bg-sys-background',\n containerClassName,\n // 외부 className 은 root container 에 적용 — FormControl 의 maxWidth 가\n // 자식 className 에 inject 되는데, wrapper div 의 폭 제어가 의도이므로\n // inner input 이 아닌 여기에 머지한다.\n className,\n )}\n >\n {/* Floating label (standard: notched outline, none: inline label) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* Left icon slot — label이 down 상태(placeholder 역할)일 때 숨김 */}\n {elemBeforeInput && (\n <span\n className={cn(\n // 아이콘은 24×24, 글자(\"개\"·\"코어\")는 줄바꿈 없이 폭이 늘어난다 — 고정 size-[24px] 는 두 글자가 두 줄로 깨졌다 (2026-10-12)\n 'shrink-0 flex items-center justify-center h-[24px] min-w-[24px] whitespace-nowrap',\n typeof elemBeforeInput === 'string' && 'px-[2px] text-sys-text-subtle',\n hasLabel && !isFloating && 'invisible',\n )}\n >\n {elemBeforeInput}\n </span>\n )}\n\n {/* Input */}\n <input\n ref={composedRef}\n disabled={disabled}\n readOnly={readOnly}\n value={isControlled ? valueProp : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-required={hasLabel && requiredProp ? true : undefined}\n className={cn(\n 'flex-1 min-w-0 bg-transparent border-none outline-none',\n 'text-base-medium text-sys-text-main',\n 'placeholder:text-sys-text-placeholder',\n 'disabled:cursor-not-allowed',\n 'px-[4px] py-[2px]',\n // When label is down (acting as placeholder), hide input's placeholder\n hasLabel && !hasValue && !isFocused && 'placeholder:text-transparent',\n )}\n {...inputProps}\n />\n\n {/* Clear button — 항상 공간 확보, 값 없으면 invisible (너비 점프 방지), 값이 있으면 마우스·포커스 때만 보임 */}\n {hasClearButton && (\n <button\n type='button'\n onClick={handleClear}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler',\n CLEAR_REVEAL_CLASS,\n (!hasValue || disabled || readOnly) && 'invisible',\n )}\n aria-label='입력 지우기'\n tabIndex={-1}\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* Right icon slot */}\n {elemAfterInput && (\n <span\n className={cn(\n 'shrink-0 flex items-center justify-center h-[24px] min-w-[24px] whitespace-nowrap',\n typeof elemAfterInput === 'string' && 'px-[2px] text-sys-text-subtle',\n )}\n >\n {elemAfterInput}\n </span>\n )}\n </div>\n )\n },\n)\nTextField.displayName = 'TextField'\n\nexport { TextField }\n","{\n \"categories\": [\n \"전체\",\n \"코딩 및 개발\",\n \"디바이스\",\n \"파일 아이콘\",\n \"과학\",\n \"보안\",\n \"접근성\",\n \"계정 및 액세스\",\n \"차트\",\n \"텍스트\",\n \"디자인\"\n ],\n \"icons\": [\n { \"name\": \"ampersand\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"ampersands\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"app-window\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"app-window-mac\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-big-up\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-big-up-dash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-down-to-line\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-right-to-line\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"arrow-up-from-line\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"asterisk\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"binary\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"binoculars\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bitcoin\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"blend\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"blocks\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-check\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-copy\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-dashed\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-down\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-key\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-lock\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-marked\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-minus\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-open\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-open-check\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-open-text\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-plus\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-up\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"book-up2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bot\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bot-message-square\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bot-off\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"box\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"boxes\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"braces\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"brackets\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"brain-circuit\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"brain-cog\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bug\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bug-off\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"bug-play\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"chevron-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-dashed\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-dot\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-dot-dashed\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-ellipsis\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-plus\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-slash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-slash2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circle-x\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"circuit-board\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"cloud-alert\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"cloud-cog\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"code\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"code-xml\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"codepen\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"codesandbox\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"combine\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"command\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"component\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"computer\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"construction\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"container\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"copy-slash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"corner-down-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"database\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"database-backup\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"database-zap\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"diff\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"divide\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"dock\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"earth-lock\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"eclipse\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"ellipsis\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"equal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"equal-not\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-code\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-code2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-diff\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-digit\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-json\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-json2\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-sliders\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-stack\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"file-terminal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"flag-triangle-left\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"flag-triangle-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"folder-code\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"folder-dot\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"folder-kanban\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"square-slash\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"square-stack\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"square-terminal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"table-properties\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"tablet-smartphone\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"telescope\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"terminal\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"toggle-left\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"toggle-right\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"toy-brick\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"trello\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"triangle-alert\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"unplug\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"variable\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"waypoints\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"webhook\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"webhook-off\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"workflow\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"wrench\", \"category\": \"코딩 및 개발\" },\n { \"name\": \"camera-off\", \"category\": \"디바이스\" },\n { \"name\": \"cassette-tape\", \"category\": \"디바이스\" },\n { \"name\": \"cast\", \"category\": \"디바이스\" },\n { \"name\": \"cctv\", \"category\": \"디바이스\" },\n { \"name\": \"computer\", \"category\": \"디바이스\" },\n { \"name\": \"cpu\", \"category\": \"디바이스\" },\n { \"name\": \"database\", \"category\": \"디바이스\" },\n { \"name\": \"database-backup\", \"category\": \"디바이스\" },\n { \"name\": \"database-zap\", \"category\": \"디바이스\" },\n { \"name\": \"diamond-minus\", \"category\": \"디바이스\" },\n { \"name\": \"diamond-plus\", \"category\": \"디바이스\" },\n { \"name\": \"disc\", \"category\": \"디바이스\" },\n { \"name\": \"disc2\", \"category\": \"디바이스\" },\n { \"name\": \"disc3\", \"category\": \"디바이스\" },\n { \"name\": \"disc-album\", \"category\": \"디바이스\" },\n { \"name\": \"drill\", \"category\": \"디바이스\" },\n { \"name\": \"drum\", \"category\": \"디바이스\" },\n { \"name\": \"earth-lock\", \"category\": \"디바이스\" },\n { \"name\": \"ethernet-port\", \"category\": \"디바이스\" },\n { \"name\": \"fingerprint\", \"category\": \"디바이스\" },\n { \"name\": \"flashlight\", \"category\": \"디바이스\" },\n { \"name\": \"flashlight-off\", \"category\": \"디바이스\" },\n { \"name\": \"gamepad\", \"category\": \"디바이스\" },\n { \"name\": \"gamepad2\", \"category\": \"디바이스\" },\n { \"name\": \"globe-lock\", \"category\": \"디바이스\" },\n { \"name\": \"hard-drive\", \"category\": \"디바이스\" },\n { \"name\": \"hard-drive-download\", \"category\": \"디바이스\" },\n { \"name\": \"hard-drive-upload\", \"category\": \"디바이스\" },\n { \"name\": \"hdmi-port\", \"category\": \"디바이스\" },\n { \"name\": \"headphone-off\", \"category\": \"디바이스\" },\n { \"name\": \"headphones\", \"category\": \"디바이스\" },\n { \"name\": \"headset\", \"category\": \"디바이스\" },\n { \"name\": \"heater\", \"category\": \"디바이스\" },\n { \"name\": \"joystick\", \"category\": \"디바이스\" },\n { \"name\": \"keyboard\", \"category\": \"디바이스\" },\n { \"name\": \"keyboard-music\", \"category\": \"디바이스\" },\n { \"name\": \"keyboard-off\", \"category\": \"디바이스\" },\n { \"name\": \"laptop\", \"category\": \"디바이스\" },\n { \"name\": \"laptop-minimal\", \"category\": \"디바이스\" },\n { \"name\": \"laptop-minimal-check\", \"category\": \"디바이스\" },\n { \"name\": \"memory-stick\", \"category\": \"디바이스\" },\n { \"name\": \"mic\", \"category\": \"디바이스\" },\n { \"name\": \"mic-off\", \"category\": \"디바이스\" },\n { \"name\": \"mic-vocal\", \"category\": \"디바이스\" },\n { \"name\": \"microchip\", \"category\": \"디바이스\" },\n { \"name\": \"monitor\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-check\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-cog\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-dot\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-down\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-off\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-pause\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-play\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-smartphone\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-speaker\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-stop\", \"category\": \"디바이스\" },\n { \"name\": \"monitor-up\", \"category\": \"디바이스\" },\n { \"name\": \"server\", \"category\": \"디바이스\" },\n { \"name\": \"server-cog\", \"category\": \"디바이스\" },\n { \"name\": \"server-crash\", \"category\": \"디바이스\" },\n { \"name\": \"server-off\", \"category\": \"디바이스\" },\n { \"name\": \"smartphone\", \"category\": \"디바이스\" },\n { \"name\": \"smartphone-charging\", \"category\": \"디바이스\" },\n { \"name\": \"smartphone-nfc\", \"category\": \"디바이스\" },\n { \"name\": \"speaker\", \"category\": \"디바이스\" },\n { \"name\": \"square-minus\", \"category\": \"디바이스\" },\n { \"name\": \"switch-camera\", \"category\": \"디바이스\" },\n { \"name\": \"tablet\", \"category\": \"디바이스\" },\n { \"name\": \"tablet-smartphone\", \"category\": \"디바이스\" },\n { \"name\": \"app-window\", \"category\": \"파일 아이콘\" },\n { \"name\": \"app-window-mac\", \"category\": \"파일 아이콘\" },\n { \"name\": \"archive\", \"category\": \"파일 아이콘\" },\n { \"name\": \"archive-restore\", \"category\": \"파일 아이콘\" },\n { \"name\": \"archive-x\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-big-down-dash\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-down-from-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-down-to-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-up-from-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"arrow-up-to-line\", \"category\": \"파일 아이콘\" },\n { \"name\": \"book-image\", \"category\": \"파일 아이콘\" },\n { \"name\": \"braces\", \"category\": \"파일 아이콘\" },\n { \"name\": \"brackets\", \"category\": \"파일 아이콘\" },\n { \"name\": \"calendar-fold\", \"category\": \"파일 아이콘\" },\n { \"name\": \"cassette-tape\", \"category\": \"파일 아이콘\" },\n { \"name\": \"chart-pie\", \"category\": \"파일 아이콘\" },\n { \"name\": \"cloud-download\", \"category\": \"파일 아이콘\" },\n { \"name\": \"cloud-upload\", \"category\": \"파일 아이콘\" },\n { \"name\": \"combine\", \"category\": \"파일 아이콘\" },\n { \"name\": \"diff\", \"category\": \"파일 아이콘\" },\n { \"name\": \"dock\", \"category\": \"파일 아이콘\" },\n { \"name\": \"download\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-archive\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-up\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-user\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-video\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-video2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-volume\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-volume2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-warning\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-x\", \"category\": \"파일 아이콘\" },\n { \"name\": \"file-x2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"files\", \"category\": \"파일 아이콘\" },\n { \"name\": \"folder\", \"category\": \"파일 아이콘\" },\n { \"name\": \"folder-archive\", \"category\": \"파일 아이콘\" },\n { \"name\": \"package\", \"category\": \"파일 아이콘\" },\n { \"name\": \"package-search\", \"category\": \"파일 아이콘\" },\n { \"name\": \"paperclip\", \"category\": \"파일 아이콘\" },\n { \"name\": \"save\", \"category\": \"파일 아이콘\" },\n { \"name\": \"trash-2\", \"category\": \"파일 아이콘\" },\n { \"name\": \"activity\", \"category\": \"과학\" },\n { \"name\": \"atom\", \"category\": \"과학\" },\n { \"name\": \"beaker\", \"category\": \"과학\" },\n { \"name\": \"binoculars\", \"category\": \"과학\" },\n { \"name\": \"biohazard\", \"category\": \"과학\" },\n { \"name\": \"brain\", \"category\": \"과학\" },\n { \"name\": \"brain-circuit\", \"category\": \"과학\" },\n { \"name\": \"brain-cog\", \"category\": \"과학\" },\n { \"name\": \"circle-gauge\", \"category\": \"과학\" },\n { \"name\": \"circuit-board\", \"category\": \"과학\" },\n { \"name\": \"eclipse\", \"category\": \"과학\" },\n { \"name\": \"flask-conical\", \"category\": \"과학\" },\n { \"name\": \"flask-conical-off\", \"category\": \"과학\" },\n { \"name\": \"flask-round\", \"category\": \"과학\" },\n { \"name\": \"gauge\", \"category\": \"과학\" },\n { \"name\": \"microscope\", \"category\": \"과학\" },\n { \"name\": \"omega\", \"category\": \"과학\" },\n { \"name\": \"orbit\", \"category\": \"과학\" },\n { \"name\": \"pipette\", \"category\": \"과학\" },\n { \"name\": \"radiation\", \"category\": \"과학\" },\n { \"name\": \"satellite\", \"category\": \"과학\" },\n { \"name\": \"shell\", \"category\": \"과학\" },\n { \"name\": \"sigma\", \"category\": \"과학\" },\n { \"name\": \"square-activity\", \"category\": \"과학\" },\n { \"name\": \"stethoscope\", \"category\": \"과학\" },\n { \"name\": \"syringe\", \"category\": \"과학\" },\n { \"name\": \"telescope\", \"category\": \"과학\" },\n { \"name\": \"test-tube\", \"category\": \"과학\" },\n { \"name\": \"test-tube-diagonal\", \"category\": \"과학\" },\n { \"name\": \"test-tubes\", \"category\": \"과학\" },\n { \"name\": \"key\", \"category\": \"보안\" },\n { \"name\": \"key-round\", \"category\": \"보안\" },\n { \"name\": \"key-square\", \"category\": \"보안\" },\n { \"name\": \"lock\", \"category\": \"보안\" },\n { \"name\": \"lock-keyhole\", \"category\": \"보안\" },\n { \"name\": \"lock-keyhole-open\", \"category\": \"보안\" },\n { \"name\": \"lock-open\", \"category\": \"보안\" },\n { \"name\": \"radar\", \"category\": \"보안\" },\n { \"name\": \"scan\", \"category\": \"보안\" },\n { \"name\": \"scan-face\", \"category\": \"보안\" },\n { \"name\": \"scan-qr-code\", \"category\": \"보안\" },\n { \"name\": \"shield\", \"category\": \"보안\" },\n { \"name\": \"shield-alert\", \"category\": \"보안\" },\n { \"name\": \"shield-ban\", \"category\": \"보안\" },\n { \"name\": \"shield-check\", \"category\": \"보안\" },\n { \"name\": \"shield-ellipsis\", \"category\": \"보안\" },\n { \"name\": \"shield-half\", \"category\": \"보안\" },\n { \"name\": \"shield-minus\", \"category\": \"보안\" },\n { \"name\": \"shield-off\", \"category\": \"보안\" },\n { \"name\": \"shield-plus\", \"category\": \"보안\" },\n { \"name\": \"shield-question\", \"category\": \"보안\" },\n\n { \"name\": \"university\", \"category\": \"건설\" },\n { \"name\": \"building-2\", \"category\": \"건설\" },\n { \"name\": \"factory\", \"category\": \"건설\" },\n { \"name\": \"fence\", \"category\": \"건설\" },\n { \"name\": \"graduation-cap\", \"category\": \"건설\" },\n { \"name\": \"house\", \"category\": \"건설\" },\n { \"name\": \"school\", \"category\": \"건설\" },\n { \"name\": \"university\", \"category\": \"건설\" },\n\n { \"name\": \"accessibility\", \"category\": \"접근성\" },\n { \"name\": \"baby\", \"category\": \"접근성\" },\n { \"name\": \"badge-help\", \"category\": \"접근성\" },\n { \"name\": \"badge-info\", \"category\": \"접근성\" },\n { \"name\": \"circle-help\", \"category\": \"접근성\" },\n { \"name\": \"contrast\", \"category\": \"접근성\" },\n { \"name\": \"ear\", \"category\": \"접근성\" },\n { \"name\": \"ear-off\", \"category\": \"접근성\" },\n { \"name\": \"eclipse\", \"category\": \"접근성\" },\n { \"name\": \"eye\", \"category\": \"접근성\" },\n { \"name\": \"eye-closed\", \"category\": \"접근성\" },\n { \"name\": \"eye-off\", \"category\": \"접근성\" },\n { \"name\": \"glasses\", \"category\": \"접근성\" },\n { \"name\": \"hand\", \"category\": \"접근성\" },\n { \"name\": \"info\", \"category\": \"접근성\" },\n { \"name\": \"life-buoy\", \"category\": \"접근성\" },\n { \"name\": \"moon\", \"category\": \"접근성\" },\n { \"name\": \"moon-star\", \"category\": \"접근성\" },\n { \"name\": \"person-standing\", \"category\": \"접근성\" },\n { \"name\": \"scan-search\", \"category\": \"접근성\" },\n { \"name\": \"speech\", \"category\": \"접근성\" },\n { \"name\": \"sun\", \"category\": \"접근성\" },\n { \"name\": \"zoom-in\", \"category\": \"접근성\" },\n { \"name\": \"zoom-out\", \"category\": \"접근성\" },\n { \"name\": \"activity\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"at-sign\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"award\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"badge\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"badge-alert\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"ban\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bell\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bell-dot\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"book-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"bookmark-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"building\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"building2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"cake\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"circle-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"circle-user-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"cog\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"contact\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"contact-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"cookie\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"id-card\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"inbox\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"key\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"key-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"key-square\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"link\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"link2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"log-in\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"log-out\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"mail\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-check-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-house\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-minus-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-plus-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pin-x-inside\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"map-pinned\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"menu\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"message-circle-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"notebook-tabs\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"pin\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"scan-eye\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"scan-face\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"scan-qr-code\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"settings\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"settings2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"share\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"share2\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-alert\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-ban\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-ellipsis\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-half\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-off\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-question\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"shield-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"slack\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"sliders-horizontal\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"sliders-vertical\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"smile\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"square-user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"square-user-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"star\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"tag\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"tags\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"thumbs-down\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"thumbs-up\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"ticket\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"tickets\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"toggle-left\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"toggle-right\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"trello\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-cog\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-pen\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-check\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-cog\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-minus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-pen\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-plus\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-search\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-round-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-search\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"user-x\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"users\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"users-round\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"venetian-mask\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"vibrate\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"vibrate-off\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallet\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallet-cards\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallet-minimal\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wallpaper\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"waypoints\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"webhook\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"webhook-off\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"wrench\", \"category\": \"계정 및 액세스\" },\n { \"name\": \"chart-area\", \"category\": \"차트\" },\n { \"name\": \"chart-bar\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-big\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-decreasing\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-increasing\", \"category\": \"차트\" },\n { \"name\": \"chart-bar-stacked\", \"category\": \"차트\" },\n { \"name\": \"chart-candlestick\", \"category\": \"차트\" },\n { \"name\": \"chart-column\", \"category\": \"차트\" },\n { \"name\": \"chart-column-big\", \"category\": \"차트\" },\n { \"name\": \"chart-column-stacked\", \"category\": \"차트\" },\n { \"name\": \"chart-gantt\", \"category\": \"차트\" },\n { \"name\": \"chart-line\", \"category\": \"차트\" },\n { \"name\": \"chart-network\", \"category\": \"차트\" },\n { \"name\": \"chart-no-axes-column\", \"category\": \"차트\" },\n { \"name\": \"chart-no-axes-gantt\", \"category\": \"차트\" },\n { \"name\": \"chart-pie\", \"category\": \"차트\" },\n { \"name\": \"chart-scatter\", \"category\": \"차트\" },\n { \"name\": \"chart-spline\", \"category\": \"차트\" },\n { \"name\": \"folder-kanban\", \"category\": \"차트\" },\n { \"name\": \"kanban\", \"category\": \"차트\" },\n { \"name\": \"square-chart-gantt\", \"category\": \"차트\" },\n { \"name\": \"square-dashed-kanban\", \"category\": \"차트\" },\n { \"name\": \"square-kanban\", \"category\": \"차트\" },\n { \"name\": \"trending-down\", \"category\": \"차트\" },\n { \"name\": \"trending-up\", \"category\": \"차트\" },\n { \"name\": \"trending-up-down\", \"category\": \"차트\" },\n { \"name\": \"book-plus\", \"category\": \"텍스트\" },\n { \"name\": \"book-text\", \"category\": \"텍스트\" },\n { \"name\": \"book-type\", \"category\": \"텍스트\" },\n { \"name\": \"book-x\", \"category\": \"텍스트\" },\n { \"name\": \"brush\", \"category\": \"텍스트\" },\n { \"name\": \"case-lower\", \"category\": \"텍스트\" },\n { \"name\": \"case-sensitive\", \"category\": \"텍스트\" },\n { \"name\": \"case-upper\", \"category\": \"텍스트\" },\n { \"name\": \"circle-question-mark\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-check\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-clock\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-copy\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-list\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-minus\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-paste\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-pen\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-pen-line\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-plus\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-type\", \"category\": \"텍스트\" },\n { \"name\": \"clipboard-x\", \"category\": \"텍스트\" },\n { \"name\": \"code\", \"category\": \"텍스트\" },\n { \"name\": \"code-xml\", \"category\": \"텍스트\" },\n { \"name\": \"columns-2\", \"category\": \"텍스트\" },\n { \"name\": \"columns-3\", \"category\": \"텍스트\" },\n { \"name\": \"columns-4\", \"category\": \"텍스트\" },\n { \"name\": \"list-start\", \"category\": \"텍스트\" },\n { \"name\": \"list-todo\", \"category\": \"텍스트\" },\n { \"name\": \"list-tree\", \"category\": \"텍스트\" },\n { \"name\": \"list-x\", \"category\": \"텍스트\" },\n { \"name\": \"logs\", \"category\": \"텍스트\" },\n { \"name\": \"mail\", \"category\": \"텍스트\" },\n { \"name\": \"map\", \"category\": \"텍스트\" },\n { \"name\": \"message-square-quote\", \"category\": \"텍스트\" },\n { \"name\": \"minus\", \"category\": \"텍스트\" },\n { \"name\": \"notebook\", \"category\": \"텍스트\" },\n { \"name\": \"notebook-pen\", \"category\": \"텍스트\" },\n { \"name\": \"notebook-text\", \"category\": \"텍스트\" },\n { \"name\": \"notepad-text\", \"category\": \"텍스트\" },\n { \"name\": \"a-arrow-down\", \"category\": \"디자인\" },\n { \"name\": \"a-arrow-up\", \"category\": \"디자인\" },\n { \"name\": \"a-large-small\", \"category\": \"디자인\" },\n { \"name\": \"app-window\", \"category\": \"디자인\" },\n { \"name\": \"app-window-mac\", \"category\": \"디자인\" },\n { \"name\": \"axis-3d\", \"category\": \"디자인\" },\n { \"name\": \"between-vertical-end\", \"category\": \"디자인\" },\n { \"name\": \"blend\", \"category\": \"디자인\" },\n { \"name\": \"book-type\", \"category\": \"디자인\" },\n { \"name\": \"bring-to-front\", \"category\": \"디자인\" },\n { \"name\": \"brush\", \"category\": \"디자인\" },\n { \"name\": \"chart-no-axes-gantt\", \"category\": \"디자인\" },\n { \"name\": \"columns-2\", \"category\": \"디자인\" },\n { \"name\": \"columns-3\", \"category\": \"디자인\" },\n { \"name\": \"columns-4\", \"category\": \"디자인\" },\n { \"name\": \"component\", \"category\": \"디자인\" },\n { \"name\": \"contrast\", \"category\": \"디자인\" },\n { \"name\": \"crop\", \"category\": \"디자인\" },\n { \"name\": \"cylinder\", \"category\": \"디자인\" },\n { \"name\": \"database-backup\", \"category\": \"디자인\" },\n { \"name\": \"diameter\", \"category\": \"디자인\" },\n { \"name\": \"dock\", \"category\": \"디자인\" },\n { \"name\": \"drafting-compass\", \"category\": \"디자인\" },\n { \"name\": \"dribbble\", \"category\": \"디자인\" },\n { \"name\": \"eclipse\", \"category\": \"디자인\" },\n { \"name\": \"eye\", \"category\": \"디자인\" },\n { \"name\": \"eye-closed\", \"category\": \"디자인\" },\n { \"name\": \"eye-off\", \"category\": \"디자인\" },\n { \"name\": \"figma\", \"category\": \"디자인\" },\n { \"name\": \"file-axis-3d\", \"category\": \"디자인\" },\n { \"name\": \"flip-horizontal\", \"category\": \"디자인\" },\n { \"name\": \"flip-horizontal-2\", \"category\": \"디자인\" },\n { \"name\": \"flip-vertical\", \"category\": \"디자인\" },\n { \"name\": \"flip-vertical-2\", \"category\": \"디자인\" },\n { \"name\": \"folder-kanban\", \"category\": \"디자인\" },\n { \"name\": \"frame\", \"category\": \"디자인\" },\n { \"name\": \"framer\", \"category\": \"디자인\" },\n { \"name\": \"fullscreen\", \"category\": \"디자인\" },\n { \"name\": \"gallery-horizontal\", \"category\": \"디자인\" },\n { \"name\": \"gallery-thumbnails\", \"category\": \"디자인\" },\n { \"name\": \"gallery-vertical\", \"category\": \"디자인\" },\n { \"name\": \"gallery-vertical-end\", \"category\": \"디자인\" },\n { \"name\": \"grab\", \"category\": \"디자인\" },\n { \"name\": \"grid-2x2\", \"category\": \"디자인\" },\n { \"name\": \"grid-3x3\", \"category\": \"디자인\" },\n { \"name\": \"highlighter\", \"category\": \"디자인\" },\n { \"name\": \"iteration-ccw\", \"category\": \"디자인\" },\n { \"name\": \"iteration-cw\", \"category\": \"디자인\" },\n { \"name\": \"kanban\", \"category\": \"디자인\" },\n { \"name\": \"land-plot\", \"category\": \"디자인\" },\n { \"name\": \"lasso\", \"category\": \"디자인\" },\n { \"name\": \"lasso-select\", \"category\": \"디자인\" },\n { \"name\": \"layers\", \"category\": \"디자인\" },\n { \"name\": \"layers-2\", \"category\": \"디자인\" },\n { \"name\": \"layout-dashboard\", \"category\": \"디자인\" },\n { \"name\": \"layout-grid\", \"category\": \"디자인\" },\n { \"name\": \"layout-list\", \"category\": \"디자인\" },\n { \"name\": \"layout-panel-left\", \"category\": \"디자인\" },\n { \"name\": \"loader\", \"category\": \"디자인\" },\n { \"name\": \"loader-pinwheel\", \"category\": \"디자인\" },\n { \"name\": \"magnet\", \"category\": \"디자인\" },\n { \"name\": \"maximize\", \"category\": \"디자인\" },\n { \"name\": \"maximize-2\", \"category\": \"디자인\" },\n { \"name\": \"minimize\", \"category\": \"디자인\" },\n { \"name\": \"minimize-2\", \"category\": \"디자인\" },\n { \"name\": \"move-3d\", \"category\": \"디자인\" },\n { \"name\": \"notebook\", \"category\": \"디자인\" },\n { \"name\": \"origami\", \"category\": \"디자인\" },\n { \"name\": \"paint-bucket\", \"category\": \"디자인\" },\n { \"name\": \"paint-roller\", \"category\": \"디자인\" },\n { \"name\": \"paintbrush\", \"category\": \"디자인\" },\n { \"name\": \"paintbrush-vertical\", \"category\": \"디자인\" },\n { \"name\": \"palette\", \"category\": \"디자인\" },\n { \"name\": \"panel-top\", \"category\": \"디자인\" },\n { \"name\": \"panels-top-left\", \"category\": \"디자인\" },\n { \"name\": \"paperclip\", \"category\": \"디자인\" },\n { \"name\": \"pen\", \"category\": \"디자인\" },\n { \"name\": \"pen-line\", \"category\": \"디자인\" },\n { \"name\": \"pen-off\", \"category\": \"디자인\" },\n { \"name\": \"pen-tool\", \"category\": \"디자인\" },\n { \"name\": \"pencil\", \"category\": \"디자인\" },\n { \"name\": \"pencil-line\", \"category\": \"디자인\" },\n { \"name\": \"pencil-off\", \"category\": \"디자인\" },\n { \"name\": \"pencil-ruler\", \"category\": \"디자인\" },\n { \"name\": \"pipette\", \"category\": \"디자인\" },\n { \"name\": \"presentation\", \"category\": \"디자인\" },\n { \"name\": \"proportions\", \"category\": \"디자인\" },\n { \"name\": \"radius\", \"category\": \"디자인\" },\n { \"name\": \"ratio\", \"category\": \"디자인\" },\n { \"name\": \"rectangle-horizontal\", \"category\": \"디자인\" },\n { \"name\": \"rectangle-vertical\", \"category\": \"디자인\" },\n { \"name\": \"rotate-3d\", \"category\": \"디자인\" },\n { \"name\": \"rotate-ccw\", \"category\": \"디자인\" },\n { \"name\": \"rotate-ccw-square\", \"category\": \"디자인\" },\n { \"name\": \"rotate-cw\", \"category\": \"디자인\" },\n { \"name\": \"rotate-cw-square\", \"category\": \"디자인\" },\n { \"name\": \"rows-2\", \"category\": \"디자인\" },\n { \"name\": \"rows-3\", \"category\": \"디자인\" },\n { \"name\": \"rows-4\", \"category\": \"디자인\" },\n { \"name\": \"ruler\", \"category\": \"디자인\" },\n { \"name\": \"scale-3d\", \"category\": \"디자인\" },\n { \"name\": \"scaling\", \"category\": \"디자인\" },\n { \"name\": \"scissors\", \"category\": \"디자인\" },\n { \"name\": \"scissors-line-dashed\", \"category\": \"디자인\" },\n { \"name\": \"send-to-back\", \"category\": \"디자인\" },\n { \"name\": \"ship\", \"category\": \"디자인\" },\n { \"name\": \"slice\", \"category\": \"디자인\" },\n { \"name\": \"spline\", \"category\": \"디자인\" },\n { \"name\": \"spray-can\", \"category\": \"디자인\" },\n { \"name\": \"square-chart-gantt\", \"category\": \"디자인\" },\n { \"name\": \"square-dashed\", \"category\": \"디자인\" },\n { \"name\": \"square-dashed-kanban\", \"category\": \"디자인\" },\n { \"name\": \"square-kanban\", \"category\": \"디자인\" },\n { \"name\": \"square-round-corner\", \"category\": \"디자인\" },\n { \"name\": \"square-scissors\", \"category\": \"디자인\" },\n { \"name\": \"stamp\", \"category\": \"디자인\" },\n { \"name\": \"swatch-book\", \"category\": \"디자인\" },\n { \"name\": \"tablet-smartphone\", \"category\": \"디자인\" },\n { \"name\": \"tangent\", \"category\": \"디자인\" },\n { \"name\": \"torus\", \"category\": \"디자인\" },\n { \"name\": \"view\", \"category\": \"디자인\" },\n { \"name\": \"wand\", \"category\": \"디자인\" },\n { \"name\": \"wand-sparkles\", \"category\": \"디자인\" },\n { \"name\": \"zoom-in\", \"category\": \"디자인\" },\n { \"name\": \"zoom-out\", \"category\": \"디자인\" }\n ]\n}\n","import { ChangeEvent, useEffect, useMemo, useRef, useState } from 'react'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { debounce, uniqWith } from 'es-toolkit'\nimport { Info } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport message from '../../utils/message'\nimport { Button } from '../button'\nimport { LucideIcon } from '../lucideIcon'\nimport { Stack } from '../stack'\nimport { TextField } from '../textField'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'\nimport iconList from './icons.json'\n\nexport type IconSelectProps = {\n /** 선택된 아이콘 이름 (lucide kebab-case, 예: 'calendar-days') */\n value?: string | null\n /** 아이콘을 클릭하면 그 아이콘 이름으로 호출된다 */\n onValueChange?: (value: string) => void\n /** 한 줄에 보여줄 아이콘 수 @default 8 */\n iconColumnCount?: number\n /** 왼쪽에 카테고리 목록 표시 @default false */\n hasCategory?: boolean\n /** 검색 입력 숨김 @default false */\n hiddenSearch?: boolean\n}\n\nexport function IconSelect({\n iconColumnCount = 8,\n hasCategory = false,\n hiddenSearch = false,\n ...props\n}: IconSelectProps) {\n const parentRef = useRef<HTMLDivElement>(null)\n const [inputValue, setInputValue] = useState('') // 검색어 입력값\n const [searchTerm, setSearchTerm] = useState('') // 아이콘 검색어\n const [selectedCategory, setSelectedCategory] = useState<string>(iconList.categories[0]) // 선택된 카테고리\n\n const [iconColumnCountValue] = useState<number>(iconColumnCount)\n\n /**\n * 검색어 디바운스\n * 검색어 입력값이 변경되면 searchTerm도 변경\n */\n useEffect(() => {\n const debounceValue = debounce((value: string) => {\n setSearchTerm(value)\n }, 100)\n\n debounceValue(inputValue)\n }, [inputValue])\n\n /**\n * 아이콘 필터링\n * searchTerm이 있으면 searchTerm에 맞는 아이콘 필터링\n * selectedCategory가 '전체'이 아니면 selectedCategory에 맞는 아이콘 필터링\n */\n const filteredIcons = useMemo(() => {\n let result\n\n if (searchTerm) {\n const filteredIcons = iconList.icons.filter((icon) =>\n icon.name.toLowerCase().includes(searchTerm.toLowerCase()),\n )\n\n // 중복 아이콘 제거\n result = uniqWith(filteredIcons, (a, b) => a.name === b.name)\n } else if (selectedCategory !== iconList.categories[0]) {\n result = iconList.icons.filter((icon) => icon.category === selectedCategory)\n } else {\n result = iconList.icons\n }\n\n return result\n }, [searchTerm, selectedCategory])\n\n // 아이콘 리스트 최적화\n // eslint-disable-next-line react-hooks/incompatible-library\n const rowVirtualizer = useVirtualizer({\n count: Math.ceil(filteredIcons.length / iconColumnCountValue),\n getScrollElement: () => parentRef.current,\n estimateSize: () => 50, // 각 행의 실제 높이에 맞게 조정\n overscan: 10, // 더 많은 항목을 미리 로드\n })\n\n return (\n <Stack direction='column' spacing={16}>\n {!hiddenSearch && (\n <TextField\n aria-label='아이콘 검색'\n placeholder='검색어를 입력해주세요'\n value={inputValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n\n setSelectedCategory(iconList.categories[0])\n }}\n />\n )}\n <Stack direction='row' spacing={8}>\n {hasCategory && (\n <Stack\n direction='column'\n className='w-[150px] h-[300px] max-h-[300px] overflow-auto'\n spacing={6}\n >\n {iconList.categories.map((category) => (\n <Button\n key={category}\n variant='secondaryLink'\n className={cn(\n 'text-small-regular-h text-sys-text-main',\n category === selectedCategory && 'bg-primary-o10',\n )}\n onClick={() => {\n setSelectedCategory(category)\n\n // '전체'이외의 카테고리 선택 시 입력값 초기화\n if (iconList.categories[0] !== category) {\n setInputValue('')\n }\n }}\n >\n {category}\n </Button>\n ))}\n </Stack>\n )}\n <div ref={parentRef} className={cn('max-h-[300px] overflow-auto flex-1')}>\n {filteredIcons.length === 0 && (\n <Stack\n justifyContent='center'\n alignItems='center'\n spacing={6}\n className='text-sys-text-subtlest text-small-medium h-full'\n >\n <Info size={16} className='text-sys-text-subtlest shrink-0' />\n {message.common.notice_search_result_empty}\n </Stack>\n )}\n\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n width: '100%',\n position: 'relative',\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const startIndex = virtualRow.index * iconColumnCountValue\n const endIndex = Math.min(startIndex + iconColumnCountValue, filteredIcons.length)\n const rowIcons = filteredIcons.slice(startIndex, endIndex)\n\n return (\n <div\n key={virtualRow.index}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n <div\n className={cn('grid grid-cols-8')}\n style={{ gridTemplateColumns: `repeat(${iconColumnCountValue}, 1fr)` }}\n >\n {rowIcons.map((item) => (\n <TooltipProvider delayDuration={0} key={item.name}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={'secondary'}\n className={cn(\n 'flex items-center justify-center bg-sys-background py-[10px]',\n item.name === props.value && '!bg-secondary-o20',\n 'hover:bg-primary10',\n )}\n onClick={() => props.onValueChange?.(item.name)}\n type='button'\n aria-label={item.name}\n aria-pressed={item.name === props.value}\n >\n <LucideIcon iconComponentName={item.name as any} size={24} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{item.name}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ))}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </Stack>\n </Stack>\n )\n}\n","import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nexport interface MetaItemProps extends React.HTMLAttributes<HTMLDivElement> {\n label: React.ReactNode\n value: React.ReactNode\n}\n\n/**\n * 라벨·값 한 쌍의 메타 정보. 가로 나열(`MetaItem`+`MetaGroup`, 헤더용)과 세로 쌓기(`MetaRow`+`MetaList`, 상세 패널용) 두 모양이 있다.\n * 언제 쓰나: PageHeader 아래 등록자·일시 같은 메타(MetaItem). 상세 화면의 핵심 정보도 여기 한 곳 — 여러 개면 `MetaGroup` 이 가로로 흘려 다음 줄로 넘긴다(2026-10-30 사용자 결정: 헤더의 메타 자리를 두 개로 나누지 않는다). 본문 카드의 속성 묶음은 MetaList + MetaRow align='start'.\n * 언제 안 쓰나: 편집 가능한 값(폼), 열이 여러 개인 표(Table).\n * 대신/함께: MetaRow 값은 14px·라벨 12px — 행마다 값 크기를 바꾸지 않는다(패널 안 크기 차이는 심판 감점, 2026-10-18). 상태는 value 에 Badge.\n */\nfunction MetaItem({ label, value, className, ...props }: MetaItemProps) {\n return (\n // min-w-0·truncate: 줄 폭보다 긴 값은 넘치지 않고 말줄임으로 끝난다\n <div className={cn('flex h-[28px] min-w-0 items-center gap-[6px]', className)} {...props}>\n {/* 라벨 12px 은 유지하고 색만 subtler → subtle(흰 바탕 대비 4.98 → 7.19) — \"small gray text\" 감점(2026-10-18 13차) */}\n <span className='shrink-0 text-small-regular-h text-sys-text-subtle'>{label}</span>\n <span aria-hidden className='h-[11px] w-px shrink-0 bg-sys-divider-subtle' />\n <span className='min-w-0 truncate whitespace-pre text-small-medium-h text-sys-text-main'>\n {value}\n </span>\n </div>\n )\n}\n\nexport interface MetaRowProps extends React.HTMLAttributes<HTMLDivElement> {\n label: React.ReactNode\n /** 생략 시 슬롯만 우측 정렬로 렌더링됨 (Figma hasText=false 대응) */\n value?: React.ReactNode\n slotBefore?: React.ReactNode\n slotAfter?: React.ReactNode\n /**\n * 값의 자리. `end`(기본)는 라벨 100px + 값을 행 오른쪽 끝에(dl-ui-v3 시안). `start` 는 라벨 120px + 값을 라벨 바로 옆 왼쪽 정렬 —\n * 상세 패널·오른쪽 정보 열처럼 행이 넓은 곳에서 라벨과 값 사이가 비지 않는다(2026-10-16 이슈 47, 원문 심판 13회 감점). 패턴 예제는 `start`\n */\n align?: 'end' | 'start'\n /**\n * 값을 숫자 강조(20px, 탭룰러)로. 통계·건수처럼 숫자가 행의 주인공일 때만 — 예: \"사용 중인 엔드포인트 3개\", \"크기 1,280 MB\".\n * 한 패널에 한두 행만. 2026-10-17 8차 A3(디자이너 점수 역추적: 글자 크기 단계가 많은 화면이 높게 평가됨).\n * 2026-10-18 9차: 예제·스킬·스토리에서 뺐다 — 개발용 8차 심판이 패널 안 크기 차이를 \"불균일\"로 읽어 감점(타이포 3쌍·컴포넌트 2쌍). KPI 띠 같은 전용 자리가 생기기 전엔 기본으로 쓰지 않는다\n */\n emphasis?: boolean\n}\n\n/**\n * PageHeader 등의 메타 항목(`MetaItem`)들을 가로로 나열하는 컨테이너.\n * 폭이 좁아지면 줄바꿈되며, 가로 간격은 24px, 줄바꿈 시 세로 간격은 0이다. 상세 화면의 핵심 정보(ID·버전·소유자·수정일 …)도 여기 한 곳에\n * 흘려 둔다(2026-10-30 사용자 결정: 요약 상자를 따로 두지 않는다). 열을 맞춘 격자는 두지 않는다 — 1440 폭 3열이면 칸이 약 470px 라 항목 사이가\n * 벌어졌다(2026-11-06 사용자 지적, 홀드아웃 17~19 심판 \"metadata spread across very wide columns\"). dl-ui-v3 상세 화면과 같은 모양\n */\nfunction MetaGroup({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('flex flex-wrap items-center gap-x-[24px] gap-y-0', className)} {...props} />\n )\n}\n\nfunction MetaRow({\n label,\n value,\n slotBefore,\n slotAfter,\n align = 'end',\n emphasis = false,\n className,\n ...props\n}: MetaRowProps) {\n const hasValue = value !== undefined && value !== null && value !== ''\n const start = align === 'start'\n return (\n <div\n className={cn(\n // min-h: 한 줄이면 48px 그대로, 태그처럼 줄바꿈되는 값이면 자란다. 선은 Separator·표 행과 같은 토큰 (2026-10-17 이슈 47 4차)\n 'flex min-h-[48px] w-full items-center justify-between border-b border-sys-divider-subtle px-[12px] py-[8px]',\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n // 라벨 12px 유지, 색은 subtle(2026-10-18 13차 — 상세·검토 패널 라벨이 \"small gray text\" 로 읽혔다)\n 'shrink-0 text-small-regular text-sys-text-subtle',\n // start: 라벨 열 120px(긴 라벨은 열을 밀고 값은 12px 뒤에서 시작 — 겹치지 않게), end: 100px 고정\n start ? 'min-w-[120px] pr-[12px]' : 'w-[100px]',\n )}\n >\n {label}\n </span>\n <div\n className={cn(\n 'flex min-w-0 flex-1 items-center gap-[6px]',\n !hasValue && !start && 'justify-end',\n )}\n >\n {slotBefore}\n {hasValue && (\n <span\n className={cn(\n // 값 14px(라벨 12px) — 라벨과 값이 같은 크기라 위계가 없던 것을 고침(2026-10-17 8차 A2). emphasis 는 20px 탭룰러 숫자\n 'min-w-0 truncate whitespace-pre text-sys-text-main',\n emphasis ? 'text-h4 tabular-nums' : 'text-base-medium',\n start ? 'text-left' : 'flex-1 text-right',\n )}\n >\n {value}\n </span>\n )}\n {slotAfter}\n </div>\n </div>\n )\n}\n\nexport interface MetaListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 열 수(기본 1 = 세로 한 줄씩). 2 이상이면 행을 격자로 흘린다(md 2열, xl 부터 지정 열) — 전폭 본문 카드처럼 넓은 자리의 키-값 격자. 행은 `MetaRow align='start'` */\n columns?: 1 | 2 | 3 | 4\n}\n\nconst META_LIST_COLUMNS = {\n // 한 열: 마지막 줄 아래 선 없음 — 앱이 목록 밑에 Separator 를 두면 선이 두 줄로 겹쳤다(2026-11-06 홀드아웃 19 검토 패널, Opus 3). 표의 '마지막 행 선 없음'과 같은 규칙.\n // 여러 열 격자는 마지막 칸만 선이 빠지면 줄이 어긋나 그대로 둔다\n 1: 'flex flex-col [&>*:last-child]:border-b-0',\n 2: 'grid grid-cols-1 gap-x-[24px] md:grid-cols-2',\n 3: 'grid grid-cols-1 gap-x-[24px] md:grid-cols-2 xl:grid-cols-3',\n 4: 'grid grid-cols-1 gap-x-[24px] md:grid-cols-2 xl:grid-cols-4',\n} as const\n\n/**\n * `MetaRow` 를 위에서 아래로 한 줄씩 쌓는 목록. 상세 Drawer·오른쪽 정보 패널의 \"필드: 값\" 묶음.\n *\n * 언제 쓰나: Drawer 본문처럼 폭이 좁은 곳에 리소스의 필드를 나열할 때(세로 한 줄씩), 또는 `columns={3}` 으로 전폭 본문 카드의 키-값 격자. 행마다 라벨 100px + 값 오른쪽 정렬(기본) — 상세 패널·정보 열처럼 행이 넓으면 `MetaRow align='start'` 로 값을 라벨 옆에 붙인다.\n * 언제 안 쓰나: PageHeader 아래의 메타(→ MetaGroup + MetaItem, 많아도 가로로 흘린다), 표 형태 데이터(→ Table).\n * 대신/함께: `Stack` 은 기본 방향이 가로라 `<Stack>` 으로 MetaRow 를 감싸면 행이 옆으로 늘어서 잘린다 — MetaList 를 쓴다.\n */\nfunction MetaList({ className, columns = 1, ...props }: MetaListProps) {\n return <div className={cn('w-full', META_LIST_COLUMNS[columns], className)} {...props} />\n}\n\nexport { MetaGroup, MetaItem, MetaList, MetaRow }\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Badge } from './badge'\n\nexport type EventLevel = 'info' | 'success' | 'warning' | 'error'\n\nexport type EventListItem = {\n /** 항목 key */\n id: string\n /** 발생 시각. 소비 앱이 포맷해 넘긴다 (예: \"3분 전\", \"10. 12. 09:28\") */\n time: ReactNode\n /** 레벨. 왼쪽 색 띠와 Badge 색을 정한다 */\n level: EventLevel\n /** 내용 한 줄 */\n message: ReactNode\n}\n\nexport type EventListProps = Omit<HTMLAttributes<HTMLUListElement>, 'children'> & {\n /** 최신순으로 정렬해 넘긴다 */\n items: EventListItem[]\n /** 항목이 없을 때 문구. 기본 \"최근 이벤트가 없습니다.\" */\n emptyText?: ReactNode\n /** 레벨 Badge 글자. 기본 정보·성공·경고·오류 */\n levelLabels?: Partial<Record<EventLevel, ReactNode>>\n}\n\nconst LEVEL = {\n info: { variant: 'info', bar: 'border-info30', label: '정보' },\n success: { variant: 'success', bar: 'border-success30', label: '성공' },\n warning: { variant: 'warning', bar: 'border-warning30', label: '경고' },\n error: { variant: 'danger', bar: 'border-danger30', label: '오류' },\n} as const\n\n/**\n * 최근 이벤트·활동 목록. 항목마다 왼쪽 레벨 색 띠 → 레벨 Badge → 시각 → 메시지 한 줄.\n *\n * 언제 쓰나: 대시보드·상세 화면의 \"최근 이벤트/활동\" 섹션처럼 최신순 몇 개(보통 5~10개)를 한눈에 보여 줄 때. 레벨(info·success·warning·error)을 색 띠와 Badge 로 구분한다.\n * 언제 안 쓰나: 검색·필터·페이지네이션이 필요한 로그(→ ListPage·AgGridTable), 단계가 있는 진행 상황(→ 소비 앱의 스텝 표시), 사용자가 답해야 하는 알림(→ Alert·Toast).\n * 대신/함께: 시각은 소비 앱이 포맷해 `time` 에 넘긴다. 항목이 없으면 `emptyText` 를 status 로 보여 준다. 레벨 → 색은 고정이고 `className` 으로 색을 바꾸지 않는다.\n */\nexport function EventList({\n items,\n emptyText = '최근 이벤트가 없습니다.',\n levelLabels,\n className,\n ...props\n}: EventListProps) {\n if (!items.length)\n return (\n <p\n role='status'\n className={cn('py-[16px] text-center text-base-regular text-sys-text-subtle', className)}\n >\n {emptyText}\n </p>\n )\n return (\n <ul className={cn('flex w-full flex-col gap-[4px]', className)} {...props}>\n {items.map((item) => {\n const level = LEVEL[item.level]\n return (\n <li\n key={item.id}\n className={cn(\n 'flex items-start gap-[12px] border-l-[2px] py-[8px] pl-[12px]',\n level.bar,\n )}\n >\n <Badge variant={level.variant} className='shrink-0'>\n {levelLabels?.[item.level] ?? level.label}\n </Badge>\n <span className='shrink-0 text-small-regular text-sys-text-subtler'>{item.time}</span>\n <span className='min-w-0 flex-1 text-base-regular text-sys-text-main'>\n {item.message}\n </span>\n </li>\n )\n })}\n </ul>\n )\n}\n","'use client'\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { formatDistanceToNow, isValid } from 'date-fns'\nimport { ko } from 'date-fns/locale'\nimport { RefreshCw } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nexport interface PageHeaderRefreshButtonProps {\n /** 새로고침 클릭 */\n onClick: () => void\n /** 마지막 갱신 시각. 없으면 \"업데이트 전\", 1분 안이면 \"방금 업데이트\", 그 뒤로는 \"N분 전 업데이트\" (1분마다 갱신) */\n lastUpdatedAt?: Date | number | string\n /** true 면 아이콘이 돌고 버튼이 비활성 (react-query 의 isRefetching 등) */\n refreshing?: boolean\n /** 버튼 크기. default 36px, compact 28px (compact PageHeader 용) */\n size?: 'default' | 'compact'\n className?: string\n}\n\n/**\n * PageHeader `titleRight` 에 놓는 새로고침 묶음 — \"N분 전 업데이트\" 라벨 + 아이콘 버튼. 갱신 중에는 아이콘이 돌고 버튼이 잠긴다.\n *\n * 언제 쓰나: 목록·상세·대시보드처럼 서버 데이터를 다시 불러올 수 있는 화면의 헤더. `lastUpdatedAt` 에 조회 시각(react-query `dataUpdatedAt`)을, `refreshing` 에 재조회 중 여부를 넘긴다.\n * 언제 안 쓰나: 폼의 \"다시 시도\"(→ Button secondary), 표 안의 행 단위 새로고침(→ IconButton secondaryLink), 자동 폴링만 있고 사용자가 누를 일이 없는 화면.\n * 대신/함께: 텍스트 버튼으로 만들지 않는다(dl-ui-v3 헤더 관례와 통일). 라벨은 1분마다 다시 계산한다.\n */\nexport function PageHeaderRefreshButton({\n onClick,\n lastUpdatedAt,\n refreshing = false,\n size = 'default',\n className,\n}: PageHeaderRefreshButtonProps) {\n const label = useUpdatedLabel(lastUpdatedAt)\n\n return (\n <div className={cn('flex items-center gap-[4px]', className)}>\n <span className='whitespace-nowrap text-small-regular text-sys-text-subtle'>{label}</span>\n <button\n type='button'\n aria-label='새로고침'\n disabled={refreshing}\n onClick={onClick}\n className={cn(\n 'inline-flex items-center justify-center rounded-small bg-transparent text-sys-text-subtle transition-colors',\n 'hover:bg-sys-button-secondary-subtle-background-hover',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main',\n 'disabled:pointer-events-none disabled:text-sys-button-disabled-text',\n size === 'compact' ? 'size-[28px]' : 'size-[36px]',\n )}\n >\n <RefreshCw size={16} className={cn(refreshing && 'animate-spin')} />\n </button>\n </div>\n )\n}\n\n/** 상대 시각 라벨. 1분마다 다시 계산한다 */\nfunction useUpdatedLabel(lastUpdatedAt?: Date | number | string): string {\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n if (!lastUpdatedAt) return\n const timer = window.setInterval(() => setTick((prev) => prev + 1), 60_000)\n return () => window.clearInterval(timer)\n }, [lastUpdatedAt])\n\n return useMemo(() => {\n const updatedAt = parseUpdatedAt(lastUpdatedAt)\n if (!updatedAt) return '업데이트 전'\n if (Date.now() - updatedAt.getTime() < 60_000) return '방금 업데이트'\n return `${formatDistanceToNow(updatedAt, { addSuffix: true, locale: ko })} 업데이트`\n // tick 은 라벨 재계산을 위한 의존성\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lastUpdatedAt, tick])\n}\n\nfunction parseUpdatedAt(value?: Date | number | string): Date | null {\n if (!value) return null\n const date = value instanceof Date ? value : new Date(value)\n return isValid(date) ? date : null\n}\n","/**\n * 셀 범위 클립보드 (TSV + 자체 JSON 멀티포맷).\n *\n * - TSV 출력은 Excel/Google Sheets 와 양방향 호환. 셀에 \\t, \\n, \" 가 포함되면 큰따옴표로 감싸고\n * 내부 \" 는 \"\" 로 escape (RFC4180-ish, 단 구분자는 \\t).\n * - 자체 JSON 포맷(`t3q.parameter-table.cells`)은 컬럼 id 정보까지 보존해 round-trip 정확.\n * 같은 컴포넌트 안에서 복사 → 붙여넣기 시 우선 매칭.\n */\n\nexport const PARAMETER_TABLE_CELLS_CLIPBOARD_KIND = 't3q.parameter-table.cells'\n\nexport type CellsClipboardPayload = {\n kind: typeof PARAMETER_TABLE_CELLS_CLIPBOARD_KIND\n version: 1\n /** column id 순서. paste 시 해당 column id 가 target table 에도 있으면 그 column 으로 정렬. */\n columns: string[]\n /** [row][col] 의 string 값 매트릭스. */\n cells: string[][]\n}\n\n/* ----------------------------- TSV ----------------------------- */\n\nconst TSV_NEEDS_QUOTE = /[\\t\\n\\r\"]/\n\nexport function serializeCellsToTsv(cells: string[][]): string {\n return cells\n .map((row) =>\n row\n .map((v) => {\n const s = v ?? ''\n if (TSV_NEEDS_QUOTE.test(s)) {\n return `\"${s.replace(/\"/g, '\"\"')}\"`\n }\n return s\n })\n .join('\\t'),\n )\n .join('\\n')\n}\n\n/** TSV 파서. quoted cell 안의 \\t / \\n / \"\" 처리. trailing newline 무시. */\nexport function parseTsv(text: string): string[][] {\n if (text == null) return []\n // CRLF → LF 정규화.\n const src = text.replace(/\\r\\n?/g, '\\n')\n const rows: string[][] = []\n let row: string[] = []\n let cell = ''\n let inQuote = false\n let i = 0\n const n = src.length\n\n while (i < n) {\n const ch = src[i]\n if (inQuote) {\n if (ch === '\"') {\n if (i + 1 < n && src[i + 1] === '\"') {\n cell += '\"'\n i += 2\n continue\n }\n inQuote = false\n i += 1\n continue\n }\n cell += ch\n i += 1\n continue\n }\n if (ch === '\"') {\n // quote 시작은 cell 의 시작 위치에서만 유효한 것이 이상적이지만,\n // Excel/Sheets 가 항상 cell 시작에서 quote 를 사용하므로 그 가정으로 충분.\n inQuote = true\n i += 1\n continue\n }\n if (ch === '\\t') {\n row.push(cell)\n cell = ''\n i += 1\n continue\n }\n if (ch === '\\n') {\n row.push(cell)\n rows.push(row)\n row = []\n cell = ''\n i += 1\n continue\n }\n cell += ch\n i += 1\n }\n // 마지막 cell flush. trailing newline 이 있었으면 row 가 비어있을 수 있음 — 그 경우는 push 하지 않음.\n if (cell !== '' || row.length > 0) {\n row.push(cell)\n rows.push(row)\n }\n return rows\n}\n\n/* ----------------------------- JSON ----------------------------- */\n\nexport function serializeCellsToJson(cells: string[][], columns: string[]): string {\n const payload: CellsClipboardPayload = {\n kind: PARAMETER_TABLE_CELLS_CLIPBOARD_KIND,\n version: 1,\n columns,\n cells,\n }\n return JSON.stringify(payload)\n}\n\nexport function parseCellsJson(text: string): CellsClipboardPayload | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n return null\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n (parsed as { kind?: unknown }).kind !== PARAMETER_TABLE_CELLS_CLIPBOARD_KIND\n ) {\n return null\n }\n const p = parsed as Partial<CellsClipboardPayload>\n if (!Array.isArray(p.columns) || !Array.isArray(p.cells)) return null\n const columns = p.columns.map((c) => String(c ?? ''))\n const cells = p.cells.map((row) => (Array.isArray(row) ? row.map((v) => String(v ?? '')) : []))\n return { kind: PARAMETER_TABLE_CELLS_CLIPBOARD_KIND, version: 1, columns, cells }\n}\n\n/* ----------------------------- Browser I/O ----------------------------- */\n\n/**\n * 클립보드에 TSV + 자체 JSON 을 동시에 write. ClipboardItem 지원 안 하는 환경은 writeText 폴백.\n * 권한 거부 등 실패 시 false 반환.\n */\nexport async function writeCellsToClipboard(tsv: string, json: string): Promise<boolean> {\n const clip = navigator.clipboard\n if (!clip) return false\n // 우선 멀티포맷 시도 (Chrome 등 modern browser).\n if (typeof clip.write === 'function' && typeof ClipboardItem !== 'undefined') {\n try {\n // 'web ' prefix 가 붙은 MIME 은 unsanitized custom format. Chromium 117+ 지원.\n const item = new ClipboardItem({\n 'text/plain': new Blob([tsv], { type: 'text/plain' }),\n 'web application/json': new Blob([json], { type: 'web application/json' }),\n })\n await clip.write([item])\n return true\n } catch {\n // 폴백으로 떨어짐.\n }\n }\n if (typeof clip.writeText === 'function') {\n try {\n await clip.writeText(tsv)\n return true\n } catch {\n return false\n }\n }\n return false\n}\n\n/** 클립보드 읽기. JSON 자체 포맷 우선, 실패 시 TSV 파싱. */\nexport async function readCellsFromClipboard(): Promise<\n { kind: 'json'; payload: CellsClipboardPayload } | { kind: 'tsv'; cells: string[][] } | null\n> {\n const clip = navigator.clipboard\n if (!clip) return null\n // 멀티포맷 시도.\n if (typeof clip.read === 'function') {\n try {\n const items = await clip.read()\n for (const item of items) {\n if (item.types.includes('web application/json')) {\n const blob = await item.getType('web application/json')\n const text = await blob.text()\n const json = parseCellsJson(text)\n if (json) return { kind: 'json', payload: json }\n }\n }\n // JSON 매칭 안 되면 text/plain 으로 폴백.\n for (const item of items) {\n if (item.types.includes('text/plain')) {\n const blob = await item.getType('text/plain')\n const text = await blob.text()\n const cells = parseTsv(text)\n if (cells.length > 0) return { kind: 'tsv', cells }\n }\n }\n } catch {\n // 권한 거부 등 — readText 폴백.\n }\n }\n if (typeof clip.readText === 'function') {\n try {\n const text = await clip.readText()\n // 자체 JSON 포맷일 수도 있으니 먼저 시도.\n const json = parseCellsJson(text)\n if (json) return { kind: 'json', payload: json }\n const cells = parseTsv(text)\n if (cells.length > 0) return { kind: 'tsv', cells }\n } catch {\n return null\n }\n }\n return null\n}\n","/** 셀 좌표 (행 인덱스, 컬럼 인덱스). 둘 다 0-based. */\nexport type CellCoord = { rowIdx: number; colIdx: number }\n\n/** 셀 선택 범위. anchor 는 드래그/Shift-arrow 의 기준점, focus 는 현재 끝점. 단일 셀이면 anchor === focus. */\nexport type CellRange = { anchor: CellCoord; focus: CellCoord }\n\n/** 정규화된 사각 영역. inclusive bounds. */\nexport type CellRect = { top: number; left: number; bottom: number; right: number }\n\nexport function normalizeRange(range: CellRange): CellRect {\n const top = Math.min(range.anchor.rowIdx, range.focus.rowIdx)\n const bottom = Math.max(range.anchor.rowIdx, range.focus.rowIdx)\n const left = Math.min(range.anchor.colIdx, range.focus.colIdx)\n const right = Math.max(range.anchor.colIdx, range.focus.colIdx)\n return { top, left, bottom, right }\n}\n\nexport function rectContains(rect: CellRect, coord: CellCoord): boolean {\n return (\n coord.rowIdx >= rect.top &&\n coord.rowIdx <= rect.bottom &&\n coord.colIdx >= rect.left &&\n coord.colIdx <= rect.right\n )\n}\n\nexport function coordEquals(a: CellCoord, b: CellCoord): boolean {\n return a.rowIdx === b.rowIdx && a.colIdx === b.colIdx\n}\n","export interface ParameterTableRow {\n id: string\n values: Record<string, string>\n}\n\nexport interface ParameterTableColumn {\n id: string\n header: string\n placeholder?: string\n width?: number | string\n required?: boolean\n}\n\n/**\n * 셀별 invalid 표시. cellErrors[rowId][colId] === true 인 셀에 빨간 테두리 강조.\n * 외부 form 검증 결과를 그대로 매핑해 controlled 로 주입한다.\n */\nexport type ParameterTableCellErrors = Record<string, Record<string, boolean>>\n\nexport type ParameterTableSpacing = 'normal' | 'compact'\n\nexport const DEFAULT_PARAMETER_TABLE_COLUMNS: ParameterTableColumn[] = [\n { id: 'key', header: 'Key' },\n { id: 'value', header: 'Value' },\n { id: 'description', header: 'Description' },\n]\n\n/**\n * 보조 컬럼 (handle / delete) 의 너비.\n * Figma `column type=handle|deleteButton` 스펙 매핑.\n */\nexport const PARAMETER_TABLE_COL_WIDTHS: Record<\n ParameterTableSpacing,\n { handle: number; delete: number }\n> = {\n normal: { handle: 48, delete: 48 },\n compact: { handle: 32, delete: 32 },\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, Trash2 } from 'lucide-react'\n\nimport { type CellCoord, type CellRect, rectContains } from './cellSelection/types'\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { IconButton } from '../iconButton'\nimport { TableCell, TableRow } from '../table'\nimport {\n PARAMETER_TABLE_COL_WIDTHS,\n type ParameterTableCellErrors,\n type ParameterTableColumn,\n type ParameterTableRow as ParameterTableRowType,\n type ParameterTableSpacing,\n} from './types'\n\nexport interface ParameterTableRowProps {\n row: ParameterTableRowType\n rowIdx: number\n columns: ParameterTableColumn[]\n spacing: ParameterTableSpacing\n withHandle: boolean\n disabled: boolean\n /** 마지막 trailing 빈 행. drag/delete 비활성, 시각적으로 hover 효과만 표시. */\n isPlaceholder: boolean\n /** 정규화된 선택 영역. 이 행이 영역 안에 들어가면 셀별 selected 상태. */\n selectionRect: CellRect | null\n /** 편집 모드에 진입한 셀. 이 행 안의 셀이면 outline 표시. 셀 안 input 은 부모의\n * 단일 floating input 이 cell 위치에 absolute positioning 으로 띄움. */\n editingCell: CellCoord | null\n /** 셀별 invalid 표시. placeholder 행은 자동 제외. */\n cellErrors?: ParameterTableCellErrors\n onCellMouseDown: (coord: CellCoord, event: React.MouseEvent) => void\n onCellMouseEnter: (coord: CellCoord) => void\n /** 셀 클릭. 이미 선택돼 있던 셀의 재클릭이면 부모가 편집 진입을 판정한다. */\n onCellClick: (coord: CellCoord, event: React.MouseEvent) => void\n onCellDoubleClick: (coord: CellCoord) => void\n onDelete: () => void\n}\n\n/**\n * Parameter Table 의 단일 행. 셀은 항상 display div 만 렌더. 편집 모드에서는\n * 부모(ParameterTable) 가 단일 floating input 을 활성 셀의 td 위에 absolute positioning\n * 으로 띄운다 — IME composition 중 input element 가 unmount/remount 되지 않으므로\n * 한국어/일본어/중국어 IME 자모 분리 문제가 원천 차단된다.\n */\nexport function ParameterTableRow({\n row,\n rowIdx,\n columns,\n spacing,\n withHandle,\n disabled,\n isPlaceholder,\n selectionRect,\n editingCell,\n cellErrors,\n onCellMouseDown,\n onCellMouseEnter,\n onCellClick,\n onCellDoubleClick,\n onDelete,\n}: ParameterTableRowProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: row.id, disabled: disabled || isPlaceholder })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n position: 'relative',\n zIndex: isDragging ? 1 : 0,\n }\n\n const iconBtnSpacing = spacing === 'compact' ? 'compact' : 'normal'\n const colWidths = PARAMETER_TABLE_COL_WIDTHS[spacing]\n\n return (\n <TableRow\n ref={setNodeRef}\n style={style}\n data-state={isDragging ? 'dragging' : isPlaceholder ? 'placeholder' : undefined}\n data-row-idx={rowIdx}\n className={cn('group', isDragging && 'bg-sys-table-press shadow-md')}\n >\n {withHandle && (\n <TableCell align='center' className='p-0' style={{ width: `${colWidths.handle}px` }}>\n <div className='flex items-center justify-center w-full h-full'>\n <button\n type='button'\n aria-label='행 순서 변경'\n disabled={isPlaceholder || disabled}\n ref={setActivatorNodeRef}\n {...attributes}\n {...listeners}\n tabIndex={isPlaceholder || disabled ? -1 : 0}\n className={cn(\n 'flex items-center justify-center p-[2px] rounded-xsmall text-sys-text-subtler',\n 'hover:bg-secondary-o10 focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n 'cursor-grab active:cursor-grabbing',\n isPlaceholder && 'invisible',\n )}\n >\n <GripVertical size={spacing === 'compact' ? 14 : 16} />\n </button>\n </div>\n </TableCell>\n )}\n\n {columns.map((col, colIdx) => {\n const coord: CellCoord = { rowIdx, colIdx }\n const isSelected =\n selectionRect != null && !isDragging ? rectContains(selectionRect, coord) : false\n const isEditing =\n editingCell != null && editingCell.rowIdx === rowIdx && editingCell.colIdx === colIdx\n const cellValue = row.values[col.id] ?? ''\n const hasError = !isPlaceholder && Boolean(cellErrors?.[row.id]?.[col.id])\n\n return (\n <TableCell\n key={col.id}\n className={cn(\n 't3q-pt-cell px-0 py-0 cursor-cell select-none',\n hasError && 't3q-pt-cell--error',\n isSelected && 't3q-pt-cell--selected',\n isEditing && 't3q-pt-cell--editing',\n )}\n style={\n col.width\n ? { width: typeof col.width === 'number' ? `${col.width}px` : col.width }\n : undefined\n }\n data-row-idx={rowIdx}\n data-col-idx={colIdx}\n data-selected={isSelected || undefined}\n data-editing={isEditing || undefined}\n data-error={hasError || undefined}\n onMouseDown={(e) => {\n if (isEditing) return\n onCellMouseDown(coord, e)\n }}\n onMouseEnter={() => {\n if (isEditing) return\n onCellMouseEnter(coord)\n }}\n onClick={(e) => {\n if (isEditing) return\n onCellClick(coord, e)\n }}\n onDoubleClick={() => {\n onCellDoubleClick(coord)\n }}\n >\n <div\n className={cn(\n 't3q-pt-cell-display px-[12px] py-[6px] text-base-medium text-sys-text-main truncate whitespace-pre',\n isEditing && 't3q-pt-cell-display--editing',\n )}\n aria-label={col.header}\n >\n {cellValue ? (\n sanitizeUserText(cellValue)\n ) : (\n <span className='text-sys-text-placeholder'>\n {/* placeholder 행은 컬럼명을 hint 로 표시. 그 외 빈 셀은 nbsp 로 line box 강제해\n 텍스트 있는 행과 baseline / 높이 일치시킴. */}\n {isPlaceholder ? (col.placeholder ?? col.header) : ' '}\n </span>\n )}\n </div>\n </TableCell>\n )\n })}\n\n <TableCell align='center' className='p-0' style={{ width: `${colWidths.delete}px` }}>\n <div className='flex items-center justify-center w-full h-full'>\n <IconButton\n type='button'\n variant='secondaryLink'\n spacing={iconBtnSpacing}\n disabled={disabled || isPlaceholder}\n onClick={onDelete}\n aria-label='행 삭제'\n tabIndex={isPlaceholder ? -1 : 0}\n className={cn(\n 'invisible group-hover:visible group-focus-within:visible',\n isPlaceholder && 'group-hover:invisible group-focus-within:invisible',\n )}\n >\n <Trash2 size={spacing === 'compact' ? 14 : 16} />\n </IconButton>\n </div>\n </TableCell>\n </TableRow>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\n\nimport {\n readCellsFromClipboard,\n serializeCellsToJson,\n serializeCellsToTsv,\n writeCellsToClipboard,\n} from './cellSelection/clipboard'\nimport { type CellCoord, type CellRange, coordEquals, normalizeRange } from './cellSelection/types'\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { Table, TableBody, TableHead, TableHeader, TableRow } from '../table'\nimport { ParameterTableRow as ParameterTableRowComponent } from './ParameterTableRow'\nimport {\n DEFAULT_PARAMETER_TABLE_COLUMNS,\n PARAMETER_TABLE_COL_WIDTHS,\n type ParameterTableCellErrors,\n type ParameterTableColumn,\n type ParameterTableRow,\n type ParameterTableSpacing,\n} from './types'\n\nimport './parameterTable.css'\n\nfunction newRowId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return `ptrow-${Math.random().toString(36).slice(2, 10)}-${Date.now().toString(36)}`\n}\n\nfunction isRowEmpty(row: ParameterTableRow, columns: ParameterTableColumn[]): boolean {\n return columns.every((col) => !row.values[col.id])\n}\n\nfunction createEmptyRow(columns: ParameterTableColumn[], id: string): ParameterTableRow {\n const values: Record<string, string> = {}\n for (const col of columns) values[col.id] = ''\n return { id, values }\n}\n\n// trailing placeholder row 의 id 를 placeholderId 로 고정해 react key 안정성 확보.\n// 마지막 row 가 비어있지 않으면 placeholderId 를 가진 새 empty row 를 append.\n// 비어있지만 id 가 다르면 id 만 placeholderId 로 교체.\nfunction normalizeTrailing(\n rows: ParameterTableRow[],\n columns: ParameterTableColumn[],\n placeholderId: string,\n): ParameterTableRow[] {\n if (rows.length === 0 || !isRowEmpty(rows[rows.length - 1], columns)) {\n return [...rows, createEmptyRow(columns, placeholderId)]\n }\n const last = rows[rows.length - 1]\n if (last.id !== placeholderId) {\n return [...rows.slice(0, -1), { ...last, id: placeholderId }]\n }\n return rows\n}\n\nconst PARAMETER_TABLE_HISTORY_LIMIT = 100\n\nfunction cloneRows(rows: ParameterTableRow[]): ParameterTableRow[] {\n return rows.map((row) => ({ ...row, values: { ...row.values } }))\n}\n\n// printable single-character key 판별 (편집 모드 자동 진입용).\n// Excel/Sheets 와 동일: 활성 셀에서 알파벳/숫자/기호 키를 누르면 편집 모드 + 그 키로 시작.\n//\n// **ASCII printable 영역만** true 반환. 한글/일본어/중국어 등 non-ASCII 키는 native IME 가\n// composition 으로 처리해야 한다. 이 검사 없이 한글 자모 (예: 'ㄱ' charCode 12593) 가 통과되면\n// preventDefault + enterEdit('ㄱ') 으로 우리가 처리하는 동시에 IME 도 native 로 composition\n// 을 시작해 첫 문자가 두 번 입력되는 현상이 발생한다 (예: \"ㄱ가\").\nfunction isPrintableKey(event: React.KeyboardEvent): boolean {\n if (event.metaKey || event.ctrlKey || event.altKey) return false\n if (event.nativeEvent.isComposing) return false\n if (event.key === 'Process') return false\n if (event.key.length !== 1) return false\n const code = event.key.charCodeAt(0)\n // ASCII printable: U+0020 ~ U+007E. 그 외는 IME 처리.\n return code >= 0x20 && code <= 0x7e\n}\n\ninterface FloatingRect {\n left: number\n top: number\n width: number\n height: number\n}\n\nexport interface ParameterTableProps {\n value?: ParameterTableRow[]\n defaultValue?: ParameterTableRow[]\n onChange?: (rows: ParameterTableRow[]) => void\n columns?: ParameterTableColumn[]\n withHandle?: boolean\n spacing?: ParameterTableSpacing\n caption?: React.ReactNode\n disabled?: boolean\n className?: string\n /**\n * 셀별 invalid 표시. cellErrors[rowId][colId] === true 인 셀에 빨간 강조.\n * trailing placeholder 행은 자동으로 제외된다.\n */\n cellErrors?: ParameterTableCellErrors\n}\n\nconst ParameterTable = React.forwardRef<HTMLDivElement, ParameterTableProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n columns = DEFAULT_PARAMETER_TABLE_COLUMNS,\n withHandle = true,\n spacing = 'compact',\n caption,\n disabled = false,\n className,\n cellErrors,\n },\n ref,\n ) => {\n const isControlled = value !== undefined\n const rootRef = React.useRef<HTMLDivElement | null>(null)\n const floatingInputRef = React.useRef<HTMLInputElement | null>(null)\n const setRootRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n const focusFloating = React.useCallback(() => {\n floatingInputRef.current?.focus({ preventScroll: true })\n }, [])\n\n // trailing placeholder row 의 id 를 cycle 간 stable 하게 유지.\n const [placeholderId, setPlaceholderId] = React.useState(newRowId)\n\n const [internalRows, setInternalRows] = React.useState<ParameterTableRow[]>(() =>\n normalizeTrailing(defaultValue ?? [], columns, placeholderId),\n )\n\n const rows = React.useMemo(\n () => normalizeTrailing(isControlled ? value! : internalRows, columns, placeholderId),\n [isControlled, value, internalRows, columns, placeholderId],\n )\n\n const placeholderRow = rows[rows.length - 1]\n const realRows = React.useMemo(() => rows.slice(0, -1), [rows])\n const realRowIds = React.useMemo(() => realRows.map((r) => r.id), [realRows])\n\n const [rowHistory, setRowHistory] = React.useState<ParameterTableRow[][]>([])\n const [redoStack, setRedoStack] = React.useState<ParameterTableRow[][]>([])\n\n /* ----------------- Cell selection state ----------------- */\n\n /** 현재 선택 영역. null 이면 아무 셀도 활성 아님. */\n const [selection, setSelection] = React.useState<CellRange | null>(null)\n /** 편집 모드에 진입한 셀. null 이면 비편집 (= 활성 상태). */\n const [editing, setEditing] = React.useState<CellCoord | null>(null)\n /** floating input 의 value. 편집 모드 중 사용자 입력 누적. */\n const [inputValue, setInputValue] = React.useState<string>('')\n /** 활성 셀(selection.focus) 의 위치/크기. floating input position 계산. */\n const [floatingRect, setFloatingRect] = React.useState<FloatingRect | null>(null)\n /** IME composition 진행 중 플래그. nativeEvent.isComposing 보조용. */\n const composingRef = React.useRef(false)\n /** 마우스 드래그 진행 여부. */\n const draggingRef = React.useRef(false)\n /** 편집 진입 시 cursor 위치 — 'all' / 'end'. useLayoutEffect 에서 적용 후 reset. */\n const pendingCursorRef = React.useRef<'all' | 'end' | null>(null)\n /** 재클릭 편집 진입 후보. mousedown 시점에 이미 단일 선택돼 있던 셀이면 그 좌표. */\n const reclickRef = React.useRef<CellCoord | null>(null)\n /** 재클릭으로 방금 편집을 연 직후 플래그. 같은 제스처의 두 번째 mousedown 이 floating input\n * 에서 단어 선택을 거는 것만 막는다. 그 외 상황의 더블클릭 단어 선택은 그대로 둔다. */\n const reclickEnteredRef = React.useRef(false)\n\n // window mouseup 으로 dragging 종료. mousedown/mouseenter 만으로는 셀 밖에서 mouseup 시 dragging 이 stuck 됨.\n React.useEffect(() => {\n if (disabled) return\n const onUp = () => {\n draggingRef.current = false\n }\n window.addEventListener('mouseup', onUp)\n return () => window.removeEventListener('mouseup', onUp)\n }, [disabled])\n\n /* ----------------- Floating input position 동기화 ----------------- */\n // selection.focus / rows / editing 변경 시 활성 셀의 td DOM 을 querySelector 로 찾아\n // 위치/크기 측정. ref forward 패턴보다 단순하며 SortableContext 의 transform 적용\n // 직후에도 정확. useLayoutEffect 라 React commit 직후 paint 전 동기화.\n React.useLayoutEffect(() => {\n if (!selection) {\n setFloatingRect(null)\n return\n }\n const root = rootRef.current\n if (!root) return\n const { rowIdx, colIdx } = selection.focus\n const cell = root.querySelector<HTMLTableCellElement>(\n `[data-row-idx=\"${rowIdx}\"][data-col-idx=\"${colIdx}\"]`,\n )\n if (!cell) {\n setFloatingRect(null)\n return\n }\n const cr = cell.getBoundingClientRect()\n const rr = root.getBoundingClientRect()\n setFloatingRect({\n left: cr.left - rr.left,\n top: cr.top - rr.top,\n width: cr.width,\n height: cr.height,\n })\n }, [selection, rows, editing])\n\n // 편집 진입 직후 cursor 위치 (select-all / end) 적용. inputValue 가 React state 로\n // 반영된 후 한 번만 실행.\n React.useLayoutEffect(() => {\n if (editing == null) return\n const cursor = pendingCursorRef.current\n if (cursor == null) return\n const input = floatingInputRef.current\n if (!input) return\n input.focus({ preventScroll: true })\n if (cursor === 'all') {\n input.select()\n } else {\n const len = input.value.length\n input.setSelectionRange(len, len)\n }\n pendingCursorRef.current = null\n }, [editing, inputValue])\n\n /* ----------------- Row history (undo/redo) ----------------- */\n\n const pushRowHistory = React.useCallback(() => {\n const snapshot = cloneRows(realRows)\n setRowHistory((prev) => [...prev.slice(-(PARAMETER_TABLE_HISTORY_LIMIT - 1)), snapshot])\n setRedoStack([])\n }, [realRows])\n\n const emit = React.useCallback(\n (next: ParameterTableRow[]) => {\n const filled = next.some((r) => r.id === placeholderId && !isRowEmpty(r, columns))\n const pid = filled ? newRowId() : placeholderId\n if (filled) setPlaceholderId(pid)\n const normalized = normalizeTrailing(next, columns, pid)\n if (!isControlled) setInternalRows(normalized)\n onChange?.(normalized)\n },\n [isControlled, onChange, placeholderId, columns],\n )\n\n const emitRealRows = React.useCallback(\n (nextRealRows: ParameterTableRow[]) => {\n emit([...nextRealRows, placeholderRow])\n },\n [emit, placeholderRow],\n )\n\n const undoLastRowOperation = React.useCallback(() => {\n const last = rowHistory[rowHistory.length - 1]\n if (!last) return\n const restoredRows = cloneRows(last)\n const currentSnapshot = cloneRows(realRows)\n setRowHistory((prev) => prev.slice(0, -1))\n setRedoStack((prev) => [...prev.slice(-(PARAMETER_TABLE_HISTORY_LIMIT - 1)), currentSnapshot])\n emitRealRows(restoredRows)\n setSelection(null)\n setEditing(null)\n setInputValue('')\n }, [emitRealRows, realRows, rowHistory])\n\n const redoLastRowOperation = React.useCallback(() => {\n const last = redoStack[redoStack.length - 1]\n if (!last) return\n const restoredRows = cloneRows(last)\n const currentSnapshot = cloneRows(realRows)\n setRedoStack((prev) => prev.slice(0, -1))\n setRowHistory((prev) => [\n ...prev.slice(-(PARAMETER_TABLE_HISTORY_LIMIT - 1)),\n currentSnapshot,\n ])\n emitRealRows(restoredRows)\n setSelection(null)\n setEditing(null)\n setInputValue('')\n }, [emitRealRows, realRows, redoStack])\n\n const handleDelete = React.useCallback(\n (rowId: string) => {\n if (!realRows.find((r) => r.id === rowId)) return\n pushRowHistory()\n const next = rows.filter((r) => r.id !== rowId)\n emit(next)\n setSelection(null)\n setEditing(null)\n setInputValue('')\n },\n [emit, pushRowHistory, realRows, rows],\n )\n\n /* ----------------- Cell helpers ----------------- */\n\n const totalRows = rows.length\n const totalCols = columns.length\n\n const clampCoord = React.useCallback(\n (c: CellCoord): CellCoord => ({\n rowIdx: Math.max(0, Math.min(totalRows - 1, c.rowIdx)),\n colIdx: Math.max(0, Math.min(totalCols - 1, c.colIdx)),\n }),\n [totalRows, totalCols],\n )\n\n const setCellValue = React.useCallback(\n (rowIdx: number, colId: string, val: string) => {\n const target = rows[rowIdx]\n if (!target) return\n const next = rows.map((r, i) =>\n i === rowIdx ? { ...r, values: { ...r.values, [colId]: val } } : r,\n )\n emit(next)\n },\n [emit, rows],\n )\n\n const clearRange = React.useCallback(\n (range: CellRange) => {\n const rect = normalizeRange(range)\n pushRowHistory()\n const next = rows.map((row, rIdx) => {\n if (rIdx < rect.top || rIdx > rect.bottom) return row\n if (rIdx === rows.length - 1) return row\n const nextValues = { ...row.values }\n for (let c = rect.left; c <= rect.right; c++) {\n const col = columns[c]\n if (col) nextValues[col.id] = ''\n }\n return { ...row, values: nextValues }\n })\n emit(next)\n },\n [columns, emit, pushRowHistory, rows],\n )\n\n const getRangeCells = React.useCallback(\n (range: CellRange): { cells: string[][]; colIds: string[] } => {\n const rect = normalizeRange(range)\n const colIds: string[] = []\n for (let c = rect.left; c <= rect.right; c++) {\n colIds.push(columns[c]?.id ?? '')\n }\n const cells: string[][] = []\n for (let r = rect.top; r <= rect.bottom; r++) {\n const row = rows[r]\n const cellRow: string[] = []\n for (let c = rect.left; c <= rect.right; c++) {\n const col = columns[c]\n cellRow.push(col ? (row?.values?.[col.id] ?? '') : '')\n }\n cells.push(cellRow)\n }\n return { cells, colIds }\n },\n [columns, rows],\n )\n\n /* ----------------- Editing 진입 / 종료 ----------------- */\n\n /** 편집 모드 진입. cursor 위치는 'all' (Enter/F2) 또는 'end' (더블클릭). */\n const enterEdit = React.useCallback(\n (coord: CellCoord, initial: string, cursor: 'all' | 'end') => {\n setInputValue(initial)\n setEditing(coord)\n setSelection({ anchor: coord, focus: coord })\n pendingCursorRef.current = cursor\n },\n [],\n )\n\n /** 편집 commit. moveNext 가 지정되면 그 방향으로 다음 셀 선택. focus 는 항상 floating input 에 유지. */\n const commitEdit = React.useCallback(\n (\n coord: CellCoord,\n val: string,\n moveNext: 'down' | 'up' | 'right' | 'left' | 'none' = 'none',\n ) => {\n const col = columns[coord.colIdx]\n if (!col) return\n const sanitizedVal = typeof val === 'string' ? (sanitizeUserText(val) as string) : val\n const prevVal = rows[coord.rowIdx]?.values?.[col.id] ?? ''\n if (prevVal !== sanitizedVal) {\n pushRowHistory()\n setCellValue(coord.rowIdx, col.id, sanitizedVal)\n }\n setEditing(null)\n setInputValue('')\n let nextCoord = coord\n if (moveNext === 'down') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx + 1, colIdx: coord.colIdx })\n } else if (moveNext === 'up') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx - 1, colIdx: coord.colIdx })\n } else if (moveNext === 'right') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx, colIdx: coord.colIdx + 1 })\n } else if (moveNext === 'left') {\n nextCoord = clampCoord({ rowIdx: coord.rowIdx, colIdx: coord.colIdx - 1 })\n }\n setSelection({ anchor: nextCoord, focus: nextCoord })\n },\n [clampCoord, columns, pushRowHistory, rows, setCellValue],\n )\n\n const cancelEdit = React.useCallback(() => {\n setEditing(null)\n setInputValue('')\n }, [])\n\n /* ----------------- Cell mouse handlers ----------------- */\n\n const handleCellMouseDown = React.useCallback(\n (coord: CellCoord, event: React.MouseEvent) => {\n if (disabled) return\n // 편집 중이었으면 먼저 commit. 다른 셀로 이동.\n if (editing) {\n const col = columns[editing.colIdx]\n if (col) {\n const sanitizedVal =\n typeof inputValue === 'string' ? (sanitizeUserText(inputValue) as string) : inputValue\n const prevVal = rows[editing.rowIdx]?.values?.[col.id] ?? ''\n if (prevVal !== sanitizedVal) {\n pushRowHistory()\n setCellValue(editing.rowIdx, col.id, sanitizedVal)\n }\n }\n setEditing(null)\n setInputValue('')\n }\n // 아래 setSelection 이 selection 을 덮어쓰므로 \"이미 선택돼 있었는가\" 는 여기서만 판별 가능.\n reclickRef.current =\n selection && coordEquals(selection.anchor, coord) && coordEquals(selection.focus, coord)\n ? coord\n : null\n reclickEnteredRef.current = false\n event.preventDefault()\n focusFloating()\n setSelection({ anchor: coord, focus: coord })\n draggingRef.current = true\n },\n [\n columns,\n disabled,\n editing,\n focusFloating,\n inputValue,\n pushRowHistory,\n rows,\n selection,\n setCellValue,\n ],\n )\n\n const handleCellMouseEnter = React.useCallback(\n (coord: CellCoord) => {\n if (disabled) return\n if (!draggingRef.current) return\n reclickRef.current = null // 드래그로 다른 셀 진입 = 범위 선택 의도.\n if (editing) return\n setSelection((prev) => (prev ? { anchor: prev.anchor, focus: coord } : null))\n },\n [disabled, editing],\n )\n\n const handleCellDoubleClick = React.useCallback(\n (coord: CellCoord) => {\n if (disabled) return\n const col = columns[coord.colIdx]\n const row = rows[coord.rowIdx]\n if (!col || !row) return\n enterEdit(coord, row.values[col.id] ?? '', 'end')\n focusFloating()\n },\n [columns, disabled, enterEdit, focusFloating, rows],\n )\n\n /** 이미 선택된 단일 셀 재클릭 → 편집 진입. 드래그 범위 선택을 죽이지 않도록 mousedown 이\n * 아닌 click 에서 처리하고, 더블클릭의 두 번째 클릭(detail > 1)은 기존 경로에 맡긴다. */\n const handleCellClick = React.useCallback(\n (coord: CellCoord, event: React.MouseEvent) => {\n const pending = reclickRef.current\n reclickRef.current = null\n if (event.detail > 1) return\n if (!pending || !coordEquals(pending, coord)) return\n reclickEnteredRef.current = true\n handleCellDoubleClick(coord)\n },\n [handleCellDoubleClick],\n )\n\n /* ----------------- Clipboard handlers ----------------- */\n\n const copySelection = React.useCallback(async (): Promise<boolean> => {\n if (!selection) return false\n const { cells, colIds } = getRangeCells(selection)\n const tsv = serializeCellsToTsv(cells)\n const json = serializeCellsToJson(cells, colIds)\n return writeCellsToClipboard(tsv, json)\n }, [getRangeCells, selection])\n\n const cutSelection = React.useCallback(async () => {\n if (!selection) return\n const didWrite = await copySelection()\n if (!didWrite) return\n clearRange(selection)\n }, [clearRange, copySelection, selection])\n\n const pasteAtSelection = React.useCallback(async () => {\n if (disabled || !selection) return\n const result = await readCellsFromClipboard()\n if (!result) return\n const rect = normalizeRange(selection)\n const startRow = rect.top\n const startCol = rect.left\n\n const cells = result.kind === 'json' ? result.payload.cells : result.cells\n if (cells.length === 0) return\n\n pushRowHistory()\n\n const requiredRowCount = startRow + cells.length\n const nextRealRows = [...realRows]\n while (nextRealRows.length < requiredRowCount) {\n nextRealRows.push({ id: newRowId(), values: {} })\n }\n\n for (let r = 0; r < cells.length; r++) {\n const targetRowIdx = startRow + r\n const targetRow = nextRealRows[targetRowIdx]\n if (!targetRow) continue\n const nextValues = { ...targetRow.values }\n const srcRow = cells[r] ?? []\n for (let c = 0; c < srcRow.length; c++) {\n const targetColIdx = startCol + c\n const targetCol = columns[targetColIdx]\n if (!targetCol) continue\n nextValues[targetCol.id] = srcRow[c] ?? ''\n }\n nextRealRows[targetRowIdx] = { ...targetRow, values: nextValues }\n }\n\n emitRealRows(nextRealRows)\n\n const endRow = startRow + cells.length - 1\n const maxColInPaste = cells.reduce((m, r) => Math.max(m, r.length), 0)\n const endCol = startCol + maxColInPaste - 1\n const newRange: CellRange = {\n anchor: { rowIdx: startRow, colIdx: startCol },\n focus: clampCoord({ rowIdx: endRow, colIdx: endCol }),\n }\n setSelection(newRange)\n setEditing(null)\n setInputValue('')\n }, [clampCoord, columns, disabled, emitRealRows, pushRowHistory, realRows, selection])\n\n /* ----------------- IME composition handlers ----------------- */\n\n const handleCompositionStart = React.useCallback(() => {\n composingRef.current = true\n // 비편집 모드에서 IME 가 시작되면 즉시 편집 진입. 단일 input element 라 composition\n // 이 끊기지 않고 그대로 진행된다. inputValue 는 '' 로 비워 기존 cell value 를\n // 덮어쓴다 (Excel/Sheets 와 동일 — 비편집 모드의 첫 typing 은 덮어쓰기).\n // F2/더블클릭으로 미리 편집 진입한 경우 (editing != null) 는 inputValue 를 건드리지\n // 않아 기존 cell value 뒤에 한글을 이어쓸 수 있게 한다.\n if (!editing && selection && !disabled) {\n setEditing(selection.focus)\n setInputValue('')\n }\n }, [disabled, editing, selection])\n\n const handleCompositionEnd = React.useCallback(() => {\n composingRef.current = false\n // composition end 후 input.value 가 최종 텍스트. onChange 로 inputValue 동기화됨.\n // commit 은 사용자가 Enter/Tab 등으로 명시할 때만 (Excel/Sheets 와 동일).\n }, [])\n\n /* ----------------- Focus 이탈 (root 외부 pointerdown) ----------------- */\n\n // root 외부에서 mousedown 이 일어나면 (다른 ParameterTable 의 셀 / 외부 버튼 /\n // 배경 클릭 등) selection 해제 + 편집 중이면 commit. floating input 의 onBlur 에\n // 의존하지 않는 이유: 자체 mousedown 의 preventDefault + 명시적 focus() 흐름에서\n // brower 마다 blur 이벤트 발사 시점이 불안정해 적용 안 되는 케이스가 실측됨. 반면\n // document mousedown 은 항상 dispatch 되므로 견고하다.\n //\n // 같은 PT 안의 셀 클릭은 root.contains 검사로 거름.\n const editingRef = React.useRef(editing)\n const inputValueRef = React.useRef(inputValue)\n React.useEffect(() => {\n editingRef.current = editing\n inputValueRef.current = inputValue\n }, [editing, inputValue])\n\n React.useEffect(() => {\n if (disabled) return\n const handler = (event: MouseEvent) => {\n const root = rootRef.current\n if (!root) return\n const target = event.target as Node | null\n if (target && root.contains(target)) return\n // 외부 mousedown — 편집 commit + selection 해제.\n const currentEditing = editingRef.current\n const currentInputValue = inputValueRef.current\n if (currentEditing) {\n const col = columns[currentEditing.colIdx]\n if (col) {\n const sanitizedVal =\n typeof currentInputValue === 'string'\n ? (sanitizeUserText(currentInputValue) as string)\n : currentInputValue\n const prevVal = rows[currentEditing.rowIdx]?.values?.[col.id] ?? ''\n if (prevVal !== sanitizedVal) {\n pushRowHistory()\n setCellValue(currentEditing.rowIdx, col.id, sanitizedVal)\n }\n }\n setEditing(null)\n setInputValue('')\n }\n setSelection(null)\n }\n document.addEventListener('pointerdown', handler, true)\n return () => document.removeEventListener('pointerdown', handler, true)\n }, [columns, disabled, pushRowHistory, rows, setCellValue])\n\n /* ----------------- Keyboard ----------------- */\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n // IME composition 중에는 우리 핸들러 비활성. native input + IME 가 처리.\n if (event.nativeEvent.isComposing || composingRef.current) return\n\n const isMod = event.metaKey || event.ctrlKey\n const key = event.key\n\n /* ---- 편집 모드 핸들링 ---- */\n if (editing) {\n if (key === 'Enter' && !isMod && !event.altKey) {\n event.preventDefault()\n commitEdit(editing, inputValue, event.shiftKey ? 'up' : 'down')\n return\n }\n if (key === 'Tab') {\n event.preventDefault()\n commitEdit(editing, inputValue, event.shiftKey ? 'left' : 'right')\n return\n }\n if (key === 'Escape') {\n event.preventDefault()\n cancelEdit()\n return\n }\n if (key === 'ArrowDown' && !isMod && !event.altKey) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'down')\n return\n }\n if (key === 'ArrowUp' && !isMod && !event.altKey) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'up')\n return\n }\n const input = floatingInputRef.current\n if (\n key === 'ArrowLeft' &&\n !isMod &&\n !event.altKey &&\n input &&\n input.selectionStart === 0 &&\n input.selectionEnd === 0\n ) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'left')\n return\n }\n if (\n key === 'ArrowRight' &&\n !isMod &&\n !event.altKey &&\n input &&\n input.selectionStart === input.value.length &&\n input.selectionEnd === input.value.length\n ) {\n event.preventDefault()\n commitEdit(editing, inputValue, 'right')\n return\n }\n // 그 외 키 (텍스트 편집) — native input 이 처리.\n return\n }\n\n /* ---- 비편집 모드 핸들링 ---- */\n\n // Cmd+Z (undo) / Cmd+Shift+Z (redo)\n if (isMod && key.toLowerCase() === 'z' && !event.altKey) {\n event.preventDefault()\n if (event.shiftKey) redoLastRowOperation()\n else undoLastRowOperation()\n return\n }\n\n // Cmd+C / X / V / A\n if (isMod && !event.altKey && !event.shiftKey) {\n const k = key.toLowerCase()\n if (k === 'c') {\n event.preventDefault()\n void copySelection()\n return\n }\n if (k === 'x') {\n event.preventDefault()\n void cutSelection()\n return\n }\n if (k === 'v') {\n event.preventDefault()\n void pasteAtSelection()\n return\n }\n if (k === 'a') {\n event.preventDefault()\n const lastRealRow = Math.max(0, realRows.length - 1)\n const lastCol = Math.max(0, totalCols - 1)\n setSelection({\n anchor: { rowIdx: 0, colIdx: 0 },\n focus: { rowIdx: lastRealRow, colIdx: lastCol },\n })\n return\n }\n }\n\n if (!selection) return\n const focus = selection.focus\n\n // Backspace / Delete: 선택 셀 비우기.\n if ((key === 'Backspace' || key === 'Delete') && !isMod && !event.altKey) {\n event.preventDefault()\n clearRange(selection)\n return\n }\n\n // Esc: 선택 해제.\n if (key === 'Escape') {\n event.preventDefault()\n setSelection(null)\n return\n }\n\n // F2 / Enter: 편집 진입 (cursor end).\n if (key === 'F2' || (key === 'Enter' && !event.shiftKey && !isMod && !event.altKey)) {\n event.preventDefault()\n const col = columns[focus.colIdx]\n const row = rows[focus.rowIdx]\n if (!col || !row) return\n enterEdit(focus, row.values[col.id] ?? '', 'end')\n return\n }\n\n // Shift+Enter: 위 셀로 이동.\n if (key === 'Enter' && event.shiftKey && !isMod && !event.altKey) {\n event.preventDefault()\n const next = clampCoord({ rowIdx: focus.rowIdx - 1, colIdx: focus.colIdx })\n setSelection({ anchor: next, focus: next })\n return\n }\n\n // Home / End / Cmd+Home / Cmd+End.\n if (key === 'Home' || key === 'End') {\n event.preventDefault()\n const lastRealRow = Math.max(0, realRows.length - 1)\n const lastCol = Math.max(0, totalCols - 1)\n let nextCoord: CellCoord\n if (isMod) {\n nextCoord =\n key === 'Home' ? { rowIdx: 0, colIdx: 0 } : { rowIdx: lastRealRow, colIdx: lastCol }\n } else {\n nextCoord = {\n rowIdx: focus.rowIdx,\n colIdx: key === 'Home' ? 0 : lastCol,\n }\n }\n if (event.shiftKey) {\n setSelection({ anchor: selection.anchor, focus: nextCoord })\n } else {\n setSelection({ anchor: nextCoord, focus: nextCoord })\n }\n return\n }\n\n // 화살표.\n const arrowDelta: Record<string, [number, number]> = {\n ArrowUp: [-1, 0],\n ArrowDown: [1, 0],\n ArrowLeft: [0, -1],\n ArrowRight: [0, 1],\n }\n if (arrowDelta[key]) {\n event.preventDefault()\n const [dr, dc] = arrowDelta[key]\n const lastRealRow = Math.max(0, realRows.length - 1)\n const lastCol = Math.max(0, totalCols - 1)\n let next: CellCoord\n if (isMod) {\n next = {\n rowIdx: dr === 0 ? focus.rowIdx : dr < 0 ? 0 : lastRealRow,\n colIdx: dc === 0 ? focus.colIdx : dc < 0 ? 0 : lastCol,\n }\n } else {\n next = clampCoord({ rowIdx: focus.rowIdx + dr, colIdx: focus.colIdx + dc })\n }\n if (event.shiftKey) {\n setSelection({ anchor: selection.anchor, focus: next })\n } else {\n setSelection({ anchor: next, focus: next })\n }\n return\n }\n\n // Tab / Shift+Tab.\n if (key === 'Tab') {\n event.preventDefault()\n const dc = event.shiftKey ? -1 : 1\n let nextCol = focus.colIdx + dc\n let nextRow = focus.rowIdx\n if (nextCol >= totalCols) {\n nextCol = 0\n nextRow = Math.min(totalRows - 1, nextRow + 1)\n } else if (nextCol < 0) {\n nextCol = totalCols - 1\n nextRow = Math.max(0, nextRow - 1)\n }\n const next: CellCoord = { rowIdx: nextRow, colIdx: nextCol }\n setSelection({ anchor: next, focus: next })\n return\n }\n\n // Printable key (비-IME, 비-Mod): 편집 진입 + 그 키로 시작 (덮어쓰기).\n // preventDefault 하면 native 가 input.value 에 키를 안 넣지만, 우리가 inputValue=key\n // 로 controlled state 를 설정하므로 같은 효과. cursor 는 end 로.\n if (isPrintableKey(event)) {\n event.preventDefault()\n enterEdit(focus, key, 'end')\n return\n }\n },\n [\n cancelEdit,\n clampCoord,\n clearRange,\n columns,\n commitEdit,\n copySelection,\n cutSelection,\n disabled,\n editing,\n enterEdit,\n inputValue,\n pasteAtSelection,\n realRows,\n redoLastRowOperation,\n rows,\n selection,\n totalCols,\n totalRows,\n undoLastRowOperation,\n ],\n )\n\n /* ----------------- DnD (행 드래그) ----------------- */\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n const handleDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = realRows.findIndex((r) => r.id === active.id)\n const newIndex = realRows.findIndex((r) => r.id === over.id)\n if (oldIndex === -1 || newIndex === -1) return\n const reorderedReal = arrayMove(realRows, oldIndex, newIndex)\n pushRowHistory()\n emit([...reorderedReal, placeholderRow])\n setSelection(null)\n setEditing(null)\n setInputValue('')\n },\n [realRows, placeholderRow, pushRowHistory, emit],\n )\n\n /* ----------------- Render ----------------- */\n const colWidths = PARAMETER_TABLE_COL_WIDTHS[spacing]\n const selectionRect = selection ? normalizeRange(selection) : null\n\n const floatingInputStyle: React.CSSProperties = floatingRect\n ? {\n left: `${floatingRect.left}px`,\n top: `${floatingRect.top}px`,\n width: `${floatingRect.width}px`,\n height: `${floatingRect.height}px`,\n }\n : {\n // selection 없을 땐 off-screen. focus 는 받을 수 있도록 visible 유지하지 않음.\n left: '-9999px',\n top: '-9999px',\n width: '1px',\n height: '1px',\n }\n\n return (\n <div\n ref={setRootRef}\n className={cn(\n 't3q-parameter-table w-full focus:outline-none',\n `t3q-parameter-table--${spacing}`,\n disabled && 't3q-parameter-table--disabled opacity-50 pointer-events-none',\n className,\n )}\n data-disabled={disabled || undefined}\n // opacity-50 으로 흐려진 텍스트는 비활성 영역임을 보조기기에도 알린다 (axe 는 aria-disabled 영역의 대비를 면제)\n aria-disabled={disabled || undefined}\n >\n {caption && <div className='mb-[8px] text-base-medium text-sys-text-main'>{caption}</div>}\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n {/*\n DS Table 기본은 `border-collapse: collapse`. border-collapse 는 인접 td 의 border 를\n 0.5px 씩 분배해 첫/중간/마지막 행 사이에 셀 내부 가용 height 가 sub-pixel 다르게 보이는\n 원인이 됨. `border-separate` + `border-spacing-0` 로 변경하면 각 td 가 독립 박스를 갖고\n inner content 가 정확히 같은 위치에 그려진다.\n */}\n <Table className='!border-separate !border-spacing-0'>\n <TableHeader spacing={spacing}>\n <TableRow>\n {withHandle && (\n <TableHead align='center' style={{ width: `${colWidths.handle}px` }}>\n {/* 시각적으로 빈 열이지만 스크린리더용 헤더 텍스트는 필요하다(axe empty-table-header) */}\n <span className='sr-only'>순서 변경</span>\n </TableHead>\n )}\n {columns.map((col) => (\n <TableHead\n key={col.id}\n align='left'\n style={\n col.width\n ? { width: typeof col.width === 'number' ? `${col.width}px` : col.width }\n : undefined\n }\n >\n {col.header}\n {col.required && (\n <span className='ml-[2px] text-small-medium text-danger30'>*</span>\n )}\n </TableHead>\n ))}\n <TableHead align='center' style={{ width: `${colWidths.delete}px` }}>\n <span className='sr-only'>삭제</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody spacing={spacing}>\n <SortableContext items={realRowIds} strategy={verticalListSortingStrategy}>\n {rows.map((row, rowIdx) => {\n const isPlaceholder = rowIdx === rows.length - 1\n return (\n <ParameterTableRowComponent\n key={row.id}\n row={row}\n rowIdx={rowIdx}\n columns={columns}\n spacing={spacing}\n withHandle={withHandle}\n disabled={disabled}\n isPlaceholder={isPlaceholder}\n selectionRect={selectionRect}\n editingCell={editing}\n cellErrors={cellErrors}\n onCellMouseDown={handleCellMouseDown}\n onCellMouseEnter={handleCellMouseEnter}\n onCellClick={handleCellClick}\n onCellDoubleClick={handleCellDoubleClick}\n onDelete={() => handleDelete(row.id)}\n />\n )\n })}\n </SortableContext>\n </TableBody>\n </Table>\n {/*\n 단일 floating input — 모든 셀의 편집 input 역할. 비편집 모드에서도 mount 되어\n focus 를 받음. IME composition 이 시작되면 input element 가 그대로 유지되므로\n 한국어/일본어/중국어 자모가 분리되지 않는다. 위치는 useLayoutEffect 으로 활성\n cell rect 에 동기화.\n */}\n <input\n ref={floatingInputRef}\n type='text'\n className={cn(\n 't3q-pt-floating-input text-base-medium',\n editing && 't3q-pt-floating-input--editing',\n )}\n style={floatingInputStyle}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onMouseDown={(event) => {\n // 재클릭으로 막 열린 편집 위에서 이어진 더블클릭. 단어 선택은 이 mousedown 의\n // default action 이므로 여기서만 막아 커서를 'end' 로 유지한다.\n if (reclickEnteredRef.current && event.detail > 1) event.preventDefault()\n reclickEnteredRef.current = false\n }}\n onKeyDown={handleKeyDown}\n onCompositionStart={handleCompositionStart}\n onCompositionEnd={handleCompositionEnd}\n aria-label={\n editing && columns[editing.colIdx]\n ? columns[editing.colIdx].header\n : 'Parameter table cell editor'\n }\n tabIndex={disabled ? -1 : 0}\n disabled={disabled}\n autoComplete='off'\n spellCheck={false}\n />\n </DndContext>\n </div>\n )\n },\n)\nParameterTable.displayName = 'ParameterTable'\n\nexport { ParameterTable }\n","'use client'\n\nimport * as React from 'react'\nimport { useMemo } from 'react'\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\n\nimport { cn } from '../utils/cn'\n\n/** 막대 색 — 작업 상태와 연동(실패한 작업의 막대가 파란색이면 상태와 어긋난다, 2026-10-16 이슈 47) */\nconst indicatorVariants = {\n primary: 'bg-primary30',\n success: 'bg-success30',\n warning: 'bg-warning30',\n danger: 'bg-danger30',\n} as const\n\ninterface ProgressProps extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {\n /** 진행률 (0–100). 없으면 indeterminate */\n value?: number\n /** 막대 색. 기본 `primary`. 상태 Badge 의 tone 과 맞춘다 — 실패 `danger`, 경고 `warning`, 완료 `success` */\n variant?: keyof typeof indicatorVariants\n}\n\n/**\n * 가로 진행 막대(role=progressbar). 표의 진행률 열, 자원 사용량, 작업 진행에 쓴다.\n *\n * 언제 쓰나: 0~100 의 비율을 길이로 보여 줄 때. 이름은 `aria-label` 로 준다 — 표에서는 행마다 `'GPU 사용률 46%'` 처럼 **무엇의 비율인지**.\n * 이름을 안 주면 `'46%'`(값이 없으면 `'진행 중'`)를 기본 이름으로 붙인다 — 이름 없는 progressbar 는 axe serious(aria-progressbar-name, 2026-10-20 17차). 기본 이름은 숫자뿐이라 뜻이 약하니 호출자가 주는 것이 맞다.\n * 언제 안 쓰나: 단계가 있는 진행(→ Stepper), 불확정 대기(→ Spinner).\n * 대신/함께: 막대 옆에 % 글자를 같이 둔다(`tabular-nums`). 색(`variant`)은 **값의 뜻대로** — 높을수록 좋은 비율(정상 행·통과율·완료율)은 기본(primary)이나 success, 낮을수록 좋은 값의 경고 구간만 warning·danger. 페이지·항목의 실패 상태에 맞춰 칠하지 않는다(2026-11-06 홀드아웃 20: \"정상 행 99%\" 막대가 빨강).\n */\nconst Progress = React.forwardRef<React.ElementRef<typeof ProgressPrimitive.Root>, ProgressProps>(\n ({ value, variant = 'primary', className, ...props }, ref) => {\n // 접근성 이름 — 호출자가 aria-label/aria-labelledby 를 주면 그대로, 없으면 값으로 채운다(이름 없는 progressbar 는 axe serious)\n const ariaLabel =\n props['aria-label'] ??\n (props['aria-labelledby'] ? undefined : value == null ? '진행 중' : `${Math.round(value)}%`)\n const percentage = useMemo(() => {\n const resultValue = -(100 - (value || 0))\n return `${resultValue}%`\n }, [value])\n\n return (\n <ProgressPrimitive.Root\n ref={ref}\n // value 를 Root 에 넘겨야 aria-valuenow 가 붙고 indeterminate 로 취급되지 않는다\n value={value}\n {...props}\n aria-label={ariaLabel}\n className={cn(\n 'relative h-[8px] w-full overflow-hidden rounded-full bg-secondary30',\n className,\n )}\n >\n <ProgressPrimitive.Indicator\n className={cn('h-full w-full flex-1 transition-all', indicatorVariants[variant])}\n style={{ transform: `translateX(${percentage})` }}\n />\n </ProgressPrimitive.Root>\n )\n },\n)\n\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\nexport type { ProgressProps }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\ninterface RadioProps extends React.HTMLAttributes<HTMLDivElement> {\n checked?: boolean\n disabled?: boolean\n}\n\n/**\n * 시각적 라디오 인디케이터 컴포넌트\n * RadioGroup 없이 독립적으로 사용 가능 (AG Grid 셀 렌더러 등)\n *\n * 단일 선택 라디오 버튼 하나. 보통 RadioGroup 안에서 쓴다.\n *\n * 언제 쓰나: 2~5개 선택지 중 하나를 고르고, 선택지를 한눈에 보여야 할 때.\n * 언제 안 쓰나: 선택지가 많을 때(→ Select), 복수 선택(→ Checkbox), 제목·설명이 붙은 큰 선택 카드(→ RadioSection).\n * 대신/함께: 단독으로 쓰지 말고 RadioGroup 으로 묶어 키보드 이동과 그룹 이름을 받는다.\n */\nfunction Radio({ checked = false, disabled = false, className, ...props }: RadioProps) {\n return (\n <div\n role='radio'\n aria-checked={checked}\n aria-disabled={disabled}\n data-state={checked ? 'checked' : 'unchecked'}\n className={cn(\n 'relative border-[2px] border-sys-divider-main w-[16px] h-[16px] rounded-full aspect-square shrink-0',\n !disabled && 'hover:bg-secondary-o10',\n disabled && 'border-secondary-o10 bg-secondary-o20 cursor-not-allowed',\n checked && !disabled && 'bg-primary30 border-none hover:bg-primary40',\n checked && disabled && 'bg-primary-o20 border-none',\n className,\n )}\n {...props}\n >\n {checked && (\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 w-[6px] h-[6px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-sys-background',\n )}\n />\n )}\n </div>\n )\n}\n\nexport { Radio }\n","'use client'\n\nimport * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cn } from '../utils/cn'\n\n/**\n * Radio 묶음. 폼에서 2~5개 선택지 중 하나를 고를 때 쓴다.\n *\n * 언제 쓰나: 유형·방식 선택처럼 선택지가 적고 항상 보여야 할 때. `FormField` 안에서 `onValueChange` 를 연결한다.\n * 언제 안 쓰나: 선택지가 6개 이상(→ Select), 복수 선택(→ Checkbox), 선택지마다 제목·설명이 필요한 카드형(→ RadioSectionGroup).\n * 대신/함께: 선택에 따라 아래 필드가 바뀌면 반대 분기의 값은 `reset` 으로 비운다(`trigger` 는 빈 필수 필드를 즉시 오류로 띄운다).\n */\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot='radio-group'\n className={cn('flex', className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot='radio-group-item'\n className={cn(\n 'border-[2px] border-sys-divider-main w-[16px] h-[16px] rounded-full aspect-square shrink-0 m-[4px]',\n 'hover:bg-secondary-o10 disabled:border-secondary-o10 disabled:bg-secondary-o20 disabled:cursor-not-allowed',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n 'data-[state=\"checked\"]:bg-primary30 data-[state=\"checked\"]:border-none data-[state=\"checked\"]:hover:bg-primary40 data-[state=\"checked\"]:hover:border-primary40 data-[state=\"checked\"]:disabled:bg-primary-o20 data-[state=\"checked\"]:disabled:border-none',\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot='radio-group-indicator'\n className='relative flex items-center justify-center'\n >\n <span\n className={cn(\n 'absolute top-1/2 left-1/2 w-[6px] h-[6px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-sys-background',\n )}\n ></span>\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","'use client'\n\nimport * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\n\nimport { cn } from '../utils/cn'\nimport { Radio } from './radio'\n\n/* -------------------------------------------------------------------------- */\n/* RadioSectionGroup */\n/* -------------------------------------------------------------------------- */\n\ntype RadioSectionGroupContextValue = {\n value?: string | null\n /** 5개 이상 자동 세로 쌓기 — 카드 안은 제목·설명을 한 줄에(가로) */\n stacked: boolean\n}\n\nconst RadioSectionGroupContext = React.createContext<RadioSectionGroupContextValue | null>(null)\n\ntype RadioSectionGroupProps = React.ComponentProps<typeof RadioGroupPrimitive.Root>\n\n/**\n * 카드형 라디오(RadioSection)들을 묶는 그룹.\n *\n * 언제 쓰나: 선택지마다 제목·설명이 붙는 유형·방식 선택(2개 이상). 설명 없는 짧은 선택은 RadioGroup, 7개 이상·검색이 필요하면 Select.\n *\n * Radix RadioGroup 위에 올려 `role='radiogroup'`, roving tabindex, 화살표 키 이동,\n * 단일 선택(value/onValueChange)을 제공한다. 자식으로 `<RadioSection value=... />` 를 둔다.\n *\n * `orientation`(기본 'horizontal')이 레이아웃과 방향키 축을 함께 결정한다:\n * - 'horizontal' → **개수에 맞춘 grid**: 1~3개 한 줄(n 등분), **4개 2×2**, **5개 이상 세로 쌓기**(카드 안은 제목·설명 가로, 방향키도 Up/Down).\n * 폼 열 720px 에 카드 4개를 한 줄에 두면 170px 씩이라 설명이 3~4줄로 접혀 \"cramped\" 로 읽혔다(한 줄 판 12차·상세 판 11차 폼, 2026-10-18 13차).\n * 2×2 에서는 Left/Right 가 DOM 순서로 돈다\n * - 'vertical' → 세로 배치(flex col) + Up/Down 으로 이동 (개수와 무관, 카드 안은 세로 그대로)\n *\n * 그룹 접근성 이름은 `aria-label`(문자열) 또는 `aria-labelledby`(id) 로 전달한다.\n * controlled 사용을 전제로 한다(`value` + `onValueChange`).\n */\nfunction RadioSectionGroup({\n className,\n value,\n orientation = 'horizontal',\n children,\n ...props\n}: RadioSectionGroupProps) {\n const count = React.Children.count(children)\n // 가로 배치는 개수로 정한다 — 5개 이상은 세로로 쌓고 방향키 축도 세로로(2026-10-18 13차, 사용자 \"radio section 이 4개 이상일 때 처리 방식\")\n const stacked = orientation === 'horizontal' && count >= 5\n const effectiveOrientation = stacked ? 'vertical' : orientation\n const layoutClass =\n effectiveOrientation === 'vertical'\n ? 'flex flex-col'\n : count === 4\n ? 'grid w-full grid-cols-2'\n : count === 3\n ? 'grid w-full grid-cols-3'\n : count === 2\n ? 'grid w-full grid-cols-2'\n : 'flex w-full'\n return (\n <RadioSectionGroupContext.Provider value={{ value, stacked }}>\n <RadioGroupPrimitive.Root\n data-slot='radio-section-group'\n value={value}\n orientation={effectiveOrientation}\n // orientation 에 맞춰 레이아웃과 방향키 축(가로=Left/Right, 세로=Up/Down)을 일치시킨다\n // 카드 사이 8: 4 는 원문 심판이 \"option-card grid has very tight gutters\" 로 감점(2026-10-18 13차 폼) → 붙어 있는 요소 간격 8 (2026-10-19 14차)\n className={cn('items-stretch gap-[8px]', layoutClass, className)}\n {...props}\n >\n {children}\n </RadioGroupPrimitive.Root>\n </RadioSectionGroupContext.Provider>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* RadioSection */\n/* -------------------------------------------------------------------------- */\n\ninterface RadioSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n title: string\n description?: string\n selected?: boolean\n disabled?: boolean\n onSelect?: () => void\n /** RadioSectionGroup 안에서 사용할 때 필수 — 그룹의 선택 value 와 매칭된다. */\n value?: string\n}\n\n/**\n * 카드형 라디오 — 제목 + 설명이 있는 카드 안에 Radio 인디케이터. 유형·방식 선택의 기본.\n *\n * 언제 쓰나: 소스 유형·공개 범위·입력 방식처럼 선택지가 2개 이상이고 선택지마다 제목과 한 줄 설명이 붙을 때 — `RadioSectionGroup` 안에 `value`·`title`·`description` 으로(dl-ui-v3 의 유형 선택 관례). 배치는 그룹이 개수로 정한다(1~3개 한 줄, 4개 2×2, 5개 이상 세로).\n * 언제 안 쓰나: 설명이 없는 짧은 선택(예·아니오, 켬·끔)은 RadioGroup, 선택지 7개 이상·검색이 필요하면 Select, 복수 선택은 Checkbox.\n * 대신/함께: 폼에서는 `FormField` 의 `field.value`/`field.onChange` 를 `RadioSectionGroup` 의 `value`/`onValueChange` 에 연결하고, 그룹에 `aria-labelledby` 로 FormLabel 의 id 를 건다(예제 form-page.tsx 의 스케줄 선택).\n *\n * 두 가지 사용 방식:\n * - **그룹 모드**: `<RadioSectionGroup>` 안에서 `value` 와 함께 사용 → Radix Item 으로 동작하여\n * role=radio / roving tabindex / aria-checked / 화살표·Space 키를 그룹이 관리한다.\n * - **단독 모드(하위호환)**: `selected` / `onSelect` 로 부모가 직접 제어. (기존 동작 그대로)\n */\nfunction RadioSection({\n title,\n description,\n selected = false,\n disabled = false,\n onSelect,\n value,\n className,\n onClick,\n onKeyDown,\n ...props\n}: RadioSectionProps) {\n const group = React.useContext(RadioSectionGroupContext)\n const inGroup = group !== null\n const isSelected = inGroup ? group.value === value : selected\n // 그룹이 5개 이상을 세로로 쌓을 때는 카드 안을 한 줄(제목 · 설명)로 — 세로 카드 5개는 너무 길다\n const stacked = inGroup && group.stacked\n\n const cardClassName = cn(\n 'bg-sys-background flex flex-col items-start overflow-clip rounded-medium w-full',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px]',\n // 테두리는 선택 여부와 무관하게 1px(layout shift 0) — 선택은 색 + 연한 채움으로. 2px 선택 테두리·연한 비선택 테두리는\n // \"heavy blue borders on selected cards\"·\"unselected radio card's faint border\" 로 두 심판 모두 감점 (2026-10-20 16차 D2)\n 'border p-[12px]',\n !isSelected && 'border-sys-divider-main',\n isSelected && !disabled && 'border-primary30 bg-primary-o10',\n isSelected && disabled && 'border-primary-o20',\n // disabled 시 포인터 이벤트 차단 — 그룹(asChild) 모드에선 네이티브 disabled 가 없어\n // 클릭 선택이 막히지 않으므로 CSS 로 차단(키보드/roving 제외는 Radix 가 처리).\n disabled ? 'cursor-not-allowed pointer-events-none' : 'cursor-pointer',\n className,\n )\n\n const body = (\n <div className='flex gap-[4px] items-start w-full'>\n <div\n className='flex items-center justify-center p-[4px] shrink-0 size-[24px]'\n aria-hidden='true'\n >\n <Radio checked={isSelected} disabled={disabled} />\n </div>\n <div\n data-slot='radio-section-text'\n className={cn(\n 'flex flex-1 min-w-0',\n stacked\n ? 'flex-row flex-wrap items-baseline gap-x-[12px] gap-y-[2px]'\n : 'flex-col gap-[4px] items-start',\n )}\n >\n <span\n className={cn(\n 'block text-h5 break-keep wrap-break-word',\n stacked ? 'shrink-0' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-main',\n )}\n >\n {title}\n </span>\n {description && (\n <span\n className={cn(\n 'block text-base-regular break-keep wrap-break-word',\n stacked ? 'min-w-0 flex-1' : 'w-full',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-subtle',\n )}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n )\n\n // 그룹 모드: Radix Item 을 네이티브 <button> 으로 렌더(asChild 미사용).\n // Radix Radio 의 키보드 활성화(Space/Enter→native click, 화살표 selection-follows-focus)는\n // 네이티브 <button> 에 의존하므로, <div> 로 만들면 키보드 선택이 동작하지 않는다.\n if (inGroup) {\n return (\n <RadioGroupPrimitive.Item\n value={value as string}\n disabled={disabled}\n className={cn(cardClassName, 'appearance-none text-left')}\n {...(props as Omit<\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>,\n 'value' | 'disabled' | 'className' | 'children'\n >)}\n >\n {body}\n </RadioGroupPrimitive.Item>\n )\n }\n\n // 단독 모드(하위호환): 부모가 selected/onSelect 로 직접 제어\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(e)\n // radio 시맨틱: 이미 선택된 항목 재클릭은 no-op\n if (disabled || isSelected) return\n onSelect?.()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (disabled) return\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault()\n // radio 시맨틱: 이미 선택된 항목은 재선택하지 않음 (Space 스크롤 방지는 유지)\n if (isSelected) return\n onSelect?.()\n }\n }\n\n return (\n <div\n role='radio'\n aria-checked={isSelected}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n data-state={isSelected ? 'checked' : 'unchecked'}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cardClassName}\n {...props}\n >\n {body}\n </div>\n )\n}\n\nexport { RadioSection, RadioSectionGroup }\nexport type { RadioSectionProps, RadioSectionGroupProps }\n","'use client'\n\nimport * as React from 'react'\n\nimport type { MultiSelectContextValue } from './types'\n\nconst MultiSelectContext = React.createContext<MultiSelectContextValue | null>(null)\n\nexport function useMultiSelectContext() {\n const context = React.useContext(MultiSelectContext)\n if (!context) {\n throw new Error('MultiSelect compound components must be used within <MultiSelect>')\n }\n return context\n}\n\nexport { MultiSelectContext }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../../utils/cn'\nimport { MultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectContextValue, MultiSelectProps } from './types'\n\n/**\n * 드롭다운에서 여러 개를 고르는 폼 입력. 선택한 항목은 칩으로 보여 준다.\n *\n * 언제 쓰나: 태그·권한·대상 목록처럼 0개 이상을 고르는 폼 필드. 구성은 Select 와 같다(MultiSelectTrigger·Content·Item).\n * 언제 안 쓰나: 하나만 고르는 경우(→ Select), 선택지가 적어 한눈에 보여야 하는 경우(→ Checkbox 묶음), 목록 화면 필터(→ TableFilterMultiSelect).\n * 대신/함께: 칩 라벨도 마운트된 아이템에서 얻으므로 미로드 값은 `useMultiSelectContext().registerLabel` 로 등록한다.\n */\nfunction MultiSelect({\n value: controlledValue,\n defaultValue,\n onValueChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n onSearchChange,\n disabled,\n className,\n children,\n}: MultiSelectProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState<string[]>(defaultValue ?? [])\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const [searchTerm, setSearchTerm] = React.useState('')\n\n // searchTerm 이 바뀔 때마다 외부 콜백 호출.\n // typing / 토글 reset / popup close reset 모두 fire 됨.\n React.useEffect(() => {\n onSearchChange?.(searchTerm)\n }, [searchTerm, onSearchChange])\n\n const isControlledValue = controlledValue !== undefined\n const isControlledOpen = controlledOpen !== undefined\n\n const values = isControlledValue ? controlledValue : uncontrolledValue\n const open = isControlledOpen ? controlledOpen : uncontrolledOpen\n\n const [labelMap] = React.useState(() => new Map<string, string>())\n\n const registerLabel = React.useCallback(\n (itemValue: string, label: string) => {\n labelMap.set(itemValue, label)\n },\n [labelMap],\n )\n\n const handleToggleValue = React.useCallback(\n (toggleValue: string) => {\n const newValues = values.includes(toggleValue)\n ? values.filter((v) => v !== toggleValue)\n : [...values, toggleValue]\n if (!isControlledValue) {\n setUncontrolledValue(newValues)\n }\n onValueChange?.(newValues)\n setSearchTerm('')\n },\n [values, isControlledValue, onValueChange],\n )\n\n const handleRemoveValue = React.useCallback(\n (removeValue: string) => {\n const newValues = values.filter((v) => v !== removeValue)\n if (!isControlledValue) {\n setUncontrolledValue(newValues)\n }\n onValueChange?.(newValues)\n },\n [values, isControlledValue, onValueChange],\n )\n\n const handleClearAll = React.useCallback(() => {\n if (!isControlledValue) {\n setUncontrolledValue([])\n }\n onValueChange?.([])\n }, [isControlledValue, onValueChange])\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n if (!isControlledOpen) {\n setUncontrolledOpen(newOpen)\n }\n // 닫힐 때 검색어 리셋\n if (!newOpen) {\n setSearchTerm('')\n }\n onOpenChange?.(newOpen)\n },\n [isControlledOpen, onOpenChange],\n )\n\n const contextValue = React.useMemo<MultiSelectContextValue>(\n () => ({\n open,\n setOpen: handleOpenChange,\n values,\n onToggleValue: handleToggleValue,\n onRemoveValue: handleRemoveValue,\n onClearAll: handleClearAll,\n disabled,\n labelMap,\n registerLabel,\n searchTerm,\n setSearchTerm,\n }),\n [\n open,\n handleOpenChange,\n values,\n handleToggleValue,\n handleRemoveValue,\n handleClearAll,\n disabled,\n labelMap,\n registerLabel,\n searchTerm,\n ],\n )\n\n return (\n <MultiSelectContext.Provider value={contextValue}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange} modal>\n <div data-slot='multi-select' className={cn('relative', className)}>\n {children}\n </div>\n </PopoverPrimitive.Root>\n </MultiSelectContext.Provider>\n )\n}\n\nexport { MultiSelect }\n","'use client'\n\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\n/**\n * 닫힌 Select·MultiSelect 의 항목이 \"코드→이름\" 짝만 등록하게 하는 모드.\n *\n * 항목은 마운트될 때 `registerLabel` 로 이름을 알리는데 닫힌 목록은 항목을 그리지 않아, 값이 미리 정해진 폼에서 트리거가\n * 펼치기 전까지 원값('utilization', '5')을 보였다(2026-10-30 홀드아웃 17 세트 2 폼 2쌍 copy_quality). 닫혀 있는 동안 SelectContent\n * 가 children 을 이 모드로 한 번 더 그리고, 각 부품은 이 모드에서 등록만 하고 아무것도 그리지 않는다(cmdk 틀 밖이라 그릴 수도 없다).\n */\nconst LabelPassContext = React.createContext(false)\n\n/** 라벨 등록 모드인가 — true 면 항목은 등록만 하고 null, 묶음은 children 만, 나머지는 null 을 그린다 */\nexport const useLabelPass = (): boolean => React.useContext(LabelPassContext)\n\n/**\n * children 을 라벨 등록 모드로 그린다. 부품이 아닌 마크업(호출부가 SelectContent 안에 직접 넣은 `<div>` 등)이 폼 레이아웃에\n * 끼어들지 않도록 body 의 숨긴 상자에 붙인다. 서버·첫 렌더에는 그리지 않는다(마운트 뒤 effect 로 등록되는 것은 원래와 같다).\n */\nexport function LabelPass({ children }: { children: React.ReactNode }) {\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => setMounted(true), [])\n if (!mounted) return null\n return createPortal(\n <div hidden data-slot='select-label-pass'>\n <LabelPassContext.Provider value>{children}</LabelPassContext.Provider>\n </div>,\n document.body,\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { LabelPass } from '../_internal/labelPass'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectContentProps } from './types'\n\nconst MultiSelectContent = React.forwardRef<HTMLDivElement, MultiSelectContentProps>(\n ({ className, children, align = 'start', sideOffset = 4, ...props }, ref) => {\n const { open, searchTerm, setSearchTerm } = useMultiSelectContext()\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // 열릴 때 선택된 항목으로 스크롤\n React.useEffect(() => {\n if (open) {\n requestAnimationFrame(() => {\n const checkedItem = listRef.current?.querySelector('[data-state=checked]')\n if (checkedItem && typeof checkedItem.scrollIntoView === 'function') {\n checkedItem.scrollIntoView({ block: 'nearest' })\n }\n })\n }\n }, [open])\n\n return (\n <>\n {/* 닫혀 있는 동안 항목이 이름만 등록해 트리거가 펼치기 전에도 원값 대신 이름을 보인다 (2026-10-30 홀드아웃 17) */}\n {open ? null : <LabelPass>{children}</LabelPass>}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n data-slot='multi-select-content'\n // Radix Popover 콘텐츠는 role=dialog 라 이름이 필요하다(axe aria-dialog-name). 호출부 aria-label 이 있으면 {...props} 가 덮는다\n aria-label='옵션 목록'\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-[var(--root-z-index)] min-w-[var(--radix-popover-trigger-width)] origin-(--radix-popover-content-transform-origin) overflow-hidden rounded-small shadow-gray-medium bg-sys-background border border-sys-divider-subtler',\n 'data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]',\n 'data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]',\n 'data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]',\n className,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n {...props}\n >\n <CommandPrimitive\n filter={(_value, search, keywords) => {\n const lowerSearch = search.toLowerCase()\n if (keywords?.some((kw) => kw.toLowerCase().includes(lowerSearch))) return 1\n return 0\n }}\n value=''\n onValueChange={() => {}}\n >\n {/* 숨겨진 cmdk Input: trigger의 searchTerm을 cmdk 필터에 연결 */}\n <CommandPrimitive.Input\n value={searchTerm}\n onValueChange={setSearchTerm}\n className='sr-only'\n aria-hidden='true'\n tabIndex={-1}\n />\n\n {(() => {\n const inputChildren: React.ReactNode[] = []\n const restChildren: React.ReactNode[] = []\n\n React.Children.forEach(children, (child) => {\n if (\n React.isValidElement(child) &&\n (child.type as any)?.displayName === 'MultiSelectInput'\n ) {\n inputChildren.push(child)\n } else {\n restChildren.push(child)\n }\n })\n\n return (\n <>\n {inputChildren}\n <CommandPrimitive.List\n ref={listRef}\n role='listbox'\n aria-multiselectable='true'\n className='max-h-[300px] overflow-y-auto overflow-x-hidden scroll-py-1'\n >\n {restChildren}\n </CommandPrimitive.List>\n </>\n )\n })()}\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </>\n )\n },\n)\nMultiSelectContent.displayName = 'MultiSelectContent'\n\nexport { MultiSelectContent }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { MultiSelectEmptyProps } from './types'\n\nconst MultiSelectEmpty = React.forwardRef<HTMLDivElement, MultiSelectEmptyProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <CommandPrimitive.Empty\n ref={ref}\n data-slot='multi-select-empty'\n className={cn(\n 'flex items-center justify-center py-[24px] text-base-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n {children ?? '결과 없음'}\n </CommandPrimitive.Empty>\n )\n },\n)\nMultiSelectEmpty.displayName = 'MultiSelectEmpty'\n\nexport { MultiSelectEmpty }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { MultiSelectGroupProps } from './types'\n\nconst MultiSelectGroup = React.forwardRef<HTMLDivElement, MultiSelectGroupProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 묶음 안 항목만 등록되게 children 만\n if (labelPass) return <>{children}</>\n return (\n <CommandPrimitive.Group\n ref={ref}\n data-slot='multi-select-group'\n className={cn(\n '[&_[cmdk-group-heading]]:sticky [&_[cmdk-group-heading]]:top-0 [&_[cmdk-group-heading]]:z-10 [&_[cmdk-group-heading]]:bg-secondary-o10 [&_[cmdk-group-heading]]:backdrop-blur-[16px] [&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:py-[4px] [&_[cmdk-group-heading]]:text-small-medium [&_[cmdk-group-heading]]:text-sys-text-subtle',\n className,\n )}\n {...props}\n >\n {children}\n </CommandPrimitive.Group>\n )\n },\n)\nMultiSelectGroup.displayName = 'MultiSelectGroup'\n\nexport { MultiSelectGroup }\n","'use client'\n\nimport * as React from 'react'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectInputProps } from './types'\n\nconst MultiSelectInput = React.forwardRef<HTMLInputElement, MultiSelectInputProps>(\n ({ className, onChange, ...props }, ref) => {\n const { searchTerm, setSearchTerm } = useMultiSelectContext()\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setSearchTerm(value)\n onChange?.(value)\n }\n\n const handleClear = () => {\n setSearchTerm('')\n onChange?.('')\n }\n\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div className='flex items-center border-b border-b-sys-divider-subtle px-[6px] py-[4px] gap-[4px]'>\n <Search className='shrink-0 size-[16px] text-sys-text-subtler' aria-hidden='true' />\n <div className='flex flex-1 items-center h-[28px] min-w-0 px-[4px] py-[2px]'>\n <input\n ref={ref}\n value={searchTerm}\n onChange={handleChange}\n aria-label='옵션 검색'\n className={cn(\n 'flex w-full border-none bg-transparent text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-placeholder disabled:cursor-not-allowed disabled:text-sys-text-disabled',\n className,\n )}\n {...props}\n />\n </div>\n {searchTerm && (\n <button\n type='button'\n onClick={handleClear}\n className='flex items-center justify-center shrink-0 p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler'\n aria-label='검색어 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n </div>\n )\n },\n)\nMultiSelectInput.displayName = 'MultiSelectInput'\n\nexport { MultiSelectInput }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { MetaItem, type MetaItemProps } from '../metaItem'\n\ninterface SelectItemContentProps {\n children: React.ReactNode\n description?: string\n meta?: MetaItemProps[]\n /** title 행 안, 이름 앞에 인라인으로 렌더될 슬롯 (meta/description 행은 밀지 않음) */\n elemBefore?: React.ReactNode\n elemAfter?: React.ReactNode\n disabled?: boolean\n}\n\nfunction SelectItemContent({\n children,\n description,\n meta,\n elemBefore,\n elemAfter,\n disabled,\n}: SelectItemContentProps) {\n return (\n <div\n className={cn(\n 'flex flex-col min-w-0 flex-1 items-start justify-center',\n disabled && 'text-sys-text-disabled [&_*]:text-sys-text-disabled',\n )}\n >\n <div className='flex w-full h-[28px] items-center gap-[8px]'>\n {/* 광학 보정: 뱃지(아이콘+텍스트)는 박스-중심으로 정렬돼 타이틀(text-base-semibold) 텍스트보다 살짝 높게 보인다. 3px 내려 시각 정렬하며, layout shift 없도록 transform 사용. */}\n {elemBefore && <span className='shrink-0 translate-y-[3px]'>{elemBefore}</span>}\n <span className='flex-1 truncate whitespace-pre text-base-semibold text-left'>\n {sanitizeUserText(children)}\n </span>\n {elemAfter && <span className='shrink-0'>{elemAfter}</span>}\n </div>\n {meta && meta.length > 0 && (\n <div className='flex items-start gap-[16px] shrink-0'>\n {meta.map((m, idx) => (\n <MetaItem key={`${typeof m.label === 'string' ? m.label : 'meta'}-${idx}`} {...m} />\n ))}\n </div>\n )}\n {description && (\n <span className='w-full truncate whitespace-pre text-small-regular-h text-sys-text-subtler pb-[2px]'>\n {sanitizeUserText(description)}\n </span>\n )}\n </div>\n )\n}\n\nexport { SelectItemContent }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { SelectItemContent } from '../select/selectItemContent'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectItemProps } from './types'\n\nconst MultiSelectItem = React.forwardRef<HTMLDivElement, MultiSelectItemProps>(\n (\n {\n className,\n children,\n value,\n disabled,\n description,\n textValue,\n meta,\n elemBefore,\n elemBeforeAlign = 'center',\n elemAfter,\n ...props\n },\n ref,\n ) => {\n const { values, onToggleValue, registerLabel } = useMultiSelectContext()\n const labelPass = useLabelPass()\n const isSelected = values.includes(value)\n\n // children에서 텍스트 추출 (textValue가 없는 경우)\n const resolvedTextValue = textValue ?? (typeof children === 'string' ? children : value)\n\n // trigger 표시용 라벨 등록\n React.useEffect(() => {\n registerLabel(value, resolvedTextValue)\n }, [value, resolvedTextValue, registerLabel])\n\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 등록만 하고 그리지 않는다\n if (labelPass) return null\n\n return (\n <CommandPrimitive.Item\n ref={ref}\n data-slot='multi-select-item'\n data-state={isSelected ? 'checked' : 'unchecked'}\n value={value}\n keywords={[resolvedTextValue]}\n disabled={disabled}\n onSelect={() => {\n if (!disabled) {\n onToggleValue(value)\n }\n }}\n aria-selected={isSelected}\n className={cn(\n 'relative flex w-full cursor-default items-center gap-[8px] py-[2px] px-[8px] min-h-[32px] border-b border-secondary-o20 text-base-medium text-sys-text-main outline-hidden select-none',\n 'data-[disabled=true]:pointer-events-none',\n 'hover:bg-primary10 data-[state=checked]:bg-secondary-o20 data-[state=checked]:hover:bg-secondary-o40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {/* 체크박스 인디케이터 */}\n <span\n className={cn('flex items-center justify-center size-[24px] p-[4px] shrink-0')}\n aria-hidden='true'\n >\n <span\n className={cn(\n 'flex items-center justify-center w-[16px] h-[16px] rounded-xsmall border-[2px]',\n isSelected\n ? 'bg-primary30 border-primary30'\n : 'bg-sys-background border-sys-divider-main',\n disabled && 'opacity-50',\n )}\n >\n {isSelected && (\n <svg\n width='10'\n height='8'\n viewBox='0 0 10 8'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M9.2953 0.828385C9.68583 1.21891 9.68583 1.85207 9.2953 2.2426L4.24923 7.28867C4.24704 7.2909 4.24484 7.29313 4.24262 7.29534C4.04812 7.48985 3.79342 7.58748 3.53848 7.58823C3.28155 7.589 3.02438 7.49137 2.82835 7.29534C2.82614 7.29313 2.82394 7.29092 2.82176 7.28869L0.707088 5.17402C0.316564 4.7835 0.316564 4.15033 0.707088 3.75981C1.09761 3.36928 1.73078 3.36928 2.1213 3.75981L3.53549 5.17399L7.88109 0.828385C8.27161 0.437861 8.90478 0.437861 9.2953 0.828385Z'\n fill='var(--color-sys-background)'\n />\n </svg>\n )}\n </span>\n </span>\n\n {elemBefore && elemBeforeAlign === 'center' && (\n <span className='shrink-0'>{elemBefore}</span>\n )}\n <SelectItemContent\n description={description}\n meta={meta}\n elemBefore={elemBeforeAlign === 'title' ? elemBefore : undefined}\n elemAfter={elemAfter}\n disabled={disabled}\n >\n {children}\n </SelectItemContent>\n </CommandPrimitive.Item>\n )\n },\n)\nMultiSelectItem.displayName = 'MultiSelectItem'\n\nexport { MultiSelectItem }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { Spinner } from '../spinner'\nimport type { MultiSelectLoadingProps } from './types'\n\nconst MultiSelectLoading = React.forwardRef<HTMLDivElement, MultiSelectLoadingProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='multi-select-loading'\n role='status'\n aria-live='polite'\n className={cn(\n 'flex items-center justify-center gap-[8px] py-[12px] text-small-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n <Spinner size='small' variant='secondary' />\n {children || '로드 중'}\n </div>\n )\n },\n)\nMultiSelectLoading.displayName = 'MultiSelectLoading'\n\nexport { MultiSelectLoading }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { MultiSelectSeparatorProps } from './types'\n\nconst MultiSelectSeparator = React.forwardRef<HTMLDivElement, MultiSelectSeparatorProps>(\n ({ className, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='multi-select-separator'\n className={cn('my-[4px] h-px bg-sys-divider-subtler', className)}\n {...props}\n />\n )\n },\n)\nMultiSelectSeparator.displayName = 'MultiSelectSeparator'\n\nexport { MultiSelectSeparator }\n","'use client'\n\nimport * as React from 'react'\n\nimport type { SelectContextValue } from './types'\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null)\n\nexport function useSelectContext() {\n const context = React.useContext(SelectContext)\n if (!context) {\n throw new Error('Select compound components must be used within <Select>')\n }\n return context\n}\n\nexport { SelectContext }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { cva } from 'class-variance-authority'\n\nimport { useFloatingLabel } from '../../hooks/useFloatingLabel'\nimport { cn } from '../../utils/cn'\nimport { FloatingLabelOutline } from '../_internal/floatingLabelOutline'\nimport { useFormControlContext } from '../form'\nimport { useSelectContext } from './selectContext'\nimport type { SelectTriggerProps } from './types'\n\nexport const selectTriggerVariants = cva(\n [\n 'flex w-full items-center gap-[2px] bg-transparent whitespace-nowrap outline-none cursor-pointer',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10 disabled:hover:bg-sys-background',\n 'focus:border-[2px] focus:border-sys-focus-ring-bold focus:py-[2px] focus:px-[4px]',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px] focus:border-danger30',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\nconst SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n (\n {\n className,\n children,\n appearance,\n isInvalid: isInvalidProp,\n label,\n required,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n ...props\n },\n ref,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const { open, disabled, value } = useSelectContext()\n const listboxId = React.useId()\n // role=combobox 는 자식 텍스트로 접근 가능한 이름을 얻지 못한다(axe button-name).\n // label 이 없으면 placeholder/선택값이 든 내용 영역을 aria-labelledby 로 연결한다.\n const contentId = React.useId()\n const [isFocused, setIsFocused] = React.useState(false)\n\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue: !!value,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: disabled || !!props.disabled,\n appearance: appearance ?? 'standard',\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n return (\n <PopoverPrimitive.Trigger asChild>\n <button\n ref={ref}\n type='button'\n role='combobox'\n aria-expanded={open}\n aria-controls={listboxId}\n aria-haspopup='listbox'\n data-listbox-id={listboxId}\n aria-invalid={isInvalid || undefined}\n aria-labelledby={hasLabel ? labelId : contentId}\n aria-required={hasLabel && required ? true : undefined}\n data-slot='select-trigger'\n data-state={open ? 'open' : 'closed'}\n disabled={disabled || props.disabled}\n className={cn(\n selectTriggerVariants({ appearance, isInvalid }),\n '[&_[data-placeholder]]:text-sys-text-placeholder',\n (showNotchedOutline || showNoneLabel) && 'relative',\n // Three-box가 border를 대신 그리므로 버튼 자체 border 제거\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n className,\n )}\n {...props}\n onFocus={hasLabel ? handleFocus : onFocusProp}\n onBlur={hasLabel ? handleBlur : onBlurProp}\n >\n {/* Floating label (standard: notched outline, none: inline label) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={required}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* Content (label 모드에서 값이 없으면 숨김 - label이 placeholder 역할) */}\n <div\n id={contentId}\n className={cn(\n 'flex flex-1 items-center min-h-[28px] min-w-0 px-[4px] py-[2px]',\n hasLabel && !value && 'invisible',\n )}\n >\n {children}\n </div>\n\n {/* Chevron */}\n <svg\n viewBox='0 0 24 24'\n fill='currentColor'\n aria-hidden='true'\n className={cn('size-[24px] shrink-0 transition-transform', open && 'rotate-180')}\n >\n <path d='M7 10l5 5 5-5z' />\n </svg>\n </button>\n </PopoverPrimitive.Trigger>\n )\n },\n)\nSelectTrigger.displayName = 'SelectTrigger'\n\nexport { SelectTrigger }\n","'use client'\n\nimport * as React from 'react'\nimport { Slot, Slottable } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { CancelIcon } from './_internal/cancelIcon'\nimport { cn } from '../utils/cn'\n\nconst tagVariants = cva(\n // whitespace-nowrap: 좁은 칸에서 태그 글자가 줄바꿈되지 않게 (2026-10-19 15차 D1, Badge 와 같은 규칙)\n 'inline-flex items-center whitespace-nowrap py-[4px] text-small-bold gap-[4px] w-fit transition-colors',\n {\n variants: {\n variant: {\n primary: 'bg-primary10 text-primary50',\n primaryBold: 'bg-primary30 text-secondary10',\n secondary: 'bg-secondary-o20 text-sys-text-main',\n secondaryBold: 'bg-secondary60 text-secondary10',\n danger: 'bg-danger10 text-danger50',\n dangerBold: 'bg-danger30 text-secondary10',\n warning: 'bg-warning10 text-warning50',\n warningBold: 'bg-warning30 text-grayscale80',\n success: 'bg-success10 text-success50',\n successBold: 'bg-success30 text-secondary10',\n info: 'bg-info10 text-info50',\n infoBold: 'bg-info30 text-grayscale80',\n etc: 'bg-etc10 text-etc50',\n etcBold: 'bg-etc30 text-secondary10',\n },\n shape: {\n normal: 'rounded-xsmall',\n rounded: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n shape: 'normal',\n },\n },\n)\n\n/** variant → 태그 배경색을 text-* 클래스로 매핑 (CancelIcon의 X 색상용) */\nconst cancelIconXColor: Record<string, string> = {\n primary: 'text-primary10',\n primaryBold: 'text-primary30',\n secondary: 'text-secondary-o20',\n secondaryBold: 'text-secondary60',\n danger: 'text-danger10',\n dangerBold: 'text-danger30',\n warning: 'text-warning10',\n warningBold: 'text-warning30',\n success: 'text-success10',\n successBold: 'text-success30',\n info: 'text-info10',\n infoBold: 'text-info30',\n etc: 'text-etc10',\n etcBold: 'text-etc30',\n}\n\n/**\n * variant → 태그 글자색 (tagVariants 와 같은 값).\n * asChild + onRemove 일 때 링크 밖으로 나간 삭제 버튼이 태그와 같은 색을 이어받도록 바깥 span 에 쓴다.\n */\nconst tagTextColor: Record<string, string> = {\n primary: 'text-primary50',\n primaryBold: 'text-secondary10',\n secondary: 'text-sys-text-main',\n secondaryBold: 'text-secondary10',\n danger: 'text-danger50',\n dangerBold: 'text-secondary10',\n warning: 'text-warning50',\n warningBold: 'text-grayscale80',\n success: 'text-success50',\n successBold: 'text-secondary10',\n info: 'text-info50',\n infoBold: 'text-grayscale80',\n etc: 'text-etc50',\n etcBold: 'text-secondary10',\n}\n\n/** asChild=true일 때 Link hover 배경 (overlay 또는 flat swap) */\nconst linkHoverBg: Record<string, string> = {\n primary: 'hover:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n primaryBold:\n 'hover:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n secondary: 'hover:bg-secondary-o30',\n secondaryBold:\n 'hover:bg-[image:linear-gradient(var(--color-secondary-o30),var(--color-secondary-o30))]',\n danger: 'hover:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n dangerBold: 'hover:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n warning: 'hover:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n warningBold:\n 'hover:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n success: 'hover:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n successBold:\n 'hover:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n info: 'hover:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n infoBold: 'hover:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n etc: 'hover:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n etcBold: 'hover:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n}\n\n/** asChild=true일 때 Link press 배경 (overlay 또는 flat swap) */\nconst linkPressBg: Record<string, string> = {\n primary: 'active:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n primaryBold:\n 'active:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n secondary: 'active:bg-secondary-o50',\n secondaryBold:\n 'active:bg-[image:linear-gradient(var(--color-secondary-o50),var(--color-secondary-o50))]',\n danger: 'active:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n dangerBold: 'active:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n warning: 'active:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n warningBold:\n 'active:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n success: 'active:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n successBold:\n 'active:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n info: 'active:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n infoBold: 'active:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n etc: 'active:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n etcBold: 'active:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n}\n\n/** asChild=true일 때 Link hover 시 CancelIcon X 배경 오버라이드 */\nconst linkHoverXColor: Record<string, string> = {\n primary:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n primaryBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-primary-o30),var(--color-primary-o30))]',\n secondary: 'group-hover/tag:text-secondary-o30',\n secondaryBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-secondary-o30),var(--color-secondary-o30))]',\n danger:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n dangerBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-danger-o30),var(--color-danger-o30))]',\n warning:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n warningBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-warning-o30),var(--color-warning-o30))]',\n success:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n successBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-success-o30),var(--color-success-o30))]',\n info: 'group-hover/tag:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n infoBold:\n 'group-hover/tag:bg-[image:linear-gradient(var(--color-info-o30),var(--color-info-o30))]',\n etc: 'group-hover/tag:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n etcBold: 'group-hover/tag:bg-[image:linear-gradient(var(--color-etc-o30),var(--color-etc-o30))]',\n}\n\n/** asChild=true일 때 Link press 시 CancelIcon X 배경 오버라이드 */\nconst linkPressXColor: Record<string, string> = {\n primary:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n primaryBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-primary-o50),var(--color-primary-o50))]',\n secondary: 'group-active/tag:text-secondary-o50',\n secondaryBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-secondary-o50),var(--color-secondary-o50))]',\n danger:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n dangerBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-danger-o50),var(--color-danger-o50))]',\n warning:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n warningBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-warning-o50),var(--color-warning-o50))]',\n success:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n successBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-success-o50),var(--color-success-o50))]',\n info: 'group-active/tag:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n infoBold:\n 'group-active/tag:bg-[image:linear-gradient(var(--color-info-o50),var(--color-info-o50))]',\n etc: 'group-active/tag:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n etcBold: 'group-active/tag:bg-[image:linear-gradient(var(--color-etc-o50),var(--color-etc-o50))]',\n}\n\nexport interface TagProps\n extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof tagVariants> {\n /** 다른 요소로 렌더링 (예: `<a>` 링크). Radix Slot 패턴 */\n asChild?: boolean\n /** 좌측 아이콘 영역. 16x16 크기로 렌더링됨 */\n elemBefore?: React.ReactNode\n /** 닫기 버튼 콜백. 전달 시 우측에 닫기 아이콘 표시 */\n onRemove?: () => void\n}\n\n/**\n * 붙이고 뗄 수 있는 라벨. 키워드·분류·선택된 항목을 나타낸다.\n *\n * 언제 쓰나: 태그 목록, MultiSelect 가 보여 주는 선택 항목, 필터 조건 칩. 제거가 가능하면 `onRemove`, 링크면 `asChild`.\n * 언제 안 쓰나: 시스템이 정하는 상태 표시(→ Badge), 행동 버튼(→ Button).\n * 대신/함께: `asChild` 와 `onRemove` 를 함께 쓰면 제거 버튼이 링크 밖 형제로 렌더된다(버튼 중첩 금지).\n */\nfunction Tag({\n className,\n variant,\n shape,\n asChild = false,\n elemBefore,\n onRemove,\n children,\n ...props\n}: TagProps) {\n const Comp = asChild ? Slot : 'div'\n const v = variant ?? 'primary'\n // 링크(asChild) 안에 삭제 <button> 을 넣으면 대화형 요소가 중첩되므로, 이 조합에서는\n // 링크와 삭제 버튼을 형제로 두고 바깥 span 이 group/tag 와 위치 기준을 맡는다\n const removeOutside = asChild && !!onRemove\n\n const removeButton = onRemove && (\n <button\n type='button'\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onRemove()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault()\n onRemove()\n }\n }}\n className='absolute right-[4px] top-1/2 -translate-y-1/2 inline-flex items-center justify-center size-[16px] rounded-full focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[-1px] group/remove'\n aria-label='삭제'\n >\n <CancelIcon\n size={14}\n iconClassName={cn(\n cancelIconXColor[v],\n asChild && [linkHoverXColor[v], linkPressXColor[v]],\n 'group-hover/remove:bg-sys-background hover:group-hover/remove:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))]',\n 'group-active/remove:bg-sys-background active:group-active/remove:bg-[image:linear-gradient(var(--color-danger-o20),var(--color-danger-o20))]',\n )}\n />\n </button>\n )\n\n const tag = (\n <Comp\n className={cn(\n tagVariants({ variant, shape }),\n elemBefore ? 'pl-[6px]' : 'pl-[8px]',\n onRemove ? 'pr-[24px]' : 'pr-[8px]',\n onRemove && !removeOutside && 'relative',\n asChild && [\n !removeOutside && 'group/tag',\n 'cursor-pointer hover:underline active:underline',\n 'focus-visible:outline-[2px] focus-visible:outline-sys-focus-ring-main focus-visible:outline-offset-[1px] focus-visible:underline',\n linkHoverBg[v],\n linkPressBg[v],\n ],\n onRemove && 'transition-colors',\n onRemove &&\n !removeOutside && [\n 'has-[button:hover]:bg-sys-background has-[button:hover]:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))] has-[button:hover]:text-danger40',\n 'active:has-[button:active]:bg-sys-background active:has-[button:active]:bg-[image:linear-gradient(var(--color-danger-o20),var(--color-danger-o20))] active:has-[button:active]:text-danger40',\n ],\n removeOutside && [\n 'group-has-[button:hover]/tag:bg-sys-background group-has-[button:hover]/tag:bg-[image:linear-gradient(var(--color-danger-o10),var(--color-danger-o10))] group-has-[button:hover]/tag:text-danger40',\n 'group-has-[button:active]/tag:bg-sys-background group-has-[button:active]/tag:bg-[image:linear-gradient(var(--color-danger-o20),var(--color-danger-o20))] group-has-[button:active]/tag:text-danger40',\n ],\n className,\n )}\n {...props}\n >\n {elemBefore && (\n <span className='shrink-0 inline-flex items-center size-[16px]'>{elemBefore}</span>\n )}\n <Slottable>{children}</Slottable>\n {!removeOutside && removeButton}\n </Comp>\n )\n\n if (removeOutside) {\n return (\n <span\n className={cn(\n 'group/tag relative inline-flex w-fit',\n // 삭제 버튼(currentColor)이 태그 글자색을, 삭제 hover·press 시 danger 색을 따르게 한다\n tagTextColor[v],\n 'has-[button:hover]:text-danger40 has-[button:active]:text-danger40',\n )}\n >\n {tag}\n {removeButton}\n </span>\n )\n }\n\n return tag\n}\n\nexport { Tag, tagVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { useFloatingLabel } from '../../hooks/useFloatingLabel'\nimport { cn } from '../../utils/cn'\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { CancelIcon, CLEAR_HOST_CLASS, CLEAR_REVEAL_CLASS } from '../_internal/cancelIcon'\nimport { FloatingLabelOutline } from '../_internal/floatingLabelOutline'\nimport { useFormControlContext } from '../form'\nimport { selectTriggerVariants } from '../select/selectTrigger'\nimport { Tag } from '../tag'\nimport { useMultiSelectContext } from './multiSelectContext'\nimport type { MultiSelectTriggerProps } from './types'\n\nconst MultiSelectTrigger = React.forwardRef<HTMLDivElement, MultiSelectTriggerProps>(\n (\n {\n className,\n appearance,\n isInvalid: isInvalidProp,\n label,\n required,\n placeholder,\n elemBeforeInput,\n elemAfterInput,\n ...props\n },\n ref,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const {\n open,\n setOpen,\n values,\n disabled,\n labelMap,\n onRemoveValue,\n onClearAll,\n searchTerm,\n setSearchTerm,\n } = useMultiSelectContext()\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n const chevronOpenRef = React.useRef(false)\n const listboxId = React.useId()\n const [isFocused, setIsFocused] = React.useState(false)\n const hasValue = values.length > 0\n\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance: appearance ?? 'standard',\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleContainerClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n // 태그 삭제 버튼이나 clear 버튼 클릭 시에는 popover 열지 않음\n if ((e.target as HTMLElement).closest('button')) return\n inputRef.current?.focus()\n if (!open) setOpen(true)\n },\n [disabled, open, setOpen],\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && searchTerm === '' && values.length > 0) {\n onRemoveValue(values[values.length - 1])\n }\n if (e.key === 'Escape') {\n // 목록만 닫고 포커스는 combobox(입력)에 남긴다 (APG combobox 패턴). blur 하면 포커스가 body 로 떨어진다\n setOpen(false)\n }\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n if (!open) {\n e.preventDefault()\n setOpen(true)\n }\n }\n },\n [searchTerm, values, onRemoveValue, open, setOpen],\n )\n\n const handleContainerKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n // input에서 버블링된 이벤트는 input의 handleKeyDown이 처리하므로 무시\n if (e.target instanceof HTMLInputElement) return\n if (disabled) return\n if (e.key === 'Enter' || e.key === 'ArrowDown') {\n e.preventDefault()\n inputRef.current?.focus()\n if (!open) setOpen(true)\n }\n if (e.key === 'Escape') {\n setOpen(false)\n inputRef.current?.focus()\n }\n },\n [disabled, open, setOpen],\n )\n\n const handleInputChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.target.value)\n if (!open) setOpen(true)\n },\n [setSearchTerm, open, setOpen],\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n if (disabled) {\n e.currentTarget.blur()\n return\n }\n setIsFocused(true)\n },\n [disabled],\n )\n\n const handleBlur = React.useCallback((e: React.FocusEvent<HTMLDivElement>) => {\n // 포커스가 trigger 컨테이너 밖으로 나갈 때만 blur 처리\n if (!e.currentTarget.contains(e.relatedTarget)) {\n setIsFocused(false)\n }\n }, [])\n\n const handleClearAll = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n onClearAll()\n setSearchTerm('')\n inputRef.current?.focus()\n },\n [onClearAll, setSearchTerm],\n )\n\n const handleRemoveTag = React.useCallback(\n (value: string) => {\n onRemoveValue(value)\n inputRef.current?.focus()\n },\n [onRemoveValue],\n )\n\n return (\n <PopoverPrimitive.Anchor asChild>\n <div\n ref={ref}\n role='combobox'\n aria-expanded={open}\n aria-controls={listboxId}\n aria-haspopup='listbox'\n data-listbox-id={listboxId}\n aria-invalid={isInvalid || undefined}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-required={hasLabel && required ? true : undefined}\n data-slot='multi-select-trigger'\n data-state={open ? 'open' : 'closed'}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n className={cn(\n selectTriggerVariants({ appearance, isInvalid }),\n CLEAR_HOST_CLASS,\n 'flex-wrap cursor-text',\n '[&_[data-placeholder]]:text-sys-text-placeholder',\n (showNotchedOutline || showNoneLabel) && 'relative',\n // MultiSelect 가로 패딩: border 포함 4px 유지\n showNotchedOutline\n ? '!border-0 !py-[4px] !px-[4px]'\n : isInvalid\n ? '!px-[2px]'\n : '!px-[3px] focus-within:!px-[2px]',\n !showNotchedOutline &&\n !isInvalid &&\n 'focus-within:border-[2px] focus-within:border-sys-focus-ring-bold focus-within:!py-[2px]',\n disabled && 'cursor-not-allowed opacity-50',\n // disabled 시 hover 배경 무력화 (div라 :disabled 불가 → JS 조건부; none은 원래 hover bg 없음)\n disabled && appearance !== 'none' && 'hover:bg-sys-background',\n className,\n )}\n onClick={handleContainerClick}\n onKeyDown={handleContainerKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...props}\n >\n {/* Floating label */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={required}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* 좌측 아이콘 */}\n {elemBeforeInput && (\n <span className='shrink-0 flex items-center justify-center size-[24px]'>\n {elemBeforeInput}\n </span>\n )}\n\n {/* Tags + 인라인 입력 컨테이너 */}\n <div\n className={cn(\n 'flex flex-1 flex-wrap items-center min-h-[28px] min-w-0 gap-0',\n hasLabel && !hasValue && !isFocused && !open && 'invisible',\n )}\n >\n {/* 선택된 값 태그 */}\n {values.map((val) => {\n const displayText = labelMap.get(val) ?? val\n return (\n <div key={val} className='flex p-[2px]' data-slot='multi-select-tag'>\n <Tag\n variant='primary'\n shape='normal'\n onRemove={disabled ? undefined : () => handleRemoveTag(val)}\n aria-label={disabled ? undefined : `${displayText} 삭제`}\n >\n <span className='whitespace-pre'>{sanitizeUserText(displayText)}</span>\n </Tag>\n </div>\n )\n })}\n\n {/* 인라인 검색 입력 */}\n <div className='flex-1 min-w-[60px] px-[6px]'>\n <input\n ref={inputRef}\n value={searchTerm}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={\n !hasValue && (!hasLabel || isFocused || open) ? placeholder : undefined\n }\n disabled={disabled}\n aria-label={label ?? placeholder ?? '옵션 검색'}\n data-slot='multi-select-input'\n className='visible w-full border-none bg-transparent text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-placeholder disabled:cursor-not-allowed'\n />\n </div>\n </div>\n\n {/* Clear 버튼 (값 또는 검색어가 있을 때, 마우스·포커스 때만 보임) */}\n {(hasValue || searchTerm) && !disabled && (\n <button\n type='button'\n onClick={handleClearAll}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler',\n CLEAR_REVEAL_CLASS,\n )}\n aria-label='전체 삭제'\n tabIndex={-1}\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* 우측 아이콘 */}\n {elemAfterInput && (\n <span className='shrink-0 flex items-center justify-center size-[24px]'>\n {elemAfterInput}\n </span>\n )}\n\n {/* Chevron */}\n <button\n type='button'\n tabIndex={-1}\n onPointerDown={() => {\n // Radix DismissableLayer가 native pointerdown으로 외부 클릭 감지하여\n // click 이벤트 전에 setOpen(false)를 호출함.\n // pointerdown 시점의 open 상태를 ref에 캡처하여 click에서 정확히 toggle.\n chevronOpenRef.current = open\n }}\n onClick={(e) => {\n e.stopPropagation()\n if (disabled) return\n if (chevronOpenRef.current) {\n setOpen(false)\n inputRef.current?.blur()\n } else {\n setOpen(true)\n inputRef.current?.focus()\n }\n }}\n className='shrink-0 flex items-center justify-center'\n aria-label={open ? '닫기' : '열기'}\n >\n <svg\n viewBox='0 0 24 24'\n fill='currentColor'\n aria-hidden='true'\n className={cn('size-[24px] shrink-0 transition-transform', open && 'rotate-180')}\n >\n <path d='M7 10l5 5 5-5z' />\n </svg>\n </button>\n </div>\n </PopoverPrimitive.Anchor>\n )\n },\n)\nMultiSelectTrigger.displayName = 'MultiSelectTrigger'\n\nexport { MultiSelectTrigger }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../../utils/cn'\nimport { SelectContext } from './selectContext'\nimport type { SelectContextValue, SelectProps } from './types'\n\n/**\n * 드롭다운에서 하나를 고르는 폼 입력. 선택지가 정해져 있고 5개 이상일 때 쓴다.\n *\n * 언제 쓰나: 폼 안에서 `FormControl` 아래 `Select` > `SelectTrigger`(label·required) + `SelectContent` > `SelectItem`. 항목이 많으면 `SelectInput` 으로 검색, 비동기 목록은 `SelectLoading`·`SelectEmpty`.\n * 언제 안 쓰나: 선택지 2~4개(→ RadioGroup·RadioSection), 여러 개 선택(→ MultiSelect), 목록 화면 상단 필터(→ TableFilterSingleSelect), 켜고 끄기(→ Switch).\n * 대신/함께: 트리거 라벨은 `SelectItem` 에서 얻는다 — 닫혀 있어도 항목이 이름을 등록하므로 미리 정한 값도 펼치기 전에 이름으로 보인다. 목록에 아직 없는 값(비동기로 오는 항목)만 `useSelectContext().registerLabel` 로 미리 등록한다.\n */\nfunction Select({\n value: controlledValue,\n defaultValue,\n onValueChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n disabled,\n className,\n children,\n}: SelectProps) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState<string | undefined>(defaultValue)\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n\n const isControlledValue = controlledValue !== undefined\n const isControlledOpen = controlledOpen !== undefined\n\n const value = isControlledValue ? controlledValue : uncontrolledValue\n const open = isControlledOpen ? controlledOpen : uncontrolledOpen\n\n const [labelMap, setLabelMap] = React.useState(() => new Map<string, string>())\n\n const registerLabel = React.useCallback((itemValue: string, label: string) => {\n setLabelMap((prev) => {\n if (prev.get(itemValue) === label) return prev\n const next = new Map(prev)\n next.set(itemValue, label)\n return next\n })\n }, [])\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n if (!isControlledValue) {\n setUncontrolledValue(newValue)\n }\n onValueChange?.(newValue)\n },\n [isControlledValue, onValueChange],\n )\n\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n if (!isControlledOpen) {\n setUncontrolledOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlledOpen, onOpenChange],\n )\n\n const contextValue = React.useMemo<SelectContextValue>(\n () => ({\n open,\n setOpen: handleOpenChange,\n value,\n onValueChange: handleValueChange,\n disabled,\n labelMap,\n registerLabel,\n }),\n [open, handleOpenChange, value, handleValueChange, disabled, labelMap, registerLabel],\n )\n\n return (\n <SelectContext.Provider value={contextValue}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange} modal>\n <div data-slot='select' className={cn('relative', className)}>\n {children}\n </div>\n </PopoverPrimitive.Root>\n </SelectContext.Provider>\n )\n}\n\nexport { Select }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { LabelPass } from '../_internal/labelPass'\nimport { useSelectContext } from './selectContext'\nimport type { SelectContentProps } from './types'\n\nconst SelectContent = React.forwardRef<HTMLDivElement, SelectContentProps>(\n ({ className, children, align = 'start', sideOffset = 4, ...props }, ref) => {\n const { open } = useSelectContext()\n const [search, setSearch] = React.useState('')\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // 닫힐 때 검색 리셋\n const prevOpen = React.useRef(open)\n React.useEffect(() => {\n if (prevOpen.current && !open) {\n setSearch('')\n }\n prevOpen.current = open\n }, [open])\n\n // 열릴 때 선택된 항목으로 스크롤\n React.useEffect(() => {\n if (open) {\n requestAnimationFrame(() => {\n const checkedItem = listRef.current?.querySelector('[data-state=checked]')\n checkedItem?.scrollIntoView({ block: 'nearest' })\n })\n }\n }, [open])\n\n return (\n <>\n {/* 닫혀 있는 동안 항목이 이름만 등록해 트리거가 펼치기 전에도 원값 대신 이름을 보인다 (2026-10-30 홀드아웃 17) */}\n {open ? null : <LabelPass>{children}</LabelPass>}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n data-slot='select-content'\n // Radix Popover 콘텐츠는 role=dialog 라 이름이 필요하다(axe aria-dialog-name). 호출부 aria-label 이 있으면 {...props} 가 덮는다\n aria-label='옵션 목록'\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-[var(--root-z-index)] min-w-[var(--radix-popover-trigger-width)] origin-(--radix-popover-content-transform-origin) overflow-hidden rounded-small shadow-gray-medium bg-sys-background border border-sys-divider-subtler',\n 'data-[state=open]:animate-[fade-in_150ms_ease-out,zoom-in_150ms_ease-out]',\n 'data-[state=closed]:animate-[fade-out_150ms_ease-in,zoom-out_150ms_ease-in]',\n 'data-[side=top]:animate-[slide-in-bottom_150ms_ease-out]',\n 'data-[side=bottom]:animate-[slide-in-top_150ms_ease-out]',\n className,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n {...props}\n >\n <CommandPrimitive\n filter={(_value, search, keywords) => {\n const lowerSearch = search.toLowerCase()\n if (keywords?.some((kw) => kw.toLowerCase().includes(lowerSearch))) return 1\n return 0\n }}\n value=''\n onValueChange={() => {}}\n >\n <SelectSearchContext.Provider value={{ search, setSearch }}>\n {(() => {\n const inputChildren: React.ReactNode[] = []\n const restChildren: React.ReactNode[] = []\n\n React.Children.forEach(children, (child) => {\n if (\n React.isValidElement(child) &&\n (child.type as any)?.displayName === 'SelectInput'\n ) {\n inputChildren.push(child)\n } else {\n restChildren.push(child)\n }\n })\n\n return (\n <>\n {inputChildren}\n <CommandPrimitive.List\n ref={listRef}\n className='max-h-[300px] overflow-y-auto overflow-x-hidden scroll-py-1'\n >\n {restChildren}\n </CommandPrimitive.List>\n </>\n )\n })()}\n </SelectSearchContext.Provider>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </>\n )\n },\n)\nSelectContent.displayName = 'SelectContent'\n\n// 검색 컨텍스트 (SelectInput, SelectEmpty에서 사용)\ninterface SelectSearchContextValue {\n search: string\n setSearch: (value: string) => void\n}\nconst SelectSearchContext = React.createContext<SelectSearchContextValue>({\n search: '',\n setSearch: () => {},\n})\n\nexport function useSelectSearch() {\n return React.useContext(SelectSearchContext)\n}\n\nexport { SelectContent, SelectSearchContext }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Info } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport message from '../../utils/message'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { Stack } from '../stack'\nimport type { SelectEmptyProps } from './types'\n\nconst SelectEmpty = React.forwardRef<HTMLDivElement, SelectEmptyProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <CommandPrimitive.Empty\n ref={ref}\n data-slot='select-empty'\n aria-live='polite'\n className={cn('py-[8px] text-small-medium text-sys-text-subtlest text-center', className)}\n {...props}\n >\n <Stack justifyContent='center' alignItems='center' spacing={6}>\n <Info size={16} className='text-sys-text-subtlest shrink-0' />\n {children || message.common.notice_search_result_empty}\n </Stack>\n </CommandPrimitive.Empty>\n )\n },\n)\nSelectEmpty.displayName = 'SelectEmpty'\n\nexport { SelectEmpty }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { SelectGroupProps } from './types'\n\nconst SelectGroup = React.forwardRef<HTMLDivElement, SelectGroupProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 묶음 안 항목만 등록되게 children 만\n if (labelPass) return <>{children}</>\n return (\n <CommandPrimitive.Group\n ref={ref}\n data-slot='select-group'\n className={cn(\n '[&_[cmdk-group-heading]]:sticky [&_[cmdk-group-heading]]:top-0 [&_[cmdk-group-heading]]:z-10 [&_[cmdk-group-heading]]:bg-secondary-o10 [&_[cmdk-group-heading]]:backdrop-blur-[16px] [&_[cmdk-group-heading]]:px-[8px] [&_[cmdk-group-heading]]:py-[4px] [&_[cmdk-group-heading]]:text-small-medium [&_[cmdk-group-heading]]:text-sys-text-subtle',\n className,\n )}\n {...props}\n >\n {children}\n </CommandPrimitive.Group>\n )\n },\n)\nSelectGroup.displayName = 'SelectGroup'\n\nexport { SelectGroup }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { CancelIcon } from '../_internal/cancelIcon'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useSelectSearch } from './selectContent'\nimport type { SelectInputProps } from './types'\n\nconst SelectInput = React.forwardRef<HTMLInputElement, SelectInputProps>(\n ({ className, onChange, ...props }, ref) => {\n const { search, setSearch } = useSelectSearch()\n\n const handleChange = (value: string) => {\n setSearch(value)\n onChange?.(value)\n }\n\n const handleClear = () => {\n setSearch('')\n onChange?.('')\n }\n\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div className='flex items-center border-b border-b-sys-divider-subtle px-[6px] py-[4px] gap-[4px]'>\n <Search className='shrink-0 size-[16px] text-sys-text-subtler' aria-hidden='true' />\n <div className='flex flex-1 items-center h-[28px] min-w-0 px-[4px] py-[2px]'>\n <CommandPrimitive.Input\n ref={ref}\n value={search}\n onValueChange={handleChange}\n aria-label='옵션 검색'\n className={cn(\n 'flex w-full border-none bg-transparent text-base-medium text-sys-text-main outline-none placeholder:text-sys-text-placeholder disabled:cursor-not-allowed disabled:text-sys-text-disabled',\n className,\n )}\n {...props}\n />\n </div>\n {search && (\n <button\n type='button'\n onClick={handleClear}\n className='flex items-center justify-center shrink-0 p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler'\n aria-label='검색어 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n </div>\n )\n },\n)\nSelectInput.displayName = 'SelectInput'\n\nexport { SelectInput }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useSelectContext } from './selectContext'\nimport { SelectItemContent } from './selectItemContent'\nimport type { SelectItemProps } from './types'\n\nconst SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(\n (\n {\n className,\n children,\n value,\n disabled,\n description,\n textValue,\n meta,\n elemBefore,\n elemBeforeAlign = 'center',\n elemAfter,\n ...props\n },\n ref,\n ) => {\n const { value: selectedValue, onValueChange, setOpen, registerLabel } = useSelectContext()\n const labelPass = useLabelPass()\n const isSelected = selectedValue === value\n\n // children에서 텍스트 추출 (textValue가 없는 경우)\n const resolvedTextValue = textValue ?? (typeof children === 'string' ? children : value)\n\n // trigger 표시용 라벨 등록\n React.useEffect(() => {\n registerLabel(value, resolvedTextValue)\n }, [value, resolvedTextValue, registerLabel])\n\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 등록만 하고 그리지 않는다\n if (labelPass) return null\n\n return (\n <CommandPrimitive.Item\n ref={ref}\n data-slot='select-item'\n data-state={isSelected ? 'checked' : 'unchecked'}\n value={value}\n keywords={[resolvedTextValue]}\n disabled={disabled}\n onSelect={() => {\n if (!disabled) {\n onValueChange(value)\n setOpen(false)\n }\n }}\n className={cn(\n 'relative flex w-full cursor-default items-center gap-[8px] py-[2px] px-[8px] min-h-[32px] border-b border-secondary-o20 text-base-medium text-sys-text-main outline-hidden select-none',\n 'data-[disabled=true]:pointer-events-none',\n 'hover:bg-primary10 data-[state=checked]:bg-secondary-o20 data-[state=checked]:hover:bg-secondary-o40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {elemBefore && elemBeforeAlign === 'center' && (\n <span className='shrink-0'>{elemBefore}</span>\n )}\n <SelectItemContent\n description={description}\n meta={meta}\n elemBefore={elemBeforeAlign === 'title' ? elemBefore : undefined}\n elemAfter={elemAfter}\n disabled={disabled}\n >\n {children}\n </SelectItemContent>\n </CommandPrimitive.Item>\n )\n },\n)\nSelectItem.displayName = 'SelectItem'\n\nexport { SelectItem }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { Spinner } from '../spinner'\nimport type { SelectLoadingProps } from './types'\n\nconst SelectLoading = React.forwardRef<HTMLDivElement, SelectLoadingProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='select-loading'\n role='status'\n aria-live='polite'\n className={cn(\n 'flex items-center justify-center gap-[8px] py-[12px] text-small-medium text-sys-text-subtler',\n className,\n )}\n {...props}\n >\n <Spinner size='small' variant='secondary' />\n {children || '로드 중'}\n </div>\n )\n },\n)\nSelectLoading.displayName = 'SelectLoading'\n\nexport { SelectLoading }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\n\ninterface SelectRadioGroupProps extends React.ComponentPropsWithoutRef<\n typeof CommandPrimitive.Group\n> {\n children: React.ReactNode\n}\n\nconst SelectRadioGroup = React.forwardRef<HTMLDivElement, SelectRadioGroupProps>(\n ({ className, children, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 묶음 안 항목만 등록되게 children 만\n if (labelPass) return <>{children}</>\n return (\n <CommandPrimitive.Group\n ref={ref}\n role='radiogroup'\n data-slot='select-radio-group'\n className={cn('flex flex-col', className)}\n {...props}\n >\n {children}\n </CommandPrimitive.Group>\n )\n },\n)\nSelectRadioGroup.displayName = 'SelectRadioGroup'\n\nexport { SelectRadioGroup }\n","'use client'\n\nimport * as React from 'react'\nimport { Command as CommandPrimitive } from 'cmdk'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport { useSelectContext } from './selectContext'\nimport { SelectItemContent } from './selectItemContent'\nimport type { SelectRadioItemProps } from './types'\n\nconst SelectRadioItem = React.forwardRef<HTMLDivElement, SelectRadioItemProps>(\n (\n {\n className,\n children,\n value,\n disabled,\n description,\n textValue,\n meta,\n elemBefore,\n elemBeforeAlign = 'center',\n elemAfter,\n ...props\n },\n ref,\n ) => {\n const { value: selectedValue, onValueChange, setOpen, registerLabel } = useSelectContext()\n const labelPass = useLabelPass()\n const isSelected = selectedValue === value\n\n const resolvedTextValue = textValue ?? (typeof children === 'string' ? children : value)\n\n React.useEffect(() => {\n registerLabel(value, resolvedTextValue)\n }, [value, resolvedTextValue, registerLabel])\n\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 등록만 하고 그리지 않는다\n if (labelPass) return null\n\n return (\n <CommandPrimitive.Item\n ref={ref}\n data-slot='select-item'\n data-state={isSelected ? 'checked' : 'unchecked'}\n value={value}\n keywords={[resolvedTextValue]}\n disabled={disabled}\n onSelect={() => {\n if (!disabled) {\n onValueChange(value)\n setOpen(false)\n }\n }}\n className={cn(\n 'group relative flex w-full cursor-default items-center gap-[8px] py-[2px] px-[8px] min-h-[32px] border-b border-secondary-o20 text-base-medium text-sys-text-main outline-hidden select-none',\n 'data-[disabled=true]:pointer-events-none',\n 'hover:bg-primary10 data-[state=checked]:bg-secondary-o20 data-[state=checked]:hover:bg-secondary-o40',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n className,\n )}\n {...props}\n >\n {/* CSS-only 라디오 인디케이터 */}\n <div className='shrink-0 size-[24px] p-[4px] flex items-center justify-center'>\n <div\n className={cn(\n 'border-[2px] border-sys-divider-main w-full h-full rounded-full',\n 'group-data-[state=checked]:bg-primary30 group-data-[state=checked]:border-none',\n 'flex items-center justify-center',\n disabled && 'border-secondary-o10 bg-secondary-o20',\n )}\n >\n <div\n className={cn(\n 'hidden group-data-[state=checked]:block',\n 'w-[6px] h-[6px] rounded-full bg-sys-background',\n )}\n />\n </div>\n </div>\n {elemBefore && elemBeforeAlign === 'center' && (\n <span className='shrink-0'>{elemBefore}</span>\n )}\n <SelectItemContent\n description={description}\n meta={meta}\n elemBefore={elemBeforeAlign === 'title' ? elemBefore : undefined}\n elemAfter={elemAfter}\n disabled={disabled}\n >\n {children}\n </SelectItemContent>\n </CommandPrimitive.Item>\n )\n },\n)\nSelectRadioItem.displayName = 'SelectRadioItem'\n\nexport { SelectRadioItem }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { useLabelPass } from '../_internal/labelPass'\nimport type { SelectSeparatorProps } from './types'\n\nconst SelectSeparator = React.forwardRef<HTMLDivElement, SelectSeparatorProps>(\n ({ className, ...props }, ref) => {\n const labelPass = useLabelPass()\n // 닫힌 목록의 라벨 등록 모드(LabelPass)에서는 그리지 않는다\n if (labelPass) return null\n return (\n <div\n ref={ref}\n data-slot='select-separator'\n className={cn('my-[4px] h-px bg-sys-divider-subtler', className)}\n {...props}\n />\n )\n },\n)\nSelectSeparator.displayName = 'SelectSeparator'\n\nexport { SelectSeparator }\n","'use client'\n\nimport * as React from 'react'\n\nimport { sanitizeUserText } from '../../utils/sanitizeUserText'\nimport { useSelectContext } from './selectContext'\nimport type { SelectValueProps } from './types'\n\nfunction SelectValue({ placeholder }: SelectValueProps) {\n const { value, labelMap } = useSelectContext()\n\n // 라벨이 등록되어 있으면 라벨 표시, 없으면 value 자체를 폴백으로 표시\n const displayText = value ? (labelMap.get(value) ?? value) : undefined\n\n if (!value) {\n return (\n <span data-slot='select-value' data-placeholder='' className='truncate whitespace-pre'>\n {sanitizeUserText(placeholder)}\n </span>\n )\n }\n\n return (\n <span data-slot='select-value' className='truncate whitespace-pre'>\n {sanitizeUserText(displayText)}\n </span>\n )\n}\n\nexport { SelectValue }\n","'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { ChevronDown, PanelLeft } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { IconButton } from '../iconButton'\nimport { LucideIcon } from '../lucideIcon'\nimport { Separator } from '../separator'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../tooltip'\n\n/* --------------------------------- Context -------------------------------- */\n\ntype SidebarContextType = {\n isOpen: boolean\n toggle: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextType | undefined>(undefined)\n\ntype SidebarProviderProps = {\n children: React.ReactNode\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nfunction SidebarProvider({\n children,\n defaultOpen = true,\n open: controlledOpen,\n onOpenChange,\n}: SidebarProviderProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n\n const isOpen = controlledOpen ?? uncontrolledOpen\n\n const toggle = React.useCallback(() => {\n const newState = !isOpen\n if (onOpenChange) {\n onOpenChange(newState)\n } else {\n setUncontrolledOpen(newState)\n }\n }, [isOpen, onOpenChange])\n\n return <SidebarContext.Provider value={{ isOpen, toggle }}>{children}</SidebarContext.Provider>\n}\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within SidebarProvider')\n }\n return context\n}\n\n/* --------------------------------- Sidebar -------------------------------- */\n\ntype SidebarProps = React.HTMLAttributes<HTMLElement> & {\n top?: number\n openWidth?: number\n closedWidth?: number\n}\n\nconst Sidebar = React.forwardRef<HTMLElement, SidebarProps>(\n ({ className, top = 0, openWidth = 240, closedWidth = 72, style, children, ...props }, ref) => {\n const { isOpen } = useSidebar()\n\n return (\n <aside\n ref={ref}\n className={cn(\n 'fixed left-0 z-[500]',\n 'bg-sys-background',\n 'flex flex-col overflow-y-auto',\n 'transition-all duration-200 ease-in-out',\n className,\n )}\n style={{\n top,\n height: `calc(100vh - ${top}px)`,\n width: isOpen ? openWidth : closedWidth,\n boxShadow: '1px 0 0 0 var(--color-sys-divider-subtler)',\n ...style,\n }}\n {...props}\n >\n {children}\n </aside>\n )\n },\n)\nSidebar.displayName = 'Sidebar'\n\n/* ------------------------------ SidebarHeader ----------------------------- */\n\ntype SidebarHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n avatar?: string\n avatarColor?: string\n title?: string\n description?: string\n openLabel?: string\n closeLabel?: string\n}\n\nconst SidebarHeader = React.forwardRef<HTMLDivElement, SidebarHeaderProps>(\n (\n {\n className,\n avatar,\n avatarColor,\n title,\n description,\n openLabel = '사이드바 열기',\n closeLabel = '사이드바 접기',\n children,\n ...props\n },\n ref,\n ) => {\n const { isOpen, toggle } = useSidebar()\n const [isHovered, setIsHovered] = React.useState(false)\n const [isFullyCollapsed, setIsFullyCollapsed] = React.useState(!isOpen)\n\n // 전환 애니메이션(200ms) 완료 후에만 호버 효과 허용\n React.useEffect(() => {\n if (!isOpen) {\n const timer = setTimeout(() => setIsFullyCollapsed(true), 200)\n return () => clearTimeout(timer)\n } else {\n setIsFullyCollapsed(false)\n }\n }, [isOpen])\n\n // children이 있으면 커스텀 렌더링\n if (children) {\n return (\n <div\n ref={ref}\n className={cn(\n 'sticky top-0 z-10',\n 'h-[72px] py-[16px] pl-[18px] pr-[16px]',\n 'flex items-center gap-[16px]',\n 'bg-secondary-o10-blur backdrop-blur-md border-b border-sys-divider-subtler',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'sticky top-0 z-10',\n 'h-[72px] py-[16px] pl-[18px] pr-[16px]',\n 'flex items-center gap-[16px]',\n 'bg-secondary-o10-blur backdrop-blur-md border-b border-sys-divider-subtler',\n !isOpen && 'cursor-pointer',\n className,\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={!isOpen ? toggle : undefined}\n role={!isOpen ? 'button' : undefined}\n aria-label={!isOpen ? openLabel : undefined}\n tabIndex={!isOpen ? 0 : undefined}\n onKeyDown={\n !isOpen\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle()\n }\n }\n : undefined\n }\n {...props}\n >\n {/* Avatar */}\n {avatar && (\n <div className='shrink-0 flex items-center justify-center size-[36px]'>\n {isFullyCollapsed && isHovered ? (\n <PanelLeft size={20} className='text-sys-text-subtle' />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'size-[36px] rounded-full',\n 'border border-sys-divider-subtler',\n 'text-h6',\n )}\n style={{\n backgroundColor: avatarColor || 'var(--color-secondary20)',\n color: 'var(--color-sys-text-normal)',\n }}\n >\n {avatar}\n </div>\n )}\n </div>\n )}\n\n {/* Title & Description */}\n {(title || description) && (\n <div\n className={cn(\n 'flex flex-col justify-center flex-1 min-w-0',\n 'transition-all duration-200',\n isOpen ? 'opacity-100 delay-150' : 'opacity-0 delay-0',\n isHovered && isOpen && 'pr-[20px]',\n )}\n >\n {title && <p className='text-h6 text-sys-text-main truncate'>{title}</p>}\n {description && (\n <p className='text-small-regular text-sys-text-subtle truncate'>{description}</p>\n )}\n </div>\n )}\n\n {/* 펼친 상태: 호버 시 토글 버튼 페이드인 */}\n {isOpen && (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n variant='secondaryLink'\n shape='normal'\n spacing='compact'\n onClick={(e) => {\n e.stopPropagation()\n toggle()\n }}\n className={cn(\n 'absolute right-[8px] top-1/2 -translate-y-1/2',\n 'transition-opacity duration-150',\n isHovered ? 'opacity-100' : 'opacity-0',\n )}\n aria-label={closeLabel}\n >\n <PanelLeft size={20} />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent side='right'>{closeLabel}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )\n },\n)\nSidebarHeader.displayName = 'SidebarHeader'\n\n/* ------------------------------ SidebarToggle ----------------------------- */\n/* Header 없는 경우의 standalone toggle */\n\ntype SidebarToggleProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\n openLabel?: string\n closeLabel?: string\n}\n\nconst SidebarToggle = React.forwardRef<HTMLDivElement, SidebarToggleProps>(\n ({ className, openLabel = '사이드바 열기', closeLabel = '사이드바 접기', ...props }, ref) => {\n const { isOpen, toggle } = useSidebar()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'h-[40px] flex items-center',\n isOpen ? 'justify-end px-[8px]' : 'justify-center',\n className,\n )}\n {...props}\n >\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>\n <IconButton\n variant='secondaryLink'\n shape='normal'\n spacing='compact'\n className='opacity-50 hover:opacity-100 transition-opacity duration-150'\n onClick={toggle}\n aria-label={isOpen ? closeLabel : openLabel}\n >\n <PanelLeft size={20} />\n </IconButton>\n </TooltipTrigger>\n <TooltipContent side='right'>{isOpen ? closeLabel : openLabel}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n )\n },\n)\nSidebarToggle.displayName = 'SidebarToggle'\n\n/* ----------------------------- SidebarContent ----------------------------- */\n\nconst SidebarContent = React.forwardRef<HTMLElement, React.HTMLAttributes<HTMLElement>>(\n ({ className, ...props }, ref) => (\n <nav ref={ref} className={cn('flex-1 overflow-x-clip', className)} {...props} />\n ),\n)\nSidebarContent.displayName = 'SidebarContent'\n\n/* ----------------------------- SidebarSection ----------------------------- */\n\ntype SidebarSectionProps = React.HTMLAttributes<HTMLDivElement> & {\n title?: string\n collapsible?: boolean\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nconst SidebarSection = React.forwardRef<HTMLDivElement, SidebarSectionProps>(\n (\n {\n className,\n title,\n collapsible = false,\n defaultOpen = true,\n open: controlledOpen,\n onOpenChange,\n children,\n ...props\n },\n ref,\n ) => {\n const { isOpen: sidebarOpen } = useSidebar()\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n\n const isExpanded = controlledOpen ?? uncontrolledOpen\n\n const toggleExpanded = React.useCallback(() => {\n const next = !isExpanded\n if (onOpenChange) {\n onOpenChange(next)\n } else {\n setUncontrolledOpen(next)\n }\n }, [isExpanded, onOpenChange])\n\n // 사이드바 접힘 시 또는 collapsible 아닐 때 → 항상 열림\n const showChildren = !collapsible || !sidebarOpen || isExpanded\n\n return (\n <div ref={ref} className={cn('', className)} {...props}>\n {title && (\n <div\n className={cn(\n 'h-[40px] px-[16px] py-[12px] flex items-center gap-[12px]',\n collapsible &&\n sidebarOpen &&\n 'cursor-pointer hover:bg-sys-button-secondary-subtle-background-hover',\n )}\n role={collapsible && sidebarOpen ? 'button' : undefined}\n tabIndex={collapsible && sidebarOpen ? 0 : undefined}\n onClick={collapsible && sidebarOpen ? toggleExpanded : undefined}\n onKeyDown={\n collapsible && sidebarOpen\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggleExpanded()\n }\n }\n : undefined\n }\n >\n {sidebarOpen && (\n <span className='text-small-bold text-sys-text-subtler whitespace-nowrap'>\n {title}\n </span>\n )}\n <Separator className='flex-1' />\n {collapsible && sidebarOpen && (\n <ChevronDown\n size={14}\n className={cn(\n 'text-sys-text-subtler shrink-0 transition-transform duration-200',\n isExpanded && 'rotate-180',\n )}\n />\n )}\n </div>\n )}\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out',\n showChildren ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <ul className='flex flex-col overflow-hidden'>{children}</ul>\n </div>\n </div>\n )\n },\n)\nSidebarSection.displayName = 'SidebarSection'\n\n/* ----------------------------- SidebarMenuItem ---------------------------- */\n\ntype SidebarMenuItemProps = React.HTMLAttributes<HTMLLIElement> & {\n icon?: string\n label: string\n isActive?: boolean\n asChild?: boolean\n}\n\nconst SidebarMenuItem = React.forwardRef<HTMLLIElement, SidebarMenuItemProps>(\n ({ className, icon, label, isActive = false, asChild = false, children, ...props }, ref) => {\n const { isOpen } = useSidebar()\n\n const buttonContent = (\n <span\n className={cn(\n 'flex items-center gap-[16px] w-full',\n 'pl-[21px] pr-[6px] py-[6px]',\n 'transition-all duration-200',\n // Active state\n isActive && [\n 'bg-sys-button-primary-subtle-background',\n 'border-l-[4px] border-primary30',\n 'hover:bg-sys-button-primary-subtle-background-hover',\n 'active:bg-sys-button-primary-subtle-background-press',\n ],\n // Inactive state\n !isActive && [\n 'border-l-[4px] border-transparent',\n 'hover:bg-sys-button-secondary-subtle-background-hover',\n 'active:bg-sys-button-secondary-subtle-background-press',\n ],\n )}\n >\n {/* Icon */}\n {icon && (\n <span className='shrink-0'>\n <LucideIcon\n iconComponentName={icon}\n size={20}\n className={cn(isActive ? 'text-primary40' : 'text-sys-text-subtle')}\n />\n </span>\n )}\n\n {/* Label */}\n <span\n className={cn(\n 'flex-1 text-left whitespace-nowrap overflow-hidden',\n 'transition-opacity duration-200',\n isOpen ? 'opacity-100 delay-150' : 'opacity-0 delay-0',\n isActive ? 'text-h6 text-primary40' : 'text-base-semibold text-sys-text-subtle',\n )}\n >\n {label}\n </span>\n </span>\n )\n\n const Comp = asChild ? Slot : 'div'\n\n const content = (\n <Comp className='flex items-center w-full cursor-pointer'>\n {asChild\n ? React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n children: buttonContent,\n })\n : children\n : buttonContent}\n </Comp>\n )\n\n return (\n <li ref={ref} className={cn('', className)} {...props}>\n {!isOpen ? (\n <TooltipProvider delayDuration={300}>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent side='right'>{label}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n content\n )}\n </li>\n )\n },\n)\nSidebarMenuItem.displayName = 'SidebarMenuItem'\n\n/* ------------------------------ SidebarFooter ----------------------------- */\n\nconst SidebarFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const { isOpen } = useSidebar()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'sticky bottom-0 z-10 mt-auto',\n 'bg-sys-background-blur backdrop-blur-md',\n 'transition-opacity duration-200',\n isOpen ? 'opacity-100 delay-150' : 'opacity-0 delay-0',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarFooter.displayName = 'SidebarFooter'\n\nexport {\n Sidebar,\n SidebarProvider,\n useSidebar,\n SidebarHeader,\n SidebarToggle,\n SidebarContent,\n SidebarSection,\n SidebarMenuItem,\n SidebarFooter,\n}\n","'use client'\n\nimport * as React from 'react'\n\nexport interface RangeBounds {\n min: number\n max: number\n step: number\n}\n\n/** step의 소수 자릿수 — 부동소수 잔차(0.1+0.2 등) 보정에 사용 */\nexport function getDecimals(step: number): number {\n if (!Number.isFinite(step)) return 0\n const s = String(step)\n const dot = s.indexOf('.')\n return dot === -1 ? 0 : s.length - dot - 1\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\n/** step 격자에 스냅(min 기준 반올림). step<=0이면 스냅하지 않음(continuous) */\nexport function snap(value: number, min: number, step: number): number {\n if (!(step > 0)) return value\n const steps = Math.round((value - min) / step)\n return min + steps * step\n}\n\n/** 부동소수 잔차 제거 */\nexport function fixPrecision(value: number, step: number): number {\n const d = getDecimals(step)\n return d > 0 ? Number(value.toFixed(d)) : value\n}\n\n/** clamp → snap → 정밀도 보정 → 다시 clamp(스냅이 max를 넘길 수 있어 재clamp) */\nexport function normalize(value: number, { min, max, step }: RangeBounds): number {\n const snapped = snap(clamp(value, min, max), min, step)\n return clamp(fixPrecision(snapped, step), min, max)\n}\n\nexport interface UseRangeValueOptions extends RangeBounds {\n /** controlled 값 */\n value?: number\n /** uncontrolled 초기값 */\n defaultValue?: number\n onValueChange?: (value: number) => void\n}\n\nexport interface UseRangeValueReturn {\n value: number\n setValue: (next: number) => void\n increment: () => void\n decrement: () => void\n canIncrement: boolean\n canDecrement: boolean\n}\n\n/**\n * Range 합성 컴포넌트용 단일값 상태 훅.\n * controlled/uncontrolled를 모두 지원하며, 커밋 시 항상 clamp/snap/정밀도 보정을 적용한다.\n */\nexport function useRangeValue({\n value,\n defaultValue,\n min,\n max,\n step,\n onValueChange,\n}: UseRangeValueOptions): UseRangeValueReturn {\n const bounds = React.useMemo<RangeBounds>(() => ({ min, max, step }), [min, max, step])\n const isControlled = value !== undefined\n\n const [internal, setInternal] = React.useState<number>(() =>\n normalize(defaultValue ?? min, { min, max, step }),\n )\n\n const current = isControlled ? normalize(value as number, bounds) : internal\n\n const setValue = React.useCallback(\n (next: number) => {\n const normalized = normalize(next, bounds)\n if (!isControlled) setInternal(normalized)\n if (normalized !== current) onValueChange?.(normalized)\n },\n [bounds, isControlled, onValueChange, current],\n )\n\n const increment = React.useCallback(() => setValue(current + step), [setValue, current, step])\n const decrement = React.useCallback(() => setValue(current - step), [setValue, current, step])\n\n return {\n value: current,\n setValue,\n increment,\n decrement,\n canIncrement: current < max,\n canDecrement: current > min,\n }\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../../utils/cn'\nimport { getDecimals } from './useRangeValue'\n\n/**\n * 눈금/라벨 위치 지정.\n * - 숫자 `25` → 그 값 위치에 dot + 숫자 라벨 \"25\"\n * - `{ value, label }` → dot + 커스텀 라벨(ReactNode)\n * - `{ value }`(label 생략) → dot만(discrete) / 아무것도 안 그림(continuous)\n */\nexport type RangeMark = number | { value: number; label?: React.ReactNode }\n\ninterface Tick {\n value: number\n label: React.ReactNode | null\n}\n\nexport interface TicksProps {\n min: number\n max: number\n step: number\n /** 채움 판정 기준값 — 단일값 `[v]` 또는 범위 `[lo, hi]` */\n value: number[]\n /** dot 표시 여부(discrete=true, continuous=false) */\n showDots?: boolean\n disabled?: boolean\n showLabels?: boolean\n /** 라벨 표시 간격(인덱스 기준, marks 미지정 시). 기본 2 = 짝수 인덱스 + 양끝 */\n labelEvery?: number\n /** 명시적 눈금/라벨 위치. 지정 시 step 기반 기본 눈금을 대체 */\n marks?: RangeMark[]\n}\n\nfunction formatLabel(value: number, step: number): string {\n const d = getDecimals(step)\n return d > 0 ? value.toFixed(d) : String(value)\n}\n\n/** 렌더할 눈금 목록 산출: marks 우선 → continuous 양끝 → discrete step 그리드 */\nfunction buildTicks({\n min,\n max,\n step,\n showDots,\n labelEvery,\n marks,\n}: {\n min: number\n max: number\n step: number\n showDots: boolean\n labelEvery: number\n marks?: RangeMark[]\n}): Tick[] {\n // 1) 명시 marks 우선 — step 기반 기본 눈금을 대체\n if (marks !== undefined) {\n return marks\n .map(\n (m): Tick =>\n typeof m === 'number'\n ? { value: m, label: formatLabel(m, step) }\n : { value: m.value, label: m.label ?? null },\n )\n .filter((t) => t.value >= min && t.value <= max)\n }\n // 2) continuous 기본 — 양끝(min/max) 라벨만\n if (!showDots) {\n return [\n { value: min, label: formatLabel(min, step) },\n { value: max, label: formatLabel(max, step) },\n ]\n }\n // 3) discrete 기본 — step 그리드(짝수 인덱스 + 양끝 라벨)\n const n = step > 0 ? Math.round((max - min) / step) : 0\n if (!Number.isFinite(n) || n <= 0) return []\n return Array.from({ length: n + 1 }, (_, i): Tick => {\n const v = min + i * step\n const labeled = i % labelEvery === 0 || i === 0 || i === n\n return { value: v, label: labeled ? formatLabel(v, step) : null }\n })\n}\n\n/**\n * 슬라이더 눈금/라벨 오버레이. discrete는 dot+라벨, continuous는 라벨만(dot은 invisible 스페이서로 라벨 위치만 맞춤).\n * 각 눈금을 thumb와 동일 좌표(좌우 8px=thumb 절반 inset + `left:f*100%` + -translate-x-1/2)에\n * 절대배치해, thumb를 그 값으로 옮기면 눈금/숫자와 정확히 가운데 정렬된다.\n * `marks`로 위치를 명시하면 step 기반 기본 눈금을 대체한다(불균등 위치도 동일 좌표계로 정렬).\n */\nexport function Ticks({\n min,\n max,\n step,\n value,\n showDots = true,\n disabled = false,\n showLabels = true,\n labelEvery = 2,\n marks,\n}: TicksProps) {\n const ticks = buildTicks({ min, max, step, showDots, labelEvery, marks })\n if (ticks.length === 0) return null\n\n const span = max - min\n const single = value.length < 2\n const lo = single ? min : Math.min(value[0], value[1])\n const hi = single ? (value[0] ?? min) : Math.max(value[0], value[1])\n // 단일값: thumb(=hi) 왼쪽 dot이 채워짐(thumb 위치 dot은 빈 상태). 범위: 두 thumb 사이만 채워짐.\n const isFilled = (v: number) => (single ? v < hi : v > lo && v < hi)\n\n return (\n <div className='pointer-events-none absolute left-[8px] right-[8px] top-[calc(50%-1px)]'>\n {ticks.map((tick, i) => {\n const f = span === 0 ? 0 : (tick.value - min) / span\n return (\n <div\n key={i}\n className='absolute flex -translate-x-1/2 flex-col items-center gap-[16px]'\n style={{ left: `${f * 100}%` }}\n >\n <span\n className={cn(\n 'block size-[2px] shrink-0 rounded-full',\n !showDots\n ? 'invisible'\n : disabled\n ? 'bg-secondary40'\n : isFilled(tick.value)\n ? 'bg-primary20'\n : 'bg-secondary40',\n )}\n />\n {showLabels && tick.label != null && (\n <span\n className={cn(\n 'whitespace-nowrap text-center text-small-regular',\n disabled ? 'text-sys-text-disabled' : 'text-sys-text-subtle',\n )}\n >\n {tick.label}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '../../utils/cn'\nimport { type RangeMark, Ticks } from './ticks'\n\ntype RadixRootProps = React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n\nexport interface RangeSliderProps extends Omit<RadixRootProps, 'children'> {\n /** discrete: step마다 눈금/숫자, continuous: 양끝 라벨만 */\n type?: 'discrete' | 'continuous'\n /** 눈금 숫자/양끝 라벨 표시 여부 */\n showLabels?: boolean\n /** 명시적 눈금/라벨 위치. 지정 시 step 기반 기본 눈금을 대체(discrete/continuous 공통) */\n marks?: RangeMark[]\n}\n\nconst THUMB_CLASS = cn(\n 'block size-[16px] shrink-0 rounded-full bg-primary30 outline-none transition-colors cursor-pointer',\n 'hover:bg-primary40 active:bg-primary50',\n 'focus-visible:ring-[3px] focus-visible:ring-sys-focus-ring-main',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:bg-secondary50 data-[disabled]:pointer-events-none',\n)\n\n/**\n * 저수준 슬라이더 파트(Radix 기반). Track + 채움(Range) + thumb 상태머신 + 선택적 discrete/continuous 라벨.\n * thumb 상태: default(primary30) → hover(primary40) → press(primary50) → focus(+ring) → disabled(secondary50).\n * 단일값/범위([lo,hi]) 모두 지원(value 배열 길이로 thumb 개수 결정).\n */\nexport const RangeSlider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n RangeSliderProps\n>(\n (\n {\n className,\n type = 'discrete',\n showLabels = true,\n marks,\n min = 0,\n max = 100,\n step = 1,\n value,\n defaultValue,\n onValueChange,\n disabled,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n ...props\n },\n ref,\n ) => {\n const isControlled = value !== undefined\n const [internal, setInternal] = React.useState<number[]>(defaultValue ?? [min])\n const current = isControlled ? (value as number[]) : internal\n\n // thumb(role=slider)마다 접근 가능한 이름. undefined 를 명시로 넘기면 Radix 의 기본 이름까지 지워지므로\n // 항상 문자열을 만든다. 두 thumb 이상이면 최솟값/최댓값을 붙인다.\n const thumbA11yProps = (i: number, n: number) => {\n const position = n <= 1 ? '' : i === 0 ? '최솟값' : i === n - 1 ? '최댓값' : `${i + 1}번째 값`\n const label = [ariaLabel, position].filter(Boolean).join(' ') || '값'\n return ariaLabelledby\n ? { 'aria-labelledby': ariaLabelledby, 'aria-label': label }\n : { 'aria-label': label }\n }\n\n const handleChange = React.useCallback(\n (next: number[]) => {\n if (!isControlled) setInternal(next)\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n return (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex min-h-[36px] w-full touch-none select-none items-center',\n className,\n )}\n min={min}\n max={max}\n step={step}\n value={isControlled ? (value as number[]) : undefined}\n defaultValue={isControlled ? undefined : (defaultValue ?? [min])}\n onValueChange={handleChange}\n disabled={disabled}\n {...props}\n >\n <SliderPrimitive.Track className='relative h-[4px] w-full grow rounded-full bg-secondary30'>\n <SliderPrimitive.Range className='absolute h-full rounded-full bg-primary30 data-[disabled]:bg-secondary50' />\n <Ticks\n min={min}\n max={max}\n step={step}\n value={current}\n marks={marks}\n showDots={type === 'discrete'}\n disabled={disabled}\n showLabels={showLabels}\n />\n </SliderPrimitive.Track>\n {current.map((_, i) => (\n <SliderPrimitive.Thumb\n key={i}\n className={THUMB_CLASS}\n {...thumbA11yProps(i, current.length)}\n />\n ))}\n </SliderPrimitive.Root>\n )\n },\n)\nRangeSlider.displayName = 'RangeSlider'\n","'use client'\n\nimport * as React from 'react'\n\nimport { normalize } from './useRangeValue'\n\nexport interface UseNumberInputOptions {\n /** 현재 커밋된 숫자 값 */\n value: number\n /** blur/Enter 시 검증·정규화된 값으로 커밋 */\n onCommit: (value: number) => void\n min: number\n max: number\n step: number\n}\n\nexport interface NumberInputProps {\n value: string\n onChange: React.ChangeEventHandler<HTMLInputElement>\n onFocus: React.FocusEventHandler<HTMLInputElement>\n onBlur: React.FocusEventHandler<HTMLInputElement>\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>\n}\n\n/**\n * 숫자 입력(TextField/`<input>`)용 검증 로직 훅.\n * 타이핑 중에는 자유 입력을 허용하고, blur/Enter에서만 검증한다(비숫자·빈값→이전 값 롤백, 범위초과→clamp, step→snap).\n * 반환값을 그대로 입력 요소에 spread 한다: `<TextField {...useNumberInput(...)} />`.\n */\nexport function useNumberInput({\n value,\n onCommit,\n min,\n max,\n step,\n}: UseNumberInputOptions): NumberInputProps {\n const [text, setText] = React.useState<string>(() => String(value))\n const [focused, setFocused] = React.useState(false)\n\n // 포커스 중이 아닐 때만 외부 value를 입력 표시에 반영(타이핑 중 덮어쓰기 방지).\n React.useEffect(() => {\n if (!focused) setText(String(value))\n }, [value, focused])\n\n const commit = React.useCallback(() => {\n const trimmed = text.trim()\n const parsed = Number(trimmed)\n if (trimmed === '' || Number.isNaN(parsed)) {\n setText(String(value)) // 비숫자·빈값 → 이전 값으로 롤백\n return\n }\n onCommit(normalize(parsed, { min, max, step }))\n }, [text, value, onCommit, min, max, step])\n\n return {\n value: text,\n onChange: (e) => setText(e.target.value),\n onFocus: () => setFocused(true),\n onBlur: () => {\n setFocused(false)\n commit()\n },\n onKeyDown: (e) => {\n if (e.key === 'Enter') e.currentTarget.blur()\n },\n }\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Minus, Plus } from 'lucide-react'\n\nimport { cn } from '../../utils/cn'\nimport { IconButton } from '../iconButton'\nimport { TextField } from '../textField'\nimport { RangeSlider } from './rangeSlider'\nimport { type RangeMark } from './ticks'\nimport { useNumberInput } from './useNumberInput'\nimport { useRangeValue } from './useRangeValue'\n\nexport interface RangeProps {\n min?: number\n max?: number\n step?: number\n /** controlled 값 */\n value?: number\n /** uncontrolled 초기값 */\n defaultValue?: number\n onValueChange?: (value: number) => void\n /** ±버튼·숫자입력 모서리 형태 (트랙/썸/눈금엔 영향 없음) */\n shape?: 'rounded' | 'normal' | 'angled'\n /** discrete: step 눈금/숫자, continuous: 양끝 라벨만 */\n type?: 'discrete' | 'continuous'\n disabled?: boolean\n /** ± 스테퍼 버튼 표시 (기본 true) */\n hasButtonControl?: boolean\n /** 숫자 입력박스 표시 (기본 true) */\n hasCustomInput?: boolean\n /** 눈금 숫자/양끝 라벨 표시 (기본 true) */\n showLabels?: boolean\n /** 명시적 눈금/라벨 위치. 지정 시 step 기반 기본 눈금을 대체 */\n marks?: RangeMark[]\n className?: string\n /** 슬라이더 thumb 과 숫자 입력의 접근 가능한 이름 (예: '학습률') */\n 'aria-label'?: string\n /** 외부 라벨 요소의 id. 지정 시 thumb 과 숫자 입력이 그 요소로 이름을 얻는다 */\n 'aria-labelledby'?: string\n /** 숫자 입력의 name (폼 전송용) */\n name?: string\n}\n\nconst SHAPE_RADIUS = {\n rounded: 'rounded-full',\n normal: 'rounded-small',\n angled: 'rounded-none',\n} as const\n\n/**\n * Figma \"Range\" 합성 컴포넌트 — ± 스테퍼(IconButton) + 슬라이더(RangeSlider) + 숫자 입력박스(DS TextField).\n * 숫자 입력 검증은 useNumberInput 훅이 담당. 단일값 전용 — 두 thumb 범위는 저수준 `RangeSlider`를 직접 쓴다.\n */\nexport const Range = React.forwardRef<HTMLDivElement, RangeProps>(\n (\n {\n min = 0,\n max = 100,\n step = 1,\n value,\n defaultValue,\n onValueChange,\n shape = 'rounded',\n type = 'discrete',\n disabled,\n hasButtonControl = true,\n hasCustomInput = true,\n showLabels = true,\n marks,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n name,\n },\n ref,\n ) => {\n const {\n value: current,\n setValue,\n increment,\n decrement,\n canIncrement,\n canDecrement,\n } = useRangeValue({ value, defaultValue, min, max, step, onValueChange })\n\n // 숫자 입력란 검증 로직(타이핑 버퍼 + blur/Enter 커밋·롤백·clamp·snap) — TextField에 spread.\n const numberInput = useNumberInput({ value: current, onCommit: setValue, min, max, step })\n\n // IconButton은 shape가 normal/rounded만 지원 → angled(0px 각진 모서리)는 className으로 rounded-none 오버라이드.\n const iconShape = shape === 'rounded' ? 'rounded' : 'normal'\n const iconOverride = shape === 'angled' ? '!rounded-none' : undefined\n\n return (\n <div ref={ref} className={cn('flex w-full items-center gap-[16px]', className)}>\n {hasButtonControl && (\n <IconButton\n variant='primary'\n spacing='normal'\n shape={iconShape}\n className={iconOverride}\n disabled={disabled || !canDecrement}\n onClick={decrement}\n aria-label='값 감소'\n >\n <Minus size={24} />\n </IconButton>\n )}\n\n <RangeSlider\n className='min-w-0 flex-1'\n type={type}\n showLabels={showLabels}\n marks={marks}\n min={min}\n max={max}\n step={step}\n value={[current]}\n onValueChange={([v]) => setValue(v)}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n />\n\n {hasCustomInput && (\n <TextField\n appearance='standard'\n // 58×36, 값 좌측정렬(TextField 기본) — 시안과 동일. 모서리만 shape별 오버라이드.\n className={cn('w-[58px] shrink-0', SHAPE_RADIUS[shape])}\n role='spinbutton'\n inputMode='decimal'\n name={name}\n // 숫자 입력도 라벨이 필요하다(axe label). 외부 라벨이 없으면 aria-label 로, 그것도 없으면 '값'\n aria-label={ariaLabelledby ? undefined : (ariaLabel ?? '값')}\n aria-labelledby={ariaLabelledby}\n aria-valuenow={current}\n aria-valuemin={min}\n aria-valuemax={max}\n disabled={disabled}\n {...numberInput}\n />\n )}\n\n {hasButtonControl && (\n <IconButton\n variant='primary'\n spacing='normal'\n shape={iconShape}\n className={iconOverride}\n disabled={disabled || !canIncrement}\n onClick={increment}\n aria-label='값 증가'\n >\n <Plus size={24} />\n </IconButton>\n )}\n </div>\n )\n },\n)\nRange.displayName = 'Range'\n","'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\nimport { Check, X } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\ntype SwitchSize = 'small' | 'large'\n\ninterface SwitchProps extends React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root> {\n size?: SwitchSize\n showIcon?: boolean\n}\n\n/**\n * 켜고 끄는 토글. 두 상태뿐인 설정에 쓴다 — 즉시 반영이든 폼 제출값이든.\n *\n * 언제 쓰나: 알림 켜기, 공개/비공개, 규칙 사용처럼 두 상태뿐인 설정. 폼 안에서는 `SwitchSection`(박스 + 제목·설명 + Switch)으로 둔다(2026-10-14, dl-ui-v3 ToggleField 관례 — 이전 \"폼 제출값은 Checkbox\" 규칙은 폐기).\n * 언제 안 쓰나: 여러 옵션 중 복수 선택(→ Checkbox·CheckboxSectionGroup), 세 가지 이상 상태(→ RadioGroup·RadioSectionGroup·Select).\n * 대신/함께: 라벨은 `Label` 로 연결하고, 상태 텍스트(\"켜짐\")를 옆에 따로 두지 않는다.\n */\nconst Switch = React.forwardRef<React.ElementRef<typeof SwitchPrimitives.Root>, SwitchProps>(\n ({ className, size = 'small', showIcon = true, ...props }, ref) => {\n const sizeClasses: Record<\n SwitchSize,\n { root: string; thumb: string; translate: string; checkIcon: string; xIcon: string }\n > = {\n small: {\n root: 'h-[20px] w-[38px]',\n thumb: 'h-[14px] w-[14px]',\n translate: 'data-[state=checked]:translate-x-[18px]',\n checkIcon: 'left-[3px] top-1/2 -translate-y-1/2',\n xIcon: 'left-[19px] top-1/2 -translate-y-1/2',\n },\n large: {\n root: 'h-[24px] w-[45px]',\n thumb: 'h-[18px] w-[18px]',\n translate: 'data-[state=checked]:translate-x-[21px]',\n checkIcon: 'left-[5px] top-[4px]',\n xIcon: 'left-[24px] top-[4px]',\n },\n }\n\n const current = sizeClasses[size]\n\n return (\n <SwitchPrimitives.Root\n ref={ref}\n className={cn(\n 'group relative peer inline-flex shrink-0 cursor-pointer items-center rounded-full px-[3px] transition-colors',\n // 끔 트랙은 secondary50(흰 바탕·손잡이 대비 3.7:1) — secondary60 은 외곽선 폼 안에서 \"진한 토글\" 로 읽혔다 (2026-10-17 이슈 47 5차)\n 'bg-secondary50 data-[state=checked]:bg-primary30',\n 'hover:data-[state=unchecked]:bg-secondary60 hover:data-[state=checked]:bg-primary40',\n 'disabled:cursor-not-allowed disabled:data-[state=unchecked]:bg-secondary-o10 disabled:data-[state=checked]:bg-primary-o20',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-sys-focus-ring-main)] focus-visible:ring-offset-2',\n current.root,\n className,\n )}\n {...props}\n >\n {showIcon && (\n <>\n <span\n className={cn(\n 'absolute pointer-events-none flex items-center justify-center size-[16px]',\n 'opacity-0 group-data-[state=checked]:opacity-100 transition-opacity',\n 'text-sys-background',\n current.checkIcon,\n )}\n >\n <Check className='w-[16px] h-[16px] block' strokeWidth={2.5} />\n </span>\n <span\n className={cn(\n 'absolute pointer-events-none flex items-center justify-center size-[16px]',\n 'opacity-0 group-data-[state=unchecked]:opacity-100 transition-opacity',\n 'text-sys-background',\n current.xIcon,\n )}\n >\n <X className='w-[16px] h-[16px] block' strokeWidth={2.5} />\n </span>\n </>\n )}\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none relative z-10 block rounded-full bg-sys-background shadow-gray-small ring-0 transition-transform data-[state=unchecked]:translate-x-0',\n 'data-[disabled]:opacity-60',\n current.thumb,\n current.translate,\n )}\n />\n </SwitchPrimitives.Root>\n )\n },\n)\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../utils/cn'\nimport { Switch } from './switch'\n\n// Switch(button)의 HTML title 속성과 이름이 겹치므로 뺀다 — 여기서 title 은 박스 제목\ninterface SwitchSectionProps extends Omit<React.ComponentPropsWithoutRef<typeof Switch>, 'title'> {\n /** 박스 안 왼쪽의 굵은 제목 (예: \"규칙 사용\") */\n title: React.ReactNode\n /** 제목 아래 한 줄 설명 (예: \"끄면 규칙은 저장되지만 알림을 보내지 않습니다\") */\n description?: React.ReactNode\n /** 박스(바깥 div)의 className. Switch 자체는 `switchClassName` */\n className?: string\n switchClassName?: string\n}\n\n/**\n * 토글 박스 — 테두리 상자 안에 제목·설명(왼쪽)과 Switch(오른쪽). dl-ui-v3 의 ToggleField(노트북 지원, 자동 갱신 등) 관례를 TDS 로 올린 것. 테두리·패딩·글자(제목 h5·설명 base·간격 4)는 RadioSection·CheckboxSection 카드와 같다 — 한 폼에 나란히 와도 한 가족으로 보이게.\n *\n * 언제 쓰나: 켜기/끄기 하나의 설정 — 즉시 반영이든 폼 제출값이든(규칙 사용, 실패 시 알림, 노트북 지원). 폼에서는 `FormField` 의 `field.value`·`field.onChange` 를 `checked`·`onCheckedChange` 에 연결하고 `FormControl` 로 감싼다(id·aria 가 Switch 에 간다).\n * 언제 안 쓰나: 여러 옵션 중 복수 선택(→ Checkbox·CheckboxSectionGroup), 세 가지 이상 상태(→ RadioSectionGroup·Select), 라벨만 있는 짧은 동의(→ Checkbox + Label).\n * 대신/함께: 제목을 누르면 Switch 가 눌린다(label htmlFor). 바깥 FormLabel 은 필드 이름(\"알림\"), 박스 제목은 무엇을 켜는지(\"실패 시 이메일 알림 받기\").\n */\nconst SwitchSection = React.forwardRef<React.ElementRef<typeof Switch>, SwitchSectionProps>(\n (\n {\n title,\n description,\n className,\n switchClassName,\n id,\n disabled,\n size = 'large',\n showIcon = false,\n ...props\n },\n ref,\n ) => {\n const autoId = React.useId()\n const switchId = id ?? autoId\n return (\n <div\n data-slot='switch-section'\n className={cn(\n // 테두리 상자 — RadioSection 카드와 같은 선(divider-main 1px)·같은 패딩(12px) (2026-10-20 16차 D2: \"toggle card differs in padding and border weight\").\n // 채움 박스(secondary-o10)는 외곽선 폼 안에서 홀로 채워져 보였다 (2026-10-17 이슈 47 4차)\n 'flex w-full items-center justify-between gap-[16px] rounded-medium border border-sys-divider-main bg-sys-background p-[12px]',\n disabled && 'opacity-60',\n className,\n )}\n >\n {/* 글자는 RadioSection·CheckboxSection 카드와 같게(제목 text-h5 · 설명 text-base-regular · 간격 4) — h6/small 이던 때 한 폼에서\n \"toggle card uses smaller title text than the event cards\" 로 감점 (2026-10-26 22차, 21차 세트 2 component_consistency −0.78) */}\n <label\n htmlFor={switchId}\n className={cn(\n 'flex min-w-0 flex-col gap-[4px]',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n >\n <span className='break-keep text-h5 text-sys-text-main wrap-break-word'>{title}</span>\n {description ? (\n <span className='break-keep text-base-regular text-sys-text-subtle wrap-break-word'>\n {description}\n </span>\n ) : null}\n </label>\n {/* 카드 안의 토글은 large(24×45)·아이콘 없음 — small 의 썸 안 ✓/× 가 \"cramped toggle\"·\"tiny cross\" 로 감점 (2026-10-20 16차 D3). 호출자가 size·showIcon 으로 덮을 수 있다 */}\n <Switch\n ref={ref}\n id={switchId}\n disabled={disabled}\n size={size}\n showIcon={showIcon}\n className={switchClassName}\n {...props}\n />\n </div>\n )\n },\n)\nSwitchSection.displayName = 'SwitchSection'\n\nexport { SwitchSection }\nexport type { SwitchSectionProps }\n","'use client'\n\nimport * as React from 'react'\nimport TextareaAutosize, { TextareaAutosizeProps } from 'react-textarea-autosize'\nimport { cva } from 'class-variance-authority'\n\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport { useFormControlContext } from './form'\n\nconst textareaContainerVariants = cva(\n [\n 'flex w-full items-start bg-transparent',\n 'rounded-small min-h-[84px] text-base-medium text-sys-text-main',\n 'transition-colors',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class: 'border-[2px] border-danger30 py-[2px] px-[4px]',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n },\n },\n)\n\nexport type TextareaProps = Omit<TextareaAutosizeProps, 'children'> & {\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** Floating label 텍스트 */\n label?: string\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /** 에러 상태 */\n isInvalid?: boolean\n /** 컨테이너 div에 적용할 추가 className */\n containerClassName?: string\n /** 수동 리사이즈 허용 */\n resize?: boolean\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n appearance = 'standard',\n label,\n required: requiredProp,\n isInvalid: isInvalidProp,\n containerClassName,\n className,\n disabled,\n readOnly,\n resize = false,\n minRows = 3,\n maxRows,\n value: valueProp,\n defaultValue,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n style,\n ...textareaProps\n },\n forwardedRef,\n ) => {\n const formControl = useFormControlContext()\n const isInvalid = isInvalidProp ?? formControl?.isInvalid ?? false\n const textareaRef = React.useRef<HTMLTextAreaElement>(null)\n const [isFocused, setIsFocused] = React.useState(false)\n\n // Controlled vs Uncontrolled hasValue tracking\n const isControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState(\n defaultValue !== undefined ? String(defaultValue) : '',\n )\n const hasValue = isControlled ? String(valueProp) !== '' : internalValue !== ''\n\n // Compose refs (forwarded ref + internal ref)\n const composedRef = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n ;(textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n },\n [forwardedRef],\n )\n\n // Floating label\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n // --- Handlers ---\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) setInternalValue(e.target.value)\n onChangeProp?.(e)\n },\n [isControlled, onChangeProp],\n )\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n return (\n <div\n data-slot='textarea'\n aria-disabled={disabled || undefined}\n className={cn(\n textareaContainerVariants({ appearance, isInvalid }),\n // Focus styling (state-managed, standard appearance without notched outline only)\n isFocused &&\n !isInvalid &&\n appearance === 'standard' &&\n !showNotchedOutline &&\n 'border-[2px] border-sys-focus-ring-bold py-[2px] px-[4px]',\n // Floating label positioning\n (showNotchedOutline || showNoneLabel) && 'relative',\n // Notched outline draws border — remove container's own border\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n // Disabled / cursor\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-text',\n // disabled 시 hover 배경 무력화 (div container라 :disabled 불가 → JS 조건부; none은 원래 hover bg 없음)\n disabled && appearance !== 'none' && 'hover:bg-sys-background',\n containerClassName,\n // 외부 className 은 root container 에 적용 — FormControl 의 maxWidth 가\n // 자식 className 에 inject 되는데, wrapper div 의 폭 제어가 의도이므로\n // inner textarea 가 아닌 여기에 머지한다.\n className,\n )}\n style={{\n resize: resize ? 'vertical' : 'none',\n overflow: resize ? 'hidden' : undefined,\n }}\n >\n {/* Floating label (standard: notched outline, none: inline label) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n {/* Textarea */}\n <TextareaAutosize\n ref={composedRef}\n minRows={minRows}\n maxRows={maxRows}\n disabled={disabled}\n readOnly={readOnly}\n value={isControlled ? valueProp : undefined}\n defaultValue={!isControlled ? defaultValue : undefined}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-labelledby={hasLabel ? labelId : undefined}\n aria-required={hasLabel && requiredProp ? true : undefined}\n className={cn(\n 'flex-1 min-w-0 bg-transparent border-none outline-none',\n 'text-base-medium text-sys-text-main',\n 'placeholder:text-sys-text-placeholder',\n 'disabled:cursor-not-allowed',\n 'px-[4px] py-[2px]',\n // maxRows 미지정(무한 auto-grow) 시 자체 스크롤바 숨김: 스크롤바가 뜨면 content 폭이 줄어\n // autosize 재측정과 어긋나 스크롤바가 고착되는 피드백 루프를 막는다(스크롤바 없으면 content 가\n // height 에 정확히 맞아 잘림 없음). maxRows 지정(바운드) 시엔 기본 overflow-y:auto 로 캡 초과분 스크롤.\n maxRows == null && 'overflow-hidden',\n // When label is down (acting as placeholder), hide textarea's placeholder\n hasLabel && !hasValue && !isFocused && 'placeholder:text-transparent',\n )}\n style={{\n resize: 'none',\n ...style,\n }}\n {...textareaProps}\n />\n </div>\n )\n },\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","'use client'\n\nimport * as React from 'react'\nimport { cva } from 'class-variance-authority'\nimport { Clock } from 'lucide-react'\n\nimport { CancelIcon, CLEAR_HOST_CLASS, CLEAR_REVEAL_CLASS } from './_internal/cancelIcon'\nimport { FloatingLabelOutline } from './_internal/floatingLabelOutline'\nimport { useFloatingLabel } from '../hooks/useFloatingLabel'\nimport { cn } from '../utils/cn'\nimport word from '../utils/word'\nimport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './popover'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TimeValue24 = string // \"HH:mm\" e.g., \"14:33\"\n\nexport type TimeValue12 = {\n hour: number // 1-12\n minute: number // 0-59\n period: 'AM' | 'PM'\n}\n\nexport type HourType = '24hrs' | '12hrs'\n\ninterface TimePickerBaseProps {\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 비활성 상태 */\n disabled?: boolean\n /** 에러/유효하지 않은 상태 */\n isInvalid?: boolean\n /** Floating label 텍스트 */\n label?: string\n /** @default 'standard' */\n appearance?: 'standard' | 'none'\n /** 라벨 필수 표시 (*) */\n required?: boolean\n /** 분 간격. @default 5 */\n minuteStep?: number\n /** 클래스 오버라이드. `trigger` = 트리거 틀(기본 폭 160px, 12시간 180px — 폼 칸을 채우려면 `'w-full'`), `popoverContent` = 시·분 팝오버 */\n classNames?: {\n trigger?: string\n popoverContent?: string\n }\n}\n\nexport type TimePickerProps = TimePickerBaseProps &\n (\n | {\n hourType?: '24hrs'\n value?: TimeValue24\n onChange?: (value: TimeValue24 | undefined) => void\n }\n | {\n hourType: '12hrs'\n value?: TimeValue12\n onChange?: (value: TimeValue12 | undefined) => void\n }\n )\n\n// ============================================================================\n// Internal types\n// ============================================================================\n\ninterface ParsedTime {\n hour: string | null // 두 자리 문자열 (\"00\"-\"23\" 또는 \"01\"-\"12\")\n minute: string | null // 두 자리 문자열 (\"00\"-\"59\")\n period: 'AM' | 'PM' | null // 12hrs 전용\n}\n\n// ============================================================================\n// Utility functions\n// ============================================================================\n\nfunction parseTimeValue(\n value: TimeValue24 | TimeValue12 | undefined,\n hourType: HourType,\n): ParsedTime {\n if (value == null) return { hour: null, minute: null, period: null }\n\n if (hourType === '12hrs') {\n if (typeof value !== 'object') return { hour: null, minute: null, period: null }\n const v = value as TimeValue12\n if (\n typeof v.hour !== 'number' ||\n typeof v.minute !== 'number' ||\n (v.period !== 'AM' && v.period !== 'PM')\n )\n return { hour: null, minute: null, period: null }\n if (v.hour < 1 || v.hour > 12 || v.minute < 0 || v.minute > 59)\n return { hour: null, minute: null, period: null }\n return {\n hour: String(v.hour).padStart(2, '0'),\n minute: String(v.minute).padStart(2, '0'),\n period: v.period,\n }\n }\n\n // 24hrs\n if (typeof value !== 'string') return { hour: null, minute: null, period: null }\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/)\n if (!match) return { hour: null, minute: null, period: null }\n const h = parseInt(match[1], 10)\n const m = parseInt(match[2], 10)\n if (h < 0 || h > 23 || m < 0 || m > 59) return { hour: null, minute: null, period: null }\n return {\n hour: String(h).padStart(2, '0'),\n minute: String(m).padStart(2, '0'),\n period: null,\n }\n}\n\nfunction formatDisplayText(\n value: TimeValue24 | TimeValue12 | undefined,\n hourType: HourType,\n): string {\n const parsed = parseTimeValue(value, hourType)\n if (!parsed.hour || !parsed.minute) return ''\n\n if (hourType === '12hrs') {\n const periodLabel = parsed.period === 'AM' ? '오전' : '오후'\n return `${periodLabel} ${parsed.hour} : ${parsed.minute}`\n }\n return `${parsed.hour} : ${parsed.minute}`\n}\n\nfunction hasTimeValue(value: TimeValue24 | TimeValue12 | undefined, hourType: HourType): boolean {\n const parsed = parseTimeValue(value, hourType)\n return parsed.hour !== null && parsed.minute !== null\n}\n\nfunction generateHourOptions(hourType: HourType): { value: string; label: string }[] {\n if (hourType === '12hrs') {\n return Array.from({ length: 12 }, (_, i) => {\n const h = i + 1\n const val = String(h).padStart(2, '0')\n return { value: val, label: val }\n })\n }\n return Array.from({ length: 24 }, (_, i) => {\n const val = String(i).padStart(2, '0')\n return { value: val, label: val }\n })\n}\n\nfunction generateMinuteOptions(step: number): { value: string; label: string }[] {\n const safeStep = Math.max(1, Math.floor(step))\n const options: { value: string; label: string }[] = []\n for (let m = 0; m < 60; m += safeStep) {\n const val = String(m).padStart(2, '0')\n options.push({ value: val, label: val })\n }\n return options\n}\n\nconst PERIOD_OPTIONS: { value: string; label: string }[] = [\n { value: 'AM', label: '오전' },\n { value: 'PM', label: '오후' },\n]\n\n// ============================================================================\n// Trigger CVA\n// ============================================================================\n\n// 래퍼 div 에 적용된다 (트리거 button 과 Clear button 의 공통 부모). 포커스 링은 focus-within, 비활성은 data-disabled.\nconst timePickerTriggerVariants = cva(\n [\n 'flex items-center gap-[2px] bg-transparent whitespace-nowrap outline-none cursor-pointer',\n 'rounded-small min-h-[36px] text-base-medium text-sys-text-main',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n ].join(' '),\n {\n variants: {\n appearance: {\n standard: [\n 'bg-sys-background border border-sys-divider-main py-[3px] px-[5px]',\n 'hover:bg-secondary-o10 data-[disabled]:hover:bg-sys-background',\n 'focus-within:border-[2px] focus-within:border-sys-focus-ring-bold focus-within:py-[2px] focus-within:px-[4px]',\n 'data-[state=open]:border-[2px] data-[state=open]:border-sys-focus-ring-bold data-[state=open]:py-[2px] data-[state=open]:px-[4px]',\n ].join(' '),\n none: 'bg-transparent border-none py-[4px] px-[6px]',\n },\n isInvalid: {\n true: '',\n false: '',\n },\n hourType: {\n '24hrs': 'w-[160px]',\n '12hrs': 'w-[180px]',\n },\n },\n compoundVariants: [\n {\n appearance: 'standard',\n isInvalid: true,\n class:\n 'border-[2px] border-danger30 py-[2px] px-[4px] focus-within:border-danger30 data-[state=open]:border-danger30',\n },\n ],\n defaultVariants: {\n appearance: 'standard',\n isInvalid: false,\n hourType: '24hrs',\n },\n },\n)\n\n// ============================================================================\n// TimePickerTrigger\n// ============================================================================\n\ninterface TimePickerTriggerProps {\n open: boolean\n hasValue: boolean\n displayText: string\n placeholder: string\n disabled?: boolean\n isInvalid?: boolean\n label?: string\n required?: boolean\n appearance?: 'standard' | 'none'\n hourType?: HourType\n onClear?: () => void\n onFocus?: React.FocusEventHandler<HTMLButtonElement>\n onBlur?: React.FocusEventHandler<HTMLButtonElement>\n className?: string\n}\n\nconst TimePickerTrigger = React.forwardRef<HTMLButtonElement, TimePickerTriggerProps>(\n (\n {\n open,\n hasValue,\n displayText,\n placeholder,\n disabled,\n isInvalid,\n label,\n required: requiredProp,\n appearance = 'standard',\n hourType = '24hrs',\n onClear,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n className,\n },\n ref,\n ) => {\n const [isFocused, setIsFocused] = React.useState(false)\n\n const {\n hasLabel,\n isFloating,\n isMounted,\n labelColorClass,\n borderColorClass,\n isThickBorder,\n labelId,\n } = useFloatingLabel({\n label,\n hasValue,\n isOpen: open,\n isFocused,\n isInvalid: !!isInvalid,\n isDisabled: !!disabled,\n appearance,\n })\n\n const showNotchedOutline = hasLabel && appearance !== 'none'\n const showNoneLabel = hasLabel && appearance === 'none'\n\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(true)\n onFocusProp?.(e)\n },\n [onFocusProp],\n )\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<HTMLButtonElement>) => {\n setIsFocused(false)\n onBlurProp?.(e)\n },\n [onBlurProp],\n )\n\n const handleClearClick = React.useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n e.preventDefault()\n onClear?.()\n },\n [onClear],\n )\n\n // 트리거 button 과 Clear button 은 형제다(위젯 중첩 금지, axe nested-interactive).\n // 래퍼 div 가 모양을 담당하고, 래퍼의 빈 영역(아이콘 등)을 눌러도 트리거가 눌리도록 포워딩한다.\n const triggerRef = React.useRef<HTMLButtonElement | null>(null)\n const setRefs = (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLButtonElement | null>).current = node\n }\n // 마우스 편의용: 아이콘 등 래퍼의 빈 영역 클릭을 트리거로 넘긴다. 키보드·보조기기는 트리거 button 을 직접 쓴다\n const handleWrapperClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const t = e.target as HTMLElement\n if (t.closest('[data-slot=timepicker-trigger],[data-slot=timepicker-clear]')) return\n triggerRef.current?.click()\n }\n\n return (\n <PopoverAnchor asChild>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- 포인터 편의 포워딩, 실제 컨트롤은 안쪽 button */}\n <div\n data-slot='timepicker'\n data-state={open ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n className={cn(\n timePickerTriggerVariants({ appearance, isInvalid, hourType }),\n CLEAR_HOST_CLASS,\n '[&_[data-placeholder]]:text-sys-text-subtler',\n (showNotchedOutline || showNoneLabel) && 'relative',\n showNotchedOutline && '!border-0 !py-[4px] !px-[6px]',\n className,\n )}\n onClick={handleWrapperClick}\n >\n {/* FloatingLabelOutline (조건부) */}\n {(showNotchedOutline || showNoneLabel) && (\n <FloatingLabelOutline\n mode={showNotchedOutline ? 'standard' : 'none'}\n label={label!}\n required={requiredProp}\n isFloating={isFloating}\n isMounted={isMounted}\n labelColorClass={labelColorClass}\n borderColorClass={borderColorClass}\n isThickBorder={isThickBorder}\n labelId={labelId}\n />\n )}\n\n <PopoverTrigger asChild>\n <button\n ref={setRefs}\n type='button'\n data-slot='timepicker-trigger'\n data-state={open ? 'open' : 'closed'}\n aria-labelledby={hasLabel ? labelId : undefined}\n disabled={disabled}\n className={cn(\n 'flex flex-1 items-center min-h-[28px] min-w-0 px-[4px] py-[2px] text-left bg-transparent outline-none cursor-pointer',\n 'disabled:cursor-not-allowed',\n hasLabel && !hasValue && 'invisible',\n )}\n onFocus={hasLabel ? handleFocus : onFocusProp}\n onBlur={hasLabel ? handleBlur : onBlurProp}\n >\n {hasValue ? (\n <span className='truncate'>{displayText}</span>\n ) : (\n <span data-placeholder className='truncate'>\n {placeholder}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n {/* Clear 버튼 — 형제 button. 값이 없거나 비활성이면 invisible(폭 유지, 포커스 불가), 값이 있으면 마우스·포커스 때만 보임 */}\n {onClear && (\n <button\n type='button'\n data-slot='timepicker-clear'\n onClick={handleClearClick}\n disabled={disabled}\n className={cn(\n 'shrink-0 flex items-center justify-center p-[2px] rounded-small hover:bg-secondary-o10 text-sys-text-subtler cursor-pointer outline-none',\n 'focus-visible:ring-[2px] focus-visible:ring-sys-focus-ring-main',\n CLEAR_REVEAL_CLASS,\n (!hasValue || disabled) && 'invisible',\n )}\n aria-label='시간 지우기'\n >\n <CancelIcon size={20} />\n </button>\n )}\n\n {/* Clock 아이콘 (장식, 클릭은 래퍼가 트리거로 포워딩) */}\n <Clock aria-hidden className='size-[24px] shrink-0 text-sys-text-main' />\n </div>\n </PopoverAnchor>\n )\n },\n)\nTimePickerTrigger.displayName = 'TimePickerTrigger'\n\n// ============================================================================\n// TimeColumn\n// ============================================================================\n\ninterface TimeColumnProps {\n options: { value: string; label: string }[]\n selectedValue: string | null\n onSelect: (value: string) => void\n 'aria-label': string\n}\n\nfunction TimeColumn({\n options,\n selectedValue,\n onSelect,\n 'aria-label': ariaLabel,\n}: TimeColumnProps) {\n const listRef = React.useRef<HTMLDivElement>(null)\n\n // 선택된 항목으로 스크롤\n React.useEffect(() => {\n if (!listRef.current || !selectedValue) return\n const selectedEl = listRef.current.querySelector(`[data-value=\"${selectedValue}\"]`)\n if (selectedEl && typeof selectedEl.scrollIntoView === 'function') {\n selectedEl.scrollIntoView({ block: 'nearest' })\n }\n }, [selectedValue])\n\n return (\n <div\n ref={listRef}\n role='listbox'\n aria-label={ariaLabel}\n // 스크롤 영역은 키보드로 닿아야 한다(axe scrollable-region-focusable). 화살표로 옵션 사이를 이동한다\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return\n e.preventDefault()\n const items = Array.from(\n listRef.current?.querySelectorAll<HTMLElement>('[role=\"option\"]') ?? [],\n )\n if (!items.length) return\n const cur = items.indexOf(document.activeElement as HTMLElement)\n const selected = items.findIndex((i) => i.dataset.state === 'checked')\n const start =\n cur >= 0 ? cur : selected >= 0 ? selected : e.key === 'ArrowDown' ? -1 : items.length\n const next = Math.min(\n items.length - 1,\n Math.max(0, start + (e.key === 'ArrowDown' ? 1 : -1)),\n )\n items[next]?.focus()\n }}\n className='flex-1 h-[192px] overflow-y-auto outline-none focus-visible:ring-[2px] focus-visible:ring-inset focus-visible:ring-sys-focus-ring-main'\n >\n {options.map((option) => (\n <div\n key={option.value}\n role='option'\n tabIndex={-1}\n aria-selected={selectedValue === option.value}\n data-value={option.value}\n data-state={selectedValue === option.value ? 'checked' : 'unchecked'}\n onClick={() => onSelect(option.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect(option.value)\n }\n }}\n className={cn(\n 'flex items-center min-h-[32px] px-[8px] py-[2px]',\n 'border-b border-secondary-o20',\n 'text-base-medium text-sys-text-main cursor-pointer select-none',\n 'hover:bg-primary10',\n selectedValue === option.value && 'bg-secondary-o20 hover:bg-secondary-o40',\n )}\n >\n {option.label}\n </div>\n ))}\n </div>\n )\n}\n\n// ============================================================================\n// TimePicker\n// ============================================================================\n\n/**\n * 시각(시·분)을 고르는 입력. 트리거를 누르면 시·분 목록 팝오버가 열린다. `hourType` 으로 24시간·12시간.\n *\n * 언제 쓰나: 폼의 시각 필드(예약 시작·종료 시각, 실행 시각). 날짜와 함께면 `DatePicker` 옆에 둔다.\n * 언제 안 쓰나: 날짜만(→ DatePicker), 기간(→ DatePickerRange), 분 단위 지속 시간(→ TextField + 단위).\n * 대신/함께: 기본 폭은 160px(12시간 180px)이다. 폼 칸을 채우려면 `classNames={{ trigger: 'w-full' }}`(DatePicker 는 `classNames={{ button: 'w-full' }}`) — 좁은 고정 폭이 줄의 절반을 비워 감점됐다(2026-10-28 홀드아웃 14).\n */\nexport function TimePicker(props: TimePickerProps) {\n const {\n value,\n onChange,\n placeholder = word.common.startTime,\n disabled,\n isInvalid = false,\n label,\n appearance = 'standard',\n required,\n minuteStep: minuteStepProp = 5,\n classNames,\n } = props\n\n const hourType: HourType = props.hourType ?? '24hrs'\n const minuteStep = Math.max(1, Math.floor(minuteStepProp))\n\n // Popover 상태\n const [open, setOpen] = React.useState(false)\n\n // 현재 value 파싱\n const parsed = React.useMemo(() => parseTimeValue(value, hourType), [value, hourType])\n const isFilled = hasTimeValue(value, hourType)\n const displayText = React.useMemo(() => formatDisplayText(value, hourType), [value, hourType])\n\n // Pending 선택 상태 (popover 열려있는 동안)\n const [pendingHour, setPendingHour] = React.useState<string | null>(null)\n const [pendingMinute, setPendingMinute] = React.useState<string | null>(null)\n const [pendingPeriod, setPendingPeriod] = React.useState<string | null>(null)\n\n // Popover 열릴 때 pending 상태 초기화\n React.useEffect(() => {\n if (open) {\n setPendingHour(parsed.hour)\n setPendingMinute(parsed.minute)\n setPendingPeriod(parsed.period)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // 옵션 생성 (memoized)\n const hourOptions = React.useMemo(() => generateHourOptions(hourType), [hourType])\n const minuteOptions = React.useMemo(() => generateMinuteOptions(minuteStep), [minuteStep])\n\n // onChange 호출 헬퍼\n const emitChange = React.useCallback(\n (hour: string, minute: string, period: string | null) => {\n if (!onChange) return\n\n if (hourType === '12hrs') {\n const h = parseInt(hour, 10)\n const m = parseInt(minute, 10)\n ;(onChange as (v: TimeValue12 | undefined) => void)({\n hour: h,\n minute: m,\n period: (period ?? 'AM') as 'AM' | 'PM',\n })\n } else {\n ;(onChange as (v: TimeValue24 | undefined) => void)(`${hour}:${minute}`)\n }\n },\n [onChange, hourType],\n )\n\n // 컬럼 선택 시 pending 업데이트 + 완성 시 onChange 호출\n const handleHourSelect = React.useCallback(\n (val: string) => {\n setPendingHour(val)\n // 12hrs 모드에서 period가 없으면 기본 AM\n const effectivePeriod = hourType === '12hrs' ? (pendingPeriod ?? 'AM') : null\n if (pendingMinute) {\n emitChange(val, pendingMinute, effectivePeriod)\n setOpen(false)\n }\n },\n [pendingMinute, pendingPeriod, hourType, emitChange],\n )\n\n const handleMinuteSelect = React.useCallback(\n (val: string) => {\n setPendingMinute(val)\n const effectivePeriod = hourType === '12hrs' ? (pendingPeriod ?? 'AM') : null\n if (pendingHour) {\n emitChange(pendingHour, val, effectivePeriod)\n setOpen(false)\n }\n },\n [pendingHour, pendingPeriod, hourType, emitChange],\n )\n\n const handlePeriodSelect = React.useCallback(\n (val: string) => {\n setPendingPeriod(val)\n if (pendingHour && pendingMinute) {\n emitChange(pendingHour, pendingMinute, val)\n setOpen(false)\n }\n },\n [pendingHour, pendingMinute, emitChange],\n )\n\n // Clear\n const handleClear = React.useCallback(() => {\n if (hourType === '12hrs') {\n ;(onChange as ((v: TimeValue12 | undefined) => void) | undefined)?.(undefined)\n } else {\n ;(onChange as ((v: TimeValue24 | undefined) => void) | undefined)?.(undefined)\n }\n }, [onChange, hourType])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <TimePickerTrigger\n open={open}\n hasValue={isFilled}\n displayText={displayText}\n placeholder={placeholder}\n disabled={disabled}\n isInvalid={isInvalid}\n label={label}\n required={required}\n appearance={appearance}\n hourType={hourType}\n onClear={onChange ? handleClear : undefined}\n className={classNames?.trigger}\n />\n <PopoverContent\n aria-label='시간 선택'\n className={cn(\n 'p-0 !border-0 overflow-hidden min-w-[var(--radix-popover-trigger-width)]',\n classNames?.popoverContent,\n )}\n align='start'\n >\n <div className='flex gap-[4px]'>\n {hourType === '12hrs' && (\n <TimeColumn\n options={PERIOD_OPTIONS}\n selectedValue={pendingPeriod}\n onSelect={handlePeriodSelect}\n aria-label='오전/오후 선택'\n />\n )}\n <TimeColumn\n options={hourOptions}\n selectedValue={pendingHour}\n onSelect={handleHourSelect}\n aria-label='시 선택'\n />\n <TimeColumn\n options={minuteOptions}\n selectedValue={pendingMinute}\n onSelect={handleMinuteSelect}\n aria-label='분 선택'\n />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\ntype Theme = 'light' | 'dark' | 'system'\ntype ResolvedTheme = 'light' | 'dark'\n\ninterface ThemeProviderProps {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n}\n\ninterface ThemeContextValue {\n theme: Theme\n resolvedTheme: ResolvedTheme\n setTheme: (theme: Theme) => void\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined)\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction resolveTheme(theme: Theme): ResolvedTheme {\n if (theme === 'system') return getSystemTheme()\n return theme\n}\n\nfunction getStoredTheme(storageKey: string): Theme | null {\n if (typeof window === 'undefined') return null\n try {\n const stored = localStorage.getItem(storageKey)\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored\n }\n } catch {\n // localStorage 접근 불가 (SSR, 프라이버시 모드 등)\n }\n return null\n}\n\nfunction ThemeProvider({ children, defaultTheme = 'light', storageKey }: ThemeProviderProps) {\n const [theme, setThemeState] = React.useState<Theme>(() => {\n if (storageKey) {\n const stored = getStoredTheme(storageKey)\n if (stored) return stored\n }\n return defaultTheme\n })\n\n const [resolvedTheme, setResolvedTheme] = React.useState<ResolvedTheme>(() => resolveTheme(theme))\n\n // theme 변경 시 resolvedTheme 업데이트\n React.useEffect(() => {\n setResolvedTheme(resolveTheme(theme))\n }, [theme])\n\n // system 테마일 때 OS 설정 변경 감지\n React.useEffect(() => {\n if (theme !== 'system') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handler = (e: MediaQueryListEvent) => {\n setResolvedTheme(e.matches ? 'dark' : 'light')\n }\n\n mediaQuery.addEventListener('change', handler)\n return () => mediaQuery.removeEventListener('change', handler)\n }, [theme])\n\n // document.documentElement에 data-theme 동기화\n React.useEffect(() => {\n const root = document.documentElement\n if (resolvedTheme === 'dark') {\n root.setAttribute('data-theme', 'dark')\n } else {\n root.removeAttribute('data-theme')\n }\n\n return () => {\n root.removeAttribute('data-theme')\n }\n }, [resolvedTheme])\n\n const setTheme = React.useCallback(\n (newTheme: Theme) => {\n setThemeState(newTheme)\n if (storageKey) {\n try {\n localStorage.setItem(storageKey, newTheme)\n } catch {\n // localStorage 접근 불가\n }\n }\n },\n [storageKey],\n )\n\n const value = React.useMemo<ThemeContextValue>(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n )\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n\nfunction useTheme(): ThemeContextValue {\n const context = React.useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n\nfunction useOptionalTheme(): ThemeContextValue | undefined {\n return React.useContext(ThemeContext)\n}\n\nexport { ThemeProvider, useTheme, useOptionalTheme }\nexport type { Theme, ThemeProviderProps, ThemeContextValue, ResolvedTheme }\n","'use client'\n// sonner 공식 문서 : https://sonner.emilkowal.ski/\nimport React from 'react'\nimport { CircleCheck, CircleX, Info, TriangleAlert } from 'lucide-react'\nimport { ExternalToast, toast as sonnerToast, Toaster as SonnerToaster } from 'sonner'\n\nimport { useOptionalTheme } from './themeProvider'\n\n// sonner 기본 toast 사용\n\ntype ToastVariant = 'info' | 'success' | 'error' | 'warning'\n\ninterface ToastProps {\n id: string | number\n title: string\n description?: string | null\n variant?: ToastVariant\n toastOptions?: ExternalToast\n}\n\nfunction toast({ toastOptions, variant = 'info', ...toastData }: Omit<ToastProps, 'id'>) {\n const options = {\n position: 'top-right' as const,\n closeButton: true,\n duration: 10000,\n icon: variant ? icons[variant as keyof typeof icons] : undefined,\n richColors: true,\n classNames: {\n icon: 'self-start !w-[24px] !h-[24px]',\n },\n ...toastOptions,\n }\n\n // variant에 따라 적절한 sonner 메서드 사용\n switch (variant) {\n case 'success':\n return sonnerToast.success(toastData.title, {\n description: toastData.description,\n ...options,\n })\n case 'error':\n return sonnerToast.error(toastData.title, {\n description: toastData.description,\n ...options,\n })\n case 'warning':\n return sonnerToast.warning(toastData.title, {\n description: toastData.description,\n ...options,\n })\n default:\n return sonnerToast.info(toastData.title, {\n description: toastData.description,\n ...options,\n })\n }\n}\n\nconst icons = {\n success: <CircleCheck className='text-success30' />,\n info: <Info className='text-primary30' />,\n warning: <TriangleAlert className='text-critical30' />,\n error: <CircleX className='text-danger30' />,\n}\n\n/**\n * 화면 모서리에 잠깐 떴다 사라지는 알림(sonner). 앱 루트에 한 번 두고 `toast()` 로 띄운다.\n *\n * 언제 쓰나: 저장·삭제 완료, 서버 오류처럼 지나가도 되는 결과 알림. 성공은 짧게, 오류는 원인 한 줄.\n * 언제 안 쓰나: 화면에 남아 있어야 하는 안내·오류(→ Alert), 사용자의 확인이 필요한 것(→ AlertDialog), 폼 필드 오류(→ FormMessage).\n * 대신/함께: `ThemeProvider` 안에 두어야 다크 모드를 따라간다.\n */\nconst Toaster = React.forwardRef<\n React.ElementRef<typeof SonnerToaster>,\n React.ComponentPropsWithoutRef<typeof SonnerToaster>\n>((props, ref) => {\n const theme = useOptionalTheme()?.resolvedTheme\n return <SonnerToaster ref={ref} theme={theme} {...props} />\n})\nToaster.displayName = 'Toaster'\n\nexport { toast, Toaster }\n"]}