{"version":3,"file":"canplot.cjs","sources":["../src/lib/dataUtils.ts","../src/lib/helpers.ts","../src/lib/axes.ts","../node_modules/react-merge-refs/dist/index.js","../src/lib/contexts/DrawPropagateContext.ts","../src/lib/contexts/FrameContext.ts","../src/lib/contexts/RedrawRequestContext.tsx","../src/lib/FrameDrawer.ts","../src/lib/CanPlot.tsx","../src/lib/frameContext.tsx","../src/lib/plot/LinePlot.tsx","../src/lib/plot/ScatterPlot.tsx","../src/lib/plot/BarPlot.tsx","../src/lib/plot/AreaPlot.tsx","../src/lib/plot/SparklinePlot.tsx","../src/lib/plot/Ticks.tsx","../src/lib/interactions/interactionsBus.ts","../src/lib/interactions/positioning.ts","../src/lib/interactions/ChartAreaInteractions.tsx","../src/lib/interactions/TooltipsX.tsx","../src/lib/interactions/CrossHair.tsx","../src/lib/interactions/SelectBox.tsx","../src/lib/interactions/AxisOverlay.tsx","../src/lib/defaults.ts","../src/lib/tickUtils.ts"],"sourcesContent":["export const clamp = (val: number, min: number, max: number) => {\n  return Math.min(Math.max(val, min), max);\n};\n\nexport type DeepPartial<T> = {\n  [P in keyof T]?: T[P] extends (infer U)[]\n    ? DeepPartial<U>[]\n    : T[P] extends Readonly<infer U>[]\n    ? Readonly<DeepPartial<U>>[]\n    : DeepPartial<T[P]>;\n};\n\nexport const sum = (input: (number | undefined)[]): number => {\n  return input.reduce<number>((a, b) => a + (b ?? 0), 0);\n};\n\nexport const findClosestIndex = (arr: number[], val: number) => {\n  let closestIndex = 0;\n\n  for (let i = 0; i < arr.length; i++) {\n    if (Math.abs(arr[i] - val) < Math.abs(arr[closestIndex] - val)) {\n      closestIndex = i;\n    }\n  }\n  return closestIndex;\n};\n","import type { PlotDrawFrame, PlotDrawScaleConfig, Style } from \"./types\";\nimport { clamp } from \"./dataUtils\";\n\nexport const pxToValDistance = (\n  frame: PlotDrawFrame,\n  pxDistance: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  const factor =\n    (scale.origin === \"x\" ? chartArea.width : chartArea.height) /\n    (scale.max - scale.min);\n  return pxDistance / factor;\n};\n\nexport const getScale = (\n  frame: PlotDrawFrame,\n  scaleId: string\n): PlotDrawScaleConfig | null => {\n  return frame.scales.find((a) => a.id === scaleId) ?? null;\n};\n\nexport const applyStyles = (\n  ctx: CanvasRenderingContext2D,\n  style?: Style\n): void => {\n  const dpr = window.devicePixelRatio || 1;\n  ctx.lineCap = style?.lineCap ?? \"butt\";\n  ctx.lineDashOffset = dpr * (style?.lineDashOffset ?? 0);\n  ctx.lineJoin = style?.lineJoin ?? \"miter\";\n  ctx.lineWidth = dpr * (style?.lineWidth ?? 1);\n  ctx.miterLimit = dpr * (style?.miterLimit ?? 10);\n  ctx.strokeStyle = style?.strokeStyle ?? \"black\";\n  ctx.fillStyle = style?.fillStyle ?? ctx.strokeStyle;\n  ctx.font = style?.font ?? `${10 * dpr}px sans-serif`;\n  ctx.textAlign = style?.textAlign ?? \"start\";\n  ctx.direction = style?.direction ?? \"inherit\";\n  ctx.textBaseline = style?.textBaseline ?? \"alphabetic\";\n  ctx.fontKerning = style?.fontKerning ?? \"auto\";\n};\n\nexport const valToPxDistance = (\n  frame: PlotDrawFrame,\n  val: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const factor =\n    (scale.origin === \"x\" ? chartArea.width : chartArea.height) /\n    (scale.max - scale.min);\n  const result = val * factor;\n  if (Number.isFinite(result)) {\n    return result;\n  }\n  return null;\n};\n\nexport const valToPos = (\n  frame: PlotDrawFrame,\n  val: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  const relativePosition = valToPxDistance(\n    frame,\n    val - scale.min,\n    scaleId,\n    space\n  );\n  if (relativePosition === null) {\n    return null;\n  }\n  const result =\n    scale.origin === \"x\"\n      ? clamp(\n        chartArea.x + relativePosition,\n        chartArea.x - 10 * chartArea.width,\n        chartArea.x + 11 * chartArea.width\n      )\n      : clamp(\n        chartArea.y + chartArea.height - relativePosition,\n        chartArea.y - 10 * chartArea.height,\n        chartArea.y + 11 * chartArea.height\n      );\n  return result;\n};\n\nexport const clampXPosToChartArea = <T extends number | null>(\n  frame: PlotDrawFrame,\n  value: T,\n  space: \"css\" | \"canvas\"\n): T | number => {\n  if (value === null) {\n    return null as T;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n  return clamp(value, chartArea.x, chartArea.x + chartArea.width);\n};\n\nexport const clampYPosToChartArea = <T extends number | null>(\n  frame: PlotDrawFrame,\n  value: T,\n  space: \"css\" | \"canvas\"\n): T | number => {\n  if (value === null) {\n    return null as T;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n  return clamp(value, chartArea.y, chartArea.y + chartArea.height);\n};\n\nexport const valFits = (\n  frame: PlotDrawFrame,\n  value: number | null,\n  scaleId: string\n): boolean => {\n  if (value === null) {\n    return false;\n  }\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return false;\n  }\n  return value >= scale.min && value <= scale.max;\n};\n\nexport const posToVal = (\n  frame: PlotDrawFrame,\n  pos: number,\n  scaleId: string,\n  space: \"css\" | \"canvas\"\n): number | null => {\n  const scale = getScale(frame, scaleId);\n  if (!scale) {\n    return null;\n  }\n  const chartArea =\n    space === \"canvas\" ? frame.chartAreaCanvasPX : frame.chartAreaCSS;\n\n  const relativePosition =\n    scale.origin === \"x\"\n      ? (pos - chartArea.x) / chartArea.width\n      : (chartArea.height - pos + chartArea.y) / chartArea.height;\n  return scale.min + relativePosition * (scale.max - scale.min);\n};\n\nexport const deepEqual = <T>(a: T, b: T): boolean => {\n  if (a === b) return true;\n\n  if (a == null || b == null) return false;\n\n  if (typeof a !== typeof b) return false;\n\n  if (typeof a !== \"object\") return false;\n\n  if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n      if (!deepEqual(a[i], b[i])) return false;\n    }\n    return true;\n  }\n\n  const keysA = Object.keys(a as object);\n  const keysB = Object.keys(b as object);\n\n  if (keysA.length !== keysB.length) return false;\n\n  for (const key of keysA) {\n    if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    if (!deepEqual((a as any)[key], (b as any)[key])) return false;\n  }\n\n  return true;\n};\n","import { applyStyles } from \"./helpers\";\nimport type { PlotDrawFrame } from \"./types\";\n\nexport const drawAxes = (plotDrawFrame: PlotDrawFrame) => {\n  const { ctx, scales } = plotDrawFrame;\n\n  for (const scale of scales) {\n    if (!scale.axis) continue;\n    ctx.save();\n    applyStyles(ctx, {\n      strokeStyle: \"black\",\n      fillStyle: \"black\",\n      lineWidth: 1,\n      ...scale.axis.style,\n    });\n    const rect = scale.axis.canvasRect;\n    if (scale.origin === \"x\") {\n      if (scale.axis.position === \"bottom\") {\n        ctx.beginPath();\n        ctx.moveTo(rect.x, rect.y);\n        ctx.lineTo(rect.x + rect.width, rect.y);\n        ctx.stroke();\n      } else if (scale.axis.position === \"top\") {\n        const y = rect.y + rect.height;\n        ctx.beginPath();\n        ctx.moveTo(rect.x, y);\n        ctx.lineTo(rect.x + rect.width, y);\n        ctx.stroke();\n      }\n    } else {\n      if (scale.axis.position === \"left\") {\n        const x = rect.x + rect.width;\n        ctx.beginPath();\n        ctx.moveTo(x, rect.y);\n        ctx.lineTo(x, rect.y + rect.height);\n        ctx.stroke();\n      } else if (scale.axis.position === \"right\") {\n        ctx.beginPath();\n        ctx.moveTo(rect.x, rect.y);\n        ctx.lineTo(rect.x, rect.y + rect.height);\n        ctx.stroke();\n      }\n    }\n    ctx.restore();\n  }\n};\n","// src/index.ts\nimport { useMemo, version } from \"react\";\n\n// src/mergeRefsReact16.ts\nfunction mergeRefsReact16(refs) {\n  return (value) => {\n    for (const ref of refs) assignRef(ref, value);\n  };\n}\n\n// src/mergeRefsReact19.ts\nfunction mergeRefsReact19(refs) {\n  return (value) => {\n    const cleanups = [];\n    for (const ref of refs) {\n      const cleanup = assignRef(ref, value);\n      const isCleanup = typeof cleanup === \"function\";\n      cleanups.push(isCleanup ? cleanup : () => assignRef(ref, null));\n    }\n    return () => {\n      for (const cleanup of cleanups) cleanup();\n    };\n  };\n}\n\n// src/index.ts\nfunction assignRef(ref, value) {\n  if (typeof ref === \"function\") {\n    return ref(value);\n  } else if (ref) {\n    ref.current = value;\n  }\n}\nvar mergeRefs = parseInt(version.split(\".\")[0], 10) >= 19 ? mergeRefsReact19 : mergeRefsReact16;\nfunction useMergeRefs(refs) {\n  return useMemo(() => mergeRefs(refs), refs);\n}\nexport {\n  assignRef,\n  mergeRefs,\n  useMergeRefs\n};\n","import { createContext } from \"react\";\n\ntype DrawPropagateContextType = {\n  listeners: [prio: number, cb: () => void][];\n  subscribe: (listener: () => void, prio: number) => () => void;\n  notifyListeners: () => void;\n};\n\nexport const DrawPropagateContext = createContext<DrawPropagateContextType>({\n  listeners: [],\n  subscribe: () => () => {},\n  notifyListeners: () => {},\n});\n\nexport const createDrawPropagateStore = (): DrawPropagateContextType => {\n  const listeners: [prio: number, cb: () => void][] = [];\n  const subscribe = (listener: () => void, prio: number) => {\n    listeners.push([prio, listener]);\n    listeners.sort((a, b) => a[0] - b[0]);\n    return () => {\n      const idx = listeners.findIndex(([, cb]) => cb === listener);\n      if (idx !== -1) {\n        listeners.splice(idx, 1);\n      }\n    };\n  };\n  const notifyListeners = () => {\n    for (const [, cb] of listeners) {\n      cb();\n    }\n  };\n  return { listeners, subscribe, notifyListeners };\n};\n","import { createContext } from \"react\";\nimport type { PlotDrawFrame } from \"../types\";\n\nexport const FrameContext = createContext<PlotDrawFrame | null>(null);\n","import { createContext } from \"react\";\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const RedrawRequestContext = createContext<() => void | null>(() => {});\n","import {\n  clampXPosToChartArea,\n  clampYPosToChartArea,\n  getScale,\n  valFits,\n  valToPos,\n  valToPxDistance,\n} from \"./helpers\";\nimport type {\n  OutlierStrategy,\n  PlotDrawFrame,\n  PlotDrawScaleConfig,\n} from \"./types\";\n\nexport const CANPLOT_LAYER = {\n  TOP: 400,\n  MIDDLE: 300,\n  BOTTOM: 200,\n  BACKGROUND: 100,\n} as const;\n\nexport class FrameDrawer {\n  private _frame: PlotDrawFrame | null = null;\n\n  _updateFrame(frame: PlotDrawFrame) {\n    this._frame = frame;\n  }\n  get frame() {\n    if (!this._frame) {\n      throw new Error(\"Frame not set in FrameDrawer\");\n    }\n    return this._frame;\n  }\n  get ctx() {\n    return this.frame.ctx;\n  }\n  clampXPosToChartArea = <T extends number | null>(\n    x: T,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): T | number => {\n    return clampXPosToChartArea(this.frame, x, space);\n  };\n  clampYPosToChartArea = <T extends number | null>(\n    y: T,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): T | number => {\n    return clampYPosToChartArea(this.frame, y, space);\n  };\n  valToPos = (\n    value: number,\n    scaleId: string,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): number | null => {\n    return valToPos(this.frame, value, scaleId, space);\n  };\n  valToPxDistance = (\n    value: number,\n    scaleId: string,\n    space: \"canvas\" | \"css\" = \"canvas\",\n  ): number | null => {\n    return valToPxDistance(this.frame, value, scaleId, space);\n  };\n  valFits = (value: number, scaleId: string): boolean => {\n    return valFits(this.frame, value, scaleId);\n  };\n  getScale = (scaleId: string): PlotDrawScaleConfig | null => {\n    return getScale(this.frame, scaleId);\n  };\n  valToPosWithStrategy = (\n    value: number,\n    scaleId: string,\n    space: \"canvas\" | \"css\" = \"canvas\",\n    strategy: OutlierStrategy,\n  ): number | null => {\n    const scale = this.getScale(scaleId);\n    if (!scale) return null;\n\n    if (strategy === \"clip\") {\n      if (!valFits(this.frame, value, scaleId)) {\n        return null;\n      }\n      return valToPos(this.frame, value, scaleId, space);\n    }\n    if (scale.origin === \"x\") {\n      return this.clampXPosToChartArea(\n        valToPos(this.frame, value, scaleId, space),\n        space,\n      );\n    }\n    return this.clampYPosToChartArea(\n      valToPos(this.frame, value, scaleId, space),\n      space,\n    );\n  };\n}\n","import React, {\n  useLayoutEffect,\n  useRef,\n  useState,\n  type ReactNode,\n  forwardRef,\n  useMemo,\n  useCallback,\n} from \"react\";\nimport type { PlotConfiguration, PlotDrawFrame, PlotSize, Rect } from \"./types\";\nimport { drawAxes } from \"./axes\";\nimport { mergeRefs } from \"react-merge-refs\";\nimport {\n  createDrawPropagateStore,\n  DrawPropagateContext,\n} from \"./contexts/DrawPropagateContext\";\nimport { FrameContext } from \"./contexts/FrameContext\";\nimport { RedrawRequestContext } from \"./contexts/RedrawRequestContext\";\nimport { CANPLOT_LAYER } from \"./FrameDrawer\";\n\nexport const CanPlot = forwardRef<\n  HTMLDivElement,\n  {\n    configuration: PlotConfiguration;\n    children?: ReactNode;\n    style?: React.CSSProperties;\n  } & React.HTMLAttributes<HTMLDivElement>\n>(({ configuration, children, style, ...rest }, ref) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const rootRef = useRef<HTMLDivElement>(null);\n\n  const plotSize = useSize(rootRef);\n\n  const [ctx, setCtx] = useState<CanvasRenderingContext2D | null>(null);\n\n  const frame = useMemo(\n    () => makeFrame(configuration, plotSize, ctx),\n    [configuration, plotSize, ctx]\n  );\n\n  useLayoutEffect(() => {\n    setCtx(canvasRef.current?.getContext(\"2d\") || null);\n  }, [canvasRef]);\n\n  const dpr = window.devicePixelRatio || 1;\n\n  return (\n    <div\n      ref={mergeRefs([ref, rootRef])}\n      style={{\n        position: \"relative\",\n        overflow: \"hidden\",\n        ...style,\n      }}\n      data-canplotroot\n      {...rest}\n    >\n      <canvas\n        ref={canvasRef}\n        width={plotSize.width * dpr}\n        height={plotSize.height * dpr}\n        style={{\n          inset: 0,\n          position: \"absolute\",\n          width: `${plotSize.width}px`,\n          height: `${plotSize.height}px`,\n        }}\n      />\n      {frame && <Updaters frame={frame}>{children}</Updaters>}\n    </div>\n  );\n});\n\nconst Updaters: React.FC<{ frame: PlotDrawFrame; children?: ReactNode }> = ({\n  frame,\n  children,\n}) => {\n  const [drawPropagateStore] = useState(() => createDrawPropagateStore());\n  const [drawVersion, setDrawVersion] = useState(0);\n  useLayoutEffect(() => {\n    frame?.ctx.clearRect(0, 0, frame.ctx.canvas.width, frame.ctx.canvas.height);\n  }, [frame, drawVersion]);\n\n  const frameRef = useRef<PlotDrawFrame | null>(null);\n  frameRef.current = frame;\n\n  useLayoutEffect(() => {\n    return drawPropagateStore.subscribe(() => {\n      if (frameRef.current) {\n        drawAxes(frameRef.current!);\n      }\n    }, CANPLOT_LAYER.BOTTOM);\n  }, [drawPropagateStore]);\n\n  useLayoutEffect(() => {\n    let requestedAnimationFrame: number | null = null;\n    requestedAnimationFrame = window.requestAnimationFrame(() => {\n      requestedAnimationFrame = null;\n      drawPropagateStore.notifyListeners();\n    });\n    return () => {\n      if (requestedAnimationFrame) {\n        cancelAnimationFrame(requestedAnimationFrame);\n      }\n    };\n  }, [drawVersion, frame, drawPropagateStore]);\n\n  const onRequestUpdate = useCallback(() => {\n    setDrawVersion((v) => v + 1);\n  }, [setDrawVersion]);\n\n  return (\n    <DrawPropagateContext.Provider value={drawPropagateStore}>\n      <RedrawRequestContext.Provider value={onRequestUpdate}>\n        <FrameContext.Provider value={frame}>{children}</FrameContext.Provider>\n      </RedrawRequestContext.Provider>\n    </DrawPropagateContext.Provider>\n  );\n};\n\nconst useSize = (ref: React.RefObject<HTMLElement | null>) => {\n  const [plotSize, setPlotSize] = useState<PlotSize>({\n    width: 0,\n    height: 0,\n  });\n\n  const [resizeObserver] = useState(() => {\n    return new ResizeObserver((entries) => {\n      for (const entry of entries) {\n        const width = Math.round(entry.contentRect.width);\n        const height = Math.round(entry.contentRect.height);\n\n        setPlotSize((prev) =>\n          prev.width !== width || prev.height !== height\n            ? { ...prev, width, height }\n            : prev\n        );\n      }\n    });\n  });\n\n  useLayoutEffect(() => {\n    if (!ref.current) return;\n    const width = ref.current.clientWidth;\n    const height = ref.current.clientHeight;\n    setPlotSize((prev) =>\n      prev.width !== width || prev.height !== height\n        ? { ...prev, width, height }\n        : prev\n    );\n    resizeObserver.observe(ref.current, { box: \"border-box\" });\n    return () => resizeObserver.disconnect();\n  }, [resizeObserver, ref]);\n  return plotSize;\n};\n\nconst makeFrame = (\n  configuration: PlotConfiguration,\n  size: PlotSize,\n  ctx: CanvasRenderingContext2D | null\n): PlotDrawFrame | null => {\n  if (!ctx) {\n    return null;\n  }\n  const dpr = window.devicePixelRatio || 1;\n\n  if (size.width === 0 || size.height === 0) {\n    return null;\n  }\n\n  const chartAreaCSS: PlotDrawFrame[\"chartAreaCSS\"] = {\n    x: configuration.padding.left,\n    y: configuration.padding.top,\n    width:\n      size.width - configuration.padding.left - configuration.padding.right,\n    height:\n      size.height - configuration.padding.top - configuration.padding.bottom,\n  };\n\n  for (const scale of configuration.scales) {\n    if (!scale.axis) continue;\n    if (scale.origin === \"x\") {\n      if (scale.axis.position === \"bottom\" || scale.axis.position === \"top\") {\n        chartAreaCSS.height = Math.max(\n          0,\n          chartAreaCSS.height - scale.axis.size\n        );\n        if (scale.axis.position === \"top\") {\n          chartAreaCSS.y += scale.axis.size;\n        }\n      }\n    } else {\n      if (scale.axis.position === \"left\" || scale.axis.position === \"right\") {\n        chartAreaCSS.width = Math.max(0, chartAreaCSS.width - scale.axis.size);\n        if (scale.axis.position === \"left\") {\n          chartAreaCSS.x += scale.axis.size;\n        }\n      }\n    }\n  }\n\n  const chartAreaCanvasPX: PlotDrawFrame[\"chartAreaCanvasPX\"] = {\n    x: chartAreaCSS.x * dpr,\n    y: chartAreaCSS.y * dpr,\n    width: chartAreaCSS.width * dpr,\n    height: chartAreaCSS.height * dpr,\n  };\n\n  const scales: PlotDrawFrame[\"scales\"] = [];\n\n  let currentLeftOffset = configuration.padding.left * dpr;\n  let currentRightOffset = size.width * dpr - configuration.padding.right * dpr;\n  let currentBottomOffset =\n    size.height * dpr - configuration.padding.bottom * dpr;\n  let currentTopOffset = configuration.padding.top * dpr;\n\n  for (const scale of configuration.scales) {\n    if (!scale.axis) {\n      scales.push({ ...scale, axis: null });\n      continue;\n    }\n    let cssRect: Rect;\n    if (scale.origin === \"x\") {\n      switch (scale.axis.position) {\n        case \"bottom\":\n          currentBottomOffset -= scale.axis.size * dpr;\n          cssRect = {\n            x: chartAreaCSS.x,\n            y: currentBottomOffset / dpr,\n            width: chartAreaCSS.width,\n            height: scale.axis.size,\n          };\n          break;\n        case \"top\":\n          currentTopOffset += scale.axis.size * dpr;\n          cssRect = {\n            x: chartAreaCSS.x,\n            y: currentTopOffset / dpr - scale.axis.size,\n            width: chartAreaCSS.width,\n            height: scale.axis.size,\n          };\n          break;\n        case \"left\":\n        case \"right\":\n          throw new Error(\"Invalid axis position for x origin\");\n      }\n    } else {\n      switch (scale.axis.position) {\n        case \"left\":\n          currentLeftOffset += scale.axis.size * dpr;\n          cssRect = {\n            x: currentLeftOffset / dpr - scale.axis.size,\n            y: chartAreaCSS.y,\n            width: scale.axis.size,\n            height: chartAreaCSS.height,\n          };\n          break;\n        case \"right\":\n          currentRightOffset -= scale.axis.size * dpr;\n          cssRect = {\n            x: currentRightOffset / dpr,\n            y: chartAreaCSS.y,\n            width: scale.axis.size,\n            height: chartAreaCSS.height,\n          };\n          break;\n        case \"top\":\n        case \"bottom\":\n          throw new Error(\"Invalid axis position for y origin\");\n      }\n    }\n    const canvasRect: Rect = {\n      x: cssRect.x * dpr,\n      y: cssRect.y * dpr,\n      width: cssRect.width * dpr,\n      height: cssRect.height * dpr,\n    };\n    scales.push({\n      ...scale,\n      axis: {\n        ...scale.axis,\n        cssRect,\n        canvasRect,\n      },\n    });\n  }\n\n  const result: PlotDrawFrame = {\n    ctx,\n    dpr,\n    padding: configuration.padding,\n    scales,\n    chartAreaCSS,\n    chartAreaCanvasPX,\n  };\n\n  return result;\n};\n","import {\n  useContext,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport { CANPLOT_LAYER, FrameDrawer } from \"./FrameDrawer\";\nimport { FrameContext } from \"./contexts/FrameContext\";\nimport { RedrawRequestContext } from \"./contexts/RedrawRequestContext\";\nimport { DrawPropagateContext } from \"./contexts/DrawPropagateContext\";\nimport { deepEqual } from \"./helpers\";\n\nexport const useDrawEffectNoCache = (\n  layer: number | keyof typeof CANPLOT_LAYER,\n  runner: (params: FrameDrawer) => void,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  deps: ReadonlyArray<any>,\n) => {\n  const frame = useContext(FrameContext);\n  const updateRequest = useContext(RedrawRequestContext);\n  const drawPropagateContext = useContext(DrawPropagateContext);\n\n  if (!frame || !updateRequest) {\n    throw new Error(\"useFrame must be used within a CanPlot component\");\n  }\n\n  const [frameDrawer] = useState(() => new FrameDrawer());\n  frameDrawer._updateFrame(frame);\n\n  const frameRef = useRef(frameDrawer);\n  frameRef.current = frameDrawer;\n\n  const runnerRef = useRef(runner);\n  runnerRef.current = runner;\n\n  useLayoutEffect(() => {\n    // subscribe to updates\n    const unsubscribe = drawPropagateContext.subscribe(\n      () => {\n        runnerRef.current(frameDrawer);\n      },\n      typeof layer === \"number\" ? layer : CANPLOT_LAYER[layer],\n    );\n    return () => {\n      unsubscribe();\n    };\n  }, [drawPropagateContext, layer, frameDrawer]);\n\n  useLayoutEffect(() => {\n    updateRequest();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [updateRequest, ...deps]);\n\n  useEffect(() => {\n    return () => {\n      // request redraw on unmount to clear the layer\n      updateRequest();\n    };\n  }, [updateRequest]);\n};\n\nexport const useDrawEffect = ({\n  layer,\n  runner,\n  globalAlpha,\n  globalCompositeOperation,\n  deps,\n}: {\n  layer: number | keyof typeof CANPLOT_LAYER;\n  runner: (params: FrameDrawer) => void;\n  globalAlpha?: number;\n  globalCompositeOperation?: GlobalCompositeOperation;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  deps: ReadonlyArray<any>;\n}) => {\n  const frame = useContext(FrameContext);\n  const updateRequest = useContext(RedrawRequestContext);\n  const drawPropagateContext = useContext(DrawPropagateContext);\n\n  if (!frame || !updateRequest) {\n    throw new Error(\n      \"useCachedDrawEffect must be used within a CanPlot component\",\n    );\n  }\n\n  const [frameDrawer] = useState(() => new FrameDrawer());\n  frameDrawer._updateFrame(frame);\n\n  const [offscreenFrameDrawer] = useState(() => new FrameDrawer());\n\n  const runnerRef = useRef(runner);\n  runnerRef.current = runner;\n\n  const offscreenRef = useRef<{\n    canvas: HTMLCanvasElement;\n    ctx: CanvasRenderingContext2D;\n  } | null>(null);\n  const needsRedrawRef = useRef(true);\n\n  // Derive a stable key from scale limits so cache invalidates on scale changes\n  const scaleLimitsKey = frame.scales\n    .map((s) => `${s.id}:${s.min}:${s.max}`)\n    .join(\"|\");\n\n  useLayoutEffect(() => {\n    const unsubscribe = drawPropagateContext.subscribe(\n      () => {\n        const canvasWidth = frameDrawer.ctx.canvas.width;\n        const canvasHeight = frameDrawer.ctx.canvas.height;\n        const sanitizedGlobalAlpha = globalAlpha ?? 1;\n\n        if (canvasWidth === 0 || canvasHeight === 0) return;\n\n        // Ensure offscreen canvas matches main canvas size\n        const offscreen = offscreenRef.current;\n        if (\n          !offscreen ||\n          offscreen.canvas.width !== canvasWidth ||\n          offscreen.canvas.height !== canvasHeight\n        ) {\n          const canvas = offscreen?.canvas ?? document.createElement(\"canvas\");\n          canvas.width = canvasWidth;\n          canvas.height = canvasHeight;\n          const offscreenCtx = canvas.getContext(\"2d\")!;\n          offscreenRef.current = { canvas, ctx: offscreenCtx };\n          needsRedrawRef.current = true;\n        }\n        let offscreenFrame = null;\n        try {\n          offscreenFrame = offscreenFrameDrawer.frame;\n        } catch (error) {\n        }\n        if (!deepEqual(offscreenFrame?.chartAreaCanvasPX, frameDrawer.frame.chartAreaCanvasPX)) {\n          needsRedrawRef.current = true;\n        }\n\n\n        if (needsRedrawRef.current) {\n          offscreenRef.current!.ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n          offscreenFrameDrawer._updateFrame({\n            ...frameDrawer.frame,\n            ctx: offscreenRef.current!.ctx,\n          });\n          if (sanitizedGlobalAlpha > 0) {\n            runnerRef.current(offscreenFrameDrawer);\n          }\n          needsRedrawRef.current = false;\n        }\n\n        // Copy cached bitmap to main canvas\n        const oldGlobalAlpha = frameDrawer.ctx.globalAlpha;\n        const oldGlobalCompositeOperation =\n          frameDrawer.ctx.globalCompositeOperation;\n        frameDrawer.ctx.globalAlpha = sanitizedGlobalAlpha;\n        frameDrawer.ctx.globalCompositeOperation =\n          globalCompositeOperation ?? \"source-over\";\n        frameDrawer.ctx.drawImage(offscreenRef.current!.canvas, 0, 0);\n        frameDrawer.ctx.globalAlpha = oldGlobalAlpha;\n        frameDrawer.ctx.globalCompositeOperation = oldGlobalCompositeOperation;\n      },\n      typeof layer === \"number\" ? layer : CANPLOT_LAYER[layer],\n    );\n    return () => {\n      unsubscribe();\n    };\n  }, [\n    drawPropagateContext,\n    layer,\n    frameDrawer,\n    offscreenFrameDrawer,\n    globalAlpha,\n    globalCompositeOperation,\n  ]);\n\n  useLayoutEffect(() => {\n    needsRedrawRef.current = true;\n    updateRequest();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    updateRequest,\n    scaleLimitsKey,\n    globalAlpha,\n    globalCompositeOperation,\n    ...deps,\n  ]);\n\n  useEffect(() => {\n    return () => {\n      // request redraw on unmount to clear the layer\n      updateRequest();\n    };\n  }, [updateRequest]);\n};\n\nexport const useFrameState = () => {\n  const frame = useContext(FrameContext);\n  if (!frame) {\n    throw new Error(\"useFrame must be used within a CanPlot component\");\n  }\n  return useMemo(() => {\n    const frameDrawer = new FrameDrawer();\n    frameDrawer._updateFrame(frame);\n    return frameDrawer;\n  }, [frame]);\n};\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\nimport type { OutlierStrategy } from \"../types\";\n\nconst LinePlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: number; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  globalAlpha?: number;\n  xGapWidth?: number;\n  xStrategy?: OutlierStrategy;\n  yStrategy?: OutlierStrategy;\n  style?: Partial<\n    {\n      lineDash: number[];\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({\n  layer = \"MIDDLE\",\n  data,\n  xScaleId,\n  yScaleId,\n  style,\n  globalAlpha,\n  xGapWidth,\n  xStrategy = \"clip\",\n  yStrategy = \"clip\",\n}) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, valToPosWithStrategy }) => {\n      ctx.save();\n      ctx.beginPath();\n      applyStyles(ctx, style);\n      const oldLineDash = ctx.getLineDash();\n      if (style?.lineDash) {\n        ctx.setLineDash(style.lineDash);\n      }\n      let lastX: number | null = null;\n      for (const point of data) {\n        const xPos = valToPosWithStrategy(\n          point.x,\n          xScaleId,\n          \"canvas\",\n          xStrategy,\n        );\n        const yPos = valToPosWithStrategy(\n          point.y,\n          yScaleId,\n          \"canvas\",\n          yStrategy,\n        );\n\n        if (xPos === null || yPos === null) {\n          continue;\n        }\n        if (\n          lastX !== null &&\n          xGapWidth !== undefined &&\n          point.x - lastX > xGapWidth\n        ) {\n          ctx.moveTo(xPos, yPos);\n        } else {\n          ctx.lineTo(xPos, yPos);\n        }\n        lastX = point.x;\n      }\n      ctx.stroke();\n      if (oldLineDash) {\n        ctx.setLineDash(oldLineDash);\n      }\n      ctx.restore();\n    },\n    deps: [data, xScaleId, yScaleId, style, xGapWidth, xStrategy, yStrategy],\n  });\n  return null;\n};\n\nexport const LinePlot = React.memo(LinePlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\nimport type { OutlierStrategy } from \"../types\";\n\nconst ScatterPlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: number; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  radius?: number;\n  globalAlpha?: number;\n  xStrategy?: OutlierStrategy;\n  yStrategy?: OutlierStrategy;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({\n  layer = \"MIDDLE\",\n  data,\n  xScaleId,\n  yScaleId,\n  xStrategy = \"clip\",\n  yStrategy = \"clip\",\n  radius = 5,\n  style,\n  globalAlpha,\n}) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, valToPosWithStrategy }) => {\n      ctx.save();\n      applyStyles(ctx, style);\n\n      const points = [];\n\n      for (const point of data) {\n        const xPos = valToPosWithStrategy(\n          point.x,\n          xScaleId,\n          \"canvas\",\n          xStrategy,\n        );\n        const yPos = valToPosWithStrategy(\n          point.y,\n          yScaleId,\n          \"canvas\",\n          yStrategy,\n        );\n\n        if (xPos === null || yPos === null) continue;\n\n        points.push({ x: xPos, y: yPos });\n      }\n\n      // FILL (per point)\n      if (style?.fillStyle) {\n        for (const p of points) {\n          ctx.beginPath();\n          ctx.arc(p.x, p.y, radius, 0, Math.PI * 2);\n          ctx.fill();\n        }\n      }\n\n      // STROKE (batch)\n      if (style?.strokeStyle) {\n        ctx.beginPath();\n        for (const p of points) {\n          ctx.moveTo(p.x + radius, p.y); // ważne dla poprawnego stroke\n          ctx.arc(p.x, p.y, radius, 0, Math.PI * 2);\n        }\n        ctx.stroke();\n      }\n\n      ctx.restore();\n    },\n    deps: [data, xScaleId, yScaleId, radius, style, xStrategy, yStrategy],\n  });\n  return null;\n};\n\nexport const ScatterPlot = React.memo(ScatterPlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\n\nconst BarPlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: readonly [number, number]; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  globalAlpha?: number;\n  radius?: number;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({\n  data,\n  xScaleId,\n  yScaleId,\n  style,\n  globalAlpha,\n  radius,\n  layer = \"MIDDLE\",\n}) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, valToPosWithStrategy }) => {\n      if (data.length === 0) return;\n      const yBottom = valToPosWithStrategy(0, yScaleId, \"canvas\", \"clamp\");\n\n      if (yBottom === null) {\n        return;\n      }\n\n      const points: Array<{\n        x0: number;\n        x1: number;\n        y: number;\n        width: number;\n        height: number;\n      }> = [];\n      for (const { x, y } of data) {\n        const x0 = valToPosWithStrategy(x[0], xScaleId, \"canvas\", \"clamp\");\n        const x1 = valToPosWithStrategy(x[1], xScaleId, \"canvas\", \"clamp\");\n        const yTop = valToPosWithStrategy(y, yScaleId, \"canvas\", \"clamp\");\n\n        if (x0 === null || x1 === null || yTop === null || x0 === x1) {\n          continue;\n        }\n\n        const barHeight = yBottom - yTop;\n\n        points.push({\n          x0,\n          x1,\n          y: yTop,\n          width: x1 - x0,\n          height: barHeight,\n        });\n      }\n\n      ctx.save();\n      applyStyles(ctx, style);\n\n      if (style?.fillStyle) {\n        for (const p of points) {\n          ctx.beginPath();\n          if (radius) {\n            ctx.roundRect(p.x0, p.y, p.x1 - p.x0, p.height, radius);\n          } else {\n            ctx.rect(p.x0, p.y, p.x1 - p.x0, p.height);\n          }\n          ctx.fill();\n        }\n      }\n\n      if (style?.strokeStyle) {\n        ctx.beginPath();\n        for (const p of points) {\n          if (radius) {\n            ctx.roundRect(p.x0, p.y, p.x1 - p.x0, p.height, radius);\n          } else {\n            ctx.rect(p.x0, p.y, p.x1 - p.x0, p.height);\n          }\n        }\n        ctx.stroke();\n      }\n\n      ctx.restore();\n    },\n    deps: [\n      data,\n      xScaleId,\n      yScaleId,\n      style,\n      radius,\n    ],\n  });\n  return null;\n};\n\nexport const BarPlot = React.memo(BarPlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\n\nconst AreaPlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: ReadonlyArray<{ x: number; y: readonly [number, number] }>;\n  xScaleId: string;\n  yScaleId: string;\n  globalAlpha?: number;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({ layer = \"MIDDLE\", data, xScaleId, yScaleId, style, globalAlpha }) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n      const drawPoints: Array<{ x: number; y: number }> = [];\n      for (const datapoint of data) {\n        // x\n        const x = clampXPosToChartArea(valToPos(datapoint.x, xScaleId));\n        if (x === null) {\n          continue;\n        }\n\n        // y0\n        const y0 = clampYPosToChartArea(valToPos(datapoint.y[0], yScaleId));\n        if (y0 === null) {\n          continue;\n        }\n\n        // y1\n        const y1 = clampYPosToChartArea(valToPos(datapoint.y[1], yScaleId));\n        if (y1 === null) {\n          continue;\n        }\n\n        drawPoints.push({ x, y: y0 });\n        drawPoints.unshift({ x, y: y1 });\n      }\n      const firstPoint = drawPoints[0];\n      if (firstPoint) {\n        ctx.save();\n        ctx.beginPath();\n        applyStyles(ctx, style);\n        ctx.moveTo(firstPoint.x, firstPoint.y);\n        for (const point of drawPoints) {\n          ctx.lineTo(point.x, point.y);\n        }\n        ctx.closePath();\n        ctx.fill();\n        ctx.restore();\n      }\n    },\n    deps: [data, xScaleId, yScaleId, style],\n  });\n  return null;\n};\n\nexport const AreaPlot = React.memo(AreaPlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\n\nconst SparklinePlotImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  data: Array<{ x: number; y: number }>;\n  xScaleId: string;\n  yScaleId: string;\n  stroked?: boolean;\n  globalAlpha?: number;\n  style?: Partial<\n    {\n      fillStyle: CanvasFillStrokeStyles[\"fillStyle\"];\n      strokeStyle: CanvasFillStrokeStyles[\"strokeStyle\"];\n    } & Pick<\n      CanvasPathDrawingStyles,\n      \"lineCap\" | \"lineDashOffset\" | \"lineJoin\" | \"lineWidth\" | \"miterLimit\"\n    >\n  >;\n}> = ({ layer = \"MIDDLE\", data, stroked, xScaleId, yScaleId, style, globalAlpha }) => {\n  useDrawEffect({\n    layer,\n    globalAlpha,\n    runner: ({ ctx, clampXPosToChartArea, clampYPosToChartArea, valToPos }) => {\n      const drawPoints: Array<{ x: number; y: number }> = [];\n\n      for (const point of data) {\n        const x = clampXPosToChartArea(valToPos(point.x, xScaleId));\n        const y = clampYPosToChartArea(valToPos(point.y, yScaleId));\n        if (x === null || y === null) {\n          continue;\n        }\n        drawPoints.push({ x, y });\n      }\n      const first = drawPoints.at(0);\n      const last = drawPoints.at(-1);\n\n      if (!first || !last) {\n        return;\n      }\n      const scaledZeroY = clampYPosToChartArea(valToPos(0, yScaleId));\n      if (scaledZeroY === null) {\n        return;\n      }\n\n      ctx.save();\n      ctx.beginPath();\n      applyStyles(ctx, style);\n      ctx.moveTo(first.x, scaledZeroY);\n      for (const point of drawPoints) {\n        ctx.lineTo(point.x, point.y);\n      }\n      ctx.lineTo(last.x, scaledZeroY);\n      ctx.closePath();\n      ctx.fill();\n      if (stroked) {\n        ctx.beginPath();\n        ctx.moveTo(first.x, first.y);\n        for (const point of drawPoints) {\n          ctx.lineTo(point.x, point.y);\n        }\n        ctx.stroke();\n      }\n      ctx.restore();\n    },\n    deps: [data, stroked, xScaleId, yScaleId, style],\n  });\n  return null;\n};\n\nexport const SparklinePlot = React.memo(SparklinePlotImpl, deepEqual);\n","import React from \"react\";\nimport { useDrawEffect } from \"../frameContext\";\nimport type { CANPLOT_LAYER } from \"../FrameDrawer\";\nimport { applyStyles, deepEqual } from \"../helpers\";\nimport type { Style, TicksConfig } from \"../types\";\n\nconst XTicksImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  scaleId: string;\n  withGrid?: boolean;\n  gridStyle?: Style;\n  tickStyle?: Style;\n  labelStyle?: Style;\n  labelGap?: number;\n  tickSize?: number;\n  ticks: TicksConfig;\n}> = ({\n  layer = \"BOTTOM\",\n  scaleId,\n  withGrid,\n  gridStyle,\n  tickStyle,\n  labelStyle,\n  labelGap,\n  tickSize,\n  ticks,\n}) => {\n  useDrawEffect({\n    layer,\n    runner: ({ ctx, valToPos, getScale, frame }) => {\n      const scale = getScale(scaleId);\n      if (!scale || !scale.axis || scale.origin !== \"x\") return;\n      const axis = scale.axis;\n      const y =\n        axis.position === \"top\"\n          ? axis.canvasRect.y + axis.canvasRect.height\n          : axis.canvasRect.y;\n\n      const dpr = window.devicePixelRatio || 1;\n      const y0 = y;\n      const effectiveTickSize = (tickSize ?? 6) * dpr;\n      const y1 =\n        axis.position === \"top\" ? y - effectiveTickSize : y + effectiveTickSize;\n      const multilineGap = (labelGap ?? 12) * dpr;\n\n      // draw ticks\n      ctx.save();\n      ctx.fontKerning = \"auto\";\n      applyStyles(ctx, {\n        ...tickStyle,\n      });\n      ctx.beginPath();\n      const resolvedTicks = Array.isArray(ticks)\n        ? ticks\n        : ticks({ ...scale, axis }, frame);\n\n      for (const { value } of resolvedTicks) {\n        const x = valToPos(value, scaleId, \"canvas\");\n        if (x === null) {\n          continue;\n        }\n        ctx.moveTo(x, y0);\n        ctx.lineTo(x, y1);\n      }\n      ctx.stroke();\n      ctx.restore();\n\n      // draw grid lines\n      if (withGrid) {\n        ctx.save();\n        applyStyles(ctx, {\n          ...gridStyle,\n        });\n        ctx.beginPath();\n        for (const { value } of resolvedTicks) {\n          const x = valToPos(value, scaleId, \"canvas\");\n          if (x === null) {\n            continue;\n          }\n          ctx.moveTo(x, frame.chartAreaCanvasPX.y);\n          ctx.lineTo(x, frame.chartAreaCanvasPX.y + frame.chartAreaCanvasPX.height);\n        }\n        ctx.stroke();\n        ctx.restore();\n      }\n\n      // draw tick labels\n      ctx.save();\n\n      applyStyles(ctx, {\n        textBaseline: axis.position === \"top\" ? \"bottom\" : \"top\",\n        textAlign: \"center\",\n        ...tickStyle,\n        ...labelStyle,\n        // alter font size for DPR\n        font: dprFont(labelStyle?.font ?? tickStyle?.font),\n      });\n      for (const { value, label } of resolvedTicks) {\n        const x = valToPos(value, scaleId, \"canvas\");\n        if (x === null) {\n          continue;\n        }\n        const labelLines = label.split(\"\\n\");\n        for (let j = 0; j < labelLines.length; j++) {\n          ctx.fillText(labelLines[j], x, y1 + dpr * 2 + j * multilineGap);\n        }\n      }\n      ctx.restore();\n    },\n    deps: [ticks, scaleId, tickStyle, labelStyle, withGrid, gridStyle],\n  });\n  return null;\n};\n\nexport const XTicks = React.memo(XTicksImpl, deepEqual);\n\nconst YTicksImpl: React.FC<{\n  layer?: number | keyof typeof CANPLOT_LAYER;\n  scaleId: string;\n  withGrid?: boolean;\n  gridStyle?: Style;\n  tickStyle?: Style;\n  labelStyle?: Style;\n  labelGap?: number;\n  tickSize?: number;\n  ticks: TicksConfig;\n}> = ({\n  layer = \"BOTTOM\",\n  scaleId,\n  withGrid,\n  gridStyle,\n  tickStyle,\n  labelStyle,\n  labelGap,\n  tickSize,\n  ticks,\n}) => {\n  useDrawEffect({\n    layer,\n    runner: ({ ctx, valToPos, getScale, frame }) => {\n      const scale = getScale(scaleId);\n      if (!scale || !scale.axis || scale.origin !== \"y\") return;\n      const axis = scale.axis;\n      const x =\n        axis.position === \"left\"\n          ? axis.canvasRect.x + axis.canvasRect.width\n          : axis.canvasRect.x;\n\n      const x0 = x;\n      const effectiveTickSize = tickSize ?? 6;\n      const x1 =\n        axis.position === \"left\"\n          ? x - effectiveTickSize\n          : x + effectiveTickSize;\n      const multilineGap = labelGap ?? 12;\n\n      const resolvedTicks = Array.isArray(ticks)\n        ? ticks\n        : ticks({ ...scale, axis }, frame);\n\n      // draw ticks\n      ctx.save();\n      ctx.fontKerning = \"auto\";\n      applyStyles(ctx, { ...tickStyle });\n      ctx.beginPath();\n\n      for (const { value } of resolvedTicks) {\n        const y = valToPos(value, scaleId, \"canvas\");\n        if (y === null) {\n          continue;\n        }\n        ctx.moveTo(x0, y);\n        ctx.lineTo(x1, y);\n      }\n      ctx.stroke();\n      ctx.restore();\n\n      if(withGrid) {\n        // draw grid lines\n        ctx.save();\n        applyStyles(ctx, {\n          ...gridStyle,\n        });\n        ctx.beginPath();\n        for (const { value } of resolvedTicks) {\n          const y = valToPos(value, scaleId, \"canvas\");\n          if (y === null) {\n            continue;\n          }\n          ctx.moveTo(frame.chartAreaCanvasPX.x, y);\n          ctx.lineTo(frame.chartAreaCanvasPX.x + frame.chartAreaCanvasPX.width, y);\n        }\n        ctx.stroke();\n        ctx.restore();\n      }\n\n      // draw tick labels\n      ctx.save();\n      applyStyles(ctx, {\n        textBaseline: \"middle\",\n        textAlign: axis.position === \"left\" ? \"right\" : \"left\",\n        ...tickStyle,\n        ...labelStyle,\n        // alter font size for DPR\n        font: dprFont(labelStyle?.font ?? tickStyle?.font),\n      });\n      for (const { value, label } of resolvedTicks) {\n        const y = valToPos(value, scaleId, \"canvas\");\n        if (y === null) {\n          continue;\n        }\n        const labelLines = label.split(\"\\n\");\n        for (let j = 0; j < labelLines.length; j++) {\n          ctx.fillText(` ${labelLines[j]} `, x1, y + j * multilineGap);\n        }\n      }\n      ctx.restore();\n    },\n    deps: [ticks, scaleId, tickStyle, labelStyle, withGrid, gridStyle],\n  });\n  return null;\n};\n\nexport const YTicks = React.memo(YTicksImpl, deepEqual);\n\nconst dprFont = (font: string | undefined) => {\n  if (font) {\n    try {\n      return font.replace(/(\\d+)px/, (_, size) => {\n        return `${parseInt(size) * window.devicePixelRatio || 1}px`;\n      });\n    } catch {\n      // ignore\n    }\n  }\n  return font;\n};\n","import React from \"react\";\nimport type {\n  ClickEvent,\n  DblClickEvent,\n  DocumentMouseUpEvent,\n  MouseDownEvent,\n  MouseUpEvent,\n  MoveEvent,\n  SpanSelectEvent,\n  PressAndWheelEvent,\n  SyncEvent_Move,\n  ContextMenuEvent,\n} from \"./types\";\n\nexport const makeInteractionsBus = <T>() => {\n  const listeners: {\n    syncKey: string;\n    callback: (syncKey: string, payload: T) => void;\n  }[] = [];\n  return {\n    addEventListener: (\n      syncKey: string,\n      callback: (syncKey: string, payload: T) => void\n    ) => {\n      listeners.push({\n        syncKey,\n        callback,\n      });\n      return () => {\n        const index = listeners.findIndex((l) => l.callback === callback);\n        if (index !== -1) {\n          listeners.splice(index, 1);\n        }\n      };\n    },\n    dispatchEvent: (syncKey: string, payload: T) => {\n      for (const listener of listeners) {\n        if (listener.syncKey === syncKey) {\n          listener.callback(syncKey, payload);\n        }\n      }\n    },\n  };\n};\n\nexport type InteractionsBus<T> = ReturnType<typeof makeInteractionsBus<T>>;\n\nexport const InteractionsBus = {\n  dblclick: makeInteractionsBus<DblClickEvent>(),\n  click: makeInteractionsBus<ClickEvent>(),\n  contextmenu: makeInteractionsBus<ContextMenuEvent>(),\n  move: makeInteractionsBus<MoveEvent>(),\n  mousedown: makeInteractionsBus<MouseDownEvent>(),\n  mouseup: makeInteractionsBus<MouseUpEvent>(),\n  spanselect: makeInteractionsBus<SpanSelectEvent>(),\n  documentmouseup: makeInteractionsBus<DocumentMouseUpEvent>(),\n  pressandwheel: makeInteractionsBus<PressAndWheelEvent>(),\n  sync_move: makeInteractionsBus<SyncEvent_Move>(),\n};\n\nexport const useGenericInteractionsEvent = <\n  K extends keyof typeof InteractionsBus\n>(\n  eventName: K,\n  syncKey: string,\n  callback: (\n    payload: Parameters<(typeof InteractionsBus)[K][\"dispatchEvent\"]>[1],\n    syncKey: string\n  ) => void\n) => {\n  const callbackRef = React.useRef(callback);\n  callbackRef.current = callback;\n\n  React.useEffect(() => {\n    const removeListener = InteractionsBus[eventName].addEventListener(\n      syncKey,\n      (syncKey, payload) => {\n        callbackRef.current(payload, syncKey);\n      }\n    );\n    return removeListener;\n  }, [syncKey, eventName, callbackRef]);\n};\n\nexport const InteractionsIdContext = React.createContext<string>(\"\");\n\nexport const useInteractionsEvent = <K extends keyof typeof InteractionsBus>(\n  eventName: K,\n  callback: (\n    payload: Parameters<(typeof InteractionsBus)[K][\"dispatchEvent\"]>[1],\n    syncKey: string\n  ) => void\n) => {\n  const interactionsId = React.useContext(InteractionsIdContext);\n\n  return useGenericInteractionsEvent(eventName, interactionsId, callback);\n};\n","import { posToVal, valFits, valToPos } from \"../helpers\";\nimport type { PlotDrawFrame, PlotDrawScaleConfig } from \"../types\";\nimport type {\n  InteractionsEventPointerPosition,\n  InteractionsSyncConfig,\n  PointerSyncPosition,\n  ScaledSelectionRange,\n} from \"./types\";\n\nexport const makePointerSyncPosition = (\n  event: Pick<MouseEvent, \"clientX\" | \"clientY\">,\n  rect: DOMRect | undefined,\n  frame: PlotDrawFrame,\n  sync: InteractionsSyncConfig | undefined\n):\n  | { pointerSyncPosition: PointerSyncPosition; cssX: number; cssY: number }\n  | undefined => {\n  if (!rect) return;\n  const effectiveXSyncViaScaleId =\n    sync?.xViaScaleId ?? frame.scales.find((s) => s.origin === \"x\")?.id;\n  const effectiveYSyncViaScaleId =\n    sync?.yViaScaleId ?? frame.scales.find((s) => s.origin === \"y\")?.id;\n\n  const cssX = event.clientX - rect.left;\n  const x: PointerSyncPosition[\"x\"] = effectiveXSyncViaScaleId\n    ? (() => {\n      const value = posToVal(\n        frame,\n        cssX,\n        effectiveXSyncViaScaleId,\n        \"css\"\n      )!;\n      return {\n        scaleId: effectiveXSyncViaScaleId,\n        value,\n        normalized: sync?.xToNormalized?.(value) ?? null,\n      };\n    })()\n    : null;\n\n  const cssY = event.clientY - rect.top;\n  const y: PointerSyncPosition[\"y\"] = effectiveYSyncViaScaleId\n    ? (() => {\n      const value = posToVal(\n        frame,\n        cssY,\n        effectiveYSyncViaScaleId,\n        \"css\"\n      )!;\n      return {\n        scaleId: effectiveYSyncViaScaleId,\n        value,\n        normalized: sync?.yToNormalized?.(value) ?? null,\n      };\n    })()\n    : null;\n\n  return { pointerSyncPosition: { x, y }, cssX, cssY };\n};\n\nconst makeToNormalized = (\n  sync: InteractionsSyncConfig | undefined\n): InteractionsEventPointerPosition[\"toNormalized\"] => {\n  return (value, axis) => {\n    const fn = axis === \"x\" ? sync?.xToNormalized : sync?.yToNormalized;\n    return fn?.(value) ?? null;\n  };\n};\n\nconst makeFromNormalized = (\n  sync: InteractionsSyncConfig | undefined\n): InteractionsEventPointerPosition[\"fromNormalized\"] => {\n  return (normalized, axis) => {\n    const fn = axis === \"x\" ? sync?.xFromNormalized : sync?.yFromNormalized;\n    return fn?.(normalized) ?? null;\n  };\n};\n\nexport const pointerSyncPositionToInteractionsPosition = (\n  pointerSyncPosition: PointerSyncPosition,\n  frame: PlotDrawFrame,\n  sync: InteractionsSyncConfig | undefined\n): InteractionsEventPointerPosition | undefined => {\n  const { x, y } = pointerSyncPosition;\n\n  const resolveAxisCss = (\n    axis: \"x\" | \"y\",\n    source: PointerSyncPosition[\"x\"] | PointerSyncPosition[\"y\"]\n  ): number | null => {\n    if (!source) return null;\n    const viaScaleId = axis === \"x\" ? sync?.xViaScaleId : sync?.yViaScaleId;\n    const fromNormalized =\n      axis === \"x\" ? sync?.xFromNormalized : sync?.yFromNormalized;\n\n    // Preferred: normalized bridge.\n    if (\n      source.normalized !== null &&\n      fromNormalized &&\n      viaScaleId &&\n      frame.scales.some((s) => s.id === viaScaleId)\n    ) {\n      const localValue = fromNormalized(source.normalized);\n      if (localValue === null || !Number.isFinite(localValue)) {\n        // fall through to matching-scale-id path\n      } else if (!valFits(frame, localValue, viaScaleId)) {\n        return null;\n      } else {\n        return valToPos(frame, localValue, viaScaleId, \"css\");\n      }\n    }\n\n    // Fallback: matching source scale id in receiver frame.\n    if (frame.scales.some((s) => s.id === source.scaleId)) {\n      if (!valFits(frame, source.value, source.scaleId)) {\n        return null;\n      }\n      return valToPos(frame, source.value, source.scaleId, \"css\");\n    }\n\n    return null;\n  };\n\n  const cssX = resolveAxisCss(\"x\", x);\n  const cssY = resolveAxisCss(\"y\", y);\n\n  return {\n    cssX,\n    cssY,\n    scaled: Object.fromEntries(\n      frame.scales.flatMap((scale) => {\n        const pos = scale.origin === \"y\" ? cssY : cssX;\n        if (pos === null) {\n          return [];\n        }\n\n        return [[scale.id, posToVal(frame, pos, scale.id, \"css\")!]];\n      })\n    ),\n    normalizedX: x?.normalized ?? null,\n    normalizedY: y?.normalized ?? null,\n    toNormalized: makeToNormalized(sync),\n    fromNormalized: makeFromNormalized(sync),\n  };\n};\n\nexport const makeSpanSelectHelpers = (\n  sync: InteractionsSyncConfig | undefined\n): {\n  toNormalized: (value: number, axis: \"x\" | \"y\") => number | null;\n  fromNormalized: (normalized: number, axis: \"x\" | \"y\") => number | null;\n} => {\n  return {\n    toNormalized: makeToNormalized(sync),\n    fromNormalized: makeFromNormalized(sync),\n  };\n};\n\nexport const extrapolateScaledSelectionRange = (\n  origin: PlotDrawScaleConfig[\"origin\"],\n  selectionRange: ScaledSelectionRange,\n  frame: PlotDrawFrame\n): {\n  fromCSS: number;\n  toCSS: number;\n  scaled: ScaledSelectionRange[];\n} | null => {\n  const fromCSS = valToPos(\n    frame,\n    selectionRange.from,\n    selectionRange.scaleId,\n    \"css\"\n  );\n  const toCSS = valToPos(\n    frame,\n    selectionRange.to,\n    selectionRange.scaleId,\n    \"css\"\n  );\n  if (fromCSS === null || toCSS === null) {\n    return null;\n  }\n  const scaled: ScaledSelectionRange[] = frame.scales.flatMap(\n    (scale): ScaledSelectionRange[] => {\n      if (scale.origin !== origin) {\n        return [];\n      }\n      const from = posToVal(frame, fromCSS, scale.id, \"css\");\n      const to = posToVal(frame, toCSS, scale.id, \"css\");\n      if (from === null || to === null) {\n        return [];\n      }\n      return [\n        {\n          scaleId: scale.id,\n          from,\n          to,\n        },\n      ];\n    }\n  );\n  return {\n    fromCSS,\n    toCSS,\n    scaled,\n  };\n};\n","import { useContext, useEffect, useId, useRef } from \"react\";\nimport {\n  clampXPosToChartArea,\n  clampYPosToChartArea,\n  getScale,\n  posToVal,\n} from \"../helpers\";\nimport { useFrameState } from \"../frameContext\";\nimport {\n  InteractionsBus,\n  InteractionsIdContext,\n  useGenericInteractionsEvent,\n} from \"./interactionsBus\";\nimport type {\n  ClickEvent,\n  ContextMenuEvent,\n  DblClickEvent,\n  DocumentMouseUpEvent,\n  InteractionsSyncConfig,\n  MouseDownEvent,\n  MouseUpEvent,\n  MoveEvent,\n  PointerSyncPosition,\n  SpanSelectEvent,\n  SyncEvent_Move,\n} from \"./types\";\nimport {\n  extrapolateScaledSelectionRange,\n  makePointerSyncPosition,\n  makeSpanSelectHelpers,\n  pointerSyncPositionToInteractionsPosition,\n} from \"./positioning\";\n\ntype ChartAreaInteractionsProps = {\n  onDblClick?: (event: DblClickEvent) => void;\n  onClick?: (event: ClickEvent) => void;\n  onMouseMove?: (event: MoveEvent) => void;\n  onMouseDown?: (event: MouseDownEvent) => void;\n  onMouseUp?: (event: MouseUpEvent) => void;\n  onDocumentMouseUp?: (event: DocumentMouseUpEvent) => void;\n  onSpanSelect?: (event: SpanSelectEvent) => void;\n  onContextMenu?: (event: ContextMenuEvent) => void;\n  className?: string;\n  style?: React.CSSProperties;\n  id?: string;\n  sync?: InteractionsSyncConfig;\n  children?: React.ReactNode;\n  innerChildren?: React.ReactNode;\n};\n\nexport const ChartAreaInteractions: React.FC<ChartAreaInteractionsProps> = ({\n  id,\n  onClick,\n  onDblClick,\n  onMouseMove,\n  onMouseDown,\n  onMouseUp,\n  onDocumentMouseUp,\n  onSpanSelect,\n  onContextMenu,\n  className,\n  style,\n  sync,\n  innerChildren,\n  children,\n}) => {\n  const interactionsId = useId();\n\n  useGenericInteractionsEvent(\"dblclick\", interactionsId, (event) => {\n    onDblClick?.(event);\n  });\n  useGenericInteractionsEvent(\"click\", interactionsId, (event) => {\n    onClick?.(event);\n  });\n  useGenericInteractionsEvent(\"move\", interactionsId, (event) => {\n    onMouseMove?.(event);\n  });\n  useGenericInteractionsEvent(\"mousedown\", interactionsId, (event) => {\n    onMouseDown?.(event);\n  });\n  useGenericInteractionsEvent(\"mouseup\", interactionsId, (event) => {\n    onMouseUp?.(event);\n  });\n  useGenericInteractionsEvent(\"documentmouseup\", interactionsId, (event) => {\n    onDocumentMouseUp?.(event);\n  });\n  useGenericInteractionsEvent(\"spanselect\", interactionsId, (event) => {\n    onSpanSelect?.(event);\n  });\n  useGenericInteractionsEvent(\"contextmenu\", interactionsId, (event) => {\n    onContextMenu?.(event);\n  });\n\n  return (\n    <InteractionsIdContext.Provider value={interactionsId}>\n      <ChartAreaInteractionsImpl\n        id={id}\n        className={className}\n        style={style}\n        sync={sync}\n      >\n        {innerChildren}\n      </ChartAreaInteractionsImpl>\n      {children}\n    </InteractionsIdContext.Provider>\n  );\n};\n\nconst ChartAreaInteractionsImpl: React.FC<{\n  id?: string;\n  className?: string;\n  style?: React.CSSProperties;\n  sync?: ChartAreaInteractionsProps[\"sync\"];\n  children?: React.ReactNode;\n}> = ({ id, className, style, sync, children }) => {\n  const interactionsAreaRef = useRef<HTMLDivElement>(null);\n\n  const frame = useFrameState().frame;\n\n  const frameRef = useRef(frame);\n  frameRef.current = frame;\n\n  const interactionsId = useContext(InteractionsIdContext);\n\n  const moveSyncKey = sync?.key || interactionsId;\n\n  const selectStateRef = useRef<{\n    xRangeCss: { start: number; end: number };\n    yRangeCss: { start: number; end: number };\n  } | null>(null);\n\n  const lastSpanSelectEventRef = useRef<SpanSelectEvent | null>(null);\n  const lastMoveSyncEventRef = useRef<SyncEvent_Move | null>(null);\n\n  const getRect = () => {\n    const root = interactionsAreaRef.current?.parentElement;\n    if (!root) {\n      return undefined;\n    }\n    if (root.dataset.canplotroot === undefined) {\n      throw new Error(\n        \"ChartAreaInteractions must be used within a CanPlot component\",\n      );\n    }\n    return root.getBoundingClientRect();\n  };\n\n  const withPointerPosition = (\n    event: Pick<\n      MouseEvent,\n      \"clientX\" | \"clientY\" | \"ctrlKey\" | \"altKey\" | \"shiftKey\" | \"metaKey\"\n    >,\n    foo: (\n      pointerSyncPosition: PointerSyncPosition,\n      css: { cssX: number; cssY: number },\n      keys: {\n        ctrlKey: boolean;\n        altKey: boolean;\n        shiftKey: boolean;\n        metaKey: boolean;\n      },\n    ) => void,\n  ) => {\n    const positions = makePointerSyncPosition(\n      event,\n      getRect(),\n      frameRef.current,\n      sync,\n    );\n    if (positions) {\n      foo(\n        positions.pointerSyncPosition,\n        { cssX: positions.cssX, cssY: positions.cssY },\n        {\n          ctrlKey: event.ctrlKey,\n          altKey: event.altKey,\n          shiftKey: event.shiftKey,\n          metaKey: event.metaKey,\n        },\n      );\n    }\n  };\n\n  const withPointerPositionRef = useRef(withPointerPosition);\n  withPointerPositionRef.current = withPointerPosition;\n\n  useEffect(() => {\n    const mouseUpListener = (event: MouseEvent) => {\n      const lastSpanSelectSyncEvent = lastSpanSelectEventRef.current;\n      selectStateRef.current = null;\n      lastSpanSelectEventRef.current = null;\n      if (lastSpanSelectSyncEvent) {\n        InteractionsBus.spanselect.dispatchEvent(interactionsId, {\n          ...lastSpanSelectSyncEvent,\n          completed: true,\n        });\n      }\n      InteractionsBus.documentmouseup.dispatchEvent(interactionsId, {\n        frame: frameRef.current,\n        keys: {\n          ctrlKey: event.ctrlKey,\n          altKey: event.altKey,\n          shiftKey: event.shiftKey,\n          metaKey: event.metaKey,\n        },\n      });\n    };\n\n    const keyListener = (event: KeyboardEvent) => {\n      const newKeys = {\n        ctrlKey: event.ctrlKey,\n        altKey: event.altKey,\n        shiftKey: event.shiftKey,\n        metaKey: event.metaKey,\n      };\n\n      const lastMove = lastMoveSyncEventRef.current;\n      if (\n        lastMove &&\n        Object.entries(newKeys).some(\n          ([key, value]) =>\n            lastMove.keys[key as keyof typeof newKeys] !== value,\n        )\n      ) {\n        const newMoveEvent = { ...lastMove, keys: newKeys };\n        lastMoveSyncEventRef.current = newMoveEvent;\n        InteractionsBus.sync_move.dispatchEvent(moveSyncKey, newMoveEvent);\n      }\n\n      const lastSpan = lastSpanSelectEventRef.current;\n      if (\n        lastSpan &&\n        Object.entries(newKeys).some(\n          ([key, value]) =>\n            lastSpan.keys[key as keyof typeof newKeys] !== value,\n        )\n      ) {\n        // prevent default, because we're in the middle of spanning\n        event.stopPropagation();\n        event.preventDefault();\n        const newSpanEvent = { ...lastSpan, keys: newKeys };\n        lastSpanSelectEventRef.current = newSpanEvent;\n        InteractionsBus.spanselect.dispatchEvent(interactionsId, newSpanEvent);\n      }\n    };\n\n    const mouseOverDocumentListener = (event: MouseEvent) => {\n      withPointerPositionRef.current(\n        event,\n        (positions, { cssX, cssY }, keys) => {\n          const selectState = selectStateRef.current;\n          if (!selectState) return;\n          if (!positions.x || !positions.y) return;\n\n          const frame = frameRef.current;\n          const startCSSX = selectState.xRangeCss.start;\n          const endCSSX = cssX;\n          const startCSSY = selectState.yRangeCss.start;\n          const endCSSY = cssY;\n          const xScale = getScale(frame, positions.x.scaleId);\n          if (!xScale) return;\n          const yScale = getScale(frame, positions.y.scaleId);\n          if (!yScale) return;\n          selectStateRef.current = {\n            xRangeCss: { start: startCSSX, end: endCSSX },\n            yRangeCss: { start: startCSSY, end: endCSSY },\n          };\n\n          let mode: \"below_threshold\" | \"x\" | \"y\" | \"box\" = \"below_threshold\";\n          const dY = Math.abs(startCSSY - endCSSY);\n          const dX = Math.abs(startCSSX - endCSSX);\n\n          if (dY < 10 && dX < 10) {\n            mode = \"below_threshold\";\n          } else if (dY > 30 && dX > 30) {\n            mode = \"box\";\n          } else if (dY > dX) {\n            mode = \"y\";\n          } else {\n            mode = \"x\";\n          }\n\n          const xRangeFrom = posToVal(\n            frame,\n            clampXPosToChartArea(frameRef.current, startCSSX, \"css\"),\n            xScale.id,\n            \"css\",\n          );\n          if (xRangeFrom === null) return;\n\n          const xRangeTo = posToVal(\n            frame,\n            clampXPosToChartArea(frameRef.current, endCSSX, \"css\"),\n            xScale.id,\n            \"css\",\n          );\n          if (xRangeTo === null) return;\n\n          const yRangeFrom = posToVal(\n            frame,\n            clampYPosToChartArea(frameRef.current, startCSSY, \"css\"),\n            yScale.id,\n            \"css\",\n          );\n          if (yRangeFrom === null) return;\n\n          const yRangeTo = posToVal(\n            frame,\n            clampYPosToChartArea(frameRef.current, endCSSY, \"css\"),\n            yScale.id,\n            \"css\",\n          );\n          if (yRangeTo === null) return;\n\n          const xMappedRange = extrapolateScaledSelectionRange(\n            \"x\",\n            { scaleId: xScale.id, from: xRangeFrom, to: xRangeTo },\n            frameRef.current,\n          );\n          const yMappedRange = extrapolateScaledSelectionRange(\n            \"y\",\n            { scaleId: yScale.id, from: yRangeFrom, to: yRangeTo },\n            frameRef.current,\n          );\n\n          const xRanges = xMappedRange?.scaled;\n          const yRanges = yMappedRange?.scaled;\n\n          const spanSelectEvent: SpanSelectEvent = {\n            mode,\n            frame: frameRef.current,\n            completed: false,\n            x: {\n              css: xMappedRange\n                ? {\n                    from: xMappedRange.fromCSS,\n                    to: xMappedRange.toCSS,\n                  }\n                : undefined,\n              scaled: xRanges ?? [],\n            },\n            y: {\n              css: yMappedRange\n                ? {\n                    from: yMappedRange.fromCSS,\n                    to: yMappedRange.toCSS,\n                  }\n                : undefined,\n              scaled: yRanges ?? [],\n            },\n            keys,\n            ...makeSpanSelectHelpers(sync),\n          };\n          lastSpanSelectEventRef.current = spanSelectEvent;\n\n          InteractionsBus.spanselect.dispatchEvent(\n            interactionsId,\n            spanSelectEvent,\n          );\n        },\n      );\n    };\n\n    const mouseWheelListener = (event: WheelEvent) => {\n      withPointerPositionRef.current(event, (positions, _, keys) => {\n        const pointer = pointerSyncPositionToInteractionsPosition(\n          positions,\n          frameRef.current,\n          sync,\n        );\n        if (!pointer) return;\n        const anyButtonPressed = Object.values(keys).some((v) => v);\n        if (anyButtonPressed) {\n          event.preventDefault();\n          const deltaAbs =\n            Math.abs(event.deltaY) > Math.abs(event.deltaX)\n              ? event.deltaY\n              : event.deltaX;\n          InteractionsBus.pressandwheel.dispatchEvent(interactionsId, {\n            pointer,\n            frame: frameRef.current,\n            keys,\n            deltaX: event.deltaX,\n            deltaY: event.deltaY,\n            deltaAbs,\n          });\n        }\n      });\n    };\n\n    document.addEventListener(\"mouseup\", mouseUpListener);\n    document.addEventListener(\"keydown\", keyListener);\n    document.addEventListener(\"keyup\", keyListener);\n    document.addEventListener(\"mousemove\", mouseOverDocumentListener);\n    const interactionsAreaElement = interactionsAreaRef.current;\n    interactionsAreaElement?.addEventListener(\"wheel\", mouseWheelListener, {\n      passive: false,\n    });\n    return () => {\n      document.removeEventListener(\"mouseup\", mouseUpListener);\n      document.removeEventListener(\"keydown\", keyListener);\n      document.removeEventListener(\"keyup\", keyListener);\n      document.removeEventListener(\"mousemove\", mouseOverDocumentListener);\n      interactionsAreaElement?.removeEventListener(\"wheel\", mouseWheelListener);\n    };\n  }, [frameRef, interactionsId, moveSyncKey, withPointerPositionRef]);\n\n  // SYNC EVENTS\n\n  useGenericInteractionsEvent(\"sync_move\", moveSyncKey, (event) => {\n    const positions = event.positions\n      ? pointerSyncPositionToInteractionsPosition(\n          event.positions,\n          frameRef.current,\n          sync,\n        )\n      : null;\n    lastMoveSyncEventRef.current = event;\n\n    InteractionsBus.move.dispatchEvent(interactionsId, {\n      frame: frameRef.current,\n      pointer: positions ?? null,\n      keys: event.keys,\n      source: event.originInteractionsId === interactionsId ? \"own\" : \"sync\",\n    });\n  });\n\n  return (\n    <div\n      ref={interactionsAreaRef}\n      id={id}\n      className={className}\n      style={{\n        position: \"absolute\",\n        left: frame.chartAreaCSS.x,\n        top: frame.chartAreaCSS.y,\n        width: frame.chartAreaCSS.width,\n        height: frame.chartAreaCSS.height,\n        zIndex: 25,\n        ...style,\n      }}\n      onDragStart={(e) => {\n        e.preventDefault();\n      }}\n      onClick={(event) => {\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.click.dispatchEvent(interactionsId, {\n            pointer,\n            frame: frameRef.current,\n            keys,\n          });\n        });\n      }}\n      onMouseLeave={(event) => {\n        withPointerPosition(event, (_, __, keys) => {\n          InteractionsBus.sync_move.dispatchEvent(moveSyncKey, {\n            positions: null,\n            keys,\n            originInteractionsId: interactionsId,\n          });\n        });\n      }}\n      onMouseMove={(event) => {\n        withPointerPosition(event, (positions, _, keys) => {\n          InteractionsBus.sync_move.dispatchEvent(moveSyncKey, {\n            positions,\n            keys,\n            originInteractionsId: interactionsId,\n          });\n        });\n      }}\n      onMouseDown={(event) => {\n        withPointerPosition(event, (positions, { cssX, cssY }, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.mousedown.dispatchEvent(interactionsId, {\n            pointer,\n            frame: frameRef.current,\n            keys,\n          });\n          selectStateRef.current = {\n            xRangeCss: { start: cssX, end: cssX },\n            yRangeCss: { start: cssY, end: cssY },\n          };\n        });\n      }}\n      onMouseUp={(event) => {\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.mouseup.dispatchEvent(interactionsId, {\n            frame: frameRef.current,\n            pointer,\n            keys,\n          });\n        });\n      }}\n      onContextMenu={(event) => {\n        event.preventDefault();\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.contextmenu.dispatchEvent(interactionsId, {\n            frame: frameRef.current,\n            pointer,\n            keys,\n          });\n        });\n      }}\n      onDoubleClick={(event) => {\n        event.preventDefault();\n        withPointerPosition(event, (positions, _, keys) => {\n          const pointer = pointerSyncPositionToInteractionsPosition(\n            positions,\n            frameRef.current,\n            sync,\n          );\n          if (!pointer) return;\n          InteractionsBus.dblclick.dispatchEvent(interactionsId, {\n            frame: frameRef.current,\n            pointer,\n            keys,\n          });\n        });\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n","import { useMemo, useState } from \"react\";\nimport { useInteractionsEvent } from \"./interactionsBus\";\nimport type { MoveEvent } from \"./types\";\nimport { getScale, valFits, valToPxDistance } from \"../helpers\";\nimport type { PlotDrawFrame } from \"../types\";\n\ntype TooltipState = {\n  frame: PlotDrawFrame;\n  x: number;\n  points: {\n    seriesId: string;\n    y: number | null;\n  }[];\n};\n\nexport const TooltipsX: React.FC<{\n  xScaleId: string;\n  data: {\n    seriesId: string;\n    yScaleId: string;\n    points: Array<{ x: number; y: number }>;\n  }[];\n  renderTooltip: (params: TooltipState | null) => React.ReactNode;\n}> = ({ data, renderTooltip, xScaleId }) => {\n  const [moveState, setMoveState] = useState<MoveEvent | null>(null);\n\n  useInteractionsEvent(\"move\", (event) => {\n    const pointer = event;\n    setMoveState(pointer);\n  });\n\n  const tooltipState = useMemo((): TooltipState | null => {\n    if (!moveState) {\n      return null;\n    }\n\n    const { frame, pointer } = moveState;\n\n    const rawScaledX = pointer?.scaled[xScaleId];\n    if (rawScaledX === undefined) {\n      return null;\n    }\n    const xScale = getScale(frame, xScaleId);\n    if (!xScale) {\n      return null;\n    }\n    const points: TooltipState[\"points\"] = [];\n    let x = rawScaledX;\n    for (const series of data) {\n      let closestPointIndex: number | null = null;\n      let closestDistance = Infinity;\n      for (const [index, point] of series.points.entries()) {\n        if (\n          !valFits(frame, point.x, xScaleId) ||\n          !valFits(frame, point.y, series.yScaleId)\n        ) {\n          continue;\n        }\n        const distance = Math.abs(point.x - rawScaledX);\n        if (distance < closestDistance) {\n          closestDistance = distance;\n          closestPointIndex = index;\n        }\n      }\n      const closestPoint = series.points[closestPointIndex ?? -1];\n      const pxDistance = valToPxDistance(frame, closestDistance, xScaleId, \"css\");\n      if (\n        !closestPoint ||\n        pxDistance === null ||\n        pxDistance > 30\n      ) {\n        points.push({ seriesId: series.seriesId, y: null });\n        continue;\n      }\n      x = closestPoint.x;\n      points.push({\n        seriesId: series.seriesId,\n        y: closestPoint.y,\n      });\n    }\n    return {\n      frame,\n      x,\n      points,\n    };\n  }, [data, moveState, xScaleId]);\n\n  return renderTooltip(tooltipState);\n};\n","import React, { useState } from \"react\";\nimport { useInteractionsEvent } from \"./interactionsBus\";\nimport type { MoveEvent } from \"./types\";\nimport { clampXPosToChartArea, clampYPosToChartArea } from \"../helpers\";\n\nexport const Crosshair: React.FC<{\n  makeXStyle?: (moveEvent: MoveEvent) => React.CSSProperties | undefined;\n  makeXClassName?: (moveEvent: MoveEvent) => string;\n  makeYStyle?: (moveEvent: MoveEvent) => React.CSSProperties | undefined;\n  makeYClassName?: (moveEvent: MoveEvent) => string;\n}> = ({ makeXStyle, makeXClassName, makeYStyle, makeYClassName }) => {\n  const [moveState, setMoveState] = useState<MoveEvent | null>(null);\n\n  useInteractionsEvent(\"move\", (event) => {\n    const pointer = event;\n    setMoveState(pointer);\n  });\n\n  if (!moveState) {\n    return null;\n  }\n\n  const { frame, pointer } = moveState;\n  const cssX = pointer?.cssX ?? null;\n  const cssY = pointer?.cssY ?? null;\n\n  const clampedX = cssX ? clampXPosToChartArea(frame, cssX, \"css\") : 0;\n\n  const clampedY = cssY ? clampYPosToChartArea(frame, cssY, \"css\") : 0;\n\n  return (\n    <>\n      <div\n        data-show={!!pointer}\n        className={makeXClassName?.(moveState)}\n        style={{\n          position: \"absolute\",\n          left: 0,\n          visibility: cssX === null ? \"hidden\" : \"visible\",\n          top: frame.chartAreaCSS.y,\n          height: frame.chartAreaCSS.height,\n          borderColor: \"red\",\n          borderLeftWidth: \"1px\",\n          borderLeftStyle: \"solid\",\n          pointerEvents: \"none\",\n          opacity: pointer ? 1 : 0,\n          transform: `translateX(${clampedX}px)`,\n          ...makeXStyle?.(moveState),\n        }}\n      />\n      <div\n        className={makeYClassName?.(moveState)}\n        data-show={!!pointer}\n        style={{\n          position: \"absolute\",\n          visibility: cssY === null ? \"hidden\" : \"visible\",\n          top: 0,\n          height: 0,\n          borderTop: \"solid 1px red\",\n          left: frame.chartAreaCSS.x,\n          width: frame.chartAreaCSS.width,\n          pointerEvents: \"none\",\n          opacity: pointer ? 1 : 0,\n          transform: `translateY(${clampedY}px)`,\n          ...makeYStyle?.(moveState),\n        }}\n      />\n    </>\n  );\n};\n","import React, { useMemo, useState } from \"react\";\nimport { useInteractionsEvent } from \"./interactionsBus\";\nimport type { SpanSelectEvent } from \"./types\";\nimport { clampXPosToChartArea, clampYPosToChartArea } from \"../helpers\";\n\nexport const SelectBox: React.FC<{\n  makeClassName?: (selectState: SpanSelectEvent) => string;\n  makeStyle?: (selectState: SpanSelectEvent) => React.CSSProperties | undefined;\n}> = ({ makeClassName, makeStyle }) => {\n  const [selection, setSelectState] = useState<SpanSelectEvent | null>(null);\n\n  useInteractionsEvent(\"spanselect\", (event) => {\n    setSelectState(\n      event.mode === \"below_threshold\" || event.completed ? null : event\n    );\n  });\n\n  const dimensions = useMemo(() => {\n    if (!selection || selection.mode === \"below_threshold\") {\n      return null;\n    }\n    const fromX =\n      selection.mode === \"y\" ? -Infinity : selection.x.css?.from ?? -Infinity;\n    const toX =\n      selection.mode === \"y\" ? Infinity : selection.x.css?.to ?? Infinity;\n    const fromY =\n      selection.mode === \"x\" ? -Infinity : selection.y.css?.from ?? -Infinity;\n    const toY =\n      selection.mode === \"x\" ? Infinity : selection.y.css?.to ?? Infinity;\n\n    const clampedFromX = clampXPosToChartArea(selection.frame, fromX, \"css\");\n    const clampedToX = clampXPosToChartArea(selection.frame, toX, \"css\");\n    const clampedFromY = clampYPosToChartArea(selection.frame, fromY, \"css\");\n    const clampedToY = clampYPosToChartArea(selection.frame, toY, \"css\");\n\n    const leftPx = Math.min(clampedFromX, clampedToX);\n    const topPx = Math.min(clampedFromY, clampedToY);\n    const widthPx = Math.abs(clampedToX - clampedFromX);\n    const heightPx = Math.abs(clampedToY - clampedFromY);\n\n    return { leftPx, topPx, widthPx, heightPx };\n  }, [selection]);\n\n  return (\n    <div\n      className={selection ? makeClassName?.(selection) : undefined}\n      style={{\n        position: \"absolute\",\n        visibility: selection ? \"visible\" : \"hidden\",\n        left: `${dimensions?.leftPx ?? 0}px`,\n        top: `${dimensions?.topPx ?? 0}px`,\n        width: `${dimensions?.widthPx ?? 0}px`,\n        height: `${dimensions?.heightPx ?? 0}px`,\n        pointerEvents: \"none\",\n        ...(selection ? makeStyle?.(selection) : undefined),\n      }}\n    />\n  );\n};\n","import React from \"react\";\nimport { useFrameState } from \"../frameContext\";\n\nexport const AxisOverlay: React.FC<\n  React.HTMLAttributes<HTMLDivElement> & {\n    scaleId: string;\n  }\n> = ({ style, children, scaleId, ...rest }) => {\n  const axis = useFrameState().getScale(scaleId)?.axis;\n\n  if (!axis) {\n    return null;\n  }\n\n  return (\n    <div\n      style={{\n        position: \"absolute\",\n        backgroundColor: \"#0000ff11\",\n        left: axis.cssRect.x,\n        top: axis.cssRect.y,\n        height: axis.cssRect.height,\n        width: axis.cssRect.width,\n        ...style,\n      }}\n      {...rest}\n    >\n      {children}\n    </div>\n  );\n};\n","export const DEFAULT_AXIS_SIZE = 50;\nexport const DEFAULT_POSITION = \"primary\";\nexport const DEFAULT_LABEL_ALIGN = \"center\";\nexport const DEFAULT_TICK_SIZE = 5;\nexport const DEFAULT_MULTILINE_GAP = 10;\nexport const DEFAULT_X_SPLIT_SPACE = 60;\nexport const DEFAULT_Y_SPLIT_SPACE = 30;\nexport const DEFAULT_TIMEZONE = \"UTC\";\nexport const DEFAULT_LOCALE = \"en-GB\";\nexport const DEFAULT_LABEL_OFFSET = 25;\nexport const DEFAULT_PADDING = 10;\n","import {\n  DEFAULT_LOCALE,\n  DEFAULT_TIMEZONE,\n  DEFAULT_X_SPLIT_SPACE,\n  DEFAULT_Y_SPLIT_SPACE,\n} from \"./defaults\";\nimport { pxToValDistance } from \"./helpers\";\nimport type { TicksFormatter, TicksConfig } from \"./types\";\n\n// LINEAR TICKS\n\nexport const makeLinearTicks = ({\n  space,\n  formatter,\n  acceptableIncrements,\n}: {\n  space?: number;\n  acceptableIncrements?: number[];\n  formatter?: TicksFormatter;\n} = {}): TicksConfig => {\n  return (scale, frame) => {\n    const { min: scaleMin, max: scaleMax } = scale;\n    const ticks = [];\n    const dpr = window.devicePixelRatio || 1;\n    const effectiveSpace =\n      (space ??\n        (scale.origin === \"x\"\n          ? DEFAULT_X_SPLIT_SPACE\n          : DEFAULT_Y_SPLIT_SPACE)) * dpr;\n    const unnormalizedIncr = pxToValDistance(\n      frame,\n      effectiveSpace,\n      scale.id,\n      \"canvas\",\n    );\n\n    if (unnormalizedIncr === null) {\n      return [];\n    }\n\n    const effectiveAcceptableIncrements =\n      acceptableIncrements ?? DEFAULT_ACCEPTABLE_TICKS_INCREMENTS;\n\n    const incr = effectiveAcceptableIncrements.find(\n      (a) => a > unnormalizedIncr,\n    );\n\n    if (incr === undefined || incr <= 0) {\n      return [];\n    }\n\n    let curr = scaleMin;\n    if (Math.abs(curr % incr) > Number.EPSILON) {\n      const alignBy = (incr - (curr % incr)) % incr;\n      curr += alignBy;\n    }\n    while (curr <= scaleMax) {\n      if (ticks.length >= 1000) {\n        return [];\n      }\n      ticks.push(curr);\n      curr += incr;\n    }\n\n    return (formatter ?? defaultNumericalTicksFormatter)(ticks);\n  };\n};\n\nexport const defaultNumericalTicksFormatter: TicksFormatter = (ticks) => {\n  const span = Math.max(0, Math.ceil(-Math.log10(ticks[1] - ticks[0])));\n  return ticks.map((tick) => ({ value: tick, label: tick.toFixed(span) }));\n};\n\nconst DEFAULT_ACCEPTABLE_TICKS_INCREMENTS: number[] = [];\nfor (let i = -12; i <= 12; i++) {\n  DEFAULT_ACCEPTABLE_TICKS_INCREMENTS.push(1 * 10 ** i);\n  DEFAULT_ACCEPTABLE_TICKS_INCREMENTS.push(2 * 10 ** i);\n  DEFAULT_ACCEPTABLE_TICKS_INCREMENTS.push(5 * 10 ** i);\n}\n\n// TIME TICKS\n\nconst millisecond = 1;\nconst second = 1000 * millisecond;\nconst minute = 60 * second;\nconst hour = 60 * minute;\nconst day = 24 * hour;\nconst month = 30 * day;\nconst year = 365 * day;\n\ntype TimeUnit =\n  | \"milliseconds\"\n  | \"seconds\"\n  | \"minutes\"\n  | \"hours\"\n  | \"days\"\n  | \"months\"\n  | \"years\";\n\ntype Duration = [number, TimeUnit];\n\nconst TIME_INCRS: Duration[] = [\n  // second divisors\n  [1, \"milliseconds\"],\n  [2, \"milliseconds\"],\n  [5, \"milliseconds\"],\n  [10, \"milliseconds\"],\n  [20, \"milliseconds\"],\n  [50, \"milliseconds\"],\n  [100, \"milliseconds\"],\n  [200, \"milliseconds\"],\n  [500, \"milliseconds\"],\n  // minute divisors\n  [1, \"seconds\"],\n  [5, \"seconds\"],\n  [10, \"seconds\"],\n  [15, \"seconds\"],\n  [30, \"seconds\"],\n  // hour divisors\n  [1, \"minutes\"],\n  [5, \"minutes\"],\n  [10, \"minutes\"],\n  [15, \"minutes\"],\n  [30, \"minutes\"],\n  // day divisors\n  [1, \"hours\"],\n  [2, \"hours\"],\n  [3, \"hours\"],\n  [4, \"hours\"],\n  [6, \"hours\"],\n  [8, \"hours\"],\n  [12, \"hours\"],\n  // month divisors\n  [1, \"days\"],\n  [3, \"days\"],\n  [5, \"days\"],\n  [7, \"days\"],\n  [10, \"days\"],\n  [15, \"days\"],\n  // year divisors\n  [1, \"months\"],\n  [2, \"months\"],\n  [3, \"months\"],\n  [4, \"months\"],\n  [6, \"months\"],\n  // century divisors\n  [1, \"years\"],\n  [2, \"years\"],\n  [5, \"years\"],\n  [10, \"years\"],\n  [25, \"years\"],\n  [50, \"years\"],\n  [100, \"years\"],\n];\n\nconst durationToMilliseconds = (duration: Duration): number => {\n  const [value, unit] = duration;\n  switch (unit) {\n    case \"milliseconds\":\n      return value;\n    case \"seconds\":\n      return value * second;\n    case \"minutes\":\n      return value * minute;\n    case \"hours\":\n      return value * hour;\n    case \"days\":\n      return value * day;\n    case \"months\":\n      return value * month;\n    case \"years\":\n      return value * year;\n  }\n};\n\nconst addUTCMilliseconds = (date: number | Date, deltaMilliseconds: number) => {\n  const result = new Date(date);\n  result.setUTCMilliseconds(result.getUTCMilliseconds() + deltaMilliseconds);\n  return result.getTime();\n};\n\nconst addUTCSeconds = (date: number | Date, deltaSeconds: number) => {\n  const result = new Date(date);\n  result.setUTCSeconds(result.getUTCSeconds() + deltaSeconds);\n  return result.getTime();\n};\n\nconst addUTCMinutes = (date: number | Date, deltaMinutes: number) => {\n  const result = new Date(date);\n  result.setUTCMinutes(result.getUTCMinutes() + deltaMinutes);\n  return result.getTime();\n};\n\nconst addUTCHours = (date: number | Date, deltaHours: number) => {\n  const result = new Date(date);\n  result.setUTCHours(result.getUTCHours() + deltaHours);\n  return result.getTime();\n};\n\nconst addUTCDays = (date: number | Date, deltaDays: number) => {\n  const result = new Date(date);\n  result.setUTCDate(result.getUTCDate() + deltaDays);\n  return result.getTime();\n};\n\nconst addUTCMonths = (date: number | Date, deltaMonths: number) => {\n  const result = new Date(date);\n  result.setUTCMonth(result.getUTCMonth() + deltaMonths);\n  return result.getTime();\n};\n\nconst addUTC = (date: number | Date, delta: Duration): number => {\n  const [deltaValue, deltaUnit] = delta;\n  switch (deltaUnit) {\n    case \"milliseconds\":\n      return addUTCMilliseconds(date, deltaValue);\n    case \"seconds\":\n      return addUTCSeconds(date, deltaValue);\n    case \"minutes\":\n      return addUTCMinutes(date, deltaValue);\n    case \"hours\":\n      return addUTCHours(date, deltaValue);\n    case \"days\":\n      return addUTCDays(date, deltaValue);\n    case \"months\":\n      return addUTCMonths(date, deltaValue);\n    case \"years\":\n      return addUTCMonths(date, deltaValue * 12);\n  }\n};\n\nconst tzOffsetFmt = new Map<string, Intl.DateTimeFormat>();\n\nfunction getTimezoneOffsetHours(atTime: Date | number, timeZone: string) {\n  let fmt = tzOffsetFmt.get(timeZone);\n  if (!fmt) {\n    fmt = new Intl.DateTimeFormat(\"en-US\", {\n      timeZone,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n      hourCycle: \"h23\",\n    });\n    tzOffsetFmt.set(timeZone, fmt);\n  }\n  const date = new Date(atTime);\n  const parts = fmt.formatToParts(date);\n  const get = (type: Intl.DateTimeFormatPart[\"type\"]) =>\n    parseInt(parts.find((p) => p.type === type)!.value, 10);\n  const localAsUTC = Date.UTC(\n    get(\"year\"),\n    get(\"month\") - 1,\n    get(\"day\"),\n    get(\"hour\"),\n    get(\"minute\"),\n    get(\"second\"),\n  );\n  return (localAsUTC - date.getTime()) / (60 * 60 * 1000);\n}\n\nconst makeFirstTick = (\n  minDate: number,\n  incr: Duration,\n  timeZone: string = \"UTC\",\n): number => {\n  const [incrValue, incrUnit] = incr;\n  let result = new Date(minDate);\n  const setTimeToMidnight = () => {\n    result.setUTCHours(-getTimezoneOffsetHours(result, timeZone), 0, 0, 0);\n  };\n  switch (incrUnit) {\n    case \"milliseconds\":\n      result.setUTCMilliseconds(\n        Math.ceil(result.getUTCMilliseconds() / incrValue) * incrValue,\n      );\n      break;\n    case \"seconds\":\n      result.setUTCSeconds(\n        Math.ceil(result.getUTCSeconds() / incrValue) * incrValue,\n        0,\n      );\n      break;\n    case \"minutes\":\n      result.setUTCMinutes(\n        Math.ceil((result.getTime() % hour) / minute / incrValue) * incrValue,\n        0,\n        0,\n      );\n      break;\n    case \"hours\": {\n      const offsetHours = getTimezoneOffsetHours(result, timeZone);\n\n      result.setUTCHours(\n        Math.ceil(\n          ((result.getTime() + offsetHours * hour) % day) / hour / incrValue,\n        ) *\n        incrValue -\n        offsetHours,\n        0,\n        0,\n        0,\n      );\n      // When local time is in the previous UTC day (negative offsets),\n      // setUTCHours can overshoot by a full day. Correct it.\n      if (result.getTime() - minDate >= day) {\n        result.setUTCDate(result.getUTCDate() - 1);\n      }\n      // The modular arithmetic can land on a grid point earlier in the day.\n      // Advance by one increment until we're at or past minDate.\n      while (result.getTime() < minDate) {\n        result = new Date(addUTC(result, [incrValue, \"hours\"]));\n      }\n      break;\n    }\n    case \"days\": {\n      setTimeToMidnight();\n      result.setUTCDate(1);\n      while (result.getTime() < minDate) {\n        result = new Date(addUTC(result, [incrValue, incrUnit]));\n      }\n      break;\n    }\n    case \"months\":\n    case \"years\":\n      if (incrUnit === \"months\") {\n        result.setUTCDate(1);\n      } else if (incrUnit === \"years\") {\n        result.setUTCMonth(0, 1);\n      }\n      setTimeToMidnight();\n      if (result.getTime() < minDate) {\n        result = new Date(addUTC(result, [1, incrUnit]));\n      }\n      break;\n  }\n  return result.getTime();\n};\n\nexport const makeTimeTicks = ({\n  timeZone = DEFAULT_TIMEZONE,\n  space = DEFAULT_X_SPLIT_SPACE,\n  formatter,\n  locale,\n  showTimezone,\n}: {\n  formatter?: TicksFormatter;\n  timeZone?: string;\n  space?: number;\n  locale?: string;\n  showTimezone?: boolean;\n} = {}): TicksConfig => {\n  return (scale, frame) => {\n    const { min: scaleMin, max: scaleMax } = scale;\n    if (!Number.isFinite(scaleMin) || !Number.isFinite(scaleMax)) {\n      return [];\n    }\n    const splitsCount = Math.floor(frame.chartAreaCSS.width / space) + 1;\n    const range = scaleMax - scaleMin;\n    const splitDistance = range / splitsCount;\n    const [incrValue, incrUnit] = TIME_INCRS.find(\n      (a) => durationToMilliseconds(a) >= splitDistance,\n    ) ?? [1, \"milliseconds\"];\n\n    if (!incrValue || !incrUnit) {\n      return [];\n    }\n\n    const firstTick = makeFirstTick(scaleMin, [incrValue, incrUnit], timeZone);\n    const firstTickOffset = getTimezoneOffsetHours(firstTick, timeZone);\n\n    // console.log(firstTickOffset, new Date(firstTick));\n\n    const splits: number[] = [firstTick];\n\n    // For hours ticks, use Intl.DateTimeFormat directly to read the local hour.\n    // This avoids the fragile double-parse in getTimezoneOffsetHours which can\n    // break during DST transitions when the system timezone matches the chart timezone.\n    const hourFmt =\n      incrUnit === \"hours\"\n        ? new Intl.DateTimeFormat(\"en-US\", {\n          timeZone,\n          hour: \"numeric\",\n          hourCycle: \"h23\",\n        })\n        : null;\n\n    let candidate: number;\n    for (let tickNumber = 1; ; tickNumber++) {\n      if (tickNumber > 100) {\n        return [];\n      }\n      switch (incrUnit) {\n        case \"milliseconds\":\n        case \"seconds\":\n        case \"minutes\": {\n          candidate = addUTC(firstTick, [tickNumber * incrValue, incrUnit]);\n          break;\n        }\n        case \"hours\": {\n          // Walk from the previous tick one UTC hour at a time.\n          // Accept the first hour whose local time is grid-aligned\n          // and far enough from the previous tick.\n          const prev = splits[splits.length - 1];\n          const minGap = incrValue * hour * 0.75;\n          candidate = scaleMax + 1; // default: will break outer loop\n          for (let h = 1; h <= incrValue + 3; h++) {\n            const c = addUTC(prev, [h, \"hours\"]);\n            if (c - prev < minGap) continue;\n            const localHour = parseInt(\n              hourFmt!\n                .formatToParts(new Date(c))\n                .find((p) => p.type === \"hour\")!.value,\n              10,\n            );\n            if (localHour % incrValue === 0) {\n              candidate = c;\n              break;\n            }\n          }\n          break;\n        }\n        case \"days\": {\n          const tickNoDST = addUTC(firstTick, [\n            tickNumber * incrValue,\n            incrUnit,\n          ]);\n          candidate = addUTC(tickNoDST, [\n            firstTickOffset - getTimezoneOffsetHours(tickNoDST, timeZone),\n            \"hours\",\n          ]);\n          break;\n        }\n        case \"months\":\n        case \"years\": {\n          const tickNoDST = addUTC(\n            addUTC(addUTC(firstTick, [firstTickOffset, \"hours\"]), [\n              tickNumber * incrValue,\n              incrUnit,\n            ]),\n            [-firstTickOffset, \"hours\"],\n          );\n          candidate = addUTC(tickNoDST, [\n            firstTickOffset - getTimezoneOffsetHours(tickNoDST, timeZone),\n            \"hours\",\n          ]);\n          break;\n        }\n      }\n      if (candidate > scaleMax) {\n        break;\n      }\n      if (splits[splits.length - 1] !== candidate) {\n        splits.push(candidate);\n      }\n    }\n\n    return (\n      formatter ??\n      makeTimeTickFormat({\n        locale,\n        showTimezone,\n        timeZone,\n      })\n    )(splits);\n  };\n};\n\nconst isTimeFormatPartDifferent = (\n  a: Intl.DateTimeFormatPart[],\n  b: Intl.DateTimeFormatPart[],\n  type: Intl.DateTimeFormatPart[\"type\"],\n) => {\n  return (\n    a.find((candidate) => candidate.type === type)?.value !==\n    b.find((candidate) => candidate.type === type)?.value\n  );\n};\n\ntype MakeTimeTickFormatOpts = {\n  timeZone?: string;\n  locale?: string;\n  showTimezone?: boolean;\n};\n\nexport const makeTimeTickFormat = ({\n  timeZone = DEFAULT_TIMEZONE,\n  locale = DEFAULT_LOCALE,\n  showTimezone = true,\n}: MakeTimeTickFormatOpts): TicksFormatter => {\n  const formatter = new Intl.DateTimeFormat(locale, {\n    year: \"numeric\",\n    day: \"numeric\",\n    month: \"short\",\n    hour: \"numeric\",\n    hourCycle: \"h23\",\n    minute: \"numeric\",\n    second: \"numeric\",\n    fractionalSecondDigits: 3,\n    timeZoneName: \"short\",\n    timeZone,\n  });\n  return (ticks) => {\n    const splitMs = ticks[1] - ticks[0];\n    const showHours = splitMs < durationToMilliseconds([1, \"days\"]);\n    const showSeconds = splitMs < durationToMilliseconds([1, \"minutes\"]);\n    const showMilliseconds = splitMs < durationToMilliseconds([1, \"seconds\"]);\n\n    return ticks\n      .map((value) => {\n        return { value, label: formatter.formatToParts(new Date(value)) };\n      })\n      .map((curr, index, arr) => {\n        const prev = arr[index - 1];\n        const newYear =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"year\");\n        const newDay =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"day\");\n        const newMonth =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"month\");\n        const newHour =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"hour\");\n        const newTimeZoneName =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"timeZoneName\");\n        const newMinute =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"minute\");\n        const newSecond =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"second\");\n        const newMillisecond =\n          index === 0 ||\n          isTimeFormatPartDifferent(curr.label, prev.label, \"fractionalSecond\");\n\n        const visibleParts: (string | undefined)[] = [];\n        if (\n          showHours &&\n          (newHour ||\n            newMinute ||\n            newTimeZoneName ||\n            newSecond ||\n            newMillisecond)\n        ) {\n          const h = curr.label.find((a) => a.type === \"hour\")?.value;\n          const m = curr.label.find((a) => a.type === \"minute\")?.value;\n          const tz = curr.label.find((a) => a.type === \"timeZoneName\")?.value;\n          let secondsPart = \"\";\n          if (showSeconds) {\n            const s = curr.label.find((a) => a.type === \"second\")?.value;\n            const ms = curr.label.find(\n              (a) => a.type === \"fractionalSecond\",\n            )?.value;\n            secondsPart = `:${s}` + (showMilliseconds ? `.${ms}` : \"\");\n          }\n          visibleParts.push(\n            `${h}:${m}${secondsPart}` +\n            (showTimezone && newTimeZoneName ? ` ${tz}` : \"\"),\n          );\n        }\n        if (newDay || newMonth) {\n          let partial = \"\";\n          if (locale.startsWith(\"zh\") || locale.startsWith(\"ja\")) {\n            const monthIndex = curr.label.findIndex((a) => a.type === \"month\");\n            partial += curr.label[monthIndex]?.value || \"\"\n            partial += (curr.label[monthIndex + 1]?.value || \"\");\n            const dayIndex = curr.label.findIndex((a) => a.type === \"day\");\n            if (dayIndex >= 0 && newDay) {\n              partial += curr.label[dayIndex]?.value || \"\"\n              partial += (curr.label[dayIndex + 1]?.value || \"\");\n            }\n          } else {\n            partial += curr.label.find((a) => a.type === \"month\")?.value || \"\";\n            if (newDay) {\n              partial += \" \" + (curr.label.find((a) => a.type === \"day\")?.value || \"\");\n            }\n          }\n          visibleParts.push(partial);\n        }\n        if (newYear) {\n          visibleParts.push(curr.label.find((a) => a.type === \"year\")?.value);\n        }\n\n        return {\n          value: curr.value,\n          label: visibleParts.filter((a) => a).join(\"\\n\"),\n        };\n      });\n  };\n};\n"],"names":["clamp","val","min","max","sum","input","a","b","findClosestIndex","arr","closestIndex","i","pxToValDistance","frame","pxDistance","scaleId","space","scale","getScale","chartArea","factor","applyStyles","ctx","style","dpr","valToPxDistance","result","valToPos","relativePosition","clampXPosToChartArea","value","clampYPosToChartArea","valFits","posToVal","pos","deepEqual","keysA","keysB","key","drawAxes","plotDrawFrame","scales","rect","y","x","mergeRefsReact16","refs","ref","assignRef","mergeRefsReact19","cleanups","cleanup","isCleanup","mergeRefs","version","DrawPropagateContext","createContext","createDrawPropagateStore","listeners","listener","prio","idx","cb","FrameContext","RedrawRequestContext","CANPLOT_LAYER","FrameDrawer","__publicField","strategy","CanPlot","forwardRef","configuration","children","rest","canvasRef","useRef","rootRef","plotSize","useSize","setCtx","useState","useMemo","makeFrame","useLayoutEffect","jsxs","jsx","Updaters","drawPropagateStore","drawVersion","setDrawVersion","frameRef","requestedAnimationFrame","onRequestUpdate","useCallback","v","setPlotSize","resizeObserver","entries","entry","width","height","prev","size","chartAreaCSS","chartAreaCanvasPX","currentLeftOffset","currentRightOffset","currentBottomOffset","currentTopOffset","cssRect","canvasRect","useDrawEffectNoCache","layer","runner","deps","useContext","updateRequest","drawPropagateContext","frameDrawer","runnerRef","unsubscribe","useEffect","useDrawEffect","globalAlpha","globalCompositeOperation","offscreenFrameDrawer","offscreenRef","needsRedrawRef","scaleLimitsKey","s","canvasWidth","canvasHeight","sanitizedGlobalAlpha","offscreen","canvas","offscreenCtx","offscreenFrame","oldGlobalAlpha","oldGlobalCompositeOperation","useFrameState","LinePlotImpl","data","xScaleId","yScaleId","xGapWidth","xStrategy","yStrategy","valToPosWithStrategy","oldLineDash","lastX","point","xPos","yPos","LinePlot","React","ScatterPlotImpl","radius","points","p","ScatterPlot","BarPlotImpl","yBottom","x0","x1","yTop","barHeight","BarPlot","AreaPlotImpl","drawPoints","datapoint","y0","y1","firstPoint","AreaPlot","SparklinePlotImpl","stroked","first","last","scaledZeroY","SparklinePlot","XTicksImpl","withGrid","gridStyle","tickStyle","labelStyle","labelGap","tickSize","ticks","axis","effectiveTickSize","multilineGap","resolvedTicks","dprFont","label","labelLines","j","XTicks","YTicksImpl","YTicks","font","_","makeInteractionsBus","syncKey","callback","index","l","payload","InteractionsBus","useGenericInteractionsEvent","eventName","callbackRef","InteractionsIdContext","useInteractionsEvent","interactionsId","makePointerSyncPosition","event","sync","effectiveXSyncViaScaleId","effectiveYSyncViaScaleId","cssX","cssY","makeToNormalized","makeFromNormalized","normalized","pointerSyncPositionToInteractionsPosition","pointerSyncPosition","resolveAxisCss","source","viaScaleId","fromNormalized","localValue","makeSpanSelectHelpers","extrapolateScaledSelectionRange","origin","selectionRange","fromCSS","toCSS","scaled","from","to","ChartAreaInteractions","id","onClick","onDblClick","onMouseMove","onMouseDown","onMouseUp","onDocumentMouseUp","onSpanSelect","onContextMenu","className","innerChildren","useId","ChartAreaInteractionsImpl","interactionsAreaRef","moveSyncKey","selectStateRef","lastSpanSelectEventRef","lastMoveSyncEventRef","getRect","root","withPointerPosition","foo","positions","withPointerPositionRef","mouseUpListener","lastSpanSelectSyncEvent","keyListener","newKeys","lastMove","newMoveEvent","lastSpan","newSpanEvent","mouseOverDocumentListener","keys","selectState","startCSSX","endCSSX","startCSSY","endCSSY","xScale","yScale","mode","dY","dX","xRangeFrom","xRangeTo","yRangeFrom","yRangeTo","xMappedRange","yMappedRange","xRanges","yRanges","spanSelectEvent","mouseWheelListener","pointer","deltaAbs","interactionsAreaElement","e","__","TooltipsX","renderTooltip","moveState","setMoveState","tooltipState","rawScaledX","series","closestPointIndex","closestDistance","distance","closestPoint","Crosshair","makeXStyle","makeXClassName","makeYStyle","makeYClassName","clampedX","clampedY","Fragment","SelectBox","makeClassName","makeStyle","selection","setSelectState","dimensions","fromX","toX","fromY","toY","clampedFromX","clampedToX","clampedFromY","clampedToY","leftPx","topPx","widthPx","heightPx","AxisOverlay","DEFAULT_X_SPLIT_SPACE","DEFAULT_Y_SPLIT_SPACE","DEFAULT_TIMEZONE","DEFAULT_LOCALE","makeLinearTicks","formatter","acceptableIncrements","scaleMin","scaleMax","effectiveSpace","unnormalizedIncr","incr","DEFAULT_ACCEPTABLE_TICKS_INCREMENTS","curr","alignBy","defaultNumericalTicksFormatter","span","tick","millisecond","second","minute","hour","day","month","year","TIME_INCRS","durationToMilliseconds","duration","unit","addUTCMilliseconds","date","deltaMilliseconds","addUTCSeconds","deltaSeconds","addUTCMinutes","deltaMinutes","addUTCHours","deltaHours","addUTCDays","deltaDays","addUTCMonths","deltaMonths","addUTC","delta","deltaValue","deltaUnit","tzOffsetFmt","getTimezoneOffsetHours","atTime","timeZone","fmt","parts","get","type","makeFirstTick","minDate","incrValue","incrUnit","setTimeToMidnight","offsetHours","makeTimeTicks","locale","showTimezone","splitsCount","splitDistance","firstTick","firstTickOffset","splits","hourFmt","candidate","tickNumber","minGap","h","c","tickNoDST","makeTimeTickFormat","isTimeFormatPartDifferent","splitMs","showHours","showSeconds","showMilliseconds","newYear","newDay","newMonth","newHour","newTimeZoneName","newMinute","newSecond","newMillisecond","visibleParts","m","tz","secondsPart","ms","partial","monthIndex","dayIndex"],"mappings":"gTAAaA,EAAQ,CAACC,EAAaC,EAAaC,IACvC,KAAK,IAAI,KAAK,IAAIF,EAAKC,CAAG,EAAGC,CAAG,EAW5BC,GAAOC,GACXA,EAAM,OAAe,CAACC,EAAGC,IAAMD,GAAKC,GAAK,GAAI,CAAC,EAG1CC,GAAmB,CAACC,EAAeR,IAAgB,CAC9D,IAAIS,EAAe,EAEnB,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC1B,KAAK,IAAIF,EAAIE,CAAC,EAAIV,CAAG,EAAI,KAAK,IAAIQ,EAAIC,CAAY,EAAIT,CAAG,IAC3DS,EAAeC,GAGnB,OAAOD,CACT,ECtBaE,GAAkB,CAC7BC,EACAC,EACAC,EACAC,IACkB,CAClB,MAAMC,EAAQC,EAASL,EAAOE,CAAO,EACrC,GAAI,CAACE,EACH,OAAO,KAET,MAAME,EACJH,IAAU,SAAWH,EAAM,kBAAoBA,EAAM,aACjDO,GACHH,EAAM,SAAW,IAAME,EAAU,MAAQA,EAAU,SACnDF,EAAM,IAAMA,EAAM,KACrB,OAAOH,EAAaM,CACtB,EAEaF,EAAW,CACtBL,EACAE,IAEOF,EAAM,OAAO,KAAMP,GAAMA,EAAE,KAAOS,CAAO,GAAK,KAG1CM,EAAc,CACzBC,EACAC,IACS,CACT,MAAMC,EAAM,OAAO,kBAAoB,EACvCF,EAAI,QAAUC,GAAO,SAAW,OAChCD,EAAI,eAAiBE,GAAOD,GAAO,gBAAkB,GACrDD,EAAI,SAAWC,GAAO,UAAY,QAClCD,EAAI,UAAYE,GAAOD,GAAO,WAAa,GAC3CD,EAAI,WAAaE,GAAOD,GAAO,YAAc,IAC7CD,EAAI,YAAcC,GAAO,aAAe,QACxCD,EAAI,UAAYC,GAAO,WAAaD,EAAI,YACxCA,EAAI,KAAOC,GAAO,MAAQ,GAAG,GAAKC,CAAG,gBACrCF,EAAI,UAAYC,GAAO,WAAa,QACpCD,EAAI,UAAYC,GAAO,WAAa,UACpCD,EAAI,aAAeC,GAAO,cAAgB,aAC1CD,EAAI,YAAcC,GAAO,aAAe,MAC1C,EAEaE,GAAkB,CAC7BZ,EACAZ,EACAc,EACAC,IACkB,CAClB,MAAMG,EACJH,IAAU,SAAWH,EAAM,kBAAoBA,EAAM,aACjDI,EAAQC,EAASL,EAAOE,CAAO,EACrC,GAAI,CAACE,EACH,OAAO,KAET,MAAMG,GACHH,EAAM,SAAW,IAAME,EAAU,MAAQA,EAAU,SACnDF,EAAM,IAAMA,EAAM,KACfS,EAASzB,EAAMmB,EACrB,OAAI,OAAO,SAASM,CAAM,EACjBA,EAEF,IACT,EAEaC,EAAW,CACtBd,EACAZ,EACAc,EACAC,IACkB,CAClB,MAAMC,EAAQC,EAASL,EAAOE,CAAO,EACrC,GAAI,CAACE,EACH,OAAO,KAET,MAAME,EACJH,IAAU,SAAWH,EAAM,kBAAoBA,EAAM,aACjDe,EAAmBH,GACvBZ,EACAZ,EAAMgB,EAAM,IACZF,EACAC,CAAA,EAEF,OAAIY,IAAqB,KAChB,KAGPX,EAAM,SAAW,IACbjB,EACAmB,EAAU,EAAIS,EACdT,EAAU,EAAI,GAAKA,EAAU,MAC7BA,EAAU,EAAI,GAAKA,EAAU,KAAA,EAE7BnB,EACAmB,EAAU,EAAIA,EAAU,OAASS,EACjCT,EAAU,EAAI,GAAKA,EAAU,OAC7BA,EAAU,EAAI,GAAKA,EAAU,MAAA,CAGrC,EAEaU,EAAuB,CAClChB,EACAiB,EACAd,IACe,CACf,GAAIc,IAAU,KACZ,OAAO,KAET,MAAMX,EACJH,IAAU,SAAWH,EAAM,kBAAoBA,EAAM,aAEvD,OAAOb,EAAM8B,EAAOX,EAAU,EAAGA,EAAU,EAAIA,EAAU,KAAK,CAChE,EAEaY,EAAuB,CAClClB,EACAiB,EACAd,IACe,CACf,GAAIc,IAAU,KACZ,OAAO,KAET,MAAMX,EACJH,IAAU,SAAWH,EAAM,kBAAoBA,EAAM,aACvD,OAAOb,EAAM8B,EAAOX,EAAU,EAAGA,EAAU,EAAIA,EAAU,MAAM,CACjE,EAEaa,EAAU,CACrBnB,EACAiB,EACAf,IACY,CACZ,GAAIe,IAAU,KACZ,MAAO,GAET,MAAMb,EAAQC,EAASL,EAAOE,CAAO,EACrC,OAAKE,EAGEa,GAASb,EAAM,KAAOa,GAASb,EAAM,IAFnC,EAGX,EAEagB,EAAW,CACtBpB,EACAqB,EACAnB,EACAC,IACkB,CAClB,MAAMC,EAAQC,EAASL,EAAOE,CAAO,EACrC,GAAI,CAACE,EACH,OAAO,KAET,MAAME,EACJH,IAAU,SAAWH,EAAM,kBAAoBA,EAAM,aAEjDe,EACJX,EAAM,SAAW,KACZiB,EAAMf,EAAU,GAAKA,EAAU,OAC/BA,EAAU,OAASe,EAAMf,EAAU,GAAKA,EAAU,OACzD,OAAOF,EAAM,IAAMW,GAAoBX,EAAM,IAAMA,EAAM,IAC3D,EAEakB,EAAY,CAAI7B,EAAMC,IAAkB,CACnD,GAAID,IAAMC,EAAG,MAAO,GAQpB,GANID,GAAK,MAAQC,GAAK,MAElB,OAAOD,GAAM,OAAOC,GAEpB,OAAOD,GAAM,UAEb,MAAM,QAAQA,CAAC,IAAM,MAAM,QAAQC,CAAC,EAAG,MAAO,GAElD,GAAI,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EAAG,CACxC,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAASI,EAAI,EAAGA,EAAIL,EAAE,OAAQK,IAC5B,GAAI,CAACwB,EAAU7B,EAAEK,CAAC,EAAGJ,EAAEI,CAAC,CAAC,EAAG,MAAO,GAErC,MAAO,EACT,CAEA,MAAMyB,EAAQ,OAAO,KAAK9B,CAAW,EAC/B+B,EAAQ,OAAO,KAAK9B,CAAW,EAErC,GAAI6B,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAE1C,UAAWC,KAAOF,EAGhB,GAFI,CAAC,OAAO,UAAU,eAAe,KAAK7B,EAAG+B,CAAG,GAE5C,CAACH,EAAW7B,EAAUgC,CAAG,EAAI/B,EAAU+B,CAAG,CAAC,EAAG,MAAO,GAG3D,MAAO,EACT,ECnMaC,GAAYC,GAAiC,CACxD,KAAM,CAAE,IAAAlB,EAAK,OAAAmB,CAAA,EAAWD,EAExB,UAAWvB,KAASwB,EAAQ,CAC1B,GAAI,CAACxB,EAAM,KAAM,SACjBK,EAAI,KAAA,EACJD,EAAYC,EAAK,CACf,YAAa,QACb,UAAW,QACX,UAAW,EACX,GAAGL,EAAM,KAAK,KAAA,CACf,EACD,MAAMyB,EAAOzB,EAAM,KAAK,WACxB,GAAIA,EAAM,SAAW,KACnB,GAAIA,EAAM,KAAK,WAAa,SAC1BK,EAAI,UAAA,EACJA,EAAI,OAAOoB,EAAK,EAAGA,EAAK,CAAC,EACzBpB,EAAI,OAAOoB,EAAK,EAAIA,EAAK,MAAOA,EAAK,CAAC,EACtCpB,EAAI,OAAA,UACKL,EAAM,KAAK,WAAa,MAAO,CACxC,MAAM0B,EAAID,EAAK,EAAIA,EAAK,OACxBpB,EAAI,UAAA,EACJA,EAAI,OAAOoB,EAAK,EAAGC,CAAC,EACpBrB,EAAI,OAAOoB,EAAK,EAAIA,EAAK,MAAOC,CAAC,EACjCrB,EAAI,OAAA,CACN,UAEIL,EAAM,KAAK,WAAa,OAAQ,CAClC,MAAM2B,EAAIF,EAAK,EAAIA,EAAK,MACxBpB,EAAI,UAAA,EACJA,EAAI,OAAOsB,EAAGF,EAAK,CAAC,EACpBpB,EAAI,OAAOsB,EAAGF,EAAK,EAAIA,EAAK,MAAM,EAClCpB,EAAI,OAAA,CACN,MAAWL,EAAM,KAAK,WAAa,UACjCK,EAAI,UAAA,EACJA,EAAI,OAAOoB,EAAK,EAAGA,EAAK,CAAC,EACzBpB,EAAI,OAAOoB,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAM,EACvCpB,EAAI,OAAA,GAGRA,EAAI,QAAA,CACN,CACF,ECzCA,SAASuB,GAAiBC,EAAM,CAC9B,OAAQhB,GAAU,CAChB,UAAWiB,KAAOD,EAAME,GAAUD,EAAKjB,CAAK,CAC9C,CACF,CAGA,SAASmB,GAAiBH,EAAM,CAC9B,OAAQhB,GAAU,CAChB,MAAMoB,EAAW,CAAA,EACjB,UAAWH,KAAOD,EAAM,CACtB,MAAMK,EAAUH,GAAUD,EAAKjB,CAAK,EAC9BsB,EAAY,OAAOD,GAAY,WACrCD,EAAS,KAAKE,EAAYD,EAAU,IAAMH,GAAUD,EAAK,IAAI,CAAC,CAChE,CACA,MAAO,IAAM,CACX,UAAWI,KAAWD,EAAUC,EAAO,CACzC,CACF,CACF,CAGA,SAASH,GAAUD,EAAKjB,EAAO,CAC7B,GAAI,OAAOiB,GAAQ,WACjB,OAAOA,EAAIjB,CAAK,EACPiB,IACTA,EAAI,QAAUjB,EAElB,CACA,IAAIuB,GAAY,SAASC,UAAQ,MAAM,GAAG,EAAE,CAAC,EAAG,EAAE,GAAK,GAAKL,GAAmBJ,GCzBxE,MAAMU,GAAuBC,EAAAA,cAAwC,CAC1E,UAAW,CAAA,EACX,UAAW,IAAM,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,CAC1B,CAAC,EAEYC,GAA2B,IAAgC,CACtE,MAAMC,EAA8C,CAAA,EAgBpD,MAAO,CAAE,UAAAA,EAAW,UAfF,CAACC,EAAsBC,KACvCF,EAAU,KAAK,CAACE,EAAMD,CAAQ,CAAC,EAC/BD,EAAU,KAAK,CAACpD,EAAGC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAC7B,IAAM,CACX,MAAMsD,EAAMH,EAAU,UAAU,CAAC,CAAA,CAAGI,CAAE,IAAMA,IAAOH,CAAQ,EACvDE,IAAQ,IACVH,EAAU,OAAOG,EAAK,CAAC,CAE3B,GAO6B,gBALP,IAAM,CAC5B,SAAW,CAAA,CAAGC,CAAE,IAAKJ,EACnBI,EAAA,CAEJ,CAC+B,CACjC,EC7BaC,GAAeP,EAAAA,cAAoC,IAAI,ECAvDQ,GAAuBR,EAAAA,cAAiC,IAAM,CAAC,CAAC,ECWhES,GAAgB,CAC3B,IAAK,IACL,OAAQ,IACR,OAAQ,IACR,WAAY,GACd,EAEO,MAAMC,CAAY,CAAlB,cACGC,EAAA,cAA+B,MAcvCA,EAAA,4BAAuB,CACrBvB,EACA5B,EAA0B,WAEnBa,EAAqB,KAAK,MAAOe,EAAG5B,CAAK,GAElDmD,EAAA,4BAAuB,CACrBxB,EACA3B,EAA0B,WAEnBe,EAAqB,KAAK,MAAOY,EAAG3B,CAAK,GAElDmD,EAAA,gBAAW,CACTrC,EACAf,EACAC,EAA0B,WAEnBW,EAAS,KAAK,MAAOG,EAAOf,EAASC,CAAK,GAEnDmD,EAAA,uBAAkB,CAChBrC,EACAf,EACAC,EAA0B,WAEnBS,GAAgB,KAAK,MAAOK,EAAOf,EAASC,CAAK,GAE1DmD,EAAA,eAAU,CAACrC,EAAef,IACjBiB,EAAQ,KAAK,MAAOF,EAAOf,CAAO,GAE3CoD,EAAA,gBAAYpD,GACHG,EAAS,KAAK,MAAOH,CAAO,GAErCoD,EAAA,4BAAuB,CACrBrC,EACAf,EACAC,EAA0B,SAC1BoD,IACkB,CAClB,MAAMnD,EAAQ,KAAK,SAASF,CAAO,EACnC,OAAKE,EAEDmD,IAAa,OACVpC,EAAQ,KAAK,MAAOF,EAAOf,CAAO,EAGhCY,EAAS,KAAK,MAAOG,EAAOf,EAASC,CAAK,EAFxC,KAIPC,EAAM,SAAW,IACZ,KAAK,qBACVU,EAAS,KAAK,MAAOG,EAAOf,EAASC,CAAK,EAC1CA,CAAA,EAGG,KAAK,qBACVW,EAAS,KAAK,MAAOG,EAAOf,EAASC,CAAK,EAC1CA,CAAA,EAhBiB,IAkBrB,GArEA,aAAaH,EAAsB,CACjC,KAAK,OAASA,CAChB,CACA,IAAI,OAAQ,CACV,GAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,8BAA8B,EAEhD,OAAO,KAAK,MACd,CACA,IAAI,KAAM,CACR,OAAO,KAAK,MAAM,GACpB,CA2DF,CC1EO,MAAMwD,GAAUC,EAAAA,WAOrB,CAAC,CAAE,cAAAC,EAAe,SAAAC,EAAU,MAAAjD,EAAO,GAAGkD,CAAA,EAAQ1B,IAAQ,CACtD,MAAM2B,EAAYC,EAAAA,OAA0B,IAAI,EAC1CC,EAAUD,EAAAA,OAAuB,IAAI,EAErCE,EAAWC,GAAQF,CAAO,EAE1B,CAACtD,EAAKyD,CAAM,EAAIC,EAAAA,SAA0C,IAAI,EAE9DnE,EAAQoE,EAAAA,QACZ,IAAMC,GAAUX,EAAeM,EAAUvD,CAAG,EAC5C,CAACiD,EAAeM,EAAUvD,CAAG,CAAA,EAG/B6D,EAAAA,gBAAgB,IAAM,CACpBJ,EAAOL,EAAU,SAAS,WAAW,IAAI,GAAK,IAAI,CACpD,EAAG,CAACA,CAAS,CAAC,EAEd,MAAMlD,EAAM,OAAO,kBAAoB,EAEvC,OACE4D,EAAAA,KAAC,MAAA,CACC,IAAK/B,GAAU,CAACN,EAAK6B,CAAO,CAAC,EAC7B,MAAO,CACL,SAAU,WACV,SAAU,SACV,GAAGrD,CAAA,EAEL,mBAAgB,GACf,GAAGkD,EAEJ,SAAA,CAAAY,EAAAA,IAAC,SAAA,CACC,IAAKX,EACL,MAAOG,EAAS,MAAQrD,EACxB,OAAQqD,EAAS,OAASrD,EAC1B,MAAO,CACL,MAAO,EACP,SAAU,WACV,MAAO,GAAGqD,EAAS,KAAK,KACxB,OAAQ,GAAGA,EAAS,MAAM,IAAA,CAC5B,CAAA,EAEDhE,GAASwE,EAAAA,IAACC,GAAA,CAAS,MAAAzE,EAAe,SAAA2D,CAAA,CAAS,CAAA,CAAA,CAAA,CAGlD,CAAC,EAEKc,GAAqE,CAAC,CAC1E,MAAAzE,EACA,SAAA2D,CACF,IAAM,CACJ,KAAM,CAACe,CAAkB,EAAIP,WAAS,IAAMvB,IAA0B,EAChE,CAAC+B,EAAaC,CAAc,EAAIT,EAAAA,SAAS,CAAC,EAChDG,EAAAA,gBAAgB,IAAM,CACpBtE,GAAO,IAAI,UAAU,EAAG,EAAGA,EAAM,IAAI,OAAO,MAAOA,EAAM,IAAI,OAAO,MAAM,CAC5E,EAAG,CAACA,EAAO2E,CAAW,CAAC,EAEvB,MAAME,EAAWf,EAAAA,OAA6B,IAAI,EAClDe,EAAS,QAAU7E,EAEnBsE,EAAAA,gBAAgB,IACPI,EAAmB,UAAU,IAAM,CACpCG,EAAS,SACXnD,GAASmD,EAAS,OAAQ,CAE9B,EAAGzB,GAAc,MAAM,EACtB,CAACsB,CAAkB,CAAC,EAEvBJ,EAAAA,gBAAgB,IAAM,CACpB,IAAIQ,EAAyC,KAC7C,OAAAA,EAA0B,OAAO,sBAAsB,IAAM,CAC3DA,EAA0B,KAC1BJ,EAAmB,gBAAA,CACrB,CAAC,EACM,IAAM,CACPI,GACF,qBAAqBA,CAAuB,CAEhD,CACF,EAAG,CAACH,EAAa3E,EAAO0E,CAAkB,CAAC,EAE3C,MAAMK,EAAkBC,EAAAA,YAAY,IAAM,CACxCJ,EAAgBK,GAAMA,EAAI,CAAC,CAC7B,EAAG,CAACL,CAAc,CAAC,EAEnB,OACEJ,MAAC9B,GAAqB,SAArB,CAA8B,MAAOgC,EACpC,SAAAF,EAAAA,IAACrB,GAAqB,SAArB,CAA8B,MAAO4B,EACpC,SAAAP,EAAAA,IAACtB,GAAa,SAAb,CAAsB,MAAOlD,EAAQ,SAAA2D,CAAA,CAAS,EACjD,EACF,CAEJ,EAEMM,GAAW/B,GAA6C,CAC5D,KAAM,CAAC8B,EAAUkB,CAAW,EAAIf,WAAmB,CACjD,MAAO,EACP,OAAQ,CAAA,CACT,EAEK,CAACgB,CAAc,EAAIhB,EAAAA,SAAS,IACzB,IAAI,eAAgBiB,GAAY,CACrC,UAAWC,KAASD,EAAS,CAC3B,MAAME,EAAQ,KAAK,MAAMD,EAAM,YAAY,KAAK,EAC1CE,EAAS,KAAK,MAAMF,EAAM,YAAY,MAAM,EAElDH,EAAaM,GACXA,EAAK,QAAUF,GAASE,EAAK,SAAWD,EACpC,CAAE,GAAGC,EAAM,MAAAF,EAAO,OAAAC,GAClBC,CAAA,CAER,CACF,CAAC,CACF,EAEDlB,OAAAA,EAAAA,gBAAgB,IAAM,CACpB,GAAI,CAACpC,EAAI,QAAS,OAClB,MAAMoD,EAAQpD,EAAI,QAAQ,YACpBqD,EAASrD,EAAI,QAAQ,aAC3B,OAAAgD,EAAaM,GACXA,EAAK,QAAUF,GAASE,EAAK,SAAWD,EACpC,CAAE,GAAGC,EAAM,MAAAF,EAAO,OAAAC,GAClBC,CAAA,EAENL,EAAe,QAAQjD,EAAI,QAAS,CAAE,IAAK,aAAc,EAClD,IAAMiD,EAAe,WAAA,CAC9B,EAAG,CAACA,EAAgBjD,CAAG,CAAC,EACjB8B,CACT,EAEMK,GAAY,CAChBX,EACA+B,EACAhF,IACyB,CACzB,GAAI,CAACA,EACH,OAAO,KAET,MAAME,EAAM,OAAO,kBAAoB,EAEvC,GAAI8E,EAAK,QAAU,GAAKA,EAAK,SAAW,EACtC,OAAO,KAGT,MAAMC,EAA8C,CAClD,EAAGhC,EAAc,QAAQ,KACzB,EAAGA,EAAc,QAAQ,IACzB,MACE+B,EAAK,MAAQ/B,EAAc,QAAQ,KAAOA,EAAc,QAAQ,MAClE,OACE+B,EAAK,OAAS/B,EAAc,QAAQ,IAAMA,EAAc,QAAQ,MAAA,EAGpE,UAAWtD,KAASsD,EAAc,OAC3BtD,EAAM,OACPA,EAAM,SAAW,KACfA,EAAM,KAAK,WAAa,UAAYA,EAAM,KAAK,WAAa,SAC9DsF,EAAa,OAAS,KAAK,IACzB,EACAA,EAAa,OAAStF,EAAM,KAAK,IAAA,EAE/BA,EAAM,KAAK,WAAa,QAC1BsF,EAAa,GAAKtF,EAAM,KAAK,QAI7BA,EAAM,KAAK,WAAa,QAAUA,EAAM,KAAK,WAAa,WAC5DsF,EAAa,MAAQ,KAAK,IAAI,EAAGA,EAAa,MAAQtF,EAAM,KAAK,IAAI,EACjEA,EAAM,KAAK,WAAa,SAC1BsF,EAAa,GAAKtF,EAAM,KAAK,QAMrC,MAAMuF,EAAwD,CAC5D,EAAGD,EAAa,EAAI/E,EACpB,EAAG+E,EAAa,EAAI/E,EACpB,MAAO+E,EAAa,MAAQ/E,EAC5B,OAAQ+E,EAAa,OAAS/E,CAAA,EAG1BiB,EAAkC,CAAA,EAExC,IAAIgE,EAAoBlC,EAAc,QAAQ,KAAO/C,EACjDkF,EAAqBJ,EAAK,MAAQ9E,EAAM+C,EAAc,QAAQ,MAAQ/C,EACtEmF,EACFL,EAAK,OAAS9E,EAAM+C,EAAc,QAAQ,OAAS/C,EACjDoF,EAAmBrC,EAAc,QAAQ,IAAM/C,EAEnD,UAAWP,KAASsD,EAAc,OAAQ,CACxC,GAAI,CAACtD,EAAM,KAAM,CACfwB,EAAO,KAAK,CAAE,GAAGxB,EAAO,KAAM,KAAM,EACpC,QACF,CACA,IAAI4F,EACJ,GAAI5F,EAAM,SAAW,IACnB,OAAQA,EAAM,KAAK,SAAA,CACjB,IAAK,SACH0F,GAAuB1F,EAAM,KAAK,KAAOO,EACzCqF,EAAU,CACR,EAAGN,EAAa,EAChB,EAAGI,EAAsBnF,EACzB,MAAO+E,EAAa,MACpB,OAAQtF,EAAM,KAAK,IAAA,EAErB,MACF,IAAK,MACH2F,GAAoB3F,EAAM,KAAK,KAAOO,EACtCqF,EAAU,CACR,EAAGN,EAAa,EAChB,EAAGK,EAAmBpF,EAAMP,EAAM,KAAK,KACvC,MAAOsF,EAAa,MACpB,OAAQtF,EAAM,KAAK,IAAA,EAErB,MACF,IAAK,OACL,IAAK,QACH,MAAM,IAAI,MAAM,oCAAoC,CAAA,KAGxD,QAAQA,EAAM,KAAK,SAAA,CACjB,IAAK,OACHwF,GAAqBxF,EAAM,KAAK,KAAOO,EACvCqF,EAAU,CACR,EAAGJ,EAAoBjF,EAAMP,EAAM,KAAK,KACxC,EAAGsF,EAAa,EAChB,MAAOtF,EAAM,KAAK,KAClB,OAAQsF,EAAa,MAAA,EAEvB,MACF,IAAK,QACHG,GAAsBzF,EAAM,KAAK,KAAOO,EACxCqF,EAAU,CACR,EAAGH,EAAqBlF,EACxB,EAAG+E,EAAa,EAChB,MAAOtF,EAAM,KAAK,KAClB,OAAQsF,EAAa,MAAA,EAEvB,MACF,IAAK,MACL,IAAK,SACH,MAAM,IAAI,MAAM,oCAAoC,CAAA,CAG1D,MAAMO,EAAmB,CACvB,EAAGD,EAAQ,EAAIrF,EACf,EAAGqF,EAAQ,EAAIrF,EACf,MAAOqF,EAAQ,MAAQrF,EACvB,OAAQqF,EAAQ,OAASrF,CAAA,EAE3BiB,EAAO,KAAK,CACV,GAAGxB,EACH,KAAM,CACJ,GAAGA,EAAM,KACT,QAAA4F,EACA,WAAAC,CAAA,CACF,CACD,CACH,CAWA,MAT8B,CAC5B,IAAAxF,EACA,IAAAE,EACA,QAAS+C,EAAc,QACvB,OAAA9B,EACA,aAAA8D,EACA,kBAAAC,CAAA,CAIJ,EC3RaO,GAAuB,CAClCC,EACAC,EAEAC,IACG,CACH,MAAMrG,EAAQsG,EAAAA,WAAWpD,EAAY,EAC/BqD,EAAgBD,EAAAA,WAAWnD,EAAoB,EAC/CqD,EAAuBF,EAAAA,WAAW5D,EAAoB,EAE5D,GAAI,CAAC1C,GAAS,CAACuG,EACb,MAAM,IAAI,MAAM,kDAAkD,EAGpE,KAAM,CAACE,CAAW,EAAItC,EAAAA,SAAS,IAAM,IAAId,CAAa,EACtDoD,EAAY,aAAazG,CAAK,EAE9B,MAAM6E,EAAWf,EAAAA,OAAO2C,CAAW,EACnC5B,EAAS,QAAU4B,EAEnB,MAAMC,EAAY5C,EAAAA,OAAOsC,CAAM,EAC/BM,EAAU,QAAUN,EAEpB9B,EAAAA,gBAAgB,IAAM,CAEpB,MAAMqC,EAAcH,EAAqB,UACvC,IAAM,CACJE,EAAU,QAAQD,CAAW,CAC/B,EACA,OAAON,GAAU,SAAWA,EAAQ/C,GAAc+C,CAAK,CAAA,EAEzD,MAAO,IAAM,CACXQ,EAAA,CACF,CACF,EAAG,CAACH,EAAsBL,EAAOM,CAAW,CAAC,EAE7CnC,EAAAA,gBAAgB,IAAM,CACpBiC,EAAA,CAEF,EAAG,CAACA,EAAe,GAAGF,CAAI,CAAC,EAE3BO,EAAAA,UAAU,IACD,IAAM,CAEXL,EAAA,CACF,EACC,CAACA,CAAa,CAAC,CACpB,EAEaM,EAAgB,CAAC,CAC5B,MAAAV,EACA,OAAAC,EACA,YAAAU,EACA,yBAAAC,EACA,KAAAV,CACF,IAOM,CACJ,MAAMrG,EAAQsG,EAAAA,WAAWpD,EAAY,EAC/BqD,EAAgBD,EAAAA,WAAWnD,EAAoB,EAC/CqD,EAAuBF,EAAAA,WAAW5D,EAAoB,EAE5D,GAAI,CAAC1C,GAAS,CAACuG,EACb,MAAM,IAAI,MACR,6DAAA,EAIJ,KAAM,CAACE,CAAW,EAAItC,EAAAA,SAAS,IAAM,IAAId,CAAa,EACtDoD,EAAY,aAAazG,CAAK,EAE9B,KAAM,CAACgH,CAAoB,EAAI7C,EAAAA,SAAS,IAAM,IAAId,CAAa,EAEzDqD,EAAY5C,EAAAA,OAAOsC,CAAM,EAC/BM,EAAU,QAAUN,EAEpB,MAAMa,EAAenD,EAAAA,OAGX,IAAI,EACRoD,EAAiBpD,EAAAA,OAAO,EAAI,EAG5BqD,EAAiBnH,EAAM,OAC1B,IAAKoH,GAAM,GAAGA,EAAE,EAAE,IAAIA,EAAE,GAAG,IAAIA,EAAE,GAAG,EAAE,EACtC,KAAK,GAAG,EAEX9C,EAAAA,gBAAgB,IAAM,CACpB,MAAMqC,EAAcH,EAAqB,UACvC,IAAM,CACJ,MAAMa,EAAcZ,EAAY,IAAI,OAAO,MACrCa,EAAeb,EAAY,IAAI,OAAO,OACtCc,EAAuBT,GAAe,EAE5C,GAAIO,IAAgB,GAAKC,IAAiB,EAAG,OAG7C,MAAME,EAAYP,EAAa,QAC/B,GACE,CAACO,GACDA,EAAU,OAAO,QAAUH,GAC3BG,EAAU,OAAO,SAAWF,EAC5B,CACA,MAAMG,EAASD,GAAW,QAAU,SAAS,cAAc,QAAQ,EACnEC,EAAO,MAAQJ,EACfI,EAAO,OAASH,EAChB,MAAMI,EAAeD,EAAO,WAAW,IAAI,EAC3CR,EAAa,QAAU,CAAE,OAAAQ,EAAQ,IAAKC,CAAA,EACtCR,EAAe,QAAU,EAC3B,CACA,IAAIS,EAAiB,KACrB,GAAI,CACFA,EAAiBX,EAAqB,KACxC,MAAgB,CAChB,CACK1F,EAAUqG,GAAgB,kBAAmBlB,EAAY,MAAM,iBAAiB,IACnFS,EAAe,QAAU,IAIvBA,EAAe,UACjBD,EAAa,QAAS,IAAI,UAAU,EAAG,EAAGI,EAAaC,CAAY,EACnEN,EAAqB,aAAa,CAChC,GAAGP,EAAY,MACf,IAAKQ,EAAa,QAAS,GAAA,CAC5B,EACGM,EAAuB,GACzBb,EAAU,QAAQM,CAAoB,EAExCE,EAAe,QAAU,IAI3B,MAAMU,EAAiBnB,EAAY,IAAI,YACjCoB,EACJpB,EAAY,IAAI,yBAClBA,EAAY,IAAI,YAAcc,EAC9Bd,EAAY,IAAI,yBACdM,GAA4B,cAC9BN,EAAY,IAAI,UAAUQ,EAAa,QAAS,OAAQ,EAAG,CAAC,EAC5DR,EAAY,IAAI,YAAcmB,EAC9BnB,EAAY,IAAI,yBAA2BoB,CAC7C,EACA,OAAO1B,GAAU,SAAWA,EAAQ/C,GAAc+C,CAAK,CAAA,EAEzD,MAAO,IAAM,CACXQ,EAAA,CACF,CACF,EAAG,CACDH,EACAL,EACAM,EACAO,EACAF,EACAC,CAAA,CACD,EAEDzC,EAAAA,gBAAgB,IAAM,CACpB4C,EAAe,QAAU,GACzBX,EAAA,CAEF,EAAG,CACDA,EACAY,EACAL,EACAC,EACA,GAAGV,CAAA,CACJ,EAEDO,EAAAA,UAAU,IACD,IAAM,CAEXL,EAAA,CACF,EACC,CAACA,CAAa,CAAC,CACpB,EAEauB,GAAgB,IAAM,CACjC,MAAM9H,EAAQsG,EAAAA,WAAWpD,EAAY,EACrC,GAAI,CAAClD,EACH,MAAM,IAAI,MAAM,kDAAkD,EAEpE,OAAOoE,EAAAA,QAAQ,IAAM,CACnB,MAAMqC,EAAc,IAAIpD,EACxB,OAAAoD,EAAY,aAAazG,CAAK,EACvByG,CACT,EAAG,CAACzG,CAAK,CAAC,CACZ,ECxMM+H,GAmBD,CAAC,CACJ,MAAA5B,EAAQ,SACR,KAAA6B,EACA,SAAAC,EACA,SAAAC,EACA,MAAAxH,EACA,YAAAoG,EACA,UAAAqB,EACA,UAAAC,EAAY,OACZ,UAAAC,EAAY,MACd,KACExB,EAAc,CACZ,MAAAV,EACA,YAAAW,EACA,OAAQ,CAAC,CAAE,IAAArG,EAAK,qBAAA6H,KAA2B,CACzC7H,EAAI,KAAA,EACJA,EAAI,UAAA,EACJD,EAAYC,EAAKC,CAAK,EACtB,MAAM6H,EAAc9H,EAAI,YAAA,EACpBC,GAAO,UACTD,EAAI,YAAYC,EAAM,QAAQ,EAEhC,IAAI8H,EAAuB,KAC3B,UAAWC,KAAST,EAAM,CACxB,MAAMU,EAAOJ,EACXG,EAAM,EACNR,EACA,SACAG,CAAA,EAEIO,EAAOL,EACXG,EAAM,EACNP,EACA,SACAG,CAAA,EAGEK,IAAS,MAAQC,IAAS,OAI5BH,IAAU,MACVL,IAAc,QACdM,EAAM,EAAID,EAAQL,EAElB1H,EAAI,OAAOiI,EAAMC,CAAI,EAErBlI,EAAI,OAAOiI,EAAMC,CAAI,EAEvBH,EAAQC,EAAM,EAChB,CACAhI,EAAI,OAAA,EACA8H,GACF9H,EAAI,YAAY8H,CAAW,EAE7B9H,EAAI,QAAA,CACN,EACA,KAAM,CAACuH,EAAMC,EAAUC,EAAUxH,EAAOyH,EAAWC,EAAWC,CAAS,CAAA,CACxE,EACM,MAGIO,GAAWC,EAAM,KAAKd,GAAczG,CAAS,ECjFpDwH,GAkBD,CAAC,CACJ,MAAA3C,EAAQ,SACR,KAAA6B,EACA,SAAAC,EACA,SAAAC,EACA,UAAAE,EAAY,OACZ,UAAAC,EAAY,OACZ,OAAAU,EAAS,EACT,MAAArI,EACA,YAAAoG,CACF,KACED,EAAc,CACZ,MAAAV,EACA,YAAAW,EACA,OAAQ,CAAC,CAAE,IAAArG,EAAK,qBAAA6H,KAA2B,CACzC7H,EAAI,KAAA,EACJD,EAAYC,EAAKC,CAAK,EAEtB,MAAMsI,EAAS,CAAA,EAEf,UAAWP,KAAST,EAAM,CACxB,MAAMU,EAAOJ,EACXG,EAAM,EACNR,EACA,SACAG,CAAA,EAEIO,EAAOL,EACXG,EAAM,EACNP,EACA,SACAG,CAAA,EAGEK,IAAS,MAAQC,IAAS,MAE9BK,EAAO,KAAK,CAAE,EAAGN,EAAM,EAAGC,EAAM,CAClC,CAGA,GAAIjI,GAAO,UACT,UAAWuI,KAAKD,EACdvI,EAAI,UAAA,EACJA,EAAI,IAAIwI,EAAE,EAAGA,EAAE,EAAGF,EAAQ,EAAG,KAAK,GAAK,CAAC,EACxCtI,EAAI,KAAA,EAKR,GAAIC,GAAO,YAAa,CACtBD,EAAI,UAAA,EACJ,UAAWwI,KAAKD,EACdvI,EAAI,OAAOwI,EAAE,EAAIF,EAAQE,EAAE,CAAC,EAC5BxI,EAAI,IAAIwI,EAAE,EAAGA,EAAE,EAAGF,EAAQ,EAAG,KAAK,GAAK,CAAC,EAE1CtI,EAAI,OAAA,CACN,CAEAA,EAAI,QAAA,CACN,EACA,KAAM,CAACuH,EAAMC,EAAUC,EAAUa,EAAQrI,EAAO0H,EAAWC,CAAS,CAAA,CACrE,EACM,MAGIa,GAAcL,EAAM,KAAKC,GAAiBxH,CAAS,ECpF1D6H,GAgBD,CAAC,CACJ,KAAAnB,EACA,SAAAC,EACA,SAAAC,EACA,MAAAxH,EACA,YAAAoG,EACA,OAAAiC,EACA,MAAA5C,EAAQ,QACV,KACEU,EAAc,CACZ,MAAAV,EACA,YAAAW,EACA,OAAQ,CAAC,CAAE,IAAArG,EAAK,qBAAA6H,KAA2B,CACzC,GAAIN,EAAK,SAAW,EAAG,OACvB,MAAMoB,EAAUd,EAAqB,EAAGJ,EAAU,SAAU,OAAO,EAEnE,GAAIkB,IAAY,KACd,OAGF,MAAMJ,EAMD,CAAA,EACL,SAAW,CAAE,EAAAjH,EAAG,EAAAD,CAAA,IAAOkG,EAAM,CAC3B,MAAMqB,EAAKf,EAAqBvG,EAAE,CAAC,EAAGkG,EAAU,SAAU,OAAO,EAC3DqB,EAAKhB,EAAqBvG,EAAE,CAAC,EAAGkG,EAAU,SAAU,OAAO,EAC3DsB,EAAOjB,EAAqBxG,EAAGoG,EAAU,SAAU,OAAO,EAEhE,GAAImB,IAAO,MAAQC,IAAO,MAAQC,IAAS,MAAQF,IAAOC,EACxD,SAGF,MAAME,EAAYJ,EAAUG,EAE5BP,EAAO,KAAK,CACV,GAAAK,EACA,GAAAC,EACAC,EACA,MAAOD,EAAKD,EACZ,OAAQG,CAAA,CACT,CACH,CAKA,GAHA/I,EAAI,KAAA,EACJD,EAAYC,EAAKC,CAAK,EAElBA,GAAO,UACT,UAAWuI,KAAKD,EACdvI,EAAI,UAAA,EACAsI,EACFtI,EAAI,UAAUwI,EAAE,GAAIA,EAAE,EAAGA,EAAE,GAAKA,EAAE,GAAIA,EAAE,OAAQF,CAAM,EAEtDtI,EAAI,KAAKwI,EAAE,GAAIA,EAAE,EAAGA,EAAE,GAAKA,EAAE,GAAIA,EAAE,MAAM,EAE3CxI,EAAI,KAAA,EAIR,GAAIC,GAAO,YAAa,CACtBD,EAAI,UAAA,EACJ,UAAWwI,KAAKD,EACVD,EACFtI,EAAI,UAAUwI,EAAE,GAAIA,EAAE,EAAGA,EAAE,GAAKA,EAAE,GAAIA,EAAE,OAAQF,CAAM,EAEtDtI,EAAI,KAAKwI,EAAE,GAAIA,EAAE,EAAGA,EAAE,GAAKA,EAAE,GAAIA,EAAE,MAAM,EAG7CxI,EAAI,OAAA,CACN,CAEAA,EAAI,QAAA,CACN,EACA,KAAM,CACJuH,EACAC,EACAC,EACAxH,EACAqI,CAAA,CACF,CACD,EACM,MAGIU,GAAUZ,EAAM,KAAKM,GAAa7H,CAAS,ECvGlDoI,GAeD,CAAC,CAAE,MAAAvD,EAAQ,SAAU,KAAA6B,EAAM,SAAAC,EAAU,SAAAC,EAAU,MAAAxH,EAAO,YAAAoG,MACzDD,EAAc,CACZ,MAAAV,EACA,YAAAW,EACA,OAAQ,CAAC,CAAE,IAAArG,EAAK,qBAAAO,EAAsB,qBAAAE,EAAsB,SAAAJ,KAAe,CACzE,MAAM6I,EAA8C,CAAA,EACpD,UAAWC,KAAa5B,EAAM,CAE5B,MAAMjG,EAAIf,EAAqBF,EAAS8I,EAAU,EAAG3B,CAAQ,CAAC,EAC9D,GAAIlG,IAAM,KACR,SAIF,MAAM8H,EAAK3I,EAAqBJ,EAAS8I,EAAU,EAAE,CAAC,EAAG1B,CAAQ,CAAC,EAClE,GAAI2B,IAAO,KACT,SAIF,MAAMC,EAAK5I,EAAqBJ,EAAS8I,EAAU,EAAE,CAAC,EAAG1B,CAAQ,CAAC,EAC9D4B,IAAO,OAIXH,EAAW,KAAK,CAAE,EAAA5H,EAAG,EAAG8H,EAAI,EAC5BF,EAAW,QAAQ,CAAE,EAAA5H,EAAG+H,EAAO,EACjC,CACA,MAAMC,EAAaJ,EAAW,CAAC,EAC/B,GAAII,EAAY,CACdtJ,EAAI,KAAA,EACJA,EAAI,UAAA,EACJD,EAAYC,EAAKC,CAAK,EACtBD,EAAI,OAAOsJ,EAAW,EAAGA,EAAW,CAAC,EACrC,UAAWtB,KAASkB,EAClBlJ,EAAI,OAAOgI,EAAM,EAAGA,EAAM,CAAC,EAE7BhI,EAAI,UAAA,EACJA,EAAI,KAAA,EACJA,EAAI,QAAA,CACN,CACF,EACA,KAAM,CAACuH,EAAMC,EAAUC,EAAUxH,CAAK,CAAA,CACvC,EACM,MAGIsJ,GAAWnB,EAAM,KAAKa,GAAcpI,CAAS,EC9DpD2I,GAgBD,CAAC,CAAE,MAAA9D,EAAQ,SAAU,KAAA6B,EAAM,QAAAkC,EAAS,SAAAjC,EAAU,SAAAC,EAAU,MAAAxH,EAAO,YAAAoG,MAClED,EAAc,CACZ,MAAAV,EACA,YAAAW,EACA,OAAQ,CAAC,CAAE,IAAArG,EAAK,qBAAAO,EAAsB,qBAAAE,EAAsB,SAAAJ,KAAe,CACzE,MAAM6I,EAA8C,CAAA,EAEpD,UAAWlB,KAAST,EAAM,CACxB,MAAMjG,EAAIf,EAAqBF,EAAS2H,EAAM,EAAGR,CAAQ,CAAC,EACpDnG,EAAIZ,EAAqBJ,EAAS2H,EAAM,EAAGP,CAAQ,CAAC,EACtDnG,IAAM,MAAQD,IAAM,MAGxB6H,EAAW,KAAK,CAAE,EAAA5H,EAAG,EAAAD,CAAA,CAAG,CAC1B,CACA,MAAMqI,EAAQR,EAAW,GAAG,CAAC,EACvBS,EAAOT,EAAW,GAAG,EAAE,EAE7B,GAAI,CAACQ,GAAS,CAACC,EACb,OAEF,MAAMC,EAAcnJ,EAAqBJ,EAAS,EAAGoH,CAAQ,CAAC,EAC9D,GAAImC,IAAgB,KAIpB,CAAA5J,EAAI,KAAA,EACJA,EAAI,UAAA,EACJD,EAAYC,EAAKC,CAAK,EACtBD,EAAI,OAAO0J,EAAM,EAAGE,CAAW,EAC/B,UAAW5B,KAASkB,EAClBlJ,EAAI,OAAOgI,EAAM,EAAGA,EAAM,CAAC,EAK7B,GAHAhI,EAAI,OAAO2J,EAAK,EAAGC,CAAW,EAC9B5J,EAAI,UAAA,EACJA,EAAI,KAAA,EACAyJ,EAAS,CACXzJ,EAAI,UAAA,EACJA,EAAI,OAAO0J,EAAM,EAAGA,EAAM,CAAC,EAC3B,UAAW1B,KAASkB,EAClBlJ,EAAI,OAAOgI,EAAM,EAAGA,EAAM,CAAC,EAE7BhI,EAAI,OAAA,CACN,CACAA,EAAI,QAAA,EACN,EACA,KAAM,CAACuH,EAAMkC,EAASjC,EAAUC,EAAUxH,CAAK,CAAA,CAChD,EACM,MAGI4J,GAAgBzB,EAAM,KAAKoB,GAAmB3I,CAAS,EClE9DiJ,GAUD,CAAC,CACJ,MAAApE,EAAQ,SACR,QAAAjG,EACA,SAAAsK,EACA,UAAAC,EACA,UAAAC,EACA,WAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAAC,CACF,KACEjE,EAAc,CACZ,MAAAV,EACA,OAAQ,CAAC,CAAE,IAAA1F,EAAK,SAAAK,EAAU,SAAAT,EAAU,MAAAL,KAAY,CAC9C,MAAMI,EAAQC,EAASH,CAAO,EAC9B,GAAI,CAACE,GAAS,CAACA,EAAM,MAAQA,EAAM,SAAW,IAAK,OACnD,MAAM2K,EAAO3K,EAAM,KACb,EACJ2K,EAAK,WAAa,MACdA,EAAK,WAAW,EAAIA,EAAK,WAAW,OACpCA,EAAK,WAAW,EAEhBpK,EAAM,OAAO,kBAAoB,EACjCkJ,EAAK,EACLmB,GAAqBH,GAAY,GAAKlK,EACtCmJ,EACJiB,EAAK,WAAa,MAAQ,EAAIC,EAAoB,EAAIA,EAClDC,GAAgBL,GAAY,IAAMjK,EAGxCF,EAAI,KAAA,EACJA,EAAI,YAAc,OAClBD,EAAYC,EAAK,CACf,GAAGiK,CAAA,CACJ,EACDjK,EAAI,UAAA,EACJ,MAAMyK,EAAgB,MAAM,QAAQJ,CAAK,EACrCA,EACAA,EAAM,CAAE,GAAG1K,EAAO,KAAA2K,CAAA,EAAQ/K,CAAK,EAEnC,SAAW,CAAE,MAAAiB,CAAA,IAAWiK,EAAe,CACrC,MAAMnJ,EAAIjB,EAASG,EAAOf,EAAS,QAAQ,EACvC6B,IAAM,OAGVtB,EAAI,OAAOsB,EAAG8H,CAAE,EAChBpJ,EAAI,OAAOsB,EAAG+H,CAAE,EAClB,CAKA,GAJArJ,EAAI,OAAA,EACJA,EAAI,QAAA,EAGA+J,EAAU,CACZ/J,EAAI,KAAA,EACJD,EAAYC,EAAK,CACf,GAAGgK,CAAA,CACJ,EACDhK,EAAI,UAAA,EACJ,SAAW,CAAE,MAAAQ,CAAA,IAAWiK,EAAe,CACrC,MAAMnJ,EAAIjB,EAASG,EAAOf,EAAS,QAAQ,EACvC6B,IAAM,OAGVtB,EAAI,OAAOsB,EAAG/B,EAAM,kBAAkB,CAAC,EACvCS,EAAI,OAAOsB,EAAG/B,EAAM,kBAAkB,EAAIA,EAAM,kBAAkB,MAAM,EAC1E,CACAS,EAAI,OAAA,EACJA,EAAI,QAAA,CACN,CAGAA,EAAI,KAAA,EAEJD,EAAYC,EAAK,CACf,aAAcsK,EAAK,WAAa,MAAQ,SAAW,MACnD,UAAW,SACX,GAAGL,EACH,GAAGC,EAEH,KAAMQ,GAAQR,GAAY,MAAQD,GAAW,IAAI,CAAA,CAClD,EACD,SAAW,CAAE,MAAAzJ,EAAO,MAAAmK,CAAA,IAAWF,EAAe,CAC5C,MAAMnJ,EAAIjB,EAASG,EAAOf,EAAS,QAAQ,EAC3C,GAAI6B,IAAM,KACR,SAEF,MAAMsJ,EAAaD,EAAM,MAAM;AAAA,CAAI,EACnC,QAASE,EAAI,EAAGA,EAAID,EAAW,OAAQC,IACrC7K,EAAI,SAAS4K,EAAWC,CAAC,EAAGvJ,EAAG+H,EAAKnJ,EAAM,EAAI2K,EAAIL,CAAY,CAElE,CACAxK,EAAI,QAAA,CACN,EACA,KAAM,CAACqK,EAAO5K,EAASwK,EAAWC,EAAYH,EAAUC,CAAS,CAAA,CAClE,EACM,MAGIc,GAAS1C,EAAM,KAAK0B,GAAYjJ,CAAS,EAEhDkK,GAUD,CAAC,CACJ,MAAArF,EAAQ,SACR,QAAAjG,EACA,SAAAsK,EACA,UAAAC,EACA,UAAAC,EACA,WAAAC,EACA,SAAAC,EACA,SAAAC,EACA,MAAAC,CACF,KACEjE,EAAc,CACZ,MAAAV,EACA,OAAQ,CAAC,CAAE,IAAA1F,EAAK,SAAAK,EAAU,SAAAT,EAAU,MAAAL,KAAY,CAC9C,MAAMI,EAAQC,EAASH,CAAO,EAC9B,GAAI,CAACE,GAAS,CAACA,EAAM,MAAQA,EAAM,SAAW,IAAK,OACnD,MAAM2K,EAAO3K,EAAM,KACb2B,EACJgJ,EAAK,WAAa,OACdA,EAAK,WAAW,EAAIA,EAAK,WAAW,MACpCA,EAAK,WAAW,EAEhB1B,EAAKtH,EACLiJ,EAAoBH,GAAY,EAChCvB,EACJyB,EAAK,WAAa,OACdhJ,EAAIiJ,EACJjJ,EAAIiJ,EACJC,EAAeL,GAAY,GAE3BM,EAAgB,MAAM,QAAQJ,CAAK,EACrCA,EACAA,EAAM,CAAE,GAAG1K,EAAO,KAAA2K,CAAA,EAAQ/K,CAAK,EAGnCS,EAAI,KAAA,EACJA,EAAI,YAAc,OAClBD,EAAYC,EAAK,CAAE,GAAGiK,EAAW,EACjCjK,EAAI,UAAA,EAEJ,SAAW,CAAE,MAAAQ,CAAA,IAAWiK,EAAe,CACrC,MAAMpJ,EAAIhB,EAASG,EAAOf,EAAS,QAAQ,EACvC4B,IAAM,OAGVrB,EAAI,OAAO4I,EAAIvH,CAAC,EAChBrB,EAAI,OAAO6I,EAAIxH,CAAC,EAClB,CAIA,GAHArB,EAAI,OAAA,EACJA,EAAI,QAAA,EAED+J,EAAU,CAEX/J,EAAI,KAAA,EACJD,EAAYC,EAAK,CACf,GAAGgK,CAAA,CACJ,EACDhK,EAAI,UAAA,EACJ,SAAW,CAAE,MAAAQ,CAAA,IAAWiK,EAAe,CACrC,MAAMpJ,EAAIhB,EAASG,EAAOf,EAAS,QAAQ,EACvC4B,IAAM,OAGVrB,EAAI,OAAOT,EAAM,kBAAkB,EAAG8B,CAAC,EACvCrB,EAAI,OAAOT,EAAM,kBAAkB,EAAIA,EAAM,kBAAkB,MAAO8B,CAAC,EACzE,CACArB,EAAI,OAAA,EACJA,EAAI,QAAA,CACN,CAGAA,EAAI,KAAA,EACJD,EAAYC,EAAK,CACf,aAAc,SACd,UAAWsK,EAAK,WAAa,OAAS,QAAU,OAChD,GAAGL,EACH,GAAGC,EAEH,KAAMQ,GAAQR,GAAY,MAAQD,GAAW,IAAI,CAAA,CAClD,EACD,SAAW,CAAE,MAAAzJ,EAAO,MAAAmK,CAAA,IAAWF,EAAe,CAC5C,MAAMpJ,EAAIhB,EAASG,EAAOf,EAAS,QAAQ,EAC3C,GAAI4B,IAAM,KACR,SAEF,MAAMuJ,EAAaD,EAAM,MAAM;AAAA,CAAI,EACnC,QAASE,EAAI,EAAGA,EAAID,EAAW,OAAQC,IACrC7K,EAAI,SAAS,IAAI4K,EAAWC,CAAC,CAAC,IAAKhC,EAAIxH,EAAIwJ,EAAIL,CAAY,CAE/D,CACAxK,EAAI,QAAA,CACN,EACA,KAAM,CAACqK,EAAO5K,EAASwK,EAAWC,EAAYH,EAAUC,CAAS,CAAA,CAClE,EACM,MAGIgB,GAAS5C,EAAM,KAAK2C,GAAYlK,CAAS,EAEhD6J,GAAWO,GAA6B,CAC5C,GAAIA,EACF,GAAI,CACF,OAAOA,EAAK,QAAQ,UAAW,CAACC,EAAGlG,IAC1B,GAAG,SAASA,CAAI,EAAI,OAAO,kBAAoB,CAAC,IACxD,CACH,MAAQ,CAER,CAEF,OAAOiG,CACT,EC9NaE,EAAsB,IAAS,CAC1C,MAAM/I,EAGA,CAAA,EACN,MAAO,CACL,iBAAkB,CAChBgJ,EACAC,KAEAjJ,EAAU,KAAK,CACb,QAAAgJ,EACA,SAAAC,CAAA,CACD,EACM,IAAM,CACX,MAAMC,EAAQlJ,EAAU,UAAWmJ,GAAMA,EAAE,WAAaF,CAAQ,EAC5DC,IAAU,IACZlJ,EAAU,OAAOkJ,EAAO,CAAC,CAE7B,GAEF,cAAe,CAACF,EAAiBI,IAAe,CAC9C,UAAWnJ,KAAYD,EACjBC,EAAS,UAAY+I,GACvB/I,EAAS,SAAS+I,EAASI,CAAO,CAGxC,CAAA,CAEJ,EAIaC,EAAkB,CAC7B,SAAUN,EAAA,EACV,MAAOA,EAAA,EACP,YAAaA,EAAA,EACb,KAAMA,EAAA,EACN,UAAWA,EAAA,EACX,QAASA,EAAA,EACT,WAAYA,EAAA,EACZ,gBAAiBA,EAAA,EACjB,cAAeA,EAAA,EACf,UAAWA,EAAA,CACb,EAEaO,EAA8B,CAGzCC,EACAP,EACAC,IAIG,CACH,MAAMO,EAAcxD,EAAM,OAAOiD,CAAQ,EACzCO,EAAY,QAAUP,EAEtBjD,EAAM,UAAU,IACSqD,EAAgBE,CAAS,EAAE,iBAChDP,EACA,CAACA,EAASI,IAAY,CACpBI,EAAY,QAAQJ,EAASJ,CAAO,CACtC,CAAA,EAGD,CAACA,EAASO,EAAWC,CAAW,CAAC,CACtC,EAEaC,GAAwBzD,EAAM,cAAsB,EAAE,EAEtD0D,GAAuB,CAClCH,EACAN,IAIG,CACH,MAAMU,EAAiB3D,EAAM,WAAWyD,EAAqB,EAE7D,OAAOH,EAA4BC,EAAWI,EAAgBV,CAAQ,CACxE,ECvFaW,GAA0B,CACrCC,EACA7K,EACA7B,EACA2M,IAGe,CACf,GAAI,CAAC9K,EAAM,OACX,MAAM+K,EACJD,GAAM,aAAe3M,EAAM,OAAO,KAAMoH,GAAMA,EAAE,SAAW,GAAG,GAAG,GAC7DyF,EACJF,GAAM,aAAe3M,EAAM,OAAO,KAAMoH,GAAMA,EAAE,SAAW,GAAG,GAAG,GAE7D0F,EAAOJ,EAAM,QAAU7K,EAAK,KAC5BE,EAA8B6K,GAC/B,IAAM,CACP,MAAM3L,EAAQG,EACZpB,EACA8M,EACAF,EACA,KAAA,EAEF,MAAO,CACL,QAASA,EACT,MAAA3L,EACA,WAAY0L,GAAM,gBAAgB1L,CAAK,GAAK,IAAA,CAEhD,KACE,KAEE8L,EAAOL,EAAM,QAAU7K,EAAK,IAC5BC,EAA8B+K,GAC/B,IAAM,CACP,MAAM5L,EAAQG,EACZpB,EACA+M,EACAF,EACA,KAAA,EAEF,MAAO,CACL,QAASA,EACT,MAAA5L,EACA,WAAY0L,GAAM,gBAAgB1L,CAAK,GAAK,IAAA,CAEhD,KACE,KAEJ,MAAO,CAAE,oBAAqB,CAAE,EAAAc,EAAG,EAAAD,CAAA,EAAK,KAAAgL,EAAM,KAAAC,CAAA,CAChD,EAEMC,GACJL,GAEO,CAAC1L,EAAO8J,KACFA,IAAS,IAAM4B,GAAM,cAAgBA,GAAM,iBAC1C1L,CAAK,GAAK,KAIpBgM,GACJN,GAEO,CAACO,EAAYnC,KACPA,IAAS,IAAM4B,GAAM,gBAAkBA,GAAM,mBAC5CO,CAAU,GAAK,KAIlBC,EAA4C,CACvDC,EACApN,EACA2M,IACiD,CACjD,KAAM,CAAE,EAAA5K,EAAG,EAAAD,CAAA,EAAMsL,EAEXC,EAAiB,CACrBtC,EACAuC,IACkB,CAClB,GAAI,CAACA,EAAQ,OAAO,KACpB,MAAMC,EAAaxC,IAAS,IAAM4B,GAAM,YAAcA,GAAM,YACtDa,EACJzC,IAAS,IAAM4B,GAAM,gBAAkBA,GAAM,gBAG/C,GACEW,EAAO,aAAe,MACtBE,GACAD,GACAvN,EAAM,OAAO,KAAMoH,GAAMA,EAAE,KAAOmG,CAAU,EAC5C,CACA,MAAME,EAAaD,EAAeF,EAAO,UAAU,EACnD,GAAI,EAAAG,IAAe,MAAQ,CAAC,OAAO,SAASA,CAAU,UAE1CtM,EAAQnB,EAAOyN,EAAYF,CAAU,EAGxCzM,EAASd,EAAOyN,EAAYF,EAAY,KAAK,EAF7C,IAIX,CAGA,OAAIvN,EAAM,OAAO,KAAMoH,GAAMA,EAAE,KAAOkG,EAAO,OAAO,GAC7CnM,EAAQnB,EAAOsN,EAAO,MAAOA,EAAO,OAAO,EAGzCxM,EAASd,EAAOsN,EAAO,MAAOA,EAAO,QAAS,KAAK,EAGrD,IACT,EAEMR,EAAOO,EAAe,IAAKtL,CAAC,EAC5BgL,EAAOM,EAAe,IAAKvL,CAAC,EAElC,MAAO,CACL,KAAAgL,EACA,KAAAC,EACA,OAAQ,OAAO,YACb/M,EAAM,OAAO,QAASI,GAAU,CAC9B,MAAMiB,EAAMjB,EAAM,SAAW,IAAM2M,EAAOD,EAC1C,OAAIzL,IAAQ,KACH,CAAA,EAGF,CAAC,CAACjB,EAAM,GAAIgB,EAASpB,EAAOqB,EAAKjB,EAAM,GAAI,KAAK,CAAE,CAAC,CAC5D,CAAC,CAAA,EAEH,YAAa2B,GAAG,YAAc,KAC9B,YAAaD,GAAG,YAAc,KAC9B,aAAckL,GAAiBL,CAAI,EACnC,eAAgBM,GAAmBN,CAAI,CAAA,CAE3C,EAEae,GACXf,IAKO,CACL,aAAcK,GAAiBL,CAAI,EACnC,eAAgBM,GAAmBN,CAAI,CAAA,GAI9BgB,GAAkC,CAC7CC,EACAC,EACA7N,IAKU,CACV,MAAM8N,EAAUhN,EACdd,EACA6N,EAAe,KACfA,EAAe,QACf,KAAA,EAEIE,EAAQjN,EACZd,EACA6N,EAAe,GACfA,EAAe,QACf,KAAA,EAEF,GAAIC,IAAY,MAAQC,IAAU,KAChC,OAAO,KAET,MAAMC,EAAiChO,EAAM,OAAO,QACjDI,GAAkC,CACjC,GAAIA,EAAM,SAAWwN,EACnB,MAAO,CAAA,EAET,MAAMK,EAAO7M,EAASpB,EAAO8N,EAAS1N,EAAM,GAAI,KAAK,EAC/C8N,EAAK9M,EAASpB,EAAO+N,EAAO3N,EAAM,GAAI,KAAK,EACjD,OAAI6N,IAAS,MAAQC,IAAO,KACnB,CAAA,EAEF,CACL,CACE,QAAS9N,EAAM,GACf,KAAA6N,EACA,GAAAC,CAAA,CACF,CAEJ,CAAA,EAEF,MAAO,CACL,QAAAJ,EACA,MAAAC,EACA,OAAAC,CAAA,CAEJ,EC3JaG,GAA8D,CAAC,CAC1E,GAAAC,EACA,QAAAC,EACA,WAAAC,EACA,YAAAC,EACA,YAAAC,EACA,UAAAC,EACA,kBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,UAAAC,EACA,MAAAnO,EACA,KAAAiM,EACA,cAAAmC,EACA,SAAAnL,CACF,IAAM,CACJ,MAAM6I,EAAiBuC,EAAAA,MAAA,EAEvB,OAAA5C,EAA4B,WAAYK,EAAiBE,GAAU,CACjE4B,IAAa5B,CAAK,CACpB,CAAC,EACDP,EAA4B,QAASK,EAAiBE,GAAU,CAC9D2B,IAAU3B,CAAK,CACjB,CAAC,EACDP,EAA4B,OAAQK,EAAiBE,GAAU,CAC7D6B,IAAc7B,CAAK,CACrB,CAAC,EACDP,EAA4B,YAAaK,EAAiBE,GAAU,CAClE8B,IAAc9B,CAAK,CACrB,CAAC,EACDP,EAA4B,UAAWK,EAAiBE,GAAU,CAChE+B,IAAY/B,CAAK,CACnB,CAAC,EACDP,EAA4B,kBAAmBK,EAAiBE,GAAU,CACxEgC,IAAoBhC,CAAK,CAC3B,CAAC,EACDP,EAA4B,aAAcK,EAAiBE,GAAU,CACnEiC,IAAejC,CAAK,CACtB,CAAC,EACDP,EAA4B,cAAeK,EAAiBE,GAAU,CACpEkC,IAAgBlC,CAAK,CACvB,CAAC,EAGCnI,EAAAA,KAAC+H,GAAsB,SAAtB,CAA+B,MAAOE,EACrC,SAAA,CAAAhI,EAAAA,IAACwK,GAAA,CACC,GAAAZ,EACA,UAAAS,EACA,MAAAnO,EACA,KAAAiM,EAEC,SAAAmC,CAAA,CAAA,EAEFnL,CAAA,EACH,CAEJ,EAEMqL,GAMD,CAAC,CAAE,GAAAZ,EAAI,UAAAS,EAAW,MAAAnO,EAAO,KAAAiM,EAAM,SAAAhJ,KAAe,CACjD,MAAMsL,EAAsBnL,EAAAA,OAAuB,IAAI,EAEjD9D,EAAQ8H,KAAgB,MAExBjD,EAAWf,EAAAA,OAAO9D,CAAK,EAC7B6E,EAAS,QAAU7E,EAEnB,MAAMwM,EAAiBlG,EAAAA,WAAWgG,EAAqB,EAEjD4C,EAAcvC,GAAM,KAAOH,EAE3B2C,EAAiBrL,EAAAA,OAGb,IAAI,EAERsL,EAAyBtL,EAAAA,OAA+B,IAAI,EAC5DuL,EAAuBvL,EAAAA,OAA8B,IAAI,EAEzDwL,EAAU,IAAM,CACpB,MAAMC,EAAON,EAAoB,SAAS,cAC1C,GAAKM,EAGL,IAAIA,EAAK,QAAQ,cAAgB,OAC/B,MAAM,IAAI,MACR,+DAAA,EAGJ,OAAOA,EAAK,sBAAA,EACd,EAEMC,EAAsB,CAC1B9C,EAIA+C,IAUG,CACH,MAAMC,EAAYjD,GAChBC,EACA4C,EAAA,EACAzK,EAAS,QACT8H,CAAA,EAEE+C,GACFD,EACEC,EAAU,oBACV,CAAE,KAAMA,EAAU,KAAM,KAAMA,EAAU,IAAA,EACxC,CACE,QAAShD,EAAM,QACf,OAAQA,EAAM,OACd,SAAUA,EAAM,SAChB,QAASA,EAAM,OAAA,CACjB,CAGN,EAEMiD,EAAyB7L,EAAAA,OAAO0L,CAAmB,EACzD,OAAAG,EAAuB,QAAUH,EAEjC5I,EAAAA,UAAU,IAAM,CACd,MAAMgJ,EAAmBlD,GAAsB,CAC7C,MAAMmD,EAA0BT,EAAuB,QACvDD,EAAe,QAAU,KACzBC,EAAuB,QAAU,KAC7BS,GACF3D,EAAgB,WAAW,cAAcM,EAAgB,CACvD,GAAGqD,EACH,UAAW,EAAA,CACZ,EAEH3D,EAAgB,gBAAgB,cAAcM,EAAgB,CAC5D,MAAO3H,EAAS,QAChB,KAAM,CACJ,QAAS6H,EAAM,QACf,OAAQA,EAAM,OACd,SAAUA,EAAM,SAChB,QAASA,EAAM,OAAA,CACjB,CACD,CACH,EAEMoD,EAAepD,GAAyB,CAC5C,MAAMqD,EAAU,CACd,QAASrD,EAAM,QACf,OAAQA,EAAM,OACd,SAAUA,EAAM,SAChB,QAASA,EAAM,OAAA,EAGXsD,EAAWX,EAAqB,QACtC,GACEW,GACA,OAAO,QAAQD,CAAO,EAAE,KACtB,CAAC,CAACtO,EAAKR,CAAK,IACV+O,EAAS,KAAKvO,CAA2B,IAAMR,CAAA,EAEnD,CACA,MAAMgP,EAAe,CAAE,GAAGD,EAAU,KAAMD,CAAA,EAC1CV,EAAqB,QAAUY,EAC/B/D,EAAgB,UAAU,cAAcgD,EAAae,CAAY,CACnE,CAEA,MAAMC,EAAWd,EAAuB,QACxC,GACEc,GACA,OAAO,QAAQH,CAAO,EAAE,KACtB,CAAC,CAACtO,EAAKR,CAAK,IACViP,EAAS,KAAKzO,CAA2B,IAAMR,CAAA,EAEnD,CAEAyL,EAAM,gBAAA,EACNA,EAAM,eAAA,EACN,MAAMyD,EAAe,CAAE,GAAGD,EAAU,KAAMH,CAAA,EAC1CX,EAAuB,QAAUe,EACjCjE,EAAgB,WAAW,cAAcM,EAAgB2D,CAAY,CACvE,CACF,EAEMC,EAA6B1D,GAAsB,CACvDiD,EAAuB,QACrBjD,EACA,CAACgD,EAAW,CAAE,KAAA5C,EAAM,KAAAC,CAAA,EAAQsD,IAAS,CACnC,MAAMC,EAAcnB,EAAe,QAEnC,GADI,CAACmB,GACD,CAACZ,EAAU,GAAK,CAACA,EAAU,EAAG,OAElC,MAAM1P,EAAQ6E,EAAS,QACjB0L,EAAYD,EAAY,UAAU,MAClCE,GAAU1D,EACV2D,GAAYH,EAAY,UAAU,MAClCI,GAAU3D,EACV4D,EAAStQ,EAASL,EAAO0P,EAAU,EAAE,OAAO,EAClD,GAAI,CAACiB,EAAQ,OACb,MAAMC,GAASvQ,EAASL,EAAO0P,EAAU,EAAE,OAAO,EAClD,GAAI,CAACkB,GAAQ,OACbzB,EAAe,QAAU,CACvB,UAAW,CAAE,MAAOoB,EAAW,IAAKC,EAAA,EACpC,UAAW,CAAE,MAAOC,GAAW,IAAKC,EAAA,CAAQ,EAG9C,IAAIG,EAA8C,kBAClD,MAAMC,GAAK,KAAK,IAAIL,GAAYC,EAAO,EACjCK,GAAK,KAAK,IAAIR,EAAYC,EAAO,EAEnCM,GAAK,IAAMC,GAAK,GAClBF,EAAO,kBACEC,GAAK,IAAMC,GAAK,GACzBF,EAAO,MACEC,GAAKC,GACdF,EAAO,IAEPA,EAAO,IAGT,MAAMG,GAAa5P,EACjBpB,EACAgB,EAAqB6D,EAAS,QAAS0L,EAAW,KAAK,EACvDI,EAAO,GACP,KAAA,EAEF,GAAIK,KAAe,KAAM,OAEzB,MAAMC,GAAW7P,EACfpB,EACAgB,EAAqB6D,EAAS,QAAS2L,GAAS,KAAK,EACrDG,EAAO,GACP,KAAA,EAEF,GAAIM,KAAa,KAAM,OAEvB,MAAMC,GAAa9P,EACjBpB,EACAkB,EAAqB2D,EAAS,QAAS4L,GAAW,KAAK,EACvDG,GAAO,GACP,KAAA,EAEF,GAAIM,KAAe,KAAM,OAEzB,MAAMC,GAAW/P,EACfpB,EACAkB,EAAqB2D,EAAS,QAAS6L,GAAS,KAAK,EACrDE,GAAO,GACP,KAAA,EAEF,GAAIO,KAAa,KAAM,OAEvB,MAAMC,GAAezD,GACnB,IACA,CAAE,QAASgD,EAAO,GAAI,KAAMK,GAAY,GAAIC,EAAA,EAC5CpM,EAAS,OAAA,EAELwM,GAAe1D,GACnB,IACA,CAAE,QAASiD,GAAO,GAAI,KAAMM,GAAY,GAAIC,EAAA,EAC5CtM,EAAS,OAAA,EAGLyM,GAAUF,IAAc,OACxBG,GAAUF,IAAc,OAExBG,GAAmC,CACvC,KAAAX,EACA,MAAOhM,EAAS,QAChB,UAAW,GACX,EAAG,CACD,IAAKuM,GACD,CACE,KAAMA,GAAa,QACnB,GAAIA,GAAa,KAAA,EAEnB,OACJ,OAAQE,IAAW,CAAA,CAAC,EAEtB,EAAG,CACD,IAAKD,GACD,CACE,KAAMA,GAAa,QACnB,GAAIA,GAAa,KAAA,EAEnB,OACJ,OAAQE,IAAW,CAAA,CAAC,EAEtB,KAAAlB,EACA,GAAG3C,GAAsBf,CAAI,CAAA,EAE/ByC,EAAuB,QAAUoC,GAEjCtF,EAAgB,WAAW,cACzBM,EACAgF,EAAA,CAEJ,CAAA,CAEJ,EAEMC,EAAsB/E,GAAsB,CAChDiD,EAAuB,QAAQjD,EAAO,CAACgD,EAAW/D,EAAG0E,IAAS,CAC5D,MAAMqB,EAAUvE,EACduC,EACA7K,EAAS,QACT8H,CAAA,EAEF,GAAI,CAAC+E,EAAS,OAEd,GADyB,OAAO,OAAOrB,CAAI,EAAE,KAAMpL,GAAMA,CAAC,EACpC,CACpByH,EAAM,eAAA,EACN,MAAMiF,EACJ,KAAK,IAAIjF,EAAM,MAAM,EAAI,KAAK,IAAIA,EAAM,MAAM,EAC1CA,EAAM,OACNA,EAAM,OACZR,EAAgB,cAAc,cAAcM,EAAgB,CAC1D,QAAAkF,EACA,MAAO7M,EAAS,QAChB,KAAAwL,EACA,OAAQ3D,EAAM,OACd,OAAQA,EAAM,OACd,SAAAiF,CAAA,CACD,CACH,CACF,CAAC,CACH,EAEA,SAAS,iBAAiB,UAAW/B,CAAe,EACpD,SAAS,iBAAiB,UAAWE,CAAW,EAChD,SAAS,iBAAiB,QAASA,CAAW,EAC9C,SAAS,iBAAiB,YAAaM,CAAyB,EAChE,MAAMwB,EAA0B3C,EAAoB,QACpD,OAAA2C,GAAyB,iBAAiB,QAASH,EAAoB,CACrE,QAAS,EAAA,CACV,EACM,IAAM,CACX,SAAS,oBAAoB,UAAW7B,CAAe,EACvD,SAAS,oBAAoB,UAAWE,CAAW,EACnD,SAAS,oBAAoB,QAASA,CAAW,EACjD,SAAS,oBAAoB,YAAaM,CAAyB,EACnEwB,GAAyB,oBAAoB,QAASH,CAAkB,CAC1E,CACF,EAAG,CAAC5M,EAAU2H,EAAgB0C,EAAaS,CAAsB,CAAC,EAIlExD,EAA4B,YAAa+C,EAAcxC,GAAU,CAC/D,MAAMgD,EAAYhD,EAAM,UACpBS,EACET,EAAM,UACN7H,EAAS,QACT8H,CAAA,EAEF,KACJ0C,EAAqB,QAAU3C,EAE/BR,EAAgB,KAAK,cAAcM,EAAgB,CACjD,MAAO3H,EAAS,QAChB,QAAS6K,GAAa,KACtB,KAAMhD,EAAM,KACZ,OAAQA,EAAM,uBAAyBF,EAAiB,MAAQ,MAAA,CACjE,CACH,CAAC,EAGChI,EAAAA,IAAC,MAAA,CACC,IAAKyK,EACL,GAAAb,EACA,UAAAS,EACA,MAAO,CACL,SAAU,WACV,KAAM7O,EAAM,aAAa,EACzB,IAAKA,EAAM,aAAa,EACxB,MAAOA,EAAM,aAAa,MAC1B,OAAQA,EAAM,aAAa,OAC3B,OAAQ,GACR,GAAGU,CAAA,EAEL,YAAcmR,GAAM,CAClBA,EAAE,eAAA,CACJ,EACA,QAAUnF,GAAU,CAClB8C,EAAoB9C,EAAO,CAACgD,EAAW/D,EAAG0E,IAAS,CACjD,MAAMqB,EAAUvE,EACduC,EACA7K,EAAS,QACT8H,CAAA,EAEG+E,GACLxF,EAAgB,MAAM,cAAcM,EAAgB,CAClD,QAAAkF,EACA,MAAO7M,EAAS,QAChB,KAAAwL,CAAA,CACD,CACH,CAAC,CACH,EACA,aAAe3D,GAAU,CACvB8C,EAAoB9C,EAAO,CAACf,EAAGmG,EAAIzB,IAAS,CAC1CnE,EAAgB,UAAU,cAAcgD,EAAa,CACnD,UAAW,KACX,KAAAmB,EACA,qBAAsB7D,CAAA,CACvB,CACH,CAAC,CACH,EACA,YAAcE,GAAU,CACtB8C,EAAoB9C,EAAO,CAACgD,EAAW/D,EAAG0E,IAAS,CACjDnE,EAAgB,UAAU,cAAcgD,EAAa,CACnD,UAAAQ,EACA,KAAAW,EACA,qBAAsB7D,CAAA,CACvB,CACH,CAAC,CACH,EACA,YAAcE,GAAU,CACtB8C,EAAoB9C,EAAO,CAACgD,EAAW,CAAE,KAAA5C,EAAM,KAAAC,CAAA,EAAQsD,IAAS,CAC9D,MAAMqB,EAAUvE,EACduC,EACA7K,EAAS,QACT8H,CAAA,EAEG+E,IACLxF,EAAgB,UAAU,cAAcM,EAAgB,CACtD,QAAAkF,EACA,MAAO7M,EAAS,QAChB,KAAAwL,CAAA,CACD,EACDlB,EAAe,QAAU,CACvB,UAAW,CAAE,MAAOrC,EAAM,IAAKA,CAAA,EAC/B,UAAW,CAAE,MAAOC,EAAM,IAAKA,CAAA,CAAK,EAExC,CAAC,CACH,EACA,UAAYL,GAAU,CACpB8C,EAAoB9C,EAAO,CAACgD,EAAW/D,EAAG0E,IAAS,CACjD,MAAMqB,EAAUvE,EACduC,EACA7K,EAAS,QACT8H,CAAA,EAEG+E,GACLxF,EAAgB,QAAQ,cAAcM,EAAgB,CACpD,MAAO3H,EAAS,QAChB,QAAA6M,EACA,KAAArB,CAAA,CACD,CACH,CAAC,CACH,EACA,cAAgB3D,GAAU,CACxBA,EAAM,eAAA,EACN8C,EAAoB9C,EAAO,CAACgD,EAAW/D,EAAG0E,IAAS,CACjD,MAAMqB,EAAUvE,EACduC,EACA7K,EAAS,QACT8H,CAAA,EAEG+E,GACLxF,EAAgB,YAAY,cAAcM,EAAgB,CACxD,MAAO3H,EAAS,QAChB,QAAA6M,EACA,KAAArB,CAAA,CACD,CACH,CAAC,CACH,EACA,cAAgB3D,GAAU,CACxBA,EAAM,eAAA,EACN8C,EAAoB9C,EAAO,CAACgD,EAAW/D,EAAG0E,IAAS,CACjD,MAAMqB,EAAUvE,EACduC,EACA7K,EAAS,QACT8H,CAAA,EAEG+E,GACLxF,EAAgB,SAAS,cAAcM,EAAgB,CACrD,MAAO3H,EAAS,QAChB,QAAA6M,EACA,KAAArB,CAAA,CACD,CACH,CAAC,CACH,EAEC,SAAA1M,CAAA,CAAA,CAGP,ECphBaoO,GAQR,CAAC,CAAE,KAAA/J,EAAM,cAAAgK,EAAe,SAAA/J,KAAe,CAC1C,KAAM,CAACgK,EAAWC,CAAY,EAAI/N,EAAAA,SAA2B,IAAI,EAEjEoI,GAAqB,OAASG,GAAU,CAEtCwF,EADgBxF,CACI,CACtB,CAAC,EAED,MAAMyF,EAAe/N,EAAAA,QAAQ,IAA2B,CACtD,GAAI,CAAC6N,EACH,OAAO,KAGT,KAAM,CAAE,MAAAjS,EAAO,QAAA0R,CAAA,EAAYO,EAErBG,EAAaV,GAAS,OAAOzJ,CAAQ,EAK3C,GAJImK,IAAe,QAIf,CADW/R,EAASL,EAAOiI,CAAQ,EAErC,OAAO,KAET,MAAMe,EAAiC,CAAA,EACvC,IAAIjH,EAAIqQ,EACR,UAAWC,KAAUrK,EAAM,CACzB,IAAIsK,EAAmC,KACnCC,EAAkB,IACtB,SAAW,CAACxG,EAAOtD,CAAK,IAAK4J,EAAO,OAAO,UAAW,CACpD,GACE,CAAClR,EAAQnB,EAAOyI,EAAM,EAAGR,CAAQ,GACjC,CAAC9G,EAAQnB,EAAOyI,EAAM,EAAG4J,EAAO,QAAQ,EAExC,SAEF,MAAMG,EAAW,KAAK,IAAI/J,EAAM,EAAI2J,CAAU,EAC1CI,EAAWD,IACbA,EAAkBC,EAClBF,EAAoBvG,EAExB,CACA,MAAM0G,EAAeJ,EAAO,OAAOC,GAAqB,EAAE,EACpDrS,EAAaW,GAAgBZ,EAAOuS,EAAiBtK,EAAU,KAAK,EAC1E,GACE,CAACwK,GACDxS,IAAe,MACfA,EAAa,GACb,CACA+I,EAAO,KAAK,CAAE,SAAUqJ,EAAO,SAAU,EAAG,KAAM,EAClD,QACF,CACAtQ,EAAI0Q,EAAa,EACjBzJ,EAAO,KAAK,CACV,SAAUqJ,EAAO,SACjB,EAAGI,EAAa,CAAA,CACjB,CACH,CACA,MAAO,CACL,MAAAzS,EACA,EAAA+B,EACA,OAAAiH,CAAA,CAEJ,EAAG,CAAChB,EAAMiK,EAAWhK,CAAQ,CAAC,EAE9B,OAAO+J,EAAcG,CAAY,CACnC,ECnFaO,GAKR,CAAC,CAAE,WAAAC,EAAY,eAAAC,EAAgB,WAAAC,EAAY,eAAAC,KAAqB,CACnE,KAAM,CAACb,EAAWC,CAAY,EAAI/N,EAAAA,SAA2B,IAAI,EAOjE,GALAoI,GAAqB,OAASG,GAAU,CAEtCwF,EADgBxF,CACI,CACtB,CAAC,EAEG,CAACuF,EACH,OAAO,KAGT,KAAM,CAAE,MAAAjS,EAAO,QAAA0R,CAAA,EAAYO,EACrBnF,EAAO4E,GAAS,MAAQ,KACxB3E,EAAO2E,GAAS,MAAQ,KAExBqB,EAAWjG,EAAO9L,EAAqBhB,EAAO8M,EAAM,KAAK,EAAI,EAE7DkG,EAAWjG,EAAO7L,EAAqBlB,EAAO+M,EAAM,KAAK,EAAI,EAEnE,OACExI,EAAAA,KAAA0O,WAAA,CACE,SAAA,CAAAzO,EAAAA,IAAC,MAAA,CACC,YAAW,CAAC,CAACkN,EACb,UAAWkB,IAAiBX,CAAS,EACrC,MAAO,CACL,SAAU,WACV,KAAM,EACN,WAAYnF,IAAS,KAAO,SAAW,UACvC,IAAK9M,EAAM,aAAa,EACxB,OAAQA,EAAM,aAAa,OAC3B,YAAa,MACb,gBAAiB,MACjB,gBAAiB,QACjB,cAAe,OACf,QAAS0R,EAAU,EAAI,EACvB,UAAW,cAAcqB,CAAQ,MACjC,GAAGJ,IAAaV,CAAS,CAAA,CAC3B,CAAA,EAEFzN,EAAAA,IAAC,MAAA,CACC,UAAWsO,IAAiBb,CAAS,EACrC,YAAW,CAAC,CAACP,EACb,MAAO,CACL,SAAU,WACV,WAAY3E,IAAS,KAAO,SAAW,UACvC,IAAK,EACL,OAAQ,EACR,UAAW,gBACX,KAAM/M,EAAM,aAAa,EACzB,MAAOA,EAAM,aAAa,MAC1B,cAAe,OACf,QAAS0R,EAAU,EAAI,EACvB,UAAW,cAAcsB,CAAQ,MACjC,GAAGH,IAAaZ,CAAS,CAAA,CAC3B,CAAA,CACF,EACF,CAEJ,EChEaiB,GAGR,CAAC,CAAE,cAAAC,EAAe,UAAAC,KAAgB,CACrC,KAAM,CAACC,EAAWC,CAAc,EAAInP,EAAAA,SAAiC,IAAI,EAEzEoI,GAAqB,aAAeG,GAAU,CAC5C4G,EACE5G,EAAM,OAAS,mBAAqBA,EAAM,UAAY,KAAOA,CAAA,CAEjE,CAAC,EAED,MAAM6G,EAAanP,EAAAA,QAAQ,IAAM,CAC/B,GAAI,CAACiP,GAAaA,EAAU,OAAS,kBACnC,OAAO,KAET,MAAMG,EACJH,EAAU,OAAS,IAAM,KAAYA,EAAU,EAAE,KAAK,MAAQ,KAC1DI,EACJJ,EAAU,OAAS,IAAM,IAAWA,EAAU,EAAE,KAAK,IAAM,IACvDK,EACJL,EAAU,OAAS,IAAM,KAAYA,EAAU,EAAE,KAAK,MAAQ,KAC1DM,EACJN,EAAU,OAAS,IAAM,IAAWA,EAAU,EAAE,KAAK,IAAM,IAEvDO,EAAe5S,EAAqBqS,EAAU,MAAOG,EAAO,KAAK,EACjEK,EAAa7S,EAAqBqS,EAAU,MAAOI,EAAK,KAAK,EAC7DK,EAAe5S,EAAqBmS,EAAU,MAAOK,EAAO,KAAK,EACjEK,EAAa7S,EAAqBmS,EAAU,MAAOM,EAAK,KAAK,EAE7DK,EAAS,KAAK,IAAIJ,EAAcC,CAAU,EAC1CI,EAAQ,KAAK,IAAIH,EAAcC,CAAU,EACzCG,EAAU,KAAK,IAAIL,EAAaD,CAAY,EAC5CO,EAAW,KAAK,IAAIJ,EAAaD,CAAY,EAEnD,MAAO,CAAE,OAAAE,EAAQ,MAAAC,EAAO,QAAAC,EAAS,SAAAC,CAAA,CACnC,EAAG,CAACd,CAAS,CAAC,EAEd,OACE7O,EAAAA,IAAC,MAAA,CACC,UAAW6O,EAAYF,IAAgBE,CAAS,EAAI,OACpD,MAAO,CACL,SAAU,WACV,WAAYA,EAAY,UAAY,SACpC,KAAM,GAAGE,GAAY,QAAU,CAAC,KAChC,IAAK,GAAGA,GAAY,OAAS,CAAC,KAC9B,MAAO,GAAGA,GAAY,SAAW,CAAC,KAClC,OAAQ,GAAGA,GAAY,UAAY,CAAC,KACpC,cAAe,OACf,GAAIF,EAAYD,IAAYC,CAAS,EAAI,MAAA,CAC3C,CAAA,CAGN,ECvDae,GAIT,CAAC,CAAE,MAAA1T,EAAO,SAAAiD,EAAU,QAAAzD,EAAS,GAAG0D,KAAW,CAC7C,MAAMmH,EAAOjD,GAAA,EAAgB,SAAS5H,CAAO,GAAG,KAEhD,OAAK6K,EAKHvG,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,gBAAiB,YACjB,KAAMuG,EAAK,QAAQ,EACnB,IAAKA,EAAK,QAAQ,EAClB,OAAQA,EAAK,QAAQ,OACrB,MAAOA,EAAK,QAAQ,MACpB,GAAGrK,CAAA,EAEJ,GAAGkD,EAEH,SAAAD,CAAA,CAAA,EAhBI,IAmBX,ECzBa0Q,GAAwB,GACxBC,GAAwB,GACxBC,GAAmB,MACnBC,GAAiB,QCGjBC,GAAkB,CAAC,CAC9B,MAAAtU,EACA,UAAAuU,EACA,qBAAAC,CACF,EAII,KACK,CAACvU,EAAOJ,IAAU,CACvB,KAAM,CAAE,IAAK4U,EAAU,IAAKC,GAAazU,EACnC0K,EAAQ,CAAA,EACRnK,EAAM,OAAO,kBAAoB,EACjCmU,GACH3U,IACEC,EAAM,SAAW,IACdiU,GACAC,KAA0B3T,EAC5BoU,EAAmBhV,GACvBC,EACA8U,EACA1U,EAAM,GACN,QAAA,EAGF,GAAI2U,IAAqB,KACvB,MAAO,CAAA,EAMT,MAAMC,GAFJL,GAAwBM,IAEiB,KACxCxV,GAAMA,EAAIsV,CAAA,EAGb,GAAIC,IAAS,QAAaA,GAAQ,EAChC,MAAO,CAAA,EAGT,IAAIE,EAAON,EACX,GAAI,KAAK,IAAIM,EAAOF,CAAI,EAAI,OAAO,QAAS,CAC1C,MAAMG,GAAWH,EAAQE,EAAOF,GAASA,EACzCE,GAAQC,CACV,CACA,KAAOD,GAAQL,GAAU,CACvB,GAAI/J,EAAM,QAAU,IAClB,MAAO,CAAA,EAETA,EAAM,KAAKoK,CAAI,EACfA,GAAQF,CACV,CAEA,OAAQN,GAAaU,IAAgCtK,CAAK,CAC5D,EAGWsK,GAAkDtK,GAAU,CACvE,MAAMuK,EAAO,KAAK,IAAI,EAAG,KAAK,KAAK,CAAC,KAAK,MAAMvK,EAAM,CAAC,EAAIA,EAAM,CAAC,CAAC,CAAC,CAAC,EACpE,OAAOA,EAAM,IAAKwK,IAAU,CAAE,MAAOA,EAAM,MAAOA,EAAK,QAAQD,CAAI,CAAA,EAAI,CACzE,EAEMJ,GAAgD,CAAA,EACtD,QAASnV,EAAI,IAAKA,GAAK,GAAIA,IACzBmV,GAAoC,KAAK,EAAI,IAAMnV,CAAC,EACpDmV,GAAoC,KAAK,EAAI,IAAMnV,CAAC,EACpDmV,GAAoC,KAAK,EAAI,IAAMnV,CAAC,EAKtD,MAAMyV,GAAc,EACdC,GAAS,IAAOD,GAChBE,GAAS,GAAKD,GACdE,EAAO,GAAKD,GACZE,EAAM,GAAKD,EACXE,GAAQ,GAAKD,EACbE,GAAO,IAAMF,EAabG,GAAyB,CAE7B,CAAC,EAAG,cAAc,EAClB,CAAC,EAAG,cAAc,EAClB,CAAC,EAAG,cAAc,EAClB,CAAC,GAAI,cAAc,EACnB,CAAC,GAAI,cAAc,EACnB,CAAC,GAAI,cAAc,EACnB,CAAC,IAAK,cAAc,EACpB,CAAC,IAAK,cAAc,EACpB,CAAC,IAAK,cAAc,EAEpB,CAAC,EAAG,SAAS,EACb,CAAC,EAAG,SAAS,EACb,CAAC,GAAI,SAAS,EACd,CAAC,GAAI,SAAS,EACd,CAAC,GAAI,SAAS,EAEd,CAAC,EAAG,SAAS,EACb,CAAC,EAAG,SAAS,EACb,CAAC,GAAI,SAAS,EACd,CAAC,GAAI,SAAS,EACd,CAAC,GAAI,SAAS,EAEd,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,GAAI,OAAO,EAEZ,CAAC,EAAG,MAAM,EACV,CAAC,EAAG,MAAM,EACV,CAAC,EAAG,MAAM,EACV,CAAC,EAAG,MAAM,EACV,CAAC,GAAI,MAAM,EACX,CAAC,GAAI,MAAM,EAEX,CAAC,EAAG,QAAQ,EACZ,CAAC,EAAG,QAAQ,EACZ,CAAC,EAAG,QAAQ,EACZ,CAAC,EAAG,QAAQ,EACZ,CAAC,EAAG,QAAQ,EAEZ,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,EAAG,OAAO,EACX,CAAC,GAAI,OAAO,EACZ,CAAC,GAAI,OAAO,EACZ,CAAC,GAAI,OAAO,EACZ,CAAC,IAAK,OAAO,CACf,EAEMC,GAA0BC,GAA+B,CAC7D,KAAM,CAAC/U,EAAOgV,CAAI,EAAID,EACtB,OAAQC,EAAA,CACN,IAAK,eACH,OAAOhV,EACT,IAAK,UACH,OAAOA,EAAQuU,GACjB,IAAK,UACH,OAAOvU,EAAQwU,GACjB,IAAK,QACH,OAAOxU,EAAQyU,EACjB,IAAK,OACH,OAAOzU,EAAQ0U,EACjB,IAAK,SACH,OAAO1U,EAAQ2U,GACjB,IAAK,QACH,OAAO3U,EAAQ4U,EAAA,CAErB,EAEMK,GAAqB,CAACC,EAAqBC,IAA8B,CAC7E,MAAMvV,EAAS,IAAI,KAAKsV,CAAI,EAC5B,OAAAtV,EAAO,mBAAmBA,EAAO,mBAAA,EAAuBuV,CAAiB,EAClEvV,EAAO,QAAA,CAChB,EAEMwV,GAAgB,CAACF,EAAqBG,IAAyB,CACnE,MAAMzV,EAAS,IAAI,KAAKsV,CAAI,EAC5B,OAAAtV,EAAO,cAAcA,EAAO,cAAA,EAAkByV,CAAY,EACnDzV,EAAO,QAAA,CAChB,EAEM0V,GAAgB,CAACJ,EAAqBK,IAAyB,CACnE,MAAM3V,EAAS,IAAI,KAAKsV,CAAI,EAC5B,OAAAtV,EAAO,cAAcA,EAAO,cAAA,EAAkB2V,CAAY,EACnD3V,EAAO,QAAA,CAChB,EAEM4V,GAAc,CAACN,EAAqBO,IAAuB,CAC/D,MAAM7V,EAAS,IAAI,KAAKsV,CAAI,EAC5B,OAAAtV,EAAO,YAAYA,EAAO,YAAA,EAAgB6V,CAAU,EAC7C7V,EAAO,QAAA,CAChB,EAEM8V,GAAa,CAACR,EAAqBS,IAAsB,CAC7D,MAAM/V,EAAS,IAAI,KAAKsV,CAAI,EAC5B,OAAAtV,EAAO,WAAWA,EAAO,WAAA,EAAe+V,CAAS,EAC1C/V,EAAO,QAAA,CAChB,EAEMgW,GAAe,CAACV,EAAqBW,IAAwB,CACjE,MAAMjW,EAAS,IAAI,KAAKsV,CAAI,EAC5B,OAAAtV,EAAO,YAAYA,EAAO,YAAA,EAAgBiW,CAAW,EAC9CjW,EAAO,QAAA,CAChB,EAEMkW,EAAS,CAACZ,EAAqBa,IAA4B,CAC/D,KAAM,CAACC,EAAYC,CAAS,EAAIF,EAChC,OAAQE,EAAA,CACN,IAAK,eACH,OAAOhB,GAAmBC,EAAMc,CAAU,EAC5C,IAAK,UACH,OAAOZ,GAAcF,EAAMc,CAAU,EACvC,IAAK,UACH,OAAOV,GAAcJ,EAAMc,CAAU,EACvC,IAAK,QACH,OAAOR,GAAYN,EAAMc,CAAU,EACrC,IAAK,OACH,OAAON,GAAWR,EAAMc,CAAU,EACpC,IAAK,SACH,OAAOJ,GAAaV,EAAMc,CAAU,EACtC,IAAK,QACH,OAAOJ,GAAaV,EAAMc,EAAa,EAAE,CAAA,CAE/C,EAEME,OAAkB,IAExB,SAASC,EAAuBC,EAAuBC,EAAkB,CACvE,IAAIC,EAAMJ,GAAY,IAAIG,CAAQ,EAC7BC,IACHA,EAAM,IAAI,KAAK,eAAe,QAAS,CACrC,SAAAD,EACA,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,UAAW,KAAA,CACZ,EACDH,GAAY,IAAIG,EAAUC,CAAG,GAE/B,MAAMpB,EAAO,IAAI,KAAKkB,CAAM,EACtBG,EAAQD,EAAI,cAAcpB,CAAI,EAC9BsB,EAAOC,GACX,SAASF,EAAM,KAAMvO,GAAMA,EAAE,OAASyO,CAAI,EAAG,MAAO,EAAE,EASxD,OARmB,KAAK,IACtBD,EAAI,MAAM,EACVA,EAAI,OAAO,EAAI,EACfA,EAAI,KAAK,EACTA,EAAI,MAAM,EACVA,EAAI,QAAQ,EACZA,EAAI,QAAQ,CAAA,EAEOtB,EAAK,QAAA,IAAc,KAAU,IACpD,CAEA,MAAMwB,GAAgB,CACpBC,EACA5C,EACAsC,EAAmB,QACR,CACX,KAAM,CAACO,EAAWC,CAAQ,EAAI9C,EAC9B,IAAInU,EAAS,IAAI,KAAK+W,CAAO,EAC7B,MAAMG,EAAoB,IAAM,CAC9BlX,EAAO,YAAY,CAACuW,EAAuBvW,EAAQyW,CAAQ,EAAG,EAAG,EAAG,CAAC,CACvE,EACA,OAAQQ,EAAA,CACN,IAAK,eACHjX,EAAO,mBACL,KAAK,KAAKA,EAAO,mBAAA,EAAuBgX,CAAS,EAAIA,CAAA,EAEvD,MACF,IAAK,UACHhX,EAAO,cACL,KAAK,KAAKA,EAAO,cAAA,EAAkBgX,CAAS,EAAIA,EAChD,CAAA,EAEF,MACF,IAAK,UACHhX,EAAO,cACL,KAAK,KAAMA,EAAO,QAAA,EAAY6U,EAAQD,GAASoC,CAAS,EAAIA,EAC5D,EACA,CAAA,EAEF,MACF,IAAK,QAAS,CACZ,MAAMG,EAAcZ,EAAuBvW,EAAQyW,CAAQ,EAmB3D,IAjBAzW,EAAO,YACL,KAAK,MACDA,EAAO,QAAA,EAAYmX,EAActC,GAAQC,EAAOD,EAAOmC,CAAA,EAE3DA,EACAG,EACA,EACA,EACA,CAAA,EAIEnX,EAAO,UAAY+W,GAAWjC,GAChC9U,EAAO,WAAWA,EAAO,WAAA,EAAe,CAAC,EAIpCA,EAAO,QAAA,EAAY+W,GACxB/W,EAAS,IAAI,KAAKkW,EAAOlW,EAAQ,CAACgX,EAAW,OAAO,CAAC,CAAC,EAExD,KACF,CACA,IAAK,OAAQ,CAGX,IAFAE,EAAA,EACAlX,EAAO,WAAW,CAAC,EACZA,EAAO,QAAA,EAAY+W,GACxB/W,EAAS,IAAI,KAAKkW,EAAOlW,EAAQ,CAACgX,EAAWC,CAAQ,CAAC,CAAC,EAEzD,KACF,CACA,IAAK,SACL,IAAK,QACCA,IAAa,SACfjX,EAAO,WAAW,CAAC,EACViX,IAAa,SACtBjX,EAAO,YAAY,EAAG,CAAC,EAEzBkX,EAAA,EACIlX,EAAO,QAAA,EAAY+W,IACrB/W,EAAS,IAAI,KAAKkW,EAAOlW,EAAQ,CAAC,EAAGiX,CAAQ,CAAC,CAAC,GAEjD,KAAA,CAEJ,OAAOjX,EAAO,QAAA,CAChB,EAEaoX,GAAgB,CAAC,CAC5B,SAAAX,EAAW/C,GACX,MAAApU,EAAQkU,GACR,UAAAK,EACA,OAAAwD,EACA,aAAAC,CACF,EAMI,KACK,CAAC/X,EAAOJ,IAAU,CACvB,KAAM,CAAE,IAAK4U,EAAU,IAAKC,GAAazU,EACzC,GAAI,CAAC,OAAO,SAASwU,CAAQ,GAAK,CAAC,OAAO,SAASC,CAAQ,EACzD,MAAO,CAAA,EAET,MAAMuD,EAAc,KAAK,MAAMpY,EAAM,aAAa,MAAQG,CAAK,EAAI,EAE7DkY,GADQxD,EAAWD,GACKwD,EACxB,CAACP,EAAWC,CAAQ,EAAIhC,GAAW,KACtCrW,GAAMsW,GAAuBtW,CAAC,GAAK4Y,CAAA,GACjC,CAAC,EAAG,cAAc,EAEvB,GAAI,CAACR,GAAa,CAACC,EACjB,MAAO,CAAA,EAGT,MAAMQ,EAAYX,GAAc/C,EAAU,CAACiD,EAAWC,CAAQ,EAAGR,CAAQ,EACnEiB,EAAkBnB,EAAuBkB,EAAWhB,CAAQ,EAI5DkB,EAAmB,CAACF,CAAS,EAK7BG,EACJX,IAAa,QACT,IAAI,KAAK,eAAe,QAAS,CACjC,SAAAR,EACA,KAAM,UACN,UAAW,KAAA,CACZ,EACC,KAEN,IAAIoB,EACJ,QAASC,EAAa,GAAKA,IAAc,CACvC,GAAIA,EAAa,IACf,MAAO,CAAA,EAET,OAAQb,EAAA,CACN,IAAK,eACL,IAAK,UACL,IAAK,UAAW,CACdY,EAAY3B,EAAOuB,EAAW,CAACK,EAAad,EAAWC,CAAQ,CAAC,EAChE,KACF,CACA,IAAK,QAAS,CAIZ,MAAMtS,EAAOgT,EAAOA,EAAO,OAAS,CAAC,EAC/BI,EAASf,EAAYnC,EAAO,IAClCgD,EAAY7D,EAAW,EACvB,QAASgE,EAAI,EAAGA,GAAKhB,EAAY,EAAGgB,IAAK,CACvC,MAAMC,EAAI/B,EAAOvR,EAAM,CAACqT,EAAG,OAAO,CAAC,EACnC,GAAIC,EAAItT,EAAOoT,EAAQ,SAOvB,GANkB,SAChBH,EACG,cAAc,IAAI,KAAKK,CAAC,CAAC,EACzB,KAAM7P,GAAMA,EAAE,OAAS,MAAM,EAAG,MACnC,EAAA,EAEc4O,IAAc,EAAG,CAC/Ba,EAAYI,EACZ,KACF,CACF,CACA,KACF,CACA,IAAK,OAAQ,CACX,MAAMC,EAAYhC,EAAOuB,EAAW,CAClCK,EAAad,EACbC,CAAA,CACD,EACDY,EAAY3B,EAAOgC,EAAW,CAC5BR,EAAkBnB,EAAuB2B,EAAWzB,CAAQ,EAC5D,OAAA,CACD,EACD,KACF,CACA,IAAK,SACL,IAAK,QAAS,CACZ,MAAMyB,EAAYhC,EAChBA,EAAOA,EAAOuB,EAAW,CAACC,EAAiB,OAAO,CAAC,EAAG,CACpDI,EAAad,EACbC,CAAA,CACD,EACD,CAAC,CAACS,EAAiB,OAAO,CAAA,EAE5BG,EAAY3B,EAAOgC,EAAW,CAC5BR,EAAkBnB,EAAuB2B,EAAWzB,CAAQ,EAC5D,OAAA,CACD,EACD,KACF,CAAA,CAEF,GAAIoB,EAAY7D,EACd,MAEE2D,EAAOA,EAAO,OAAS,CAAC,IAAME,GAChCF,EAAO,KAAKE,CAAS,CAEzB,CAEA,OACEhE,GACAsE,GAAmB,CACjB,OAAAd,EACA,aAAAC,EACA,SAAAb,CAAA,CACD,GACDkB,CAAM,CACV,EAGIS,EAA4B,CAChCxZ,EACAC,EACAgY,IAGEjY,EAAE,KAAMiZ,GAAcA,EAAU,OAAShB,CAAI,GAAG,QAChDhY,EAAE,KAAMgZ,GAAcA,EAAU,OAAShB,CAAI,GAAG,MAUvCsB,GAAqB,CAAC,CACjC,SAAA1B,EAAW/C,GACX,OAAA2D,EAAS1D,GACT,aAAA2D,EAAe,EACjB,IAA8C,CAC5C,MAAMzD,EAAY,IAAI,KAAK,eAAewD,EAAQ,CAChD,KAAM,UACN,IAAK,UACL,MAAO,QACP,KAAM,UACN,UAAW,MACX,OAAQ,UACR,OAAQ,UACR,uBAAwB,EACxB,aAAc,QACd,SAAAZ,CAAA,CACD,EACD,OAAQxM,GAAU,CAChB,MAAMoO,EAAUpO,EAAM,CAAC,EAAIA,EAAM,CAAC,EAC5BqO,EAAYD,EAAUnD,GAAuB,CAAC,EAAG,MAAM,CAAC,EACxDqD,EAAcF,EAAUnD,GAAuB,CAAC,EAAG,SAAS,CAAC,EAC7DsD,EAAmBH,EAAUnD,GAAuB,CAAC,EAAG,SAAS,CAAC,EAExE,OAAOjL,EACJ,IAAK7J,IACG,CAAE,MAAAA,EAAO,MAAOyT,EAAU,cAAc,IAAI,KAAKzT,CAAK,CAAC,CAAA,EAC/D,EACA,IAAI,CAACiU,EAAMnJ,EAAOnM,IAAQ,CACzB,MAAM4F,EAAO5F,EAAImM,EAAQ,CAAC,EACpBuN,EACJvN,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,MAAM,EACpD+T,EACJxN,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,KAAK,EACnDgU,EACJzN,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,OAAO,EACrDiU,EACJ1N,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,MAAM,EACpDkU,EACJ3N,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,cAAc,EAC5DmU,EACJ5N,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,QAAQ,EACtDoU,EACJ7N,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,QAAQ,EACtDqU,EACJ9N,IAAU,GACVkN,EAA0B/D,EAAK,MAAO1P,EAAK,MAAO,kBAAkB,EAEhEsU,EAAuC,CAAA,EAC7C,GACEX,IACCM,GACCE,GACAD,GACAE,GACAC,GACF,CACA,MAAMhB,EAAI3D,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,MAAM,GAAG,MAC/Csa,EAAI7E,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,QAAQ,GAAG,MACjDua,EAAK9E,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,cAAc,GAAG,MAC9D,IAAIwa,EAAc,GAClB,GAAIb,EAAa,CACf,MAAMhS,EAAI8N,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,QAAQ,GAAG,MACjDya,EAAKhF,EAAK,MAAM,KACnBzV,GAAMA,EAAE,OAAS,kBAAA,GACjB,MACHwa,EAAc,IAAI7S,CAAC,IAAMiS,EAAmB,IAAIa,CAAE,GAAK,GACzD,CACAJ,EAAa,KACX,GAAGjB,CAAC,IAAIkB,CAAC,GAAGE,CAAW,IACtB9B,GAAgBuB,EAAkB,IAAIM,CAAE,GAAK,GAAA,CAElD,CACA,GAAIT,GAAUC,EAAU,CACtB,IAAIW,EAAU,GACd,GAAIjC,EAAO,WAAW,IAAI,GAAKA,EAAO,WAAW,IAAI,EAAG,CACtD,MAAMkC,EAAalF,EAAK,MAAM,UAAWzV,GAAMA,EAAE,OAAS,OAAO,EACjE0a,GAAWjF,EAAK,MAAMkF,CAAU,GAAG,OAAS,GAC5CD,GAAYjF,EAAK,MAAMkF,EAAa,CAAC,GAAG,OAAS,GACjD,MAAMC,EAAWnF,EAAK,MAAM,UAAWzV,GAAMA,EAAE,OAAS,KAAK,EACzD4a,GAAY,GAAKd,IACnBY,GAAWjF,EAAK,MAAMmF,CAAQ,GAAG,OAAS,GAC1CF,GAAYjF,EAAK,MAAMmF,EAAW,CAAC,GAAG,OAAS,GAEnD,MACEF,GAAWjF,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,OAAO,GAAG,OAAS,GAC5D8Z,IACFY,GAAW,KAAOjF,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,KAAK,GAAG,OAAS,KAGzEqa,EAAa,KAAKK,CAAO,CAC3B,CACA,OAAIb,GACFQ,EAAa,KAAK5E,EAAK,MAAM,KAAMzV,GAAMA,EAAE,OAAS,MAAM,GAAG,KAAK,EAG7D,CACL,MAAOyV,EAAK,MACZ,MAAO4E,EAAa,OAAQra,GAAMA,CAAC,EAAE,KAAK;AAAA,CAAI,CAAA,CAElD,CAAC,CACL,CACF","x_google_ignoreList":[3]}