{"version":3,"file":"index.cjs","sources":["../src/context.js","../src/helpers/reorder.js","../src/components/grid/TextCell.jsx","../src/components/grid/ActionCell.jsx","../src/components/grid/Grid.jsx","../src/components/chart/CellGrid.jsx","../src/components/chart/Links.jsx","../src/components/chart/BarSegments.jsx","../src/components/chart/Rollups.jsx","../src/components/chart/Bars.jsx","../src/components/chart/TimeScale.jsx","../src/helpers/debug.js","../src/components/chart/Chart.jsx","../src/components/Resizer.jsx","../src/helpers/modeResizeObserver.js","../src/components/Layout.jsx","../src/helpers/prepareConfig.js","../src/components/Gantt.jsx","../src/components/Toolbar.jsx","../src/components/ContextMenu.jsx","../src/components/editor/Links.jsx","../src/components/editor/DateTimePicker.jsx","../src/components/Editor.jsx","../src/components/grid/HeaderMenu.jsx","../src/widgets/Tooltip.jsx","../src/themes/Material.jsx","../src/themes/Willow.jsx","../src/themes/WillowDark.jsx","../src/index.js"],"sourcesContent":["import { createContext } from 'react';\n\nconst store = createContext(null);\nexport default store;\n","import { locate, getID } from '@svar-ui/lib-dom';\n\nfunction getOffset(node, relative, ev) {\n  const box = node.getBoundingClientRect();\n  const base = relative.querySelector('.wx-body').getBoundingClientRect();\n\n  return {\n    top: box.top - base.top,\n    left: box.left - base.left,\n    dt: box.bottom - ev.clientY,\n    db: ev.clientY - box.top,\n  };\n}\n\nfunction checkSource(node) {\n  return node && getID(node, 'data-context-id');\n}\n\nconst SHIFT = 5;\n\nexport function reorder(node, config) {\n  let source, clone, sid;\n  let x, y, base, detail;\n  let touched, touchTimer;\n\n  function down(event) {\n    x = event.clientX;\n    y = event.clientY;\n    base = {\n      ...getOffset(source, node, event),\n      y: config.getTask(sid).$y,\n    };\n\n    document.body.style.userSelect = 'none';\n  }\n\n  function handleTouchstart(event) {\n    source = locate(event);\n    if (!checkSource(source)) return;\n\n    sid = getID(source);\n\n    touchTimer = setTimeout(() => {\n      touched = true;\n      if (config && config.touchStart) config.touchStart();\n      down(event.touches[0]);\n    }, 500);\n\n    node.addEventListener('touchmove', handleTouchmove);\n    node.addEventListener('contextmenu', handleContext);\n    window.addEventListener('touchend', handleTouchend);\n  }\n\n  function handleContext(event) {\n    if (touched || touchTimer) {\n      event.preventDefault();\n      return false;\n    }\n  }\n\n  function handleMousedown(event) {\n    if (event.which !== 1) return;\n\n    source = locate(event);\n    if (!checkSource(source)) return;\n\n    sid = getID(source);\n\n    node.addEventListener('mousemove', handleMousemove);\n    window.addEventListener('mouseup', handleMouseup);\n\n    down(event);\n  }\n\n  function end(full) {\n    node.removeEventListener('mousemove', handleMousemove);\n    node.removeEventListener('touchmove', handleTouchmove);\n    document.body.removeEventListener('mouseup', handleMouseup);\n    document.body.removeEventListener('touchend', handleTouchend);\n    document.body.style.userSelect = '';\n\n    if (full) {\n      node.removeEventListener('mousedown', handleMousedown);\n      node.removeEventListener('touchstart', handleTouchstart);\n    }\n  }\n\n  function move(event) {\n    const dx = event.clientX - x;\n    const dy = event.clientY - y;\n    if (!clone) {\n      if (Math.abs(dx) < SHIFT && Math.abs(dy) < SHIFT) return;\n      if (config && config.start) {\n        if (config.start({ id: sid, e: event }) === false) return;\n      }\n\n      clone = source.cloneNode(true);\n      clone.style.pointerEvents = 'none';\n      clone.classList.add('wx-reorder-task');\n      clone.style.position = 'absolute';\n      clone.style.left = base.left + 'px';\n      clone.style.top = base.top + 'px';\n\n      source.style.visibility = 'hidden';\n      source.parentNode.insertBefore(clone, source);\n    }\n\n    if (clone) {\n      const top = Math.round(Math.max(0, base.top + dy));\n\n      if (config && config.move) {\n        if (config.move({ id: sid, top, detail }) === false) return;\n      }\n\n      const task = config.getTask(sid);\n      const y = task.$y;\n      //dnd may be blocked\n      if (!base.start && base.y === y) return up();\n\n      base.start = true;\n      base.y = task.$y - 4;\n      clone.style.top = top + 'px'; //task.$y - scroll\n\n      const targetNode = document.elementFromPoint(\n        event.clientX,\n        event.clientY,\n      );\n      const target = locate(targetNode);\n\n      if (target && target !== source) {\n        const tid = getID(target);\n        const box = target.getBoundingClientRect();\n        const line = box.top + box.height / 2;\n\n        const after =\n          event.clientY + base.db > line &&\n          target.nextElementSibling !== source;\n        const before =\n          event.clientY - base.dt < line &&\n          target.previousElementSibling !== source;\n\n        if (detail?.after === tid || detail?.before === tid) {\n          // avoid duplicate calls\n          detail = null;\n        } else if (after) {\n          // move down\n          detail = { id: sid, after: tid };\n        } else if (before) {\n          // move up\n          detail = { id: sid, before: tid };\n        }\n      }\n    }\n  }\n\n  function handleMousemove(event) {\n    move(event);\n  }\n\n  function handleTouchmove(event) {\n    if (touched) {\n      event.preventDefault();\n      move(event.touches[0]);\n    } else if (touchTimer) {\n      clearTimeout(touchTimer);\n      touchTimer = null;\n    }\n  }\n\n  function handleTouchend() {\n    touched = null;\n    if (touchTimer) {\n      clearTimeout(touchTimer);\n      touchTimer = null;\n    }\n    up();\n  }\n\n  function handleMouseup() {\n    up();\n  }\n\n  function up() {\n    if (source) {\n      source.style.visibility = '';\n    }\n    if (clone) {\n      clone.parentNode.removeChild(clone);\n      if (config && config.end) config.end({ id: sid, top: base.top });\n    }\n\n    sid = source = clone = base = detail = null;\n    end();\n  }\n\n  if (node.style.position !== 'absolute') node.style.position = 'relative';\n\n  node.addEventListener('mousedown', handleMousedown);\n  node.addEventListener('touchstart', handleTouchstart);\n\n  return {\n    destroy() {\n      end(true);\n    },\n  };\n}\n","import './TextCell.css';\n\nfunction TextCell({ row, column }) {\n  function getStyle(row, col) {\n    return {\n      justifyContent: col.align,\n      paddingLeft: `${(row.$level - 1) * 20}px`,\n    };\n  }\n\n  const CellComponent = column && column._cell;\n\n  return (\n    <div className=\"wx-pqc08MHU wx-content\" style={getStyle(row, column)}>\n      {!row.$empty && (row.data || row.lazy) ? (\n        <i\n          className={`wx-pqc08MHU wx-toggle-icon wxi-menu-${row.open ? 'down' : 'right'}`}\n          data-action=\"open-task\"\n        />\n      ) : (\n        <i className=\"wx-pqc08MHU wx-toggle-placeholder\" />\n      )}\n      <div className=\"wx-pqc08MHU wx-text\">\n        {CellComponent ? <CellComponent row={row} column={column} /> : row.text}\n      </div>\n    </div>\n  );\n}\n\nexport default TextCell;\n","import { useMemo } from 'react';\nimport './ActionCell.css';\n\nfunction ActionCell({ column, cell }) {\n  const action = useMemo(() => column.id, [column?.id]);\n\n  return cell || column.id === 'add-task' ? (\n    <div style={{ textAlign: column.align }}>\n      <i\n        className=\"wx-9DAESAHW wx-action-icon wxi-plus\"\n        data-action={action}\n      ></i>\n    </div>\n  ) : null;\n}\n\nexport default ActionCell;\n","import {\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { context } from '@svar-ui/react-core';\nimport { locateID } from '@svar-ui/lib-dom';\nimport { reorder } from '../../helpers/reorder';\nimport { prepareEditTask } from '@svar-ui/gantt-store';\nimport { Grid as WxGrid } from '@svar-ui/react-grid';\nimport TextCell from './TextCell.jsx';\nimport ActionCell from './ActionCell.jsx';\nimport { useWritableProp, useStore } from '@svar-ui/lib-react';\nimport storeContext from '../../context';\nimport './Grid.css';\n\nexport default function Grid(props) {\n  const {\n    readonly,\n    compactMode,\n    width = 0,\n    display = 'all',\n    columnWidth: columnWidthProp = 0,\n    onTableAPIChange,\n  } = props;\n  const [columnWidth, setColumnWidthProp] = useWritableProp(columnWidthProp);\n  const [tableAPI, setTableAPI] = useState();\n\n  const i18n = useContext(context.i18n);\n  const _ = useMemo(() => i18n.getGroup('gantt'), [i18n]);\n  const api = useContext(storeContext);\n\n  const scrollTopVal = useStore(api, 'scrollTop');\n  const cellHeightVal = useStore(api, 'cellHeight');\n  const focusTask = useStore(api, 'focusTask');\n  const selectedVal = useStore(api, '_selected');\n  const areaVal = useStore(api, 'area');\n  const rTasksVal = useStore(api, '_tasks');\n  const scalesVal = useStore(api, '_scales');\n  const headerLengthVal = useStore(api, '_headerLength');\n  const columnsVal = useStore(api, 'columns');\n  const sortVal = useStore(api, '_sort');\n  const calendarVal = useStore(api, 'calendar');\n  const durationUnitVal = useStore(api, 'durationUnit');\n  const splitTasksVal = useStore(api, 'splitTasks');\n  const filterValuesVal = useStore(api, 'filterValues');\n\n  const [dragTask, setDragTask] = useState(null);\n\n  const tasks = useMemo(() => {\n    if (!rTasksVal || !areaVal) return [];\n    return rTasksVal.slice(areaVal.start, areaVal.end);\n  }, [rTasksVal, areaVal]);\n\n  const execAction = useCallback(\n    (id, action) => {\n      if (action === 'add-task') {\n        api.exec(action, {\n          target: id,\n          task: { text: _('New Task') },\n          mode: 'child',\n          show: true,\n          focus: id ? 'grid' : null,\n        });\n      } else if (action === 'open-task') {\n        const task = tasks.find((a) => a.id === id);\n        if (task?.data || task?.lazy)\n          api.exec(action, { id, mode: !task.open });\n      }\n    },\n    [tasks],\n  );\n\n  const onClick = useCallback(\n    (e) => {\n      const id = locateID(e);\n      const action = e.target.dataset.action;\n      if (action) e.preventDefault();\n      if (id) {\n        if (action === 'add-task' || action === 'open-task') {\n          execAction(id, action);\n        } else {\n          api.exec('select-task', {\n            id,\n            toggle: e.ctrlKey || e.metaKey,\n            range: e.shiftKey,\n            show: 'xy',\n            focus: 'grid',\n          });\n        }\n      } else if (action === 'add-task') {\n        execAction(null, action);\n      }\n    },\n    [api, execAction],\n  );\n\n  const tableRef = useRef(null);\n  const tableContainerRef = useRef(null);\n  const [gridWidth, setGridWidth] = useState(0);\n  const [gridHeight, setGridHeight] = useState(0);\n  const [updateFlex, setUpdateFlex] = useState(false);\n\n  useEffect(() => {\n    const node = tableContainerRef.current;\n    if (!node || typeof ResizeObserver === 'undefined') return;\n    const update = () => {\n      setGridWidth(node.clientWidth);\n      setGridHeight(node.clientHeight);\n    };\n    update();\n    const ro = new ResizeObserver(update);\n    ro.observe(node);\n    return () => ro.disconnect();\n  }, []);\n\n  const allTasks = useMemo(() => {\n    const rows =\n      dragTask && !tasks.find((t) => t.id === dragTask.id)\n        ? [...tasks, dragTask]\n        : tasks;\n    return rows.map((t) => ({ ...t }));\n  }, [tasks, dragTask]);\n\n  const allTasksRef = useRef(allTasks);\n  useEffect(() => {\n    allTasksRef.current = allTasks;\n  }, [allTasks]);\n\n  const lastDetailRef = useRef(null);\n\n  const reorderTasks = useCallback(\n    (detail) => {\n      const id = detail.id;\n      const { before, after } = detail;\n      const inProgress = detail.onMove;\n\n      let target = before || after;\n      let mode = before ? 'before' : 'after';\n\n      if (inProgress) {\n        if (mode === 'after') {\n          const index = allTasksRef.current.findIndex((t) => t.id === id);\n          const targetIndex = allTasksRef.current.findIndex(\n            (t) => t.id === target,\n          );\n          const task = allTasksRef.current[targetIndex];\n          if (index - targetIndex === 1) {\n            mode = 'before';\n          } else if (task && task.data && task.open) {\n            mode = 'before';\n            target = task.data[0].id;\n          }\n        }\n        lastDetailRef.current = { id, [mode]: target };\n      } else lastDetailRef.current = null;\n\n      api.exec('move-task', {\n        id,\n        mode,\n        target,\n        inProgress,\n      });\n    },\n    [api],\n  );\n\n  // COLUMNS\n  // --------\n\n  const cols = useMemo(() => {\n    let cols = (columnsVal || []).map((col) => {\n      col = { ...col };\n      const header = [...col.header];\n      header.forEach((line) => {\n        if (line.text) line.text = _(line.text);\n      });\n      col.header = header;\n      return col;\n    });\n    const ti = cols.findIndex((c) => c.id === 'text');\n    const ai = cols.findIndex((c) => c.id === 'add-task');\n\n    if (ti !== -1) {\n      if (cols[ti].cell) cols[ti]._cell = cols[ti].cell;\n      cols[ti].cell = TextCell;\n    }\n    if (ai !== -1) {\n      cols[ai].cell = cols[ai].cell || ActionCell;\n      const header = cols[ai].header[0];\n      cols[ai].header[0].cell = header.cell || ActionCell;\n\n      if (readonly) {\n        cols.splice(ai, 1);\n      } else {\n        if (compactMode) {\n          const [actionCol] = cols.splice(ai, 1);\n          cols.unshift(actionCol);\n        }\n      }\n    }\n\n    if (cols.length > 0) cols[cols.length - 1].resize = false;\n    return cols;\n  }, [columnsVal, _, readonly, compactMode]);\n\n  // SIZES\n  // --------\n\n  const scrollDelta = useMemo(() => areaVal?.from ?? 0, [areaVal]);\n  const headerHeight = useMemo(() => scalesVal?.height ?? 0, [scalesVal]);\n\n  const scrollX = useMemo(() => {\n    if (!compactMode && display !== 'grid') {\n      return (columnWidth ?? 0) > (width ?? 0);\n    } else {\n      return (columnWidth ?? 0) > (gridWidth ?? 0);\n    }\n  }, [compactMode, display, columnWidth, width, gridWidth]);\n\n  const tableStyle = useMemo(() => {\n    const style = {\n      minHeight: `${gridHeight + (cellHeightVal ?? 0) * 4}px`,\n    };\n    if ((scrollX && display === 'all') || (display === 'grid' && scrollX)) {\n      style.width = columnWidth;\n    } else if (display === 'grid') {\n      style.width = '100%';\n    }\n    return style;\n  }, [scrollX, display, columnWidth, gridHeight, cellHeightVal]);\n\n  const basis = useMemo(() => {\n    if (display === 'all') return `${width}px`;\n    if (display === 'grid') return 'calc(100% - 4px)';\n    return cols.find((c) => c.id === 'add-task') ? '50px' : '0';\n  }, [display, width, cols]);\n\n  const sortMarks = useMemo(() => {\n    if (allTasks && sortVal?.length) {\n      const marks = {};\n      sortVal.forEach(({ key, order }, index) => {\n        marks[key] = {\n          order,\n          ...(sortVal.length > 1 && { index }),\n        };\n      });\n      return marks;\n    }\n    return {};\n  }, [allTasks, sortVal]);\n\n  const filters = useMemo(() => {\n    return sortMarks ? { ...filterValuesVal } : filterValuesVal;\n  }, [sortMarks, filterValuesVal]);\n\n  const checkFlex = useCallback(() => {\n    return cols.some((c) => c.flexgrow && !c.hidden);\n  }, [cols]);\n\n  const hasFlexCol = useMemo(() => {\n    // updateFlex is used to trigger re-evaluation\n    void updateFlex;\n    return checkFlex();\n  }, [checkFlex, updateFlex]);\n\n  const fitColumns = useMemo(() => {\n    let filteredColumns =\n      display === 'chart' ? cols.filter((c) => c.id === 'add-task') : cols;\n\n    const containerWidth = display === 'all' ? width : gridWidth;\n    if (!hasFlexCol) {\n      let baseColumnWidth = columnWidth;\n      let forceReset = false;\n      if (cols.some((c) => c.$width)) {\n        let actualWidth = 0;\n        baseColumnWidth = cols.reduce((acc, col) => {\n          if (!col.hidden) {\n            actualWidth += col.width;\n            acc += col.$width || col.width;\n          }\n          return acc;\n        }, 0);\n\n        if (actualWidth > baseColumnWidth && baseColumnWidth >= containerWidth)\n          forceReset = true;\n      }\n\n      if (forceReset || baseColumnWidth < containerWidth) {\n        let k = 1;\n        if (!forceReset)\n          k = (containerWidth - 50) / (baseColumnWidth - 50 || 1);\n        return filteredColumns.map((c) => {\n          if (c.id !== 'add-task' && !c.hidden) {\n            if (!c.$width) c.$width = c.width;\n            c.width = c.$width * k;\n          }\n          return c;\n        });\n      }\n    }\n    return filteredColumns;\n  }, [display, cols, hasFlexCol, columnWidth, width, gridWidth]);\n\n  const setColumnWidth = useCallback(\n    (resized) => {\n      if (!checkFlex()) {\n        const newColumnWidth = fitColumns.reduce((acc, col) => {\n          if (resized && col.$width) col.$width = col.width;\n          return acc + (col.hidden ? 0 : col.width);\n        }, 0);\n        if (newColumnWidth !== columnWidth) setColumnWidthProp(newColumnWidth);\n      }\n      setUpdateFlex(true);\n      setUpdateFlex(false);\n    },\n    [checkFlex, fitColumns, columnWidth, setColumnWidthProp],\n  );\n\n  const adjustColumns = useCallback(() => {\n    const flexCols = cols.filter((c) => c.flexgrow && !c.hidden);\n    if (flexCols.length === 1)\n      cols.forEach((c) => {\n        if (c.$width && !c.flexgrow && !c.hidden) c.width = c.$width;\n      });\n  }, [cols]);\n\n  const onDblClick = useCallback(\n    (e) => {\n      if (!readonly) {\n        const id = locateID(e);\n        const column = locateID(e, 'data-col-id');\n        const columnObj = column && cols.find((c) => c.id === column);\n        if (!columnObj?.editor && id) api.exec('show-editor', { id });\n      }\n    },\n    [api, readonly, cols],\n  );\n\n  const sel = useMemo(\n    () => (Array.isArray(selectedVal) ? selectedVal.map((o) => o.id) : []),\n    [selectedVal],\n  );\n\n  const setScrollOffset = useCallback(() => {\n    if (tableRef.current && allTasks !== null) {\n      const body = tableRef.current.querySelector('.wx-body');\n      if (body)\n        body.style.top = -((scrollTopVal ?? 0) - (scrollDelta ?? 0)) + 'px';\n    }\n  }, [allTasks, scrollTopVal, scrollDelta]);\n\n  useEffect(() => {\n    if (tableRef.current) {\n      setScrollOffset();\n    }\n  }, [scrollTopVal, scrollDelta, setScrollOffset]);\n\n  useEffect(() => {\n    const tableEl = tableRef.current;\n    if (!tableEl) return;\n    const bodyEl = tableEl.querySelector('.wx-table-box .wx-body');\n    if (!bodyEl || typeof ResizeObserver === 'undefined') return;\n    const ro = new ResizeObserver(() => {\n      setScrollOffset();\n    });\n    ro.observe(bodyEl);\n    return () => {\n      ro.disconnect();\n    };\n  }, [fitColumns, tableStyle, display, basis, allTasks, setScrollOffset]);\n\n  const pendingFocusRef = useRef(false);\n  useEffect(() => {\n    if (!focusTask || !tableAPI) return;\n\n    const { id, column } = focusTask;\n    if (column) {\n      if (!pendingFocusRef.current) {\n        pendingFocusRef.current = true;\n        requestAnimationFrame(() => {\n          const focusCell = tableAPI.getState().focusCell;\n          tableAPI.exec('focus-cell', {\n            row: id,\n            column: focusCell?.column || cols[0]?.id,\n          });\n          pendingFocusRef.current = false;\n        });\n      }\n    }\n  }, [focusTask, tableAPI]);\n\n  const startReorder = useCallback(\n    ({ id }) => {\n      if (readonly) return false;\n\n      if (api.getTask(id).open) api.exec('open-task', { id, mode: false });\n\n      const t = api.getState()._tasks.find((t) => t.id === id);\n      setDragTask(t || null);\n      if (!t) return false;\n    },\n    [api, readonly],\n  );\n\n  const endReorder = useCallback(\n    ({ id, top }) => {\n      if (lastDetailRef.current) {\n        reorderTasks({ ...lastDetailRef.current, onMove: false });\n      } else {\n        api.exec('drag-task', {\n          id,\n          top: top + (scrollDelta ?? 0),\n          inProgress: false,\n        });\n      }\n      setDragTask(null);\n    },\n    [api, reorderTasks, scrollDelta],\n  );\n\n  const moveReorder = useCallback(\n    ({ id, top, detail }) => {\n      if (detail) {\n        reorderTasks({ ...detail, onMove: true });\n      }\n      api.exec('drag-task', {\n        id,\n        top: top + (scrollDelta ?? 0),\n        inProgress: true,\n      });\n    },\n    [api, reorderTasks, scrollDelta],\n  );\n\n  useEffect(() => {\n    const node = tableRef.current;\n    if (!node) return;\n    const action = reorder(node, {\n      start: startReorder,\n      end: endReorder,\n      move: moveReorder,\n      getTask: api.getTask,\n    });\n    return action.destroy;\n  }, [api, startReorder, endReorder, moveReorder]);\n\n  const handleHotkey = useCallback(\n    (ev) => {\n      const { key, isInput } = ev;\n      if (!isInput && (key === 'arrowup' || key === 'arrowdown')) {\n        ev.eventSource = 'grid';\n        api.exec('hotkey', ev);\n        return false;\n      } else if (key === 'enter') {\n        const focusCell = tableAPI?.getState().focusCell;\n        if (focusCell) {\n          const { row, column } = focusCell;\n          if (column === 'add-task') {\n            execAction(row, 'add-task');\n          } else if (column === 'text') {\n            execAction(row, 'open-task');\n          }\n        }\n      }\n    },\n    [api, execAction, tableAPI],\n  );\n\n  // FIXME - temporary hack to provide fresh values to grid's handlers\n  const handlersStateRef = useRef(null);\n  const setHandlersState = () => {\n    handlersStateRef.current = {\n      setTableAPI,\n      handleHotkey,\n      sortVal,\n      api,\n      adjustColumns,\n      setColumnWidth,\n      tasks,\n      calendarVal,\n      durationUnitVal,\n      splitTasksVal,\n      onTableAPIChange,\n    };\n  };\n  setHandlersState();\n  useEffect(() => {\n    setHandlersState();\n  }, [\n    setTableAPI,\n    handleHotkey,\n    sortVal,\n    api,\n    adjustColumns,\n    setColumnWidth,\n    tasks,\n    calendarVal,\n    durationUnitVal,\n    splitTasksVal,\n    onTableAPIChange,\n  ]);\n\n  const init = useCallback((tapi) => {\n    setTableAPI(tapi);\n    tapi.intercept('hotkey', (ev) => handlersStateRef.current.handleHotkey(ev));\n    tapi.intercept('scroll', () => false);\n    tapi.intercept('select-row', () => false);\n    tapi.intercept('sort-rows', (e) => {\n      const sortVal = handlersStateRef.current.sortVal;\n      const { key, add } = e;\n      const keySort = sortVal ? sortVal.find((s) => s.key === key) : null;\n      let order = 'asc';\n      if (keySort) order = !keySort || keySort.order === 'asc' ? 'desc' : 'asc';\n\n      api.exec('sort-tasks', {\n        key,\n        order,\n        add,\n      });\n      return false;\n    });\n    tapi.intercept('filter-rows', (ev) => {\n      const { key, value } = ev;\n\n      api.exec('filter-tasks', {\n        key,\n        value,\n        open: true,\n      });\n      return false;\n    });\n\n    tapi.on('resize-column', () => {\n      handlersStateRef.current.setColumnWidth(true);\n    });\n\n    tapi.on('hide-column', (ev) => {\n      if (!ev.mode) handlersStateRef.current.adjustColumns();\n      handlersStateRef.current.setColumnWidth();\n    });\n\n    tapi.intercept('update-cell', (e) => {\n      const { id, column, value } = e;\n      const task = handlersStateRef.current.tasks.find((t) => t.id === id);\n\n      if (task) {\n        const update = { ...task };\n        let v = value;\n        if (v && !isNaN(v) && !(v instanceof Date)) v *= 1;\n        update[column] = v;\n\n        prepareEditTask(\n          update,\n          {\n            calendar: handlersStateRef.current.calendarVal,\n            durationUnit: handlersStateRef.current.durationUnitVal,\n            splitTasks: handlersStateRef.current.splitTasksVal,\n          },\n          column,\n        );\n\n        api.exec('update-task', {\n          id: id,\n          task: update,\n        });\n      }\n      return false;\n    });\n\n    onTableAPIChange && onTableAPIChange(tapi);\n  }, []);\n\n  return (\n    <div\n      className=\"wx-rHj6070p wx-table-container\"\n      style={{ flex: `0 0 ${basis}` }}\n      ref={tableContainerRef}\n    >\n      <div\n        ref={tableRef}\n        style={tableStyle}\n        className=\"wx-rHj6070p wx-table\"\n        onClick={onClick}\n        onDoubleClick={onDblClick}\n      >\n        <WxGrid\n          init={init}\n          sizes={{\n            rowHeight: cellHeightVal,\n            headerHeight:\n              (headerHeight ?? 0) / (headerLengthVal ?? 1),\n          }}\n          rowStyle={(row) =>\n            row.$reorder ? 'wx-rHj6070p wx-reorder-task' : 'wx-rHj6070p'\n          }\n          columnStyle={(col) =>\n            `wx-rHj6070p wx-text-${col.align}${col.id === 'add-task' ? ' wx-action' : ''}`\n          }\n          data={allTasks}\n          columns={fitColumns}\n          selectedRows={[...sel]}\n          sortMarks={sortMarks}\n          filterValues={filters}\n        />\n      </div>\n    </div>\n  );\n}\n","import { useContext, useEffect, useRef, useState } from 'react';\nimport storeContext from '../../context';\nimport { grid } from '@svar-ui/gantt-store';\nimport { useStore } from '@svar-ui/lib-react';\n\nfunction CellGrid({ borders = '' }) {\n  const api = useContext(storeContext);\n  const cellWidth = useStore(api, 'cellWidth');\n  const cellHeight = useStore(api, 'cellHeight');\n\n  const nodeRef = useRef(null);\n  const [color, setColor] = useState('#e4e4e4');\n\n  useEffect(() => {\n    if (typeof getComputedStyle !== 'undefined' && nodeRef.current) {\n      const border = getComputedStyle(nodeRef.current).getPropertyValue(\n        '--wx-gantt-border',\n      );\n      setColor(border ? border.substring(border.indexOf('#')) : '#1d1e261a');\n    }\n  }, []);\n\n  const style = {\n    width: '100%',\n    height: '100%',\n    background:\n      cellWidth != null && cellHeight != null\n        ? `url(${grid(cellWidth, cellHeight, color, borders)})`\n        : undefined,\n    position: 'absolute',\n  };\n\n  return <div ref={nodeRef} style={style} />;\n}\n\nexport default CellGrid;\n","import { useCallback, useContext, useEffect, useRef } from 'react';\nimport storeContext from '../../context';\nimport { useStore } from '@svar-ui/lib-react';\nimport { setID } from '@svar-ui/lib-dom';\nimport './Links.css';\n\nexport default function Links({ onSelectLink, selectedLink, readonly }) {\n  const api = useContext(storeContext);\n  const links = useStore(api, '_links');\n  const criticalPath = useStore(api, 'criticalPath');\n\n  const selectedLineRef = useRef(null);\n\n  const onClickOutside = useCallback(\n    (event) => {\n      const css = event?.target?.classList;\n      if (!css?.contains('wx-line') && !css?.contains('wx-delete-button')) {\n        onSelectLink(null);\n      }\n    },\n    [onSelectLink],\n  );\n\n  useEffect(() => {\n    if (!readonly && selectedLink && selectedLineRef.current) {\n      const handler = (event) => {\n        if (\n          selectedLineRef.current &&\n          !selectedLineRef.current.contains(event.target)\n        ) {\n          onClickOutside(event);\n        }\n      };\n      document.addEventListener('click', handler);\n      return () => {\n        document.removeEventListener('click', handler);\n      };\n    }\n  }, [readonly, selectedLink, onClickOutside]);\n\n  return (\n    <svg className=\"wx-dkx3NwEn wx-links\">\n      {(links || []).map((link) => {\n        const className =\n          'wx-dkx3NwEn wx-line' +\n          (criticalPath && link.critical ? ' wx-critical' : '') +\n          (!readonly ? ' wx-line-selectable' : '');\n        return (\n          <polyline\n            className={className}\n            points={link.$p}\n            key={link.id}\n            onClick={() => !readonly && onSelectLink(link.id)}\n            data-link-id={setID(link.id)}\n          />\n        );\n      })}\n      {!readonly && selectedLink && (\n        <polyline\n          ref={selectedLineRef}\n          className=\"wx-dkx3NwEn wx-line wx-line-selected wx-line-selectable wx-delete-link\"\n          points={selectedLink.$p}\n        />\n      )}\n    </svg>\n  );\n}\n","import './BarSegments.css';\n\nfunction BarSegments(props) {\n  const { task, type } = props;\n\n  function segmentStyle(i) {\n    const s = task.segments[i];\n    return {\n      left: `${s.$x}px`,\n      top: '0px',\n      width: `${s.$w}px`,\n      height: '100%',\n    };\n  }\n\n  function getSegProgress(segmentIndex) {\n    if (!task.progress) return 0;\n\n    const progress = (task.duration * task.progress) / 100;\n    const segments = task.segments;\n    let duration = 0,\n      i = 0,\n      result = null;\n    do {\n      const s = segments[i];\n      if (i === segmentIndex) {\n        if (duration > progress) result = 0;\n        else result = Math.min((progress - duration) / s.duration, 1) * 100;\n      }\n      duration += s.duration;\n      i++;\n    } while (result === null && i < segments.length);\n    return result || 0;\n  }\n\n  return (\n    <div className=\"wx-segments wx-GKbcLEGA\">\n      {task.segments.map((seg, i) => (\n        <div\n          key={i}\n          className={`wx-segment wx-bar wx-${type} wx-GKbcLEGA`}\n          data-segment={i}\n          style={segmentStyle(i)}\n        >\n          {task.progress ? (\n            <div className=\"wx-progress-wrapper\">\n              <div\n                className=\"wx-progress-percent wx-GKbcLEGA\"\n                style={{ width: `${getSegProgress(i)}%` }}\n              ></div>\n            </div>\n          ) : null}\n          <div className=\"wx-content\">{seg.text || ''}</div>\n        </div>\n      ))}\n    </div>\n  );\n}\n\nexport default BarSegments;\n","function Rollups(props) {\n  const { rollup, parent } = props;\n\n  return (\n    <div\n      data-tooltip-id={rollup.id}\n      className={`wx-GKbcLEGA wx-rollup wx-${rollup.type}-rollup`}\n      style={{\n        left: `${rollup.$x_rollup}px`,\n        top: `${parent.$y + parent.$h + rollup.$y_rollup_relative}px`,\n        width: `${rollup.$w_rollup}px`,\n        height: `${rollup.$h_rollup}px`,\n      }}\n    ></div>\n  );\n}\n\nexport default Rollups;\n","import {\n  Fragment,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { locate, locateID, getID, setID } from '@svar-ui/lib-dom';\nimport storeContext from '../../context';\nimport { useStore, useStoreWithCounter } from '@svar-ui/lib-react';\nimport { isSegmentMoveAllowed, extendDragOptions } from '@svar-ui/gantt-store';\nimport { Button } from '@svar-ui/react-core';\nimport Links from './Links.jsx';\nimport BarSegments from './BarSegments.jsx';\nimport Rollups from './Rollups.jsx';\nimport './Bars.css';\n\nfunction Bars(props) {\n  const { readonly, taskTemplate: TaskTemplate } = props;\n\n  const api = useContext(storeContext);\n\n  const [rTasksValue, rTasksCounter] = useStoreWithCounter(api, '_tasks');\n  const [rLinksValue, rLinksCounter] = useStoreWithCounter(api, '_links');\n  const areaValue = useStore(api, 'area');\n  const scalesValue = useStore(api, '_scales');\n  const taskTypesValue = useStore(api, 'taskTypes');\n  const baselinesValue = useStore(api, 'baselines');\n  const selectedValue = useStore(api, '_selected');\n  const rollups = useStore(api, 'rollups');\n  const rRollups = useStore(api, '_rollups');\n  const focusTaskStore = useStore(api, 'focusTask');\n  const criticalPath = useStore(api, 'criticalPath');\n  const tree = useStore(api, 'tasks');\n  const schedule = useStore(api, 'schedule');\n  const splitTasks = useStore(api, 'splitTasks');\n  const summary = useStore(api, 'summary');\n  const slack = useStore(api, 'slack');\n\n  const tasks = useMemo(() => {\n    if (!areaValue || !Array.isArray(rTasksValue)) return [];\n    const start = areaValue.start ?? 0;\n    const end = areaValue.end ?? 0;\n    return rTasksValue.slice(start, end).map((a) => ({ ...a }));\n  }, [rTasksCounter, areaValue]);\n\n  const lengthUnitWidth = useMemo(\n    () => scalesValue.lengthUnitWidth,\n    [scalesValue],\n  );\n\n  const ignoreNextClickRef = useRef(false);\n\n  const [linkFrom, setLinkFrom] = useState(undefined);\n  const [taskMove, setTaskMove] = useState(null);\n  const progressFromRef = useRef(null);\n\n  const [selectedLinkId, setSelectedLinkId] = useState(null);\n\n  const selectedLink = useMemo(() => {\n    return (\n      selectedLinkId && {\n        ...rLinksValue.find((link) => link.id === selectedLinkId),\n      }\n    );\n  }, [selectedLinkId, rLinksCounter]);\n\n  const [touched, setTouched] = useState(undefined);\n  const touchTimerRef = useRef(null);\n\n  const [totalWidth, setTotalWidth] = useState(0);\n\n  const containerRef = useRef(null);\n\n  const hasFocus = useMemo(() => {\n    const el = containerRef.current;\n    return !!(\n      selectedValue.length &&\n      el &&\n      el.contains(document.activeElement)\n    );\n  }, [selectedValue, containerRef.current]);\n\n  const focused = useMemo(() => {\n    return hasFocus && selectedValue[selectedValue.length - 1]?.id;\n  }, [hasFocus, selectedValue]);\n\n  useEffect(() => {\n    if (!focusTaskStore) return;\n    if (focusTaskStore.column === false) {\n      const { id } = focusTaskStore;\n      const node = containerRef.current?.querySelector(\n        `.wx-bar[data-id='${setID(id)}']`,\n      );\n      if (node) node.focus({ preventScroll: true });\n    }\n  }, [focusTaskStore]);\n\n  useEffect(() => {\n    const el = containerRef.current;\n    if (!el) return;\n    setTotalWidth(el.offsetWidth || 0);\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((entries) => {\n        if (entries[0]) {\n          setTotalWidth(entries[0].contentRect.width);\n        }\n      });\n      ro.observe(el);\n      return () => ro.disconnect();\n    }\n  }, [containerRef.current]);\n\n  const startDrag = useCallback(() => {\n    document.body.style.userSelect = 'none';\n  }, []);\n\n  const endDrag = useCallback(() => {\n    document.body.style.userSelect = '';\n  }, []);\n\n  const getMoveMode = useCallback(\n    (node, e, task) => {\n      if (e.target.classList.contains('wx-line')) return '';\n      if (!task) task = api.getTask(getID(node));\n      if (task.type === 'milestone' || task.type === 'summary') return '';\n\n      const segmentNode = locate(e, 'data-segment');\n      if (segmentNode) node = segmentNode;\n\n      const { left, width } = node.getBoundingClientRect();\n      const p = (e.clientX - left) / width;\n      let delta = 0.2 / (width > 200 ? width / 200 : 1);\n      if (p < delta) return 'start';\n      if (p > 1 - delta) return 'end';\n      return '';\n    },\n    [api],\n  );\n\n  const down = useCallback(\n    (node, point) => {\n      const { clientX } = point;\n      const id = getID(node);\n      const task = api.getTask(id);\n      const css = point.target.classList;\n      if (point.target.closest('.wx-delete-button')) return;\n      if (!readonly) {\n        if (css.contains('wx-progress-marker')) {\n          const { progress } = api.getTask(id);\n          progressFromRef.current = {\n            id,\n            x: clientX,\n            progress,\n            dx: 0,\n            node,\n            marker: point.target,\n          };\n          point.target.classList.add('wx-progress-in-drag');\n        } else {\n          const mode = getMoveMode(node, point, task) || 'move';\n\n          const newTaskMove = {\n            id,\n            mode,\n            x: clientX,\n            dx: 0,\n            l: task.$x,\n            w: task.$w,\n          };\n\n          if (splitTasks && task.segments?.length) {\n            const segNode = locate(point, 'data-segment');\n            if (segNode) {\n              newTaskMove.segmentIndex = segNode.dataset['segment'] * 1;\n              extendDragOptions(task, newTaskMove);\n            }\n          }\n\n          setTaskMove(newTaskMove);\n        }\n        startDrag();\n      }\n    },\n    [api, readonly, getMoveMode, startDrag, splitTasks],\n  );\n\n  const mousedown = useCallback(\n    (e) => {\n      if (e.button !== 0) return;\n\n      const node = locate(e);\n      if (!node) return;\n\n      down(node, e);\n    },\n    [down],\n  );\n\n  const touchstart = useCallback(\n    (e) => {\n      const node = locate(e);\n      if (node) {\n        touchTimerRef.current = setTimeout(() => {\n          setTouched(true);\n          down(node, e.touches[0]);\n        }, 300);\n      }\n    },\n    [down],\n  );\n\n  const onSelectLink = useCallback((id) => {\n    setSelectedLinkId(id);\n  }, []);\n\n  const up = useCallback(() => {\n    if (progressFromRef.current) {\n      const { dx, id, marker, value } = progressFromRef.current;\n      progressFromRef.current = null;\n      if (typeof value !== 'undefined' && dx)\n        api.exec('update-task', {\n          id,\n          task: { progress: value },\n          inProgress: false,\n        });\n      marker.classList.remove('wx-progress-in-drag');\n\n      ignoreNextClickRef.current = true;\n      endDrag();\n    } else if (taskMove) {\n      const { id, mode, dx, l, w, start, segment, index } = taskMove;\n      setTaskMove(null);\n      if (start) {\n        const diff = Math.round(dx / lengthUnitWidth);\n\n        if (!diff) {\n          api.exec('drag-task', {\n            id,\n            width: w,\n            left: l,\n            inProgress: false,\n            ...(segment && { segmentIndex: index }),\n          });\n        } else {\n          let update = {};\n          let task = api.getTask(id);\n          if (segment) task = task.segments[index];\n\n          if (mode === 'move') {\n            update.start = task.start;\n            update.end = task.end;\n          } else update[mode] = task[mode];\n\n          api.exec('update-task', {\n            id,\n            diff,\n            task: update,\n            ...(segment && { segmentIndex: index }),\n          });\n        }\n        ignoreNextClickRef.current = true;\n      }\n\n      endDrag();\n    }\n  }, [api, endDrag, taskMove, lengthUnitWidth]);\n\n  const move = useCallback(\n    (e, point) => {\n      const { clientX } = point;\n\n      if (!readonly) {\n        if (progressFromRef.current) {\n          const { node, x, id } = progressFromRef.current;\n          const dx = (progressFromRef.current.dx = clientX - x);\n\n          const diff = Math.round((dx / node.offsetWidth) * 100);\n          let progress = progressFromRef.current.progress + diff;\n          progressFromRef.current.value = progress = Math.min(\n            Math.max(0, progress),\n            100,\n          );\n\n          api.exec('update-task', {\n            id,\n            task: { progress },\n            inProgress: true,\n          });\n        } else if (taskMove) {\n          onSelectLink(null);\n          const { mode, l, w, x, id, start, segment, index } = taskMove;\n          const task = api.getTask(id);\n          const dx = clientX - x;\n          const minWidth = Math.round(lengthUnitWidth) || 1;\n          if (\n            (!start && Math.abs(dx) < 20) ||\n            (mode === 'start' && w - dx < minWidth) ||\n            (mode === 'end' && w + dx < minWidth) ||\n            (mode === 'move' &&\n              ((dx < 0 && l + dx < 0) ||\n                (dx > 0 && l + w + dx > totalWidth))) ||\n            (taskMove.segment && !isSegmentMoveAllowed(task, taskMove))\n          )\n            return;\n\n          const nextTaskMove = { ...taskMove, dx };\n\n          let left, width;\n          if (mode === 'start') {\n            left = l + dx;\n            width = w - dx;\n          } else if (mode === 'end') {\n            left = l;\n            width = w + dx;\n          } else if (mode === 'move') {\n            left = l + dx;\n            width = w;\n          }\n\n          api.exec('drag-task', {\n            id,\n            width: width,\n            left: left,\n            inProgress: true,\n            start,\n            ...(segment && { segmentIndex: index }),\n          });\n\n          if (\n            !nextTaskMove.start &&\n            ((mode === 'move' && task.$x === l) ||\n              (mode !== 'move' && task.$w === w))\n          ) {\n            ignoreNextClickRef.current = true;\n            up();\n            return;\n          }\n          nextTaskMove.start = true;\n          setTaskMove(nextTaskMove);\n        } else {\n          const taskNode = locate(e);\n          if (taskNode) {\n            const task = api.getTask(getID(taskNode));\n            const segNode = locate(e, 'data-segment');\n            const barNode = segNode || taskNode;\n            const mode = getMoveMode(barNode, point, task);\n            barNode.style.cursor = mode && !readonly ? 'col-resize' : 'pointer';\n          }\n        }\n      }\n    },\n    [\n      api,\n      readonly,\n      taskMove,\n      lengthUnitWidth,\n      totalWidth,\n      getMoveMode,\n      onSelectLink,\n      up,\n    ],\n  );\n\n  const mousemove = useCallback(\n    (e) => {\n      move(e, e);\n    },\n    [move],\n  );\n\n  const touchmove = useCallback(\n    (e) => {\n      if (touched) {\n        e.preventDefault();\n        move(e, e.touches[0]);\n      } else if (touchTimerRef.current) {\n        clearTimeout(touchTimerRef.current);\n        touchTimerRef.current = null;\n      }\n    },\n    [touched, move],\n  );\n\n  const mouseup = useCallback(() => {\n    up();\n  }, [up]);\n\n  const touchend = useCallback(() => {\n    setTouched(null);\n    if (touchTimerRef.current) {\n      clearTimeout(touchTimerRef.current);\n      touchTimerRef.current = null;\n    }\n    up();\n  }, [up]);\n\n  useEffect(() => {\n    window.addEventListener('mouseup', mouseup);\n    return () => {\n      window.removeEventListener('mouseup', mouseup);\n    };\n  }, [mouseup]);\n\n  const onDblClick = useCallback(\n    (e) => {\n      if (!readonly) {\n        const id = locateID(e.target);\n        if (id && !e.target.classList.contains('wx-link')) {\n          const segmentIndex = locateID(e.target, 'data-segment');\n          api.exec('show-editor', {\n            id,\n            ...(segmentIndex !== null && { segmentIndex }),\n          });\n        }\n      }\n    },\n    [api, readonly],\n  );\n\n  const types = ['e2s', 's2s', 'e2e', 's2e'];\n  const getLinkType = useCallback((fromStart, toStart) => {\n    return types[(fromStart ? 1 : 0) + (toStart ? 0 : 2)];\n  }, []);\n\n  const alreadyLinked = useCallback(\n    (target, toStart) => {\n      const source = linkFrom.id;\n      const fromStart = linkFrom.start;\n\n      if (target === source) return true;\n\n      return !!rLinksValue.find((l) => {\n        return (\n          l.target === target &&\n          l.source === source &&\n          l.type === getLinkType(fromStart, toStart)\n        );\n      });\n    },\n    [linkFrom, rLinksCounter, getLinkType],\n  );\n\n  const removeLinkMarker = useCallback(() => {\n    if (linkFrom) {\n      setLinkFrom(null);\n    }\n  }, [linkFrom]);\n\n  const onClick = useCallback(\n    (e) => {\n      if (ignoreNextClickRef.current) {\n        ignoreNextClickRef.current = false;\n        return;\n      }\n\n      const id = locateID(e.target);\n      if (id) {\n        const css = e.target.classList;\n        if (css.contains('wx-link')) {\n          const toStart = css.contains('wx-left');\n          if (!linkFrom) {\n            setLinkFrom({ id, start: toStart });\n            return;\n          }\n\n          if (linkFrom.id !== id && !alreadyLinked(id, toStart)) {\n            api.exec('add-link', {\n              link: {\n                source: linkFrom.id,\n                target: id,\n                type: getLinkType(linkFrom.start, toStart),\n              },\n            });\n          }\n        } else if (css.contains('wx-delete-button-icon')) {\n          api.exec('delete-link', { id: selectedLinkId });\n          setSelectedLinkId(null);\n        } else {\n          const segmentIndex = locateID(e.target, 'data-segment');\n          api.exec('select-task', {\n            id,\n            toggle: e.ctrlKey || e.metaKey,\n            range: e.shiftKey,\n            ...(segmentIndex !== null && { segmentIndex }),\n          });\n        }\n      }\n      removeLinkMarker();\n    },\n    [\n      api,\n      linkFrom,\n      rLinksCounter,\n      selectedLink,\n      alreadyLinked,\n      getLinkType,\n      removeLinkMarker,\n    ],\n  );\n\n  const taskStyle = useCallback((task) => {\n    return {\n      left: `${task.$x}px`,\n      top: `${task.$y}px`,\n      width: `${task.$w}px`,\n      height: `${task.$h}px`,\n      lineHeight: `${task.$h}px`,\n    };\n  }, []);\n\n  const baselineStyle = useCallback((task) => {\n    return {\n      left: `${task.$x_base}px`,\n      top: `${task.$y_base}px`,\n      width: `${task.$w_base}px`,\n      height: `${task.$h_base}px`,\n    };\n  }, []);\n\n  const slackStyle = useCallback((task) => {\n    return {\n      left: `${task.$x_slack}px`,\n      top: `${task.$y}px`,\n      width: `${task.$w_slack}px`,\n      height: `${task.$h}px`,\n    };\n  }, []);\n\n  const contextmenu = useCallback(\n    (ev) => {\n      if (touched || touchTimerRef.current) {\n        ev.preventDefault();\n        return false;\n      }\n    },\n    [touched],\n  );\n\n  const taskTypeIds = useMemo(\n    () => taskTypesValue.map((t) => t.id),\n    [taskTypesValue],\n  );\n\n  const taskTypeCss = useCallback(\n    (type) => {\n      let css = taskTypeIds.includes(type) ? type : 'task';\n      if (!['task', 'milestone', 'summary'].includes(type)) {\n        css = `task ${css}`;\n      }\n      return css;\n    },\n    [taskTypeIds],\n  );\n\n  const forward = useCallback(\n    (ev) => {\n      api.exec(ev.action, ev.data);\n    },\n    [api],\n  );\n\n  const isTaskCritical = useCallback(\n    (task) => {\n      return criticalPath && task.critical;\n    },\n    [criticalPath],\n  );\n\n  const isLinkMarkerVisible = useCallback(\n    (id) => {\n      if (schedule?.auto) {\n        const summaryIds = tree.getSummaryId(id, true);\n        const linkFromSummaryIds = tree.getSummaryId(linkFrom.id, true);\n        return (\n          linkFrom?.id &&\n          !(Array.isArray(summaryIds) ? summaryIds : [summaryIds]).includes(\n            linkFrom.id,\n          ) &&\n          !(\n            Array.isArray(linkFromSummaryIds)\n              ? linkFromSummaryIds\n              : [linkFromSummaryIds]\n          ).includes(id)\n        );\n      }\n      return linkFrom;\n    },\n    [schedule, tree, linkFrom],\n  );\n\n  return (\n    <div\n      className=\"wx-GKbcLEGA wx-bars\"\n      ref={containerRef}\n      onContextMenu={contextmenu}\n      onMouseDown={mousedown}\n      onMouseMove={mousemove}\n      onTouchStart={touchstart}\n      onTouchMove={touchmove}\n      onTouchEnd={touchend}\n      onClick={onClick}\n      onDoubleClick={onDblClick}\n      onDragStart={(e) => {\n        e.preventDefault();\n        return false;\n      }}\n    >\n      {slack\n        ? tasks.map((task) =>\n            task.$visibleSlack ? (\n              <div\n                key={task.id}\n                className={`wx-GKbcLEGA wx-slack wx-slack-${task.type}`}\n                style={slackStyle(task)}\n              ></div>\n            ) : null,\n          )\n        : null}\n      <Links\n        onSelectLink={onSelectLink}\n        selectedLink={selectedLink}\n        readonly={readonly}\n      />\n      {tasks.map((task) => {\n        if (task.$skip && task.$skip_baseline && !(rollups && rRollups?.[task.id])) return null;\n        const barClass =\n          `wx-bar wx-${taskTypeCss(task.type)}` +\n          (touched && taskMove && task.id === taskMove.id ? ' wx-touch' : '') +\n          (linkFrom && linkFrom.id === task.id ? ' wx-selected' : '') +\n          (isTaskCritical(task) ? ' wx-critical' : '') +\n          (task.$reorder ? ' wx-reorder-task' : '') +\n          (splitTasks && task.segments ? ' wx-split' : '');\n        const leftLinkClass =\n          'wx-link wx-left' +\n          (linkFrom ? ' wx-visible' : '') +\n          (!linkFrom ||\n            (!alreadyLinked(task.id, true) && isLinkMarkerVisible(task.id))\n            ? ' wx-target'\n            : '') +\n          (linkFrom && linkFrom.id === task.id && linkFrom.start\n            ? ' wx-selected'\n            : '') +\n          (isTaskCritical(task) ? ' wx-critical' : '');\n        const rightLinkClass =\n          'wx-link wx-right' +\n          (linkFrom ? ' wx-visible' : '') +\n          (!linkFrom ||\n            (!alreadyLinked(task.id, false) && isLinkMarkerVisible(task.id))\n            ? ' wx-target'\n            : '') +\n          (linkFrom && linkFrom.id === task.id && !linkFrom.start\n            ? ' wx-selected'\n            : '') +\n          (isTaskCritical(task) ? ' wx-critical' : '');\n        return (\n          <Fragment key={task.id}>\n            {!task.$skip && (\n              <div\n                className={'wx-GKbcLEGA ' + barClass}\n                style={taskStyle(task)}\n                data-id={setID(task.id)}\n                data-tooltip-id={setID(task.id)}\n                tabIndex={focused === task.id ? 0 : -1}\n              >\n                {!readonly ? (\n                  task.id === selectedLink?.target &&\n                    selectedLink?.type[2] === 's' ? (\n                    <Button\n                      type=\"danger\"\n                      css=\"wx-left wx-delete-button wx-delete-link\"\n                    >\n                      <i className=\"wxi-close wx-delete-button-icon\"></i>\n                    </Button>\n                  ) : (\n                    <div className={'wx-GKbcLEGA ' + leftLinkClass}>\n                      <div className=\"wx-GKbcLEGA wx-inner\"></div>\n                    </div>\n                  )\n                ) : null}\n\n                {task.type !== 'milestone' ? (\n                  <>\n                    {task.progress && !(splitTasks && task.segments) ? (\n                      <div className=\"wx-GKbcLEGA wx-progress-wrapper\">\n                        <div\n                          className=\"wx-GKbcLEGA wx-progress-percent\"\n                          style={{ width: `${task.progress}%` }}\n                        ></div>\n                      </div>\n                    ) : null}\n                    {!readonly &&\n                      !(splitTasks && task.segments) &&\n                      !(task.type === 'summary' && summary?.autoProgress) ? (\n                      <div\n                        className=\"wx-GKbcLEGA wx-progress-marker\"\n                        style={{ left: `calc(${task.progress}% - 10px)` }}\n                      >\n                        {task.progress}\n                      </div>\n                    ) : null}\n                    {TaskTemplate ? (\n                      <TaskTemplate data={task} api={api} onAction={forward} />\n                    ) : splitTasks && task.segments ? (\n                      <BarSegments task={task} type={taskTypeCss(task.type)} />\n                    ) : (\n                      <div className=\"wx-GKbcLEGA wx-content\">\n                        {task.text || ''}\n                      </div>\n                    )}\n                  </>\n                ) : (\n                  <>\n                    <div className=\"wx-GKbcLEGA wx-content\"></div>\n                    {TaskTemplate ? (\n                      <TaskTemplate data={task} api={api} onAction={forward} />\n                    ) : (\n                      <div className=\"wx-GKbcLEGA wx-text-out\">{task.text}</div>\n                    )}\n                  </>\n                )}\n\n                {!readonly ? (\n                  task.id === selectedLink?.target &&\n                    selectedLink?.type[2] === 'e' ? (\n                    <Button\n                      type=\"danger\"\n                      css=\"wx-right wx-delete-button wx-delete-link\"\n                    >\n                      <i className=\"wxi-close wx-delete-button-icon\"></i>\n                    </Button>\n                  ) : (\n                    <div className={'wx-GKbcLEGA ' + rightLinkClass}>\n                      <div className=\"wx-GKbcLEGA wx-inner\"></div>\n                    </div>\n                  )\n                ) : null}\n              </div>\n            )}\n            {rollups && rRollups?.[task.id]\n              ? rRollups[task.id].map((rollup, i) => (\n                  <Rollups key={i} rollup={rollup} parent={task} />\n                ))\n              : null}\n            {baselinesValue && !task.$skip_baseline ? (\n              <div\n                className={\n                  'wx-GKbcLEGA wx-baseline' +\n                  (task.type === 'milestone' ? ' wx-milestone' : '')\n                }\n                style={baselineStyle(task)}\n              ></div>\n            ) : null}\n          </Fragment>\n        );\n      })}\n    </div>\n  );\n}\n\nexport default Bars;\n","import { useContext } from 'react';\nimport storeContext from '../../context';\nimport { useStore } from '@svar-ui/lib-react';\nimport './TimeScale.css';\n\nfunction TimeScale(props) {\n  const { highlightTime } = props;\n\n  const api = useContext(storeContext);\n  const scales = useStore(api, '_scales');\n\n  return (\n    <div className=\"wx-ZkvhDKir wx-scale\" style={{ width: scales.width }}>\n      {(scales?.rows || []).map((row, rowIdx) => (\n        <div\n          className=\"wx-ZkvhDKir wx-row\"\n          style={{ height: `${row.height}px` }}\n          key={rowIdx}\n        >\n          {(row.cells || []).map((cell, cellIdx) => {\n            const extraClass = highlightTime\n              ? highlightTime(cell.date, cell.unit)\n              : '';\n            const className =\n              'wx-cell ' + (cell.css || '') + ' ' + (extraClass || '');\n            return (\n              <div\n                className={'wx-ZkvhDKir ' + className}\n                style={{ width: `${cell.width}px` }}\n                key={cellIdx}\n              >\n                {cell.value}\n              </div>\n            );\n          })}\n        </div>\n      ))}\n    </div>\n  );\n}\n\nexport default TimeScale;\n","import { useRef, useEffect } from 'react';\n\nconst renderMetrics = new Map();\n\nexport function useRenderTime(label) {\n  const startTime = useRef(null);\n  const renderCount = useRef(0);\n  const rafRef = useRef(null);\n\n  const enabled =\n    typeof window !== 'undefined' && window.__RENDER_METRICS_ENABLED__;\n\n  if (startTime.current === null) {\n    startTime.current = performance.now();\n  }\n  renderCount.current++;\n\n  useEffect(() => {\n    if (!enabled) return;\n\n    cancelAnimationFrame(rafRef.current);\n\n    rafRef.current = requestAnimationFrame(() => {\n      const metric = {\n        label,\n        time: performance.now() - startTime.current,\n        renders: renderCount.current,\n        timestamp: Date.now(),\n      };\n\n      renderMetrics.set(label, metric);\n\n      window.dispatchEvent(\n        new CustomEvent('render-metric', { detail: metric }),\n      );\n    });\n\n    return () => cancelAnimationFrame(rafRef.current);\n  });\n}\n","import {\n  useState,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useContext,\n  useCallback,\n} from 'react';\nimport CellGrid from './CellGrid.jsx';\nimport Bars from './Bars.jsx';\nimport { hotkeys } from '@svar-ui/grid-store';\nimport { setID } from '@svar-ui/lib-dom';\nimport storeContext from '../../context';\nimport { useStore, useStoreWithCounter } from '@svar-ui/lib-react';\nimport './Chart.css';\nimport TimeScales from './TimeScale.jsx';\nimport { useRenderTime } from '../../helpers/debug.js';\n\nfunction Chart(props) {\n  const {\n    readonly,\n    fullWidth,\n    fullHeight,\n    taskTemplate,\n    cellBorders,\n    highlightTime,\n  } = props;\n\n  const api = useContext(storeContext);\n\n  const [selected, selectedCounter] = useStoreWithCounter(api, '_selected');\n  const rScrollTop = useStore(api, 'scrollTop');\n  const rScrollLeft = useStore(api, 'scrollLeft');\n  const cellHeight = useStore(api, 'cellHeight');\n  const scales = useStore(api, '_scales');\n  const markers = useStore(api, '_markers');\n  const zoom = useStore(api, 'zoom');\n\n  const [chartHeight, setChartHeight] = useState();\n  const chartRef = useRef(null);\n  const expectedScroll = useRef({ top: null, left: null });\n  const isUserScrollRef = useRef(false);\n\n  const extraRows = 1;\n  const selectStyle = useMemo(() => {\n    const t = [];\n    if (selected && selected.length && cellHeight) {\n      selected.forEach((obj) => {\n        t.push({ height: `${cellHeight}px`, top: `${obj.$y - 3}px` });\n      });\n    }\n    return t;\n  }, [selectedCounter, cellHeight]);\n\n  const chartGridHeight = useMemo(\n    () => Math.max(chartHeight || 0, fullHeight),\n    [chartHeight, fullHeight],\n  );\n\n  useLayoutEffect(() => {\n    const el = chartRef.current;\n    if (!el) return;\n\n    if (isUserScrollRef.current) {\n      isUserScrollRef.current = false;\n      return;\n    }\n\n    if (typeof rScrollTop === 'number') {\n      expectedScroll.current.top = rScrollTop;\n      el.scrollTop = rScrollTop;\n    }\n    if (typeof rScrollLeft === 'number') {\n      expectedScroll.current.left = rScrollLeft;\n      el.scrollLeft = rScrollLeft;\n    }\n  }, [rScrollTop, rScrollLeft]);\n\n  const onScroll = () => {\n    setScroll();\n    dataRequest();\n  };\n\n  function setScroll() {\n    const el = chartRef.current;\n    if (!el) return;\n    const ev = {};\n    //prevents infinite scroll\n    if (el.scrollTop !== expectedScroll.current.top) ev.top = el.scrollTop;\n    if (el.scrollLeft !== expectedScroll.current.left) ev.left = el.scrollLeft;\n    if (!Object.keys(ev).length) return;\n    // set expectedScroll so that rapid scroll events don't re-dispatch stale values\n    if (ev.top !== undefined) expectedScroll.current.top = ev.top;\n    if (ev.left !== undefined) expectedScroll.current.left = ev.left;\n    isUserScrollRef.current = true;\n    api.exec('scroll-chart', ev);\n  }\n\n  function dataRequest() {\n    const el = chartRef.current;\n    const clientHeightLocal = chartHeight || 0;\n    const num = Math.ceil(clientHeightLocal / (cellHeight || 1)) + 1;\n    const pos = Math.floor(((el && el.scrollTop) || 0) / (cellHeight || 1));\n    const start = Math.max(0, pos - extraRows);\n    const end = pos + num + extraRows;\n    const from = start * (cellHeight || 0);\n    api.exec('render-data', {\n      start,\n      end,\n      from,\n    });\n  }\n\n  useEffect(() => {\n    dataRequest();\n  }, [chartHeight]);\n\n  const lastWheelTimeRef = useRef(performance.now());\n  const pendingRef = useRef(false);\n  const MAX_ZOOM_RATE = 0.003;\n\n  function clamp(value, min, max) {\n    return Math.max(Math.min(value, max), min);\n  }\n\n  function getZoomFactor(evDelta) {\n    const isTouchpad = Math.abs(evDelta) < 50;\n    const SENSITIVITY = isTouchpad ? 0.004 : 0.01;\n    const now = performance.now();\n    const dt = Math.min(now - lastWheelTimeRef.current, 50);\n    lastWheelTimeRef.current = now;\n    const normalized = clamp(\n      -evDelta * SENSITIVITY,\n      -MAX_ZOOM_RATE * dt,\n      MAX_ZOOM_RATE * dt,\n    );\n    return Math.exp(normalized);\n  }\n\n  const onWheel = useCallback((e) => {\n    if (zoom && (e.ctrlKey || e.metaKey)) {\n      e.preventDefault();\n      const el = chartRef.current;\n      const ratio = getZoomFactor(e.deltaY);\n      const offset = e.clientX - (el ? el.getBoundingClientRect().left : 0);\n      if (!pendingRef.current) {\n        pendingRef.current = true;\n        requestAnimationFrame(() => {\n          api.exec('zoom-scale', {\n            dir: ratio > 1 ? 1 : -1,\n            ratio: Math.abs(1 - ratio),\n            offset,\n          });\n          pendingRef.current = false;\n        });\n      }\n    }\n  }, [zoom, api]);\n\n  function getHoliday(cell) {\n    const style = highlightTime(cell.date, cell.unit);\n    if (style)\n      return {\n        css: style,\n        width: cell.width,\n      };\n    return null;\n  }\n\n  const holidays = useMemo(() => {\n    return scales &&\n      (scales.minUnit === 'hour' || scales.minUnit === 'day') &&\n      highlightTime\n      ? scales.rows[scales.rows.length - 1].cells.map(getHoliday)\n      : null;\n  }, [scales, highlightTime]);\n\n  const handleHotkey = useCallback(\n    (ev) => {\n      ev.eventSource = 'chart';\n      api.exec('hotkey', ev);\n    },\n    [api],\n  );\n\n  useEffect(() => {\n    const el = chartRef.current;\n    if (!el) return;\n    const update = () => setChartHeight(el.clientHeight);\n    update();\n    const ro = new ResizeObserver(() => update());\n    ro.observe(el);\n    return () => {\n      ro.disconnect();\n    };\n  }, [chartRef.current]);\n\n  const cleanupRef = useRef(null);\n\n  useEffect(() => {\n    const el = chartRef.current;\n    if (!el) return;\n    if (cleanupRef.current) return;\n    cleanupRef.current = hotkeys(el, {\n      keys: {\n        arrowup: true,\n        arrowdown: true,\n      },\n      exec: (v) => handleHotkey(v),\n    });\n    return () => {\n      cleanupRef.current?.destroy();\n      cleanupRef.current = null;\n    };\n  }, []);\n\n  useEffect(() => {\n    const node = chartRef.current;\n    if (!node) return;\n\n    const handler = onWheel;\n    node.addEventListener('wheel', handler);\n    return () => {\n      node.removeEventListener('wheel', handler);\n    };\n  }, [onWheel]);\n\n  useRenderTime(\"chart\");\n  \n  return (\n    <div\n      className=\"wx-mR7v2Xag wx-chart\"\n      tabIndex={-1}\n      ref={chartRef}\n      onScroll={onScroll}\n    >\n      <TimeScales highlightTime={highlightTime} scales={scales} />\n      {markers && markers.length ? (\n        <div\n          className=\"wx-mR7v2Xag wx-markers\"\n          style={{ height: `${chartGridHeight}px` }}\n        >\n          {markers.map((marker, i) => (\n            <div\n              key={i}\n              className={`wx-mR7v2Xag wx-marker ${marker.css || ''}`}\n              style={{ left: `${marker.left}px` }}\n            >\n              <div className=\"wx-mR7v2Xag wx-content\">{marker.text}</div>\n            </div>\n          ))}\n        </div>\n      ) : null}\n\n      <div\n        className=\"wx-mR7v2Xag wx-area\"\n        style={{ width: `${fullWidth}px`, height: `${chartGridHeight}px` }}\n      >\n        {holidays ? (\n          <div\n            className=\"wx-mR7v2Xag wx-gantt-holidays\"\n            style={{ height: '100%' }}\n          >\n            {holidays.map((holiday, i) =>\n              holiday ? (\n                <div\n                  key={i}\n                  className={'wx-mR7v2Xag ' + holiday.css}\n                  style={{\n                    width: `${holiday.width}px`,\n                    left: `${i * holiday.width}px`,\n                  }}\n                />\n              ) : null,\n            )}\n          </div>\n        ) : null}\n\n        <CellGrid borders={cellBorders} />\n\n        {selected && selected.length\n          ? selected.map((obj, index) =>\n              obj.$y ? (\n                <div\n                  key={obj.id}\n                  className=\"wx-mR7v2Xag wx-selected\"\n                  data-id={setID(obj.id)}\n                  style={selectStyle[index]}\n                ></div>\n              ) : null,\n            )\n          : null}\n\n        <Bars readonly={readonly} taskTemplate={taskTemplate} />\n      </div>\n    </div>\n  );\n}\n\nexport default Chart;\n","import { useState, useMemo, useRef, useCallback, useEffect } from 'react';\nimport { useWritableProp } from '@svar-ui/lib-react';\nimport './Resizer.css';\n\nfunction Resizer(props) {\n  const {\n    position = 'after',\n    size = 4,\n    dir = 'x',\n    onMove,\n    onDisplayChange,\n    compactMode,\n    containerWidth = 0,\n    leftThreshold = 50,\n    rightThreshold = 50,\n  } = props;\n\n  const [value, setValue] = useWritableProp(props.value ?? 0);\n  const [display, setDisplay] = useWritableProp(props.display ?? 'all');\n\n  function getBox(val) {\n    let offset = 0;\n    if (position == 'center') offset = size / 2;\n    else if (position == 'before') offset = size;\n\n    const box = {\n      size: [size + 'px', 'auto'],\n      p: [val - offset + 'px', '0px'],\n      p2: ['auto', '0px'],\n    };\n\n    if (dir != 'x') {\n      for (let name in box) box[name] = box[name].reverse();\n    }\n    return box;\n  }\n\n  const [active, setActive] = useState(false);\n  const [initialPosition, setInitialPosition] = useState(null);\n\n  const startRef = useRef(0);\n  const posRef = useRef();\n  const displayRef = useRef(display);\n\n  useEffect(() => {\n    displayRef.current = display;\n  }, [display]);\n\n  useEffect(() => {\n    if (initialPosition === null && value > 0) {\n      setInitialPosition(value);\n    }\n  }, [initialPosition, value]);\n\n  function getEventPos(ev) {\n    return dir == 'x' ? ev.clientX : ev.clientY;\n  }\n\n  const move = useCallback(\n    (ev) => {\n      const newPos = posRef.current + getEventPos(ev) - startRef.current;\n\n      setValue(newPos);\n      let nextDisplay;\n\n      if (newPos <= leftThreshold) {\n        nextDisplay = 'chart';\n      } else if (containerWidth - newPos <= rightThreshold) {\n        nextDisplay = 'grid';\n      } else {\n        nextDisplay = 'all';\n      }\n\n      if (displayRef.current !== nextDisplay) {\n        setDisplay(nextDisplay);\n        displayRef.current = nextDisplay;\n      }\n\n      if (onMove) onMove(newPos);\n    },\n    [containerWidth, leftThreshold, rightThreshold, onMove],\n  );\n\n  const up = useCallback(() => {\n    document.body.style.cursor = '';\n    document.body.style.userSelect = '';\n    setActive(false);\n    window.removeEventListener('mousemove', move);\n    window.removeEventListener('mouseup', up);\n  }, [move]);\n\n  const cursor = useMemo(\n    () => (display !== 'all' ? 'auto' : dir == 'x' ? 'ew-resize' : 'ns-resize'),\n    [display, dir],\n  );\n\n  const down = useCallback(\n    (ev) => {\n      // Prevent dragging when in normal mode and only one view is visible\n      if (!compactMode && (display === 'grid' || display === 'chart')) {\n        return;\n      }\n\n      startRef.current = getEventPos(ev);\n\n      posRef.current = value;\n      setActive(true);\n\n      document.body.style.cursor = cursor;\n      document.body.style.userSelect = 'none';\n\n      window.addEventListener('mousemove', move);\n      window.addEventListener('mouseup', up);\n    },\n    [cursor, move, up, value, compactMode, display],\n  );\n\n  function resetToInitial() {\n    setDisplay('all');\n    if (initialPosition !== null) {\n      setValue(initialPosition);\n      if (onMove) onMove(initialPosition);\n    }\n  }\n\n  function handleExpand(direction) {\n    if (compactMode) {\n      const newDisplay = display === 'chart' ? 'grid' : 'chart';\n      setDisplay(newDisplay);\n      onDisplayChange(newDisplay);\n    } else {\n      if (display === 'grid' || display === 'chart') {\n        resetToInitial();\n        onDisplayChange('all');\n      } else {\n        const newDisplay = direction === 'left' ? 'chart' : 'grid';\n        setDisplay(newDisplay);\n        onDisplayChange(newDisplay);\n      }\n    }\n  }\n\n  function handleExpandLeft() {\n    handleExpand('left');\n  }\n\n  function handleExpandRight() {\n    handleExpand('right');\n  }\n\n  const b = useMemo(() => getBox(value), [value, position, size, dir]);\n\n  const rootClassName = [\n    'wx-resizer',\n    `wx-resizer-${dir}`,\n    `wx-resizer-display-${display}`,\n    active ? 'wx-resizer-active' : '',\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <div\n      className={'wx-pFykzMlT ' + rootClassName}\n      onMouseDown={down}\n      style={{ width: b.size[0], height: b.size[1], cursor }}\n    >\n      <div className=\"wx-pFykzMlT wx-button-expand-box\">\n        <div className=\"wx-pFykzMlT wx-button-expand-content wx-button-expand-left\">\n          <i\n            className=\"wx-pFykzMlT wxi-menu-left\"\n            onClick={handleExpandLeft}\n          ></i>\n        </div>\n        <div className=\"wx-pFykzMlT wx-button-expand-content wx-button-expand-right\">\n          <i\n            className=\"wx-pFykzMlT wxi-menu-right\"\n            onClick={handleExpandRight}\n          ></i>\n        </div>\n      </div>\n      <div className=\"wx-pFykzMlT wx-resizer-line\"></div>\n    </div>\n  );\n}\n\nexport default Resizer;\n","const COMPACT_WIDTH = 650;\n\nexport function modeObserver(callback) {\n  let observer;\n\n  function observe() {\n    observer = new ResizeObserver((entries) => {\n      for (let obj of entries) {\n        if (obj.target === document.body) {\n          let mode = obj.contentRect.width <= COMPACT_WIDTH;\n          callback(mode);\n        }\n      }\n    });\n\n    observer.observe(document.body);\n  }\n\n  function disconnect() {\n    if (observer) {\n      observer.disconnect();\n      observer = null;\n    }\n  }\n\n  return {\n    observe,\n    disconnect,\n  };\n}\n","import {\n  useState,\n  useEffect,\n  useMemo,\n  useRef,\n  useCallback,\n  useContext,\n} from 'react';\nimport { hotkeys } from '@svar-ui/grid-store';\nimport Grid from './grid/Grid.jsx';\nimport Chart from './chart/Chart.jsx';\nimport Resizer from './Resizer.jsx';\nimport { modeObserver } from '../helpers/modeResizeObserver';\nimport storeContext from '../context';\nimport { useStore } from '@svar-ui/lib-react';\nimport './Layout.css';\nimport { flushSync } from 'react-dom'\n\nfunction Layout(props) {\n  const {\n    taskTemplate,\n    readonly,\n    cellBorders,\n    highlightTime,\n    onTableAPIChange,\n  } = props;\n\n  const api = useContext(storeContext);\n\n  const rTasks = useStore(api, '_tasks');\n  const rScales = useStore(api, '_scales');\n  const rCellHeight = useStore(api, 'cellHeight');\n  const rColumns = useStore(api, 'columns');\n  const undo = useStore(api, 'undo');\n  const [compactMode, setCompactMode] = useState(false);\n  let [gridWidth, setGridWidth] = useState(0);\n  const [ganttWidth, setGanttWidth] = useState(0);\n  const [ganttHeight, setGanttHeight] = useState(0);\n  const [innerWidth, setInnerWidth] = useState(undefined);\n  const [display, setDisplay] = useState('all');\n\n  const lastDisplay = useRef(null);\n\n  const handleResize = useCallback(\n    (mode) => {\n      setCompactMode((prev) => {\n        if (mode !== prev) {\n          if (mode) {\n            lastDisplay.current = display;\n            if (display === 'all') setDisplay('grid');\n          } else if (!lastDisplay.current || lastDisplay.current === 'all') {\n            setDisplay('all');\n          }\n        }\n        return mode;\n      });\n    },\n    [display],\n  );\n\n  useEffect(() => {\n    const ro = modeObserver(handleResize);\n    ro.observe();\n    return () => {\n      ro.disconnect();\n    };\n  }, [handleResize]);\n\n  const gridColumnWidth = useMemo(() => {\n    let w;\n    if (rColumns.every((c) => c.width && !c.flexgrow)) {\n      w = rColumns.reduce((acc, c) => acc + parseInt(c.width), 0);\n    } else {\n      if (display === 'chart') {\n        w = parseInt(rColumns.find((c) => c.id === 'action')?.width) || 50;\n      } else {\n        w = 440;\n      }\n    }\n    gridWidth = w;\n    return w;\n  }, [rColumns, display]);\n\n  useEffect(() => {\n    setGridWidth(gridColumnWidth);\n  }, [gridColumnWidth]);\n\n  const scrollSize = useMemo(\n    () => (ganttWidth ?? 0) - (innerWidth ?? 0),\n    [ganttWidth, innerWidth],\n  );\n  const fullWidth = useMemo(() => rScales.width, [rScales]);\n  const fullHeight = useMemo(\n    () => rTasks.length * rCellHeight,\n    [rTasks, rCellHeight],\n  );\n  const scrollHeight = useMemo(\n    () => rScales.height + fullHeight + scrollSize,\n    [rScales, fullHeight, scrollSize],\n  );\n  const chartRef = useRef(null);\n\n  const latestLayout = useRef({\n    ganttWidth: 0,\n    gridWidth: 0,\n    ganttHeight: 0,\n    rScalesHeight: 0,\n    scrollSize: 0,\n  });\n\n  useEffect(() => {\n    latestLayout.current = {\n      ganttWidth: ganttWidth ?? 0,\n      gridWidth,\n      ganttHeight: ganttHeight ?? 0,\n      rScalesHeight: rScales.height,\n      scrollSize,\n    };\n  }, [ganttWidth, gridWidth, ganttHeight, rScales, scrollSize]);\n\n  const chartResizeHandler = useCallback(() => {\n    const { ganttWidth: gw, gridWidth: grw, ganttHeight: gh, rScalesHeight: sh, scrollSize: ss } = latestLayout.current;\n    api.exec('resize-chart', {\n      width: gw - grw,\n      height: gh - sh,\n      scrollSize: ss,\n    });\n  }, [api]);\n\n  useEffect(() => {\n    let ro;\n    if (chartRef.current) {\n      ro = new ResizeObserver(chartResizeHandler);\n      ro.observe(chartRef.current);\n    }\n    return () => {\n      if (ro) ro.disconnect();\n    };\n  }, [chartRef.current, chartResizeHandler]);\n\n  const ganttDivRef = useRef(null);\n  const pseudoRowsRef = useRef(null);\n\n  const onScroll = useCallback(() => {\n    const el = ganttDivRef.current;\n    if (el) {\n      api.exec('scroll-chart', {\n        top: el.scrollTop,\n      });\n    }\n  }, [api]);\n\n  useEffect(() => {\n    const ganttDiv = ganttDivRef.current;\n    const pseudoRows = pseudoRowsRef.current;\n    if (!ganttDiv || !pseudoRows) return;\n    const update = () => {\n      flushSync(() => {\n        setGanttHeight(ganttDiv.offsetHeight);\n        setGanttWidth(ganttDiv.offsetWidth);\n        setInnerWidth(pseudoRows.offsetWidth);\n      });\n    };\n    const ro = new ResizeObserver(update);\n    ro.observe(ganttDiv);\n    return () => ro.disconnect();\n  }, [ganttDivRef.current]);\n\n  const layoutRef = useRef(null);\n  const cleanupRef = useRef(null);\n\n  useEffect(() => {\n    if (cleanupRef.current) {\n      cleanupRef.current.destroy();\n      cleanupRef.current = null;\n    }\n    const node = layoutRef.current;\n    if (!node) return;\n\n    cleanupRef.current = hotkeys(node, {\n      keys: {\n        'ctrl+c': true,\n        'ctrl+v': true,\n        'ctrl+x': true,\n        'ctrl+d': true,\n        backspace: true,\n        'ctrl+z': undo,\n        'ctrl+y': undo,\n      },\n      exec: (ev) => {\n        if (!ev.isInput) api.exec('hotkey', ev);\n      },\n    });\n\n    return () => {\n      cleanupRef.current?.destroy();\n      cleanupRef.current = null;\n    };\n  }, [undo]);\n\n  return (\n    <div className=\"wx-jlbQoHOz wx-gantt\" ref={ganttDivRef} onScroll={onScroll}>\n      <div\n        className=\"wx-jlbQoHOz wx-pseudo-rows\"\n        style={{ height: scrollHeight, width: '100%' }}\n        ref={pseudoRowsRef}\n      >\n        <div\n          className=\"wx-jlbQoHOz wx-stuck\"\n          style={{\n            height: ganttHeight,\n            width: innerWidth,\n          }}\n        >\n          <div tabIndex={0} className=\"wx-jlbQoHOz wx-layout\" ref={layoutRef}>\n            {rColumns.length ? (\n              <>\n                <Grid\n                  display={display}\n                  compactMode={compactMode}\n                  columnWidth={gridColumnWidth}\n                  width={gridWidth}\n                  readonly={readonly}\n                  fullHeight={fullHeight}\n                  onTableAPIChange={onTableAPIChange}\n                />\n                <Resizer\n                  value={gridWidth}\n                  display={display}\n                  compactMode={compactMode}\n                  containerWidth={ganttWidth}\n                  onMove={(value) => setGridWidth(value)}\n                  onDisplayChange={(display) => setDisplay(display)}\n                />\n              </>\n            ) : null}\n\n            <div className=\"wx-jlbQoHOz wx-content\" ref={chartRef}>\n              <Chart\n                readonly={readonly}\n                fullWidth={fullWidth}\n                fullHeight={fullHeight}\n                taskTemplate={taskTemplate}\n                cellBorders={cellBorders}\n                highlightTime={highlightTime}\n              />\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Layout;\n","import { dateToString } from '@svar-ui/lib-dom';\n\nexport function getUnitFormats(_) {\n  return {\n    year: '%Y',\n    quarter: `${_('Q')} %Q`,\n    month: '%M',\n    week: `${_('Week')} %w`,\n    day: '%M %j',\n    hour: '%H:%i',\n  };\n}\n\nfunction normalizeFormatter(value, calendarLocale) {\n  return typeof value === 'function'\n    ? value\n    : dateToString(value, calendarLocale);\n}\n\nexport function prepareScales(scales, calendarLocale) {\n  return scales.map(({ format, ...scale }) => ({\n    ...scale,\n    format: normalizeFormatter(format, calendarLocale),\n  }));\n}\n\nexport function prepareFormats(calendarLocale, _) {\n  const formats = getUnitFormats(_);\n  for (let unit in formats) {\n    formats[unit] = dateToString(formats[unit], calendarLocale);\n  }\n  return formats;\n}\n\nexport function prepareColumns(columns, calendarLocale) {\n  if (!columns || !columns.length) return columns;\n  const format = dateToString('%d-%m-%Y', calendarLocale);\n\n  return columns.map((col) => {\n    if (col.template) return col;\n\n    if (col.id === 'start' || col.id === 'end') {\n      return {\n        ...col,\n        //store locale template for unscheduled tasks\n        _template: (b) => format(b),\n        template: (b) => format(b),\n      };\n    }\n    if (col.id === 'duration') {\n      return {\n        ...col,\n        _template: (b) => b,\n        template: (b) => b,\n      };\n    }\n    return col;\n  });\n}\n\nexport function prepareZoom(zoom, calendarLocale) {\n  if (!zoom.levels) {\n    return zoom;\n  }\n\n  return {\n    ...zoom,\n    levels: zoom.levels.map((level) => ({\n      ...level,\n      scales: prepareScales(level.scales, calendarLocale),\n    })),\n  };\n}\n","import {\n  forwardRef,\n  useEffect,\n  useMemo,\n  useRef,\n  useImperativeHandle,\n  useState,\n  useContext,\n} from 'react';\n\n// core widgets lib\nimport { context } from '@svar-ui/react-core';\n\n// locales\nimport { locale as l } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\n\n// stores\nimport { EventBusRouter } from '@svar-ui/lib-state';\nimport {\n  DataStore,\n  defaultColumns,\n  defaultTaskTypes,\n  parseTaskDates,\n  normalizeZoom,\n  normalizeLinks,\n} from '@svar-ui/gantt-store';\n\n// context\nimport StoreContext from '../context';\n\n// store factory\nimport { writable } from '@svar-ui/lib-react';\n\n// ui\nimport Layout from './Layout.jsx';\n\n// helpers\nimport {\n  prepareScales,\n  prepareFormats,\n  prepareColumns,\n  prepareZoom,\n} from '../helpers/prepareConfig.js';\n\nconst camelize = (s) =>\n  s\n    .split('-')\n    .map((part) => (part ? part.charAt(0).toUpperCase() + part.slice(1) : ''))\n    .join('');\n\nconst defaultScales = [\n  { unit: 'month', step: 1, format: '%F %Y' },\n  { unit: 'day', step: 1, format: '%j' },\n];\n\nconst Gantt = forwardRef(function Gantt(\n  {\n    taskTemplate = null,\n    markers = [],\n    taskTypes = defaultTaskTypes,\n    tasks = [],\n    selected = [],\n    activeTask = null,\n    links = [],\n    scales = defaultScales,\n    columns = defaultColumns,\n    start = null,\n    end = null,\n    lengthUnit = 'day',\n    durationUnit = 'day',\n    cellWidth = 100,\n    cellHeight = 38,\n    scaleHeight = 36,\n    readonly = false,\n    cellBorders = 'full',\n    zoom = false,\n    baselines = false,\n    rollups = false,\n    highlightTime: highlightTimeProp = null,\n    init = null,\n    autoScale = true,\n    unscheduledTasks = false,\n    criticalPath = null,\n    schedule = { type: 'forward' },\n    projectStart = null,\n    projectEnd = null,\n    calendar = null,\n    undo = false,\n    splitTasks = false,\n    summary = null,\n    slack = false,\n    _export = false,\n    ...restProps\n  },\n  ref,\n) {\n  // keep latest rest props for event routing\n  const restPropsRef = useRef();\n  restPropsRef.current = restProps;\n\n  // init stores\n  const dataStore = useMemo(() => new DataStore(writable), []);\n\n  // locale and formats\n  // uses same logic as the Locale component\n  const words = useMemo(() => ({ ...coreEn, ...en }), []);\n  const i18nCtx = useContext(context.i18n);\n  const locale = useMemo(() => {\n    if (!i18nCtx) return l(words);\n    return i18nCtx.extend(words, true);\n  }, [i18nCtx, words]);\n\n  // prepare configuration objects\n  const lCalendar = useMemo(() => locale.getRaw().calendar, [locale]);\n\n  const normalizedConfig = useMemo(() => {\n    let config = {\n      zoom: prepareZoom(zoom, lCalendar),\n      scales: prepareScales(scales, lCalendar),\n      columns: prepareColumns(columns, lCalendar),\n      links: normalizeLinks(links),\n      cellWidth,\n    };\n    if (config.zoom) {\n      config = {\n        ...config,\n        ...normalizeZoom(\n          config.zoom,\n          prepareFormats(lCalendar, locale.getGroup('gantt')),\n          config.scales,\n          cellWidth,\n        ),\n      };\n    }\n    return config;\n  }, [zoom, scales, columns, links, cellWidth, lCalendar, locale]);\n\n  // parse task dates effect\n  const parsedTasksRef = useRef(null);\n  if (parsedTasksRef.current !== tasks) {\n    if (!_export) {\n      parseTaskDates(tasks, { durationUnit, splitTasks, calendar });\n    }\n    parsedTasksRef.current = tasks;\n  }\n  useEffect(() => {\n    if (!_export) {\n      parseTaskDates(tasks, { durationUnit, splitTasks, calendar });\n    }\n  }, [tasks, durationUnit, calendar, splitTasks, _export]);\n\n  const firstInRoute = useMemo(() => dataStore.in, [dataStore]);\n\n  const lastInRouteRef = useRef(null);\n  if (lastInRouteRef.current === null) {\n    lastInRouteRef.current = new EventBusRouter((a, b) => {\n      const name = 'on' + camelize(a);\n      if (restPropsRef.current && restPropsRef.current[name]) {\n        restPropsRef.current[name](b);\n      }\n    });\n    firstInRoute.setNext(lastInRouteRef.current);\n  }\n\n  // writable prop for two-way binding tableAPI\n  const [tableAPI, setTableAPI] = useState(null);\n  const tableAPIRef = useRef(null);\n  tableAPIRef.current = tableAPI;\n\n  // public API\n  const api = useMemo(\n    () => ({\n      getState: dataStore.getState.bind(dataStore),\n      getReactiveState: dataStore.getReactive.bind(dataStore),\n      getStores: () => ({ data: dataStore }),\n      exec: firstInRoute.exec,\n      setNext: (ev) => {\n        lastInRouteRef.current = lastInRouteRef.current.setNext(ev);\n        return lastInRouteRef.current;\n      },\n      intercept: firstInRoute.intercept.bind(firstInRoute),\n      on: firstInRoute.on.bind(firstInRoute),\n      detach: firstInRoute.detach.bind(firstInRoute),\n      getTask: dataStore.getTask.bind(dataStore),\n      serialize: () => dataStore.serialize(),\n      getTable: (waitRender) =>\n        waitRender\n          ? new Promise((res) => setTimeout(() => res(tableAPIRef.current), 1))\n          : tableAPIRef.current,\n      getHistory: () => dataStore.getHistory(),\n    }),\n    [dataStore, firstInRoute],\n  );\n\n  // expose API via ref\n  useImperativeHandle(\n    ref,\n    () => ({\n      ...api,\n    }),\n    [api],\n  );\n\n  const initOnceRef = useRef(0);\n  useEffect(() => {\n    if (!initOnceRef.current) {\n      if (init) init(api);\n    } else {\n      // const prev = dataStore.getState();\n      dataStore.init({\n        tasks,\n        links: normalizedConfig.links,\n        start,\n        columns: normalizedConfig.columns,\n        end,\n        lengthUnit,\n        cellWidth: normalizedConfig.cellWidth,\n        cellHeight,\n        scaleHeight,\n        scales: normalizedConfig.scales,\n        taskTypes,\n        zoom: normalizedConfig.zoom,\n        selected,\n        activeTask,\n        baselines,\n        rollups: rollups === true ? { type: 'closest' } : rollups,\n        autoScale,\n        unscheduledTasks,\n        markers,\n        durationUnit,\n        criticalPath,\n        schedule,\n        projectStart,\n        projectEnd,\n        calendar,\n        slack,\n        undo,\n        _weekStart: lCalendar.weekStart,\n        splitTasks,\n        summary,\n      });\n    }\n    initOnceRef.current++;\n  }, [\n    api,\n    init,\n    tasks,\n    normalizedConfig,\n    start,\n    end,\n    lengthUnit,\n    cellHeight,\n    scaleHeight,\n    taskTypes,\n    selected,\n    activeTask,\n    baselines,\n    rollups,\n    autoScale,\n    unscheduledTasks,\n    markers,\n    durationUnit,\n    criticalPath,\n    schedule,\n    projectStart,\n    projectEnd,\n    calendar,\n    slack,\n    undo,\n    lCalendar,\n    splitTasks,\n    summary,\n    dataStore,\n  ]);\n\n  if (initOnceRef.current === 0) {\n    dataStore.init({\n      tasks,\n      links: normalizedConfig.links,\n      start,\n      columns: normalizedConfig.columns,\n      end,\n      lengthUnit,\n      cellWidth: normalizedConfig.cellWidth,\n      cellHeight,\n      scaleHeight,\n      scales: normalizedConfig.scales,\n      taskTypes,\n      zoom: normalizedConfig.zoom,\n      selected,\n      activeTask,\n      baselines,\n      rollups: rollups === true ? { type: 'closest' } : rollups,\n      autoScale,\n      unscheduledTasks,\n      markers,\n      durationUnit,\n      criticalPath,\n      schedule,\n      projectStart,\n      projectEnd,\n      calendar,\n      slack,\n      undo,\n      _weekStart: lCalendar.weekStart,\n      splitTasks,\n      summary,\n    });\n  }\n\n  // highlightTime from calendar\n  const highlightTime = useMemo(() => {\n    if (calendar) {\n      return (day, unit) => {\n        if (unit === 'day' && !calendar.getDayHours(day)) return 'wx-weekend';\n        if (unit === 'hour' && !calendar.getDayHours(day)) return 'wx-weekend';\n        return '';\n      };\n    }\n    return highlightTimeProp;\n  }, [calendar, highlightTimeProp]);\n\n  return (\n    <context.i18n.Provider value={locale}>\n      <StoreContext.Provider value={api}>\n        <Layout\n          taskTemplate={taskTemplate}\n          readonly={readonly}\n          cellBorders={cellBorders}\n          highlightTime={highlightTime}\n          onTableAPIChange={setTableAPI}\n        />\n      </StoreContext.Provider>\n    </context.i18n.Provider>\n  );\n});\n\nexport default Gantt;\n","import { useContext, useMemo } from 'react';\nimport { Toolbar as WxToolbar } from '@svar-ui/react-toolbar';\nimport { useStoreLater } from '@svar-ui/lib-react';\nimport {\n  handleAction,\n  getToolbarButtons,\n  isHandledAction,\n} from '@svar-ui/gantt-store';\nimport { locale } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { context } from '@svar-ui/react-core';\n\nexport default function Toolbar({ api = null, items = [] }) {\n  const i18nCtx = useContext(context.i18n);\n  const i18nLocal = useMemo(() => (i18nCtx ? i18nCtx : locale(en)), [i18nCtx]);\n  const _ = useMemo(() => i18nLocal.getGroup('gantt'), [i18nLocal]);\n\n  const _selected = useStoreLater(api, '_selected');\n  const undo = useStoreLater(api, 'undo');\n  const history = useStoreLater(api, 'history');\n  const splitTasks = useStoreLater(api, 'splitTasks');\n\n  const historyActions = ['undo', 'redo'];\n\n  const finalItems = useMemo(() => {\n    const fullButtons = getToolbarButtons({ undo: true, splitTasks: true });\n    const buttons = items.length\n      ? items\n      : getToolbarButtons({\n          undo,\n          splitTasks,\n        });\n    return buttons.map((b) => {\n      let item = { ...b, disabled: false };\n      item.handler = isHandledAction(fullButtons, item.id)\n        ? (it) => handleAction(api, it.id, null, _)\n        : item.handler;\n      if (item.text) item.text = _(item.text);\n      if (item.menuText) item.menuText = _(item.menuText);\n      return item;\n    });\n  }, [items, api, _, undo, splitTasks]);\n\n  const buttons = useMemo(() => {\n    const finalButtons = [];\n    finalItems.forEach((item) => {\n      const action = item.id;\n      if (action === 'add-task') {\n        finalButtons.push(item);\n      } else if (!historyActions.includes(action)) {\n        if (!_selected?.length || !api) return;\n        finalButtons.push({\n          ...item,\n          disabled:\n            item.isDisabled &&\n            _selected.some((task) => item.isDisabled(task, api.getState())),\n        });\n      } else if (historyActions.includes(action)) {\n        finalButtons.push({\n          ...item,\n          disabled: item.isDisabled(history),\n        });\n      }\n    });\n    // filter out consecutive separators\n    return finalButtons.filter((button, index) => {\n      if (api && button.isHidden)\n        return !_selected.some((task) => button.isHidden(task, api.getState()));\n      if (button.comp === 'separator') {\n        const nextButton = finalButtons[index + 1];\n        if (!nextButton || nextButton.comp === 'separator') return false;\n      }\n      return true;\n    });\n  }, [api, _selected, history, finalItems]);\n\n  if (!i18nCtx) {\n    return (\n      <context.i18n.Provider value={i18nLocal}>\n        <WxToolbar items={buttons} />\n      </context.i18n.Provider>\n    );\n  }\n\n  return <WxToolbar items={buttons} />;\n}\n","import {\n  useEffect,\n  useMemo,\n  useRef,\n  useCallback,\n  useContext,\n  forwardRef,\n  useImperativeHandle,\n} from 'react';\nimport { ContextMenu as WxContextMenu } from '@svar-ui/react-menu';\nimport { handleAction, getMenuOptions, isHandledAction } from '@svar-ui/gantt-store';\nimport { locale, locateID } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\nimport { context } from '@svar-ui/react-core';\nimport { useStoreLater } from '@svar-ui/lib-react';\nimport './ContextMenu.css';\n\nconst ContextMenu = forwardRef(function ContextMenu(\n  {\n    options: optionsInit = [],\n    api = null,\n    resolver = null,\n    filter = null,\n    at = 'point',\n    children,\n    onClick,\n    css,\n  },\n  ref,\n) {\n  const menuRef = useRef(null);\n  const activeIdRef = useRef(null);\n\n  // i18n context\n  const i18nCtx = useContext(context.i18n);\n  const l = useMemo(() => i18nCtx || locale({ ...en, ...coreEn }), [i18nCtx]);\n  const _ = useMemo(() => l.getGroup('gantt'), [l]);\n\n  const taskTypesVal = useStoreLater(api, 'taskTypes');\n  const selectedVal = useStoreLater(api, 'selected');\n  const selectedTasksVal = useStoreLater(api, '_selected');\n  const splitTasksVal = useStoreLater(api, 'splitTasks');\n  const summaryVal = useStoreLater(api, 'summary');\n\n  const config = useMemo(\n    () => ({\n      splitTasks: splitTasksVal,\n      taskTypes: taskTypesVal,\n      summary: summaryVal,\n    }),\n    [splitTasksVal, taskTypesVal, summaryVal],\n  );\n\n  const fullOptions = useMemo(() => getMenuOptions(config), [config]);\n\n  useEffect(() => {\n    if (!api) return;\n\n    api.on('scroll-chart', () => {\n      if (menuRef.current && menuRef.current.show) menuRef.current.show();\n    });\n    api.on('drag-task', () => {\n      if (menuRef.current && menuRef.current.show) menuRef.current.show();\n    });\n  }, [api]);\n\n  function applyLocaleFn(opts) {\n    return opts.map((op) => {\n      op = { ...op };\n      if (op.text) op.text = _(op.text);\n      if (op.subtext) op.subtext = _(op.subtext);\n      if (op.data) op.data = applyLocaleFn(op.data);\n      return op;\n    });\n  }\n\n  function getOptions() {\n    const finalOptions = optionsInit.length\n      ? optionsInit\n      : getMenuOptions(config);\n\n    return applyLocaleFn(finalOptions);\n  }\n\n  const cOptions = useMemo(() => {\n    return getOptions();\n  }, [api, optionsInit, config, _]);\n\n  const selectedTasks = useMemo(\n    () => (selectedTasksVal && selectedTasksVal.length ? selectedTasksVal : []),\n    [selectedTasksVal],\n  );\n\n  const itemResolver = useCallback(\n    (id, ev) => {\n      let task = id ? api?.getTask(id) : null;\n      if (resolver) {\n        const result = resolver(id, ev);\n        task = result === true ? task : result;\n      }\n      if (task) {\n        const segmentIndex = locateID(ev.target, 'data-segment');\n        if (segmentIndex !== null)\n          activeIdRef.current = { id: task.id, segmentIndex };\n        else activeIdRef.current = task.id;\n\n        if (!Array.isArray(selectedVal) || !selectedVal.includes(task.id)) {\n          api && api.exec && api.exec('select-task', { id: task.id });\n        }\n      }\n      return task;\n    },\n    [api, resolver, selectedVal],\n  );\n\n  const menuAction = useCallback(\n    (ev) => {\n      const action = ev.action;\n      if (action) {\n        const isAction = isHandledAction(fullOptions, action.id);\n        if (isAction) handleAction(api, action.id, activeIdRef.current, _);\n        onClick && onClick(ev);\n      }\n    },\n    [api, _, onClick, fullOptions],\n  );\n\n  const filterMenu = useCallback(\n    (item, task) => {\n      // for single selection from resolver _selected are empty\n      // due to setAsyncState causing _selected to lag\n      const tasks = selectedTasks.length ? selectedTasks : task ? [task] : [];\n\n      let result = filter ? tasks.every((t) => filter(item, t)) : true;\n\n      if (result) {\n        if (item.isHidden)\n          result = !tasks.some((t) =>\n            item.isHidden(t, api.getState(), activeIdRef.current),\n          );\n        if (item.isDisabled) {\n          const disabled = tasks.some((t) =>\n            item.isDisabled(t, api.getState(), activeIdRef.current),\n          );\n          item.disabled = disabled;\n        }\n      }\n      return result;\n    },\n    [filter, selectedTasks, api],\n  );\n\n  useImperativeHandle(ref, () => ({\n    show: (ev, obj) => {\n      if (menuRef.current && menuRef.current.show) {\n        menuRef.current.show(ev, obj);\n      }\n    },\n  }));\n\n  const onContextMenu = useCallback((e) => {\n    if (menuRef.current && menuRef.current.show) {\n      menuRef.current.show(e);\n    }\n  }, []);\n\n  const content = (\n    <>\n      <WxContextMenu\n        filter={filterMenu}\n        options={cOptions}\n        dataKey={'id'}\n        resolver={itemResolver}\n        onClick={menuAction}\n        at={at}\n        ref={menuRef}\n        css={css}\n      />\n      <span onContextMenu={onContextMenu} data-menu-ignore=\"true\">\n        {typeof children === 'function' ? children() : children}\n      </span>\n    </>\n  );\n\n  if (!i18nCtx && context.i18n?.Provider) {\n    const Provider = context.i18n.Provider;\n    return <Provider value={l}>{content}</Provider>;\n  }\n\n  return content;\n});\n\nexport default ContextMenu;\n","import { useState, useEffect, useMemo, useContext } from 'react';\nimport { Field, Combo, Text } from '@svar-ui/react-core';\nimport { context } from '@svar-ui/react-core';\nimport { useStore } from '@svar-ui/lib-react';\nimport './Links.css';\n\nexport default function Links({ api, autoSave, onLinksChange }) {\n  const i18n = useContext(context.i18n);\n  const _ = i18n.getGroup('gantt');\n\n  const activeTask = useStore(api, 'activeTask');\n  const _activeTask = useStore(api, '_activeTask');\n  const links = useStore(api, '_links');\n  const schedule = useStore(api, 'schedule');\n  const unscheduledTasks = useStore(api, 'unscheduledTasks');\n\n  const [linksData, setLinksData] = useState();\n\n  function getLinksData() {\n    if (activeTask) {\n      const inLinks = links\n        .filter((a) => a.target == activeTask)\n        .map((link) => ({ link, task: api.getTask(link.source) }));\n\n      const outLinks = links\n        .filter((a) => a.source == activeTask)\n        .map((link) => ({ link, task: api.getTask(link.target) }));\n\n      return [\n        { title: _('Predecessors'), data: inLinks },\n        { title: _('Successors'), data: outLinks },\n      ];\n    }\n  }\n\n  useEffect(() => {\n    setLinksData(getLinksData());\n  }, [activeTask, links]);\n\n  const list = useMemo(\n    () => [\n      { id: 'e2s', label: _('End-to-start') },\n      { id: 's2s', label: _('Start-to-start') },\n      { id: 'e2e', label: _('End-to-end') },\n      { id: 's2e', label: _('Start-to-end') },\n    ],\n    [_],\n  );\n\n  function deleteLink(id) {\n    if (autoSave) {\n      api.exec('delete-link', { id });\n    } else {\n      setLinksData((prev) =>\n        (prev || []).map((group) => ({\n          ...group,\n          data: group.data.filter((item) => item.link.id !== id),\n        })),\n      );\n      onLinksChange &&\n        onLinksChange({\n          id,\n          action: 'delete-link',\n          data: { id },\n        });\n    }\n  }\n\n  function handleChange(id, update) {\n    if (autoSave) {\n      api.exec('update-link', {\n        id,\n        link: update,\n      });\n    } else {\n      setLinksData((prev) =>\n        (prev || []).map((group) => ({\n          ...group,\n          data: group.data.map((item) =>\n            item.link.id === id\n              ? { ...item, link: { ...item.link, ...update } }\n              : item,\n          ),\n        })),\n      );\n      onLinksChange &&\n        onLinksChange({\n          id,\n          action: 'update-link',\n          data: {\n            id,\n            link: update,\n          },\n        });\n    }\n  }\n\n  return (\n    <>\n      {(linksData || []).map((group, idx) =>\n        group.data.length ? (\n          <div className=\"wx-j93aYGQf wx-links\" key={idx}>\n            <context.fieldId.Provider value={null}>\n              <Field label={group.title} position=\"top\">\n                <table>\n                  <tbody>\n                    {group.data.map((obj) => (\n                      <tr key={obj.link.id}>\n                        <td className=\"wx-j93aYGQf wx-cell\">\n                          <div className=\"wx-j93aYGQf wx-task-name\">\n                            {obj.task.text || ''}\n                          </div>\n                        </td>\n                        {schedule?.auto && obj.link.type === 'e2s' ? (\n                          <td className=\"wx-j93aYGQf wx-cell wx-link-lag\">\n                            <Text\n                              type=\"number\"\n                              placeholder={_('Lag')}\n                              value={obj.link.lag}\n                              disabled={\n                                unscheduledTasks && _activeTask?.unscheduled\n                              }\n                              onChange={(ev) => {\n                                if (!ev.input)\n                                  handleChange(obj.link.id, { lag: ev.value });\n                              }}\n                            />\n                          </td>\n                        ) : null}\n                        <td className=\"wx-j93aYGQf wx-cell\">\n                          <div className=\"wx-j93aYGQf wx-wrapper\">\n                            <Combo\n                              value={obj.link.type}\n                              placeholder={_('Select link type')}\n                              options={list}\n                              onChange={(ev) =>\n                                handleChange(obj.link.id, { type: ev.value })\n                              }\n                            >\n                              {({ option }) => option.label}\n                            </Combo>\n                          </div>\n                        </td>\n\n                        <td className=\"wx-j93aYGQf wx-cell\">\n                          <i\n                            className=\"wx-j93aYGQf wxi-delete wx-delete-icon\"\n                            onClick={() => deleteLink(obj.link.id)}\n                            role=\"button\"\n                          ></i>\n                        </td>\n                      </tr>\n                    ))}\n                  </tbody>\n                </table>\n              </Field>\n            </context.fieldId.Provider>\n          </div>\n        ) : null,\n      )}\n    </>\n  );\n}\n","import { DatePicker, TimePicker } from '@svar-ui/react-core';\nimport './DateTimePicker.css';\n\nexport default function DateTimePicker(props) {\n  const { value, time, format, onchange, onChange, ...restProps } = props;\n  const onChangeHandler = onChange ?? onchange;\n\n  function handleDateChange(ev) {\n    const current = new Date(ev.value);\n    current.setHours(value.getHours());\n    current.setMinutes(value.getMinutes());\n\n    onChangeHandler && onChangeHandler({ value: current });\n  }\n\n  return (\n    <div className=\"wx-hFsbgDln date-time-controll\">\n      <DatePicker\n        {...restProps}\n        value={value}\n        onChange={handleDateChange}\n        format={format}\n        buttons={['today']}\n        clear={false}\n      />\n      {time ? (\n        <TimePicker value={value} onChange={onChangeHandler} format={format} />\n      ) : null}\n    </div>\n  );\n}\n","import { useState, useEffect, useMemo, useCallback, useContext } from 'react';\nimport { Editor as WxEditor, registerEditorItem } from '@svar-ui/react-editor';\nimport { Locale, RichSelect, Slider, Counter, TwoState, Checkbox } from '@svar-ui/react-core';\nimport { getEditorItems, prepareEditTask } from '@svar-ui/gantt-store';\nimport { dateToString, locale } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\nimport { context } from '@svar-ui/react-core';\n\nimport Links from './editor/Links.jsx';\nimport DateTimePicker from './editor/DateTimePicker.jsx';\nimport { useStore } from '@svar-ui/lib-react';\n\n// helpers\nimport { modeObserver } from '../helpers/modeResizeObserver';\n\nimport './Editor.css';\n\nregisterEditorItem('select', RichSelect);\nregisterEditorItem('date', DateTimePicker);\nregisterEditorItem('twostate', TwoState);\nregisterEditorItem('slider', Slider);\nregisterEditorItem('counter', Counter);\nregisterEditorItem('links', Links);\nregisterEditorItem('checkbox', Checkbox);\n\nfunction Editor({\n  api,\n  items = [],\n  css = '',\n  layout = 'default',\n  readonly = false,\n  placement = 'sidebar',\n  bottomBar = true,\n  topBar = true,\n  autoSave = true,\n  focus = false,\n  hotkeys = {},\n}) {\n  const lFromCtx = useContext(context.i18n);\n  const l = useMemo(() => lFromCtx || locale({ ...en, ...coreEn }), [lFromCtx]);\n  const _ = useMemo(() => l.getGroup('gantt'), [l]);\n  const i18nData = l.getRaw();\n  const dateFormat = useMemo(() => {\n    const f = i18nData.gantt?.dateFormat || i18nData.formats?.dateFormat;\n    return dateToString(f, i18nData.calendar);\n  }, [i18nData]);\n\n  const normalizedTopBar = useMemo(() => {\n    if (topBar === true && !readonly) {\n      const buttons = [\n        { comp: 'icon', icon: 'wxi-close', id: 'close' },\n        { comp: 'spacer' },\n        {\n          comp: 'button',\n          type: 'danger',\n          text: _('Delete'),\n          id: 'delete',\n        },\n      ];\n      if (autoSave) return { items: buttons };\n      return {\n        items: [\n          ...buttons,\n          {\n            comp: 'button',\n            type: 'primary',\n            text: _('Save'),\n            id: 'save',\n          },\n        ],\n      };\n    }\n    return topBar;\n  }, [topBar, readonly, autoSave, _]);\n\n  // resize\n  const [compactMode, setCompactMode] = useState(false);\n  const styleCss = useMemo(\n    () => (compactMode ? 'wx-full-screen' : ''),\n    [compactMode],\n  );\n\n  const handleResize = useCallback((mode) => {\n    setCompactMode(mode);\n  }, []);\n\n  useEffect(() => {\n    const ro = modeObserver(handleResize);\n    ro.observe();\n    return () => {\n      ro.disconnect();\n    };\n  }, [handleResize]);\n\n  const activeTask = useStore(api, '_activeTask');\n  const taskId = useStore(api, 'activeTask');\n  const unscheduledTasks = useStore(api, 'unscheduledTasks');\n  const rollups = useStore(api, 'rollups');\n  const summary = useStore(api, 'summary');\n  const links = useStore(api, 'links');\n  const splitTasks = useStore(api, 'splitTasks');\n  const segmentIndex = useMemo(\n    () => splitTasks && taskId?.segmentIndex,\n    [splitTasks, taskId],\n  );\n  const isSegment = useMemo(\n    () => segmentIndex || segmentIndex === 0,\n    [segmentIndex],\n  );\n  const taskTypes = useStore(api, 'taskTypes');\n  const baseItems = useMemo(\n    () => getEditorItems({ unscheduledTasks, rollups, summary, taskTypes }),\n    [unscheduledTasks, rollups, summary, taskTypes],\n  );\n  const undo = useStore(api, 'undo');\n\n  const [linksActionsMap, setLinksActionsMap] = useState({});\n  const [inProgress, setInProgress] = useState(null);\n  const [editorValues, setEditorValues] = useState();\n  const [editorErrors, setEditorErrors] = useState(null);\n\n  const task = useMemo(() => {\n    if (!activeTask) return null;\n    let data;\n    if (isSegment && activeTask.segments)\n      data = { ...activeTask.segments[segmentIndex] };\n    else data = { ...activeTask };\n\n    if (readonly) {\n      // preserve parent to differentiate between segment and task\n      let values = { parent: data.parent };\n      baseItems.forEach(({ key, comp }) => {\n        if (comp !== 'links') {\n          const value = data[key];\n          if (comp === 'date' && value instanceof Date) {\n            values[key] = dateFormat(value);\n          } else if (comp === 'slider' && key === 'progress') {\n            values[key] = `${value}%`;\n          } else {\n            values[key] = value;\n          }\n        }\n      });\n      return values;\n    }\n    return data || null;\n  }, [activeTask, isSegment, segmentIndex, readonly, baseItems, dateFormat]);\n\n  useEffect(() => {\n    setEditorValues(task);\n  }, [task]);\n\n  useEffect(() => {\n    setLinksActionsMap({});\n    setEditorErrors(null);\n    setInProgress(null);\n  }, [taskId]);\n\n  function prepareEditorItems(localItems, taskData) {\n    return localItems.map((a) => {\n      const item = { ...a };\n      if (a.config) item.config = { ...item.config };\n      if (item.comp === 'links' && api) {\n        item.api = api;\n        item.autoSave = autoSave;\n        item.onLinksChange = handleLinksChange;\n      }\n      if (item.comp === 'select' && item.key === 'type') {\n        const options = item.options ?? [];\n        item.options = options.map((t) => ({\n          ...t,\n          label: _(t.label),\n        }));\n      }\n\n      if (item.comp === 'slider' && item.key === 'progress') {\n        item.labelTemplate = (value) => `${_(item.label)} ${value}%`;\n      }\n\n      if (item.label) item.label = _(item.label);\n      if (item.config?.placeholder)\n        item.config.placeholder = _(item.config.placeholder);\n\n      if (taskData) {\n        if (item.isDisabled && item.isDisabled(taskData, api.getState())) {\n          item.disabled = true;\n        } else delete item.disabled;\n      }\n      return item;\n    });\n  }\n\n  const editorItems = useMemo(() => {\n    let eItems = items.length ? items : baseItems;\n    eItems = prepareEditorItems(eItems, editorValues);\n    if (!editorValues) return eItems;\n    return eItems.filter(\n      (item) => !item.isHidden || !item.isHidden(editorValues, api.getState()),\n    );\n  }, [items, baseItems, editorValues, _, api, autoSave]);\n\n  const editorKeys = useMemo(\n    () => editorItems.map((i) => i.key),\n    [editorItems],\n  );\n\n  function handleLinksChange({ id, action, data }) {\n    setLinksActionsMap((prev) => ({\n      ...prev,\n      [id]: { action, data },\n    }));\n  }\n\n  const saveLinks = useCallback(() => {\n    for (let link in linksActionsMap) {\n      if (links.byId(link)) {\n        const { action, data } = linksActionsMap[link];\n        api.exec(action, data);\n      }\n    }\n  }, [api, linksActionsMap, links]);\n\n  const deleteTask = useCallback(() => {\n    const id = taskId?.id || taskId;\n    if (isSegment) {\n      if (activeTask?.segments) {\n        const segments = activeTask.segments.filter(\n          (s, index) => index !== segmentIndex,\n        );\n        api.exec('update-task', {\n          id,\n          task: { segments },\n        });\n      }\n    } else {\n      api.exec('delete-task', { id });\n    }\n  }, [api, taskId, isSegment, activeTask, segmentIndex]);\n\n  const hide = useCallback(() => {\n    api.exec('show-editor', { id: null });\n  }, [api]);\n\n  const handleAction = useCallback(\n    (ev) => {\n      const { item, changes } = ev;\n      if (item.id === 'delete') {\n        deleteTask();\n      }\n      if (item.id === 'save') {\n        if (!changes.length) saveLinks();\n        else hide();\n      }\n      if (item.comp) hide();\n    },\n    [api, taskId, autoSave, saveLinks, deleteTask, hide],\n  );\n\n  const normalizeTask = useCallback(\n    (t, key, input) => {\n      if (unscheduledTasks && t.type === 'summary') t.unscheduled = false;\n\n      prepareEditTask(t, api.getState(), key);\n      if (!input) setInProgress(false);\n      return t;\n    },\n    [unscheduledTasks, api],\n  );\n\n  const save = useCallback(\n    (values) => {\n      values = {\n        ...values,\n        unscheduled:\n          unscheduledTasks && values.unscheduled && values.type !== 'summary',\n      };\n      delete values.links;\n      delete values.data;\n\n      if (\n        editorKeys.indexOf('duration') === -1 ||\n        (values.segments && !values.duration)\n      )\n        delete values.duration;\n\n      const data = {\n        id: taskId?.id || taskId,\n        task: values,\n        ...(isSegment && { segmentIndex }),\n      };\n      if (autoSave && inProgress) data.inProgress = inProgress;\n\n      api.exec('update-task', data);\n\n      if (!autoSave) saveLinks();\n    },\n    [\n      api,\n      taskId,\n      unscheduledTasks,\n      autoSave,\n      saveLinks,\n      editorKeys,\n      isSegment,\n      segmentIndex,\n      inProgress,\n    ],\n  );\n\n  const handleChange = useCallback(\n    (ev) => {\n      let { update, key, input } = ev;\n\n      if (input) setInProgress(true);\n\n      ev.update = normalizeTask({ ...update }, key, input);\n\n      if (!autoSave) setEditorValues(ev.update);\n      else if (!editorErrors && !input) {\n        const item = editorItems.find((i) => i.key === key);\n        const v = update[key];\n        const isValid = !item.validation || item.validation(v);\n        if (isValid && (!item.required || v)) save(ev.update);\n      }\n    },\n    [autoSave, normalizeTask, editorErrors, editorItems, save],\n  );\n\n  const handleSave = useCallback(\n    (ev) => {\n      if (!autoSave) save(ev.values);\n    },\n    [autoSave, save],\n  );\n\n  const handleValidation = useCallback((check) => {\n    // get all errors after onchange action\n    setEditorErrors(check.errors);\n  }, []);\n\n  const defaultHotkeys = useMemo(\n    () =>\n      undo\n        ? {\n            'ctrl+z': (ev) => {\n              ev.preventDefault();\n              api.exec('undo');\n            },\n            'ctrl+y': (ev) => {\n              ev.preventDefault();\n              api.exec('redo');\n            },\n          }\n        : {},\n    [undo, api],\n  );\n\n  return task ? (\n    <Locale>\n      <WxEditor\n        css={`wx-XkvqDXuw wx-gantt-editor ${styleCss} ${css}`}\n        items={editorItems}\n        values={task}\n        topBar={normalizedTopBar}\n        bottomBar={bottomBar}\n        placement={placement}\n        layout={layout}\n        readonly={readonly}\n        autoSave={autoSave}\n        focus={focus}\n        onAction={handleAction}\n        onSave={handleSave}\n        onValidation={handleValidation}\n        onChange={handleChange}\n        hotkeys={hotkeys && { ...defaultHotkeys, ...hotkeys }}\n      />\n    </Locale>\n  ) : null;\n}\n\nexport default Editor;\n","import { useState, useEffect } from 'react';\nimport { HeaderMenu as HeaderMenuInner } from '@svar-ui/react-grid';\n\nconst HeaderMenu = ({ children, columns = null, api }) => {\n  const [tableAPI, setTableAPI] = useState(null);\n  useEffect(() => {\n    if (!api) return;\n    api.getTable(true).then(setTableAPI);\n  }, [api]);\n\n  return (\n    <HeaderMenuInner api={tableAPI} columns={columns}>\n      {children}\n    </HeaderMenuInner>\n  );\n};\n\nexport default HeaderMenu;\n","import { useState, useEffect, useRef } from 'react';\nimport { locateID, getID } from '@svar-ui/lib-dom';\nimport './Tooltip.css';\n\nfunction Tooltip(props) {\n  const { api, content: Content, children } = props;\n\n  const areaRef = useRef(null);\n  const tooltipNodeRef = useRef(null);\n\n  const [areaCoords, setAreaCoords] = useState({});\n  const [contentProps, setContentProps] = useState({});\n  const [pos, setPos] = useState({});\n  const posRef = useRef(pos);\n  posRef.current = pos;\n\n  function findAttribute(node) {\n    const trg = node;\n    while (node) {\n      if (node.getAttribute) {\n        const id = getID(node, 'data-tooltip-id');\n        const at = getID(node, 'data-tooltip-at');\n        const tooltip = node.getAttribute('data-tooltip');\n        if (id || tooltip) {\n          const segment = locateID(trg, 'data-segment');\n          return { id, tooltip, target: node, at, segment };\n        }\n      }\n      node = node.parentNode;\n    }\n\n    return { id: null, tooltip: null, target: null, at: null, segment: null };\n  }\n\n  useEffect(() => {\n    const tooltipNode = tooltipNodeRef.current;\n    const currentPos = posRef.current;\n    if (tooltipNode && currentPos && (currentPos.text || Content)) {\n      const tooltipCoords = tooltipNode.getBoundingClientRect();\n\n      let updated = false;\n      let newLeft = currentPos.left;\n      let newTop = currentPos.top;\n\n      if (tooltipCoords.right >= areaCoords.right) {\n        newLeft = areaCoords.width - tooltipCoords.width - 5;\n        updated = true;\n      }\n      if (tooltipCoords.bottom >= areaCoords.bottom) {\n        newTop = currentPos.top - (tooltipCoords.bottom - areaCoords.bottom + 2);\n        updated = true;\n      }\n\n      if (updated) {\n        setPos((prev) => {\n          if (!prev) return prev;\n          return { ...prev, left: newLeft, top: newTop };\n        });\n      }\n    }\n  }, [areaCoords, Content]);\n\n  const timerRef = useRef(null);\n  const TIMEOUT = 300;\n  const debounce = (code) => {\n    clearTimeout(timerRef.current);\n    timerRef.current = setTimeout(() => {\n      code();\n    }, TIMEOUT);\n  };\n\n  function move(e) {\n    let { id, tooltip, target, at, segment } = findAttribute(e.target);\n    setPos(null);\n    setContentProps({});\n\n    if (!tooltip) {\n      if (!id) {\n        clearTimeout(timerRef.current);\n        return;\n      } else {\n        tooltip = getTaskText(id, segment);\n      }\n    }\n\n    const clientX = e.clientX;\n\n    debounce(() => {\n      if (id) {\n        const props = { data: getTaskObj(id) };\n        if (segment != null) props.segmentIndex = segment;\n        setContentProps(props);\n      }\n\n      const targetCoords = target.getBoundingClientRect();\n      const areaEl = areaRef.current;\n      const areaRect = areaEl\n        ? areaEl.getBoundingClientRect()\n        : { top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 };\n\n      let top, left;\n      if (at === 'left') {\n        top = targetCoords.top + 5 - areaRect.top;\n        left = targetCoords.right + 5 - areaRect.left;\n      } else {\n        top = targetCoords.top + targetCoords.height - areaRect.top;\n        left = clientX - areaRect.left;\n      }\n\n      setAreaCoords(areaRect);\n      setPos({ top, left, text: tooltip });\n    });\n  }\n\n  function getTaskObj(id) {\n    return api?.getTask(id) || null;\n  }\n\n  function getTaskText(id, segment) {\n    const task = getTaskObj(id);\n    if (segment !== null && task?.segments)\n      return task.segments[segment]?.text || '';\n    return task?.text || '';\n  }\n\n  return (\n    <div\n      className=\"wx-KG0Lwsqo wx-tooltip-area\"\n      ref={areaRef}\n      onMouseMove={move}\n    >\n      {pos && (pos.text || Content) ? (\n        <div\n          className=\"wx-KG0Lwsqo wx-gantt-tooltip\"\n          ref={tooltipNodeRef}\n          style={{ top: `${pos.top}px`, left: `${pos.left}px` }}\n        >\n          {Content ? (\n            <Content {...contentProps} />\n          ) : pos.text ? (\n            <div className=\"wx-KG0Lwsqo wx-gantt-tooltip-text\">{pos.text}</div>\n          ) : null}\n        </div>\n      ) : null}\n\n      {children}\n    </div>\n  );\n}\n\nexport default Tooltip;\n","import { Material as CoreMaterial } from '@svar-ui/react-core';\nimport './Material.css';\n\nfunction Material({ fonts = true, children }) {\n  if (children) {\n    return <CoreMaterial fonts={fonts}>{children()}</CoreMaterial>;\n  } else {\n    return <CoreMaterial fonts={fonts} />;\n  }\n}\n\nexport default Material;\n","import { Willow as CoreWillow } from '@svar-ui/react-core';\nimport './Willow.css';\n\nfunction Willow({ fonts = true, children }) {\n  return children ? (\n    <CoreWillow fonts={fonts}>{children}</CoreWillow>\n  ) : (\n    <CoreWillow fonts={fonts} />\n  );\n}\n\nexport default Willow;\n","import { WillowDark as WillowDarkCore } from '@svar-ui/react-core';\nimport './WillowDark.css';\n\nexport default function WillowDark({ fonts = true, children }) {\n  if (children) {\n    return <WillowDarkCore fonts={fonts}>{children}</WillowDarkCore>;\n  } else {\n    return <WillowDarkCore fonts={fonts} />;\n  }\n}\n","import Gantt from './components/Gantt.jsx';\nimport Toolbar from './components/Toolbar.jsx';\nimport ContextMenu from './components/ContextMenu.jsx';\nimport Editor from './components/Editor.jsx';\nimport HeaderMenu from './components/grid/HeaderMenu.jsx';\n\nimport Tooltip from './widgets/Tooltip.jsx';\n\nimport Material from './themes/Material.jsx';\nimport Willow from './themes/Willow.jsx';\nimport WillowDark from './themes/WillowDark.jsx';\n\nimport pkg from '../package.json' with { type: 'json' };\n\nexport {\n  defaultEditorItems,\n  defaultToolbarButtons,\n  defaultMenuOptions,\n  defaultColumns,\n  defaultTaskTypes,\n  getEditorItems,\n  getToolbarButtons,\n  getMenuOptions,\n  registerScaleUnit,\n} from '@svar-ui/gantt-store';\n\nexport { registerEditorItem } from '@svar-ui/react-editor';\n\nexport const version = pkg.version;\n\nexport {\n  Gantt,\n  ContextMenu,\n  HeaderMenu,\n  Toolbar,\n  Tooltip,\n  Editor,\n  Material,\n  Willow,\n  WillowDark,\n};\n"],"names":["store","createContext","getOffset","node","relative","ev","box","base","checkSource","getID","SHIFT","reorder","config","source","clone","sid","x","y","detail","touched","touchTimer","down","event","handleTouchstart","locate","handleTouchmove","handleContext","handleTouchend","handleMousedown","handleMousemove","handleMouseup","end","full","move","dx","dy","top","task","up","targetNode","target","tid","line","after","before","TextCell","row","column","getStyle","col","CellComponent","jsxs","jsx","ActionCell","cell","action","useMemo","Grid","props","readonly","compactMode","width","display","columnWidthProp","onTableAPIChange","columnWidth","setColumnWidthProp","useWritableProp","tableAPI","setTableAPI","useState","i18n","useContext","context","_","api","storeContext","scrollTopVal","useStore","cellHeightVal","focusTask","selectedVal","areaVal","rTasksVal","scalesVal","headerLengthVal","columnsVal","sortVal","calendarVal","durationUnitVal","splitTasksVal","filterValuesVal","dragTask","setDragTask","tasks","execAction","useCallback","id","a","onClick","e","locateID","tableRef","useRef","tableContainerRef","gridWidth","setGridWidth","gridHeight","setGridHeight","updateFlex","setUpdateFlex","useEffect","update","ro","allTasks","t","allTasksRef","lastDetailRef","reorderTasks","inProgress","mode","index","targetIndex","cols","header","ti","c","ai","actionCol","scrollDelta","headerHeight","scrollX","tableStyle","style","basis","sortMarks","marks","key","order","filters","checkFlex","hasFlexCol","fitColumns","filteredColumns","containerWidth","baseColumnWidth","forceReset","actualWidth","acc","k","setColumnWidth","resized","newColumnWidth","adjustColumns","onDblClick","sel","o","setScrollOffset","body","tableEl","bodyEl","pendingFocusRef","focusCell","startReorder","endReorder","moveReorder","handleHotkey","isInput","handlersStateRef","setHandlersState","init","tapi","add","keySort","s","value","v","prepareEditTask","WxGrid","CellGrid","borders","cellWidth","cellHeight","nodeRef","color","setColor","border","grid","Links","onSelectLink","selectedLink","links","criticalPath","selectedLineRef","onClickOutside","css","handler","link","className","setID","BarSegments","type","segmentStyle","i","getSegProgress","segmentIndex","progress","segments","duration","result","seg","Rollups","rollup","parent","Bars","TaskTemplate","rTasksValue","rTasksCounter","useStoreWithCounter","rLinksValue","rLinksCounter","areaValue","scalesValue","taskTypesValue","baselinesValue","selectedValue","rollups","rRollups","focusTaskStore","tree","schedule","splitTasks","summary","slack","start","lengthUnitWidth","ignoreNextClickRef","linkFrom","setLinkFrom","taskMove","setTaskMove","progressFromRef","selectedLinkId","setSelectedLinkId","setTouched","touchTimerRef","totalWidth","setTotalWidth","containerRef","hasFocus","el","focused","entries","startDrag","endDrag","getMoveMode","segmentNode","left","p","delta","point","clientX","newTaskMove","segNode","extendDragOptions","mousedown","touchstart","marker","l","w","segment","diff","minWidth","isSegmentMoveAllowed","nextTaskMove","taskNode","barNode","mousemove","touchmove","mouseup","touchend","types","getLinkType","fromStart","toStart","alreadyLinked","removeLinkMarker","taskStyle","baselineStyle","slackStyle","contextmenu","taskTypeIds","taskTypeCss","forward","isTaskCritical","isLinkMarkerVisible","summaryIds","linkFromSummaryIds","barClass","leftLinkClass","rightLinkClass","Fragment","Button","TimeScale","highlightTime","scales","rowIdx","cellIdx","extraClass","renderMetrics","useRenderTime","label","startTime","renderCount","rafRef","enabled","metric","Chart","fullWidth","fullHeight","taskTemplate","cellBorders","selected","selectedCounter","rScrollTop","rScrollLeft","markers","zoom","chartHeight","setChartHeight","chartRef","expectedScroll","isUserScrollRef","extraRows","selectStyle","obj","chartGridHeight","useLayoutEffect","onScroll","setScroll","dataRequest","num","pos","from","lastWheelTimeRef","pendingRef","MAX_ZOOM_RATE","clamp","min","max","getZoomFactor","evDelta","SENSITIVITY","now","dt","normalized","onWheel","ratio","offset","getHoliday","holidays","cleanupRef","hotkeys","TimeScales","holiday","Resizer","position","size","dir","onMove","onDisplayChange","leftThreshold","rightThreshold","setValue","setDisplay","getBox","val","name","active","setActive","initialPosition","setInitialPosition","startRef","posRef","displayRef","getEventPos","newPos","nextDisplay","cursor","resetToInitial","handleExpand","direction","newDisplay","handleExpandLeft","handleExpandRight","b","rootClassName","COMPACT_WIDTH","modeObserver","callback","observer","observe","disconnect","Layout","rTasks","rScales","rCellHeight","rColumns","undo","setCompactMode","ganttWidth","setGanttWidth","ganttHeight","setGanttHeight","innerWidth","setInnerWidth","lastDisplay","handleResize","prev","gridColumnWidth","scrollSize","scrollHeight","latestLayout","chartResizeHandler","gw","grw","gh","sh","ss","ganttDivRef","pseudoRowsRef","ganttDiv","pseudoRows","flushSync","layoutRef","getUnitFormats","normalizeFormatter","calendarLocale","dateToString","prepareScales","format","scale","prepareFormats","formats","unit","prepareColumns","columns","prepareZoom","level","camelize","part","defaultScales","Gantt","forwardRef","taskTypes","defaultTaskTypes","activeTask","defaultColumns","lengthUnit","durationUnit","scaleHeight","baselines","highlightTimeProp","autoScale","unscheduledTasks","projectStart","projectEnd","calendar","_export","restProps","ref","restPropsRef","dataStore","DataStore","writable","words","coreEn","en","i18nCtx","locale","lCalendar","normalizedConfig","normalizeLinks","normalizeZoom","parsedTasksRef","parseTaskDates","firstInRoute","lastInRouteRef","EventBusRouter","tableAPIRef","waitRender","res","useImperativeHandle","initOnceRef","day","StoreContext","Toolbar","items","i18nLocal","_selected","useStoreLater","history","historyActions","finalItems","fullButtons","getToolbarButtons","item","isHandledAction","it","handleAction","buttons","finalButtons","button","nextButton","WxToolbar","ContextMenu","optionsInit","resolver","filter","at","children","menuRef","activeIdRef","taskTypesVal","selectedTasksVal","summaryVal","fullOptions","getMenuOptions","applyLocaleFn","opts","op","getOptions","finalOptions","cOptions","selectedTasks","itemResolver","menuAction","filterMenu","disabled","onContextMenu","content","WxContextMenu","Provider","autoSave","onLinksChange","_activeTask","linksData","setLinksData","getLinksData","inLinks","outLinks","list","deleteLink","group","handleChange","idx","Field","Text","Combo","option","DateTimePicker","time","onchange","onChange","onChangeHandler","handleDateChange","current","DatePicker","TimePicker","registerEditorItem","RichSelect","TwoState","Slider","Counter","Checkbox","Editor","layout","placement","bottomBar","topBar","focus","lFromCtx","i18nData","dateFormat","f","normalizedTopBar","styleCss","taskId","isSegment","baseItems","getEditorItems","linksActionsMap","setLinksActionsMap","setInProgress","editorValues","setEditorValues","editorErrors","setEditorErrors","data","values","comp","prepareEditorItems","localItems","taskData","handleLinksChange","options","editorItems","eItems","editorKeys","saveLinks","deleteTask","hide","changes","normalizeTask","input","save","handleSave","handleValidation","check","defaultHotkeys","Locale","WxEditor","HeaderMenu","HeaderMenuInner","Tooltip","Content","areaRef","tooltipNodeRef","areaCoords","setAreaCoords","contentProps","setContentProps","setPos","findAttribute","trg","tooltip","tooltipNode","currentPos","tooltipCoords","updated","newLeft","newTop","timerRef","TIMEOUT","debounce","code","getTaskText","getTaskObj","targetCoords","areaEl","areaRect","Material","fonts","CoreMaterial","Willow","CoreWillow","WillowDark","WillowDarkCore","version","pkg"],"mappings":"4jBAEMA,GAAQC,EAAAA,cAAc,IAAI,ECAhC,SAASC,GAAUC,EAAMC,EAAUC,EAAI,CACrC,MAAMC,EAAMH,EAAK,sBAAqB,EAChCI,EAAOH,EAAS,cAAc,UAAU,EAAE,sBAAqB,EAErE,MAAO,CACL,IAAKE,EAAI,IAAMC,EAAK,IACpB,KAAMD,EAAI,KAAOC,EAAK,KACtB,GAAID,EAAI,OAASD,EAAG,QACpB,GAAIA,EAAG,QAAUC,EAAI,GACzB,CACA,CAEA,SAASE,GAAYL,EAAM,CACzB,OAAOA,GAAQM,EAAAA,MAAMN,EAAM,iBAAiB,CAC9C,CAEA,MAAMO,GAAQ,EAEP,SAASC,GAAQR,EAAMS,EAAQ,CACpC,IAAIC,EAAQC,EAAOC,EACfC,EAAGC,EAAGV,EAAMW,EACZC,EAASC,EAEb,SAASC,EAAKC,EAAO,CACnBN,EAAIM,EAAM,QACVL,EAAIK,EAAM,QACVf,EAAO,CACL,GAAGL,GAAUW,EAAQV,EAAMmB,CAAK,EAChC,EAAGV,EAAO,QAAQG,CAAG,EAAE,EAC7B,EAEI,SAAS,KAAK,MAAM,WAAa,MACnC,CAEA,SAASQ,EAAiBD,EAAO,CAC/BT,EAASW,EAAAA,OAAOF,CAAK,EAChBd,GAAYK,CAAM,IAEvBE,EAAMN,EAAAA,MAAMI,CAAM,EAElBO,EAAa,WAAW,IAAM,CAC5BD,EAAU,GACNP,GAAUA,EAAO,YAAYA,EAAO,WAAU,EAClDS,EAAKC,EAAM,QAAQ,CAAC,CAAC,CACvB,EAAG,GAAG,EAENnB,EAAK,iBAAiB,YAAasB,CAAe,EAClDtB,EAAK,iBAAiB,cAAeuB,CAAa,EAClD,OAAO,iBAAiB,WAAYC,CAAc,EACpD,CAEA,SAASD,EAAcJ,EAAO,CAC5B,GAAIH,GAAWC,EACb,OAAAE,EAAM,eAAc,EACb,EAEX,CAEA,SAASM,EAAgBN,EAAO,CAC1BA,EAAM,QAAU,IAEpBT,EAASW,EAAAA,OAAOF,CAAK,EAChBd,GAAYK,CAAM,IAEvBE,EAAMN,EAAAA,MAAMI,CAAM,EAElBV,EAAK,iBAAiB,YAAa0B,CAAe,EAClD,OAAO,iBAAiB,UAAWC,CAAa,EAEhDT,EAAKC,CAAK,GACZ,CAEA,SAASS,EAAIC,EAAM,CACjB7B,EAAK,oBAAoB,YAAa0B,CAAe,EACrD1B,EAAK,oBAAoB,YAAasB,CAAe,EACrD,SAAS,KAAK,oBAAoB,UAAWK,CAAa,EAC1D,SAAS,KAAK,oBAAoB,WAAYH,CAAc,EAC5D,SAAS,KAAK,MAAM,WAAa,GAE7BK,IACF7B,EAAK,oBAAoB,YAAayB,CAAe,EACrDzB,EAAK,oBAAoB,aAAcoB,CAAgB,EAE3D,CAEA,SAASU,EAAKX,EAAO,CACnB,MAAMY,EAAKZ,EAAM,QAAUN,EACrBmB,EAAKb,EAAM,QAAUL,EAC3B,GAAI,CAACH,EAAO,CAEV,GADI,KAAK,IAAIoB,CAAE,EAAIxB,IAAS,KAAK,IAAIyB,CAAE,EAAIzB,IACvCE,GAAUA,EAAO,OACfA,EAAO,MAAM,CAAE,GAAIG,EAAK,EAAGO,EAAO,IAAM,GAAO,OAGrDR,EAAQD,EAAO,UAAU,EAAI,EAC7BC,EAAM,MAAM,cAAgB,OAC5BA,EAAM,UAAU,IAAI,iBAAiB,EACrCA,EAAM,MAAM,SAAW,WACvBA,EAAM,MAAM,KAAOP,EAAK,KAAO,KAC/BO,EAAM,MAAM,IAAMP,EAAK,IAAM,KAE7BM,EAAO,MAAM,WAAa,SAC1BA,EAAO,WAAW,aAAaC,EAAOD,CAAM,CAC9C,CAEA,GAAIC,EAAO,CACT,MAAMsB,EAAM,KAAK,MAAM,KAAK,IAAI,EAAG7B,EAAK,IAAM4B,CAAE,CAAC,EAEjD,GAAIvB,GAAUA,EAAO,MACfA,EAAO,KAAK,CAAE,GAAIG,EAAK,IAAAqB,EAAK,OAAAlB,EAAQ,IAAM,GAAO,OAGvD,MAAMmB,GAAOzB,EAAO,QAAQG,CAAG,EACzBE,EAAIoB,GAAK,GAEf,GAAI,CAAC9B,EAAK,OAASA,EAAK,IAAMU,EAAG,OAAOqB,EAAE,EAE1C/B,EAAK,MAAQ,GACbA,EAAK,EAAI8B,GAAK,GAAK,EACnBvB,EAAM,MAAM,IAAMsB,EAAM,KAExB,MAAMG,EAAa,SAAS,iBAC1BjB,EAAM,QACNA,EAAM,OACd,EACYkB,EAAShB,EAAAA,OAAOe,CAAU,EAEhC,GAAIC,GAAUA,IAAW3B,EAAQ,CAC/B,MAAM4B,EAAMhC,EAAAA,MAAM+B,CAAM,EAClBlC,EAAMkC,EAAO,sBAAqB,EAClCE,EAAOpC,EAAI,IAAMA,EAAI,OAAS,EAE9BqC,EACJrB,EAAM,QAAUf,EAAK,GAAKmC,GAC1BF,EAAO,qBAAuB3B,EAC1B+B,EACJtB,EAAM,QAAUf,EAAK,GAAKmC,GAC1BF,EAAO,yBAA2B3B,EAEhCK,GAAQ,QAAUuB,GAAOvB,GAAQ,SAAWuB,EAE9CvB,EAAS,KACAyB,EAETzB,EAAS,CAAE,GAAIH,EAAK,MAAO0B,CAAG,EACrBG,IAET1B,EAAS,CAAE,GAAIH,EAAK,OAAQ0B,CAAG,EAEnC,CACF,CACF,CAEA,SAASZ,EAAgBP,EAAO,CAC9BW,EAAKX,CAAK,CACZ,CAEA,SAASG,EAAgBH,EAAO,CAC1BH,GACFG,EAAM,eAAc,EACpBW,EAAKX,EAAM,QAAQ,CAAC,CAAC,GACZF,IACT,aAAaA,CAAU,EACvBA,EAAa,KAEjB,CAEA,SAASO,GAAiB,CACxBR,EAAU,KACNC,IACF,aAAaA,CAAU,EACvBA,EAAa,MAEfkB,EAAE,CACJ,CAEA,SAASR,GAAgB,CACvBQ,EAAE,CACJ,CAEA,SAASA,GAAK,CACRzB,IACFA,EAAO,MAAM,WAAa,IAExBC,IACFA,EAAM,WAAW,YAAYA,CAAK,EAC9BF,GAAUA,EAAO,KAAKA,EAAO,IAAI,CAAE,GAAIG,EAAK,IAAKR,EAAK,GAAG,CAAE,GAGjEQ,EAAMF,EAASC,EAAQP,EAAOW,EAAS,KACvCa,EAAG,CACL,CAEA,OAAI5B,EAAK,MAAM,WAAa,aAAYA,EAAK,MAAM,SAAW,YAE9DA,EAAK,iBAAiB,YAAayB,CAAe,EAClDzB,EAAK,iBAAiB,aAAcoB,CAAgB,EAE7C,CACL,SAAU,CACRQ,EAAI,EAAI,CACV,CACJ,CACA,CC3MA,SAASc,GAAS,CAAE,IAAAC,EAAK,OAAAC,GAAU,CACjC,SAASC,EAASF,EAAKG,EAAK,CAC1B,MAAO,CACL,eAAgBA,EAAI,MACpB,YAAa,IAAIH,EAAI,OAAS,GAAK,EAAE,IAAA,CAEzC,CAEA,MAAMI,EAAgBH,GAAUA,EAAO,MAEvC,OACEI,OAAC,OAAI,UAAU,yBAAyB,MAAOH,EAASF,EAAKC,CAAM,EAChE,SAAA,CAAA,CAACD,EAAI,SAAWA,EAAI,MAAQA,EAAI,MAC/BM,EAAAA,IAAC,IAAA,CACC,UAAW,uCAAuCN,EAAI,KAAO,OAAS,OAAO,GAC7E,cAAY,WAAA,CAAA,EAGdM,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAA,CAAoC,EAEnDA,EAAAA,IAAC,MAAA,CAAI,UAAU,sBACZ,SAAAF,EAAgBE,EAAAA,IAACF,EAAA,CAAc,IAAAJ,EAAU,OAAAC,CAAA,CAAgB,EAAKD,EAAI,IAAA,CACrE,CAAA,EACF,CAEJ,CCxBA,SAASO,GAAW,CAAE,OAAAN,EAAQ,KAAAO,GAAQ,CACpC,MAAMC,EAASC,EAAAA,QAAQ,IAAMT,EAAO,GAAI,CAACA,GAAQ,EAAE,CAAC,EAEpD,OAAOO,GAAQP,EAAO,KAAO,WAC3BK,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAWL,EAAO,KAAA,EAC9B,SAAAK,EAAAA,IAAC,IAAA,CACC,UAAU,sCACV,cAAaG,CAAA,CAAA,EAEjB,EACE,IACN,CCKA,SAAwBE,GAAKC,EAAO,CAClC,KAAM,CACJ,SAAAC,EACA,YAAAC,EACA,MAAAC,EAAQ,EACR,QAAAC,EAAU,MACV,YAAaC,EAAkB,EAC/B,iBAAAC,CAAA,EACEN,EACE,CAACO,EAAaC,CAAkB,EAAIC,EAAAA,gBAAgBJ,CAAe,EACnE,CAACK,EAAUC,CAAW,EAAIC,WAAA,EAE1BC,EAAOC,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAC9BC,EAAIlB,EAAAA,QAAQ,IAAMe,EAAK,SAAS,OAAO,EAAG,CAACA,CAAI,CAAC,EAChDI,EAAMH,EAAAA,WAAWI,EAAY,EAE7BC,EAAeC,EAAAA,SAASH,EAAK,WAAW,EACxCI,EAAgBD,EAAAA,SAASH,EAAK,YAAY,EAC1CK,EAAYF,EAAAA,SAASH,EAAK,WAAW,EACrCM,EAAcH,EAAAA,SAASH,EAAK,WAAW,EACvCO,EAAUJ,EAAAA,SAASH,EAAK,MAAM,EAC9BQ,EAAYL,EAAAA,SAASH,EAAK,QAAQ,EAClCS,EAAYN,EAAAA,SAASH,EAAK,SAAS,EACnCU,EAAkBP,EAAAA,SAASH,EAAK,eAAe,EAC/CW,EAAaR,EAAAA,SAASH,EAAK,SAAS,EACpCY,EAAUT,EAAAA,SAASH,EAAK,OAAO,EAC/Ba,EAAcV,EAAAA,SAASH,EAAK,UAAU,EACtCc,EAAkBX,EAAAA,SAASH,EAAK,cAAc,EAC9Ce,GAAgBZ,EAAAA,SAASH,EAAK,YAAY,EAC1CgB,EAAkBb,EAAAA,SAASH,EAAK,cAAc,EAE9C,CAACiB,EAAUC,CAAW,EAAIvB,EAAAA,SAAS,IAAI,EAEvCwB,EAAQtC,EAAAA,QAAQ,IAChB,CAAC2B,GAAa,CAACD,EAAgB,CAAA,EAC5BC,EAAU,MAAMD,EAAQ,MAAOA,EAAQ,GAAG,EAChD,CAACC,EAAWD,CAAO,CAAC,EAEjBa,EAAaC,EAAAA,YACjB,CAACC,EAAI1C,IAAW,CACd,GAAIA,IAAW,WACboB,EAAI,KAAKpB,EAAQ,CACf,OAAQ0C,EACR,KAAM,CAAE,KAAMvB,EAAE,UAAU,CAAA,EAC1B,KAAM,QACN,KAAM,GACN,MAAOuB,EAAK,OAAS,IAAA,CACtB,UACQ1C,IAAW,YAAa,CACjC,MAAMlB,EAAOyD,EAAM,KAAMI,GAAMA,EAAE,KAAOD,CAAE,GACtC5D,GAAM,MAAQA,GAAM,OACtBsC,EAAI,KAAKpB,EAAQ,CAAE,GAAA0C,EAAI,KAAM,CAAC5D,EAAK,KAAM,CAC7C,CACF,EACA,CAACyD,CAAK,CAAA,EAGFK,EAAUH,EAAAA,YACbI,GAAM,CACL,MAAMH,EAAKI,EAAAA,SAASD,CAAC,EACf7C,EAAS6C,EAAE,OAAO,QAAQ,OAC5B7C,KAAU,eAAA,EACV0C,EACE1C,IAAW,YAAcA,IAAW,YACtCwC,EAAWE,EAAI1C,CAAM,EAErBoB,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,OAAQG,EAAE,SAAWA,EAAE,QACvB,MAAOA,EAAE,SACT,KAAM,KACN,MAAO,MAAA,CACR,EAEM7C,IAAW,YACpBwC,EAAW,KAAMxC,CAAM,CAE3B,EACA,CAACoB,EAAKoB,CAAU,CAAA,EAGZO,EAAWC,EAAAA,OAAO,IAAI,EACtBC,EAAoBD,EAAAA,OAAO,IAAI,EAC/B,CAACE,EAAWC,EAAY,EAAIpC,EAAAA,SAAS,CAAC,EACtC,CAACqC,EAAYC,CAAa,EAAItC,EAAAA,SAAS,CAAC,EACxC,CAACuC,EAAYC,CAAa,EAAIxC,EAAAA,SAAS,EAAK,EAElDyC,EAAAA,UAAU,IAAM,CACd,MAAM5G,EAAOqG,EAAkB,QAC/B,GAAI,CAACrG,GAAQ,OAAO,eAAmB,IAAa,OACpD,MAAM6G,EAAS,IAAM,CACnBN,GAAavG,EAAK,WAAW,EAC7ByG,EAAczG,EAAK,YAAY,CACjC,EACA6G,EAAA,EACA,MAAMC,EAAK,IAAI,eAAeD,CAAM,EACpC,OAAAC,EAAG,QAAQ9G,CAAI,EACR,IAAM8G,EAAG,WAAA,CAClB,EAAG,CAAA,CAAE,EAEL,MAAMC,EAAW1D,EAAAA,QAAQ,KAErBoC,GAAY,CAACE,EAAM,KAAMqB,GAAMA,EAAE,KAAOvB,EAAS,EAAE,EAC/C,CAAC,GAAGE,EAAOF,CAAQ,EACnBE,GACM,IAAKqB,IAAO,CAAE,GAAGA,GAAI,EAChC,CAACrB,EAAOF,CAAQ,CAAC,EAEdwB,GAAcb,EAAAA,OAAOW,CAAQ,EACnCH,EAAAA,UAAU,IAAM,CACdK,GAAY,QAAUF,CACxB,EAAG,CAACA,CAAQ,CAAC,EAEb,MAAMG,GAAgBd,EAAAA,OAAO,IAAI,EAE3Be,GAAetB,EAAAA,YAClB9E,GAAW,CACV,MAAM+E,EAAK/E,EAAO,GACZ,CAAE,OAAA0B,EAAQ,MAAAD,CAAA,EAAUzB,EACpBqG,EAAarG,EAAO,OAE1B,IAAIsB,EAASI,GAAUD,EACnB6E,EAAO5E,EAAS,SAAW,QAE/B,GAAI2E,EAAY,CACd,GAAIC,IAAS,QAAS,CACpB,MAAMC,GAAQL,GAAY,QAAQ,UAAWD,IAAMA,GAAE,KAAOlB,CAAE,EACxDyB,GAAcN,GAAY,QAAQ,UACrCD,IAAMA,GAAE,KAAO3E,CAAA,EAEZH,GAAO+E,GAAY,QAAQM,EAAW,EACxCD,GAAQC,KAAgB,EAC1BF,EAAO,SACEnF,IAAQA,GAAK,MAAQA,GAAK,OACnCmF,EAAO,SACPhF,EAASH,GAAK,KAAK,CAAC,EAAE,GAE1B,CACAgF,GAAc,QAAU,CAAE,GAAApB,EAAI,CAACuB,CAAI,EAAGhF,CAAA,CACxC,SAAqB,QAAU,KAE/BmC,EAAI,KAAK,YAAa,CACpB,GAAAsB,EACA,KAAAuB,EACA,OAAAhF,EACA,WAAA+E,CAAA,CACD,CACH,EACA,CAAC5C,CAAG,CAAA,EAMAgD,GAAOnE,EAAAA,QAAQ,IAAM,CACzB,IAAImE,GAAQrC,GAAc,CAAA,GAAI,IAAKrC,GAAQ,CACzCA,EAAM,CAAE,GAAGA,CAAA,EACX,MAAM2E,EAAS,CAAC,GAAG3E,EAAI,MAAM,EAC7B,OAAA2E,EAAO,QAASlF,GAAS,CACnBA,EAAK,OAAMA,EAAK,KAAOgC,EAAEhC,EAAK,IAAI,EACxC,CAAC,EACDO,EAAI,OAAS2E,EACN3E,CACT,CAAC,EACD,MAAM4E,EAAKF,EAAK,UAAWG,GAAMA,EAAE,KAAO,MAAM,EAC1CC,EAAKJ,EAAK,UAAWG,GAAMA,EAAE,KAAO,UAAU,EAMpD,GAJID,IAAO,KACLF,EAAKE,CAAE,EAAE,OAAMF,EAAKE,CAAE,EAAE,MAAQF,EAAKE,CAAE,EAAE,MAC7CF,EAAKE,CAAE,EAAE,KAAOhF,IAEdkF,IAAO,GAAI,CACbJ,EAAKI,CAAE,EAAE,KAAOJ,EAAKI,CAAE,EAAE,MAAQ1E,GACjC,MAAMuE,EAASD,EAAKI,CAAE,EAAE,OAAO,CAAC,EAGhC,GAFAJ,EAAKI,CAAE,EAAE,OAAO,CAAC,EAAE,KAAOH,EAAO,MAAQvE,GAErCM,EACFgE,EAAK,OAAOI,EAAI,CAAC,UAEbnE,EAAa,CACf,KAAM,CAACoE,CAAS,EAAIL,EAAK,OAAOI,EAAI,CAAC,EACrCJ,EAAK,QAAQK,CAAS,CACxB,CAEJ,CAEA,OAAIL,EAAK,OAAS,IAAGA,EAAKA,EAAK,OAAS,CAAC,EAAE,OAAS,IAC7CA,CACT,EAAG,CAACrC,EAAYZ,EAAGf,EAAUC,CAAW,CAAC,EAKnCqE,GAAczE,EAAAA,QAAQ,IAAM0B,GAAS,MAAQ,EAAG,CAACA,CAAO,CAAC,EACzDgD,GAAe1E,EAAAA,QAAQ,IAAM4B,GAAW,QAAU,EAAG,CAACA,CAAS,CAAC,EAEhE+C,GAAU3E,EAAAA,QAAQ,IAClB,CAACI,GAAeE,IAAY,QACtBG,GAAe,IAAMJ,GAAS,IAE9BI,GAAe,IAAMwC,GAAa,GAE3C,CAAC7C,EAAaE,EAASG,EAAaJ,EAAO4C,CAAS,CAAC,EAElD2B,GAAa5E,EAAAA,QAAQ,IAAM,CAC/B,MAAM6E,EAAQ,CACZ,UAAW,GAAG1B,GAAc5B,GAAiB,GAAK,CAAC,IAAA,EAErD,OAAKoD,IAAWrE,IAAY,OAAWA,IAAY,QAAUqE,GAC3DE,EAAM,MAAQpE,EACLH,IAAY,SACrBuE,EAAM,MAAQ,QAETA,CACT,EAAG,CAACF,GAASrE,EAASG,EAAa0C,EAAY5B,CAAa,CAAC,EAEvDuD,GAAQ9E,EAAAA,QAAQ,IAChBM,IAAY,MAAc,GAAGD,CAAK,KAClCC,IAAY,OAAe,mBACxB6D,GAAK,KAAMG,GAAMA,EAAE,KAAO,UAAU,EAAI,OAAS,IACvD,CAAChE,EAASD,EAAO8D,EAAI,CAAC,EAEnBY,GAAY/E,EAAAA,QAAQ,IAAM,CAC9B,GAAI0D,GAAY3B,GAAS,OAAQ,CAC/B,MAAMiD,EAAQ,CAAA,EACd,OAAAjD,EAAQ,QAAQ,CAAC,CAAE,IAAAkD,EAAK,MAAAC,CAAA,EAASjB,IAAU,CACzCe,EAAMC,CAAG,EAAI,CACX,MAAAC,EACA,GAAInD,EAAQ,OAAS,GAAK,CAAE,MAAAkC,CAAA,CAAM,CAEtC,CAAC,EACMe,CACT,CACA,MAAO,CAAA,CACT,EAAG,CAACtB,EAAU3B,CAAO,CAAC,EAEhBoD,GAAUnF,EAAAA,QAAQ,IACf+E,GAAY,CAAE,GAAG5C,CAAA,EAAoBA,EAC3C,CAAC4C,GAAW5C,CAAe,CAAC,EAEzBiD,GAAY5C,EAAAA,YAAY,IACrB2B,GAAK,KAAMG,GAAMA,EAAE,UAAY,CAACA,EAAE,MAAM,EAC9C,CAACH,EAAI,CAAC,EAEHkB,GAAarF,EAAAA,QAAQ,IAGlBoF,GAAA,EACN,CAACA,GAAW/B,CAAU,CAAC,EAEpBiC,GAAatF,EAAAA,QAAQ,IAAM,CAC/B,IAAIuF,EACFjF,IAAY,QAAU6D,GAAK,OAAQG,GAAMA,EAAE,KAAO,UAAU,EAAIH,GAElE,MAAMqB,EAAiBlF,IAAY,MAAQD,EAAQ4C,EACnD,GAAI,CAACoC,GAAY,CACf,IAAII,EAAkBhF,EAClBiF,EAAa,GACjB,GAAIvB,GAAK,KAAMG,GAAMA,EAAE,MAAM,EAAG,CAC9B,IAAIqB,EAAc,EAClBF,EAAkBtB,GAAK,OAAO,CAACyB,EAAKnG,KAC7BA,EAAI,SACPkG,GAAelG,EAAI,MACnBmG,GAAOnG,EAAI,QAAUA,EAAI,OAEpBmG,GACN,CAAC,EAEAD,EAAcF,GAAmBA,GAAmBD,IACtDE,EAAa,GACjB,CAEA,GAAIA,GAAcD,EAAkBD,EAAgB,CAClD,IAAIK,EAAI,EACR,OAAKH,IACHG,GAAKL,EAAiB,KAAOC,EAAkB,IAAM,IAChDF,EAAgB,IAAKjB,IACtBA,EAAE,KAAO,YAAc,CAACA,EAAE,SACvBA,EAAE,SAAQA,EAAE,OAASA,EAAE,OAC5BA,EAAE,MAAQA,EAAE,OAASuB,GAEhBvB,EACR,CACH,CACF,CACA,OAAOiB,CACT,EAAG,CAACjF,EAAS6D,GAAMkB,GAAY5E,EAAaJ,EAAO4C,CAAS,CAAC,EAEvD6C,EAAiBtD,EAAAA,YACpBuD,GAAY,CACX,GAAI,CAACX,KAAa,CAChB,MAAMY,EAAiBV,GAAW,OAAO,CAACM,EAAKnG,KACzCsG,GAAWtG,EAAI,SAAQA,EAAI,OAASA,EAAI,OACrCmG,GAAOnG,EAAI,OAAS,EAAIA,EAAI,QAClC,CAAC,EACAuG,IAAmBvF,GAAaC,EAAmBsF,CAAc,CACvE,CACA1C,EAAc,EAAI,EAClBA,EAAc,EAAK,CACrB,EACA,CAAC8B,GAAWE,GAAY7E,EAAaC,CAAkB,CAAA,EAGnDuF,EAAgBzD,EAAAA,YAAY,IAAM,CACrB2B,GAAK,OAAQG,GAAMA,EAAE,UAAY,CAACA,EAAE,MAAM,EAC9C,SAAW,GACtBH,GAAK,QAASG,GAAM,CACdA,EAAE,QAAU,CAACA,EAAE,UAAY,CAACA,EAAE,SAAQA,EAAE,MAAQA,EAAE,OACxD,CAAC,CACL,EAAG,CAACH,EAAI,CAAC,EAEH+B,GAAa1D,EAAAA,YAChBI,GAAM,CACL,GAAI,CAACzC,EAAU,CACb,MAAMsC,EAAKI,EAAAA,SAASD,CAAC,EACfrD,EAASsD,EAAAA,SAASD,EAAG,aAAa,EAEpC,EADcrD,GAAU4E,GAAK,KAAMG,GAAMA,EAAE,KAAO/E,CAAM,IAC5C,QAAUkD,KAAQ,KAAK,cAAe,CAAE,GAAAA,EAAI,CAC9D,CACF,EACA,CAACtB,EAAKhB,EAAUgE,EAAI,CAAA,EAGhBgC,EAAMnG,EAAAA,QACV,IAAO,MAAM,QAAQyB,CAAW,EAAIA,EAAY,IAAK2E,GAAMA,EAAE,EAAE,EAAI,CAAA,EACnE,CAAC3E,CAAW,CAAA,EAGR4E,GAAkB7D,EAAAA,YAAY,IAAM,CACxC,GAAIM,EAAS,SAAWY,IAAa,KAAM,CACzC,MAAM4C,EAAOxD,EAAS,QAAQ,cAAc,UAAU,EAClDwD,IACFA,EAAK,MAAM,IAAM,GAAGjF,GAAgB,IAAMoD,IAAe,IAAM,KACnE,CACF,EAAG,CAACf,EAAUrC,EAAcoD,EAAW,CAAC,EAExClB,EAAAA,UAAU,IAAM,CACVT,EAAS,SACXuD,GAAA,CAEJ,EAAG,CAAChF,EAAcoD,GAAa4B,EAAe,CAAC,EAE/C9C,EAAAA,UAAU,IAAM,CACd,MAAMgD,EAAUzD,EAAS,QACzB,GAAI,CAACyD,EAAS,OACd,MAAMC,EAASD,EAAQ,cAAc,wBAAwB,EAC7D,GAAI,CAACC,GAAU,OAAO,eAAmB,IAAa,OACtD,MAAM/C,EAAK,IAAI,eAAe,IAAM,CAClC4C,GAAA,CACF,CAAC,EACD,OAAA5C,EAAG,QAAQ+C,CAAM,EACV,IAAM,CACX/C,EAAG,WAAA,CACL,CACF,EAAG,CAAC6B,GAAYV,GAAYtE,EAASwE,GAAOpB,EAAU2C,EAAe,CAAC,EAEtE,MAAMI,GAAkB1D,EAAAA,OAAO,EAAK,EACpCQ,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC/B,GAAa,CAACZ,EAAU,OAE7B,KAAM,CAAE,GAAA6B,EAAI,OAAAlD,CAAA,EAAWiC,EACnBjC,IACGkH,GAAgB,UACnBA,GAAgB,QAAU,GAC1B,sBAAsB,IAAM,CAC1B,MAAMC,EAAY9F,EAAS,SAAA,EAAW,UACtCA,EAAS,KAAK,aAAc,CAC1B,IAAK6B,EACL,OAAQiE,GAAW,QAAUvC,GAAK,CAAC,GAAG,EAAA,CACvC,EACDsC,GAAgB,QAAU,EAC5B,CAAC,GAGP,EAAG,CAACjF,EAAWZ,CAAQ,CAAC,EAExB,MAAM+F,GAAenE,EAAAA,YACnB,CAAC,CAAE,GAAAC,CAAA,IAAS,CACV,GAAItC,EAAU,MAAO,GAEjBgB,EAAI,QAAQsB,CAAE,EAAE,MAAMtB,EAAI,KAAK,YAAa,CAAE,GAAAsB,EAAI,KAAM,EAAA,CAAO,EAEnE,MAAMkB,EAAIxC,EAAI,SAAA,EAAW,OAAO,KAAMwC,GAAMA,EAAE,KAAOlB,CAAE,EAEvD,GADAJ,EAAYsB,GAAK,IAAI,EACjB,CAACA,EAAG,MAAO,EACjB,EACA,CAACxC,EAAKhB,CAAQ,CAAA,EAGVyG,GAAapE,EAAAA,YACjB,CAAC,CAAE,GAAAC,EAAI,IAAA7D,KAAU,CACXiF,GAAc,QAChBC,GAAa,CAAE,GAAGD,GAAc,QAAS,OAAQ,GAAO,EAExD1C,EAAI,KAAK,YAAa,CACpB,GAAAsB,EACA,IAAK7D,GAAO6F,IAAe,GAC3B,WAAY,EAAA,CACb,EAEHpC,EAAY,IAAI,CAClB,EACA,CAAClB,EAAK2C,GAAcW,EAAW,CAAA,EAG3BoC,GAAcrE,EAAAA,YAClB,CAAC,CAAE,GAAAC,EAAI,IAAA7D,EAAK,OAAAlB,KAAa,CACnBA,GACFoG,GAAa,CAAE,GAAGpG,EAAQ,OAAQ,GAAM,EAE1CyD,EAAI,KAAK,YAAa,CACpB,GAAAsB,EACA,IAAK7D,GAAO6F,IAAe,GAC3B,WAAY,EAAA,CACb,CACH,EACA,CAACtD,EAAK2C,GAAcW,EAAW,CAAA,EAGjClB,EAAAA,UAAU,IAAM,CACd,MAAM5G,EAAOmG,EAAS,QACtB,OAAKnG,EACUQ,GAAQR,EAAM,CAC3B,MAAOgK,GACP,IAAKC,GACL,KAAMC,GACN,QAAS1F,EAAI,OAAA,CACd,EACa,QAPH,MAQb,EAAG,CAACA,EAAKwF,GAAcC,GAAYC,EAAW,CAAC,EAE/C,MAAMC,GAAetE,EAAAA,YAClB3F,GAAO,CACN,KAAM,CAAE,IAAAoI,EAAK,QAAA8B,CAAA,EAAYlK,EACzB,GAAI,CAACkK,IAAY9B,IAAQ,WAAaA,IAAQ,aAC5C,OAAApI,EAAG,YAAc,OACjBsE,EAAI,KAAK,SAAUtE,CAAE,EACd,GACT,GAAWoI,IAAQ,QAAS,CAC1B,MAAMyB,EAAY9F,GAAU,SAAA,EAAW,UACvC,GAAI8F,EAAW,CACb,KAAM,CAAE,IAAApH,EAAK,OAAAC,CAAA,EAAWmH,EACpBnH,IAAW,WACbgD,EAAWjD,EAAK,UAAU,EACjBC,IAAW,QACpBgD,EAAWjD,EAAK,WAAW,CAE/B,CACF,CACF,EACA,CAAC6B,EAAKoB,EAAY3B,CAAQ,CAAA,EAItBoG,GAAmBjE,EAAAA,OAAO,IAAI,EAC9BkE,GAAmB,IAAM,CAC7BD,GAAiB,QAAU,CACzB,YAAAnG,EACA,aAAAiG,GACA,QAAA/E,EACA,IAAAZ,EACA,cAAA8E,EACA,eAAAH,EACA,MAAAxD,EACA,YAAAN,EACA,gBAAAC,EACA,cAAAC,GACA,iBAAA1B,CAAA,CAEJ,EACAyG,GAAA,EACA1D,EAAAA,UAAU,IAAM,CACd0D,GAAA,CACF,EAAG,CACDpG,EACAiG,GACA/E,EACAZ,EACA8E,EACAH,EACAxD,EACAN,EACAC,EACAC,GACA1B,CAAA,CACD,EAED,MAAM0G,GAAO1E,cAAa2E,GAAS,CACjCtG,EAAYsG,CAAI,EAChBA,EAAK,UAAU,SAAWtK,GAAOmK,GAAiB,QAAQ,aAAanK,CAAE,CAAC,EAC1EsK,EAAK,UAAU,SAAU,IAAM,EAAK,EACpCA,EAAK,UAAU,aAAc,IAAM,EAAK,EACxCA,EAAK,UAAU,YAAcvE,GAAM,CACjC,MAAMb,EAAUiF,GAAiB,QAAQ,QACnC,CAAE,IAAA/B,EAAK,IAAAmC,CAAA,EAAQxE,EACfyE,EAAUtF,EAAUA,EAAQ,KAAMuF,IAAMA,GAAE,MAAQrC,CAAG,EAAI,KAC/D,IAAIC,EAAQ,MACZ,OAAImC,IAASnC,EAAQ,CAACmC,GAAWA,EAAQ,QAAU,MAAQ,OAAS,OAEpElG,EAAI,KAAK,aAAc,CACrB,IAAA8D,EACA,MAAAC,EACA,IAAAkC,CAAA,CACD,EACM,EACT,CAAC,EACDD,EAAK,UAAU,cAAgBtK,GAAO,CACpC,KAAM,CAAE,IAAAoI,EAAK,MAAAsC,CAAA,EAAU1K,EAEvB,OAAAsE,EAAI,KAAK,eAAgB,CACvB,IAAA8D,EACA,MAAAsC,EACA,KAAM,EAAA,CACP,EACM,EACT,CAAC,EAEDJ,EAAK,GAAG,gBAAiB,IAAM,CAC7BH,GAAiB,QAAQ,eAAe,EAAI,CAC9C,CAAC,EAEDG,EAAK,GAAG,cAAgBtK,GAAO,CACxBA,EAAG,MAAMmK,GAAiB,QAAQ,cAAA,EACvCA,GAAiB,QAAQ,eAAA,CAC3B,CAAC,EAEDG,EAAK,UAAU,cAAgBvE,GAAM,CACnC,KAAM,CAAE,GAAAH,EAAI,OAAAlD,EAAQ,MAAAgI,CAAA,EAAU3E,EACxB/D,EAAOmI,GAAiB,QAAQ,MAAM,KAAMrD,GAAMA,EAAE,KAAOlB,CAAE,EAEnE,GAAI5D,EAAM,CACR,MAAM2E,EAAS,CAAE,GAAG3E,CAAA,EACpB,IAAI2I,GAAID,EACJC,IAAK,CAAC,MAAMA,EAAC,GAAK,EAAEA,cAAa,QAAOA,IAAK,GACjDhE,EAAOjE,CAAM,EAAIiI,GAEjBC,GAAAA,gBACEjE,EACA,CACE,SAAUwD,GAAiB,QAAQ,YACnC,aAAcA,GAAiB,QAAQ,gBACvC,WAAYA,GAAiB,QAAQ,aAAA,EAEvCzH,CAAA,EAGF4B,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,KAAMe,CAAA,CACP,CACH,CACA,MAAO,EACT,CAAC,EAEDhD,GAAoBA,EAAiB2G,CAAI,CAC3C,EAAG,CAAA,CAAE,EAEL,OACEvH,EAAAA,IAAC,MAAA,CACC,UAAU,iCACV,MAAO,CAAE,KAAM,OAAOkF,EAAK,EAAA,EAC3B,IAAK9B,EAEL,SAAApD,EAAAA,IAAC,MAAA,CACC,IAAKkD,EACL,MAAO8B,GACP,UAAU,uBACV,QAAAjC,EACA,cAAeuD,GAEf,SAAAtG,EAAAA,IAAC8H,GAAAA,KAAA,CACC,KAAAR,GACA,MAAO,CACL,UAAW3F,EACX,cACGmD,IAAgB,IAAM7C,GAAmB,EAAA,EAE9C,SAAWvC,GACTA,EAAI,SAAW,8BAAgC,cAEjD,YAAcG,GACZ,uBAAuBA,EAAI,KAAK,GAAGA,EAAI,KAAO,WAAa,aAAe,EAAE,GAE9E,KAAMiE,EACN,QAAS4B,GACT,aAAc,CAAC,GAAGa,CAAG,EACrB,UAAApB,GACA,aAAcI,EAAA,CAAA,CAChB,CAAA,CACF,CAAA,CAGN,CC9lBA,SAASwC,GAAS,CAAE,QAAAC,EAAU,IAAM,CAClC,MAAMzG,EAAMH,EAAAA,WAAWI,EAAY,EAC7ByG,EAAYvG,EAAAA,SAASH,EAAK,WAAW,EACrC2G,EAAaxG,EAAAA,SAASH,EAAK,YAAY,EAEvC4G,EAAUhF,EAAAA,OAAO,IAAI,EACrB,CAACiF,EAAOC,CAAQ,EAAInH,EAAAA,SAAS,SAAS,EAE5CyC,EAAAA,UAAU,IAAM,CACd,GAAI,OAAO,iBAAqB,KAAewE,EAAQ,QAAS,CAC9D,MAAMG,EAAS,iBAAiBH,EAAQ,OAAO,EAAE,iBAC/C,mBAAA,EAEFE,EAASC,EAASA,EAAO,UAAUA,EAAO,QAAQ,GAAG,CAAC,EAAI,WAAW,CACvE,CACF,EAAG,CAAA,CAAE,EAEL,MAAMrD,EAAQ,CACZ,MAAO,OACP,OAAQ,OACR,WACEgD,GAAa,MAAQC,GAAc,KAC/B,OAAOK,GAAAA,KAAKN,EAAWC,EAAYE,EAAOJ,CAAO,CAAC,IAClD,OACN,SAAU,UAAA,EAGZ,OAAOhI,EAAAA,IAAC,MAAA,CAAI,IAAKmI,EAAS,MAAAlD,CAAA,CAAc,CAC1C,CC3BA,SAAwBuD,GAAM,CAAE,aAAAC,EAAc,aAAAC,EAAc,SAAAnI,GAAY,CACtE,MAAMgB,EAAMH,EAAAA,WAAWI,EAAY,EAC7BmH,EAAQjH,EAAAA,SAASH,EAAK,QAAQ,EAC9BqH,EAAelH,EAAAA,SAASH,EAAK,cAAc,EAE3CsH,EAAkB1F,EAAAA,OAAO,IAAI,EAE7B2F,EAAiBlG,EAAAA,YACpB1E,GAAU,CACT,MAAM6K,EAAM7K,GAAO,QAAQ,UACvB,CAAC6K,GAAK,SAAS,SAAS,GAAK,CAACA,GAAK,SAAS,kBAAkB,GAChEN,EAAa,IAAI,CAErB,EACA,CAACA,CAAY,CAAA,EAGf9E,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACpD,GAAYmI,GAAgBG,EAAgB,QAAS,CACxD,MAAMG,EAAW9K,GAAU,CAEvB2K,EAAgB,SAChB,CAACA,EAAgB,QAAQ,SAAS3K,EAAM,MAAM,GAE9C4K,EAAe5K,CAAK,CAExB,EACA,gBAAS,iBAAiB,QAAS8K,CAAO,EACnC,IAAM,CACX,SAAS,oBAAoB,QAASA,CAAO,CAC/C,CACF,CACF,EAAG,CAACzI,EAAUmI,EAAcI,CAAc,CAAC,EAGzC/I,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,EAAA4I,GAAS,CAAA,GAAI,IAAKM,GAAS,CAC3B,MAAMC,EACJ,uBACCN,GAAgBK,EAAK,SAAW,eAAiB,KAChD1I,EAAmC,GAAxB,uBACf,OACEP,EAAAA,IAAC,WAAA,CACC,UAAAkJ,EACA,OAAQD,EAAK,GAEb,QAAS,IAAM,CAAC1I,GAAYkI,EAAaQ,EAAK,EAAE,EAChD,eAAcE,EAAAA,MAAMF,EAAK,EAAE,CAAA,EAFtBA,EAAK,EAAA,CAKhB,CAAC,EACA,CAAC1I,GAAYmI,GACZ1I,EAAAA,IAAC,WAAA,CACC,IAAK6I,EACL,UAAU,yEACV,OAAQH,EAAa,EAAA,CAAA,CACvB,EAEJ,CAEJ,CChEA,SAASU,GAAY9I,EAAO,CAC1B,KAAM,CAAE,KAAArB,EAAM,KAAAoK,CAAA,EAAS/I,EAEvB,SAASgJ,EAAaC,EAAG,CACvB,MAAM7B,EAAIzI,EAAK,SAASsK,CAAC,EACzB,MAAO,CACL,KAAM,GAAG7B,EAAE,EAAE,KACb,IAAK,MACL,MAAO,GAAGA,EAAE,EAAE,KACd,OAAQ,MAAA,CAEZ,CAEA,SAAS8B,EAAeC,EAAc,CACpC,GAAI,CAACxK,EAAK,SAAU,MAAO,GAE3B,MAAMyK,EAAYzK,EAAK,SAAWA,EAAK,SAAY,IAC7C0K,EAAW1K,EAAK,SACtB,IAAI2K,EAAW,EACbL,EAAI,EACJM,EAAS,KACX,EAAG,CACD,MAAMnC,EAAIiC,EAASJ,CAAC,EAChBA,IAAME,IACJG,EAAWF,EAAUG,EAAS,EAC7BA,EAAS,KAAK,KAAKH,EAAWE,GAAYlC,EAAE,SAAU,CAAC,EAAI,KAElEkC,GAAYlC,EAAE,SACd6B,GACF,OAASM,IAAW,MAAQN,EAAII,EAAS,QACzC,OAAOE,GAAU,CACnB,CAEA,OACE7J,MAAC,OAAI,UAAU,0BACZ,WAAK,SAAS,IAAI,CAAC8J,EAAKP,IACvBxJ,EAAAA,KAAC,MAAA,CAEC,UAAW,wBAAwBsJ,CAAI,eACvC,eAAcE,EACd,MAAOD,EAAaC,CAAC,EAEpB,SAAA,CAAAtK,EAAK,SACJe,MAAC,MAAA,CAAI,UAAU,sBACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,kCACV,MAAO,CAAE,MAAO,GAAGwJ,EAAeD,CAAC,CAAC,GAAA,CAAI,CAAA,EAE5C,EACE,WACH,MAAA,CAAI,UAAU,aAAc,SAAAO,EAAI,MAAQ,EAAA,CAAG,CAAA,CAAA,EAbvCP,CAAA,CAeR,EACH,CAEJ,CCzDA,SAASQ,GAAQzJ,EAAO,CACtB,KAAM,CAAE,OAAA0J,EAAQ,OAAAC,CAAA,EAAW3J,EAE3B,OACEN,EAAAA,IAAC,MAAA,CACC,kBAAiBgK,EAAO,GACxB,UAAW,4BAA4BA,EAAO,IAAI,UAClD,MAAO,CACL,KAAM,GAAGA,EAAO,SAAS,KACzB,IAAK,GAAGC,EAAO,GAAKA,EAAO,GAAKD,EAAO,kBAAkB,KACzD,MAAO,GAAGA,EAAO,SAAS,KAC1B,OAAQ,GAAGA,EAAO,SAAS,IAAA,CAC7B,CAAA,CAGN,CCIA,SAASE,GAAK5J,EAAO,CACnB,KAAM,CAAE,SAAAC,EAAU,aAAc4J,CAAA,EAAiB7J,EAE3CiB,EAAMH,EAAAA,WAAWI,EAAY,EAE7B,CAAC4I,EAAaC,CAAa,EAAIC,EAAAA,oBAAoB/I,EAAK,QAAQ,EAChE,CAACgJ,EAAaC,CAAa,EAAIF,EAAAA,oBAAoB/I,EAAK,QAAQ,EAChEkJ,EAAY/I,EAAAA,SAASH,EAAK,MAAM,EAChCmJ,EAAchJ,EAAAA,SAASH,EAAK,SAAS,EACrCoJ,EAAiBjJ,EAAAA,SAASH,EAAK,WAAW,EAC1CqJ,EAAiBlJ,EAAAA,SAASH,EAAK,WAAW,EAC1CsJ,EAAgBnJ,EAAAA,SAASH,EAAK,WAAW,EACzCuJ,EAAUpJ,EAAAA,SAASH,EAAK,SAAS,EACjCwJ,EAAWrJ,EAAAA,SAASH,EAAK,UAAU,EACnCyJ,EAAiBtJ,EAAAA,SAASH,EAAK,WAAW,EAC1CqH,EAAelH,EAAAA,SAASH,EAAK,cAAc,EAC3C0J,EAAOvJ,EAAAA,SAASH,EAAK,OAAO,EAC5B2J,EAAWxJ,EAAAA,SAASH,EAAK,UAAU,EACnC4J,EAAazJ,EAAAA,SAASH,EAAK,YAAY,EACvC6J,EAAU1J,EAAAA,SAASH,EAAK,SAAS,EACjC8J,EAAQ3J,EAAAA,SAASH,EAAK,OAAO,EAE7BmB,EAAQtC,EAAAA,QAAQ,IAAM,CAC1B,GAAI,CAACqK,GAAa,CAAC,MAAM,QAAQL,CAAW,QAAU,CAAA,EACtD,MAAMkB,EAAQb,EAAU,OAAS,EAC3B9L,EAAM8L,EAAU,KAAO,EAC7B,OAAOL,EAAY,MAAMkB,EAAO3M,CAAG,EAAE,IAAKmE,IAAO,CAAE,GAAGA,CAAA,EAAI,CAC5D,EAAG,CAACuH,EAAeI,CAAS,CAAC,EAEvBc,EAAkBnL,EAAAA,QACtB,IAAMsK,EAAY,gBAClB,CAACA,CAAW,CAAA,EAGRc,EAAqBrI,EAAAA,OAAO,EAAK,EAEjC,CAACsI,EAAUC,EAAW,EAAIxK,EAAAA,SAAS,MAAS,EAC5C,CAACyK,EAAUC,CAAW,EAAI1K,EAAAA,SAAS,IAAI,EACvC2K,EAAkB1I,EAAAA,OAAO,IAAI,EAE7B,CAAC2I,EAAgBC,CAAiB,EAAI7K,EAAAA,SAAS,IAAI,EAEnDwH,EAAetI,EAAAA,QAAQ,IAEzB0L,GAAkB,CAChB,GAAGvB,EAAY,KAAMtB,GAASA,EAAK,KAAO6C,CAAc,CAAA,EAG3D,CAACA,EAAgBtB,CAAa,CAAC,EAE5B,CAACzM,EAASiO,CAAU,EAAI9K,EAAAA,SAAS,MAAS,EAC1C+K,EAAgB9I,EAAAA,OAAO,IAAI,EAE3B,CAAC+I,GAAYC,CAAa,EAAIjL,EAAAA,SAAS,CAAC,EAExCkL,EAAejJ,EAAAA,OAAO,IAAI,EAE1BkJ,EAAWjM,EAAAA,QAAQ,IAAM,CAC7B,MAAMkM,EAAKF,EAAa,QACxB,MAAO,CAAC,EACNvB,EAAc,QACdyB,GACAA,EAAG,SAAS,SAAS,aAAa,EAEtC,EAAG,CAACzB,EAAeuB,EAAa,OAAO,CAAC,EAElCG,EAAUnM,EAAAA,QAAQ,IACfiM,GAAYxB,EAAcA,EAAc,OAAS,CAAC,GAAG,GAC3D,CAACwB,EAAUxB,CAAa,CAAC,EAE5BlH,EAAAA,UAAU,IAAM,CACd,GAAKqH,GACDA,EAAe,SAAW,GAAO,CACnC,KAAM,CAAE,GAAAnI,GAAOmI,EACTjO,EAAOqP,EAAa,SAAS,cACjC,oBAAoBjD,EAAAA,MAAMtG,CAAE,CAAC,IAAA,EAE3B9F,GAAMA,EAAK,MAAM,CAAE,cAAe,GAAM,CAC9C,CACF,EAAG,CAACiO,CAAc,CAAC,EAEnBrH,EAAAA,UAAU,IAAM,CACd,MAAM2I,EAAKF,EAAa,QACxB,GAAKE,IACLH,EAAcG,EAAG,aAAe,CAAC,EAC7B,OAAO,eAAmB,KAAa,CACzC,MAAMzI,EAAK,IAAI,eAAgB2I,GAAY,CACrCA,EAAQ,CAAC,GACXL,EAAcK,EAAQ,CAAC,EAAE,YAAY,KAAK,CAE9C,CAAC,EACD,OAAA3I,EAAG,QAAQyI,CAAE,EACN,IAAMzI,EAAG,WAAA,CAClB,CACF,EAAG,CAACuI,EAAa,OAAO,CAAC,EAEzB,MAAMK,EAAY7J,EAAAA,YAAY,IAAM,CAClC,SAAS,KAAK,MAAM,WAAa,MACnC,EAAG,CAAA,CAAE,EAEC8J,GAAU9J,EAAAA,YAAY,IAAM,CAChC,SAAS,KAAK,MAAM,WAAa,EACnC,EAAG,CAAA,CAAE,EAEC+J,GAAc/J,EAAAA,YAClB,CAAC7F,EAAMiG,EAAG/D,IAAS,CAGjB,GAFI+D,EAAE,OAAO,UAAU,SAAS,SAAS,IACpC/D,IAAMA,EAAOsC,EAAI,QAAQlE,EAAAA,MAAMN,CAAI,CAAC,GACrCkC,EAAK,OAAS,aAAeA,EAAK,OAAS,WAAW,MAAO,GAEjE,MAAM2N,EAAcxO,EAAAA,OAAO4E,EAAG,cAAc,EACxC4J,IAAa7P,EAAO6P,GAExB,KAAM,CAAE,KAAAC,EAAM,MAAApM,GAAU1D,EAAK,sBAAA,EACvB+P,GAAK9J,EAAE,QAAU6J,GAAQpM,EAC/B,IAAIsM,GAAQ,IAAOtM,EAAQ,IAAMA,EAAQ,IAAM,GAC/C,OAAIqM,EAAIC,GAAc,QAClBD,EAAI,EAAIC,GAAc,MACnB,EACT,EACA,CAACxL,CAAG,CAAA,EAGAtD,GAAO2E,EAAAA,YACX,CAAC7F,EAAMiQ,IAAU,CACf,KAAM,CAAE,QAAAC,GAAYD,EACdnK,EAAKxF,EAAAA,MAAMN,CAAI,EACfkC,EAAOsC,EAAI,QAAQsB,CAAE,EACrBkG,EAAMiE,EAAM,OAAO,UACzB,GAAI,CAAAA,EAAM,OAAO,QAAQ,mBAAmB,GACxC,CAACzM,EAAU,CACb,GAAIwI,EAAI,SAAS,oBAAoB,EAAG,CACtC,KAAM,CAAE,SAAAW,CAAA,EAAanI,EAAI,QAAQsB,CAAE,EACnCgJ,EAAgB,QAAU,CACxB,GAAAhJ,EACA,EAAGoK,EACH,SAAAvD,EACA,GAAI,EACJ,KAAA3M,EACA,OAAQiQ,EAAM,MAAA,EAEhBA,EAAM,OAAO,UAAU,IAAI,qBAAqB,CAClD,KAAO,CACL,MAAM5I,EAAOuI,GAAY5P,EAAMiQ,EAAO/N,CAAI,GAAK,OAEzCiO,GAAc,CAClB,GAAArK,EACA,KAAAuB,EACA,EAAG6I,EACH,GAAI,EACJ,EAAGhO,EAAK,GACR,EAAGA,EAAK,EAAA,EAGV,GAAIkM,GAAclM,EAAK,UAAU,OAAQ,CACvC,MAAMkO,GAAU/O,EAAAA,OAAO4O,EAAO,cAAc,EACxCG,KACFD,GAAY,aAAeC,GAAQ,QAAQ,QAAa,EACxDC,GAAAA,kBAAkBnO,EAAMiO,EAAW,EAEvC,CAEAtB,EAAYsB,EAAW,CACzB,CACAT,EAAA,CACF,CACF,EACA,CAAClL,EAAKhB,EAAUoM,GAAaF,EAAWtB,CAAU,CAAA,EAG9CkC,GAAYzK,EAAAA,YACfI,GAAM,CACL,GAAIA,EAAE,SAAW,EAAG,OAEpB,MAAMjG,EAAOqB,EAAAA,OAAO4E,CAAC,EAChBjG,GAELkB,GAAKlB,EAAMiG,CAAC,CACd,EACA,CAAC/E,EAAI,CAAA,EAGDqP,GAAa1K,EAAAA,YAChBI,GAAM,CACL,MAAMjG,EAAOqB,EAAAA,OAAO4E,CAAC,EACjBjG,IACFkP,EAAc,QAAU,WAAW,IAAM,CACvCD,EAAW,EAAI,EACf/N,GAAKlB,EAAMiG,EAAE,QAAQ,CAAC,CAAC,CACzB,EAAG,GAAG,EAEV,EACA,CAAC/E,EAAI,CAAA,EAGDwK,GAAe7F,cAAaC,GAAO,CACvCkJ,EAAkBlJ,CAAE,CACtB,EAAG,CAAA,CAAE,EAEC3D,GAAK0D,EAAAA,YAAY,IAAM,CAC3B,GAAIiJ,EAAgB,QAAS,CAC3B,KAAM,CAAE,GAAA/M,EAAI,GAAA+D,EAAI,OAAA0K,EAAQ,MAAA5F,CAAA,EAAUkE,EAAgB,QAClDA,EAAgB,QAAU,KACtB,OAAOlE,EAAU,KAAe7I,GAClCyC,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,KAAM,CAAE,SAAU8E,CAAA,EAClB,WAAY,EAAA,CACb,EACH4F,EAAO,UAAU,OAAO,qBAAqB,EAE7C/B,EAAmB,QAAU,GAC7BkB,GAAA,CACF,SAAWf,EAAU,CACnB,KAAM,CAAE,GAAA9I,EAAI,KAAAuB,EAAM,GAAAtF,EAAI,EAAA0O,EAAG,EAAAC,EAAG,MAAAnC,EAAO,QAAAoC,EAAS,MAAArJ,EAAA,EAAUsH,EAEtD,GADAC,EAAY,IAAI,EACZN,EAAO,CACT,MAAMqC,GAAO,KAAK,MAAM7O,EAAKyM,CAAe,EAE5C,GAAI,CAACoC,GACHpM,EAAI,KAAK,YAAa,CACpB,GAAAsB,EACA,MAAO4K,EACP,KAAMD,EACN,WAAY,GACZ,GAAIE,GAAW,CAAE,aAAcrJ,EAAA,CAAM,CACtC,MACI,CACL,IAAIT,GAAS,CAAA,EACT3E,GAAOsC,EAAI,QAAQsB,CAAE,EACrB6K,IAASzO,GAAOA,GAAK,SAASoF,EAAK,GAEnCD,IAAS,QACXR,GAAO,MAAQ3E,GAAK,MACpB2E,GAAO,IAAM3E,GAAK,KACb2E,GAAOQ,CAAI,EAAInF,GAAKmF,CAAI,EAE/B7C,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,KAAA8K,GACA,KAAM/J,GACN,GAAI8J,GAAW,CAAE,aAAcrJ,EAAA,CAAM,CACtC,CACH,CACAmH,EAAmB,QAAU,EAC/B,CAEAkB,GAAA,CACF,CACF,EAAG,CAACnL,EAAKmL,GAASf,EAAUJ,CAAe,CAAC,EAEtC1M,GAAO+D,EAAAA,YACX,CAACI,EAAGgK,IAAU,CACZ,KAAM,CAAE,QAAAC,GAAYD,EAEpB,GAAI,CAACzM,EACH,GAAIsL,EAAgB,QAAS,CAC3B,KAAM,CAAE,KAAA9O,EAAM,EAAAa,EAAG,GAAAiF,CAAA,EAAOgJ,EAAgB,QAClC/M,EAAM+M,EAAgB,QAAQ,GAAKoB,EAAUrP,EAE7C+P,GAAO,KAAK,MAAO7O,EAAK/B,EAAK,YAAe,GAAG,EACrD,IAAI2M,GAAWmC,EAAgB,QAAQ,SAAW8B,GAClD9B,EAAgB,QAAQ,MAAQnC,GAAW,KAAK,IAC9C,KAAK,IAAI,EAAGA,EAAQ,EACpB,GAAA,EAGFnI,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,KAAM,CAAE,SAAA6G,EAAA,EACR,WAAY,EAAA,CACb,CACH,SAAWiC,EAAU,CACnBlD,GAAa,IAAI,EACjB,KAAM,CAAE,KAAArE,EAAM,EAAAoJ,EAAG,EAAAC,EAAG,EAAA7P,EAAG,GAAAiF,GAAI,MAAAyI,GAAO,QAAAoC,GAAS,MAAArJ,EAAA,EAAUsH,EAC/C1M,GAAOsC,EAAI,QAAQsB,EAAE,EACrB/D,GAAKmO,EAAUrP,EACfgQ,GAAW,KAAK,MAAMrC,CAAe,GAAK,EAChD,GACG,CAACD,IAAS,KAAK,IAAIxM,EAAE,EAAI,IACzBsF,IAAS,SAAWqJ,EAAI3O,GAAK8O,IAC7BxJ,IAAS,OAASqJ,EAAI3O,GAAK8O,IAC3BxJ,IAAS,SACNtF,GAAK,GAAK0O,EAAI1O,GAAK,GAClBA,GAAK,GAAK0O,EAAIC,EAAI3O,GAAKoN,KAC3BP,EAAS,SAAW,CAACkC,GAAAA,qBAAqB5O,GAAM0M,CAAQ,EAEzD,OAEF,MAAMmC,GAAe,CAAE,GAAGnC,EAAU,GAAA7M,EAAA,EAEpC,IAAI+N,GAAMpM,GAqBV,GApBI2D,IAAS,SACXyI,GAAOW,EAAI1O,GACX2B,GAAQgN,EAAI3O,IACHsF,IAAS,OAClByI,GAAOW,EACP/M,GAAQgN,EAAI3O,IACHsF,IAAS,SAClByI,GAAOW,EAAI1O,GACX2B,GAAQgN,GAGVlM,EAAI,KAAK,YAAa,CACpB,GAAAsB,GACA,MAAApC,GACA,KAAAoM,GACA,WAAY,GACZ,MAAAvB,GACA,GAAIoC,IAAW,CAAE,aAAcrJ,EAAA,CAAM,CACtC,EAGC,CAACyJ,GAAa,QACZ1J,IAAS,QAAUnF,GAAK,KAAOuO,GAC9BpJ,IAAS,QAAUnF,GAAK,KAAOwO,GAClC,CACAjC,EAAmB,QAAU,GAC7BtM,GAAA,EACA,MACF,CACA4O,GAAa,MAAQ,GACrBlC,EAAYkC,EAAY,CAC1B,KAAO,CACL,MAAMC,EAAW3P,EAAAA,OAAO4E,CAAC,EACzB,GAAI+K,EAAU,CACZ,MAAM9O,EAAOsC,EAAI,QAAQlE,EAAAA,MAAM0Q,CAAQ,CAAC,EAElCC,EADU5P,EAAAA,OAAO4E,EAAG,cAAc,GACb+K,EACrB3J,GAAOuI,GAAYqB,EAAShB,EAAO/N,CAAI,EAC7C+O,EAAQ,MAAM,OAAS5J,IAAQ,CAAC7D,EAAW,aAAe,SAC5D,CACF,CAEJ,EACA,CACEgB,EACAhB,EACAoL,EACAJ,EACAW,GACAS,GACAlE,GACAvJ,EAAA,CACF,EAGI+O,GAAYrL,EAAAA,YACfI,GAAM,CACLnE,GAAKmE,EAAGA,CAAC,CACX,EACA,CAACnE,EAAI,CAAA,EAGDqP,GAAYtL,EAAAA,YACfI,GAAM,CACDjF,GACFiF,EAAE,eAAA,EACFnE,GAAKmE,EAAGA,EAAE,QAAQ,CAAC,CAAC,GACXiJ,EAAc,UACvB,aAAaA,EAAc,OAAO,EAClCA,EAAc,QAAU,KAE5B,EACA,CAAClO,EAASc,EAAI,CAAA,EAGVsP,GAAUvL,EAAAA,YAAY,IAAM,CAChC1D,GAAA,CACF,EAAG,CAACA,EAAE,CAAC,EAEDkP,GAAWxL,EAAAA,YAAY,IAAM,CACjCoJ,EAAW,IAAI,EACXC,EAAc,UAChB,aAAaA,EAAc,OAAO,EAClCA,EAAc,QAAU,MAE1B/M,GAAA,CACF,EAAG,CAACA,EAAE,CAAC,EAEPyE,EAAAA,UAAU,KACR,OAAO,iBAAiB,UAAWwK,EAAO,EACnC,IAAM,CACX,OAAO,oBAAoB,UAAWA,EAAO,CAC/C,GACC,CAACA,EAAO,CAAC,EAEZ,MAAM7H,GAAa1D,EAAAA,YAChBI,GAAM,CACL,GAAI,CAACzC,EAAU,CACb,MAAMsC,EAAKI,EAAAA,SAASD,EAAE,MAAM,EAC5B,GAAIH,GAAM,CAACG,EAAE,OAAO,UAAU,SAAS,SAAS,EAAG,CACjD,MAAMyG,EAAexG,EAAAA,SAASD,EAAE,OAAQ,cAAc,EACtDzB,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,GAAI4G,IAAiB,MAAQ,CAAE,aAAAA,CAAA,CAAa,CAC7C,CACH,CACF,CACF,EACA,CAAClI,EAAKhB,CAAQ,CAAA,EAGV8N,GAAQ,CAAC,MAAO,MAAO,MAAO,KAAK,EACnCC,EAAc1L,EAAAA,YAAY,CAAC2L,EAAWC,IACnCH,IAAOE,EAAY,EAAI,IAAMC,EAAU,EAAI,EAAE,EACnD,CAAA,CAAE,EAECC,EAAgB7L,EAAAA,YACpB,CAACxD,EAAQoP,IAAY,CACnB,MAAM/Q,EAASgO,EAAS,GAClB8C,EAAY9C,EAAS,MAE3B,OAAIrM,IAAW3B,EAAe,GAEvB,CAAC,CAAC8M,EAAY,KAAMiD,GAEvBA,EAAE,SAAWpO,GACboO,EAAE,SAAW/P,GACb+P,EAAE,OAASc,EAAYC,EAAWC,CAAO,CAE5C,CACH,EACA,CAAC/C,EAAUjB,EAAe8D,CAAW,CAAA,EAGjCI,GAAmB9L,EAAAA,YAAY,IAAM,CACrC6I,GACFC,GAAY,IAAI,CAEpB,EAAG,CAACD,CAAQ,CAAC,EAEP1I,EAAUH,EAAAA,YACbI,GAAM,CACL,GAAIwI,EAAmB,QAAS,CAC9BA,EAAmB,QAAU,GAC7B,MACF,CAEA,MAAM3I,EAAKI,EAAAA,SAASD,EAAE,MAAM,EAC5B,GAAIH,EAAI,CACN,MAAMkG,EAAM/F,EAAE,OAAO,UACrB,GAAI+F,EAAI,SAAS,SAAS,EAAG,CAC3B,MAAMyF,EAAUzF,EAAI,SAAS,SAAS,EACtC,GAAI,CAAC0C,EAAU,CACbC,GAAY,CAAE,GAAA7I,EAAI,MAAO2L,CAAA,CAAS,EAClC,MACF,CAEI/C,EAAS,KAAO5I,GAAM,CAAC4L,EAAc5L,EAAI2L,CAAO,GAClDjN,EAAI,KAAK,WAAY,CACnB,KAAM,CACJ,OAAQkK,EAAS,GACjB,OAAQ5I,EACR,KAAMyL,EAAY7C,EAAS,MAAO+C,CAAO,CAAA,CAC3C,CACD,CAEL,SAAWzF,EAAI,SAAS,uBAAuB,EAC7CxH,EAAI,KAAK,cAAe,CAAE,GAAIuK,EAAgB,EAC9CC,EAAkB,IAAI,MACjB,CACL,MAAMtC,EAAexG,EAAAA,SAASD,EAAE,OAAQ,cAAc,EACtDzB,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,OAAQG,EAAE,SAAWA,EAAE,QACvB,MAAOA,EAAE,SACT,GAAIyG,IAAiB,MAAQ,CAAE,aAAAA,CAAA,CAAa,CAC7C,CACH,CACF,CACAiF,GAAA,CACF,EACA,CACEnN,EACAkK,EACAjB,EACA9B,EACA+F,EACAH,EACAI,EAAA,CACF,EAGIC,GAAY/L,cAAa3D,IACtB,CACL,KAAM,GAAGA,EAAK,EAAE,KAChB,IAAK,GAAGA,EAAK,EAAE,KACf,MAAO,GAAGA,EAAK,EAAE,KACjB,OAAQ,GAAGA,EAAK,EAAE,KAClB,WAAY,GAAGA,EAAK,EAAE,IAAA,GAEvB,CAAA,CAAE,EAEC2P,GAAgBhM,cAAa3D,IAC1B,CACL,KAAM,GAAGA,EAAK,OAAO,KACrB,IAAK,GAAGA,EAAK,OAAO,KACpB,MAAO,GAAGA,EAAK,OAAO,KACtB,OAAQ,GAAGA,EAAK,OAAO,IAAA,GAExB,CAAA,CAAE,EAEC4P,GAAajM,cAAa3D,IACvB,CACL,KAAM,GAAGA,EAAK,QAAQ,KACtB,IAAK,GAAGA,EAAK,EAAE,KACf,MAAO,GAAGA,EAAK,QAAQ,KACvB,OAAQ,GAAGA,EAAK,EAAE,IAAA,GAEnB,CAAA,CAAE,EAEC6P,GAAclM,EAAAA,YACjB3F,GAAO,CACN,GAAIc,GAAWkO,EAAc,QAC3B,OAAAhP,EAAG,eAAA,EACI,EAEX,EACA,CAACc,CAAO,CAAA,EAGJgR,GAAc3O,EAAAA,QAClB,IAAMuK,EAAe,IAAK,GAAM,EAAE,EAAE,EACpC,CAACA,CAAc,CAAA,EAGXqE,GAAcpM,EAAAA,YACjByG,GAAS,CACR,IAAIN,EAAMgG,GAAY,SAAS1F,CAAI,EAAIA,EAAO,OAC9C,MAAK,CAAC,OAAQ,YAAa,SAAS,EAAE,SAASA,CAAI,IACjDN,EAAM,QAAQA,CAAG,IAEZA,CACT,EACA,CAACgG,EAAW,CAAA,EAGRE,GAAUrM,EAAAA,YACb3F,GAAO,CACNsE,EAAI,KAAKtE,EAAG,OAAQA,EAAG,IAAI,CAC7B,EACA,CAACsE,CAAG,CAAA,EAGA2N,GAAiBtM,EAAAA,YACpB3D,GACQ2J,GAAgB3J,EAAK,SAE9B,CAAC2J,CAAY,CAAA,EAGTuG,GAAsBvM,EAAAA,YACzBC,GAAO,CACN,GAAIqI,GAAU,KAAM,CAClB,MAAMkE,EAAanE,EAAK,aAAapI,EAAI,EAAI,EACvCwM,EAAqBpE,EAAK,aAAaQ,EAAS,GAAI,EAAI,EAC9D,OACEA,GAAU,IACV,EAAE,MAAM,QAAQ2D,CAAU,EAAIA,EAAa,CAACA,CAAU,GAAG,SACvD3D,EAAS,EAAA,GAEX,EACE,MAAM,QAAQ4D,CAAkB,EAC5BA,EACA,CAACA,CAAkB,GACvB,SAASxM,CAAE,CAEjB,CACA,OAAO4I,CACT,EACA,CAACP,EAAUD,EAAMQ,CAAQ,CAAA,EAG3B,OACE1L,EAAAA,KAAC,MAAA,CACC,UAAU,sBACV,IAAKqM,EACL,cAAe0C,GACf,YAAazB,GACb,YAAaY,GACb,aAAcX,GACd,YAAaY,GACb,WAAYE,GACZ,QAAArL,EACA,cAAeuD,GACf,YAActD,IACZA,EAAE,eAAA,EACK,IAGR,SAAA,CAAAqI,EACG3I,EAAM,IAAKzD,GACTA,EAAK,cACHe,EAAAA,IAAC,MAAA,CAEC,UAAW,iCAAiCf,EAAK,IAAI,GACrD,MAAO4P,GAAW5P,CAAI,CAAA,EAFjBA,EAAK,EAAA,EAIV,IAAA,EAEN,KACJe,EAAAA,IAACwI,GAAA,CACC,aAAAC,GACA,aAAAC,EACA,SAAAnI,CAAA,CAAA,EAEDmC,EAAM,IAAKzD,GAAS,CACnB,GAAIA,EAAK,OAASA,EAAK,gBAAkB,EAAE6L,GAAWC,IAAW9L,EAAK,EAAE,GAAI,OAAO,KACnF,MAAMqQ,EACJ,aAAaN,GAAY/P,EAAK,IAAI,CAAC,IAClClB,GAAW4N,GAAY1M,EAAK,KAAO0M,EAAS,GAAK,YAAc,KAC/DF,GAAYA,EAAS,KAAOxM,EAAK,GAAK,eAAiB,KACvDiQ,GAAejQ,CAAI,EAAI,eAAiB,KACxCA,EAAK,SAAW,mBAAqB,KACrCkM,GAAclM,EAAK,SAAW,YAAc,IACzCsQ,EACJ,mBACC9D,EAAW,cAAgB,KAC3B,CAACA,GACC,CAACgD,EAAcxP,EAAK,GAAI,EAAI,GAAKkQ,GAAoBlQ,EAAK,EAAE,EAC3D,aACA,KACHwM,GAAYA,EAAS,KAAOxM,EAAK,IAAMwM,EAAS,MAC7C,eACA,KACHyD,GAAejQ,CAAI,EAAI,eAAiB,IACrCuQ,EACJ,oBACC/D,EAAW,cAAgB,KAC3B,CAACA,GACC,CAACgD,EAAcxP,EAAK,GAAI,EAAK,GAAKkQ,GAAoBlQ,EAAK,EAAE,EAC5D,aACA,KACHwM,GAAYA,EAAS,KAAOxM,EAAK,IAAM,CAACwM,EAAS,MAC9C,eACA,KACHyD,GAAejQ,CAAI,EAAI,eAAiB,IAC3C,OACEc,EAAAA,KAAC0P,WAAA,CACE,SAAA,CAAA,CAACxQ,EAAK,OACLc,EAAAA,KAAC,MAAA,CACC,UAAW,eAAiBuP,EAC5B,MAAOX,GAAU1P,CAAI,EACrB,UAASkK,EAAAA,MAAMlK,EAAK,EAAE,EACtB,kBAAiBkK,EAAAA,MAAMlK,EAAK,EAAE,EAC9B,SAAUsN,IAAYtN,EAAK,GAAK,EAAI,GAEnC,SAAA,CAACsB,EAcE,KAbFtB,EAAK,KAAOyJ,GAAc,QACxBA,GAAc,KAAK,CAAC,IAAM,IAC1B1I,EAAAA,IAAC0P,GAAAA,OAAA,CACC,KAAK,SACL,IAAI,0CAEJ,SAAA1P,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAA,CAAkC,CAAA,CAAA,EAGjDA,EAAAA,IAAC,MAAA,CAAI,UAAW,eAAiBuP,EAC/B,SAAAvP,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAA,CAAuB,CAAA,CACxC,EAIHf,EAAK,OAAS,YACbc,EAAAA,KAAA0P,EAAAA,SAAA,CACG,SAAA,CAAAxQ,EAAK,UAAY,EAAEkM,GAAclM,EAAK,UACrCe,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,kCACV,MAAO,CAAE,MAAO,GAAGf,EAAK,QAAQ,GAAA,CAAI,CAAA,EAExC,EACE,KACH,CAACsB,GACA,EAAE4K,GAAclM,EAAK,WACrB,EAAEA,EAAK,OAAS,WAAamM,GAAS,cACtCpL,EAAAA,IAAC,MAAA,CACC,UAAU,iCACV,MAAO,CAAE,KAAM,QAAQf,EAAK,QAAQ,WAAA,EAEnC,SAAAA,EAAK,QAAA,CAAA,EAEN,KACHkL,EACCnK,EAAAA,IAACmK,EAAA,CAAa,KAAMlL,EAAM,IAAAsC,EAAU,SAAU0N,EAAA,CAAS,EACrD9D,GAAclM,EAAK,SACrBe,EAAAA,IAACoJ,GAAA,CAAY,KAAAnK,EAAY,KAAM+P,GAAY/P,EAAK,IAAI,CAAA,CAAG,EAEvDe,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACZ,SAAAf,EAAK,MAAQ,EAAA,CAChB,CAAA,CAAA,CAEJ,EAEAc,EAAAA,KAAA0P,EAAAA,SAAA,CACE,SAAA,CAAAzP,EAAAA,IAAC,MAAA,CAAI,UAAU,wBAAA,CAAyB,EACvCmK,EACCnK,EAAAA,IAACmK,EAAA,CAAa,KAAMlL,EAAM,IAAAsC,EAAU,SAAU0N,EAAA,CAAS,EAEvDjP,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAK,IAAA,CAAK,CAAA,EAExD,EAGAO,EAcE,KAbFtB,EAAK,KAAOyJ,GAAc,QACxBA,GAAc,KAAK,CAAC,IAAM,IAC1B1I,EAAAA,IAAC0P,GAAAA,OAAA,CACC,KAAK,SACL,IAAI,2CAEJ,SAAA1P,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAA,CAAkC,CAAA,CAAA,EAGjDA,EAAAA,IAAC,MAAA,CAAI,UAAW,eAAiBwP,EAC/B,SAAAxP,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAA,CAAuB,CAAA,CACxC,CAEA,CAAA,CAAA,EAGP8K,GAAWC,IAAW9L,EAAK,EAAE,EAC1B8L,EAAS9L,EAAK,EAAE,EAAE,IAAI,CAAC+K,EAAQT,UAC5BQ,GAAA,CAAgB,OAAAC,EAAgB,OAAQ/K,CAAA,EAA3BsK,CAAiC,CAChD,EACD,KACHqB,GAAkB,CAAC3L,EAAK,eACvBe,EAAAA,IAAC,MAAA,CACC,UACE,2BACCf,EAAK,OAAS,YAAc,gBAAkB,IAEjD,MAAO2P,GAAc3P,CAAI,CAAA,CAAA,EAEzB,IAAA,CAAA,EAhGSA,EAAK,EAiGpB,CAEJ,CAAC,CAAA,CAAA,CAAA,CAGP,CCnvBA,SAAS0Q,GAAUrP,EAAO,CACxB,KAAM,CAAE,cAAAsP,GAAkBtP,EAEpBiB,EAAMH,EAAAA,WAAWI,EAAY,EAC7BqO,EAASnO,EAAAA,SAASH,EAAK,SAAS,EAEtC,aACG,MAAA,CAAI,UAAU,uBAAuB,MAAO,CAAE,MAAOsO,EAAO,KAAA,EACzD,aAAQ,MAAQ,CAAA,GAAI,IAAI,CAACnQ,EAAKoQ,IAC9B9P,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,MAAO,CAAE,OAAQ,GAAGN,EAAI,MAAM,IAAA,EAG5B,YAAI,OAAS,CAAA,GAAI,IAAI,CAACQ,EAAM6P,IAAY,CACxC,MAAMC,EAAaJ,EACfA,EAAc1P,EAAK,KAAMA,EAAK,IAAI,EAClC,GACEgJ,EACJ,YAAchJ,EAAK,KAAO,IAAM,KAAO8P,GAAc,IACvD,OACEhQ,EAAAA,IAAC,MAAA,CACC,UAAW,eAAiBkJ,EAC5B,MAAO,CAAE,MAAO,GAAGhJ,EAAK,KAAK,IAAA,EAG5B,SAAAA,EAAK,KAAA,EAFD6P,CAAA,CAKX,CAAC,CAAA,EAjBID,CAAA,CAmBR,EACH,CAEJ,CCrCA,MAAMG,GAAgB,IAAI,IAEnB,SAASC,GAAcC,EAAO,CACnC,MAAMC,EAAYjN,EAAAA,OAAO,IAAI,EACvBkN,EAAclN,EAAAA,OAAO,CAAC,EACtBmN,EAASnN,EAAAA,OAAO,IAAI,EAEpBoN,EACJ,OAAO,OAAW,KAAe,OAAO,2BAEtCH,EAAU,UAAY,OACxBA,EAAU,QAAU,YAAY,IAAG,GAErCC,EAAY,UAEZ1M,EAAAA,UAAU,IAAM,CACd,GAAK4M,EAEL,4BAAqBD,EAAO,OAAO,EAEnCA,EAAO,QAAU,sBAAsB,IAAM,CAC3C,MAAME,EAAS,CACb,MAAAL,EACA,KAAM,YAAY,IAAG,EAAKC,EAAU,QACpC,QAASC,EAAY,QACrB,UAAW,KAAK,IAAG,CAC3B,EAEMJ,GAAc,IAAIE,EAAOK,CAAM,EAE/B,OAAO,cACL,IAAI,YAAY,gBAAiB,CAAE,OAAQA,CAAM,CAAE,CAC3D,CACI,CAAC,EAEM,IAAM,qBAAqBF,EAAO,OAAO,CAClD,CAAC,CACH,CCpBA,SAASG,GAAMnQ,EAAO,CACpB,KAAM,CACJ,SAAAC,EACA,UAAAmQ,EACA,WAAAC,EACA,aAAAC,EACA,YAAAC,EACA,cAAAjB,CAAA,EACEtP,EAEEiB,EAAMH,EAAAA,WAAWI,EAAY,EAE7B,CAACsP,EAAUC,CAAe,EAAIzG,EAAAA,oBAAoB/I,EAAK,WAAW,EAClEyP,EAAatP,EAAAA,SAASH,EAAK,WAAW,EACtC0P,EAAcvP,EAAAA,SAASH,EAAK,YAAY,EACxC2G,EAAaxG,EAAAA,SAASH,EAAK,YAAY,EACvCsO,EAASnO,EAAAA,SAASH,EAAK,SAAS,EAChC2P,EAAUxP,EAAAA,SAASH,EAAK,UAAU,EAClC4P,EAAOzP,EAAAA,SAASH,EAAK,MAAM,EAE3B,CAAC6P,EAAaC,CAAc,EAAInQ,WAAA,EAChCoQ,EAAWnO,EAAAA,OAAO,IAAI,EACtBoO,EAAiBpO,EAAAA,OAAO,CAAE,IAAK,KAAM,KAAM,KAAM,EACjDqO,EAAkBrO,EAAAA,OAAO,EAAK,EAE9BsO,EAAY,EACZC,EAActR,EAAAA,QAAQ,IAAM,CAChC,MAAM2D,EAAI,CAAA,EACV,OAAI+M,GAAYA,EAAS,QAAU5I,GACjC4I,EAAS,QAASa,GAAQ,CACxB5N,EAAE,KAAK,CAAE,OAAQ,GAAGmE,CAAU,KAAM,IAAK,GAAGyJ,EAAI,GAAK,CAAC,IAAA,CAAM,CAC9D,CAAC,EAEI5N,CACT,EAAG,CAACgN,EAAiB7I,CAAU,CAAC,EAE1B0J,EAAkBxR,EAAAA,QACtB,IAAM,KAAK,IAAIgR,GAAe,EAAGT,CAAU,EAC3C,CAACS,EAAaT,CAAU,CAAA,EAG1BkB,EAAAA,gBAAgB,IAAM,CACpB,MAAMvF,EAAKgF,EAAS,QACpB,GAAKhF,EAEL,IAAIkF,EAAgB,QAAS,CAC3BA,EAAgB,QAAU,GAC1B,MACF,CAEI,OAAOR,GAAe,WACxBO,EAAe,QAAQ,IAAMP,EAC7B1E,EAAG,UAAY0E,GAEb,OAAOC,GAAgB,WACzBM,EAAe,QAAQ,KAAON,EAC9B3E,EAAG,WAAa2E,GAEpB,EAAG,CAACD,EAAYC,CAAW,CAAC,EAE5B,MAAMa,EAAW,IAAM,CACrBC,EAAA,EACAC,GAAA,CACF,EAEA,SAASD,GAAY,CACnB,MAAMzF,EAAKgF,EAAS,QACpB,GAAI,CAAChF,EAAI,OACT,MAAMrP,EAAK,CAAA,EAEPqP,EAAG,YAAciF,EAAe,QAAQ,MAAKtU,EAAG,IAAMqP,EAAG,WACzDA,EAAG,aAAeiF,EAAe,QAAQ,OAAMtU,EAAG,KAAOqP,EAAG,YAC3D,OAAO,KAAKrP,CAAE,EAAE,SAEjBA,EAAG,MAAQ,SAAWsU,EAAe,QAAQ,IAAMtU,EAAG,KACtDA,EAAG,OAAS,SAAWsU,EAAe,QAAQ,KAAOtU,EAAG,MAC5DuU,EAAgB,QAAU,GAC1BjQ,EAAI,KAAK,eAAgBtE,CAAE,EAC7B,CAEA,SAAS+U,IAAc,CACrB,MAAM1F,EAAKgF,EAAS,QAEdW,EAAM,KAAK,MADSb,GAAe,IACElJ,GAAc,EAAE,EAAI,EACzDgK,EAAM,KAAK,OAAQ5F,GAAMA,EAAG,WAAc,IAAMpE,GAAc,EAAE,EAChEoD,EAAQ,KAAK,IAAI,EAAG4G,EAAMT,CAAS,EACnC9S,GAAMuT,EAAMD,EAAMR,EAClBU,GAAO7G,GAASpD,GAAc,GACpC3G,EAAI,KAAK,cAAe,CACtB,MAAA+J,EACA,IAAA3M,GACA,KAAAwT,EAAA,CACD,CACH,CAEAxO,EAAAA,UAAU,IAAM,CACdqO,GAAA,CACF,EAAG,CAACZ,CAAW,CAAC,EAEhB,MAAMgB,EAAmBjP,EAAAA,OAAO,YAAY,IAAA,CAAK,EAC3CkP,EAAalP,EAAAA,OAAO,EAAK,EACzBmP,EAAgB,KAEtB,SAASC,EAAM5K,EAAO6K,EAAKC,EAAK,CAC9B,OAAO,KAAK,IAAI,KAAK,IAAI9K,EAAO8K,CAAG,EAAGD,CAAG,CAC3C,CAEA,SAASE,EAAcC,EAAS,CAE9B,MAAMC,EADa,KAAK,IAAID,CAAO,EAAI,GACN,KAAQ,IACnCE,EAAM,YAAY,IAAA,EAClBC,EAAK,KAAK,IAAID,EAAMT,EAAiB,QAAS,EAAE,EACtDA,EAAiB,QAAUS,EAC3B,MAAME,GAAaR,EACjB,CAACI,EAAUC,EACX,CAACN,EAAgBQ,EACjBR,EAAgBQ,CAAA,EAElB,OAAO,KAAK,IAAIC,EAAU,CAC5B,CAEA,MAAMC,EAAUpQ,cAAaI,GAAM,CACjC,GAAImO,IAASnO,EAAE,SAAWA,EAAE,SAAU,CACpCA,EAAE,eAAA,EACF,MAAMsJ,EAAKgF,EAAS,QACd2B,EAAQP,EAAc1P,EAAE,MAAM,EAC9BkQ,EAASlQ,EAAE,SAAWsJ,EAAKA,EAAG,sBAAA,EAAwB,KAAO,GAC9D+F,EAAW,UACdA,EAAW,QAAU,GACrB,sBAAsB,IAAM,CAC1B9Q,EAAI,KAAK,aAAc,CACrB,IAAK0R,EAAQ,EAAI,EAAI,GACrB,MAAO,KAAK,IAAI,EAAIA,CAAK,EACzB,OAAAC,CAAA,CACD,EACDb,EAAW,QAAU,EACvB,CAAC,EAEL,CACF,EAAG,CAAClB,EAAM5P,CAAG,CAAC,EAEd,SAAS4R,EAAWjT,EAAM,CACxB,MAAM+E,EAAQ2K,EAAc1P,EAAK,KAAMA,EAAK,IAAI,EAChD,OAAI+E,EACK,CACL,IAAKA,EACL,MAAO/E,EAAK,KAAA,EAET,IACT,CAEA,MAAMkT,EAAWhT,EAAAA,QAAQ,IAChByP,IACJA,EAAO,UAAY,QAAUA,EAAO,UAAY,QACjDD,EACEC,EAAO,KAAKA,EAAO,KAAK,OAAS,CAAC,EAAE,MAAM,IAAIsD,CAAU,EACxD,KACH,CAACtD,EAAQD,CAAa,CAAC,EAEpB1I,EAAetE,EAAAA,YAClB3F,GAAO,CACNA,EAAG,YAAc,QACjBsE,EAAI,KAAK,SAAUtE,CAAE,CACvB,EACA,CAACsE,CAAG,CAAA,EAGNoC,EAAAA,UAAU,IAAM,CACd,MAAM2I,EAAKgF,EAAS,QACpB,GAAI,CAAChF,EAAI,OACT,MAAM1I,EAAS,IAAMyN,EAAe/E,EAAG,YAAY,EACnD1I,EAAA,EACA,MAAMC,EAAK,IAAI,eAAe,IAAMD,GAAQ,EAC5C,OAAAC,EAAG,QAAQyI,CAAE,EACN,IAAM,CACXzI,EAAG,WAAA,CACL,CACF,EAAG,CAACyN,EAAS,OAAO,CAAC,EAErB,MAAM+B,GAAalQ,EAAAA,OAAO,IAAI,EAE9BQ,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAM2I,EAAKgF,EAAS,QACpB,GAAKhF,GACD,CAAA+G,GAAW,QACf,OAAAA,GAAW,QAAUC,GAAAA,QAAQhH,EAAI,CAC/B,KAAM,CACJ,QAAS,GACT,UAAW,EAAA,EAEb,KAAO1E,GAAMV,EAAaU,CAAC,CAAA,CAC5B,EACM,IAAM,CACXyL,GAAW,SAAS,QAAA,EACpBA,GAAW,QAAU,IACvB,CACF,EAAG,CAAA,CAAE,EAEL1P,EAAAA,UAAU,IAAM,CACd,MAAM5G,EAAOuU,EAAS,QACtB,GAAI,CAACvU,EAAM,OAEX,MAAMiM,EAAUgK,EAChB,OAAAjW,EAAK,iBAAiB,QAASiM,CAAO,EAC/B,IAAM,CACXjM,EAAK,oBAAoB,QAASiM,CAAO,CAC3C,CACF,EAAG,CAACgK,CAAO,CAAC,EAEZ9C,GAAc,OAAO,EAGnBnQ,EAAAA,KAAC,MAAA,CACC,UAAU,uBACV,SAAU,GACV,IAAKuR,EACL,SAAAQ,EAEA,SAAA,CAAA9R,EAAAA,IAACuT,GAAA,CAAW,cAAA3D,EAA8B,OAAAC,CAAA,CAAgB,EACzDqB,GAAWA,EAAQ,OAClBlR,EAAAA,IAAC,MAAA,CACC,UAAU,yBACV,MAAO,CAAE,OAAQ,GAAG4R,CAAe,IAAA,EAElC,SAAAV,EAAQ,IAAI,CAAC3D,EAAQhE,IACpBvJ,EAAAA,IAAC,MAAA,CAEC,UAAW,yBAAyBuN,EAAO,KAAO,EAAE,GACpD,MAAO,CAAE,KAAM,GAAGA,EAAO,IAAI,IAAA,EAE7B,SAAAvN,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAA0B,WAAO,IAAA,CAAK,CAAA,EAJhDuJ,CAAA,CAMR,CAAA,CAAA,EAED,KAEJxJ,EAAAA,KAAC,MAAA,CACC,UAAU,sBACV,MAAO,CAAE,MAAO,GAAG2Q,CAAS,KAAM,OAAQ,GAAGkB,CAAe,IAAA,EAE3D,SAAA,CAAAwB,EACCpT,EAAAA,IAAC,MAAA,CACC,UAAU,gCACV,MAAO,CAAE,OAAQ,MAAA,EAEhB,SAAAoT,EAAS,IAAI,CAACI,EAASjK,IACtBiK,EACExT,EAAAA,IAAC,MAAA,CAEC,UAAW,eAAiBwT,EAAQ,IACpC,MAAO,CACL,MAAO,GAAGA,EAAQ,KAAK,KACvB,KAAM,GAAGjK,EAAIiK,EAAQ,KAAK,IAAA,CAC5B,EALKjK,CAAA,EAOL,IAAA,CACN,CAAA,EAEA,KAEJvJ,EAAAA,IAAC+H,GAAA,CAAS,QAAS8I,CAAA,CAAa,EAE/BC,GAAYA,EAAS,OAClBA,EAAS,IAAI,CAACa,EAAKtN,IACjBsN,EAAI,GACF3R,EAAAA,IAAC,MAAA,CAEC,UAAU,0BACV,UAASmJ,EAAAA,MAAMwI,EAAI,EAAE,EACrB,MAAOD,EAAYrN,CAAK,CAAA,EAHnBsN,EAAI,EAAA,EAKT,IAAA,EAEN,KAEJ3R,EAAAA,IAACkK,GAAA,CAAK,SAAA3J,EAAoB,aAAAqQ,CAAA,CAA4B,CAAA,CAAA,CAAA,CACxD,CAAA,CAAA,CAGN,CCtSA,SAAS6C,GAAQnT,EAAO,CACtB,KAAM,CACJ,SAAAoT,EAAW,QACX,KAAAC,EAAO,EACP,IAAAC,EAAM,IACN,OAAAC,EACA,gBAAAC,EACA,YAAAtT,EACA,eAAAoF,EAAiB,EACjB,cAAAmO,EAAgB,GAChB,eAAAC,EAAiB,EAAA,EACf1T,EAEE,CAACqH,EAAOsM,CAAQ,EAAIlT,EAAAA,gBAAgBT,EAAM,OAAS,CAAC,EACpD,CAACI,EAASwT,CAAU,EAAInT,EAAAA,gBAAgBT,EAAM,SAAW,KAAK,EAEpE,SAAS6T,EAAOC,EAAK,CACnB,IAAIlB,EAAS,EACTQ,GAAY,SAAUR,EAASS,EAAO,EACjCD,GAAY,WAAUR,EAASS,GAExC,MAAMzW,EAAM,CACV,KAAM,CAACyW,EAAO,KAAM,MAAM,EAC1B,EAAG,CAACS,EAAMlB,EAAS,KAAM,KAAK,EAC9B,GAAI,CAAC,OAAQ,KAAK,CAAA,EAGpB,GAAIU,GAAO,IACT,QAASS,MAAQnX,EAAKA,EAAImX,EAAI,EAAInX,EAAImX,EAAI,EAAE,QAAA,EAE9C,OAAOnX,CACT,CAEA,KAAM,CAACoX,EAAQC,CAAS,EAAIrT,EAAAA,SAAS,EAAK,EACpC,CAACsT,EAAiBC,CAAkB,EAAIvT,EAAAA,SAAS,IAAI,EAErDwT,EAAWvR,EAAAA,OAAO,CAAC,EACnBwR,EAASxR,EAAAA,OAAA,EACTyR,EAAazR,EAAAA,OAAOzC,CAAO,EAEjCiD,EAAAA,UAAU,IAAM,CACdiR,EAAW,QAAUlU,CACvB,EAAG,CAACA,CAAO,CAAC,EAEZiD,EAAAA,UAAU,IAAM,CACV6Q,IAAoB,MAAQ7M,EAAQ,GACtC8M,EAAmB9M,CAAK,CAE5B,EAAG,CAAC6M,EAAiB7M,CAAK,CAAC,EAE3B,SAASkN,EAAY5X,EAAI,CACvB,OAAO2W,GAAO,IAAM3W,EAAG,QAAUA,EAAG,OACtC,CAEA,MAAM4B,EAAO+D,EAAAA,YACV3F,GAAO,CACN,MAAM6X,EAASH,EAAO,QAAUE,EAAY5X,CAAE,EAAIyX,EAAS,QAE3DT,EAASa,CAAM,EACf,IAAIC,EAEAD,GAAUf,EACZgB,EAAc,QACLnP,EAAiBkP,GAAUd,EACpCe,EAAc,OAEdA,EAAc,MAGZH,EAAW,UAAYG,IACzBb,EAAWa,CAAW,EACtBH,EAAW,QAAUG,GAGnBlB,KAAeiB,CAAM,CAC3B,EACA,CAAClP,EAAgBmO,EAAeC,EAAgBH,CAAM,CAAA,EAGlD3U,EAAK0D,EAAAA,YAAY,IAAM,CAC3B,SAAS,KAAK,MAAM,OAAS,GAC7B,SAAS,KAAK,MAAM,WAAa,GACjC2R,EAAU,EAAK,EACf,OAAO,oBAAoB,YAAa1V,CAAI,EAC5C,OAAO,oBAAoB,UAAWK,CAAE,CAC1C,EAAG,CAACL,CAAI,CAAC,EAEHmW,EAAS5U,EAAAA,QACb,IAAOM,IAAY,MAAQ,OAASkT,GAAO,IAAM,YAAc,YAC/D,CAAClT,EAASkT,CAAG,CAAA,EAGT3V,GAAO2E,EAAAA,YACV3F,GAAO,CAEF,CAACuD,IAAgBE,IAAY,QAAUA,IAAY,WAIvDgU,EAAS,QAAUG,EAAY5X,CAAE,EAEjC0X,EAAO,QAAUhN,EACjB4M,EAAU,EAAI,EAEd,SAAS,KAAK,MAAM,OAASS,EAC7B,SAAS,KAAK,MAAM,WAAa,OAEjC,OAAO,iBAAiB,YAAanW,CAAI,EACzC,OAAO,iBAAiB,UAAWK,CAAE,EACvC,EACA,CAAC8V,EAAQnW,EAAMK,EAAIyI,EAAOnH,EAAaE,CAAO,CAAA,EAGhD,SAASuU,GAAiB,CACxBf,EAAW,KAAK,EACZM,IAAoB,OACtBP,EAASO,CAAe,EACpBX,KAAeW,CAAe,EAEtC,CAEA,SAASU,EAAaC,EAAW,CAC/B,GAAI3U,EAAa,CACf,MAAM4U,EAAa1U,IAAY,QAAU,OAAS,QAClDwT,EAAWkB,CAAU,EACrBtB,EAAgBsB,CAAU,CAC5B,SACM1U,IAAY,QAAUA,IAAY,QACpCuU,EAAA,EACAnB,EAAgB,KAAK,MAChB,CACL,MAAMsB,EAAaD,IAAc,OAAS,QAAU,OACpDjB,EAAWkB,CAAU,EACrBtB,EAAgBsB,CAAU,CAC5B,CAEJ,CAEA,SAASC,GAAmB,CAC1BH,EAAa,MAAM,CACrB,CAEA,SAASI,GAAoB,CAC3BJ,EAAa,OAAO,CACtB,CAEA,MAAMK,EAAInV,EAAAA,QAAQ,IAAM+T,EAAOxM,CAAK,EAAG,CAACA,EAAO+L,EAAUC,EAAMC,CAAG,CAAC,EAE7D4B,EAAgB,CACpB,aACA,cAAc5B,CAAG,GACjB,sBAAsBlT,CAAO,GAC7B4T,EAAS,oBAAsB,EAAA,EAE9B,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACEvU,EAAAA,KAAC,MAAA,CACC,UAAW,eAAiByV,EAC5B,YAAavX,GACb,MAAO,CAAE,MAAOsX,EAAE,KAAK,CAAC,EAAG,OAAQA,EAAE,KAAK,CAAC,EAAG,OAAAP,CAAA,EAE9C,SAAA,CAAAjV,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,6DACb,SAAAA,EAAAA,IAAC,IAAA,CACC,UAAU,4BACV,QAASqV,CAAA,CAAA,EAEb,EACArV,EAAAA,IAAC,MAAA,CAAI,UAAU,8DACb,SAAAA,EAAAA,IAAC,IAAA,CACC,UAAU,6BACV,QAASsV,CAAA,CAAA,CACV,CACH,CAAA,EACF,EACAtV,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAAA,CAA8B,CAAA,CAAA,CAAA,CAGnD,CCxLA,MAAMyV,GAAgB,IAEf,SAASC,GAAaC,EAAU,CACrC,IAAIC,EAEJ,SAASC,GAAU,CACjBD,EAAW,IAAI,eAAgBpJ,GAAY,CACzC,QAASmF,KAAOnF,EACd,GAAImF,EAAI,SAAW,SAAS,KAAM,CAChC,IAAIvN,EAAOuN,EAAI,YAAY,OAAS8D,GACpCE,EAASvR,CAAI,CACf,CAEJ,CAAC,EAEDwR,EAAS,QAAQ,SAAS,IAAI,CAChC,CAEA,SAASE,GAAa,CAChBF,IACFA,EAAS,WAAU,EACnBA,EAAW,KAEf,CAEA,MAAO,CACL,QAAAC,EACA,WAAAC,CACJ,CACA,CCXA,SAASC,GAAOzV,EAAO,CACrB,KAAM,CACJ,aAAAsQ,EACA,SAAArQ,EACA,YAAAsQ,EACA,cAAAjB,EACA,iBAAAhP,CAAA,EACEN,EAEEiB,EAAMH,EAAAA,WAAWI,EAAY,EAE7BwU,EAAStU,EAAAA,SAASH,EAAK,QAAQ,EAC/B0U,EAAUvU,EAAAA,SAASH,EAAK,SAAS,EACjC2U,EAAcxU,EAAAA,SAASH,EAAK,YAAY,EACxC4U,EAAWzU,EAAAA,SAASH,EAAK,SAAS,EAClC6U,EAAO1U,EAAAA,SAASH,EAAK,MAAM,EAC3B,CAACf,EAAa6V,CAAc,EAAInV,EAAAA,SAAS,EAAK,EACpD,GAAI,CAACmC,EAAWC,CAAY,EAAIpC,EAAAA,SAAS,CAAC,EAC1C,KAAM,CAACoV,EAAYC,CAAa,EAAIrV,EAAAA,SAAS,CAAC,EACxC,CAACsV,EAAaC,CAAc,EAAIvV,EAAAA,SAAS,CAAC,EAC1C,CAACwV,EAAYC,CAAa,EAAIzV,EAAAA,SAAS,MAAS,EAChD,CAACR,EAASwT,CAAU,EAAIhT,EAAAA,SAAS,KAAK,EAEtC0V,EAAczT,EAAAA,OAAO,IAAI,EAEzB0T,EAAejU,EAAAA,YAClBwB,GAAS,CACRiS,EAAgBS,IACV1S,IAAS0S,IACP1S,GACFwS,EAAY,QAAUlW,EAClBA,IAAY,OAAOwT,EAAW,MAAM,IAC/B,CAAC0C,EAAY,SAAWA,EAAY,UAAY,QACzD1C,EAAW,KAAK,GAGb9P,EACR,CACH,EACA,CAAC1D,CAAO,CAAA,EAGViD,EAAAA,UAAU,IAAM,CACd,MAAME,EAAK6R,GAAamB,CAAY,EACpC,OAAAhT,EAAG,QAAA,EACI,IAAM,CACXA,EAAG,WAAA,CACL,CACF,EAAG,CAACgT,CAAY,CAAC,EAEjB,MAAME,GAAkB3W,EAAAA,QAAQ,IAAM,CACpC,IAAIqN,EACJ,OAAI0I,EAAS,MAAOzR,GAAMA,EAAE,OAAS,CAACA,EAAE,QAAQ,EAC9C+I,EAAI0I,EAAS,OAAO,CAACnQ,EAAKtB,IAAMsB,EAAM,SAAStB,EAAE,KAAK,EAAG,CAAC,EAEtDhE,IAAY,QACd+M,EAAI,SAAS0I,EAAS,KAAMzR,GAAMA,EAAE,KAAO,QAAQ,GAAG,KAAK,GAAK,GAEhE+I,EAAI,IAGRpK,EAAYoK,EACLA,CACT,EAAG,CAAC0I,EAAUzV,CAAO,CAAC,EAEtBiD,EAAAA,UAAU,IAAM,CACdL,EAAayT,EAAe,CAC9B,EAAG,CAACA,EAAe,CAAC,EAEpB,MAAMC,EAAa5W,EAAAA,QACjB,KAAOkW,GAAc,IAAMI,GAAc,GACzC,CAACJ,EAAYI,CAAU,CAAA,EAEnBhG,EAAYtQ,EAAAA,QAAQ,IAAM6V,EAAQ,MAAO,CAACA,CAAO,CAAC,EAClDtF,EAAavQ,EAAAA,QACjB,IAAM4V,EAAO,OAASE,EACtB,CAACF,EAAQE,CAAW,CAAA,EAEhBe,EAAe7W,EAAAA,QACnB,IAAM6V,EAAQ,OAAStF,EAAaqG,EACpC,CAACf,EAAStF,EAAYqG,CAAU,CAAA,EAE5B1F,EAAWnO,EAAAA,OAAO,IAAI,EAEtB+T,EAAe/T,EAAAA,OAAO,CAC1B,WAAY,EACZ,UAAW,EACX,YAAa,EACb,cAAe,EACf,WAAY,CAAA,CACb,EAEDQ,EAAAA,UAAU,IAAM,CACduT,EAAa,QAAU,CACrB,WAAYZ,GAAc,EAC1B,UAAAjT,EACA,YAAamT,GAAe,EAC5B,cAAeP,EAAQ,OACvB,WAAAe,CAAA,CAEJ,EAAG,CAACV,EAAYjT,EAAWmT,EAAaP,EAASe,CAAU,CAAC,EAE5D,MAAMG,EAAqBvU,EAAAA,YAAY,IAAM,CAC3C,KAAM,CAAE,WAAYwU,EAAI,UAAWC,EAAK,YAAaC,EAAI,cAAeC,GAAI,WAAYC,EAAA,EAAON,EAAa,QAC5G3V,EAAI,KAAK,eAAgB,CACvB,MAAO6V,EAAKC,EACZ,OAAQC,EAAKC,GACb,WAAYC,EAAA,CACb,CACH,EAAG,CAACjW,CAAG,CAAC,EAERoC,EAAAA,UAAU,IAAM,CACd,IAAIE,EACJ,OAAIyN,EAAS,UACXzN,EAAK,IAAI,eAAesT,CAAkB,EAC1CtT,EAAG,QAAQyN,EAAS,OAAO,GAEtB,IAAM,CACPzN,KAAO,WAAA,CACb,CACF,EAAG,CAACyN,EAAS,QAAS6F,CAAkB,CAAC,EAEzC,MAAMM,EAActU,EAAAA,OAAO,IAAI,EACzBuU,EAAgBvU,EAAAA,OAAO,IAAI,EAE3B2O,GAAWlP,EAAAA,YAAY,IAAM,CACjC,MAAM0J,EAAKmL,EAAY,QACnBnL,GACF/K,EAAI,KAAK,eAAgB,CACvB,IAAK+K,EAAG,SAAA,CACT,CAEL,EAAG,CAAC/K,CAAG,CAAC,EAERoC,EAAAA,UAAU,IAAM,CACd,MAAMgU,EAAWF,EAAY,QACvBG,EAAaF,EAAc,QACjC,GAAI,CAACC,GAAY,CAACC,EAAY,OAC9B,MAAMhU,EAAS,IAAM,CACnBiU,GAAAA,UAAU,IAAM,CACdpB,EAAekB,EAAS,YAAY,EACpCpB,EAAcoB,EAAS,WAAW,EAClChB,EAAciB,EAAW,WAAW,CACtC,CAAC,CACH,EACM/T,GAAK,IAAI,eAAeD,CAAM,EACpC,OAAAC,GAAG,QAAQ8T,CAAQ,EACZ,IAAM9T,GAAG,WAAA,CAClB,EAAG,CAAC4T,EAAY,OAAO,CAAC,EAExB,MAAMK,EAAY3U,EAAAA,OAAO,IAAI,EACvBkQ,EAAalQ,EAAAA,OAAO,IAAI,EAE9BQ,OAAAA,EAAAA,UAAU,IAAM,CACV0P,EAAW,UACbA,EAAW,QAAQ,QAAA,EACnBA,EAAW,QAAU,MAEvB,MAAMtW,EAAO+a,EAAU,QACvB,GAAK/a,EAEL,OAAAsW,EAAW,QAAUC,GAAAA,QAAQvW,EAAM,CACjC,KAAM,CACJ,SAAU,GACV,SAAU,GACV,SAAU,GACV,SAAU,GACV,UAAW,GACX,SAAUqZ,EACV,SAAUA,CAAA,EAEZ,KAAOnZ,GAAO,CACPA,EAAG,SAASsE,EAAI,KAAK,SAAUtE,CAAE,CACxC,CAAA,CACD,EAEM,IAAM,CACXoW,EAAW,SAAS,QAAA,EACpBA,EAAW,QAAU,IACvB,CACF,EAAG,CAAC+C,CAAI,CAAC,QAGN,MAAA,CAAI,UAAU,uBAAuB,IAAKqB,EAAa,SAAA3F,GACtD,SAAA9R,EAAAA,IAAC,MAAA,CACC,UAAU,6BACV,MAAO,CAAE,OAAQiX,EAAc,MAAO,MAAA,EACtC,IAAKS,EAEL,SAAA1X,EAAAA,IAAC,MAAA,CACC,UAAU,uBACV,MAAO,CACL,OAAQwW,EACR,MAAOE,CAAA,EAGT,gBAAC,MAAA,CAAI,SAAU,EAAG,UAAU,wBAAwB,IAAKoB,EACtD,SAAA,CAAA3B,EAAS,OACRpW,EAAAA,KAAA0P,EAAAA,SAAA,CACE,SAAA,CAAAzP,EAAAA,IAACK,GAAA,CACC,QAAAK,EACA,YAAAF,EACA,YAAauW,GACb,MAAO1T,EACP,SAAA9C,EACA,WAAAoQ,EACA,iBAAA/P,CAAA,CAAA,EAEFZ,EAAAA,IAACyT,GAAA,CACC,MAAOpQ,EACP,QAAA3C,EACA,YAAAF,EACA,eAAgB8V,EAChB,OAAS3O,GAAUrE,EAAaqE,CAAK,EACrC,gBAAkBjH,GAAYwT,EAAWxT,CAAO,CAAA,CAAA,CAClD,CAAA,CACF,EACE,KAEJV,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAAyB,IAAKsR,EAC3C,SAAAtR,EAAAA,IAACyQ,GAAA,CACC,SAAAlQ,EACA,UAAAmQ,EACA,WAAAC,EACA,aAAAC,EACA,YAAAC,EACA,cAAAjB,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CC1PO,SAASmI,GAAezW,EAAG,CAChC,MAAO,CACL,KAAM,KACN,QAAS,GAAGA,EAAE,GAAG,CAAC,MAClB,MAAO,KACP,KAAM,GAAGA,EAAE,MAAM,CAAC,MAClB,IAAK,QACL,KAAM,OACV,CACA,CAEA,SAAS0W,GAAmBrQ,EAAOsQ,EAAgB,CACjD,OAAO,OAAOtQ,GAAU,WACpBA,EACAuQ,EAAAA,aAAavQ,EAAOsQ,CAAc,CACxC,CAEO,SAASE,GAActI,EAAQoI,EAAgB,CACpD,OAAOpI,EAAO,IAAI,CAAC,CAAE,OAAAuI,EAAQ,GAAGC,CAAK,KAAQ,CAC3C,GAAGA,EACH,OAAQL,GAAmBI,EAAQH,CAAc,CACrD,EAAI,CACJ,CAEO,SAASK,GAAeL,EAAgB3W,EAAG,CAChD,MAAMiX,EAAUR,GAAezW,CAAC,EAChC,QAASkX,KAAQD,EACfA,EAAQC,CAAI,EAAIN,EAAAA,aAAaK,EAAQC,CAAI,EAAGP,CAAc,EAE5D,OAAOM,CACT,CAEO,SAASE,GAAeC,EAAST,EAAgB,CACtD,GAAI,CAACS,GAAW,CAACA,EAAQ,OAAQ,OAAOA,EACxC,MAAMN,EAASF,EAAAA,aAAa,WAAYD,CAAc,EAEtD,OAAOS,EAAQ,IAAK7Y,GACdA,EAAI,SAAiBA,EAErBA,EAAI,KAAO,SAAWA,EAAI,KAAO,MAC5B,CACL,GAAGA,EAEH,UAAY0V,GAAM6C,EAAO7C,CAAC,EAC1B,SAAWA,GAAM6C,EAAO7C,CAAC,CACjC,EAEQ1V,EAAI,KAAO,WACN,CACL,GAAGA,EACH,UAAY0V,GAAMA,EAClB,SAAWA,GAAMA,CACzB,EAEW1V,CACR,CACH,CAEO,SAAS8Y,GAAYxH,EAAM8G,EAAgB,CAChD,OAAK9G,EAAK,OAIH,CACL,GAAGA,EACH,OAAQA,EAAK,OAAO,IAAKyH,IAAW,CAClC,GAAGA,EACH,OAAQT,GAAcS,EAAM,OAAQX,CAAc,CACxD,EAAM,CACN,EATW9G,CAUX,CC1BA,MAAM0H,GAAY,GAChB,EACG,MAAM,GAAG,EACT,IAAKC,GAAUA,EAAOA,EAAK,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAK,MAAM,CAAC,EAAI,EAAG,EACxE,KAAK,EAAE,EAENC,GAAgB,CACpB,CAAE,KAAM,QAAS,KAAM,EAAG,OAAQ,OAAA,EAClC,CAAE,KAAM,MAAO,KAAM,EAAG,OAAQ,IAAA,CAClC,EAEMC,GAAQC,EAAAA,WAAW,SACvB,CACE,aAAArI,EAAe,KACf,QAAAM,EAAU,CAAA,EACV,UAAAgI,EAAYC,GAAAA,iBACZ,MAAAzW,EAAQ,CAAA,EACR,SAAAoO,EAAW,CAAA,EACX,WAAAsI,EAAa,KACb,MAAAzQ,EAAQ,CAAA,EACR,OAAAkH,EAASkJ,GACT,QAAAL,EAAUW,GAAAA,eACV,MAAA/N,EAAQ,KACR,IAAA3M,EAAM,KACN,WAAA2a,EAAa,MACb,aAAAC,EAAe,MACf,UAAAtR,EAAY,IACZ,WAAAC,EAAa,GACb,YAAAsR,EAAc,GACd,SAAAjZ,EAAW,GACX,YAAAsQ,EAAc,OACd,KAAAM,EAAO,GACP,UAAAsI,EAAY,GACZ,QAAA3O,EAAU,GACV,cAAe4O,EAAoB,KACnC,KAAApS,EAAO,KACP,UAAAqS,EAAY,GACZ,iBAAAC,EAAmB,GACnB,aAAAhR,GAAe,KACf,SAAAsC,EAAW,CAAE,KAAM,SAAA,EACnB,aAAA2O,EAAe,KACf,WAAAC,EAAa,KACb,SAAAC,EAAW,KACX,KAAA3D,EAAO,GACP,WAAAjL,EAAa,GACb,QAAAC,EAAU,KACV,MAAAC,EAAQ,GACR,QAAA2O,EAAU,GACV,GAAGC,EACL,EACAC,EACA,CAEA,MAAMC,EAAehX,EAAAA,OAAA,EACrBgX,EAAa,QAAUF,GAGvB,MAAMG,EAAYha,EAAAA,QAAQ,IAAM,IAAIia,GAAAA,UAAUC,EAAAA,QAAQ,EAAG,EAAE,EAIrDC,EAAQna,EAAAA,QAAQ,KAAO,CAAE,GAAGoa,GAAAA,GAAQ,GAAGC,GAAAA,EAAA,GAAO,EAAE,EAChDC,EAAUtZ,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACjCsZ,GAASva,EAAAA,QAAQ,IAChBsa,EACEA,EAAQ,OAAOH,EAAO,EAAI,EADZ/M,EAAAA,OAAE+M,CAAK,EAE3B,CAACG,EAASH,CAAK,CAAC,EAGbK,GAAYxa,EAAAA,QAAQ,IAAMua,GAAO,SAAS,SAAU,CAACA,EAAM,CAAC,EAE5DE,GAAmBza,EAAAA,QAAQ,IAAM,CACrC,IAAI5C,GAAS,CACX,KAAMmb,GAAYxH,EAAMyJ,EAAS,EACjC,OAAQzC,GAActI,EAAQ+K,EAAS,EACvC,QAASnC,GAAeC,EAASkC,EAAS,EAC1C,MAAOE,GAAAA,eAAenS,CAAK,EAC3B,UAAAV,CAAA,EAEF,OAAIzK,GAAO,OACTA,GAAS,CACP,GAAGA,GACH,GAAGud,GAAAA,cACDvd,GAAO,KACP8a,GAAesC,GAAWD,GAAO,SAAS,OAAO,CAAC,EAClDnd,GAAO,OACPyK,CAAA,CACF,GAGGzK,EACT,EAAG,CAAC2T,EAAMtB,EAAQ6I,EAAS/P,EAAOV,EAAW2S,GAAWD,EAAM,CAAC,EAGzDK,GAAiB7X,EAAAA,OAAO,IAAI,EAC9B6X,GAAe,UAAYtY,IACxBsX,GACHiB,GAAAA,eAAevY,EAAO,CAAE,aAAA6W,EAAc,WAAApO,EAAY,SAAA4O,EAAU,EAE9DiB,GAAe,QAAUtY,GAE3BiB,EAAAA,UAAU,IAAM,CACTqW,GACHiB,GAAAA,eAAevY,EAAO,CAAE,aAAA6W,EAAc,WAAApO,EAAY,SAAA4O,EAAU,CAEhE,EAAG,CAACrX,EAAO6W,EAAcQ,EAAU5O,EAAY6O,CAAO,CAAC,EAEvD,MAAMkB,GAAe9a,EAAAA,QAAQ,IAAMga,EAAU,GAAI,CAACA,CAAS,CAAC,EAEtDe,GAAiBhY,EAAAA,OAAO,IAAI,EAC9BgY,GAAe,UAAY,OAC7BA,GAAe,QAAU,IAAIC,GAAAA,eAAe,CAACtY,GAAGyS,KAAM,CACpD,MAAMlB,EAAO,KAAOwE,GAAS/V,EAAC,EAC1BqX,EAAa,SAAWA,EAAa,QAAQ9F,CAAI,GACnD8F,EAAa,QAAQ9F,CAAI,EAAEkB,EAAC,CAEhC,CAAC,EACD2F,GAAa,QAAQC,GAAe,OAAO,GAI7C,KAAM,CAACna,GAAUC,EAAW,EAAIC,EAAAA,SAAS,IAAI,EACvCma,GAAclY,EAAAA,OAAO,IAAI,EAC/BkY,GAAY,QAAUra,GAGtB,MAAMO,GAAMnB,EAAAA,QACV,KAAO,CACL,SAAUga,EAAU,SAAS,KAAKA,CAAS,EAC3C,iBAAkBA,EAAU,YAAY,KAAKA,CAAS,EACtD,UAAW,KAAO,CAAE,KAAMA,IAC1B,KAAMc,GAAa,KACnB,QAAUje,KACRke,GAAe,QAAUA,GAAe,QAAQ,QAAQle,EAAE,EACnDke,GAAe,SAExB,UAAWD,GAAa,UAAU,KAAKA,EAAY,EACnD,GAAIA,GAAa,GAAG,KAAKA,EAAY,EACrC,OAAQA,GAAa,OAAO,KAAKA,EAAY,EAC7C,QAASd,EAAU,QAAQ,KAAKA,CAAS,EACzC,UAAW,IAAMA,EAAU,UAAA,EAC3B,SAAWkB,IACTA,GACI,IAAI,QAASC,IAAQ,WAAW,IAAMA,GAAIF,GAAY,OAAO,EAAG,CAAC,CAAC,EAClEA,GAAY,QAClB,WAAY,IAAMjB,EAAU,WAAA,CAAW,GAEzC,CAACA,EAAWc,EAAY,CAAA,EAI1BM,EAAAA,oBACEtB,EACA,KAAO,CACL,GAAG3Y,EAAA,GAEL,CAACA,EAAG,CAAA,EAGN,MAAMka,GAActY,EAAAA,OAAO,CAAC,EAC5BQ,EAAAA,UAAU,IAAM,CACT8X,GAAY,QAIfrB,EAAU,KAAK,CACb,MAAA1X,EACA,MAAOmY,GAAiB,MACxB,MAAAvP,EACA,QAASuP,GAAiB,QAC1B,IAAAlc,EACA,WAAA2a,EACA,UAAWuB,GAAiB,UAC5B,WAAA3S,EACA,YAAAsR,EACA,OAAQqB,GAAiB,OACzB,UAAA3B,EACA,KAAM2B,GAAiB,KACvB,SAAA/J,EACA,WAAAsI,EACA,UAAAK,EACA,QAAS3O,IAAY,GAAO,CAAE,KAAM,WAAcA,EAClD,UAAA6O,EACA,iBAAAC,EACA,QAAA1I,EACA,aAAAqI,EACA,aAAA3Q,GACA,SAAAsC,EACA,aAAA2O,EACA,WAAAC,EACA,SAAAC,EACA,MAAA1O,EACA,KAAA+K,EACA,WAAYwE,GAAU,UACtB,WAAAzP,EACA,QAAAC,CAAA,CACD,EAlCG9D,KAAW/F,EAAG,EAoCpBka,GAAY,SACd,EAAG,CACDla,GACA+F,EACA5E,EACAmY,GACAvP,EACA3M,EACA2a,EACApR,EACAsR,EACAN,EACApI,EACAsI,EACAK,EACA3O,EACA6O,EACAC,EACA1I,EACAqI,EACA3Q,GACAsC,EACA2O,EACAC,EACAC,EACA1O,EACA+K,EACAwE,GACAzP,EACAC,EACAgP,CAAA,CACD,EAEGqB,GAAY,UAAY,GAC1BrB,EAAU,KAAK,CACb,MAAA1X,EACA,MAAOmY,GAAiB,MACxB,MAAAvP,EACA,QAASuP,GAAiB,QAC1B,IAAAlc,EACA,WAAA2a,EACA,UAAWuB,GAAiB,UAC5B,WAAA3S,EACA,YAAAsR,EACA,OAAQqB,GAAiB,OACzB,UAAA3B,EACA,KAAM2B,GAAiB,KACvB,SAAA/J,EACA,WAAAsI,EACA,UAAAK,EACA,QAAS3O,IAAY,GAAO,CAAE,KAAM,WAAcA,EAClD,UAAA6O,EACA,iBAAAC,EACA,QAAA1I,EACA,aAAAqI,EACA,aAAA3Q,GACA,SAAAsC,EACA,aAAA2O,EACA,WAAAC,EACA,SAAAC,EACA,MAAA1O,EACA,KAAA+K,EACA,WAAYwE,GAAU,UACtB,WAAAzP,EACA,QAAAC,CAAA,CACD,EAIH,MAAMwE,GAAgBxP,EAAAA,QAAQ,IACxB2Z,EACK,CAAC2B,GAAKlD,KACPA,KAAS,OAAS,CAACuB,EAAS,YAAY2B,EAAG,GAC3ClD,KAAS,QAAU,CAACuB,EAAS,YAAY2B,EAAG,EAAU,aACnD,GAGJhC,EACN,CAACK,EAAUL,CAAiB,CAAC,EAEhC,OACE1Z,EAAAA,IAACqB,GAAAA,QAAQ,KAAK,SAAb,CAAsB,MAAOsZ,GAC5B,SAAA3a,EAAAA,IAAC2b,GAAa,SAAb,CAAsB,MAAOpa,GAC5B,SAAAvB,EAAAA,IAAC+V,GAAA,CACC,aAAAnF,EACA,SAAArQ,EACA,YAAAsQ,EACA,cAAAjB,GACA,iBAAkB3O,EAAA,CAAA,EAEtB,CAAA,CACF,CAEJ,CAAC,ECrUD,SAAwB2a,GAAQ,CAAE,IAAAra,EAAM,KAAM,MAAAsa,EAAQ,CAAA,GAAM,CAC1D,MAAMnB,EAAUtZ,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACjCya,EAAY1b,UAAQ,IAAOsa,GAAoBC,EAAAA,OAAOF,GAAAA,EAAE,EAAI,CAACC,CAAO,CAAC,EACrEpZ,EAAIlB,EAAAA,QAAQ,IAAM0b,EAAU,SAAS,OAAO,EAAG,CAACA,CAAS,CAAC,EAE1DC,EAAYC,EAAAA,cAAcza,EAAK,WAAW,EAC1C6U,EAAO4F,EAAAA,cAAcza,EAAK,MAAM,EAChC0a,EAAUD,EAAAA,cAAcza,EAAK,SAAS,EACtC4J,EAAa6Q,EAAAA,cAAcza,EAAK,YAAY,EAE5C2a,EAAiB,CAAC,OAAQ,MAAM,EAEhCC,EAAa/b,EAAAA,QAAQ,IAAM,CAC/B,MAAMgc,EAAcC,GAAAA,kBAAkB,CAAE,KAAM,GAAM,WAAY,GAAM,EAOtE,OANgBR,EAAM,OAClBA,EACAQ,GAAAA,kBAAkB,CAChB,KAAAjG,EACA,WAAAjL,CAAA,CACD,GACU,IAAKoK,GAAM,CACxB,IAAI+G,EAAO,CAAE,GAAG/G,EAAG,SAAU,EAAA,EAC7B,OAAA+G,EAAK,QAAUC,GAAAA,gBAAgBH,EAAaE,EAAK,EAAE,EAC9CE,GAAOC,GAAAA,aAAalb,EAAKib,EAAG,GAAI,KAAMlb,CAAC,EACxCgb,EAAK,QACLA,EAAK,OAAMA,EAAK,KAAOhb,EAAEgb,EAAK,IAAI,GAClCA,EAAK,WAAUA,EAAK,SAAWhb,EAAEgb,EAAK,QAAQ,GAC3CA,CACT,CAAC,CACH,EAAG,CAACT,EAAOta,EAAKD,EAAG8U,EAAMjL,CAAU,CAAC,EAE9BuR,EAAUtc,EAAAA,QAAQ,IAAM,CAC5B,MAAMuc,EAAe,CAAA,EACrB,OAAAR,EAAW,QAASG,GAAS,CAC3B,MAAMnc,EAASmc,EAAK,GACpB,GAAInc,IAAW,WACbwc,EAAa,KAAKL,CAAI,UACZJ,EAAe,SAAS/b,CAAM,EAQ/B+b,EAAe,SAAS/b,CAAM,GACvCwc,EAAa,KAAK,CAChB,GAAGL,EACH,SAAUA,EAAK,WAAWL,CAAO,CAAA,CAClC,MAZ0C,CAC3C,GAAI,CAACF,GAAW,QAAU,CAACxa,EAAK,OAChCob,EAAa,KAAK,CAChB,GAAGL,EACH,SACEA,EAAK,YACLP,EAAU,KAAM9c,GAASqd,EAAK,WAAWrd,EAAMsC,EAAI,SAAA,CAAU,CAAC,CAAA,CACjE,CACH,CAMF,CAAC,EAEMob,EAAa,OAAO,CAACC,EAAQvY,IAAU,CAC5C,GAAI9C,GAAOqb,EAAO,SAChB,MAAO,CAACb,EAAU,KAAM9c,GAAS2d,EAAO,SAAS3d,EAAMsC,EAAI,SAAA,CAAU,CAAC,EACxE,GAAIqb,EAAO,OAAS,YAAa,CAC/B,MAAMC,EAAaF,EAAatY,EAAQ,CAAC,EACzC,GAAI,CAACwY,GAAcA,EAAW,OAAS,YAAa,MAAO,EAC7D,CACA,MAAO,EACT,CAAC,CACH,EAAG,CAACtb,EAAKwa,EAAWE,EAASE,CAAU,CAAC,EAExC,OAAKzB,EAQE1a,EAAAA,IAAC8c,GAAAA,QAAA,CAAU,MAAOJ,CAAA,CAAS,EAN9B1c,EAAAA,IAACqB,GAAAA,QAAQ,KAAK,SAAb,CAAsB,MAAOya,EAC5B,SAAA9b,EAAAA,IAAC8c,GAAAA,QAAA,CAAU,MAAOJ,CAAA,CAAS,CAAA,CAC7B,CAKN,CCnEA,MAAMK,GAAc9D,EAAAA,WAAW,SAC7B,CACE,QAAS+D,EAAc,CAAA,EACvB,IAAAzb,EAAM,KACN,SAAA0b,EAAW,KACX,OAAAC,EAAS,KACT,GAAAC,EAAK,QACL,SAAAC,EACA,QAAAra,EACA,IAAAgG,CACF,EACAmR,EACA,CACA,MAAMmD,EAAUla,EAAAA,OAAO,IAAI,EACrBma,EAAcna,EAAAA,OAAO,IAAI,EAGzBuX,EAAUtZ,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACjCmM,EAAIpN,EAAAA,QAAQ,IAAMsa,GAAWC,EAAAA,OAAO,CAAE,GAAGF,GAAAA,GAAI,GAAGD,GAAAA,EAAA,CAAQ,EAAG,CAACE,CAAO,CAAC,EACpEpZ,EAAIlB,EAAAA,QAAQ,IAAMoN,EAAE,SAAS,OAAO,EAAG,CAACA,CAAC,CAAC,EAE1C+P,EAAevB,EAAAA,cAAcza,EAAK,WAAW,EAC7CM,EAAcma,EAAAA,cAAcza,EAAK,UAAU,EAC3Cic,EAAmBxB,EAAAA,cAAcza,EAAK,WAAW,EACjDe,EAAgB0Z,EAAAA,cAAcza,EAAK,YAAY,EAC/Ckc,EAAazB,EAAAA,cAAcza,EAAK,SAAS,EAEzC/D,EAAS4C,EAAAA,QACb,KAAO,CACL,WAAYkC,EACZ,UAAWib,EACX,QAASE,CAAA,GAEX,CAACnb,EAAeib,EAAcE,CAAU,CAAA,EAGpCC,EAActd,EAAAA,QAAQ,IAAMud,GAAAA,eAAengB,CAAM,EAAG,CAACA,CAAM,CAAC,EAElEmG,EAAAA,UAAU,IAAM,CACTpC,IAELA,EAAI,GAAG,eAAgB,IAAM,CACvB8b,EAAQ,SAAWA,EAAQ,QAAQ,MAAMA,EAAQ,QAAQ,KAAA,CAC/D,CAAC,EACD9b,EAAI,GAAG,YAAa,IAAM,CACpB8b,EAAQ,SAAWA,EAAQ,QAAQ,MAAMA,EAAQ,QAAQ,KAAA,CAC/D,CAAC,EACH,EAAG,CAAC9b,CAAG,CAAC,EAER,SAASqc,EAAcC,EAAM,CAC3B,OAAOA,EAAK,IAAKC,IACfA,EAAK,CAAE,GAAGA,CAAA,EACNA,EAAG,OAAMA,EAAG,KAAOxc,EAAEwc,EAAG,IAAI,GAC5BA,EAAG,UAASA,EAAG,QAAUxc,EAAEwc,EAAG,OAAO,GACrCA,EAAG,OAAMA,EAAG,KAAOF,EAAcE,EAAG,IAAI,GACrCA,EACR,CACH,CAEA,SAASC,GAAa,CACpB,MAAMC,EAAehB,EAAY,OAC7BA,EACAW,GAAAA,eAAengB,CAAM,EAEzB,OAAOogB,EAAcI,CAAY,CACnC,CAEA,MAAMC,EAAW7d,EAAAA,QAAQ,IAChB2d,EAAA,EACN,CAACxc,EAAKyb,EAAaxf,EAAQ8D,CAAC,CAAC,EAE1B4c,EAAgB9d,EAAAA,QACpB,IAAOod,GAAoBA,EAAiB,OAASA,EAAmB,CAAA,EACxE,CAACA,CAAgB,CAAA,EAGbW,GAAevb,EAAAA,YACnB,CAACC,EAAI5F,IAAO,CACV,IAAIgC,EAAO4D,EAAKtB,GAAK,QAAQsB,CAAE,EAAI,KACnC,GAAIoa,EAAU,CACZ,MAAMpT,EAASoT,EAASpa,EAAI5F,CAAE,EAC9BgC,EAAO4K,IAAW,GAAO5K,EAAO4K,CAClC,CACA,GAAI5K,EAAM,CACR,MAAMwK,EAAexG,EAAAA,SAAShG,EAAG,OAAQ,cAAc,EACnDwM,IAAiB,KACnB6T,EAAY,QAAU,CAAE,GAAIre,EAAK,GAAI,aAAAwK,CAAA,EAClC6T,EAAY,QAAUre,EAAK,IAE5B,CAAC,MAAM,QAAQ4C,CAAW,GAAK,CAACA,EAAY,SAAS5C,EAAK,EAAE,IAC9DsC,GAAOA,EAAI,MAAQA,EAAI,KAAK,cAAe,CAAE,GAAItC,EAAK,GAAI,CAE9D,CACA,OAAOA,CACT,EACA,CAACsC,EAAK0b,EAAUpb,CAAW,CAAA,EAGvBuc,EAAaxb,EAAAA,YAChB3F,GAAO,CACN,MAAMkD,EAASlD,EAAG,OACdkD,IACeoc,GAAAA,gBAAgBmB,EAAavd,EAAO,EAAE,GACzCsc,GAAAA,aAAalb,EAAKpB,EAAO,GAAImd,EAAY,QAAShc,CAAC,EACjEyB,GAAWA,EAAQ9F,CAAE,EAEzB,EACA,CAACsE,EAAKD,EAAGyB,EAAS2a,CAAW,CAAA,EAGzBW,EAAazb,EAAAA,YACjB,CAAC0Z,EAAMrd,IAAS,CAGd,MAAMyD,EAAQwb,EAAc,OAASA,EAAgBjf,EAAO,CAACA,CAAI,EAAI,CAAA,EAErE,IAAI4K,EAASqT,EAASxa,EAAM,MAAOqB,GAAMmZ,EAAOZ,EAAMvY,CAAC,CAAC,EAAI,GAE5D,GAAI8F,IACEyS,EAAK,WACPzS,EAAS,CAACnH,EAAM,KAAMqB,GACpBuY,EAAK,SAASvY,EAAGxC,EAAI,SAAA,EAAY+b,EAAY,OAAO,CAAA,GAEpDhB,EAAK,YAAY,CACnB,MAAMgC,EAAW5b,EAAM,KAAMqB,IAC3BuY,EAAK,WAAWvY,GAAGxC,EAAI,SAAA,EAAY+b,EAAY,OAAO,CAAA,EAExDhB,EAAK,SAAWgC,CAClB,CAEF,OAAOzU,CACT,EACA,CAACqT,EAAQgB,EAAe3c,CAAG,CAAA,EAG7Bia,EAAAA,oBAAoBtB,EAAK,KAAO,CAC9B,KAAM,CAACjd,EAAI0U,IAAQ,CACb0L,EAAQ,SAAWA,EAAQ,QAAQ,MACrCA,EAAQ,QAAQ,KAAKpgB,EAAI0U,CAAG,CAEhC,CAAA,EACA,EAEF,MAAM4M,EAAgB3b,cAAaI,GAAM,CACnCqa,EAAQ,SAAWA,EAAQ,QAAQ,MACrCA,EAAQ,QAAQ,KAAKra,CAAC,CAE1B,EAAG,CAAA,CAAE,EAECwb,EACJze,EAAAA,KAAA0P,EAAAA,SAAA,CACE,SAAA,CAAAzP,EAAAA,IAACye,GAAAA,YAAA,CACC,OAAQJ,EACR,QAASJ,EACT,QAAS,KACT,SAAUE,GACV,QAASC,EACT,GAAAjB,EACA,IAAKE,EACL,IAAAtU,CAAA,CAAA,EAEF/I,EAAAA,IAAC,OAAA,CAAK,cAAAue,EAA8B,mBAAiB,OAClD,gBAAOnB,GAAa,WAAaA,EAAA,EAAaA,CAAA,CACjD,CAAA,EACF,EAGF,GAAI,CAAC1C,GAAWrZ,WAAQ,MAAM,SAAU,CACtC,MAAMqd,EAAWrd,WAAQ,KAAK,SAC9B,OAAOrB,EAAAA,IAAC0e,EAAA,CAAS,MAAOlR,EAAI,SAAAgR,EAAQ,CACtC,CAEA,OAAOA,CACT,CAAC,ECzLD,SAAwBhW,GAAM,CAAE,IAAAjH,EAAK,SAAAod,EAAU,cAAAC,GAAiB,CAE9D,MAAMtd,EADOF,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACrB,SAAS,OAAO,EAEzB+X,EAAa1X,EAAAA,SAASH,EAAK,YAAY,EACvCsd,EAAcnd,EAAAA,SAASH,EAAK,aAAa,EACzCoH,EAAQjH,EAAAA,SAASH,EAAK,QAAQ,EAC9B2J,EAAWxJ,EAAAA,SAASH,EAAK,UAAU,EACnCqY,EAAmBlY,EAAAA,SAASH,EAAK,kBAAkB,EAEnD,CAACud,EAAWC,CAAY,EAAI7d,WAAA,EAElC,SAAS8d,GAAe,CACtB,GAAI5F,EAAY,CACd,MAAM6F,EAAUtW,EACb,OAAQ7F,GAAMA,EAAE,QAAUsW,CAAU,EACpC,IAAKnQ,IAAU,CAAE,KAAAA,EAAM,KAAM1H,EAAI,QAAQ0H,EAAK,MAAM,GAAI,EAErDiW,EAAWvW,EACd,OAAQ7F,GAAMA,EAAE,QAAUsW,CAAU,EACpC,IAAKnQ,IAAU,CAAE,KAAAA,EAAM,KAAM1H,EAAI,QAAQ0H,EAAK,MAAM,GAAI,EAE3D,MAAO,CACL,CAAE,MAAO3H,EAAE,cAAc,EAAG,KAAM2d,CAAA,EAClC,CAAE,MAAO3d,EAAE,YAAY,EAAG,KAAM4d,CAAA,CAAS,CAE7C,CACF,CAEAvb,EAAAA,UAAU,IAAM,CACdob,EAAaC,GAAc,CAC7B,EAAG,CAAC5F,EAAYzQ,CAAK,CAAC,EAEtB,MAAMwW,EAAO/e,EAAAA,QACX,IAAM,CACJ,CAAE,GAAI,MAAO,MAAOkB,EAAE,cAAc,CAAA,EACpC,CAAE,GAAI,MAAO,MAAOA,EAAE,gBAAgB,CAAA,EACtC,CAAE,GAAI,MAAO,MAAOA,EAAE,YAAY,CAAA,EAClC,CAAE,GAAI,MAAO,MAAOA,EAAE,cAAc,CAAA,CAAE,EAExC,CAACA,CAAC,CAAA,EAGJ,SAAS8d,EAAWvc,EAAI,CAClB8b,EACFpd,EAAI,KAAK,cAAe,CAAE,GAAAsB,CAAA,CAAI,GAE9Bkc,EAAcjI,IACXA,GAAQ,CAAA,GAAI,IAAKuI,IAAW,CAC3B,GAAGA,EACH,KAAMA,EAAM,KAAK,OAAQ/C,GAASA,EAAK,KAAK,KAAOzZ,CAAE,CAAA,EACrD,CAAA,EAEJ+b,GACEA,EAAc,CACZ,GAAA/b,EACA,OAAQ,cACR,KAAM,CAAE,GAAAA,CAAA,CAAG,CACZ,EAEP,CAEA,SAASyc,EAAazc,EAAIe,EAAQ,CAC5B+a,EACFpd,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,KAAMe,CAAA,CACP,GAEDmb,EAAcjI,IACXA,GAAQ,CAAA,GAAI,IAAKuI,IAAW,CAC3B,GAAGA,EACH,KAAMA,EAAM,KAAK,IAAK/C,GACpBA,EAAK,KAAK,KAAOzZ,EACb,CAAE,GAAGyZ,EAAM,KAAM,CAAE,GAAGA,EAAK,KAAM,GAAG1Y,CAAA,GACpC0Y,CAAA,CACN,EACA,CAAA,EAEJsC,GACEA,EAAc,CACZ,GAAA/b,EACA,OAAQ,cACR,KAAM,CACJ,GAAAA,EACA,KAAMe,CAAA,CACR,CACD,EAEP,CAEA,OACE5D,EAAAA,IAAAyP,EAAAA,SAAA,CACI,UAAAqP,GAAa,CAAA,GAAI,IAAI,CAACO,EAAOE,IAC7BF,EAAM,KAAK,OACTrf,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACb,SAAAA,EAAAA,IAACqB,WAAQ,QAAQ,SAAhB,CAAyB,MAAO,KAC/B,SAAArB,EAAAA,IAACwf,GAAAA,MAAA,CAAM,MAAOH,EAAM,MAAO,SAAS,MAClC,SAAArf,MAAC,QAAA,CACC,SAAAA,EAAAA,IAAC,QAAA,CACE,WAAM,KAAK,IAAK2R,UACd,KAAA,CACC,SAAA,CAAA3R,EAAAA,IAAC,KAAA,CAAG,UAAU,sBACZ,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,2BACZ,SAAA2R,EAAI,KAAK,MAAQ,EAAA,CACpB,EACF,EACCzG,GAAU,MAAQyG,EAAI,KAAK,OAAS,MACnC3R,EAAAA,IAAC,KAAA,CAAG,UAAU,kCACZ,SAAAA,EAAAA,IAACyf,GAAAA,KAAA,CACC,KAAK,SACL,YAAane,EAAE,KAAK,EACpB,MAAOqQ,EAAI,KAAK,IAChB,SACEiI,GAAoBiF,GAAa,YAEnC,SAAW5hB,GAAO,CACXA,EAAG,OACNqiB,EAAa3N,EAAI,KAAK,GAAI,CAAE,IAAK1U,EAAG,MAAO,CAC/C,CAAA,CAAA,EAEJ,EACE,WACH,KAAA,CAAG,UAAU,sBACZ,SAAA+C,MAAC,MAAA,CAAI,UAAU,yBACb,SAAAA,EAAAA,IAAC0f,GAAAA,MAAA,CACC,MAAO/N,EAAI,KAAK,KAChB,YAAarQ,EAAE,kBAAkB,EACjC,QAAS6d,EACT,SAAWliB,GACTqiB,EAAa3N,EAAI,KAAK,GAAI,CAAE,KAAM1U,EAAG,MAAO,EAG7C,SAAA,CAAC,CAAE,OAAA0iB,CAAA,IAAaA,EAAO,KAAA,CAAA,EAE5B,CAAA,CACF,EAEA3f,EAAAA,IAAC,KAAA,CAAG,UAAU,sBACZ,SAAAA,EAAAA,IAAC,IAAA,CACC,UAAU,wCACV,QAAS,IAAMof,EAAWzN,EAAI,KAAK,EAAE,EACrC,KAAK,QAAA,CAAA,CACN,CACH,CAAA,CAAA,EA3COA,EAAI,KAAK,EA4ClB,CACD,CAAA,CACH,EACF,EACF,CAAA,CACF,CAAA,EAvDyC4N,CAwD3C,EACE,IAAA,EAER,CAEJ,CC/JA,SAAwBK,GAAetf,EAAO,CAC5C,KAAM,CAAE,MAAAqH,EAAO,KAAAkY,EAAM,OAAAzH,EAAQ,SAAA0H,EAAU,SAAAC,EAAU,GAAG9F,GAAc3Z,EAC5D0f,EAAkBD,GAAYD,EAEpC,SAASG,EAAiBhjB,EAAI,CAC5B,MAAMijB,EAAU,IAAI,KAAKjjB,EAAG,KAAK,EACjCijB,EAAQ,SAASvY,EAAM,UAAU,EACjCuY,EAAQ,WAAWvY,EAAM,YAAY,EAErCqY,GAAmBA,EAAgB,CAAE,MAAOE,CAAA,CAAS,CACvD,CAEA,OACEngB,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAACmgB,GAAAA,WAAA,CACE,GAAGlG,EACJ,MAAAtS,EACA,SAAUsY,EACV,OAAA7H,EACA,QAAS,CAAC,OAAO,EACjB,MAAO,EAAA,CAAA,EAERyH,EACC7f,EAAAA,IAACogB,GAAAA,WAAA,CAAW,MAAAzY,EAAc,SAAUqY,EAAiB,OAAA5H,EAAgB,EACnE,IAAA,EACN,CAEJ,CCZAiI,GAAAA,mBAAmB,SAAUC,GAAAA,UAAU,EACvCD,GAAAA,mBAAmB,OAAQT,EAAc,EACzCS,GAAAA,mBAAmB,WAAYE,GAAAA,QAAQ,EACvCF,GAAAA,mBAAmB,SAAUG,GAAAA,MAAM,EACnCH,GAAAA,mBAAmB,UAAWI,GAAAA,OAAO,EACrCJ,GAAAA,mBAAmB,QAAS7X,EAAK,EACjC6X,GAAAA,mBAAmB,WAAYK,GAAAA,QAAQ,EAEvC,SAASC,GAAO,CACd,IAAApf,EACA,MAAAsa,EAAQ,CAAA,EACR,IAAA9S,EAAM,GACN,OAAA6X,EAAS,UACT,SAAArgB,EAAW,GACX,UAAAsgB,EAAY,UACZ,UAAAC,EAAY,GACZ,OAAAC,EAAS,GACT,SAAApC,EAAW,GACX,MAAAqC,EAAQ,GACR,QAAA1N,EAAU,CAAA,CACZ,EAAG,CACD,MAAM2N,EAAW7f,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAClCmM,EAAIpN,EAAAA,QAAQ,IAAM6gB,GAAYtG,EAAAA,OAAO,CAAE,GAAGF,GAAAA,GAAI,GAAGD,GAAAA,EAAA,CAAQ,EAAG,CAACyG,CAAQ,CAAC,EACtE3f,EAAIlB,EAAAA,QAAQ,IAAMoN,EAAE,SAAS,OAAO,EAAG,CAACA,CAAC,CAAC,EAC1C0T,EAAW1T,EAAE,OAAA,EACb2T,EAAa/gB,EAAAA,QAAQ,IAAM,CAC/B,MAAMghB,EAAIF,EAAS,OAAO,YAAcA,EAAS,SAAS,WAC1D,OAAOhJ,eAAakJ,EAAGF,EAAS,QAAQ,CAC1C,EAAG,CAACA,CAAQ,CAAC,EAEPG,EAAmBjhB,EAAAA,QAAQ,IAAM,CACrC,GAAI2gB,IAAW,IAAQ,CAACxgB,EAAU,CAChC,MAAMmc,EAAU,CACd,CAAE,KAAM,OAAQ,KAAM,YAAa,GAAI,OAAA,EACvC,CAAE,KAAM,QAAA,EACR,CACE,KAAM,SACN,KAAM,SACN,KAAMpb,EAAE,QAAQ,EAChB,GAAI,QAAA,CACN,EAEF,OAAIqd,EAAiB,CAAE,MAAOjC,CAAA,EACvB,CACL,MAAO,CACL,GAAGA,EACH,CACE,KAAM,SACN,KAAM,UACN,KAAMpb,EAAE,MAAM,EACd,GAAI,MAAA,CACN,CACF,CAEJ,CACA,OAAOyf,CACT,EAAG,CAACA,EAAQxgB,EAAUoe,EAAUrd,CAAC,CAAC,EAG5B,CAACd,EAAa6V,CAAc,EAAInV,EAAAA,SAAS,EAAK,EAC9CogB,EAAWlhB,EAAAA,QACf,IAAOI,EAAc,iBAAmB,GACxC,CAACA,CAAW,CAAA,EAGRqW,EAAejU,cAAawB,GAAS,CACzCiS,EAAejS,CAAI,CACrB,EAAG,CAAA,CAAE,EAELT,EAAAA,UAAU,IAAM,CACd,MAAME,EAAK6R,GAAamB,CAAY,EACpC,OAAAhT,EAAG,QAAA,EACI,IAAM,CACXA,EAAG,WAAA,CACL,CACF,EAAG,CAACgT,CAAY,CAAC,EAEjB,MAAMuC,EAAa1X,EAAAA,SAASH,EAAK,aAAa,EACxCggB,EAAS7f,EAAAA,SAASH,EAAK,YAAY,EACnCqY,EAAmBlY,EAAAA,SAASH,EAAK,kBAAkB,EACnDuJ,EAAUpJ,EAAAA,SAASH,EAAK,SAAS,EACjC6J,EAAU1J,EAAAA,SAASH,EAAK,SAAS,EACjCoH,GAAQjH,EAAAA,SAASH,EAAK,OAAO,EAC7B4J,EAAazJ,EAAAA,SAASH,EAAK,YAAY,EACvCkI,EAAerJ,EAAAA,QACnB,IAAM+K,GAAcoW,GAAQ,aAC5B,CAACpW,EAAYoW,CAAM,CAAA,EAEfC,EAAYphB,EAAAA,QAChB,IAAMqJ,GAAgBA,IAAiB,EACvC,CAACA,CAAY,CAAA,EAETyP,EAAYxX,EAAAA,SAASH,EAAK,WAAW,EACrCkgB,EAAYrhB,EAAAA,QAChB,IAAMshB,GAAAA,eAAe,CAAE,iBAAA9H,EAAkB,QAAA9O,EAAS,QAAAM,EAAS,UAAA8N,EAAW,EACtE,CAACU,EAAkB9O,EAASM,EAAS8N,CAAS,CAAA,EAE1C9C,EAAO1U,EAAAA,SAASH,EAAK,MAAM,EAE3B,CAACogB,EAAiBC,CAAkB,EAAI1gB,EAAAA,SAAS,CAAA,CAAE,EACnD,CAACiD,EAAY0d,EAAa,EAAI3gB,EAAAA,SAAS,IAAI,EAC3C,CAAC4gB,EAAcC,CAAe,EAAI7gB,WAAA,EAClC,CAAC8gB,EAAcC,CAAe,EAAI/gB,EAAAA,SAAS,IAAI,EAE/CjC,EAAOmB,EAAAA,QAAQ,IAAM,CACzB,GAAI,CAACgZ,EAAY,OAAO,KACxB,IAAI8I,EAKJ,GAJIV,GAAapI,EAAW,SAC1B8I,EAAO,CAAE,GAAG9I,EAAW,SAAS3P,CAAY,CAAA,EACzCyY,EAAO,CAAE,GAAG9I,CAAA,EAEb7Y,EAAU,CAEZ,IAAI4hB,EAAS,CAAE,OAAQD,EAAK,MAAA,EAC5B,OAAAT,EAAU,QAAQ,CAAC,CAAE,IAAApc,GAAK,KAAA+c,KAAW,CACnC,GAAIA,IAAS,QAAS,CACpB,MAAMza,GAAQua,EAAK7c,EAAG,EAClB+c,IAAS,QAAUza,cAAiB,KACtCwa,EAAO9c,EAAG,EAAI8b,EAAWxZ,EAAK,EACrBya,IAAS,UAAY/c,KAAQ,WACtC8c,EAAO9c,EAAG,EAAI,GAAGsC,EAAK,IAEtBwa,EAAO9c,EAAG,EAAIsC,EAElB,CACF,CAAC,EACMwa,CACT,CACA,OAAOD,GAAQ,IACjB,EAAG,CAAC9I,EAAYoI,EAAW/X,EAAclJ,EAAUkhB,EAAWN,CAAU,CAAC,EAEzExd,EAAAA,UAAU,IAAM,CACdoe,EAAgB9iB,CAAI,CACtB,EAAG,CAACA,CAAI,CAAC,EAET0E,EAAAA,UAAU,IAAM,CACdie,EAAmB,CAAA,CAAE,EACrBK,EAAgB,IAAI,EACpBJ,GAAc,IAAI,CACpB,EAAG,CAACN,CAAM,CAAC,EAEX,SAASc,GAAmBC,EAAYC,EAAU,CAChD,OAAOD,EAAW,IAAKxf,IAAM,CAC3B,MAAMwZ,EAAO,CAAE,GAAGxZ,EAAA,EAOlB,GANIA,GAAE,SAAQwZ,EAAK,OAAS,CAAE,GAAGA,EAAK,MAAA,GAClCA,EAAK,OAAS,SAAW/a,IAC3B+a,EAAK,IAAM/a,EACX+a,EAAK,SAAWqC,EAChBrC,EAAK,cAAgBkG,IAEnBlG,EAAK,OAAS,UAAYA,EAAK,MAAQ,OAAQ,CACjD,MAAMmG,GAAUnG,EAAK,SAAW,CAAA,EAChCA,EAAK,QAAUmG,GAAQ,IAAK1e,KAAO,CACjC,GAAGA,GACH,MAAOzC,EAAEyC,GAAE,KAAK,CAAA,EAChB,CACJ,CAEA,OAAIuY,EAAK,OAAS,UAAYA,EAAK,MAAQ,aACzCA,EAAK,cAAiB3U,IAAU,GAAGrG,EAAEgb,EAAK,KAAK,CAAC,IAAI3U,EAAK,KAGvD2U,EAAK,QAAOA,EAAK,MAAQhb,EAAEgb,EAAK,KAAK,GACrCA,EAAK,QAAQ,cACfA,EAAK,OAAO,YAAchb,EAAEgb,EAAK,OAAO,WAAW,GAEjDiG,IACEjG,EAAK,YAAcA,EAAK,WAAWiG,EAAUhhB,EAAI,SAAA,CAAU,EAC7D+a,EAAK,SAAW,UACJA,EAAK,UAEdA,CACT,CAAC,CACH,CAEA,MAAMoG,GAActiB,EAAAA,QAAQ,IAAM,CAChC,IAAIuiB,EAAS9G,EAAM,OAASA,EAAQ4F,EAEpC,OADAkB,EAASN,GAAmBM,EAAQb,CAAY,EAC3CA,EACEa,EAAO,OACXrG,GAAS,CAACA,EAAK,UAAY,CAACA,EAAK,SAASwF,EAAcvgB,EAAI,SAAA,CAAU,CAAA,EAF/CohB,CAI5B,EAAG,CAAC9G,EAAO4F,EAAWK,EAAcxgB,EAAGC,EAAKod,CAAQ,CAAC,EAE/CiE,GAAaxiB,EAAAA,QACjB,IAAMsiB,GAAY,IAAKnZ,GAAMA,EAAE,GAAG,EAClC,CAACmZ,EAAW,CAAA,EAGd,SAASF,GAAkB,CAAE,GAAA3f,EAAI,OAAA1C,EAAQ,KAAA+hB,IAAQ,CAC/CN,EAAoB9K,IAAU,CAC5B,GAAGA,EACH,CAACjU,CAAE,EAAG,CAAE,OAAA1C,EAAQ,KAAA+hB,EAAA,CAAK,EACrB,CACJ,CAEA,MAAMW,GAAYjgB,EAAAA,YAAY,IAAM,CAClC,QAASqG,KAAQ0Y,EACf,GAAIhZ,GAAM,KAAKM,CAAI,EAAG,CACpB,KAAM,CAAE,OAAA9I,EAAQ,KAAA+hB,IAASP,EAAgB1Y,CAAI,EAC7C1H,EAAI,KAAKpB,EAAQ+hB,EAAI,CACvB,CAEJ,EAAG,CAAC3gB,EAAKogB,EAAiBhZ,EAAK,CAAC,EAE1Bma,GAAalgB,EAAAA,YAAY,IAAM,CACnC,MAAMC,EAAK0e,GAAQ,IAAMA,EACzB,GAAIC,GACF,GAAIpI,GAAY,SAAU,CACxB,MAAMzP,EAAWyP,EAAW,SAAS,OACnC,CAAC1R,GAAGrD,IAAUA,IAAUoF,CAAA,EAE1BlI,EAAI,KAAK,cAAe,CACtB,GAAAsB,EACA,KAAM,CAAE,SAAA8G,CAAA,CAAS,CAClB,CACH,OAEApI,EAAI,KAAK,cAAe,CAAE,GAAAsB,CAAA,CAAI,CAElC,EAAG,CAACtB,EAAKggB,EAAQC,EAAWpI,EAAY3P,CAAY,CAAC,EAE/CsZ,GAAOngB,EAAAA,YAAY,IAAM,CAC7BrB,EAAI,KAAK,cAAe,CAAE,GAAI,KAAM,CACtC,EAAG,CAACA,CAAG,CAAC,EAEFkb,GAAe7Z,EAAAA,YAClB3F,GAAO,CACN,KAAM,CAAE,KAAAqf,EAAM,QAAA0G,EAAA,EAAY/lB,EACtBqf,EAAK,KAAO,UACdwG,GAAA,EAEExG,EAAK,KAAO,SACT0G,GAAQ,OACRD,GAAA,EADgBF,GAAA,GAGnBvG,EAAK,MAAMyG,GAAA,CACjB,EACA,CAACxhB,EAAKggB,EAAQ5C,EAAUkE,GAAWC,GAAYC,EAAI,CAAA,EAG/CE,GAAgBrgB,EAAAA,YACpB,CAACmB,EAAGsB,EAAK6d,MACHtJ,GAAoB7V,EAAE,OAAS,cAAa,YAAc,IAE9D8D,GAAAA,gBAAgB9D,EAAGxC,EAAI,SAAA,EAAY8D,CAAG,EACjC6d,IAAOrB,GAAc,EAAK,EACxB9d,GAET,CAAC6V,EAAkBrY,CAAG,CAAA,EAGlB4hB,GAAOvgB,EAAAA,YACVuf,GAAW,CACVA,EAAS,CACP,GAAGA,EACH,YACEvI,GAAoBuI,EAAO,aAAeA,EAAO,OAAS,SAAA,EAE9D,OAAOA,EAAO,MACd,OAAOA,EAAO,MAGZS,GAAW,QAAQ,UAAU,IAAM,IAClCT,EAAO,UAAY,CAACA,EAAO,WAE5B,OAAOA,EAAO,SAEhB,MAAMD,EAAO,CACX,GAAIX,GAAQ,IAAMA,EAClB,KAAMY,EACN,GAAIX,GAAa,CAAE,aAAA/X,CAAA,CAAa,EAE9BkV,GAAYxa,IAAY+d,EAAK,WAAa/d,GAE9C5C,EAAI,KAAK,cAAe2gB,CAAI,EAEvBvD,GAAUkE,GAAA,CACjB,EACA,CACEthB,EACAggB,EACA3H,EACA+E,EACAkE,GACAD,GACApB,EACA/X,EACAtF,CAAA,CACF,EAGImb,GAAe1c,EAAAA,YAClB3F,GAAO,CACN,GAAI,CAAE,OAAA2G,EAAQ,IAAAyB,GAAK,MAAA6d,CAAA,EAAUjmB,EAM7B,GAJIimB,MAAqB,EAAI,EAE7BjmB,EAAG,OAASgmB,GAAc,CAAE,GAAGrf,CAAA,EAAUyB,GAAK6d,CAAK,EAE/C,CAACvE,EAAUoD,EAAgB9kB,EAAG,MAAM,UAC/B,CAAC+kB,GAAgB,CAACkB,EAAO,CAChC,MAAM5G,GAAOoG,GAAY,KAAMnZ,IAAMA,GAAE,MAAQlE,EAAG,EAC5CuC,GAAIhE,EAAOyB,EAAG,GACJ,CAACiX,GAAK,YAAcA,GAAK,WAAW1U,EAAC,KACrC,CAAC0U,GAAK,UAAY1U,KAAIub,GAAKlmB,EAAG,MAAM,CACtD,CACF,EACA,CAAC0hB,EAAUsE,GAAejB,EAAcU,GAAaS,EAAI,CAAA,EAGrDC,GAAaxgB,EAAAA,YAChB3F,GAAO,CACD0hB,GAAUwE,GAAKlmB,EAAG,MAAM,CAC/B,EACA,CAAC0hB,EAAUwE,EAAI,CAAA,EAGXE,GAAmBzgB,cAAa0gB,GAAU,CAE9CrB,EAAgBqB,EAAM,MAAM,CAC9B,EAAG,CAAA,CAAE,EAECC,GAAiBnjB,EAAAA,QACrB,IACEgW,EACI,CACE,SAAWnZ,GAAO,CAChBA,EAAG,eAAA,EACHsE,EAAI,KAAK,MAAM,CACjB,EACA,SAAWtE,GAAO,CAChBA,EAAG,eAAA,EACHsE,EAAI,KAAK,MAAM,CACjB,CAAA,EAEF,CAAA,EACN,CAAC6U,EAAM7U,CAAG,CAAA,EAGZ,OAAOtC,QACJukB,UAAA,CACC,SAAAxjB,EAAAA,IAACyjB,GAAAA,OAAA,CACC,IAAK,+BAA+BnC,CAAQ,IAAIvY,CAAG,GACnD,MAAO2Z,GACP,OAAQzjB,EACR,OAAQoiB,EACR,UAAAP,EACA,UAAAD,EACA,OAAAD,EACA,SAAArgB,EACA,SAAAoe,EACA,MAAAqC,EACA,SAAUvE,GACV,OAAQ2G,GACR,aAAcC,GACd,SAAU/D,GACV,QAAShM,GAAW,CAAE,GAAGiQ,GAAgB,GAAGjQ,CAAA,CAAQ,CAAA,EAExD,EACE,IACN,CCxXA,MAAMoQ,GAAa,CAAC,CAAE,SAAAtG,EAAU,QAAA1E,EAAU,KAAM,IAAAnX,KAAU,CACxD,KAAM,CAACP,EAAUC,CAAW,EAAIC,EAAAA,SAAS,IAAI,EAC7CyC,OAAAA,EAAAA,UAAU,IAAM,CACTpC,GACLA,EAAI,SAAS,EAAI,EAAE,KAAKN,CAAW,CACrC,EAAG,CAACM,CAAG,CAAC,EAGNvB,EAAAA,IAAC2jB,GAAAA,WAAA,CAAgB,IAAK3iB,EAAU,QAAA0X,EAC7B,SAAA0E,EACH,CAEJ,ECXA,SAASwG,GAAQtjB,EAAO,CACtB,KAAM,CAAE,IAAAiB,EAAK,QAASsiB,EAAS,SAAAzG,GAAa9c,EAEtCwjB,EAAU3gB,EAAAA,OAAO,IAAI,EACrB4gB,EAAiB5gB,EAAAA,OAAO,IAAI,EAE5B,CAAC6gB,EAAYC,CAAa,EAAI/iB,EAAAA,SAAS,CAAA,CAAE,EACzC,CAACgjB,EAAcC,CAAe,EAAIjjB,EAAAA,SAAS,CAAA,CAAE,EAC7C,CAACgR,EAAKkS,CAAM,EAAIljB,EAAAA,SAAS,CAAA,CAAE,EAC3ByT,EAASxR,EAAAA,OAAO+O,CAAG,EACzByC,EAAO,QAAUzC,EAEjB,SAASmS,EAActnB,EAAM,CAC3B,MAAMunB,EAAMvnB,EACZ,KAAOA,GAAM,CACX,GAAIA,EAAK,aAAc,CACrB,MAAM8F,EAAKxF,EAAAA,MAAMN,EAAM,iBAAiB,EAClCogB,EAAK9f,EAAAA,MAAMN,EAAM,iBAAiB,EAClCwnB,EAAUxnB,EAAK,aAAa,cAAc,EAChD,GAAI8F,GAAM0hB,EAAS,CACjB,MAAM7W,EAAUzK,EAAAA,SAASqhB,EAAK,cAAc,EAC5C,MAAO,CAAE,GAAAzhB,EAAI,QAAA0hB,EAAS,OAAQxnB,EAAM,GAAAogB,EAAI,QAAAzP,CAAA,CAC1C,CACF,CACA3Q,EAAOA,EAAK,UACd,CAEA,MAAO,CAAE,GAAI,KAAM,QAAS,KAAM,OAAQ,KAAM,GAAI,KAAM,QAAS,IAAA,CACrE,CAEA4G,EAAAA,UAAU,IAAM,CACd,MAAM6gB,EAAcT,EAAe,QAC7BU,EAAa9P,EAAO,QAC1B,GAAI6P,GAAeC,IAAeA,EAAW,MAAQZ,GAAU,CAC7D,MAAMa,EAAgBF,EAAY,sBAAA,EAElC,IAAIG,EAAU,GACVC,EAAUH,EAAW,KACrBI,EAASJ,EAAW,IAEpBC,EAAc,OAASV,EAAW,QACpCY,EAAUZ,EAAW,MAAQU,EAAc,MAAQ,EACnDC,EAAU,IAERD,EAAc,QAAUV,EAAW,SACrCa,EAASJ,EAAW,KAAOC,EAAc,OAASV,EAAW,OAAS,GACtEW,EAAU,IAGRA,GACFP,EAAQtN,IACDA,IACE,CAAE,GAAGA,GAAM,KAAM8N,EAAS,IAAKC,CAAA,CACvC,CAEL,CACF,EAAG,CAACb,EAAYH,CAAO,CAAC,EAExB,MAAMiB,EAAW3hB,EAAAA,OAAO,IAAI,EACtB4hB,EAAU,IACVC,EAAYC,GAAS,CACzB,aAAaH,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAM,CAClCG,EAAA,CACF,EAAGF,CAAO,CACZ,EAEA,SAASlmB,EAAKmE,EAAG,CACf,GAAI,CAAE,GAAAH,EAAI,QAAA0hB,EAAS,OAAAnlB,EAAQ,GAAA+d,EAAI,QAAAzP,GAAY2W,EAAcrhB,EAAE,MAAM,EAIjE,GAHAohB,EAAO,IAAI,EACXD,EAAgB,CAAA,CAAE,EAEd,CAACI,EACH,GAAK1hB,EAIH0hB,EAAUW,EAAYriB,EAAI6K,CAAO,MAJ1B,CACP,aAAaoX,EAAS,OAAO,EAC7B,MACF,CAKF,MAAM7X,GAAUjK,EAAE,QAElBgiB,EAAS,IAAM,CACb,GAAIniB,EAAI,CACN,MAAMvC,EAAQ,CAAE,KAAM6kB,EAAWtiB,CAAE,CAAA,EAC/B6K,GAAW,OAAMpN,EAAM,aAAeoN,GAC1CyW,EAAgB7jB,CAAK,CACvB,CAEA,MAAM8kB,EAAehmB,EAAO,sBAAA,EACtBimB,EAASvB,EAAQ,QACjBwB,EAAWD,EACbA,EAAO,sBAAA,EACP,CAAE,IAAK,EAAG,KAAM,EAAG,MAAO,EAAG,OAAQ,EAAG,MAAO,EAAG,OAAQ,CAAA,EAE9D,IAAIrmB,EAAK6N,EACLsQ,IAAO,QACTne,EAAMomB,EAAa,IAAM,EAAIE,EAAS,IACtCzY,EAAOuY,EAAa,MAAQ,EAAIE,EAAS,OAEzCtmB,EAAMomB,EAAa,IAAMA,EAAa,OAASE,EAAS,IACxDzY,EAAOI,GAAUqY,EAAS,MAG5BrB,EAAcqB,CAAQ,EACtBlB,EAAO,CAAE,IAAAplB,EAAK,KAAA6N,EAAM,KAAM0X,EAAS,CACrC,CAAC,CACH,CAEA,SAASY,EAAWtiB,EAAI,CACtB,OAAOtB,GAAK,QAAQsB,CAAE,GAAK,IAC7B,CAEA,SAASqiB,EAAYriB,EAAI6K,EAAS,CAChC,MAAMzO,EAAOkmB,EAAWtiB,CAAE,EAC1B,OAAI6K,IAAY,MAAQzO,GAAM,SACrBA,EAAK,SAASyO,CAAO,GAAG,MAAQ,GAClCzO,GAAM,MAAQ,EACvB,CAEA,OACEc,EAAAA,KAAC,MAAA,CACC,UAAU,8BACV,IAAK+jB,EACL,YAAajlB,EAEZ,SAAA,CAAAqT,IAAQA,EAAI,MAAQ2R,GACnB7jB,EAAAA,IAAC,MAAA,CACC,UAAU,+BACV,IAAK+jB,EACL,MAAO,CAAE,IAAK,GAAG7R,EAAI,GAAG,KAAM,KAAM,GAAGA,EAAI,IAAI,IAAA,EAE9C,SAAA2R,EACC7jB,MAAC6jB,EAAA,CAAS,GAAGK,EAAc,EACzBhS,EAAI,KACNlS,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAqC,SAAAkS,EAAI,KAAK,EAC3D,IAAA,CAAA,EAEJ,KAEHkL,CAAA,CAAA,CAAA,CAGP,CCjJA,SAASmI,GAAS,CAAE,MAAAC,EAAQ,GAAM,SAAApI,GAAY,CAC5C,OAAIA,EACKpd,EAAAA,IAACylB,GAAAA,SAAA,CAAa,MAAAD,EAAe,SAAApI,EAAA,EAAW,EAExCpd,MAACylB,GAAAA,UAAa,MAAAD,EAAc,CAEvC,CCNA,SAASE,GAAO,CAAE,MAAAF,EAAQ,GAAM,SAAApI,GAAY,CAC1C,OAAOA,QACJuI,GAAAA,OAAA,CAAW,MAAAH,EAAe,SAAApI,EAAS,EAEpCpd,EAAAA,IAAC2lB,WAAW,MAAAH,CAAA,CAAc,CAE9B,CCNA,SAAwBI,GAAW,CAAE,MAAAJ,EAAQ,GAAM,SAAApI,GAAY,CAC7D,OAAIA,EACKpd,EAAAA,IAAC6lB,GAAAA,WAAA,CAAe,MAAAL,EAAe,SAAApI,CAAA,CAAS,EAExCpd,MAAC6lB,GAAAA,YAAe,MAAAL,EAAc,CAEzC,kCCmBaM,GAAUC,GAAI"}