schummar-table 0.5.1 → 0.5.2
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/cjs/index.js +16 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/es/index.js +16 -6
- package/dist/es/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/hooks/useTheme.ts","../../src/components/autoFocusTextField.tsx","../../src/theme/useCssVariables.ts","../../src/components/datePicker.tsx","../../src/components/dateFilter.tsx","../../src/misc/helpers.ts","../../src/components/formControlLabel.tsx","../../src/misc/queue.ts","../../src/internalState/tableStateStorage.ts","../../src/internalState/calcItems.ts","../../src/internalState/calcProps.ts","../../src/internalState/cleanupState.ts","../../src/internalState/filterColumns.ts","../../src/internalState/syncSelections.ts","../../src/internalState/useTableState.ts","../../src/components/columnHeader.tsx","../../src/components/columnSelection.tsx","../../src/misc/csvExport.ts","../../src/components/export.tsx","../../src/components/filterControl.tsx","../../src/components/resizeHandle.tsx","../../src/components/cell.tsx","../../src/components/expandControl.tsx","../../src/components/selectComponent.tsx","../../src/components/row.tsx","../../src/components/sortComponent.tsx","../../src/misc/throttle.ts","../../src/components/virtualized.tsx","../../src/components/table.tsx","../../src/components/selectFilter.tsx","../../src/misc/debounce.ts","../../src/hooks/useFilter.ts","../../src/misc/textMatch.ts","../../src/components/textFilter.tsx"],"sourcesContent":["import { useTableContext } from '..';\n\nexport function useTheme() {\n const table = useTableContext();\n return table.useState('theme');\n}\n","import { ComponentType, useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { PopoverContext } from '../theme/defaultTheme/popover';\nimport { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const {\n components: { TextField },\n } = useTheme();\n\n const ref = useRef<HTMLInputElement>(null);\n const { visible } = useContext(PopoverContext);\n\n useLayoutEffect(() => {\n if (visible && ref.current) {\n ref.current.focus();\n }\n }, [visible]);\n\n return <TextField {...props} inputRef={ref} />;\n}\n","import { useTableContext } from '..';\n\nexport function useCssVariables() {\n const table = useTableContext();\n return table.useState((state) => ({\n '--spacing': state.theme.spacing,\n '--primaryMain': state.theme.colors.primary.main,\n '--primaryLight': state.theme.colors.primary.light,\n '--primaryContrastText': state.theme.colors.primary.contrastText,\n '--secondaryMain': state.theme.colors.secondary.main,\n '--secondaryLight': state.theme.colors.secondary.light,\n '--secondaryContrastText': state.theme.colors.secondary.contrastText,\n }));\n}\n","import { useDayzed } from 'dayzed';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTheme } from '..';\nimport { gray } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerProps = {\n value: Date | DateRange | null;\n onChange: (value: Date | DateRange | null) => void;\n rangeSelect?: boolean;\n locale?: string;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\nconst months = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] as const;\n\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\nexport const endOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport function dateIntersect(a: Date | null | DateRange, b: Date | null | DateRange) {\n if (a instanceof Date) {\n a = { min: a, max: a };\n }\n if (b instanceof Date) {\n b = { min: b, max: b };\n }\n\n if (!a?.min || !a.max || !b?.min || !b.max) {\n return false;\n }\n\n return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function DatePicker({ value, onChange, rangeSelect, locale, firstDayOfWeek = 0 }: DatePickerProps) {\n const {\n components: { IconButton },\n icons: { ChevronRight },\n } = useTheme();\n\n const [baseDate] = useState(new Date());\n const [dateInView, setDateInView] = useState<Date>(baseDate);\n const [currentMin, setCurrentMin] = useState<Date>();\n const [hovered, setHovered] = useState<Date>();\n\n const min = currentMin ?? (value instanceof Date ? value : value?.min);\n const max = currentMin ? undefined : value instanceof Date ? value : value?.max;\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) => setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n });\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) => format(new Date(Date.UTC(2021, 5, weekDay)));\n }, [locale]);\n\n useEffect(() => setDateInView(value === null ? new Date() : value instanceof Date ? value : value.max), [value]);\n\n return (\n <div>\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`}>\n <div\n css={{\n margin: 'calc(var(--spacing) * 4) 0',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <IconButton {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n <MonthSelector value={month} onChange={(month) => setDateInView(new Date(year, month))} locale={locale} />\n\n <YearSelector value={year} onChange={(year) => setDateInView(new Date(year, month))} />\n </div>\n\n <IconButton {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, max-content)',\n fontWeight: 'bold',\n }}\n >\n {weekDays.map((_v, weekDay) => (\n <div key={weekDay} css={{ justifySelf: 'center', marginBottom: 'var(--spacing)' }}>\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) =>\n week.map((dateObj, dayIndex) => {\n if (!dateObj) {\n return <div />;\n }\n\n const { prevMonth, nextMonth, date, today } = dateObj;\n\n const selected = date.getTime() === min?.getTime() || (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n (date.getTime() === hovered?.getTime() ||\n (min && !max && hovered && dateIntersect(date, min <= hovered ? { min, max: hovered } : { min: hovered, max: min })));\n\n return (\n <button\n key={`${index}-${dayIndex}`}\n css={[\n {\n padding: 10,\n border: '1px solid transparent',\n background: 'transparent',\n cursor: 'pointer',\n },\n (prevMonth || nextMonth) && {\n color: gray,\n },\n today && {\n border: '1px solid var(--secondaryMain)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ]}\n {...getDateProps({ dateObj })}\n onClick={() => {\n if (!rangeSelect) {\n setCurrentMin(undefined);\n onChange(date);\n } else if (min && !max) {\n setCurrentMin(undefined);\n if (date > min) {\n onChange({ min, max: date });\n } else {\n onChange({ min: date, max: min });\n }\n } else {\n setCurrentMin(date);\n }\n }}\n onPointerOver={() => setHovered(date)}\n onPointerOut={() => setHovered(undefined)}\n >\n {date.getDate()}\n </button>\n );\n }),\n )}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction MonthSelector({ value, onChange, locale }: { value: number; onChange: (month: number) => void; locale?: string }) {\n const {\n components: { Popover },\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element>();\n\n const formatMonth = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n return (month: number) => format(new Date(2021, month));\n }, [locale]);\n\n return (\n <>\n <button\n css={{\n border: 'none',\n background: 'transparent',\n fontSize: 'inherit',\n cursor: 'pointer',\n }}\n onClick={(e) => setAnchor(e.currentTarget)}\n >\n {formatMonth(value)}\n </button>\n\n <Popover open={!!anchor} anchorEl={anchor ?? null} onClose={() => setAnchor(undefined)} align=\"center\" css={cssVariables}>\n <div\n css={{\n display: 'grid',\n }}\n >\n {months.map((month) => (\n <button\n key={month}\n css={[\n {\n padding: 'var(--spacing)',\n border: 'none',\n background: 'transparent',\n\n '&:hover': {\n background: 'var(--primaryLight)',\n },\n },\n month === value && { background: 'var(--primaryMain)' },\n ]}\n onClick={() => onChange(month)}\n >\n {formatMonth(month)}\n </button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n\nfunction YearSelector({ value, onChange, locale }: { value: number; onChange: (year: number) => void; locale?: string }) {\n const [input, setInput] = useState<string>();\n const ref = useRef<HTMLInputElement>(null);\n\n function apply() {\n onChange(Number(input));\n setInput(undefined);\n }\n\n const formatYear = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n return (year: number) => format(new Date(year, 0, 1));\n }, [locale]);\n\n useLayoutEffect(() => ref.current?.focus(), [ref.current]);\n\n if (input === undefined) {\n return <div onClick={() => setInput(String(value))}>{formatYear(value)}</div>;\n }\n\n return (\n <input\n ref={ref}\n css={{ width: '4ch' }}\n value={input}\n onChange={(e) => {\n if (e.target.value.match(/^\\d{0,4}$/)) {\n setInput(e.target.value);\n }\n }}\n onBlur={apply}\n onKeyPress={(e) => e.key === 'Enter' && apply()}\n ></input>\n );\n}\n","import React, { useMemo } from 'react';\nimport { useFilter, useTheme } from '..';\nimport { CommonFilterProps } from '../types';\nimport { dateIntersect, DatePicker, DatePickerProps, DateRange, endOfDay, startOfDay } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n if (x instanceof Date) return x;\n if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n if (x instanceof Object && 'min' in x && 'max' in x) {\n const range = {\n min: convertDate((x as any).min),\n max: convertDate((x as any).max),\n };\n return range.min && range.max ? (range as DateRange) : null;\n }\n return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n if (x instanceof Array) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<T, V>({\n locale,\n firstDayOfWeek,\n singleSelect,\n filterBy = convertDateOrArray,\n ...props\n}: {\n locale?: string;\n firstDayOfWeek?: DatePickerProps['firstDayOfWeek'];\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, Date | DateRange | null, Date | DateRange | null>): JSX.Element {\n const {\n components: { Button },\n text,\n } = useTheme();\n\n const { value = null, onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'dateFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return dateIntersect(filterValue, value);\n },\n });\n\n const formatDate = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { dateStyle: 'medium' });\n return format;\n }, [locale]);\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n {!singleSelect && (\n <div\n css={{\n marginBottom: 'var(--spacing)',\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n {value ? formatDate(value instanceof Date ? value : value.min) : ''} -{' '}\n {value ? formatDate(value instanceof Date ? value : value.max) : ''}\n </div>\n )}\n\n <DatePicker rangeSelect={!singleSelect} value={value} onChange={onChange} locale={locale} firstDayOfWeek={firstDayOfWeek} />\n\n <div css={{ marginTop: 'var(--spacing)', display: 'grid', gridAutoFlow: 'column', justifyContent: 'center' }}>\n <Button variant=\"text\" onClick={() => onChange(today())}>\n {text.today}\n </Button>\n\n <Button variant=\"text\" onClick={() => onChange(thisWeek(firstDayOfWeek))}>\n {text.thisWeek}\n </Button>\n\n <Button variant=\"text\" onClick={() => onChange(null)}>\n {text.reset}\n </Button>\n </div>\n </div>\n );\n}\n\nexport const today = (): DateRange => {\n const today = startOfDay(new Date());\n return { min: today, max: today };\n};\n\nexport const thisWeek = (firstDayOfWeek = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n\n let diff = min.getDay() - firstDayOfWeek;\n if (diff < 0) {\n diff += 7;\n }\n min.setDate(min.getDate() - diff);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return { min: startOfDay(min), max: endOfDay(max) };\n};\n","import { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(arr: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...arr].reduce<S[]>((out, cur) => out.concat(flatMap(cur)), []);\n};\n\nexport const orderBy = <T>(arr: T[], selectors: ((t: T) => any)[] = [], direction: ('desc' | 'asc')[] = []): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...arr].sort((a, b) => {\n for (let i = 0; i < selectors.length; i++) {\n const _a = selectors[i]?.(a);\n const _b = selectors[i]?.(b);\n const dir = direction[i] === 'desc' ? -1 : 1;\n if (_a > _b) return dir;\n if (_a < _b) return -dir;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(arr: T[]): T[] => {\n const set = new Set<T>();\n for (const t of arr) set.add(t);\n return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n const result = new Set<T>();\n for (const x of a) if (b.has(x)) result.add(x);\n return result;\n};\n\nexport const getAncestors = <T>(activeItemsById: Map<Id, TableItem<T>>, ...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent = parentId ? activeItemsById.get(parentId) : undefined;\n if (parent && !result.has(parent.id)) {\n result.add(parent.id);\n find(parent);\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = (item: TableItem<T>): void => {\n for (const child of item.children) {\n if (!result.has(child.id)) {\n result.add(child.id);\n find(child);\n }\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n if (x instanceof Array) return x.map(asString).join(', ');\n if (x instanceof Object) return JSON.stringify(x);\n return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n if (x instanceof Array) return x.map(asString);\n return asString(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean => a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (a instanceof Array ? a : [a]);\n\nexport const cx = (...classNames: (string | false | undefined | null | Record<string, boolean>)[]) =>\n classNames\n .flatMap((entry) => {\n if (!entry) return [];\n if (typeof entry === 'string') return [entry];\n return Object.entries(entry)\n .filter(([, predicate]) => predicate)\n .map(([className]) => className);\n })\n .join(' ');\n","import { ReactNode } from 'react';\n\nexport function FormControlLabel({ control, label, disabled }: { control: ReactNode; label: ReactNode; disabled?: boolean }) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","export class Queue {\n private q = new Array<{ job: () => Promise<any>; resolve: (value: any) => void; reject: (reason?: any) => void }>();\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n if (!this.isRunning) this.start();\n });\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useState } from 'react';\nimport { useTableContext } from '..';\nimport { Queue } from '../misc/queue';\nimport { SerializableValue } from '../types';\n\nconst KEYS = ['sort', 'selection', 'expanded', 'hiddenColumns', 'filterValues', 'columnWidths', 'columnOrder'] as const;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: SerializableValue) {\n function prepare(value: SerializableValue): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (value instanceof Array) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\nexport function useTableStateStorage() {\n const table = useTableContext();\n const [isHydrated, setIsHydrated] = useState(false);\n\n // On mount: load\n useEffect(() => {\n const { persist } = table.getState().props;\n if (!persist) {\n setIsHydrated(true);\n return;\n }\n\n let isCanceled = false;\n\n (async () => {\n try {\n const { storage, id = 'table', include, exclude } = persist;\n const json = await storage.getItem(`${id}_state`);\n if (isCanceled || !json) return;\n\n const data = parse(json);\n table.getState().props.debug?.('load', json, data);\n\n table.update((state) => {\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key) &&\n key in data\n ) {\n if (key === 'filterValues') {\n for (const [id, value] of data[key]) {\n if (state.filters.get(id)?.persist ?? true) {\n state.filterValues.set(id, value);\n }\n }\n } else {\n state[key] = data[key];\n\n if (key === 'expanded' || key === 'hiddenColumns' || key === 'selection' || key === 'sort') {\n state.props[`on${(key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>}Change`]?.(data[key]);\n }\n }\n }\n }\n });\n } catch (e) {\n console.error('Failed to load table state:', e);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n const q = new Queue();\n\n return table.subscribe(\n (state) => {\n if (!state.props.persist) return;\n\n const { storage, id = 'table', include, exclude } = state.props.persist;\n const data: any = {};\n\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key)\n ) {\n if (key === 'filterValues') {\n data[key] = new Map();\n for (const [id, value] of state.filterValues) {\n if (state.filters.get(id)?.persist ?? true) {\n data.filterValues.set(id, value);\n }\n }\n } else {\n data[key] = state[key];\n }\n }\n }\n\n return { storage, id, data };\n },\n (props) => {\n if (!props) return;\n const { storage, id, data } = props;\n\n table.getState().props.debug?.('save', data, stringify(data));\n q.run(async () => {\n await storage.setItem(`${id}_state`, stringify(data));\n }, true);\n },\n { throttle: 1000 },\n );\n }, [isHydrated]);\n\n return isHydrated;\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.items,\n state.props.id,\n state.props.parentId,\n state.props.revealFiltered,\n state.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n ([items = [], id, parentId, revealFiltered, sort, filters, filterValues, activeColumns], draft) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n ...item,\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n }));\n\n let sorted;\n if (sort.length === 0) {\n sorted = tableItems;\n } else {\n const selectors = flatMap(sort, (sort) => {\n const column = activeColumns.find((column) => column.id === sort.columnId);\n if (!column) return [];\n const sortBy = column.sortBy instanceof Array ? column.sortBy : [column.sortBy];\n return sortBy.map((sortBy) => ({ selector: (item: T) => sortBy(column.value(item), item), direction: sort.direction }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => x.selector),\n selectors.map((x) => x.direction),\n );\n }\n\n const lookup = new Map<Id, TableItem<T>>();\n for (const item of sorted) {\n lookup.set(item.id, item);\n }\n\n for (const item of sorted) {\n const parent = item.parentId !== undefined ? lookup.get(item.parentId) : undefined;\n parent?.children.push(item);\n }\n\n const allItems = new Array<TableItem<T>>();\n const allItemsById = new Map<Id, TableItem<T>>();\n\n const traverse = (items: TableItem<T>[]): void => {\n for (const item of items) {\n allItems.push(item);\n allItemsById.set(item.id, item);\n traverse(item.children);\n }\n };\n traverse(sorted.filter((item) => item.parentId === undefined));\n\n let expandedChanged = false;\n const activeItemsById = new Map<Id, TableItem<T>>();\n const activeSet = new Set<Id>();\n const activeItems = [...allItems]\n .reverse()\n .filter((item) => {\n let isActive = activeSet.has(item.id);\n\n isActive ||= activeColumns.every((column) => {\n const filter = filters.get(column.id);\n if (!filter) return true;\n\n const filterValue = filterValues.get(column.id);\n if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n const filterBy = filter.filterBy ?? ((x) => x);\n const value = filterBy(column.value(item), item);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined) {\n if (\n revealFiltered &&\n Array.from(filters.entries()).some(([id, filter]) => {\n const filterValue = filterValues.get(id);\n return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n })\n ) {\n expandedChanged ||= !draft.expanded.has(item.parentId);\n draft.expanded.add(item.parentId);\n } else if (!draft.expanded.has(item.parentId)) {\n isActive = false;\n }\n }\n\n if (isActive && item.parentId !== undefined) {\n activeSet.add(item.parentId);\n }\n if (isActive) {\n activeItemsById.set(item.id, item);\n }\n\n return isActive;\n })\n .reverse();\n\n draft.items = castDraft(allItems);\n draft.itemsById = castDraft(allItemsById);\n draft.activeItems = castDraft(activeItems);\n draft.activeItemsById = castDraft(activeItemsById);\n\n if (expandedChanged) {\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(state.getState().expanded);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useMemo, useRef } from 'react';\nimport { asString } from '../misc/helpers';\nimport { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst noopParentId = () => undefined;\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const columnCache = useRef(new Map<string | number, [any[], InternalColumn<T, any>]>());\n\n return useMemo(() => {\n let id;\n if (props.id instanceof Function) {\n id = props.id;\n } else {\n id = (item: T) => item[props.id as keyof T] as unknown as Id;\n }\n\n let parentId;\n if (props.parentId instanceof Function) {\n parentId = props.parentId;\n } else if (typeof props.parentId === 'string') {\n parentId = (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined;\n } else {\n parentId = noopParentId;\n }\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else {\n inputColumns = props.columns.map((column) => ({ ...column, dependecies: undefined }));\n }\n\n const newColumnCache = new Map<string | number, [any[], InternalColumn<T, any>]>();\n\n const columns = inputColumns.map<InternalColumn<T, any>>(function <V>(\n {\n id,\n header = null,\n renderCell = asString,\n exportCell = asString,\n sortBy = (v) => (typeof v === 'number' || v instanceof Date ? v : String(v)),\n dependencies = [],\n ...props\n }: Column<T, V>,\n index: number,\n ) {\n const [depsInCache, columnInCache] = columnCache.current.get(id ?? index) ?? [];\n\n let column;\n if (\n depsInCache &&\n columnInCache &&\n depsInCache.length === dependencies.length &&\n depsInCache.every((x, i) => dependencies[i] === x)\n ) {\n column = columnInCache;\n } else {\n column = {\n id: id ?? index,\n header,\n renderCell,\n exportCell,\n sortBy,\n dependencies,\n ...props,\n };\n }\n\n newColumnCache.set(id ?? index, [dependencies, column]);\n return column;\n });\n\n columnCache.current = newColumnCache;\n\n let copy;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.copy === true)) {\n copy = { separator: '\\t' };\n } else if (props.enableExport && props.enableExport.copy instanceof Object) {\n copy = props.enableExport.copy;\n }\n\n let download;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.download === true)) {\n download = { sepPrefix: true };\n } else if (props.enableExport && props.enableExport.download instanceof Object) {\n download = props.enableExport.download;\n }\n\n const enableExport = { copy, download };\n\n return {\n ...props,\n id,\n parentId,\n columns,\n enableSelection: props.enableSelection ?? true,\n selectSyncChildren: props.selectSyncChildren ?? true,\n stickyHeader: props.stickyHeader ?? true,\n enableExport,\n enableColumnSelection: props.enableColumnSelection ?? true,\n enableColumnResize: props.enableColumnResize ?? true,\n enableColumnReorder: props.enableColumnReorder ?? true,\n };\n }, [props]);\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.itemsById, state.activeItemsById, state.activeColumns] as const,\n ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n const columnIds = new Set(columns.map((column) => column.id));\n const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n // Remove sort entries for non active columns\n const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n if (newSort.length < draft.sort.length) {\n draft.sort = newSort;\n draft.props.onSortChange?.(newSort);\n }\n\n // Remove filters for non active columns\n for (const id of draft.filters.keys()) {\n if (!activeColumnIds.has(id)) draft.filters.delete(id);\n }\n\n // Remove filterValues for non active columns\n for (const id of draft.filterValues.keys()) {\n if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n }\n\n // Remove hiddenColumns for non existing columns\n for (const id of draft.hiddenColumns.keys()) {\n if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n }\n\n // Remove columnWidth for non existing columns\n for (const id of draft.columnWidths.keys()) {\n if (!columnIds.has(id)) draft.columnWidths.delete(id);\n }\n\n // Remove non existing columns from columnOrder\n for (const id of draft.columnOrder) {\n if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n }\n\n if (draft.props.items) {\n // Remove selection for non active items\n const newSelection = intersect(draft.selection, activeItemsById);\n if (newSelection.size !== draft.selection.size) {\n draft.selection = newSelection;\n draft.props.onSelectionChange?.(newSelection);\n }\n\n // Remove expanded for non existing items\n const newExpanded = intersect(draft.expanded, itemsById);\n if (newExpanded.size < draft.expanded.size) {\n draft.expanded = newExpanded;\n draft.props.onExpandedChange?.(newExpanded);\n }\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.hiddenColumns, state.columnOrder] as const,\n ([columns, hiddenColumns, columnOrder], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !hiddenColumns.has(column.id)),\n [(column) => columnOrder.indexOf(column.id)],\n );\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState } from '../types';\n\nexport function syncSelections<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n ([selectSyncChildren, selection, activeItems], state) => {\n if (!selectSyncChildren) return;\n\n const newSelection = new Set(selection);\n for (const item of activeItems) {\n if (item.parentId !== undefined && newSelection.has(item.parentId)) {\n newSelection.add(item.id);\n }\n }\n\n if (newSelection.size !== selection.size) {\n state.selection = newSelection;\n state.props.onSelectionChange?.(newSelection);\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTableTheme } from '../theme/tableTheme';\nimport { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { syncSelections } from './syncSelections';\n\nexport function useTableState<T>(_props: TableProps<T>): Store<InternalTableState<T>> {\n const props = calcProps(_props);\n const theme = useTableTheme(props);\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n props,\n theme,\n\n sort: props.defaultSort ?? [],\n selection: props.defaultSelection ?? new Set(),\n expanded: props.defaultExpanded ?? new Set(),\n rowHeights: new Map(),\n filters: new Map(),\n filterValues: new Map(),\n hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n columnWidths: new Map(),\n columnOrder: props.columns.map((column) => column.id),\n columnStyleOverride: new Map(),\n\n activeColumns: [],\n items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n }),\n [],\n );\n\n filterColumns(state);\n calcItems(state);\n syncSelections(state);\n cleanupState(state);\n\n useEffect(() => {\n state.update((state) => {\n state.props = castDraft(props);\n if (props.sort) state.sort = props.sort;\n if (props.selection) state.selection = props.selection;\n if (props.expanded) state.expanded = props.expanded;\n if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n for (const column of props.columns) {\n if (!state.columnOrder.includes(column.id)) {\n const index = props.columns.indexOf(column);\n state.columnOrder.splice(index, 0, column.id);\n }\n }\n state.theme = theme;\n });\n }, [state, props]);\n\n return state;\n}\n","import { castDraft } from 'immer';\nimport React, { HTMLProps, useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { Id, useColumnContext, useTableContext } from '..';\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader(props: HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState('props.enableColumnReorder');\n\n const store = ColumnHeaderContext.useStore();\n const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n const clone = useRef<HTMLDivElement>();\n\n // Track each headers div in a store\n useEffect(() => {\n const div = ref.current;\n if (!div) return;\n\n store.update((state) => {\n state.items.set(columnId, castDraft(div));\n });\n\n return () => {\n store.update((state) => {\n state.items.delete(columnId);\n });\n };\n }, [ref.current, store, columnId]);\n\n // Calculate which index the current header would get, given the current offset\n function calcTargetIndex(offsetLeft: number) {\n const cols = table.getState().columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n const otherCols = cols.filter((col) => col.id !== columnId);\n\n const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n let sum = 0;\n const targetIndex = otherCols.findIndex((col) => {\n const width = col.div?.offsetWidth ?? 0;\n if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n sum += width;\n return false;\n });\n\n return targetIndex === -1 ? otherCols.length : targetIndex;\n }\n\n // When starting clicking: Record initial mouse and div's bounds\n function onPointerDown(e: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: e.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined || Math.abs(e.clientX - draggingStart.current.mouseX) < 5) return;\n\n e.stopPropagation();\n div.setPointerCapture(e.pointerId);\n\n // Create clone of header div to move around with mouse\n if (!clone.current) {\n clone.current = div.cloneNode(true) as HTMLDivElement;\n document.body.append(clone.current);\n\n for (const [key, value] of Object.entries(getComputedStyle(div))) {\n try {\n clone.current.style[key as any] = value;\n } catch {\n // ignore\n }\n }\n\n Object.assign(clone.current.style, {\n pointerEvents: 'none',\n position: 'fixed',\n boxShadow: '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n left: `${draggingStart.current.bounds.left}px`,\n top: `${draggingStart.current.bounds.top}px`,\n });\n\n div.style.color = 'rgba(0, 0, 0, 0.2)';\n }\n\n // Update clone's position each time\n clone.current.style.left = `${draggingStart.current.bounds.left + e.clientX - draggingStart.current.mouseX}px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n // Apply transforms to each column\n const columns = table\n .getState()\n .columnOrder.map((id, index) => ({ id, index, width: store.getState().items.get(id)?.offsetWidth ?? 0 }));\n\n state.columnOrder.forEach((id, i) => {\n let offset = 0;\n if (i === index) {\n // Current column: Move to target pos\n if (targetIndex > index) {\n offset = columns.slice(index + 1, targetIndex + 1).reduce((sum, col) => sum + col.width, 0);\n } else if (targetIndex < index) {\n offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n }\n } else if (i >= targetIndex && i < index) {\n // Left columns: Move right to make room if needed\n offset = div.offsetWidth;\n } else if (i > index && i <= targetIndex) {\n // Right columns: Move left to make room if needed\n offset = -div.offsetWidth;\n }\n\n state.columnStyleOverride.set(id, {\n transition: 'transform 500ms',\n transform: `translate3d(${offset}px, 0, 0)`,\n zIndex: i === index ? 1 : undefined,\n });\n });\n });\n }\n\n // When releasing mouse: Reset draggin state and apply column move\n function onPointerUp(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined) return;\n\n // Apply column move\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n state.columnOrder.splice(index, 1);\n state.columnOrder.splice(targetIndex, 0, columnId);\n\n // Cleanup\n clone.current?.remove();\n div.style.color = '';\n state.columnStyleOverride.clear();\n draggingStart.current = undefined;\n clone.current = undefined;\n });\n }\n\n return (\n <div\n {...props}\n css={{\n position: 'relative',\n userSelect: 'none',\n }}\n ref={ref}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n {props.children}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const {\n components: { IconButton, Popover, Checkbox },\n icons: { Settings },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const columns = table.useState('props.columns');\n const hiddenColumns = table.useState('hiddenColumns');\n\n const [anchorEl, setAnchorEl] = useState<Element | null>(null);\n\n const toggle = (column: InternalColumn<T, unknown>) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n if (hiddenColumns.has(column.id)) newValue.delete(column.id);\n else newValue.add(column.id);\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchorEl(anchorEl ? null : e.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover anchorEl={anchorEl} open={!!anchorEl} onClose={() => setAnchorEl(null)} css={cssVariables}>\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.selectColumns}</div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={<Checkbox checked={!hiddenColumns.has(column.id)} onChange={() => toggle(column)} disabled={column.cannotHide} />}\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","export type CsvExportOptions = { sepPrefix?: boolean; separator?: string; quote?: string; eol?: string };\n\nexport function csvExport(\n data: (string | number)[][],\n { sepPrefix, separator = ',', quote = '\"', eol = '\\n' }: CsvExportOptions = {},\n): string {\n const cells = data.map((line) =>\n line.map((value) => {\n if (typeof value === 'number') return String(value);\n if (![separator, quote, eol].some((c) => value.includes(c))) return value;\n\n const clean = value.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol);\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { csvExport, CsvExportOptions } from '../misc/csvExport';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useTableContext } from './table';\n\nexport function Export<T>(): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Button, IconButton, Popover },\n icons: { Export, Clipboard },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n const generate = (options?: CsvExportOptions) => {\n const { activeColumns, activeItems } = table.getState();\n\n const data = [\n activeColumns.map((column) => String(column.id)),\n ...activeItems.map((item) => activeColumns.map((column) => column.exportCell(column.value(item), item))),\n ];\n return csvExport(data, options);\n };\n\n const copy = () => {\n navigator.clipboard.writeText(generate(table.getState().props.enableExport.copy));\n };\n\n const download = () => {\n const a = document.createElement('a');\n a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(generate(table.getState().props.enableExport.download));\n a.download = 'export.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchor(anchor ? null : e.currentTarget)}>\n <Export css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover open={!!anchor} onClose={() => setAnchor(null)} anchorEl={anchor} css={cssVariables}>\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.exportTitle}</div>\n <Button startIcon={<Clipboard />} onClick={copy}>\n {text.exportCopy}\n </Button>\n <Button startIcon={<Export />} onClick={download}>\n {text.exportDownload}\n </Button>\n </div>\n </Popover>\n </>\n );\n}\n","import React, { createContext, useCallback, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useColumnContext, useTableContext } from './table';\n\nexport const FilterControlContext = createContext((): void => void 0);\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { IconButton, Popover },\n icons: { FilterList, ArrowDropDown },\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n const filter = table.useState((state) => state.activeColumns.find((column) => column.id === columnId)?.filter);\n\n function reset() {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n\n const close = useCallback(function () {\n setAnchor(null);\n }, []);\n\n if (!filter) return null;\n\n return (\n <FilterControlContext.Provider value={close}>\n <div\n onClick={(e) => setAnchor(e.currentTarget)}\n onContextMenu={(e) => {\n reset();\n e.preventDefault();\n return false;\n }}\n >\n <IconButton\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n </div>\n\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onPointerMove={(e) => {\n e.stopPropagation();\n }}\n >\n <Popover open hidden={!anchor} onClose={() => setAnchor(null)} anchorEl={anchor ?? document.body} css={cssVariables}>\n {filter}\n </Popover>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import React, { HTMLProps } from 'react';\nimport { useColumnContext, useTableContext } from '..';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState('props.enableColumnResize');\n\n function onPointerDown(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.setPointerCapture(e.pointerId);\n }\n\n function onPointerMove(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n if (!div.hasPointerCapture(e.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const width = Math.max(e.clientX - parent.getBoundingClientRect().left + 5, 50);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.releasePointerCapture(e.pointerId);\n }\n\n function onDoubleClick(e: React.MouseEvent) {\n table.update((state) => {\n if (e.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n onDoubleClick={enabled ? onDoubleClick : undefined}\n />\n );\n}\n\nexport function ResizeHandleView({ enabled, ...props }: HTMLProps<HTMLDivElement> & { enabled?: boolean }) {\n return (\n <div\n css={{\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n }}\n {...props}\n />\n );\n}\n","import React, { memo } from 'react';\nimport { Id, useColumnContext, useTableContext, useTheme } from '..';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { calcClassNames } from './row';\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const { classes } = useTheme();\n\n const column = table.useState((state) => state.activeColumns.find((column) => column.id === columnId));\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), { throttle: 16 });\n\n if (!column || !item) return null;\n table.getState().props.debugRender?.('render cell', itemId, columnId);\n\n const classNames = [...calcClassNames(classes, item, rowIndex), ...calcClassNames(column?.classes, item, rowIndex)];\n const content = column.renderCell(column.value(item), item);\n\n return (\n <div className={cx(...classNames)} css={[defaultClasses.cell, classNames, columnStyleOverride]}>\n {typeof content === 'string' ? (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n ) : (\n content\n )}\n </div>\n );\n});\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function ExpandControl<T>({ itemId, hasDeferredChildren }: { itemId: Id; hasDeferredChildren?: boolean }): JSX.Element {\n const {\n components: { IconButton, Spinner },\n icons: { ChevronRight },\n } = useTheme();\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState((state) => !!state.activeItemsById.get(itemId)?.children.length);\n\n function toggle() {\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n if (expandOnlyOne) newExpanded.clear();\n if (isExpanded) newExpanded.delete(itemId);\n else {\n newExpanded.add(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\n }\n\n onExpandedChange?.(newExpanded);\n\n if (!controlledExpanded) {\n table.update((state) => {\n state.expanded = newExpanded;\n });\n }\n }\n\n if (isExpanded && hasDeferredChildren && !hasChildren) {\n return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span\n css={{\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n }}\n >\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Checkbox },\n } = useTheme();\n\n const isSelected = table.useState((state) => {\n const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n });\n\n function toggle(e: React.ChangeEvent) {\n const mouseEvent = e.nativeEvent as MouseEvent;\n\n const {\n activeItems,\n activeItemsById,\n lastSelectedId,\n selection,\n props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n } = table.getState();\n\n let range;\n if (mouseEvent.shiftKey && itemId) {\n const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n const b = activeItems.findIndex((item) => item.id === itemId);\n range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const newSelection = new Set(selection);\n for (const item of range) {\n if (isSelected) newSelection.delete(item.id);\n else newSelection.add(item.id);\n }\n\n if (selectSyncChildren && isSelected) {\n for (const ancestor of getAncestors(activeItemsById, ...range)) {\n newSelection.delete(ancestor);\n }\n for (const descendant of getDescendants(...range)) {\n newSelection.delete(descendant);\n }\n }\n\n onSelectionChange?.(newSelection);\n\n if (!controlledSelection) {\n table.update((state) => {\n state.selection = newSelection;\n });\n }\n\n table.update((state) => {\n state.lastSelectedId = itemId;\n });\n }\n\n return (\n <Checkbox\n css={{\n justifySelf: 'start',\n color: '#c9cfda',\n }}\n checked={isSelected}\n onChange={toggle}\n />\n );\n}\n","import React, { memo, useEffect, useRef } from 'react';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id, InternalColumn } from '../types';\nimport { Cell } from './cell';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\nimport { ColumnContext, useTableContext } from './table';\n\nexport function calcClassNames<T>(classes: InternalColumn<any, any>['classes'] | undefined, item: T, index: number) {\n return [\n classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n index % 2 === 0 && classes?.evenCell,\n index % 2 === 1 && classes?.oddCell,\n ];\n}\n\nexport const Row = memo(function Row<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n\n const { className, indent, hasChildren, hasDeferredChildren, columnIds, enableSelection, rowAction } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n const index = !item ? -1 : state.activeItems.indexOf(item);\n\n return {\n className: cx(...calcClassNames(state.props.classes, item, index)),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item),\n columnIds: state.activeColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction: state.props.rowAction instanceof Function ? (item ? state.props.rowAction(item, index) : null) : state.props.rowAction,\n };\n });\n\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n const o = new ResizeObserver(() => {\n if (!document.contains(div)) return;\n table.update((state) => {\n state.rowHeights.set(itemId, div.offsetHeight);\n });\n });\n o.observe(div);\n\n return () => o.disconnect();\n }, [divRef.current]);\n\n table.getState().props.debugRender?.('render row', itemId);\n\n return (\n <>\n <div className={className} css={[defaultClasses.cellFill]} ref={divRef} />\n\n <div className={className} css={[defaultClasses.cell, defaultClasses.firstCell]}>\n <div css={{ width: indent * 20 }} />\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren) && <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />}\n\n {rowAction}\n </div>\n\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <Cell itemId={itemId} rowIndex={rowIndex} />\n </ColumnContext.Provider>\n ))}\n\n <div className={className} css={[defaultClasses.cellFill]} />\n </>\n );\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme } from '..';\nimport { useColumnContext, useTableContext } from './table';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { Badge },\n icons: { ArrowUpward },\n } = useTheme();\n\n const { direction, index } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n };\n });\n\n function toggle(e: React.MouseEvent, off?: boolean) {\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort = e.getModifierState('Control') || off ? table.getState().sort.filter((s) => s.columnId !== columnId) : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n onSortChange?.(newSort);\n\n if (!controlledSort) {\n table.update((state) => {\n state.sort = newSort;\n });\n }\n\n e.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n\n '& > div': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n onClick={(e) => toggle(e)}\n onContextMenu={(e) => toggle(e, true)}\n >\n <div>{children}</div>\n\n <Badge badgeContent={index}>\n <span\n css={[\n { transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n </div>\n );\n}\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: NodeJS.Timeout | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return Object.assign(\n function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n },\n {\n flush() {\n if (lastArgs) {\n run();\n }\n },\n },\n );\n}\n","import React, { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\nimport { useTableContext } from './table';\nimport { Id } from '../types';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n const parent = x.parentElement;\n if (!parent) return document.documentElement;\n if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible') return parent;\n return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n return 0;\n};\n\nexport function Virtualized<T>({\n header,\n children,\n ...props\n}: { header: ReactNode; children: (itemIds: Id[], startIndex: number) => ReactNode } & HTMLProps<HTMLDivElement>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState('props.virtual');\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setCounter] = useState(0);\n\n const {\n itemIds = [],\n from = 0,\n to,\n before = 0,\n after = 0,\n } = table.useState(\n (state) => {\n const itemIds = state.activeItems.map((item) => item.id);\n const root = probeRef.current && findScrollRoot(probeRef.current);\n if (!state.props.virtual) return { itemIds };\n if (!probeRef.current || !root || !document.contains(root)) return {};\n\n const {\n rowHeight,\n initalRowHeight,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n let totalHeight = 0;\n const rowHeights = itemIds.map((itemId, index) => {\n const h = rowHeight ?? state.rowHeights.get(itemId) ?? initalRowHeight ?? (index === 0 ? 100 : totalHeight / index);\n totalHeight += h;\n return h;\n });\n\n const probeOffset = relativeOffset(probeRef.current, root);\n const headerHeight = probeRef.current.offsetTop;\n const topOfTable = root.scrollTop - probeOffset + headerHeight;\n const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n let from = 0,\n to = itemIds.length,\n before = 0,\n after = 0;\n for (const h of rowHeights) {\n if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n from++;\n before += h;\n }\n\n for (const h of rowHeights.reverse()) {\n if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n to--;\n after += h;\n }\n\n return { itemIds: itemIds.slice(from, to), from, to, before, after };\n },\n { throttle: 16 },\n );\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const incCounter = useMemo(() => throttle(() => setCounter((c) => c + 1), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', incCounter, true);\n return () => {\n window.removeEventListener('scroll', incCounter, true);\n };\n }, [probeRef.current, incCounter]);\n\n table.getState().props.debugRender?.(`Virtualalized render ${from} to ${to}`);\n\n return (\n <div {...props}>\n {header}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n {children(itemIds, from)}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n </div>\n );\n}\n","import React, { createContext, memo, useContext, useEffect, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTheme } from '..';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { Id, InternalTableState, TableProps } from '../types';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle, ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { SortComponent } from './sortComponent';\nimport { Virtualized } from './virtualized';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\nexport const ColumnContext = createContext<Id | null>(null);\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw Error('No column context available');\n return value;\n}\n\nexport function Table<T>(props: TableProps<T>): JSX.Element {\n const table = useTableState(props);\n\n table.getState().props.debugRender?.('render table');\n\n return (\n <TableContext.Provider value={table}>\n <TableLoadingState />\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState() {\n const { text } = useTheme();\n const isHydrated = useTableStateStorage();\n const [showLoading, setShowLoading] = useState(false);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n });\n\n return (\n <>\n {!isHydrated && showLoading && <div>{text.loading}</div>}\n <TableInner hidden={!isHydrated} />\n </>\n );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n const table = useTableContext<T>();\n const fullWidth = table.useState('props.fullWidth');\n const activeColumns = table.useState((state) =>\n state.activeColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n header: column.header,\n })),\n );\n const columnWidths = table.useState('columnWidths', { throttle: 16 });\n const columnStyleOverride = table.useState('columnStyleOverride', { throttle: 16 });\n const defaultWidth = table.useState('props.defaultWidth');\n const classes = table.useState('props.classes');\n const stickyHeader = table.useState('props.stickyHeader');\n const enableSelection = table.useState('props.enableSelection');\n const enableColumnSelection = table.useState('props.enableColumnSelection');\n const enableExport = table.useState((state) => !!state.props.enableExport.copy || !!state.props.enableExport.download);\n const cssVariables = useCssVariables();\n\n table.getState().props.debugRender?.('render table inner');\n\n return (\n <Virtualized\n className={classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n {\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...activeColumns.map((column) => columnWidths.get(column.id) ?? column.width ?? defaultWidth ?? 'max-content'),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n },\n hidden && { visibility: 'hidden' },\n ]}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerCell, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n <ResizeHandleView />\n </div>\n\n <ColumnHeaderContext.Provider>\n {activeColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader\n className={cx(classes?.headerCell, column.classes?.headerCell)}\n css={[\n defaultClasses.headerCell,\n columnStyleOverride.get(column.id),\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n key={column.id}\n >\n <SortComponent>{column.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </ColumnHeader>\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n </>\n }\n >\n {(itemIds, startIndex) => itemIds.map((itemId, index) => <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />)}\n </Virtualized>\n );\n});\n","import React, { ReactNode, useState } from 'react';\nimport { useColumnContext, useFilter, useTheme } from '..';\nimport { asString, castArray, flatMap, uniq } from '../misc/helpers';\nimport { CommonFilterProps, InternalColumn, SerializableValue } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nexport function SelectFilter<T, V, F extends SerializableValue>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n ...props\n}: {\n options?: F[];\n stringValue?: (value: F) => string;\n render?: (value: F) => ReactNode;\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, F, Set<F>>): JSX.Element {\n const {\n components: { IconButton, Checkbox },\n icons: { Search, Clear },\n text,\n } = useTheme();\n\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const options = table.useState((state) => {\n if (providedOptions) return uniq(providedOptions);\n\n const column = state.activeColumns.find((column) => column.id === columnId) as InternalColumn<T, V> | undefined;\n if (!column) return [];\n\n const filterBy = props.filterBy ?? ((x) => x as unknown as F | F[]);\n\n return uniq(flatMap(state.items, (item) => castArray(filterBy(column.value(item), item))));\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter((option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()));\n\n const { value = new Set<F>(), onChange } = useFilter({\n ...props,\n\n id: 'selectFilter',\n\n isActive(filterValue) {\n return filterValue.size > 0;\n },\n\n test(filterValue, value) {\n return filterValue.has(value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gap: 'var(--spacing)',\n }}\n >\n <AutoFocusTextField\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n endIcon={<IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>}\n css={{ marginBottom: 'var(--spacing)' }}\n />\n\n <div css={{ maxHeight: '20em', overflowY: 'auto' }}>\n <FormControlLabel\n disabled={value.size === 0}\n control={<Checkbox disabled={value.size === 0} checked={value.size > 0} onChange={() => onChange(new Set())} />}\n label={<><{text.selected(value.size)}></>}\n ></FormControlLabel>\n\n {filtered.map((option, index) => (\n <FormControlLabel\n key={index}\n control={<Checkbox checked={value.has(option)} onChange={() => onChange(toggle(value, option, singleSelect))} />}\n label={render(option)}\n ></FormControlLabel>\n ))}\n </div>\n\n {filtered.length === 0 && <span css={{ textAlign: 'center' }}>{text.noResults}</span>}\n </div>\n );\n}\n","export function debounce<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let lastArgs: Args | undefined;\n let timeout: NodeJS.Timeout | undefined;\n\n function run() {\n const args = lastArgs;\n\n lastArgs = undefined;\n timeout = undefined;\n\n fn(...(args as Args));\n }\n\n return Object.assign(\n function (...args: Args) {\n lastArgs = args;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(run, ms);\n },\n {\n flush() {\n if (timeout) {\n clearTimeout(timeout);\n run();\n }\n },\n },\n );\n}\n","import { castDraft } from 'immer';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useColumnContext, useTableContext } from '..';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { FilterImplementation, SerializableValue } from '../types';\n\nexport function useFilter<T, V, F, S extends SerializableValue>(impl: FilterImplementation<T, V, F, S>) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n // Update implementation\n useEffect(() => {\n table.update((state) => {\n if (impl.defaultValue !== undefined) {\n state.filterValues.set(columnId, impl.defaultValue);\n }\n });\n }, []);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft(impl));\n\n if (impl.value !== undefined) {\n state.filterValues.set(columnId, impl.value);\n }\n });\n\n return () => {\n table.update((state) => {\n state.filters.delete(columnId);\n });\n };\n }, [table, columnId, ...(impl.dependencies ?? [impl])]);\n\n // Track local value and update it globally after delay\n const value = table.useState((state) => state.filterValues.get(columnId) as S | undefined);\n const [dirtyValue, setDirtyValue] = useState<S>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: S) => {\n const { value: controlledValue, onChange } = implRef.current;\n\n if (controlledValue === undefined) {\n table.update((state) => {\n state.filterValues.set(columnId, value);\n });\n }\n\n onChange?.(value);\n setDirtyValue(undefined);\n }, 500),\n [table],\n );\n\n function onChange(value?: S) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n close: useContext(FilterControlContext),\n };\n}\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n","import React from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport { textMatch } from '../misc/textMatch';\nimport { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function TextFilter<T, V>({\n compare = textMatch,\n filterBy = asStringOrArray,\n ...props\n}: {\n compare?: (a: string, b: string) => boolean;\n} & CommonFilterProps<T, V, string, string>): JSX.Element {\n const {\n components: { IconButton },\n icons: { Search, Clear },\n } = useTheme();\n\n const { value = '', onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'textFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return compare(value, filterValue);\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n }}\n >\n <AutoFocusTextField\n value={value}\n onChange={(e) => onChange(e.target.value)}\n endIcon={<IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>}\n />\n </div>\n );\n}\n"],"names":["props","components","TextField","useTheme","ref","useRef","visible","useContext","PopoverContext","current","focus","_jsx","weekDays","months","startOfDay","d","Date","getFullYear","getMonth","getDate","endOfDay","a","b","min","max","value","onChange","rangeSelect","locale","firstDayOfWeek","IconButton","icons","ChevronRight","baseDate","useState","dateInView","setDateInView","currentMin","setCurrentMin","hovered","setHovered","undefined","calendars","getBackProps","getForwardProps","getDateProps","useDayzed","onDateSelected","showOutsideDays","date","onOffsetChanged","offset","formatWeekday","useMemo","format","Intl","DateTimeFormat","weekday","weekDay","UTC","map","month","year","weeks","_jsxs","margin","display","gridAutoFlow","justifyContent","alignItems","transform","gridTemplateColumns","fontWeight","_v","justifySelf","marginBottom","week","index","dateObj","dayIndex","prevMonth","nextMonth","today","selected","getTime","dateIntersect","preSelected","padding","border","background","cursor","color","gray","Popover","cssVariables","useCssVariables","anchor","setAnchor","formatMonth","fontSize","e","currentTarget","input","setInput","Number","formatYear","String","width","target","match","apply","key","x","Object","range","convertDate","Array","convertDateOrRange","filter","Boolean","singleSelect","filterBy","convertDateOrArray","Button","text","useFilter","id","isActive","filterValue","test","formatDate","dateStyle","marginTop","thisWeek","reset","now","diff","getDay","setDate","control","label","disabled","userSelect","marginLeft","castDraft","useTableTheme","Store","ColumnHeaderContext","StoreScope","items","Map","columnId","useColumnContext","table","useTableContext","enabled","store","useStore","draggingStart","clone","div","update","state","set","delete","offsetLeft","cols","getState","columnOrder","get","otherCols","col","firstOffsetleft","find","sum","targetIndex","findIndex","offsetWidth","length","mouseX","clientX","bounds","getBoundingClientRect","Math","abs","stopPropagation","setPointerCapture","pointerId","cloneNode","body","append","entries","getComputedStyle","style","assign","pointerEvents","position","boxShadow","left","top","indexOf","calcTargetIndex","columns","forEach","i","slice","reduce","columnStyleOverride","transition","zIndex","splice","remove","clear","onPointerDown","onPointerMove","onPointerUp","children","Checkbox","Settings","hiddenColumns","anchorEl","setAnchorEl","toggle","column","controlledHiddenColumns","onHiddenColumnsChange","newValue","Set","has","add","selectColumns","cannotHide","header","Export","Clipboard","generate","options","activeColumns","activeItems","data","item","exportCell","csvExport","copy","clipboard","writeText","enableExport","download","document","createElement","href","encodeURIComponent","appendChild","click","removeChild","justifyItems","gap","exportTitle","exportCopy","exportDownload","FilterControlContext","createContext","FilterList","ArrowDropDown","filters","filterValues","close","useCallback","preventDefault","hasPointerCapture","parent","parentElement","columnWidths","releasePointerCapture","getModifierState","onDoubleClick","alignSelf","content","height","Cell","memo","itemId","rowIndex","classes","activeItemsById","throttle","debugRender","classNames","calcClassNames","renderCell","cx","defaultClasses","cell","hasDeferredChildren","Spinner","isExpanded","expanded","hasChildren","controlledExpanded","expandOnlyOne","onExpandedChange","newExpanded","ancestor","getAncestors","isSelected","itemIds","from","keys","size","every","selection","mouseEvent","nativeEvent","lastSelectedId","selectSyncChildren","controlledSelection","onSelectionChange","shiftKey","newSelection","descendant","getDescendants","Function","evenCell","oddCell","Row","divRef","className","indent","columnIds","enableSelection","rowAction","o","ResizeObserver","contains","rowHeights","offsetHeight","observe","disconnect","cellFill","firstCell","Badge","ArrowUpward","direction","sort","s","off","controlledSort","onSortChange","newDirection","newSort","push","overflow","textOverflow","opacity","findScrollRoot","documentElement","scrollHeight","clientHeight","overflowY","relativeOffset","y","offsetParent","offsetTop","HTMLElement","virtual","probeRef","setCounter","to","before","after","root","rowHeight","initalRowHeight","overscan","overscanTop","overscanBottom","totalHeight","h","probeOffset","headerHeight","topOfTable","scrollTop","bottomOfTable","reverse","throttleScroll","incCounter","c","addEventListener","removeEventListener","gridColumn","TableContext","ColumnContext","Error","useTableState","isHydrated","useTableStateStorage","showLoading","setShowLoading","handle","setTimeout","clearTimeout","loading","TableInner","hidden","fullWidth","defaultWidth","stickyHeader","enableColumnSelection","join","visibility","headerCell","headerFill","sticky","flex","startIndex","newSet","providedOptions","stringValue","asString","render","Search","Clear","uniq","flatMap","castArray","query","setQuery","filtered","option","toLowerCase","includes","maxHeight","textAlign","noResults","compare","textMatch","asStringOrArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/hooks/useTheme.ts","../../src/components/autoFocusTextField.tsx","../../src/theme/useCssVariables.ts","../../src/components/datePicker.tsx","../../src/components/dateFilter.tsx","../../src/misc/helpers.ts","../../src/components/formControlLabel.tsx","../../src/misc/queue.ts","../../src/internalState/tableStateStorage.ts","../../src/internalState/calcItems.ts","../../src/internalState/calcProps.ts","../../src/internalState/cleanupState.ts","../../src/internalState/filterColumns.ts","../../src/internalState/syncSelections.ts","../../src/internalState/useTableState.ts","../../src/components/columnHeader.tsx","../../src/components/columnSelection.tsx","../../src/misc/csvExport.ts","../../src/components/export.tsx","../../src/components/filterControl.tsx","../../src/components/resizeHandle.tsx","../../src/components/cell.tsx","../../src/components/expandControl.tsx","../../src/components/selectComponent.tsx","../../src/components/row.tsx","../../src/components/sortComponent.tsx","../../src/misc/throttle.ts","../../src/components/virtualized.tsx","../../src/components/table.tsx","../../src/components/selectFilter.tsx","../../src/misc/debounce.ts","../../src/hooks/useFilter.ts","../../src/misc/textMatch.ts","../../src/components/textFilter.tsx"],"sourcesContent":["import { useTableContext } from '..';\n\nexport function useTheme() {\n const table = useTableContext();\n return table.useState('theme');\n}\n","import { ComponentType, useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { PopoverContext } from '../theme/defaultTheme/popover';\nimport { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const {\n components: { TextField },\n } = useTheme();\n\n const ref = useRef<HTMLInputElement>(null);\n const { visible } = useContext(PopoverContext);\n\n useLayoutEffect(() => {\n if (visible && ref.current) {\n ref.current.focus();\n }\n }, [visible]);\n\n return <TextField {...props} inputRef={ref} />;\n}\n","import { useTableContext } from '..';\n\nexport function useCssVariables() {\n const table = useTableContext();\n return table.useState((state) => ({\n '--spacing': state.theme.spacing,\n '--primaryMain': state.theme.colors.primary.main,\n '--primaryLight': state.theme.colors.primary.light,\n '--primaryContrastText': state.theme.colors.primary.contrastText,\n '--secondaryMain': state.theme.colors.secondary.main,\n '--secondaryLight': state.theme.colors.secondary.light,\n '--secondaryContrastText': state.theme.colors.secondary.contrastText,\n }));\n}\n","import { useDayzed } from 'dayzed';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTheme } from '..';\nimport { gray } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerProps = {\n value: Date | DateRange | null;\n onChange: (value: Date | DateRange | null) => void;\n rangeSelect?: boolean;\n locale?: string;\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n};\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\nconst months = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] as const;\n\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\nexport const endOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport function dateIntersect(a: Date | null | DateRange, b: Date | null | DateRange) {\n if (a instanceof Date) {\n a = { min: a, max: a };\n }\n if (b instanceof Date) {\n b = { min: b, max: b };\n }\n\n if (!a?.min || !a.max || !b?.min || !b.max) {\n return false;\n }\n\n return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function DatePicker({ value, onChange, rangeSelect, locale, firstDayOfWeek = 0 }: DatePickerProps) {\n const {\n components: { IconButton },\n icons: { ChevronRight },\n } = useTheme();\n\n const [baseDate] = useState(new Date());\n const [dateInView, setDateInView] = useState<Date>(baseDate);\n const [currentMin, setCurrentMin] = useState<Date>();\n const [hovered, setHovered] = useState<Date>();\n\n const min = currentMin ?? (value instanceof Date ? value : value?.min);\n const max = currentMin ? undefined : value instanceof Date ? value : value?.max;\n\n const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n onDateSelected: () => undefined,\n firstDayOfWeek,\n showOutsideDays: true,\n date: dateInView,\n onOffsetChanged: (offset) => setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n offset: 0,\n });\n\n const formatWeekday = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return (weekDay: number) => format(new Date(Date.UTC(2021, 5, weekDay)));\n }, [locale]);\n\n useEffect(() => setDateInView(value === null ? new Date() : value instanceof Date ? value : value.max), [value]);\n\n return (\n <div>\n {calendars.map(({ month, year, weeks }) => (\n <div key={`${month}${year}`}>\n <div\n css={{\n margin: 'calc(var(--spacing) * 4) 0',\n display: 'grid',\n gridAutoFlow: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <IconButton {...getBackProps({ calendars })}>\n <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n </IconButton>\n\n <div css={{ display: 'flex' }}>\n <MonthSelector value={month} onChange={(month) => setDateInView(new Date(year, month))} locale={locale} />\n\n <YearSelector value={year} onChange={(year) => setDateInView(new Date(year, month))} />\n </div>\n\n <IconButton {...getForwardProps({ calendars })}>\n <ChevronRight />\n </IconButton>\n </div>\n\n <div\n css={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, max-content)',\n fontWeight: 'bold',\n }}\n >\n {weekDays.map((_v, weekDay) => (\n <div key={weekDay} css={{ justifySelf: 'center', marginBottom: 'var(--spacing)' }}>\n {formatWeekday(weekDay)}\n </div>\n ))}\n\n {weeks.map((week, index) =>\n week.map((dateObj, dayIndex) => {\n if (!dateObj) {\n return <div />;\n }\n\n const { prevMonth, nextMonth, date, today } = dateObj;\n\n const selected = date.getTime() === min?.getTime() || (min && max && dateIntersect(date, { min, max }));\n const preSelected =\n !selected &&\n (date.getTime() === hovered?.getTime() ||\n (min && !max && hovered && dateIntersect(date, min <= hovered ? { min, max: hovered } : { min: hovered, max: min })));\n\n return (\n <button\n key={`${index}-${dayIndex}`}\n css={[\n {\n padding: 10,\n border: '1px solid transparent',\n background: 'transparent',\n cursor: 'pointer',\n },\n (prevMonth || nextMonth) && {\n color: gray,\n },\n today && {\n border: '1px solid var(--secondaryMain)',\n },\n selected && {\n background: 'var(--primaryMain)',\n color: 'var(--primaryContrastText)',\n },\n preSelected && {\n background: 'var(--primaryLight)',\n color: 'var(--primaryContrastText)',\n },\n ]}\n {...getDateProps({ dateObj })}\n onClick={() => {\n if (!rangeSelect) {\n setCurrentMin(undefined);\n onChange(date);\n } else if (min && !max) {\n setCurrentMin(undefined);\n if (date > min) {\n onChange({ min, max: date });\n } else {\n onChange({ min: date, max: min });\n }\n } else {\n setCurrentMin(date);\n }\n }}\n onPointerOver={() => setHovered(date)}\n onPointerOut={() => setHovered(undefined)}\n >\n {date.getDate()}\n </button>\n );\n }),\n )}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction MonthSelector({ value, onChange, locale }: { value: number; onChange: (month: number) => void; locale?: string }) {\n const {\n components: { Popover },\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element>();\n\n const formatMonth = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n return (month: number) => format(new Date(2021, month));\n }, [locale]);\n\n return (\n <>\n <button\n css={{\n border: 'none',\n background: 'transparent',\n fontSize: 'inherit',\n cursor: 'pointer',\n }}\n onClick={(e) => setAnchor(e.currentTarget)}\n >\n {formatMonth(value)}\n </button>\n\n <Popover open={!!anchor} anchorEl={anchor ?? null} onClose={() => setAnchor(undefined)} align=\"center\" css={cssVariables}>\n <div\n css={{\n display: 'grid',\n }}\n >\n {months.map((month) => (\n <button\n key={month}\n css={[\n {\n padding: 'var(--spacing)',\n border: 'none',\n background: 'transparent',\n\n '&:hover': {\n background: 'var(--primaryLight)',\n },\n },\n month === value && { background: 'var(--primaryMain)' },\n ]}\n onClick={() => onChange(month)}\n >\n {formatMonth(month)}\n </button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n\nfunction YearSelector({ value, onChange, locale }: { value: number; onChange: (year: number) => void; locale?: string }) {\n const [input, setInput] = useState<string>();\n const ref = useRef<HTMLInputElement>(null);\n\n function apply() {\n onChange(Number(input));\n setInput(undefined);\n }\n\n const formatYear = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n return (year: number) => format(new Date(year, 0, 1));\n }, [locale]);\n\n useLayoutEffect(() => ref.current?.focus(), [ref.current]);\n\n if (input === undefined) {\n return <div onClick={() => setInput(String(value))}>{formatYear(value)}</div>;\n }\n\n return (\n <input\n ref={ref}\n css={{ width: '4ch' }}\n value={input}\n onChange={(e) => {\n if (e.target.value.match(/^\\d{0,4}$/)) {\n setInput(e.target.value);\n }\n }}\n onBlur={apply}\n onKeyPress={(e) => e.key === 'Enter' && apply()}\n ></input>\n );\n}\n","import React, { useMemo } from 'react';\nimport { useFilter, useTheme } from '..';\nimport { CommonFilterProps } from '../types';\nimport { dateIntersect, DatePicker, DatePickerProps, DateRange, endOfDay, startOfDay } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n if (x instanceof Date) return x;\n if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n if (x instanceof Object && 'min' in x && 'max' in x) {\n const range = {\n min: convertDate((x as any).min),\n max: convertDate((x as any).max),\n };\n return range.min && range.max ? (range as DateRange) : null;\n }\n return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n if (x instanceof Array) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n return convertDateOrRange(x);\n}\n\nexport function DateFilter<T, V>({\n locale,\n firstDayOfWeek,\n singleSelect,\n filterBy = convertDateOrArray,\n ...props\n}: {\n locale?: string;\n firstDayOfWeek?: DatePickerProps['firstDayOfWeek'];\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, Date | DateRange | null, Date | DateRange | null>): JSX.Element {\n const {\n components: { Button },\n text,\n } = useTheme();\n\n const { value = null, onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'dateFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return dateIntersect(filterValue, value);\n },\n });\n\n const formatDate = useMemo(() => {\n const { format } = new Intl.DateTimeFormat(locale, { dateStyle: 'medium' });\n return format;\n }, [locale]);\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n {!singleSelect && (\n <div\n css={{\n marginBottom: 'var(--spacing)',\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n {value ? formatDate(value instanceof Date ? value : value.min) : ''} -{' '}\n {value ? formatDate(value instanceof Date ? value : value.max) : ''}\n </div>\n )}\n\n <DatePicker rangeSelect={!singleSelect} value={value} onChange={onChange} locale={locale} firstDayOfWeek={firstDayOfWeek} />\n\n <div css={{ marginTop: 'var(--spacing)', display: 'grid', gridAutoFlow: 'column', justifyContent: 'center' }}>\n <Button variant=\"text\" onClick={() => onChange(today())}>\n {text.today}\n </Button>\n\n <Button variant=\"text\" onClick={() => onChange(thisWeek(firstDayOfWeek))}>\n {text.thisWeek}\n </Button>\n\n <Button variant=\"text\" onClick={() => onChange(null)}>\n {text.reset}\n </Button>\n </div>\n </div>\n );\n}\n\nexport const today = (): DateRange => {\n const today = startOfDay(new Date());\n return { min: today, max: today };\n};\n\nexport const thisWeek = (firstDayOfWeek = 0): DateRange => {\n const now = new Date();\n const min = new Date(now);\n\n let diff = min.getDay() - firstDayOfWeek;\n if (diff < 0) {\n diff += 7;\n }\n min.setDate(min.getDate() - diff);\n\n const max = new Date(min);\n max.setDate(max.getDate() + 6);\n\n return { min: startOfDay(min), max: endOfDay(max) };\n};\n","import { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(arr: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n return [...arr].reduce<S[]>((out, cur) => out.concat(flatMap(cur)), []);\n};\n\nexport const orderBy = <T>(arr: T[], selectors: ((t: T) => any)[] = [], direction: ('desc' | 'asc')[] = []): T[] => {\n if (selectors.length === 0) selectors = [(t) => t];\n\n return [...arr].sort((a, b) => {\n for (let i = 0; i < selectors.length; i++) {\n const _a = selectors[i]?.(a);\n const _b = selectors[i]?.(b);\n const dir = direction[i] === 'desc' ? -1 : 1;\n if (_a > _b) return dir;\n if (_a < _b) return -dir;\n }\n return 0;\n });\n};\n\nexport const uniq = <T>(arr: T[]): T[] => {\n const set = new Set<T>();\n for (const t of arr) set.add(t);\n return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n const result = new Set<T>();\n for (const x of a) if (b.has(x)) result.add(x);\n return result;\n};\n\nexport const getAncestors = <T>(activeItemsById: Map<Id, TableItem<T>>, ...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = ({ parentId }: TableItem<T>): void => {\n const parent = parentId ? activeItemsById.get(parentId) : undefined;\n if (parent && !result.has(parent.id)) {\n result.add(parent.id);\n find(parent);\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n const result = new Set<Id>();\n\n const find = (item: TableItem<T>): void => {\n for (const child of item.children) {\n if (!result.has(child.id)) {\n result.add(child.id);\n find(child);\n }\n }\n };\n items.forEach(find);\n return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n if (x instanceof Array) return x.map(asString).join(', ');\n if (x instanceof Object) return JSON.stringify(x);\n return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n if (x instanceof Array) return x.map(asString);\n return asString(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean => a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (a instanceof Array ? a : [a]);\n\nexport const cx = (...classNames: (string | false | undefined | null | Record<string, boolean>)[]) =>\n classNames\n .flatMap((entry) => {\n if (!entry) return [];\n if (typeof entry === 'string') return [entry];\n return Object.entries(entry)\n .filter(([, predicate]) => predicate)\n .map(([className]) => className);\n })\n .join(' ');\n","import { ReactNode } from 'react';\n\nexport function FormControlLabel({ control, label, disabled }: { control: ReactNode; label: ReactNode; disabled?: boolean }) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","export class Queue {\n private q = new Array<{ job: () => Promise<any>; resolve: (value: any) => void; reject: (reason?: any) => void }>();\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n if (!this.isRunning) this.start();\n });\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (e) {\n next.reject(e);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useState } from 'react';\nimport { useTableContext } from '..';\nimport { Queue } from '../misc/queue';\nimport { SerializableValue } from '../types';\n\nconst KEYS = ['sort', 'selection', 'expanded', 'hiddenColumns', 'filterValues', 'columnWidths', 'columnOrder'] as const;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: SerializableValue) {\n function prepare(value: SerializableValue): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (value instanceof Array) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\nexport function useTableStateStorage() {\n const table = useTableContext();\n const [isHydrated, setIsHydrated] = useState(false);\n\n // On mount: load\n useEffect(() => {\n const { persist } = table.getState().props;\n if (!persist) {\n setIsHydrated(true);\n return;\n }\n\n let isCanceled = false;\n\n (async () => {\n try {\n const { storage, id = 'table', include, exclude } = persist;\n const json = await storage.getItem(`${id}_state`);\n if (isCanceled || !json) return;\n\n const data = parse(json);\n table.getState().props.debug?.('load', json, data);\n\n table.update((state) => {\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key) &&\n key in data\n ) {\n if (key === 'filterValues') {\n for (const [id, value] of data[key]) {\n if (state.filters.get(id)?.persist ?? true) {\n state.filterValues.set(id, value);\n }\n }\n } else {\n state[key] = data[key];\n\n if (key === 'expanded' || key === 'hiddenColumns' || key === 'selection' || key === 'sort') {\n state.props[`on${(key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>}Change`]?.(data[key]);\n }\n }\n }\n }\n });\n } catch (e) {\n console.error('Failed to load table state:', e);\n } finally {\n setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n // After isHydrated, watch and save state\n useEffect(() => {\n if (!isHydrated) return;\n\n const q = new Queue();\n\n return table.subscribe(\n (state) => {\n if (!state.props.persist) return;\n\n const { storage, id = 'table', include, exclude } = state.props.persist;\n const data: any = {};\n\n for (const key of KEYS) {\n if (\n //\n (!include || include.includes(key)) &&\n !exclude?.includes(key)\n ) {\n if (key === 'filterValues') {\n data[key] = new Map();\n for (const [id, value] of state.filterValues) {\n if (state.filters.get(id)?.persist ?? true) {\n data.filterValues.set(id, value);\n }\n }\n } else {\n data[key] = state[key];\n }\n }\n }\n\n return { storage, id, data };\n },\n (props) => {\n if (!props) return;\n const { storage, id, data } = props;\n\n table.getState().props.debug?.('save', data, stringify(data));\n q.run(async () => {\n await storage.setItem(`${id}_state`, stringify(data));\n }, true);\n },\n { throttle: 1000 },\n );\n }, [isHydrated]);\n\n return isHydrated;\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) =>\n [\n state.props.items,\n state.props.id,\n state.props.parentId,\n state.props.revealFiltered,\n state.sort,\n state.filters,\n state.filterValues,\n state.activeColumns,\n state.expanded,\n ] as const,\n ([items = [], id, parentId, revealFiltered, sort, filters, filterValues, activeColumns], draft) => {\n const tableItems = items.map<TableItem<T>>((item) => ({\n ...item,\n id: id(item),\n parentId: parentId?.(item),\n children: [],\n }));\n\n let sorted;\n if (sort.length === 0) {\n sorted = tableItems;\n } else {\n const selectors = flatMap(sort, (sort) => {\n const column = activeColumns.find((column) => column.id === sort.columnId);\n if (!column) return [];\n const sortBy = column.sortBy instanceof Array ? column.sortBy : [column.sortBy];\n return sortBy.map((sortBy) => ({ selector: (item: T) => sortBy(column.value(item), item), direction: sort.direction }));\n }).filter(Boolean);\n\n sorted = orderBy(\n tableItems,\n selectors.map((x) => x.selector),\n selectors.map((x) => x.direction),\n );\n }\n\n const lookup = new Map<Id, TableItem<T>>();\n for (const item of sorted) {\n lookup.set(item.id, item);\n }\n\n for (const item of sorted) {\n const parent = item.parentId !== undefined ? lookup.get(item.parentId) : undefined;\n parent?.children.push(item);\n }\n\n const allItems = new Array<TableItem<T>>();\n const allItemsById = new Map<Id, TableItem<T>>();\n\n const traverse = (items: TableItem<T>[]): void => {\n for (const item of items) {\n allItems.push(item);\n allItemsById.set(item.id, item);\n traverse(item.children);\n }\n };\n traverse(sorted.filter((item) => item.parentId === undefined));\n\n let expandedChanged = false;\n const activeItemsById = new Map<Id, TableItem<T>>();\n const activeSet = new Set<Id>();\n const activeItems = [...allItems]\n .reverse()\n .filter((item) => {\n let isActive = activeSet.has(item.id);\n\n isActive ||= activeColumns.every((column) => {\n const filter = filters.get(column.id);\n if (!filter) return true;\n\n const filterValue = filterValues.get(column.id);\n if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n const filterBy = filter.filterBy ?? ((x) => x);\n const value = filterBy(column.value(item), item);\n return castArray(value).some((value) => filter.test(filterValue, value));\n });\n\n if (isActive && item.parentId !== undefined) {\n if (\n revealFiltered &&\n Array.from(filters.entries()).some(([id, filter]) => {\n const filterValue = filterValues.get(id);\n return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n })\n ) {\n expandedChanged ||= !draft.expanded.has(item.parentId);\n draft.expanded.add(item.parentId);\n } else if (!draft.expanded.has(item.parentId)) {\n isActive = false;\n }\n }\n\n if (isActive && item.parentId !== undefined) {\n activeSet.add(item.parentId);\n }\n if (isActive) {\n activeItemsById.set(item.id, item);\n }\n\n return isActive;\n })\n .reverse();\n\n draft.items = castDraft(allItems);\n draft.itemsById = castDraft(allItemsById);\n draft.activeItems = castDraft(activeItems);\n draft.activeItemsById = castDraft(activeItemsById);\n\n if (expandedChanged) {\n setTimeout(() => {\n state.getState().props.onExpandedChange?.(state.getState().expanded);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useMemo, useRef } from 'react';\nimport { asString } from '../misc/helpers';\nimport { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst noopParentId = () => undefined;\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n const columnCache = useRef(new Map<string | number, [any[], InternalColumn<T, any>]>());\n\n return useMemo(() => {\n let id;\n if (props.id instanceof Function) {\n id = props.id;\n } else {\n id = (item: T) => item[props.id as keyof T] as unknown as Id;\n }\n\n let parentId;\n if (props.parentId instanceof Function) {\n parentId = props.parentId;\n } else if (typeof props.parentId === 'string') {\n parentId = (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined;\n } else {\n parentId = noopParentId;\n }\n\n let inputColumns;\n if (props.columns instanceof Function) {\n inputColumns = props.columns((value, column) => ({ ...column, value }));\n } else {\n inputColumns = props.columns.map((column) => ({ ...column, dependecies: undefined }));\n }\n\n const newColumnCache = new Map<string | number, [any[], InternalColumn<T, any>]>();\n\n const columns = inputColumns.map<InternalColumn<T, any>>(function <V>(\n {\n id,\n header = null,\n renderCell = asString,\n exportCell = asString,\n sortBy = (v) => (typeof v === 'number' || v instanceof Date ? v : String(v)),\n dependencies = [],\n ...props\n }: Column<T, V>,\n index: number,\n ) {\n const [depsInCache, columnInCache] = columnCache.current.get(id ?? index) ?? [];\n\n let column;\n if (\n depsInCache &&\n columnInCache &&\n depsInCache.length === dependencies.length &&\n depsInCache.every((x, i) => dependencies[i] === x)\n ) {\n column = columnInCache;\n } else {\n column = {\n id: id ?? index,\n header,\n renderCell,\n exportCell,\n sortBy,\n dependencies,\n ...props,\n };\n }\n\n newColumnCache.set(id ?? index, [dependencies, column]);\n return column;\n });\n\n columnCache.current = newColumnCache;\n\n let copy;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.copy === true)) {\n copy = { separator: '\\t' };\n } else if (props.enableExport && props.enableExport.copy instanceof Object) {\n copy = props.enableExport.copy;\n }\n\n let download;\n if (props.enableExport === true || (props.enableExport instanceof Object && props.enableExport.download === true)) {\n download = { sepPrefix: true };\n } else if (props.enableExport && props.enableExport.download instanceof Object) {\n download = props.enableExport.download;\n }\n\n const enableExport = { copy, download };\n\n return {\n ...props,\n id,\n parentId,\n columns,\n enableSelection: props.enableSelection ?? true,\n selectSyncChildren: props.selectSyncChildren ?? true,\n stickyHeader: props.stickyHeader ?? true,\n enableExport,\n enableColumnSelection: props.enableColumnSelection ?? true,\n enableColumnResize: props.enableColumnResize ?? true,\n enableColumnReorder: props.enableColumnReorder ?? true,\n };\n }, [props]);\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.itemsById, state.activeItemsById, state.activeColumns] as const,\n ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n const columnIds = new Set(columns.map((column) => column.id));\n const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n // Remove sort entries for non active columns\n const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n if (newSort.length < draft.sort.length) {\n draft.sort = newSort;\n setTimeout(() => {\n draft.props.onSortChange?.(newSort);\n });\n }\n\n // Remove filters for non active columns\n for (const id of draft.filters.keys()) {\n if (!activeColumnIds.has(id)) draft.filters.delete(id);\n }\n\n // Remove filterValues for non active columns\n for (const id of draft.filterValues.keys()) {\n if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n }\n\n // Remove hiddenColumns for non existing columns\n for (const id of draft.hiddenColumns.keys()) {\n if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n }\n\n // Remove columnWidth for non existing columns\n for (const id of draft.columnWidths.keys()) {\n if (!columnIds.has(id)) draft.columnWidths.delete(id);\n }\n\n // Remove non existing columns from columnOrder\n for (const id of draft.columnOrder) {\n if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n }\n\n if (draft.props.items) {\n // Remove selection for non active items\n const newSelection = intersect(draft.selection, activeItemsById);\n if (newSelection.size !== draft.selection.size) {\n draft.selection = newSelection;\n setTimeout(() => {\n draft.props.onSelectionChange?.(newSelection);\n });\n }\n\n // Remove expanded for non existing items\n const newExpanded = intersect(draft.expanded, itemsById);\n if (newExpanded.size < draft.expanded.size) {\n draft.expanded = newExpanded;\n setTimeout(() => {\n draft.props.onExpandedChange?.(newExpanded);\n });\n }\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.columns, state.hiddenColumns, state.columnOrder] as const,\n ([columns, hiddenColumns, columnOrder], draft) => {\n draft.activeColumns = orderBy(\n columns.filter((column) => !hiddenColumns.has(column.id)),\n [(column) => columnOrder.indexOf(column.id)],\n );\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { useEffect } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { InternalTableState } from '../types';\n\nexport function syncSelections<T>(state: Store<InternalTableState<T>>): void {\n useEffect(\n () =>\n state.addReaction(\n (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n ([selectSyncChildren, selection, activeItems], state) => {\n if (!selectSyncChildren) return;\n\n const newSelection = new Set(selection);\n for (const item of activeItems) {\n if (item.parentId !== undefined && newSelection.has(item.parentId)) {\n newSelection.add(item.id);\n }\n }\n\n if (newSelection.size !== selection.size) {\n state.selection = newSelection;\n setTimeout(() => {\n state.props.onSelectionChange?.(newSelection);\n });\n }\n },\n { runNow: true },\n ),\n [state],\n );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTableTheme } from '../theme/tableTheme';\nimport { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { syncSelections } from './syncSelections';\n\nexport function useTableState<T>(_props: TableProps<T>): Store<InternalTableState<T>> {\n const props = calcProps(_props);\n const theme = useTableTheme(props);\n\n const state = useMemo(\n () =>\n new Store<InternalTableState<T>>({\n props,\n theme,\n\n sort: props.defaultSort ?? [],\n selection: props.defaultSelection ?? new Set(),\n expanded: props.defaultExpanded ?? new Set(),\n rowHeights: new Map(),\n filters: new Map(),\n filterValues: new Map(),\n hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n columnWidths: new Map(),\n columnOrder: props.columns.map((column) => column.id),\n columnStyleOverride: new Map(),\n\n activeColumns: [],\n items: [],\n itemsById: new Map(),\n activeItems: [],\n activeItemsById: new Map(),\n lastSelectedId: undefined,\n }),\n [],\n );\n\n filterColumns(state);\n calcItems(state);\n syncSelections(state);\n cleanupState(state);\n\n useEffect(() => {\n state.update((state) => {\n state.props = castDraft(props);\n if (props.sort) state.sort = props.sort;\n if (props.selection) state.selection = props.selection;\n if (props.expanded) state.expanded = props.expanded;\n if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n for (const column of props.columns) {\n if (!state.columnOrder.includes(column.id)) {\n const index = props.columns.indexOf(column);\n state.columnOrder.splice(index, 0, column.id);\n }\n }\n state.theme = theme;\n });\n }, [state, props]);\n\n return state;\n}\n","import { castDraft } from 'immer';\nimport React, { HTMLProps, useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { Id, useColumnContext, useTableContext } from '..';\n\nexport const ColumnHeaderContext = new StoreScope({\n items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader(props: HTMLProps<HTMLDivElement>) {\n const ref = useRef<HTMLDivElement>(null);\n const columnId = useColumnContext();\n const table = useTableContext();\n const enabled = table.useState('props.enableColumnReorder');\n\n const store = ColumnHeaderContext.useStore();\n const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n const clone = useRef<HTMLDivElement>();\n\n // Track each headers div in a store\n useEffect(() => {\n const div = ref.current;\n if (!div) return;\n\n store.update((state) => {\n state.items.set(columnId, castDraft(div));\n });\n\n return () => {\n store.update((state) => {\n state.items.delete(columnId);\n });\n };\n }, [ref.current, store, columnId]);\n\n // Calculate which index the current header would get, given the current offset\n function calcTargetIndex(offsetLeft: number) {\n const cols = table.getState().columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n const otherCols = cols.filter((col) => col.id !== columnId);\n\n const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n let sum = 0;\n const targetIndex = otherCols.findIndex((col) => {\n const width = col.div?.offsetWidth ?? 0;\n if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n sum += width;\n return false;\n });\n\n return targetIndex === -1 ? otherCols.length : targetIndex;\n }\n\n // When starting clicking: Record initial mouse and div's bounds\n function onPointerDown(e: React.PointerEvent) {\n const div = ref.current;\n if (!div) return;\n draggingStart.current = { mouseX: e.clientX, bounds: div.getBoundingClientRect() };\n }\n\n // When mouse moves while clicked: Calculate transforms\n function onPointerMove(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined || Math.abs(e.clientX - draggingStart.current.mouseX) < 5) return;\n\n e.stopPropagation();\n div.setPointerCapture(e.pointerId);\n\n // Create clone of header div to move around with mouse\n if (!clone.current) {\n clone.current = div.cloneNode(true) as HTMLDivElement;\n document.body.append(clone.current);\n\n for (const [key, value] of Object.entries(getComputedStyle(div))) {\n try {\n clone.current.style[key as any] = value;\n } catch {\n // ignore\n }\n }\n\n Object.assign(clone.current.style, {\n pointerEvents: 'none',\n position: 'fixed',\n boxShadow: '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n left: `${draggingStart.current.bounds.left}px`,\n top: `${draggingStart.current.bounds.top}px`,\n });\n\n div.style.color = 'rgba(0, 0, 0, 0.2)';\n }\n\n // Update clone's position each time\n clone.current.style.left = `${draggingStart.current.bounds.left + e.clientX - draggingStart.current.mouseX}px`;\n\n // Calculate target index\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n // Apply transforms to each column\n const columns = table\n .getState()\n .columnOrder.map((id, index) => ({ id, index, width: store.getState().items.get(id)?.offsetWidth ?? 0 }));\n\n state.columnOrder.forEach((id, i) => {\n let offset = 0;\n if (i === index) {\n // Current column: Move to target pos\n if (targetIndex > index) {\n offset = columns.slice(index + 1, targetIndex + 1).reduce((sum, col) => sum + col.width, 0);\n } else if (targetIndex < index) {\n offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n }\n } else if (i >= targetIndex && i < index) {\n // Left columns: Move right to make room if needed\n offset = div.offsetWidth;\n } else if (i > index && i <= targetIndex) {\n // Right columns: Move left to make room if needed\n offset = -div.offsetWidth;\n }\n\n state.columnStyleOverride.set(id, {\n transition: 'transform 500ms',\n transform: `translate3d(${offset}px, 0, 0)`,\n zIndex: i === index ? 1 : undefined,\n });\n });\n });\n }\n\n // When releasing mouse: Reset draggin state and apply column move\n function onPointerUp(e: React.PointerEvent) {\n table.update((state) => {\n const div = ref.current;\n if (!div || draggingStart.current === undefined) return;\n\n // Apply column move\n const index = state.columnOrder.indexOf(columnId);\n const targetIndex = calcTargetIndex(div.offsetLeft + e.clientX - draggingStart.current.mouseX);\n\n state.columnOrder.splice(index, 1);\n state.columnOrder.splice(targetIndex, 0, columnId);\n\n // Cleanup\n clone.current?.remove();\n div.style.color = '';\n state.columnStyleOverride.clear();\n draggingStart.current = undefined;\n clone.current = undefined;\n });\n }\n\n return (\n <div\n {...props}\n css={{\n position: 'relative',\n userSelect: 'none',\n }}\n ref={ref}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n >\n {props.children}\n </div>\n );\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nexport function ColumnSelection<T>(): JSX.Element {\n const {\n components: { IconButton, Popover, Checkbox },\n icons: { Settings },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const table = useTableContext<T>();\n const columns = table.useState('props.columns');\n const hiddenColumns = table.useState('hiddenColumns');\n\n const [anchorEl, setAnchorEl] = useState<Element | null>(null);\n\n const toggle = (column: InternalColumn<T, unknown>) => {\n const {\n props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n } = table.getState();\n\n const newValue = new Set(hiddenColumns);\n if (hiddenColumns.has(column.id)) newValue.delete(column.id);\n else newValue.add(column.id);\n\n if (!controlledHiddenColumns) {\n table.update((state) => {\n state.hiddenColumns = newValue;\n });\n }\n\n onHiddenColumnsChange?.(newValue);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchorEl(anchorEl ? null : e.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover anchorEl={anchorEl} open={!!anchorEl} onClose={() => setAnchorEl(null)} css={cssVariables}>\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.selectColumns}</div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={<Checkbox checked={!hiddenColumns.has(column.id)} onChange={() => toggle(column)} disabled={column.cannotHide} />}\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","export type CsvExportOptions = { sepPrefix?: boolean; separator?: string; quote?: string; eol?: string };\n\nexport function csvExport(\n data: (string | number)[][],\n { sepPrefix, separator = ',', quote = '\"', eol = '\\n' }: CsvExportOptions = {},\n): string {\n const cells = data.map((line) =>\n line.map((value) => {\n if (typeof value === 'number') return String(value);\n if (![separator, quote, eol].some((c) => value.includes(c))) return value;\n\n const clean = value.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol);\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '..';\nimport { csvExport, CsvExportOptions } from '../misc/csvExport';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useTableContext } from './table';\n\nexport function Export<T>(): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Button, IconButton, Popover },\n icons: { Export, Clipboard },\n text,\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n const generate = (options?: CsvExportOptions) => {\n const { activeColumns, activeItems } = table.getState();\n\n const data = [\n activeColumns.map((column) => String(column.id)),\n ...activeItems.map((item) => activeColumns.map((column) => column.exportCell(column.value(item), item))),\n ];\n return csvExport(data, options);\n };\n\n const copy = () => {\n navigator.clipboard.writeText(generate(table.getState().props.enableExport.copy));\n };\n\n const download = () => {\n const a = document.createElement('a');\n a.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(generate(table.getState().props.enableExport.download));\n a.download = 'export.csv';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n };\n\n return (\n <>\n <IconButton onClick={(e) => setAnchor(anchor ? null : e.currentTarget)}>\n <Export css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover open={!!anchor} onClose={() => setAnchor(null)} anchorEl={anchor} css={cssVariables}>\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{text.exportTitle}</div>\n <Button startIcon={<Clipboard />} onClick={copy}>\n {text.exportCopy}\n </Button>\n <Button startIcon={<Export />} onClick={download}>\n {text.exportDownload}\n </Button>\n </div>\n </Popover>\n </>\n );\n}\n","import React, { createContext, useCallback, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useColumnContext, useTableContext } from './table';\n\nexport const FilterControlContext = createContext((): void => void 0);\n\nexport function FilterControl<T>(): JSX.Element | null {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { IconButton, Popover },\n icons: { FilterList, ArrowDropDown },\n } = useTheme();\n const cssVariables = useCssVariables();\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const isActive = table.useState((state) => {\n const filter = state.filters.get(columnId);\n const filterValue = state.filterValues.get(columnId);\n return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n });\n const filter = table.useState((state) => state.activeColumns.find((column) => column.id === columnId)?.filter);\n\n function reset() {\n table.update((state) => {\n state.filterValues.delete(columnId);\n });\n }\n\n const close = useCallback(function () {\n setAnchor(null);\n }, []);\n\n if (!filter) return null;\n\n return (\n <FilterControlContext.Provider value={close}>\n <div\n onClick={(e) => setAnchor(e.currentTarget)}\n onContextMenu={(e) => {\n reset();\n e.preventDefault();\n return false;\n }}\n >\n <IconButton\n css={[\n { color: '#b0bac9' },\n isActive && {\n color: 'var(--primaryMain) !important',\n },\n ]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n </div>\n\n <div\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onPointerMove={(e) => {\n e.stopPropagation();\n }}\n >\n <Popover open hidden={!anchor} onClose={() => setAnchor(null)} anchorEl={anchor ?? document.body} css={cssVariables}>\n {filter}\n </Popover>\n </div>\n </FilterControlContext.Provider>\n );\n}\n","import React, { HTMLProps } from 'react';\nimport { useColumnContext, useTableContext } from '..';\n\nexport function ResizeHandle() {\n const table = useTableContext();\n const columnId = useColumnContext();\n const enabled = table.useState('props.enableColumnResize');\n\n function onPointerDown(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.setPointerCapture(e.pointerId);\n }\n\n function onPointerMove(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n if (!div.hasPointerCapture(e.pointerId)) return;\n\n const parent = div.parentElement as HTMLDivElement;\n const width = Math.max(e.clientX - parent.getBoundingClientRect().left + 5, 50);\n\n table.update((state) => {\n state.columnWidths.set(columnId, `${width}px`);\n });\n }\n\n function onPointerUp(e: React.PointerEvent) {\n e.stopPropagation();\n\n const div = e.target as HTMLDivElement;\n div.releasePointerCapture(e.pointerId);\n }\n\n function onDoubleClick(e: React.MouseEvent) {\n table.update((state) => {\n if (e.getModifierState('Control')) {\n state.columnWidths.delete(columnId);\n } else {\n state.columnWidths.set(columnId, 'max-content');\n }\n });\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={enabled ? onPointerDown : undefined}\n onPointerMove={enabled ? onPointerMove : undefined}\n onPointerUp={enabled ? onPointerUp : undefined}\n onDoubleClick={enabled ? onDoubleClick : undefined}\n />\n );\n}\n\nexport function ResizeHandleView({ enabled, ...props }: HTMLProps<HTMLDivElement> & { enabled?: boolean }) {\n return (\n <div\n css={{\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n }}\n {...props}\n />\n );\n}\n","import React, { memo } from 'react';\nimport { Id, useColumnContext, useTableContext, useTheme } from '..';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { calcClassNames } from './row';\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const { classes } = useTheme();\n\n const column = table.useState((state) => state.activeColumns.find((column) => column.id === columnId));\n const item = table.useState((state) => state.activeItemsById.get(itemId));\n const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), { throttle: 16 });\n\n if (!column || !item) return null;\n table.getState().props.debugRender?.('render cell', itemId, columnId);\n\n const classNames = [...calcClassNames(classes, item, rowIndex), ...calcClassNames(column?.classes, item, rowIndex)];\n const content = column.renderCell(column.value(item), item);\n\n return (\n <div className={cx(...classNames)} css={[defaultClasses.cell, classNames, columnStyleOverride]}>\n {typeof content === 'string' ? (\n <span css={defaultClasses.text} title={content}>\n {content}\n </span>\n ) : (\n content\n )}\n </div>\n );\n});\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function ExpandControl<T>({ itemId, hasDeferredChildren }: { itemId: Id; hasDeferredChildren?: boolean }): JSX.Element {\n const {\n components: { IconButton, Spinner },\n icons: { ChevronRight },\n } = useTheme();\n\n const table = useTableContext<T>();\n const isExpanded = table.useState((state) => state.expanded.has(itemId));\n const hasChildren = table.useState((state) => !!state.activeItemsById.get(itemId)?.children.length);\n\n function toggle() {\n const {\n props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n expanded,\n activeItemsById,\n } = table.getState();\n\n const newExpanded = new Set(expanded);\n if (expandOnlyOne) newExpanded.clear();\n if (isExpanded) newExpanded.delete(itemId);\n else {\n newExpanded.add(itemId);\n\n const item = activeItemsById.get(itemId);\n for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n newExpanded.add(ancestor);\n }\n }\n\n onExpandedChange?.(newExpanded);\n\n if (!controlledExpanded) {\n table.update((state) => {\n state.expanded = newExpanded;\n });\n }\n }\n\n if (isExpanded && hasDeferredChildren && !hasChildren) {\n return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span\n css={{\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n }}\n >\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import React from 'react';\nimport { useTheme } from '..';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { Id } from '../types';\nimport { useTableContext } from './table';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n const table = useTableContext<T>();\n const {\n components: { Checkbox },\n } = useTheme();\n\n const isSelected = table.useState((state) => {\n const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n });\n\n function toggle(e: React.ChangeEvent) {\n const mouseEvent = e.nativeEvent as MouseEvent;\n\n const {\n activeItems,\n activeItemsById,\n lastSelectedId,\n selection,\n props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n } = table.getState();\n\n let range;\n if (mouseEvent.shiftKey && itemId) {\n const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n const b = activeItems.findIndex((item) => item.id === itemId);\n range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const newSelection = new Set(selection);\n for (const item of range) {\n if (isSelected) newSelection.delete(item.id);\n else newSelection.add(item.id);\n }\n\n if (selectSyncChildren && isSelected) {\n for (const ancestor of getAncestors(activeItemsById, ...range)) {\n newSelection.delete(ancestor);\n }\n for (const descendant of getDescendants(...range)) {\n newSelection.delete(descendant);\n }\n }\n\n onSelectionChange?.(newSelection);\n\n if (!controlledSelection) {\n table.update((state) => {\n state.selection = newSelection;\n });\n }\n\n table.update((state) => {\n state.lastSelectedId = itemId;\n });\n }\n\n return (\n <Checkbox\n css={{\n justifySelf: 'start',\n color: '#c9cfda',\n }}\n checked={isSelected}\n onChange={toggle}\n />\n );\n}\n","import React, { memo, useEffect, useRef } from 'react';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id, InternalColumn } from '../types';\nimport { Cell } from './cell';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\nimport { ColumnContext, useTableContext } from './table';\n\nexport function calcClassNames<T>(classes: InternalColumn<any, any>['classes'] | undefined, item: T, index: number) {\n return [\n classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n index % 2 === 0 && classes?.evenCell,\n index % 2 === 1 && classes?.oddCell,\n ];\n}\n\nexport const Row = memo(function Row<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }): JSX.Element | null {\n const table = useTableContext<T>();\n const divRef = useRef<HTMLDivElement>(null);\n\n const { className, indent, hasChildren, hasDeferredChildren, columnIds, enableSelection, rowAction } = table.useState((state) => {\n const item = state.activeItemsById.get(itemId);\n const index = !item ? -1 : state.activeItems.indexOf(item);\n\n return {\n className: cx(...calcClassNames(state.props.classes, item, index)),\n indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n hasChildren: !!item?.children.length,\n hasDeferredChildren: item && state.props.hasDeferredChildren?.(item),\n columnIds: state.activeColumns.map((column) => column.id),\n enableSelection: state.props.enableSelection,\n rowAction: state.props.rowAction instanceof Function ? (item ? state.props.rowAction(item, index) : null) : state.props.rowAction,\n };\n });\n\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n const o = new ResizeObserver(() => {\n if (!document.contains(div)) return;\n table.update((state) => {\n state.rowHeights.set(itemId, div.offsetHeight);\n });\n });\n o.observe(div);\n\n return () => o.disconnect();\n }, [divRef.current]);\n\n table.getState().props.debugRender?.('render row', itemId);\n\n return (\n <>\n <div className={className} css={[defaultClasses.cellFill]} ref={divRef} />\n\n <div className={className} css={[defaultClasses.cell, defaultClasses.firstCell]}>\n <div css={{ width: indent * 20 }} />\n\n {enableSelection && <SelectComponent itemId={itemId} />}\n\n {(hasChildren || hasDeferredChildren) && <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />}\n\n {rowAction}\n </div>\n\n {columnIds.map((columnId) => (\n <ColumnContext.Provider key={columnId} value={columnId}>\n <Cell itemId={itemId} rowIndex={rowIndex} />\n </ColumnContext.Provider>\n ))}\n\n <div className={className} css={[defaultClasses.cellFill]} />\n </>\n );\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme } from '..';\nimport { useColumnContext, useTableContext } from './table';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n const {\n components: { Badge },\n icons: { ArrowUpward },\n } = useTheme();\n\n const { direction, index } = table.useState((state) => {\n const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n return {\n direction: state.sort[index]?.direction,\n index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n };\n });\n\n function toggle(e: React.MouseEvent, off?: boolean) {\n const {\n props: { sort: controlledSort, onSortChange },\n } = table.getState();\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort = e.getModifierState('Control') || off ? table.getState().sort.filter((s) => s.columnId !== columnId) : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n onSortChange?.(newSort);\n\n if (!controlledSort) {\n table.update((state) => {\n state.sort = newSort;\n });\n }\n\n e.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n\n '& > div': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }}\n onClick={(e) => toggle(e)}\n onContextMenu={(e) => toggle(e, true)}\n >\n <div>{children}</div>\n\n <Badge badgeContent={index}>\n <span\n css={[\n { transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n </div>\n );\n}\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: NodeJS.Timeout | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return Object.assign(\n function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n },\n {\n flush() {\n if (lastArgs) {\n run();\n }\n },\n },\n );\n}\n","import React, { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\nimport { useTableContext } from './table';\nimport { Id } from '../types';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n const parent = x.parentElement;\n if (!parent) return document.documentElement;\n if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible') return parent;\n return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n return 0;\n};\n\nexport function Virtualized<T>({\n header,\n children,\n ...props\n}: { header: ReactNode; children: (itemIds: Id[], startIndex: number) => ReactNode } & HTMLProps<HTMLDivElement>): JSX.Element {\n const table = useTableContext<T>();\n const virtual = table.useState('props.virtual');\n const probeRef = useRef<HTMLDivElement>(null);\n const [, setCounter] = useState(0);\n\n const {\n itemIds = [],\n from = 0,\n to,\n before = 0,\n after = 0,\n } = table.useState(\n (state) => {\n const itemIds = state.activeItems.map((item) => item.id);\n const root = probeRef.current && findScrollRoot(probeRef.current);\n if (!state.props.virtual) return { itemIds };\n if (!probeRef.current || !root || !document.contains(root)) return {};\n\n const {\n rowHeight,\n initalRowHeight,\n overscan = 100,\n overscanTop,\n overscanBottom,\n } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n let totalHeight = 0;\n const rowHeights = itemIds.map((itemId, index) => {\n const h = rowHeight ?? state.rowHeights.get(itemId) ?? initalRowHeight ?? (index === 0 ? 100 : totalHeight / index);\n totalHeight += h;\n return h;\n });\n\n const probeOffset = relativeOffset(probeRef.current, root);\n const headerHeight = probeRef.current.offsetTop;\n const topOfTable = root.scrollTop - probeOffset + headerHeight;\n const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n let from = 0,\n to = itemIds.length,\n before = 0,\n after = 0;\n for (const h of rowHeights) {\n if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n from++;\n before += h;\n }\n\n for (const h of rowHeights.reverse()) {\n if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n to--;\n after += h;\n }\n\n return { itemIds: itemIds.slice(from, to), from, to, before, after };\n },\n { throttle: 16 },\n );\n\n const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n const incCounter = useMemo(() => throttle(() => setCounter((c) => c + 1), throttleScroll), [throttleScroll]);\n\n useEffect(() => {\n if (!virtual || !probeRef.current) return;\n\n window.addEventListener('scroll', incCounter, true);\n return () => {\n window.removeEventListener('scroll', incCounter, true);\n };\n }, [probeRef.current, incCounter]);\n\n table.getState().props.debugRender?.(`Virtualalized render ${from} to ${to}`);\n\n return (\n <div {...props}>\n {header}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n {children(itemIds, from)}\n\n {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n </div>\n );\n}\n","import React, { createContext, memo, useContext, useEffect, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { useTheme } from '..';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { Id, InternalTableState, TableProps } from '../types';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle, ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { SortComponent } from './sortComponent';\nimport { Virtualized } from './virtualized';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\nexport const ColumnContext = createContext<Id | null>(null);\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n const value = useContext(TableContext);\n if (!value) throw Error('No table context available');\n return value as Store<InternalTableState<T>>;\n}\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw Error('No column context available');\n return value;\n}\n\nexport function Table<T>(props: TableProps<T>): JSX.Element {\n const table = useTableState(props);\n\n table.getState().props.debugRender?.('render table');\n\n return (\n <TableContext.Provider value={table}>\n <TableLoadingState />\n </TableContext.Provider>\n );\n}\n\nfunction TableLoadingState() {\n const { text } = useTheme();\n const isHydrated = useTableStateStorage();\n const [showLoading, setShowLoading] = useState(false);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n });\n\n return (\n <>\n {!isHydrated && showLoading && <div>{text.loading}</div>}\n <TableInner hidden={!isHydrated} />\n </>\n );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n const table = useTableContext<T>();\n const fullWidth = table.useState('props.fullWidth');\n const activeColumns = table.useState((state) =>\n state.activeColumns.map((column) => ({\n id: column.id,\n width: column.width,\n classes: column.classes,\n header: column.header,\n })),\n );\n const columnWidths = table.useState('columnWidths', { throttle: 16 });\n const columnStyleOverride = table.useState('columnStyleOverride', { throttle: 16 });\n const defaultWidth = table.useState('props.defaultWidth');\n const classes = table.useState('props.classes');\n const stickyHeader = table.useState('props.stickyHeader');\n const enableSelection = table.useState('props.enableSelection');\n const enableColumnSelection = table.useState('props.enableColumnSelection');\n const enableExport = table.useState((state) => !!state.props.enableExport.copy || !!state.props.enableExport.download);\n const cssVariables = useCssVariables();\n\n table.getState().props.debugRender?.('render table inner');\n\n return (\n <Virtualized\n className={classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n {\n gridTemplateColumns: [\n //\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...activeColumns.map((column) => columnWidths.get(column.id) ?? column.width ?? defaultWidth ?? 'max-content'),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n },\n hidden && { visibility: 'hidden' },\n ]}\n header={\n <>\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerCell, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n >\n {enableSelection && <SelectComponent />}\n\n {enableColumnSelection && <ColumnSelection />}\n\n {enableExport && <Export />}\n <ResizeHandleView />\n </div>\n\n <ColumnHeaderContext.Provider>\n {activeColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader\n className={cx(classes?.headerCell, column.classes?.headerCell)}\n css={[\n defaultClasses.headerCell,\n columnStyleOverride.get(column.id),\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n key={column.id}\n >\n <SortComponent>{column.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n <ResizeHandle />\n </ColumnHeader>\n </ColumnContext.Provider>\n ))}\n </ColumnHeaderContext.Provider>\n\n <div\n className={classes?.headerCell}\n css={[defaultClasses.headerFill, stickyHeader && defaultClasses.sticky, stickyHeader instanceof Object && stickyHeader]}\n />\n </>\n }\n >\n {(itemIds, startIndex) => itemIds.map((itemId, index) => <Row key={itemId} itemId={itemId} rowIndex={startIndex + index} />)}\n </Virtualized>\n );\n});\n","import React, { ReactNode, useState } from 'react';\nimport { useColumnContext, useFilter, useTheme } from '..';\nimport { asString, castArray, flatMap, uniq } from '../misc/helpers';\nimport { CommonFilterProps, InternalColumn, SerializableValue } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport { useTableContext } from './table';\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nexport function SelectFilter<T, V, F extends SerializableValue>({\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n ...props\n}: {\n options?: F[];\n stringValue?: (value: F) => string;\n render?: (value: F) => ReactNode;\n singleSelect?: boolean;\n} & CommonFilterProps<T, V, F, Set<F>>): JSX.Element {\n const {\n components: { IconButton, Checkbox },\n icons: { Search, Clear },\n text,\n } = useTheme();\n\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n const options = table.useState((state) => {\n if (providedOptions) return uniq(providedOptions);\n\n const column = state.activeColumns.find((column) => column.id === columnId) as InternalColumn<T, V> | undefined;\n if (!column) return [];\n\n const filterBy = props.filterBy ?? ((x) => x as unknown as F | F[]);\n\n return uniq(flatMap(state.items, (item) => castArray(filterBy(column.value(item), item))));\n });\n\n const [query, setQuery] = useState('');\n const filtered = options.filter((option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()));\n\n const { value = new Set<F>(), onChange } = useFilter({\n ...props,\n\n id: 'selectFilter',\n\n isActive(filterValue) {\n return filterValue.size > 0;\n },\n\n test(filterValue, value) {\n return filterValue.has(value);\n },\n });\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gap: 'var(--spacing)',\n }}\n >\n <AutoFocusTextField\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n endIcon={<IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>}\n css={{ marginBottom: 'var(--spacing)' }}\n />\n\n <div css={{ maxHeight: '20em', overflowY: 'auto' }}>\n <FormControlLabel\n disabled={value.size === 0}\n control={<Checkbox disabled={value.size === 0} checked={value.size > 0} onChange={() => onChange(new Set())} />}\n label={<><{text.selected(value.size)}></>}\n ></FormControlLabel>\n\n {filtered.map((option, index) => (\n <FormControlLabel\n key={index}\n control={<Checkbox checked={value.has(option)} onChange={() => onChange(toggle(value, option, singleSelect))} />}\n label={render(option)}\n ></FormControlLabel>\n ))}\n </div>\n\n {filtered.length === 0 && <span css={{ textAlign: 'center' }}>{text.noResults}</span>}\n </div>\n );\n}\n","export function debounce<Args extends any[]>(fn: (...args: Args) => void, ms: number): { (...args: Args): void; flush(): void } {\n let lastArgs: Args | undefined;\n let timeout: NodeJS.Timeout | undefined;\n\n function run() {\n const args = lastArgs;\n\n lastArgs = undefined;\n timeout = undefined;\n\n fn(...(args as Args));\n }\n\n return Object.assign(\n function (...args: Args) {\n lastArgs = args;\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(run, ms);\n },\n {\n flush() {\n if (timeout) {\n clearTimeout(timeout);\n run();\n }\n },\n },\n );\n}\n","import { castDraft } from 'immer';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useColumnContext, useTableContext } from '..';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { FilterImplementation, SerializableValue } from '../types';\n\nexport function useFilter<T, V, F, S extends SerializableValue>(impl: FilterImplementation<T, V, F, S>) {\n const table = useTableContext<T>();\n const columnId = useColumnContext();\n\n // Update implementation\n useEffect(() => {\n table.update((state) => {\n if (impl.defaultValue !== undefined) {\n state.filterValues.set(columnId, impl.defaultValue);\n }\n });\n }, []);\n\n useEffect(() => {\n table.update((state) => {\n state.filters.set(columnId, castDraft(impl));\n\n if (impl.value !== undefined) {\n state.filterValues.set(columnId, impl.value);\n }\n });\n\n return () => {\n table.update((state) => {\n state.filters.delete(columnId);\n });\n };\n }, [table, columnId, ...(impl.dependencies ?? [impl])]);\n\n // Track local value and update it globally after delay\n const value = table.useState((state) => state.filterValues.get(columnId) as S | undefined);\n const [dirtyValue, setDirtyValue] = useState<S>();\n const implRef = useRef(impl);\n\n useLayoutEffect(() => {\n implRef.current = impl;\n });\n\n const delayedUpdate = useMemo(\n () =>\n debounce((value?: S) => {\n const { value: controlledValue, onChange } = implRef.current;\n\n if (controlledValue === undefined) {\n table.update((state) => {\n state.filterValues.set(columnId, value);\n });\n }\n\n onChange?.(value);\n setDirtyValue(undefined);\n }, 500),\n [table],\n );\n\n function onChange(value?: S) {\n setDirtyValue(value);\n delayedUpdate(value);\n }\n\n useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n return {\n value: dirtyValue ?? value,\n onChange,\n close: useContext(FilterControlContext),\n };\n}\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n","import React from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport { textMatch } from '../misc/textMatch';\nimport { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function TextFilter<T, V>({\n compare = textMatch,\n filterBy = asStringOrArray,\n ...props\n}: {\n compare?: (a: string, b: string) => boolean;\n} & CommonFilterProps<T, V, string, string>): JSX.Element {\n const {\n components: { IconButton },\n icons: { Search, Clear },\n } = useTheme();\n\n const { value = '', onChange } = useFilter({\n ...props,\n filterBy,\n\n id: 'textFilter',\n\n isActive(filterValue) {\n return !!filterValue;\n },\n\n test(filterValue, value) {\n return compare(value, filterValue);\n },\n });\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n }}\n >\n <AutoFocusTextField\n value={value}\n onChange={(e) => onChange(e.target.value)}\n endIcon={<IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>}\n />\n </div>\n );\n}\n"],"names":["props","components","TextField","useTheme","ref","useRef","visible","useContext","PopoverContext","current","focus","_jsx","weekDays","months","startOfDay","d","Date","getFullYear","getMonth","getDate","endOfDay","a","b","min","max","value","onChange","rangeSelect","locale","firstDayOfWeek","IconButton","icons","ChevronRight","baseDate","useState","dateInView","setDateInView","currentMin","setCurrentMin","hovered","setHovered","undefined","calendars","getBackProps","getForwardProps","getDateProps","useDayzed","onDateSelected","showOutsideDays","date","onOffsetChanged","offset","formatWeekday","useMemo","format","Intl","DateTimeFormat","weekday","weekDay","UTC","map","month","year","weeks","_jsxs","margin","display","gridAutoFlow","justifyContent","alignItems","transform","gridTemplateColumns","fontWeight","_v","justifySelf","marginBottom","week","index","dateObj","dayIndex","prevMonth","nextMonth","today","selected","getTime","dateIntersect","preSelected","padding","border","background","cursor","color","gray","Popover","cssVariables","useCssVariables","anchor","setAnchor","formatMonth","fontSize","e","currentTarget","input","setInput","Number","formatYear","String","width","target","match","apply","key","x","Object","range","convertDate","Array","convertDateOrRange","filter","Boolean","singleSelect","filterBy","convertDateOrArray","Button","text","useFilter","id","isActive","filterValue","test","formatDate","dateStyle","marginTop","thisWeek","reset","now","diff","getDay","setDate","control","label","disabled","userSelect","marginLeft","castDraft","useTableTheme","Store","ColumnHeaderContext","StoreScope","items","Map","columnId","useColumnContext","table","useTableContext","enabled","store","useStore","draggingStart","clone","div","update","state","set","delete","offsetLeft","cols","getState","columnOrder","get","otherCols","col","firstOffsetleft","find","sum","targetIndex","findIndex","offsetWidth","length","mouseX","clientX","bounds","getBoundingClientRect","Math","abs","stopPropagation","setPointerCapture","pointerId","cloneNode","body","append","entries","getComputedStyle","style","assign","pointerEvents","position","boxShadow","left","top","indexOf","calcTargetIndex","columns","forEach","i","slice","reduce","columnStyleOverride","transition","zIndex","splice","remove","clear","onPointerDown","onPointerMove","onPointerUp","children","Checkbox","Settings","hiddenColumns","anchorEl","setAnchorEl","toggle","column","controlledHiddenColumns","onHiddenColumnsChange","newValue","Set","has","add","selectColumns","cannotHide","header","Export","Clipboard","generate","options","activeColumns","activeItems","data","item","exportCell","csvExport","copy","clipboard","writeText","enableExport","download","document","createElement","href","encodeURIComponent","appendChild","click","removeChild","justifyItems","gap","exportTitle","exportCopy","exportDownload","FilterControlContext","createContext","FilterList","ArrowDropDown","filters","filterValues","close","useCallback","preventDefault","hasPointerCapture","parent","parentElement","columnWidths","releasePointerCapture","getModifierState","onDoubleClick","alignSelf","content","height","Cell","memo","itemId","rowIndex","classes","activeItemsById","throttle","debugRender","classNames","calcClassNames","renderCell","cx","defaultClasses","cell","hasDeferredChildren","Spinner","isExpanded","expanded","hasChildren","controlledExpanded","expandOnlyOne","onExpandedChange","newExpanded","ancestor","getAncestors","isSelected","itemIds","from","keys","size","every","selection","mouseEvent","nativeEvent","lastSelectedId","selectSyncChildren","controlledSelection","onSelectionChange","shiftKey","newSelection","descendant","getDescendants","Function","evenCell","oddCell","Row","divRef","className","indent","columnIds","enableSelection","rowAction","o","ResizeObserver","contains","rowHeights","offsetHeight","observe","disconnect","cellFill","firstCell","Badge","ArrowUpward","direction","sort","s","off","controlledSort","onSortChange","newDirection","newSort","push","overflow","textOverflow","opacity","findScrollRoot","documentElement","scrollHeight","clientHeight","overflowY","relativeOffset","y","offsetParent","offsetTop","HTMLElement","virtual","probeRef","setCounter","to","before","after","root","rowHeight","initalRowHeight","overscan","overscanTop","overscanBottom","totalHeight","h","probeOffset","headerHeight","topOfTable","scrollTop","bottomOfTable","reverse","throttleScroll","incCounter","c","addEventListener","removeEventListener","gridColumn","TableContext","ColumnContext","Error","useTableState","isHydrated","useTableStateStorage","showLoading","setShowLoading","handle","setTimeout","clearTimeout","loading","TableInner","hidden","fullWidth","defaultWidth","stickyHeader","enableColumnSelection","join","visibility","headerCell","headerFill","sticky","flex","startIndex","newSet","providedOptions","stringValue","asString","render","Search","Clear","uniq","flatMap","castArray","query","setQuery","filtered","option","toLowerCase","includes","maxHeight","textAlign","noResults","compare","textMatch","asStringOrArray"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAE2B;QACnB,QAAQ;SACP,MAAM,SAAS;AAAA;4BCGWA,OAAgC;QAC3D;AAAA,IACJC,YAAY;AAAA,MAAEC;AAAAA;AAAAA,MACZC;QAEEC,MAAMC,aAAyB;QAC/B;AAAA,IAAEC;AAAAA,MAAYC,iBAAWC;wBAEf,MAAM;QAChBF,WAAWF,IAAIK,SAAS;UACtBA,QAAQC;AAAAA;AAAAA,KAEb,CAACJ;SAEGK,eAAC,4CAAcX;IAAO,UAAUI;AAAAA;AAAAA;2BCnBP;QAC1B,QAAQ;SACP,MAAM,SAAS,CAAC;IACrB,aAAa,MAAM,MAAM;AAAA,IACzB,iBAAiB,MAAM,MAAM,OAAO,QAAQ;AAAA,IAC5C,kBAAkB,MAAM,MAAM,OAAO,QAAQ;AAAA,IAC7C,yBAAyB,MAAM,MAAM,OAAO,QAAQ;AAAA,IACpD,mBAAmB,MAAM,MAAM,OAAO,UAAU;AAAA,IAChD,oBAAoB,MAAM,MAAM,OAAO,UAAU;AAAA,IACjD,2BAA2B,MAAM,MAAM,OAAO,UAAU;AAAA;AAAA;ACK5D,MAAMQ,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AACpC,MAAMC,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI;MAErCC,aAAa,CAACC,MAAY,IAAIC,KAAKD,EAAEE,eAAeF,EAAEG,YAAYH,EAAEI;MAEpEC,WAAW,CAACL,MAAY,IAAIC,KAAKD,EAAEE,eAAeF,EAAEG,YAAYH,EAAEI,YAAY,GAAG,GAAG,GAAG,GAAG;uBAEzEE,GAA4BC,GAA4B;MAChFD,aAAaL,MAAM;QACjB;AAAA,MAAEO,KAAKF;AAAAA,MAAGG,KAAKH;AAAAA;AAAAA;MAEjBC,aAAaN,MAAM;QACjB;AAAA,MAAEO,KAAKD;AAAAA,MAAGE,KAAKF;AAAAA;AAAAA;MAGjB,CAACD,wBAAGE,QAAO,CAACF,EAAEG,OAAO,CAACF,wBAAGC,QAAO,CAACD,EAAEE,KAAK;WACnC;AAAA;SAGF,WAAWH,EAAEG,OAAOV,WAAWQ,EAAEC,QAAQT,WAAWO,EAAEE,OAAOH,SAASE,EAAEE;AAAAA;oBAGtD;AAAA,EAAEC;AAAAA,EAAOC;AAAAA,EAAUC;AAAAA,EAAaC;AAAAA,EAAQC,iBAAiB;AAAA,GAAsB;QAClG;AAAA,IACJ5B,YAAY;AAAA,MAAE6B;AAAAA;AAAAA,IACdC,OAAO;AAAA,MAAEC;AAAAA;AAAAA,MACP7B;QAEE,CAAC8B,YAAYC,eAAS,IAAIlB;QAC1B,CAACmB,YAAYC,iBAAiBF,eAAeD;QAC7C,CAACI,YAAYC,iBAAiBJ;QAC9B,CAACK,SAASC,cAAcN;QAExBX,MAAMc,mDAAgCrB,OAAOS,QAAQA,+BAAOF;QAC5DC,MAAMa,aAAaI,SAAYhB,iBAAiBT,OAAOS,QAAQA,+BAAOD;QAEtE;AAAA,IAAEkB;AAAAA,IAAWC;AAAAA,IAAcC;AAAAA,IAAiBC;AAAAA,MAAiBC,iBAAU;AAAA,IAC3EC,gBAAgB,MAAMN;AAAAA,IACtBZ;AAAAA,IACAmB,iBAAiB;AAAA,IACjBC,MAAMd;AAAAA,IACNe,iBAAkBC,YAAWf,cAAc,IAAIpB,KAAKmB,WAAWlB,eAAekB,WAAWjB,aAAaiC;AAAAA,IACtGA,QAAQ;AAAA;QAGJC,gBAAgBC,cAAQ,MAAM;UAC5B;AAAA,MAAEC;AAAAA,QAAW,IAAIC,KAAKC,eAAe5B,QAAQ;AAAA,MAAE6B,SAAS;AAAA;WACvD,CAACC,YAAoBJ,OAAO,IAAItC,KAAKA,KAAK2C,IAAI,MAAM,GAAGD;AAAAA,KAC7D,CAAC9B;kBAEM,MAAMQ,cAAcX,UAAU,OAAO,IAAIT,SAASS,iBAAiBT,OAAOS,QAAQA,MAAMD,MAAM,CAACC;SAGvGd;cACG+B,UAAUkB,IAAI,CAAC;AAAA,MAAEC;AAAAA,MAAOC;AAAAA,MAAMC;AAAAA,UAC7BC;iBACEA;QACE,KAAK;AAAA,UACHC,QAAQ;AAAA,UACRC,SAAS;AAAA,UACTC,cAAc;AAAA,UACdC,gBAAgB;AAAA,UAChBC,YAAY;AAAA;AAAA,mBAGd1D,eAAC,6CAAegC,aAAa;AAAA,UAAED;AAAAA;oBAC7B/B,eAAC;YAAa,KAAK;AAAA,cAAE2D,WAAW;AAAA;AAAA;AAAA,aAGlCN;UAAK,KAAK;AAAA,YAAEE,SAAS;AAAA;AAAA,qBACnBvD,eAAC;YAAc,OAAOkD;AAAAA,YAAO,UAAWA,YAAUzB,cAAc,IAAIpB,KAAK8C,MAAMD;AAAAA,YAAS;AAAA,cAExFlD,eAAC;YAAa,OAAOmD;AAAAA,YAAM,UAAWA,WAAS1B,cAAc,IAAIpB,KAAK8C,OAAMD;AAAAA;AAAAA,YAG9ElD,eAAC,6CAAeiC,gBAAgB;AAAA,UAAEF;AAAAA;oBAChC/B,eAAC;;UAILqD;QACE,KAAK;AAAA,UACHE,SAAS;AAAA,UACTK,qBAAqB;AAAA,UACrBC,YAAY;AAAA;AAAA,mBAGb5D,SAASgD,IAAI,CAACa,IAAIf,YACjB/C;UAAmB,KAAK;AAAA,YAAE+D,aAAa;AAAA,YAAUC,cAAc;AAAA;AAAA,oBAC5DvB,cAAcM;AAAAA,WADPA,WAKXK,MAAMH,IAAI,CAACgB,MAAMC,UAChBD,KAAKhB,IAAI,CAACkB,SAASC,aAAa;cAC1B,CAACD,SAAS;mBACLnE;;gBAGH;AAAA,YAAEqE;AAAAA,YAAWC;AAAAA,YAAWhC;AAAAA,YAAMiC;AAAAA,cAAUJ;gBAExCK,WAAWlC,KAAKmC,cAAc7D,4BAAK6D,cAAc7D,OAAOC,OAAO6D,cAAcpC,MAAM;AAAA,YAAE1B;AAAAA,YAAKC;AAAAA;gBAC1F8D,cACJ,CAACH,kBACKC,cAAc7C,oCAAS6C,cAC1B7D,OAAO,CAACC,OAAOe,WAAW8C,cAAcpC,MAAM1B,OAAOgB,UAAU;AAAA,YAAEhB;AAAAA,YAAKC,KAAKe;AAAAA,cAAY;AAAA,YAAEhB,KAAKgB;AAAAA,YAASf,KAAKD;AAAAA;iBAG/GZ;YAEE,KAAK,CACH;AAAA,cACE4E,SAAS;AAAA,cACTC,QAAQ;AAAA,cACRC,YAAY;AAAA,cACZC,QAAQ;AAAA,6BAEIT,cAAc;AAAA,cAC1BU,OAAOC;eAETV,UAAS;AAAA,cACPM,QAAQ;AAAA,eAEVL,YAAY;AAAA,cACVM,YAAY;AAAA,cACZE,OAAO;AAAA,eAETL,eAAe;AAAA,cACbG,YAAY;AAAA,cACZE,OAAO;AAAA;AAAA,aAGP9C,aAAa;AAAA,YAAEiC;AAAAA;YACnB,SAAS,MAAM;kBACT,CAACnD,aAAa;8BACFc;yBACLQ;AAAAA,yBACA1B,OAAO,CAACC,KAAK;8BACRiB;oBACVQ,OAAO1B,KAAK;2BACL;AAAA,oBAAEA;AAAAA,oBAAKC,KAAKyB;AAAAA;AAAAA,uBAChB;2BACI;AAAA,oBAAE1B,KAAK0B;AAAAA,oBAAMzB,KAAKD;AAAAA;AAAAA;AAAAA,qBAExB;8BACS0B;AAAAA;AAAAA;AAAAA,YAGlB,eAAe,MAAMT,WAAWS;AAAAA,YAChC,cAAc,MAAMT,WAAWC;AAAAA,sBAE9BQ,KAAK9B;AAAAA,cA1CA,GAAE0D,SAASE;AAAAA;AAAAA;AAAAA,OAtDlB,GAAElB,QAAQC;AAAAA;AAAAA;AA4G7B,uBAAuB;AAAA,EAAErC;AAAAA,EAAOC;AAAAA,EAAUE;AAAAA,GAAiF;QACnH;AAAA,IACJ3B,YAAY;AAAA,MAAE4F;AAAAA;AAAAA,MACZ1F;QACE2F,eAAeC;QAEf,CAACC,QAAQC,aAAa/D;QAEtBgE,cAAc7C,cAAQ,MAAM;UAC1B;AAAA,MAAEC;AAAAA,QAAW,IAAIC,KAAKC,eAAe5B,QAAQ;AAAA,MAAEiC,OAAO;AAAA;WACrD,CAACA,UAAkBP,OAAO,IAAItC,KAAK,MAAM6C;AAAAA,KAC/C,CAACjC;SAGFoC;eACErD;MACE,KAAK;AAAA,QACH6E,QAAQ;AAAA,QACRC,YAAY;AAAA,QACZU,UAAU;AAAA,QACVT,QAAQ;AAAA;AAAA,MAEV,SAAUU,OAAMH,UAAUG,EAAEC;AAAAA,gBAE3BH,YAAYzE;AAAAA,QAGfd,eAAC;MAAQ,MAAM,CAAC,CAACqF;AAAAA,MAAQ,UAAUA,0BAAU;AAAA,MAAM,SAAS,MAAMC,UAAUxD;AAAAA,MAAY,OAAM;AAAA,MAAS,KAAKqD;AAAAA,gBAC1GnF;QACE,KAAK;AAAA,UACHuD,SAAS;AAAA;AAAA,kBAGVrD,OAAO+C,IAAKC,WACXlD;UAEE,KAAK,CACH;AAAA,YACE4E,SAAS;AAAA,YACTC,QAAQ;AAAA,YACRC,YAAY;AAAA,uBAED;AAAA,cACTA,YAAY;AAAA;AAAA,aAGhB5B,UAAUpC,SAAS;AAAA,YAAEgE,YAAY;AAAA;AAAA,UAEnC,SAAS,MAAM/D,SAASmC;AAAAA,oBAEvBqC,YAAYrC;AAAAA,WAfRA;AAAAA;AAAAA;AAAAA;AAAAA;AAwBnB,sBAAsB;AAAA,EAAEpC;AAAAA,EAAOC;AAAAA,EAAUE;AAAAA,GAAgF;QACjH,CAAC0E,OAAOC,YAAYrE;QACpB9B,MAAMC,aAAyB;mBAEpB;aACNmG,OAAOF;aACP7D;AAAAA;QAGLgE,aAAapD,cAAQ,MAAM;UACzB;AAAA,MAAEC;AAAAA,QAAW,IAAIC,KAAKC,eAAe5B,QAAQ;AAAA,MAAEkC,MAAM;AAAA;WACpD,CAACA,SAAiBR,OAAO,IAAItC,KAAK8C,MAAM,GAAG;AAAA,KACjD,CAAClC;wBAEY;;AAAMxB,qBAAIK,YAAJL,mBAAaM;AAAAA,KAAS,CAACN,IAAIK;MAE7C6F,UAAU7D,QAAW;WAChB9B;MAAK,SAAS,MAAM4F,SAASG,OAAOjF;AAAAA,gBAAUgF,WAAWhF;AAAAA;AAAAA;SAIhEd;IACE;AAAA,IACA,KAAK;AAAA,MAAEgG,OAAO;AAAA;AAAA,IACd,OAAOL;AAAAA,IACP,UAAWF,OAAM;UACXA,EAAEQ,OAAOnF,MAAMoF,MAAM,cAAc;iBAC5BT,EAAEQ,OAAOnF;AAAAA;AAAAA;AAAAA,IAGtB,QAAQqF;AAAAA,IACR,YAAaV,OAAMA,EAAEW,QAAQ,WAAWD;AAAAA;AAAAA;ACxQ9C,qBAAqBE,GAAyB;MACxCA,aAAahG;WAAagG;MAC1B,OAAOA,MAAM,YAAY,OAAOA,MAAM;WAAiB,IAAIhG,KAAKgG;SAC7D;AAAA;AAGT,4BAA4BA,GAAqC;MAC3DA,aAAaC,UAAU,SAASD,KAAK,SAASA,GAAG;UAC7CE,QAAQ;AAAA,MACZ3F,KAAK4F,YAAaH,EAAUzF;AAAAA,MAC5BC,KAAK2F,YAAaH,EAAUxF;AAAAA;WAEvB0F,MAAM3F,OAAO2F,MAAM1F,MAAO0F,QAAsB;AAAA;SAElDC,YAAYH;AAAAA;AAGrB,4BAA4BA,GAA4D;MAClFA,aAAaI;WAAcJ,EAAEpD,IAAIyD,oBAAoBC,OAAOC;SACzDF,mBAAmBL;AAAAA;oBAGK,IAU2D;AAV3D,eAC/BpF;AAAAA;AAAAA,IACAC;AAAAA,IACA2F;AAAAA,IACAC,WAAWC;AAAAA,MAJoB,IAK5B1H,kBAL4B,IAK5BA;AAAAA,IAJH4B;AAAAA,IACAC;AAAAA,IACA2F;AAAAA,IACAC;AAAAA;QAOM;AAAA,IACJxH,YAAY;AAAA,MAAE0H;AAAAA;AAAAA,IACdC;AAAAA,MACEzH;QAEE;AAAA,IAAEsB,QAAQ;AAAA,IAAMC;AAAAA,MAAamG,UAAU,iCACxC7H,QADwC;AAAA,IAE3CyH;AAAAA,IAEAK,IAAI;AAAA,IAEJC,SAASC,aAAa;aACb,CAAC,CAACA;AAAAA;AAAAA,IAGXC,KAAKD,aAAavG,QAAO;aAChB4D,cAAc2C,aAAavG;AAAAA;AAAAA;QAIhCyG,aAAa7E,cAAQ,MAAM;UACzB;AAAA,MAAEC;AAAAA,QAAW,IAAIC,KAAKC,eAAe5B,QAAQ;AAAA,MAAEuG,WAAW;AAAA;WACzD7E;AAAAA,KACN,CAAC1B;SAGFoC;IACE,KAAK;AAAA,MACHuB,SAAS;AAAA,MACTrB,SAAS;AAAA;AAAA,eAGV,CAACsD,gBACAxD;MACE,KAAK;AAAA,QACHW,cAAc;AAAA,QACdT,SAAS;AAAA,QACTE,gBAAgB;AAAA;AAAA,iBAGjB3C,QAAQyG,WAAWzG,iBAAiBT,OAAOS,QAAQA,MAAMF,OAAO,UAAM,KACtEE,QAAQyG,WAAWzG,iBAAiBT,OAAOS,QAAQA,MAAMD,OAAO;AAAA,QAIrEb,eAAC;MAAW,aAAa,CAAC6G;AAAAA,MAAc;AAAA,MAAc;AAAA,MAAoB;AAAA,MAAgB;AAAA,QAE1FxD;MAAK,KAAK;AAAA,QAAEoE,WAAW;AAAA,QAAkBlE,SAAS;AAAA,QAAQC,cAAc;AAAA,QAAUC,gBAAgB;AAAA;AAAA,iBAChGzD,eAAC;QAAO,SAAQ;AAAA,QAAO,SAAS,MAAMe,SAASwD;AAAAA,kBAC5C0C,KAAK1C;AAAAA,UAGRvE,eAAC;QAAO,SAAQ;AAAA,QAAO,SAAS,MAAMe,SAAS2G,SAASxG;AAAAA,kBACrD+F,KAAKS;AAAAA,UAGR1H,eAAC;QAAO,SAAQ;AAAA,QAAO,SAAS,MAAMe,SAAS;AAAA,kBAC5CkG,KAAKU;AAAAA;AAAAA;AAAAA;AAAAA;MAOHpD,QAAQ,MAAiB;QAC9BA,SAAQpE,WAAW,IAAIE;SACtB;AAAA,IAAEO,KAAK2D;AAAAA,IAAO1D,KAAK0D;AAAAA;AAAAA;MAGfmD,WAAW,CAACxG,iBAAiB,MAAiB;QACnD0G,MAAM,IAAIvH;QACVO,MAAM,IAAIP,KAAKuH;MAEjBC,OAAOjH,IAAIkH,WAAW5G;MACtB2G,OAAO,GAAG;YACJ;AAAA;MAENE,QAAQnH,IAAIJ,YAAYqH;QAEtBhH,MAAM,IAAIR,KAAKO;MACjBmH,QAAQlH,IAAIL,YAAY;SAErB;AAAA,IAAEI,KAAKT,WAAWS;AAAAA,IAAMC,KAAKJ,SAASI;AAAAA;AAAAA;MCtHlC,UAAU,CAAO,KAAkB,aAAgC;SACvE,CAAC,GAAG,KAAK,OAAY,CAAC,KAAK,QAAQ,IAAI,OAAO,SAAQ,OAAO;AAAA;MAGzD,UAAU,CAAI,KAAU,YAA+B,IAAI,YAAgC,OAAY;MAC9G,UAAU,WAAW;gBAAe,CAAC,CAAC,MAAM;SAEzC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,MAAM;;aACpB,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;YACnC,MAAK,gBAAU,OAAV,mCAAe;YACpB,MAAK,gBAAU,OAAV,mCAAe;YACpB,MAAM,UAAU,OAAO,SAAS,KAAK;UACvC,MAAK;eAAW;UAChB,MAAK;eAAW,CAAC;AAAA;WAEhB;AAAA;AAAA;MAIE,OAAO,CAAI,QAAkB;QAClC,0BAAU;aACL,KAAK;QAAS,IAAI;SACtB,MAAM,KAAK;AAAA;MAGP,YAAY,CAAI,GAAgB,MAAsC;QAC3E,6BAAa;aACR,KAAK;QAAO,EAAE,IAAI;aAAW,IAAI;SACrC;AAAA;MAGI,eAAe,CAAI,oBAA2C,UAAmC;QACtG,6BAAa;QAEb,OAAO,CAAC,EAAE,eAAmC;UAC3C,SAAS,WAAW,gBAAgB,IAAI,YAAY;QACtD,UAAU,CAAC,OAAO,IAAI,OAAO,KAAK;aAC7B,IAAI,OAAO;WACb;AAAA;AAAA;QAGH,QAAQ;SACP;AAAA;MAGI,iBAAiB,IAAO,UAAmC;QAChE,6BAAa;QAEb,OAAO,CAAC,SAA6B;eAC9B,SAAS,KAAK,UAAU;UAC7B,CAAC,OAAO,IAAI,MAAM,KAAK;eAClB,IAAI,MAAM;aACZ;AAAA;AAAA;AAAA;QAIL,QAAQ;SACP;AAAA;MAKI,WAAW,CAAC,MAAuB;MAC1C,aAAa;WAAc,EAAE,IAAI,UAAU,KAAK;MAChD,aAAa;WAAe,KAAK,UAAU;SACxC,OAAO,gBAAK;AAAA;MAGR,kBAAkB,CAAC,MAAkC;MAC5D,aAAa;WAAc,EAAE,IAAI;SAC9B,SAAS;AAAA;MAOL,YAAY,CAAI,MAAgB,aAAa,QAAQ,IAAI,CAAC;MAE1D,KAAK,IAAI,eACpB,WACG,QAAQ,CAAC,UAAU;MACd,CAAC;WAAc;MACf,OAAO,UAAU;WAAiB,CAAC;SAChC,OAAO,QAAQ,OACnB,OAAO,CAAC,GAAG,eAAe,WAC1B,IAAI,CAAC,CAAC,eAAe;AAAA,GAEzB,KAAK;0BCxFuB;AAAA,EAAEmH;AAAAA,EAASC;AAAAA,EAAOC;AAAAA,GAA0E;SAEzH7E;IACE,KAAK,CACH;AAAA,MACEE,SAAS;AAAA,MACTG,YAAY;AAAA,MACZqB,QAAQ;AAAA,MACRoD,YAAY;AAAA,eAEH;AAAA,QACPpD,QAAQ;AAAA;AAAA,OAGZmD,YAAY;AAAA,MAAElD,OAAO;AAAA;AAAA,eAGtBgD,SACDhI;MAAM,KAAK;AAAA,QAAEoI,YAAY;AAAA;AAAA,gBAAqBH;AAAAA;AAAAA;AAAAA;YCpBjC;AAAA,EAAZ,cAAP;aACc,IAAI;qBACI;AAAA;AAAA,EAEpB,IAAO,KAAuB,SAAmB;WACxC,IAAI,QAAW,CAAC,SAAS,WAAW;UACrC,SAAS;aACN,IAAI;AAAA;WAEN,EAAE,KAAK,EAAE,KAAK,SAAS;UAExB,CAAC,KAAK;aAAgB;AAAA;AAAA;AAAA,QAIhB,QAAQ;SACf,YAAY;QAEb;WACI,OAAO,KAAK,EAAE,SAAU;UAC1B;cACI,SAAS,MAAM,KAAK;aACrB,QAAQ;AAAA,eACN;aACF,OAAO;AAAA;AAAA;SAIX,YAAY;AAAA;AAAA;ACvBrB,MAAM,OAAO,CAAC,QAAQ,aAAa,YAAY,iBAAiB,gBAAgB,gBAAgB;AAgBhG,mBAAmB,OAA0B;mBAC1B,QAA+B;QAC1C,kBAAiB,MAAM;aAClB,EAAE,QAAQ,OAAM;AAAA;QAGrB,kBAAiB,KAAK;aACjB,EAAE,OAAO,MAAM,KAAK,QAAO,IAAI;AAAA;QAGpC,kBAAiB,KAAK;aACjB,EAAE,OAAO,MAAM,KAAK,OAAM,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA;QAGnE,kBAAiB,OAAO;aACnB,OAAM,IAAI;AAAA;QAGf,kBAAiB,QAAQ;aACpB,OAAO,YAAY,OAAO,QAAQ,QAAO,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ;AAAA;WAGvE;AAAA;SAGF,KAAK,UAAU,QAAQ;AAAA;AAGhC,eAAe,OAAe;SACrB,KAAK,MAAM,OAAO,CAAC,MAAM,WAAU;QACpC,kBAAiB,UAAU,YAAY,QAAO;aACzC,IAAI,KAAK,OAAM;AAAA;QAGpB,kBAAiB,UAAU,WAAW,QAAO;aACxC,IAAI,IAAI,OAAM;AAAA;QAGnB,kBAAiB,UAAU,WAAW,QAAO;aACxC,IAAI,IAAI,OAAM;AAAA;WAGhB;AAAA;AAAA;gCAI4B;QAC/B,QAAQ;QACR,CAAC,YAAY,iBAAiB1G,eAAS;kBAGnC,MAAM;UACR,EAAE,YAAY,MAAM,WAAW;QACjC,CAAC,SAAS;oBACE;;;QAIZ,aAAa;AAEhB,iBAAY;;UACP;cACI,EAAE,SAAS,KAAK,SAAS,SAAS,YAAY;cAC9C,OAAO,MAAM,QAAQ,QAAQ,GAAG;YAClC,cAAc,CAAC;;cAEb,OAAO,MAAM;0BACb,WAAW,OAAM,sCAAQ,QAAQ,MAAM;cAEvC,OAAO,CAAC,UAAU;;qBACX,OAAO,MAAM;kBAGlB,WAAW,QAAQ,SAAS,SAC9B,CAAC,oCAAS,SAAS,SACnB,OAAO,MACP;kBACI,QAAQ,gBAAgB;2BACf,CAAC,KAAI,UAAU,KAAK,MAAM;sBAC/B,oBAAM,QAAQ,IAAI,SAAlB,oBAAuB,YAAvB,aAAkC,MAAM;0BACpC,aAAa,IAAI,KAAI;AAAA;AAAA;AAAA,qBAG1B;sBACC,OAAO,KAAK;oBAEd,QAAQ,cAAc,QAAQ,mBAAmB,QAAQ,eAAe,QAAQ,QAAQ;oCACpF,OAAM,KAAM,IAAI,MAAM,GAAG,GAAG,gBAAgB,IAAI,MAAM,4CAAyC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAM7G;gBACC,MAAM,+BAA+B;AAAA;sBAE/B;AAAA;AAAA;WAIX,MAAM;mBACE;AAAA;AAAA,KAEd;kBAGO,MAAM;QACV,CAAC;;UAEC,IAAI,IAAI;WAEP,MAAM,UACX,CAAC,UAAU;;UACL,CAAC,MAAM,MAAM;;YAEX,EAAE,SAAS,KAAK,SAAS,SAAS,YAAY,MAAM,MAAM;YAC1D,OAAY;iBAEP,OAAO,MAAM;cAGlB,WAAW,QAAQ,SAAS,SAC9B,CAAC,oCAAS,SAAS,OACnB;cACI,QAAQ,gBAAgB;iBACrB,2BAAW;uBACL,CAAC,KAAI,UAAU,MAAM,cAAc;kBACxC,kBAAM,QAAQ,IAAI,SAAlB,mBAAuB,YAAvB,YAAkC,MAAM;qBACrC,aAAa,IAAI,KAAI;AAAA;AAAA;AAAA,iBAGzB;iBACA,OAAO,MAAM;AAAA;AAAA;AAAA;aAKjB,EAAE,SAAS,IAAI;AAAA,OAExB,CAAC,UAAU;;UACL,CAAC;;YACC,EAAE,SAAS,IAAI,SAAS;wBAExB,WAAW,OAAM,sCAAQ,QAAQ,MAAM,UAAU;QACrD,IAAI,YAAY;cACV,QAAQ,QAAQ,GAAG,YAAY,UAAU;AAAA,SAC9C;AAAA,OAEL,EAAE,UAAU;AAAA,KAEb,CAAC;SAEG;AAAA;mBCvKoB,OAA2C;kBAEpE,MACE,MAAM,YACJ,CAAC,WACC;AAAA,IACE,OAAM,MAAM;AAAA,IACZ,OAAM,MAAM;AAAA,IACZ,OAAM,MAAM;AAAA,IACZ,OAAM,MAAM;AAAA,IACZ,OAAM;AAAA,IACN,OAAM;AAAA,IACN,OAAM;AAAA,IACN,OAAM;AAAA,IACN,OAAM;AAAA,KAEV,CAAC,CAAC,QAAQ,IAAI,IAAI,UAAU,gBAAgB,MAAM,SAAS,cAAc,gBAAgB,UAAU;UAC3F,aAAa,MAAM,IAAkB,CAAC,0CACvC;MACH,IAAI,GAAG;AAAA,MACP,UAAU,qCAAW;AAAA,MACrB,UAAU;AAAA;QAGR;QACA,KAAK,WAAW,GAAG;eACZ;AAAA,WACJ;YACC,YAAY,QAAQ,MAAM,CAAC,UAAS;cAClC,SAAS,cAAc,KAAK,CAAC,YAAW,QAAO,OAAO,MAAK;YAC7D,CAAC;iBAAe;cACd,SAAS,OAAO,kBAAkB,QAAQ,OAAO,SAAS,CAAC,OAAO;eACjE,OAAO,IAAI,CAAC,eAAc,UAAU,CAAC,SAAY,QAAO,OAAO,MAAM,OAAO,OAAO,WAAW,MAAK;AAAA,SACzG,OAAO;eAED,QACP,YACA,UAAU,IAAI,CAAC,MAAM,EAAE,WACvB,UAAU,IAAI,CAAC,MAAM,EAAE;AAAA;UAIrB,6BAAa;eACR,QAAQ,QAAQ;aAClB,IAAI,KAAK,IAAI;AAAA;eAGX,QAAQ,QAAQ;YACnB,SAAS,KAAK,aAAa,SAAY,OAAO,IAAI,KAAK,YAAY;uCACjE,SAAS,KAAK;AAAA;UAGlB,WAAW,IAAI;UACf,mCAAmB;UAEnB,WAAW,CAAC,WAAgC;iBACrC,QAAQ,QAAO;iBACf,KAAK;qBACD,IAAI,KAAK,IAAI;iBACjB,KAAK;AAAA;AAAA;aAGT,OAAO,OAAO,CAAC,SAAS,KAAK,aAAa;QAE/C,kBAAkB;UAChB,sCAAsB;UACtB,gCAAgB;UAChB,cAAc,CAAC,GAAG,UACrB,UACA,OAAO,CAAC,SAAS;UACZ,WAAW,UAAU,IAAI,KAAK;8BAErB,cAAc,MAAM,CAAC,WAAW;;cACrC,SAAS,QAAQ,IAAI,OAAO;YAC9B,CAAC;iBAAe;cAEd,cAAc,aAAa,IAAI,OAAO;YACxC,gBAAgB,UAAa,CAAC,OAAO,SAAS;iBAAqB;cAEjE,WAAW,aAAO,aAAP,aAAqB,MAAM;cACtC,QAAQ,SAAS,OAAO,MAAM,OAAO;eACpC,UAAU,OAAO,KAAK,CAAC,WAAU,OAAO,KAAK,aAAa;AAAA;UAG/D,YAAY,KAAK,aAAa,QAAW;YAEzC,kBACA,MAAM,KAAK,QAAQ,WAAW,KAAK,CAAC,CAAC,KAAI,YAAY;gBAC7C,cAAc,aAAa,IAAI;iBAC9B,CAAC,CAAC,UAAU,gBAAgB,UAAa,OAAO,SAAS;AAAA,YAElE;gDACoB,CAAC,MAAM,SAAS,IAAI,KAAK;gBACvC,SAAS,IAAI,KAAK;AAAA,mBACf,CAAC,MAAM,SAAS,IAAI,KAAK,WAAW;qBAClC;AAAA;AAAA;UAIX,YAAY,KAAK,aAAa,QAAW;kBACjC,IAAI,KAAK;AAAA;UAEjB,UAAU;wBACI,IAAI,KAAK,IAAI;AAAA;aAGxB;AAAA,OAER;UAEG,QAAQ8G,gBAAU;UAClB,YAAYA,gBAAU;UACtB,cAAcA,gBAAU;UACxB,kBAAkBA,gBAAU;QAE9B,iBAAiB;iBACR,MAAM;;0BACT,WAAW,OAAM,iDAAmB,MAAM,WAAW;AAAA;AAAA;AAAA,KAIjE,EAAE,QAAQ,SAEd,CAAC;AAAA;AC7HL,MAAM,eAAe,MAAM;mBAEE,OAA6C;QAClE,cAAc3I,iCAAW;SAExBgD,cAAQ,MAAM;;QACf;QACA,MAAM,cAAc,UAAU;WAC3B,MAAM;AAAA,WACN;WACA,CAAC,SAAY,KAAK,MAAM;AAAA;QAG3B;QACA,MAAM,oBAAoB,UAAU;iBAC3B,MAAM;AAAA,eACR,OAAO,MAAM,aAAa,UAAU;iBAClC,CAAC,SAAY,KAAK,MAAM;AAAA,WAC9B;iBACM;AAAA;QAGT;QACA,MAAM,mBAAmB,UAAU;qBACtB,MAAM,QAAQ,CAAC,OAAO,4CAAiB,WAAQ;AAAA,WACzD;qBACU,MAAM,QAAQ,IAAI,CAAC,4CAAiB,WAAQ,aAAa;AAAA;UAGpE,qCAAqB;UAErB,UAAU,aAAa,IAA4B,SACvD,IASA,OACA;AAVA,mBACE;AAAA;QACA,SAAS;AAAA,QACT,aAAa;AAAA,QACb,aAAa;AAAA,QACb,SAAS,CAAC,MAAO,OAAO,MAAM,YAAY,aAAa,OAAO,IAAI,OAAO;AAAA,QACzE,eAAe;AAAA,UANjB,IAOK,mBAPL,IAOK;AAAA,QANH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;;YAKI,CAAC,aAAa,iBAAiB,mBAAY,QAAQ,IAAI,oBAAM,WAA9B,aAAwC;UAEzE;UAEF,eACA,iBACA,YAAY,WAAW,aAAa,UACpC,YAAY,MAAM,CAAC,GAAG,MAAM,aAAa,OAAO,IAChD;iBACS;AAAA,aACJ;iBACI;AAAA,UACP,IAAI,oBAAM;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,WACG;AAAA;qBAIQ,IAAI,oBAAM,OAAO,CAAC,cAAc;aACxC;AAAA;gBAGG,UAAU;QAElB;QACA,MAAM,iBAAiB,QAAS,MAAM,wBAAwB,UAAU,MAAM,aAAa,SAAS,MAAO;aACtG,EAAE,WAAW;AAAA,eACX,MAAM,gBAAgB,MAAM,aAAa,gBAAgB,QAAQ;aACnE,MAAM,aAAa;AAAA;QAGxB;QACA,MAAM,iBAAiB,QAAS,MAAM,wBAAwB,UAAU,MAAM,aAAa,aAAa,MAAO;iBACtG,EAAE,WAAW;AAAA,eACf,MAAM,gBAAgB,MAAM,aAAa,oBAAoB,QAAQ;iBACnE,MAAM,aAAa;AAAA;UAG1B,eAAe,EAAE,MAAM;WAEtB,iCACF,QADE;AAAA,MAEL;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,YAAM,oBAAN,YAAyB;AAAA,MAC1C,oBAAoB,YAAM,uBAAN,YAA4B;AAAA,MAChD,cAAc,YAAM,iBAAN,YAAsB;AAAA,MACpC;AAAA,MACA,uBAAuB,YAAM,0BAAN,YAA+B;AAAA,MACtD,oBAAoB,YAAM,uBAAN,YAA4B;AAAA,MAChD,qBAAqB,YAAM,wBAAN,YAA6B;AAAA;AAAA,KAEnD,CAAC;AAAA;sBCnG0B,OAA2C;kBAEvE,MACE,MAAM,YACJ,CAAC,WAAU,CAAC,OAAM,MAAM,SAAS,OAAM,WAAW,OAAM,iBAAiB,OAAM,gBAC/E,CAAC,CAAC,SAAS,WAAW,iBAAiB,gBAAgB,UAAU;UACzD,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO;UACnD,kBAAkB,IAAI,IAAI,cAAc,IAAI,CAAC,WAAW,OAAO;UAG/D,UAAU,MAAM,KAAK,OAAO,CAAC,MAAM,gBAAgB,IAAI,EAAE;QAC3D,QAAQ,SAAS,MAAM,KAAK,QAAQ;YAChC,OAAO;iBACF,MAAM;;0BACT,OAAM,6CAAe;AAAA;AAAA;eAKpB,MAAM,MAAM,QAAQ,QAAQ;UACjC,CAAC,gBAAgB,IAAI;cAAW,QAAQ,OAAO;AAAA;eAI1C,MAAM,MAAM,aAAa,QAAQ;UACtC,CAAC,gBAAgB,IAAI;cAAW,aAAa,OAAO;AAAA;eAI/C,MAAM,MAAM,cAAc,QAAQ;UACvC,CAAC,UAAU,IAAI;cAAW,cAAc,OAAO;AAAA;eAI1C,MAAM,MAAM,aAAa,QAAQ;UACtC,CAAC,UAAU,IAAI;cAAW,aAAa,OAAO;AAAA;eAIzC,MAAM,MAAM,aAAa;UAC9B,CAAC,UAAU,IAAI;cAAW,cAAc,MAAM,YAAY,OAAO,CAAC,MAAM,MAAM;AAAA;QAGhF,MAAM,MAAM,OAAO;YAEf,eAAe,UAAU,MAAM,WAAW;UAC5C,aAAa,SAAS,MAAM,UAAU,MAAM;cACxC,YAAY;mBACP,MAAM;;4BACT,OAAM,kDAAoB;AAAA;AAAA;YAK9B,cAAc,UAAU,MAAM,UAAU;UAC1C,YAAY,OAAO,MAAM,SAAS,MAAM;cACpC,WAAW;mBACN,MAAM;;4BACT,OAAM,iDAAmB;AAAA;AAAA;AAAA;AAAA,KAKvC,EAAE,QAAQ,SAEd,CAAC;AAAA;uBCjE4B,OAA2C;kBAExE,MACE,MAAM,YACJ,CAAC,WAAU,CAAC,OAAM,MAAM,SAAS,OAAM,eAAe,OAAM,cAC5D,CAAC,CAAC,SAAS,eAAe,cAAc,UAAU;UAC1C,gBAAgB,QACpB,QAAQ,OAAO,CAAC,WAAW,CAAC,cAAc,IAAI,OAAO,MACrD,CAAC,CAAC,WAAW,YAAY,QAAQ,OAAO;AAAA,KAG5C,EAAE,QAAQ,SAEd,CAAC;AAAA;wBCd6B,OAA2C;kBAEzE,MACE,MAAM,YACJ,CAAC,WAAU,CAAC,OAAM,MAAM,oBAAoB,OAAM,WAAW,OAAM,cACnE,CAAC,CAAC,oBAAoB,WAAW,cAAc,WAAU;QACnD,CAAC;;UAEC,eAAe,IAAI,IAAI;eAClB,QAAQ,aAAa;UAC1B,KAAK,aAAa,UAAa,aAAa,IAAI,KAAK,WAAW;qBACrD,IAAI,KAAK;AAAA;AAAA;QAItB,aAAa,SAAS,UAAU,MAAM;aAClC,YAAY;iBACP,MAAM;;2BACT,OAAM,kDAAoB;AAAA;AAAA;AAAA,KAItC,EAAE,QAAQ,SAEd,CAAC;AAAA;uBCjB4B,QAAqD;QAC9E,QAAQ,UAAU;QAClB,QAAQ4F,yBAAc;QAEtB,QAAQ5F,cACZ;;AACE,eAAI6F,cAA6B;AAAA,MAC/B;AAAA,MACA;AAAA,MAEA,MAAM,YAAM,gBAAN,YAAqB;AAAA,MAC3B,WAAW,YAAM,qBAAN,gCAA8B;AAAA,MACzC,UAAU,YAAM,oBAAN,gCAA6B;AAAA,MACvC,gCAAgB;AAAA,MAChB,6BAAa;AAAA,MACb,kCAAkB;AAAA,MAClB,eAAe,YAAM,yBAAN,gCAAkC;AAAA,MACjD,kCAAkB;AAAA,MAClB,aAAa,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO;AAAA,MAClD,yCAAyB;AAAA,MAEzB,eAAe;AAAA,MACf,OAAO;AAAA,MACP,+BAAe;AAAA,MACf,aAAa;AAAA,MACb,qCAAqB;AAAA,MACrB,gBAAgB;AAAA;AAAA,KAEpB;gBAGY;YACJ;iBACK;eACF;kBAEH,MAAM;UACR,OAAO,CAAC,WAAU;aAChB,QAAQF,gBAAU;UACpB,MAAM;eAAY,OAAO,MAAM;UAC/B,MAAM;eAAiB,YAAY,MAAM;UACzC,MAAM;eAAgB,WAAW,MAAM;UACvC,MAAM;eAAqB,gBAAgB,MAAM;iBAC1C,UAAU,MAAM,SAAS;YAC9B,CAAC,OAAM,YAAY,SAAS,OAAO,KAAK;gBACpC,QAAQ,MAAM,QAAQ,QAAQ;iBAC9B,YAAY,OAAO,OAAO,GAAG,OAAO;AAAA;AAAA;aAGxC,QAAQ;AAAA;AAAA,KAEf,CAAC,OAAO;SAEJ;AAAA;MC3DIG,sBAAsB,IAAIC,mBAAW;AAAA,EAChDC,2BAAWC;AAAAA;sBAGgBtJ,OAAkC;QACvDI,MAAMC,aAAuB;QAC7BkJ,WAAWC;QACXC,QAAQC;QACRC,UAAUF,MAAMvH,SAAS;QAEzB0H,QAAQT,oBAAoBU;QAC5BC,gBAAgBzJ;QAChB0J,QAAQ1J;kBAGJ,MAAM;UACR2J,MAAM5J,IAAIK;QACZ,CAACuJ;;UAECC,OAAQC,WAAU;YAChBb,MAAMc,IAAIZ,UAAUP,gBAAUgB;AAAAA;WAG/B,MAAM;YACLC,OAAQC,WAAU;cAChBb,MAAMe,OAAOb;AAAAA;AAAAA;AAAAA,KAGtB,CAACnJ,IAAIK,SAASmJ,OAAOL;2BAGCc,YAAoB;;UACrCC,OAAOb,MAAMc,WAAWC,YAAY5G,IAAKkE;MAAUA;AAAAA,MAAIkC,KAAKJ,MAAMW,WAAWlB,MAAMoB,IAAI3C;AAAAA;UAEvF4C,YAAYJ,KAAKhD,OAAQqD,SAAQA,IAAI7C,OAAOyB;UAE5CqB,kBAAkBN,uBAAKO,KAAMF,SAAQA,IAAIX,SAAvBM,mBAA6BN,QAA7BM,mBAAkCD,eAAlCC,YAAgD;QAEpEQ,MAAM;UACJC,cAAcL,UAAUM,UAAWL,SAAQ;;YACzChE,QAAQgE,kBAAIX,QAAJW,oBAASM,gBAATN,aAAwB;UAClCG,MAAMnE,QAAQ,IAAI0D,aAAaO;eAAwB;aACpDjE;aACA;AAAA;WAGFoE,gBAAgB,KAAKL,UAAUQ,SAASH;AAAAA;yBAI1B3E,GAAuB;UACtC4D,MAAM5J,IAAIK;QACZ,CAACuJ;;kBACSvJ,UAAU;AAAA,MAAE0K,QAAQ/E,EAAEgF;AAAAA,MAASC,QAAQrB,IAAIsB;AAAAA;AAAAA;yBAIpClF,GAAuB;UACtC6D,OAAQC,WAAU;YAChBF,MAAM5J,IAAIK;UACZ,CAACuJ,OAAOF,cAAcrJ,YAAYgC,UAAa8I,KAAKC,IAAIpF,EAAEgF,UAAUtB,cAAcrJ,QAAQ0K,UAAU;;QAEtGM;UACEC,kBAAkBtF,EAAEuF;UAGpB,CAAC5B,MAAMtJ,SAAS;cACZA,UAAUuJ,IAAI4B,UAAU;iBACrBC,KAAKC,OAAO/B,MAAMtJ;mBAEhB,CAACsG,KAAKtF,UAAUwF,OAAO8E,QAAQC,iBAAiBhC,OAAO;cAC5D;kBACIvJ,QAAQwL,MAAMlF,OAActF;AAAAA;;;eAM/ByK,OAAOnC,MAAMtJ,QAAQwL,OAAO;AAAA,UACjCE,eAAe;AAAA,UACfC,UAAU;AAAA,UACVC,WAAW;AAAA,UACXC,MAAO,GAAExC,cAAcrJ,QAAQ4K,OAAOiB;AAAAA,UACtCC,KAAM,GAAEzC,cAAcrJ,QAAQ4K,OAAOkB;AAAAA;YAGnCN,MAAMtG,QAAQ;AAAA;YAIdlF,QAAQwL,MAAMK,OAAQ,GAAExC,cAAcrJ,QAAQ4K,OAAOiB,OAAOlG,EAAEgF,UAAUtB,cAAcrJ,QAAQ0K;YAG9FtG,QAAQqF,MAAMM,YAAYgC,QAAQjD;YAClCwB,cAAc0B,gBAAgBzC,IAAIK,aAAajE,EAAEgF,UAAUtB,cAAcrJ,QAAQ0K;YAGjFuB,UAAUjD,MACbc,WACAC,YAAY5G,IAAI,CAACkE,IAAIjD;;;UAAaiD;AAAAA,UAAIjD;UAAO8B,OAAOiD,kBAAMW,WAAWlB,MAAMoB,IAAI3C,QAA3B8B,mBAAgCqB,gBAAhCrB,YAA+C;AAAA;AAAA;YAEhGY,YAAYmC,QAAQ,CAAC7E,IAAI8E,MAAM;YAC/BzJ,SAAS;YACTyJ,MAAM/H,OAAO;cAEXkG,cAAclG,OAAO;qBACd6H,QAAQG,MAAMhI,QAAQ,GAAGkG,cAAc,GAAG+B,OAAO,CAAChC,KAAKH,QAAQG,MAAMH,IAAIhE,OAAO;AAAA,qBAChFoE,cAAclG,OAAO;qBACrB,CAAC6H,QAAQG,MAAM9B,aAAalG,OAAOiI,OAAO,CAAChC,KAAKH,QAAQG,MAAMH,IAAIhE,OAAO;AAAA;AAAA,mBAE3EiG,KAAK7B,eAAe6B,IAAI/H,OAAO;mBAE/BmF,IAAIiB;AAAAA,mBACJ2B,IAAI/H,SAAS+H,KAAK7B,aAAa;mBAE/B,CAACf,IAAIiB;AAAAA;cAGV8B,oBAAoB5C,IAAIrC,IAAI;AAAA,UAChCkF,YAAY;AAAA,UACZ1I,WAAY,eAAcnB;AAAAA,UAC1B8J,QAAQL,MAAM/H,QAAQ,IAAIpC;AAAAA;AAAAA;AAAAA;AAAAA;uBAOb2D,GAAuB;UACpC6D,OAAQC,WAAU;;YAChBF,MAAM5J,IAAIK;UACZ,CAACuJ,OAAOF,cAAcrJ,YAAYgC;;YAGhCoC,QAAQqF,MAAMM,YAAYgC,QAAQjD;YAClCwB,cAAc0B,gBAAgBzC,IAAIK,aAAajE,EAAEgF,UAAUtB,cAAcrJ,QAAQ0K;YAEjFX,YAAY0C,OAAOrI,OAAO;YAC1B2F,YAAY0C,OAAOnC,aAAa,GAAGxB;kBAGnC9I,+BAAS0M;UACXlB,MAAMtG,QAAQ;YACZoH,oBAAoBK;oBACZ3M,UAAUgC;YAClBhC,UAAUgC;AAAAA;AAAAA;SAKlB9B,uDACMX;IACJ,KAAK;AAAA,MACHoM,UAAU;AAAA,MACVtD,YAAY;AAAA;AAAA,IAEd;AAAA,IACA,eAAea,UAAU0D,gBAAgB5K;AAAAA,IACzC,eAAekH,UAAU2D,gBAAgB7K;AAAAA,IACzC,aAAakH,UAAU4D,cAAc9K;AAAAA,cAEpCzC,MAAMwN;AAAAA;AAAAA;2BC/JqC;QAC1C;AAAA,IACJvN,YAAY;AAAA,MAAE6B;AAAAA,MAAY+D;AAAAA,MAAS4H;AAAAA;AAAAA,IACnC1L,OAAO;AAAA,MAAE2L;AAAAA;AAAAA,IACT9F;AAAAA,MACEzH;QACE2F,eAAeC;QAEf0D,QAAQC;QACRgD,UAAUjD,MAAMvH,SAAS;QACzByL,gBAAgBlE,MAAMvH,SAAS;QAE/B,CAAC0L,UAAUC,eAAe3L,eAAyB;QAEnD4L,UAAS,CAACC,WAAuC;UAC/C;AAAA,MACJ/N,OAAO;AAAA,QAAE2N,eAAeK;AAAAA,QAAyBC;AAAAA;AAAAA,QAC/CxE,MAAMc;UAEJ2D,WAAW,IAAIC,IAAIR;QACrBA,cAAcS,IAAIL,OAAOjG;eAAcsC,OAAO2D,OAAOjG;AAAAA;eAC3CuG,IAAIN,OAAOjG;QAErB,CAACkG,yBAAyB;YACtB/D,OAAQC,WAAU;cAChByD,gBAAgBO;AAAAA;AAAAA;mEAIFA;AAAAA;SAIxBlK;eACErD,eAAC;MAAW,SAAUyF,OAAMyH,YAAYD,WAAW,OAAOxH,EAAEC;AAAAA,gBAC1D1F,eAAC;QAGHA,eAAC;MAAQ;AAAA,MAAoB,MAAM,CAAC,CAACiN;AAAAA,MAAU,SAAS,MAAMC,YAAY;AAAA,MAAO,KAAK/H;AAAAA,gBACpF9B;QAAK,KAAK;AAAA,UAAEuB,SAAU;AAAA,UAA2BrB,SAAS;AAAA;AAAA,mBACxDvD;UAAK,KAAK;AAAA,YAAEgE,cAAc;AAAA;AAAA,oBAAqBiD,KAAK0G;AAAAA,YAEnD5B,QAAQ9I,IAAKmK,YACZpN,eAAC;UAEC,SAASA,eAAC;YAAS,SAAS,CAACgN,cAAcS,IAAIL,OAAOjG;AAAAA,YAAK,UAAU,MAAMgG,QAAOC;AAAAA,YAAS,UAAUA,OAAOQ;AAAAA;AAAAA,UAC5G,OAAOR,OAAOS;AAAAA,WAFTT,OAAOjG;AAAAA;AAAAA;AAAAA;AAAAA;mBChDxB,MACA,EAAE,WAAW,YAAY,KAAK,QAAQ,KAAK,MAAM,SAA2B,IACpE;QACF,QAAQ,KAAK,IAAI,CAAC,SACtB,KAAK,IAAI,CAAC,UAAU;QACd,OAAO,UAAU;aAAiB,OAAO;QACzC,CAAC,CAAC,WAAW,OAAO,KAAK,KAAK,CAAC,MAAM,MAAM,SAAS;aAAY;UAE9D,QAAQ,MAAM,QAAQ,IAAI,OAAO,OAAO,MAAM,GAAG,QAAQ;WACxD,GAAG,QAAQ,QAAQ;AAAA;sBAIV,OAAO;AAAA,IAAgB,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,YAAY,KAAK;AAAA;kBCVzD;QACjC2B,QAAQC;QACR;AAAA,IACJzJ,YAAY;AAAA,MAAE0H;AAAAA,MAAQ7F;AAAAA,MAAY+D;AAAAA;AAAAA,IAClC9D,OAAO;AAAA,MAAE0M;MAAQC;AAAAA;AAAAA,IACjB9G;AAAAA,MACEzH;QACE2F,eAAeC;QAEf,CAACC,QAAQC,aAAa/D,eAAyB;QAE/CyM,WAAW,CAACC,YAA+B;UACzC;AAAA,MAAEC;AAAAA,MAAeC;AAAAA,QAAgBrF,MAAMc;UAEvCwE,OAAO,CACXF,cAAcjL,IAAKmK,YAAWrH,OAAOqH,OAAOjG,MAC5C,GAAGgH,YAAYlL,IAAKoL,UAASH,cAAcjL,IAAKmK,YAAWA,OAAOkB,WAAWlB,OAAOtM,MAAMuN,OAAOA;WAE5FE,UAAUH,MAAMH;AAAAA;QAGnBO,OAAO,MAAM;cACPC,UAAUC,UAAUV,SAASlF,MAAMc,WAAWvK,MAAMsP,aAAaH;AAAAA;QAGvEI,WAAW,MAAM;UACflO,IAAImO,SAASC,cAAc;MAC/BC,OAAO,iCAAiCC,mBAAmBhB,SAASlF,MAAMc,WAAWvK,MAAMsP,aAAaC;MACxGA,WAAW;aACJ1D,KAAK+D,YAAYvO;MACxBwO;aACOhE,KAAKiE,YAAYzO;AAAAA;SAI1B2C;eACErD,eAAC;MAAW,SAAUyF,OAAMH,UAAUD,SAAS,OAAOI,EAAEC;AAAAA,gBACtD1F,eAAC;QAAO,KAAK,CAAC,CAACqF,UAAU;AAAA,UAAEL,OAAO;AAAA;AAAA;AAAA,QAGpChF,eAAC;MAAQ,MAAM,CAAC,CAACqF;AAAAA,MAAQ,SAAS,MAAMC,UAAU;AAAA,MAAO,UAAUD;AAAAA,MAAQ,KAAKF;AAAAA,gBAC9E9B;QACE,KAAK;AAAA,UACHuB,SAAU;AAAA,UACVrB,SAAS;AAAA,UACT6L,cAAc;AAAA,UACdC,KAAK;AAAA,mBAEI;AAAA,YACP5L,gBAAgB;AAAA;AAAA;AAAA,mBAIpBzD;UAAK,KAAK;AAAA,YAAEgE,cAAc;AAAA;AAAA,oBAAqBiD,KAAKqI;AAAAA,YACpDtP,eAAC;UAAO,WAAWA,eAAC;UAAc,SAASwO;AAAAA,oBACxCvH,KAAKsI;AAAAA,YAERvP,eAAC;UAAO,WAAWA,eAAC;UAAW,SAAS4O;AAAAA,oBACrC3H,KAAKuI;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;MC3DLC,uBAAuBC,oBAAc,MAAY;yBAEP;QAC/C5G,QAAQC;QACRH,WAAWC;QACX;AAAA,IACJvJ,YAAY;AAAA,MAAE6B;AAAAA,MAAY+D;AAAAA;AAAAA,IAC1B9D,OAAO;AAAA,MAAEuO;AAAAA,MAAYC;AAAAA;AAAAA,MACnBpQ;QACE2F,eAAeC;QAEf,CAACC,QAAQC,aAAa/D,eAAyB;QAC/C6F,WAAW0B,MAAMvH,SAAUgI,WAAU;UACnC5C,UAAS4C,MAAMsG,QAAQ/F,IAAIlB;UAC3BvB,cAAckC,MAAMuG,aAAahG,IAAIlB;WACpCjC,YAAW7E,UAAauF,gBAAgBvF,UAAa6E,QAAOS,SAASC;AAAAA;QAExEV,SAASmC,MAAMvH,SAAUgI;;AAAUA,uBAAM2E,cAAchE,KAAMkD,YAAWA,OAAOjG,OAAOyB,cAAnDW,mBAA8D5C;AAAAA;mBAEtF;UACT2C,OAAQC,WAAU;YAChBuG,aAAarG,OAAOb;AAAAA;AAAAA;QAIxBmH,QAAQC,kBAAY,WAAY;cAC1B;AAAA,KACT;MAEC,CAACrJ;WAAe;SAGlBtD,gBAAC,qBAAqB;IAAS,OAAO0M;AAAAA,eACpC/P;MACE,SAAUyF,OAAMH,UAAUG,EAAEC;AAAAA,MAC5B,eAAgBD,OAAM;;UAElBwK;eACK;AAAA;AAAA,gBAGTjQ,eAAC;QACC,KAAK,CACH;AAAA,UAAEgF,OAAO;AAAA,WACToC,YAAY;AAAA,UACVpC,OAAO;AAAA;AAAA,kBAIVoC,WAAWpH,eAAC,kBAAgBA,eAAC;;QAIlCA;MACE,eAAgByF,OAAM;UAClBqF;AAAAA;AAAAA,MAEJ,eAAgBrF,OAAM;UAClBqF;AAAAA;AAAAA,gBAGJ9K,eAAC;QAAQ;QAAK,QAAQ,CAACqF;AAAAA,QAAQ,SAAS,MAAMC,UAAU;AAAA,QAAO,UAAUD,0BAAUwJ,SAAS3D;AAAAA,QAAM,KAAK/F;AAAAA,kBACpGwB;AAAAA;AAAAA;AAAAA;AAAAA;wBChEoB;QACvBmC,QAAQC;QACRH,WAAWC;QACXG,UAAUF,MAAMvH,SAAS;yBAERkE,GAAuB;MAC1CqF;UAEIzB,MAAM5D,EAAEQ;QACV8E,kBAAkBtF,EAAEuF;AAAAA;yBAGHvF,GAAuB;MAC1CqF;UAEIzB,MAAM5D,EAAEQ;QACV,CAACoD,IAAI6G,kBAAkBzK,EAAEuF;;UAEvBmF,SAAS9G,IAAI+G;UACbpK,QAAQ4E,KAAK/J,IAAI4E,EAAEgF,UAAU0F,OAAOxF,wBAAwBgB,OAAO,GAAG;UAEtErC,OAAQC,WAAU;YAChB8G,aAAa7G,IAAIZ,UAAW,GAAE5C;AAAAA;AAAAA;uBAInBP,GAAuB;MACxCqF;UAEIzB,MAAM5D,EAAEQ;QACVqK,sBAAsB7K,EAAEuF;AAAAA;yBAGPvF,GAAqB;UACpC6D,OAAQC,WAAU;UAClB9D,EAAE8K,iBAAiB,YAAY;cAC3BF,aAAa5G,OAAOb;AAAAA,aACrB;cACCyH,aAAa7G,IAAIZ,UAAU;AAAA;AAAA;AAAA;SAMrC5I,eAAC;IACC;AAAA,IACA,eAAegJ,UAAU0D,gBAAgB5K;AAAAA,IACzC,eAAekH,UAAU2D,gBAAgB7K;AAAAA,IACzC,aAAakH,UAAU4D,cAAc9K;AAAAA,IACrC,eAAekH,UAAUwH,gBAAgB1O;AAAAA;AAAAA;0BAKd,IAA0E;AAA1E,eAAEkH;AAAAA;AAAAA,MAAF,IAAc3J,kBAAd,IAAcA;AAAAA,IAAZ2J;AAAAA;SAE/BhJ;IACE,KAAK;AAAA,MACHyQ,WAAW;AAAA,MACX7L,SAAS;AAAA,MACTG,QAAQiE,UAAU,eAAe;AAAA,MACjCzF,SAAS;AAAA,MACTG,YAAY;AAAA,iBAED;AAAA,QACTgN,SAAS;AAAA,QACT1K,OAAO;AAAA,QACP2K,QAAQ;AAAA,QACR7L,YAAY;AAAA,QACZuH,YAAY;AAAA;AAAA;AAAA,KAGZhN;AAAAA;MCrEGuR,OAAOC,WAAK,eAAiB;AAAA,EAAEC;AAAAA,EAAQC;AAAAA,GAA8C;;QAC1FjI,QAAQC;QACRH,WAAWC;QACX;AAAA,IAAEmI;AAAAA,MAAYxR;QAEd4N,SAAStE,MAAMvH,SAAUgI,WAAUA,MAAM2E,cAAchE,KAAMkD,aAAWA,QAAOjG,OAAOyB;QACtFyF,OAAOvF,MAAMvH,SAAUgI,WAAUA,MAAM0H,gBAAgBnH,IAAIgH;QAC3D1E,sBAAsBtD,MAAMvH,SAAUgI,WAAUA,MAAM6C,oBAAoBtC,IAAIlB,WAAW;AAAA,IAAEsI,UAAU;AAAA;MAEvG,CAAC9D,UAAU,CAACiB;WAAa;oBACvBzE,WAAWvK,OAAM8R,4CAAc,eAAeL,QAAQlI;QAEtDwI,aAAa,CAAC,GAAGC,eAAeL,SAAS3C,MAAM0C,WAAW,GAAGM,eAAejE,iCAAQ4D,SAAS3C,MAAM0C;QACnGL,UAAUtD,OAAOkE,WAAWlE,OAAOtM,MAAMuN,OAAOA;SAGpDrO;IAAK,WAAWuR,GAAG,GAAGH;AAAAA,IAAa,KAAK,CAACI,0BAAeC,MAAML,YAAYhF;AAAAA,cACvE,OAAOsE,YAAY,WAClB1Q;MAAM,KAAKwR,0BAAevK;AAAAA,MAAM,OAAOyJ;AAAAA,gBACpCA;AAAAA,SAGHA;AAAAA;AAAAA;uBCtByB;AAAA,EAAEI;AAAAA,EAAQY;AAAAA,GAAmF;QACtH;AAAA,IACJpS,YAAY;AAAA,MAAE6B;AAAAA,MAAYwQ;AAAAA;AAAAA,IAC1BvQ,OAAO;AAAA,MAAEC;AAAAA;AAAAA,MACP7B;QAEEsJ,QAAQC;QACR6I,aAAa9I,MAAMvH,SAAUgI,WAAUA,MAAMsI,SAASpE,IAAIqD;QAC1DgB,cAAchJ,MAAMvH,SAAUgI;;AAAU,YAAC,CAACA,aAAM0H,gBAAgBnH,IAAIgH,YAA1BvH,mBAAmCsD,SAAStC;AAAAA;qBAE1E;UACV;AAAA,MACJlL,OAAO;AAAA,QAAEwS,UAAUE;AAAAA,QAAoBC;AAAAA,QAAeC;AAAAA;AAAAA,MACtDJ;AAAAA,MACAZ;AAAAA,QACEnI,MAAMc;UAEJsI,cAAc,IAAI1E,IAAIqE;QACxBG;kBAA2BvF;QAC3BmF;kBAAwBnI,OAAOqH;AAAAA,SAC9B;kBACSpD,IAAIoD;YAEVzC,OAAO4C,gBAAgBnH,IAAIgH;iBACtBqB,YAAY9D,OAAO+D,aAAanB,iBAAiB5C,QAAQ,IAAI;oBAC1DX,IAAIyE;AAAAA;AAAAA;yDAIDD;QAEf,CAACH,oBAAoB;YACjBzI,OAAQC,WAAU;cAChBsI,WAAWK;AAAAA;AAAAA;AAAAA;MAKnBN,cAAcF,uBAAuB,CAACI,aAAa;WAC9C9R,eAAC;MAAQ,KAAK;AAAA,QAAEsD,QAAQ;AAAA;AAAA;AAAA;SAI/BtD,eAAC;IAAW,SAASmN;AAAAA,cACnBnN;MACE,KAAK;AAAA,QACHuD,SAAS;AAAA,QACT8I,YAAY;AAAA,QACZ1I,WAAWiO,aAAa,6BAA6B;AAAA;AAAA,gBAGvD5R,eAAC;;;;yBCnD0B;AAAA,EAAE8Q;AAAAA,GAAwC;QACrEhI,QAAQC;QACR;AAAA,IACJzJ,YAAY;AAAA,MAAEwN;AAAAA;AAAAA,MACZtN;QAEE6S,aAAavJ,MAAMvH,SAAUgI,WAAU;UACrC+I,UAAUxB,SAAS,CAACA,UAAUrK,MAAM8L,KAAKhJ,MAAM0H,gBAAgBuB;WAC9DjJ,MAAM0H,gBAAgBwB,OAAO,KAAKH,QAAQI,MAAO5B,aAAWvH,MAAMoJ,UAAUlF,IAAIqD;AAAAA;mBAGzErL,GAAsB;UAC9BmN,aAAanN,EAAEoN;UAEf;AAAA,MACJ1E;AAAAA,MACA8C;AAAAA,MACA6B;AAAAA,MACAH;AAAAA,MACAtT,OAAO;AAAA,QAAE0T;AAAAA,QAAoBJ,WAAWK;AAAAA,QAAqBC;AAAAA;AAAAA,QAC3DnK,MAAMc;QAENrD;QACAqM,WAAWM,YAAYpC,QAAQ;YAC3BpQ,IAAIoS,iBAAiB3E,YAAY9D,UAAW4B,OAAM6G,mBAAmB7G,EAAE9E,MAAM;YAC7ExG,IAAIwN,YAAY9D,UAAWgE,UAASA,KAAKlH,OAAO2J;cAC9C3C,YAAYjC,MAAMtB,KAAKhK,IAAIF,GAAGC,IAAIiK,KAAK/J,IAAIH,GAAGC,KAAK;AAAA,WACtD;YACC0N,OAAOyC,SAASG,gBAAgBnH,IAAIgH,UAAUhP;cAC5CuM,OAAO,CAACA,QAAQF;AAAAA;UAGpBgF,eAAe,IAAI3F,IAAImF;eAClBtE,QAAQ9H,OAAO;UACpB8L;qBAAyB5I,OAAO4E,KAAKlH;AAAAA;qBACvBuG,IAAIW,KAAKlH;AAAAA;QAGzB4L,sBAAsBV,YAAY;iBACzBF,YAAYC,aAAanB,iBAAiB,GAAG1K,QAAQ;qBACjDkD,OAAO0I;AAAAA;iBAEXiB,cAAcC,eAAe,GAAG9M,QAAQ;qBACpCkD,OAAO2J;AAAAA;AAAAA;2DAIJD;QAEhB,CAACH,qBAAqB;YAClB1J,OAAQC,WAAU;cAChBoJ,YAAYQ;AAAAA;AAAAA;UAIhB7J,OAAQC,WAAU;YAChBuJ,iBAAiBhC;AAAAA;AAAAA;SAKzB9Q,eAAC;IACC,KAAK;AAAA,MACH+D,aAAa;AAAA,MACbiB,OAAO;AAAA;AAAA,IAET,SAASqN;AAAAA,IACT,UAAUlF;AAAAA;AAAAA;wBChEkB6D,SAA0D3C,MAASnK,OAAe;SAC3G,CACL8M,oCAASS,iBAAgB6B,WAAWtC,QAAQS,KAAKpD,MAAMnK,SAAS8M,mCAASS,MACzEvN,QAAQ,MAAM,KAAK8M,oCAASuC,WAC5BrP,QAAQ,MAAM,KAAK8M,oCAASwC;AAAAA;MAInBC,MAAM5C,WAAK,cAAgB;AAAA,EAAEC;AAAAA,EAAQC;AAAAA,GAAkE;;QAC5GjI,QAAQC;QACR2K,SAAShU,aAAuB;QAEhC;AAAA,IAAEiU;AAAAA,IAAWC;AAAAA,IAAQ9B;AAAAA,IAAaJ;AAAAA,IAAqBmC;AAAAA,IAAWC;AAAAA,IAAiBC;AAAAA,MAAcjL,MAAMvH,SAAUgI,WAAU;;UACzH8E,OAAO9E,MAAM0H,gBAAgBnH,IAAIgH;UACjC5M,QAAQ,CAACmK,OAAO,KAAK9E,MAAM4E,YAAYtC,QAAQwC;WAE9C;AAAA,MACLsF,WAAWpC,GAAG,GAAGF,eAAe9H,MAAMlK,MAAM2R,SAAS3C,MAAMnK;AAAAA,MAC3D0P,QAAQvF,OAAO+D,aAAa7I,MAAM0H,iBAAiB5C,MAAMoE,OAAO;AAAA,MAChEX,aAAa,CAAC,CAACzD,8BAAMxB,SAAStC;AAAAA,MAC9BmH,qBAAqBrD,QAAQ9E,qBAAMlK,OAAMqS,wBAAZnI,8BAAkC8E;AAAAA,MAC/DwF,WAAWtK,MAAM2E,cAAcjL,IAAKmK,YAAWA,OAAOjG;AAAAA,MACtD2M,iBAAiBvK,MAAMlK,MAAMyU;AAAAA,MAC7BC,WAAWxK,MAAMlK,MAAM0U,qBAAqBT,WAAYjF,OAAO9E,MAAMlK,MAAM0U,UAAU1F,MAAMnK,SAAS,OAAQqF,MAAMlK,MAAM0U;AAAAA;AAAAA;kBAIlH,MAAM;UACR1K,MAAMqK,OAAO5T;QACf,CAACuJ;;UAEC2K,IAAI,IAAIC,eAAe,MAAM;UAC7B,CAACpF,SAASqF,SAAS7K;;YACjBC,OAAQC,WAAU;cAChB4K,WAAW3K,IAAIsH,QAAQzH,IAAI+K;AAAAA;AAAAA;MAGnCC,QAAQhL;WAEH,MAAM2K,EAAEM;AAAAA,KACd,CAACZ,OAAO5T;oBAEL8J,WAAWvK,OAAM8R,4CAAc,cAAcL;SAGjDzN;eACErD;MAAK;AAAA,MAAsB,KAAK,CAACwR,0BAAe+C;AAAAA,MAAW,KAAKb;AAAAA,QAEhErQ;MAAK;AAAA,MAAsB,KAAK,CAACmO,0BAAeC,MAAMD,0BAAegD;AAAAA,iBACnExU;QAAK,KAAK;AAAA,UAAEgG,OAAO4N,SAAS;AAAA;AAAA,UAE3BE,mBAAmB9T,eAAC;QAAgB;AAAA,0BAEpB0R,wBAAwB1R,eAAC;QAAc;AAAA,QAAgB;AAAA,UAEvE+T;AAAAA,QAGFF,UAAU5Q,IAAK2F,cACd5I,eAAC,cAAc;MAAwB,OAAO4I;AAAAA,gBAC5C5I,eAAC;QAAK;AAAA,QAAgB;AAAA;AAAA,OADK4I,YAK/B5I;MAAK;AAAA,MAAsB,KAAK,CAACwR,0BAAe+C;AAAAA;AAAAA;AAAAA;uBCrErB;AAAA,EAAE1H;AAAAA,GAAkD;QAC7E/D,QAAQC;QACRH,WAAWC;QACX;AAAA,IACJvJ,YAAY;AAAA,MAAEmV;AAAAA;AAAAA,IACdrT,OAAO;AAAA,MAAEsT;AAAAA;AAAAA,MACPlV;QAEE;AAAA,IAAEmV;AAAAA,IAAWzQ;AAAAA,MAAU4E,MAAMvH,SAAUgI,WAAU;;UAC/CrF,SAAQqF,YAAMqL,KAAKvK,UAAWwK,OAAMA,EAAEjM,aAAaA,cAA3CW,YAAwD;WAC/D;AAAA,MACLoL,WAAWpL,YAAMqL,KAAK1Q,YAAXqF,mBAAmBoL;AAAAA,MAC9BzQ,OAAOA,UAAS,KAAKqF,MAAMqL,KAAKrK,SAAS,IAAIrG,SAAQ,IAAIpC;AAAAA;AAAAA;mBAI7C2D,GAAqBqP,KAAe;UAC5C;AAAA,MACJzV,OAAO;AAAA,QAAEuV,MAAMG;AAAAA,QAAgBC;AAAAA;AAAAA,QAC7BlM,MAAMc;UAEJqL,eAAeN,cAAc,QAAQ,SAAS;UAC9CO,UAAUzP,EAAE8K,iBAAiB,cAAcuE,MAAMhM,MAAMc,WAAWgL,KAAKjO,OAAQkO,OAAMA,EAAEjM,aAAaA,YAAY;QAClH,CAACkM,KAAK;cACAK,KAAK;AAAA,QACXvM;AAAAA,QACA+L,WAAWM;AAAAA;AAAAA;iDAIAC;QAEX,CAACH,gBAAgB;YACbzL,OAAQC,WAAU;cAChBqL,OAAOM;AAAAA;AAAAA;MAIfjF;WACK;AAAA;SAIP5M;IACE,KAAK;AAAA,MACH8E,YAAY;AAAA,MACZ5E,SAAS;AAAA,MACTK,qBAAqB;AAAA,MACrBF,YAAY;AAAA,MACZqB,QAAQ;AAAA,iBAEG;AAAA,QACTqQ,UAAU;AAAA,QACVC,cAAc;AAAA;AAAA;AAAA,IAGlB,SAAU5P,OAAM0H,QAAO1H;AAAAA,IACvB,eAAgBA,OAAM0H,QAAO1H,GAAG;AAAA,eAEhCzF;;QAEAA,eAAC;MAAM,cAAckE;AAAAA,gBACnBlE;QACE,KAAK,CACH;AAAA,UAAEqM,YAAY;AAAA,UAAa7G,UAAU;AAAA,WACrC,CAACmP,aAAa;AAAA,UAAEW,SAAS;AAAA,WACzBX,cAAc,UAAU;AAAA,UAAEhR,WAAW;AAAA;AAAA,kBAGvC3D,eAAC;;;;;kBCzEkC,IAA6B,IAAsD;MAC1H,OAAO;MACP;MACA;iBAEW;UACP,OAAO;WAEN,KAAK;eACD;cACD;OAGP,GAAG;AAAA;SAGD,OAAO,OACZ,YAAa,MAAY;UACjB,MAAM,KAAK;eACN;QAEP;AAAS;AAAA,aAEF,MAAM,OAAO,IAAI;gBAChB,WAAW,KAAK,OAAO,KAAK;AAAA,WACjC;;;KAIT;AAAA,IACE,QAAQ;UACF,UAAU;;;;;;AC1BtB,MAAMuV,iBAAiB,CAAClP,MAAgC;QAChD8J,SAAS9J,EAAE+J;MACb,CAACD;WAAetB,SAAS2G;MACzBrF,OAAOsF,eAAetF,OAAOuF,gBAAgBrK,iBAAiB8E,QAAQwF,cAAc;WAAkBxF;SACnGoF,eAAepF;AAAAA;AAGxB,MAAMyF,iBAAiB,CAACvP,GAAgBwP,MAA2B;MAC7DxP,EAAEyP,iBAAiBD,EAAEC,gBAAgB,CAACzP,EAAEyP;WAAqBzP,EAAE0P,YAAYF,EAAEE;MAC7E1P,EAAEyP,wBAAwBE;WAAoBJ,eAAevP,EAAEyP,cAAcD,KAAKxP,EAAE0P;SACjF;AAAA;qBAGsB,IAIgG;AAJhG,eAC7BlI;AAAAA;AAAAA,IACAhB;AAAAA,MAF6B,IAG1BxN,kBAH0B,IAG1BA;AAAAA,IAFHwO;AAAAA,IACAhB;AAAAA;;QAGM/D,QAAQC;QACRkN,UAAUnN,MAAMvH,SAAS;QACzB2U,WAAWxW,aAAuB;QAClC,GAAGyW,cAAc5U,eAAS;QAE1B;AAAA,IACJ+Q,UAAU;AAAA,IACVC,OAAO;AAAA,IACP6D;AAAAA,IACAC,SAAS;AAAA,IACTC,QAAQ;AAAA,MACNxN,MAAMvH,SACPgI,WAAU;;UACH+I,WAAU/I,MAAM4E,YAAYlL,IAAKoL,UAASA,KAAKlH;UAC/CoP,OAAOL,SAASpW,WAAWyV,eAAeW,SAASpW;QACrD,CAACyJ,MAAMlK,MAAM4W;aAAgB;AAAA,QAAE3D;;QAC/B,CAAC4D,SAASpW,WAAW,CAACyW,QAAQ,CAAC1H,SAASqF,SAASqC;aAAc;UAE7D;AAAA,MACJC;AAAAA,MACAC;AAAAA,MACAC,WAAW;AAAA,MACXC;AAAAA,MACAC;AAAAA,qBACSvX,MAAM4W,mBAAmB3P,SAASiD,MAAMlK,MAAM4W,UAAUnU,wBAAc;QAE7E+U,cAAc;UACZ1C,aAAa7B,SAAQrP,IAAI,CAAC6N,QAAQ5M,UAAU;;YAC1C4S,IAAIN,8CAAajN,MAAM4K,WAAWrK,IAAIgH,YAAlC0F,aAA6CC,oBAA7CD,uBAA2E,IAAI,MAAMK,cAAc3S;qBAC9F4S;aACRA;AAAAA;UAGHC,cAAcnB,eAAeM,SAASpW,SAASyW;UAC/CS,eAAed,SAASpW,QAAQiW;UAChCkB,aAAaV,KAAKW,YAAYH,cAAcC;UAC5CG,gBAAgBF,aAAaV,KAAKb,eAAesB;QAEnDzE,QAAO,GACT6D,MAAK9D,SAAQ/H,QACb8L,UAAS,GACTC,SAAQ;eACCQ,KAAK3C,YAAY;UACtBkC,UAASS,IAAIG,kDAA6BP;;;iBAEpCI;AAAAA;eAGDA,KAAK3C,WAAWiD,WAAW;UAChCd,SAAQQ,IAAID,cAAcM,2DAAmCT;;;gBAExDI;AAAAA;WAGJ;AAAA,MAAExE,SAASA,SAAQpG,MAAMqG,OAAM6D;AAAAA,MAAK7D;MAAM6D;MAAIC;MAAQC;;KAE/D;AAAA,IAAEpF,UAAU;AAAA;QAGRmG,oCAAyBpB,YAAY,YAAYnU,SAAYmU,+BAAUoB,+BAAkB;QACzFC,aAAa5U,cAAQ,MAAMwO,SAAS,MAAMiF,WAAYoB,OAAMA,IAAI,IAAIF,iBAAiB,CAACA;kBAElF,MAAM;QACV,CAACpB,WAAW,CAACC,SAASpW;;WAEnB0X,iBAAiB,UAAUF,YAAY;WACvC,MAAM;aACJG,oBAAoB,UAAUH,YAAY;AAAA;AAAA,KAElD,CAACpB,SAASpW,SAASwX;oBAEhB1N,WAAWvK,OAAM8R,4CAAe,wBAAuBoB,WAAW6D;SAGtE/S,wDAAShE;eACNwO,QAEAoI,WAAWjW;MAAK,OAAO;AAAA,QAAE0X,YAAY;AAAA,QAAU/G,QAAQ0F;AAAAA;AAAAA,MAAU,KAAKH;AAAAA,QAEtErJ,SAASyF,SAASC,OAElB0D,WAAWjW;MAAK,OAAO;AAAA,QAAE0X,YAAY;AAAA,QAAU/G,QAAQ2F;AAAAA;AAAAA;AAAAA;AAAAA;MCrFjDqB,eAAejI,oBAAqD;MACpEkI,gBAAgBlI,oBAAyB;2BACa;QAC3D5O,QAAQlB,iBAAW+X;MACrB,CAAC7W;UAAa+W,MAAM;SACjB/W;AAAAA;4BAE8B;QAC/BA,QAAQlB,iBAAWgY;MACrB9W,UAAU;UAAY+W,MAAM;SACzB/W;AAAAA;eAGgBzB,OAAmC;;QACpDyJ,QAAQgP,cAAczY;oBAEtBuK,WAAWvK,OAAM8R,4CAAc;SAGnCnR,eAAC,aAAa;IAAS,OAAO8I;AAAAA,cAC5B9I,eAAC;;;AAKP,6BAA6B;QACrB;AAAA,IAAEiH;AAAAA,MAASzH;QACXuY,aAAaC;QACb,CAACC,aAAaC,kBAAkB3W,eAAS;kBAErC,MAAM;UACR4W,SAASC,WAAW,MAAMF,eAAe,OAAO;WAC/C,MAAMG,aAAaF;AAAAA;SAI1B9U;eACG,CAAC0U,cAAcE,eAAejY;gBAAMiH,KAAKqR;AAAAA,QAC1CtY,eAAC;MAAW,QAAQ,CAAC+X;AAAAA;AAAAA;AAAAA;AAK3B,MAAMQ,aAAa1H,WAAK,qBAAuB;AAAA,EAAE2H;AAAAA,GAA+B;;QACxE1P,QAAQC;QACR0P,YAAY3P,MAAMvH,SAAS;QAC3B2M,gBAAgBpF,MAAMvH,SAAUgI,WACpCA,MAAM2E,cAAcjL,IAAKmK;IACvBjG,IAAIiG,OAAOjG;AAAAA,IACXnB,OAAOoH,OAAOpH;AAAAA,IACdgL,SAAS5D,OAAO4D;AAAAA,IAChBnD,QAAQT,OAAOS;AAAAA;QAGbwC,eAAevH,MAAMvH,SAAS,gBAAgB;AAAA,IAAE2P,UAAU;AAAA;QAC1D9E,sBAAsBtD,MAAMvH,SAAS,uBAAuB;AAAA,IAAE2P,UAAU;AAAA;QACxEwH,eAAe5P,MAAMvH,SAAS;QAC9ByP,UAAUlI,MAAMvH,SAAS;QACzBoX,eAAe7P,MAAMvH,SAAS;QAC9BuS,kBAAkBhL,MAAMvH,SAAS;QACjCqX,wBAAwB9P,MAAMvH,SAAS;QACvCoN,eAAe7F,MAAMvH,SAAUgI,WAAU,CAAC,CAACA,MAAMlK,MAAMsP,aAAaH,QAAQ,CAAC,CAACjF,MAAMlK,MAAMsP,aAAaC;QACvGzJ,eAAeC;oBAEfwE,WAAWvK,OAAM8R,4CAAc;SAGnCnR,eAAC;IACC,WAAWgR,mCAASlI;AAAAA,IACpB,KAAK,CACH3D,cACAqM,0BAAe1I,OACf;AAAA,MACElF,qBAAqB;AAAA,QAEnB6U,cAAc,WAAWA,cAAc,OAAO,SAAS;AAAA,QACvD;AAAA,QACA,GAAGvK,cAAcjL,IAAKmK;;AAAWiD,kDAAavG,IAAIsD,OAAOjG,QAAxBkJ,aAA+BjD,OAAOpH,UAAtCqK,aAA+CqI,iBAA/CrI,YAA+D;AAAA;AAAA,QAChGoI,cAAc,UAAUA,cAAc,OAAO,SAAS;AAAA,QACtDI,KAAK;AAAA,OAETL,UAAU;AAAA,MAAEM,YAAY;AAAA;AAAA,IAE1B,QACEzV;iBACErD;QACE,WAAWgR,mCAAS+H;AAAAA,QACpB,KAAK,CAACvH,0BAAewH,YAAYL,gBAAgBnH,0BAAeyH,QAAQN,wBAAwBrS,UAAUqS;AAAAA,UAG5GtV;QACE,WAAW2N,mCAAS+H;AAAAA,QACpB,KAAK,CAACvH,0BAAeuH,YAAYJ,gBAAgBnH,0BAAeyH,QAAQN,wBAAwBrS,UAAUqS;AAAAA,mBAEzG7E,mBAAmB9T,eAAC,sBAEpB4Y,yBAAyB5Y,eAAC,sBAE1B2O,gBAAgB3O,eAAC,aAClBA,eAAC;UAGHA,eAAC,oBAAoB;kBAClBkO,cAAcjL,IAAKmK;;AAClBpN,gCAAC,cAAc;YAAyB,OAAOoN,OAAOjG;AAAAA,sBACpD9D,gBAAC;cACC,WAAWkO,GAAGP,mCAAS+H,YAAY3L,cAAO4D,YAAP5D,oBAAgB2L;AAAAA,cACnD,KAAK,CACHvH,0BAAeuH,YACf3M,oBAAoBtC,IAAIsD,OAAOjG,KAC/BwR,gBAAgBnH,0BAAeyH,QAC/BN,wBAAwBrS,UAAUqS;AAAAA,yBAIpC3Y,eAAC;0BAAeoN,OAAOS;AAAAA,kBACvB7N;gBAAK,KAAK;AAAA,kBAAEkZ,MAAM;AAAA;AAAA,kBAClBlZ,eAAC,oBACDA,eAAC;eALIoN,OAAOjG;AAAAA,aATaiG,OAAOjG;AAAAA;AAAAA,UAoBxCnH;QACE,WAAWgR,mCAAS+H;AAAAA,QACpB,KAAK,CAACvH,0BAAewH,YAAYL,gBAAgBnH,0BAAeyH,QAAQN,wBAAwBrS,UAAUqS;AAAAA;AAAAA;AAAAA,cAK/G,CAACrG,SAAS6G,eAAe7G,QAAQrP,IAAI,CAAC6N,QAAQ5M,UAAUlE,eAAC;MAAiB;AAAA,MAAgB,UAAUmZ,aAAajV;AAAAA,OAA/C4M;AAAAA;AAAAA;AC9IzE,gBAAmBtH,KAAa1I,OAAU+F,cAAwB;QAC1DuS,SAAS,IAAI5L,IAAI3G,eAAe,KAAK2C;MACvCA,IAAIiE,IAAI3M,QAAQ;WACX2I,OAAO3I;AAAAA,SACT;WACE4M,IAAI5M;AAAAA;SAGNsY;AAAAA;sBAGuD,IAWX;AAXW,eAC9DnL;AAAAA,aAASoL;AAAAA,IACTC,cAAcC;AAAAA,IACdC,SAASF;AAAAA,IACTzS;AAAAA,MAJ8D,IAK3DxH,kBAL2D,IAK3DA;AAAAA,IAJH4O;AAAAA,IACAqL;AAAAA,IACAE;AAAAA,IACA3S;AAAAA;QAQM;AAAA,IACJvH,YAAY;AAAA,MAAE6B;AAAAA,MAAY2L;AAAAA;AAAAA,IAC1B1L,OAAO;AAAA,MAAEqY;AAAAA,MAAQC;AAAAA;AAAAA,IACjBzS;AAAAA,MACEzH;QAEEsJ,QAAQC;QACRH,WAAWC;QAEXoF,UAAUnF,MAAMvH,SAAUgI,WAAU;;QACpC8P;aAAwBM,KAAKN;UAE3BjM,SAAS7D,MAAM2E,cAAchE,KAAMkD,aAAWA,QAAOjG,OAAOyB;QAC9D,CAACwE;aAAe;UAEdtG,WAAWzH,YAAMyH,aAANzH,mBAA0BgH;WAEpCsT,KAAKC,QAAQrQ,MAAMb,OAAQ2F,UAASwL,UAAU/S,SAASsG,OAAOtM,MAAMuN,OAAOA;AAAAA;QAG9E,CAACyL,OAAOC,YAAYxY,eAAS;QAC7ByY,WAAW/L,QAAQtH,OAAQsT,YAAW,CAACH,SAASR,YAAYW,QAAQC,cAAcC,SAASL,MAAMI;QAEjG;AAAA,IAAEpZ,4BAAY0M;AAAAA,IAAUzM;AAAAA,MAAamG,UAAU,iCAChD7H,QADgD;AAAA,IAGnD8H,IAAI;AAAA,IAEJC,SAASC,aAAa;aACbA,YAAYoL,OAAO;AAAA;AAAA,IAG5BnL,KAAKD,aAAavG,QAAO;aAChBuG,YAAYoG,IAAI3M;AAAAA;AAAAA;SAKzBuC;IACE,KAAK;AAAA,MACHuB,SAAS;AAAA,MACTrB,SAAS;AAAA,MACT8L,KAAK;AAAA;AAAA,eAGPrP,eAAC;MACC,OAAO8Z;AAAAA,MACP,UAAWrU,OAAMsU,SAAStU,EAAEQ,OAAOnF;AAAAA,MACnC,SAASd,eAAC;QAAW,SAAS,MAAM+Z,SAAS;AAAA,kBAAM,CAACD,QAAQ9Z,eAAC,cAAYA,eAAC;;MAC1E,KAAK;AAAA,QAAEgE,cAAc;AAAA;AAAA,QAGvBX;MAAK,KAAK;AAAA,QAAE+W,WAAW;AAAA,QAAQzE,WAAW;AAAA;AAAA,iBACxC3V,eAAC;QACC,UAAUc,MAAM2R,SAAS;AAAA,QACzB,SAASzS,eAAC;UAAS,UAAUc,MAAM2R,SAAS;AAAA,UAAG,SAAS3R,MAAM2R,OAAO;AAAA,UAAG,UAAU,MAAM1R,6BAAayM;AAAAA;AAAAA,QACrG,OAAOnK;0BAAO4D,KAAKzC,SAAS1D,MAAM2R;;UAGnCuH,SAAS/W,IAAI,CAACgX,QAAQ/V,UACrBlE,eAAC;QAEC,SAASA,eAAC;UAAS,SAASc,MAAM2M,IAAIwM;AAAAA,UAAS,UAAU,MAAMlZ,SAASoM,OAAOrM,OAAOmZ,QAAQpT;AAAAA;AAAAA,QAC9F,OAAO2S,OAAOS;AAAAA,SAFT/V;AAAAA,QAOV8V,SAASzP,WAAW,KAAKvK;MAAM,KAAK;AAAA,QAAEqa,WAAW;AAAA;AAAA,gBAAapT,KAAKqT;AAAAA;AAAAA;AAAAA;kBCnG7B,IAA6B,IAAsD;MAC1H;MACA;iBAEW;UACP,OAAO;eAEF;cACD;OAEP,GAAI;AAAA;SAGF,OAAO,OACZ,YAAa,MAAY;eACZ;QAEP,SAAS;mBACE;AAAA;cAGL,WAAW,KAAK;AAAA,KAE5B;AAAA,IACE,QAAQ;UACF,SAAS;qBACE;;;;;;mBCnByC,MAAwC;;QAChG,QAAQ;QACR,WAAW;kBAGP,MAAM;UACR,OAAO,CAAC,UAAU;UAClB,KAAK,iBAAiB,QAAW;cAC7B,aAAa,IAAI,UAAU,KAAK;AAAA;AAAA;AAAA,KAGzC;kBAEO,MAAM;UACR,OAAO,CAAC,UAAU;YAChB,QAAQ,IAAI,UAAUjS,gBAAU;UAElC,KAAK,UAAU,QAAW;cACtB,aAAa,IAAI,UAAU,KAAK;AAAA;AAAA;WAInC,MAAM;YACL,OAAO,CAAC,UAAU;cAChB,QAAQ,OAAO;AAAA;AAAA;AAAA,KAGxB,CAAC,OAAO,UAAU,GAAI,WAAK,iBAAL,YAAqB,CAAC;QAGzC,QAAQ,MAAM,SAAS,CAAC,UAAU,MAAM,aAAa,IAAI;QACzD,CAAC,YAAY,iBAAiB9G;QAC9B,UAAU7B,aAAO;wBAEP,MAAM;YACZ,UAAU;AAAA;QAGd,gBAAgBgD,cACpB,MACE,SAAS,CAAC,WAAc;UAChB,EAAE,OAAO,iBAAiB,wBAAa,QAAQ;QAEjD,oBAAoB,QAAW;YAC3B,OAAO,CAAC,UAAU;cAChB,aAAa,IAAI,UAAU;AAAA;AAAA;2CAI1B;kBACG;AAAA,KACb,MACL,CAAC;oBAGe,QAAW;kBACb;kBACA;AAAA;kBAGN,MAAM,cAAc,SAAS,CAAC;SAEjC;AAAA,IACL,OAAO,kCAAc;AAAA,IACrB;AAAA,IACA,OAAO9C,iBAAW;AAAA;AAAA;MCxET,YAAY,CAAC,MAAc,UAA2B;SAC1D,KAAK;UACJ,MAAM;SACP,MAAM,MAAM,OAAO,MAAM,CAAC,SAAS,UAAU,MAAM;AAAA;MAG/C,YAAY,CAAC,MAAc,UAA2B;MAC7D,IAAI;;eACU,QAAQ,OAAO;aACxB,IAAI,KAAK,QAAQ,KAAK;YACvB,KAAK,OAAO,MAAM;;;;;aAKjB;AAAA;SAEF;AAAA;oBCTwB,IAMyB;AANzB,eAC/B2a;AAAAA,cAAUC;AAAAA,IACV1T,WAAW2T;AAAAA,MAFoB,IAG5Bpb,kBAH4B,IAG5BA;AAAAA,IAFHkb;AAAAA,IACAzT;AAAAA;QAKM;AAAA,IACJxH,YAAY;AAAA,MAAE6B;AAAAA;AAAAA,IACdC,OAAO;AAAA,MAAEqY;AAAAA,MAAQC;AAAAA;AAAAA,MACfla;QAEE;AAAA,IAAEsB,QAAQ;AAAA,IAAIC;AAAAA,MAAamG,UAAU,iCACtC7H,QADsC;AAAA,IAEzCyH;AAAAA,IAEAK,IAAI;AAAA,IAEJC,SAASC,aAAa;aACb,CAAC,CAACA;AAAAA;AAAAA,IAGXC,KAAKD,aAAavG,QAAO;aAChByZ,QAAQzZ,QAAOuG;AAAAA;AAAAA;SAKxBrH;IACE,KAAK;AAAA,MACH4E,SAAU;AAAA,MACVrB,SAAS;AAAA;AAAA,cAGXvD,eAAC;MACC;AAAA,MACA,UAAWyF,OAAM1E,SAAS0E,EAAEQ,OAAOnF;AAAAA,MACnC,SAASd,eAAC;QAAW,SAAS,MAAMe,SAAS;AAAA,kBAAM,CAACD,QAAQd,eAAC,cAAYA,eAAC;;;;;;;;;;;;;;;;;;;;;;"}
|