{"version":3,"file":"index.umd.cjs","names":[],"sources":["../src/sketch-ruler/cornerImg64.ts","../../../node_modules/.pnpm/react@19.2.6/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.6/node_modules/react/jsx-runtime.js","../src/sketch-ruler/RulerLine.tsx","../src/sketch-ruler/RulerWrapper.tsx","../src/hooks/useCanvasTransform.ts","../src/hooks/useInputManager.ts","../src/sketch-ruler/index.tsx","../src/minimap/index.tsx","../src/hooks/useRulerScale.ts","../src/hooks/useGuideLines.ts","../src/hooks/useSketchRuler.ts","../src/hooks/useSnapDetection.ts","../src/plugins/index.ts"],"sourcesContent":["const eye64 = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAopJREFUOE/FlE9IVEEcx7+/N9ouds1Mu0QUSFZYdIgoUqQoKPBQHsKozpXE7jbTO/U8xLJvn6usBHWQ6hBFXupSkQeVbh0KJEPp0sH+eLGTsKs77xcj78m0ax0E8cHjzZv5zef3/c33xxA24KENYGJzoEEQbNNaN4Zh2OQ4znwYhr9c1/39vwrXVDo0NNS0tLR0GYB5D64BmAMwzMyvlFKz1es10Hw+f4mZ7wHYBeA9gNdENFepVOaEEM3M3OI4Thczn41gt6WUgQ3+C+r7/h0AWQD3mXnYqPA8L9nQ0HCemduIaFpKOWoAhUJhT6VSuQXgOjP3K6W8GLwKzeVyp4jonR0QBEErM48w8zFLyayUsjX+z+VyHhHdZebTSqkxM78CHRgYOKS1/ghgVErZY214RkQ7ADyRUj72ff8qgCtmXUrZGcf5vv8CwEUhxOF0Ov1pBRpla5dSdseBhUJhpznH6tIsZb1KqacW+BGArUaUXX63UuplHJTNZjuEEONSyhozfd/n6mQ1RkXZL2itz7mu+80EDA4ONi8vL/8AcM2UbikyR2BU9cSmmTU70YqKIAj2hWFo2uenlHK/BRg3Y2aeNO5GyU8S0ZbFxcUuz/NKEXAGQKPjOCcymcyX1dIi8DSAiWQyeaavr68cbSgCuBknYubnQoj+TCYzUywWE6VS6S2ADsdx2gxw1X3L7SNENMbMnwE8qK+vf5NKpRaMaeVyeW8ikfiaSqW+R7BuZr5BRMe11p2u607U9Gk8kc/ntzPzQwCmExYATDLzVBiGE0KIowAOADDf3QA+aK2VDaxRajto3K+rq+tl5nYAzQBamHmeiOYBTGmtR6ph/1Rqg9c73pz7dD1qN0TpHyNQRCUDJXrAAAAAAElFTkSuQmCC`\n\nconst closeEye64 = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAjtJREFUOE/NlD9oFEEUxn9v9ghC0hpRUogIAUmniGAT/5Q2FrETPSNRJILg7RwimI0ox85eQFCEBGIUO1PYpFM0jSConQoBEZGgGPsgl+w+2eM2bC57SopAFqYZ3v7m+977ZoQt+GQLmGxPaBiGgYiMWWvXBHZUGoZhH3BERPYC+4F+4Keq/urt7b1RLpf/ZEBVHa9Wq0HWyg3QKIoGVPU8cA7wgK/pUtXPQJ8xZk+pVBpuNBqXUoUiEvi+P56fzTpo6+SbwHNg1lo7WzTITGEKXFlZeeB53tVCpa3CK8AFa+1cBgvD8LKIXAQOJkkyICJDeYVBEJS6u7s/qeoLa+1o+l9TqXNuBLhmjDlbqVQ+5ICjInIfOBPH8W9jzGCR5YmJiRNxHM+papgqzqDvgSlr7VTernPuO3An3c9bBt74vv+yrdaKyLDv+/1Sq9UGPc97nY9EVuycU2AQOA7cAm4Dr4D5TvVxHB9rKo2iaEFVp621Ln96FEUngaOqGmSxabVqsh3a2h+x1h5qQjNrae/yE4+iaCwDJkky73neTuBZe129Xk+H+BS4l7ZqLVIZ2BhzuFKpvMsDVXXWGPMxFdAedOfcKeCRqj7MYrUhpz09PfXl5eXrectFWXXODQHpOq2qd/95o/JXr6ura3J1dXU6SZIfwKKIHAD2tVYMPBGRx77vN10UXtO85fTkmZmZHUtLSzUR2QXsBhaAL6r6DXhbrVYXi1yss59GqOgub/bN3Z7v6X/tb9Zmp/q/kN8s+lJb8oEAAAAASUVORK5CYII=`\n\nexport { eye64, closeEye64 }\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n  var key = null;\n  void 0 !== maybeKey && (key = \"\" + maybeKey);\n  void 0 !== config.key && (key = \"\" + config.key);\n  if (\"key\" in config) {\n    maybeKey = {};\n    for (var propName in config)\n      \"key\" !== propName && (maybeKey[propName] = config[propName]);\n  } else maybeKey = config;\n  config = maybeKey.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== config ? config : null,\n    props: maybeKey\n  };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React, { useState, useCallback, useMemo, memo, useRef } from 'react'\nimport { getTickConfig } from '@sketch-ruler/core'\nimport type { LineProps } from '../index-types'\n\nconst RulerLineComponent = ({\n  line,\n  scale,\n  offset,\n  palette,\n  vertical,\n  canvasWidth,\n  canvasHeight,\n  width = 0,\n  height = 0,\n  thick = 16,\n  lockLine = false,\n  deleteLabel = '放开删除',\n  isInScale = false,\n  onUpdate,\n  onDelete\n}: LineProps) => {\n  const [draggingPos, setDraggingPos] = useState<number | null>(null)\n  const lineRef = useRef(line)\n  lineRef.current = line\n\n  const pos = line.position * scale + offset\n\n  const style = useMemo(() => {\n    const cursor = line.locked || lockLine ? 'default' : vertical ? 'ew-resize' : 'ns-resize'\n    const pointerEvents: 'auto' | 'none' = line.locked || lockLine || isInScale ? 'none' : 'auto'\n    if (vertical) {\n      return {\n        left: `${pos}px`,\n        top: 0,\n        height: `${height}px`,\n        width: '1px',\n        borderLeft: `1px dashed ${palette.guideLineColor}`,\n        cursor,\n        pointerEvents\n      }\n    }\n    return {\n      top: `${pos}px`,\n      left: 0,\n      width: `${width}px`,\n      height: '1px',\n      borderBottom: `1px dashed ${palette.guideLineColor}`,\n      cursor,\n      pointerEvents\n    }\n  }, [pos, vertical, palette.guideLineColor, line.locked, lockLine, width, height, isInScale])\n\n  const labelText = useMemo(() => {\n    if (draggingPos !== null) {\n      const limit = vertical ? canvasWidth : canvasHeight\n      const isOutOfCanvas = draggingPos < 0 || draggingPos > limit\n      const screenPos = draggingPos * scale + offset\n      const isOverRuler = screenPos <= thick\n      if (isOutOfCanvas || isOverRuler) {\n        return deleteLabel\n      }\n    }\n    return String(Math.round(line.position))\n  }, [draggingPos, line.position, canvasWidth, canvasHeight, deleteLabel, vertical, scale, offset, thick])\n\n  const handleMouseDown = useCallback(\n    (e: React.MouseEvent) => {\n      if (lineRef.current.locked || lockLine) return\n      e.preventDefault()\n      e.stopPropagation()\n      setDraggingPos(lineRef.current.position)\n\n      const startMouse = vertical ? e.clientX : e.clientY\n      const startPos = lineRef.current.position\n      let shouldDelete = false\n\n      const onMove = (moveEvent: MouseEvent) => {\n        const currentMouse = vertical ? moveEvent.clientX : moveEvent.clientY\n        const delta = (currentMouse - startMouse) / scale\n        let newPos = startPos + delta\n\n        // 吸附到最近主刻度（基于当前缩放级别的刻度间隔，不依赖可见刻度数组）\n        const snapThreshold = 10 / scale\n        const interval = getTickConfig(scale).interval\n        const gridPos = Math.round(newPos / interval) * interval\n        const dist = Math.abs(newPos - gridPos)\n        if (dist < snapThreshold) {\n          newPos = gridPos\n        }\n\n        setDraggingPos(newPos)\n\n        // 越界检测：记录是否拖出画布外，等鼠标放开时再删除\n        const limit = vertical ? canvasWidth : canvasHeight\n        const isOutOfCanvas = newPos < 0 || newPos > limit\n        // 标尺区域检测：参考线被拖回到标尺区域（screenPos ≤ thick）也应删除\n        const screenPos = newPos * scale + offset\n        const isOverRuler = screenPos <= thick\n\n        shouldDelete = isOutOfCanvas || isOverRuler\n\n        // 始终更新位置，让线可以跟随鼠标移出画布\n        onUpdate?.(lineRef.current.id, Math.round(newPos))\n      }\n\n      const onUp = () => {\n        if (shouldDelete) {\n          onDelete?.(lineRef.current.id)\n        }\n        document.removeEventListener('mousemove', onMove)\n        document.removeEventListener('mouseup', onUp)\n        setDraggingPos(null)\n      }\n\n      document.addEventListener('mousemove', onMove)\n      document.addEventListener('mouseup', onUp)\n    },\n    [lockLine, vertical, scale, offset, width, height, thick, onUpdate, onDelete]\n  )\n\n  return (\n    <div className=\"line\" style={style} onMouseDown={handleMouseDown}>\n      {!line.locked && (\n        <span className=\"line-label\" style={{ color: palette.hoverColor }}>\n          {labelText}\n        </span>\n      )}\n    </div>\n  )\n}\n\nexport default memo(RulerLineComponent)\n","import React, { useState, useEffect, useMemo, useRef, memo, useCallback } from 'react'\nimport type { GuideLine } from '@sketch-ruler/core'\nimport { Canvas2DRenderer } from '@sketch-ruler/canvas'\nimport { computeScaleMarks, getTickConfig } from '@sketch-ruler/core'\nimport RulerLine from './RulerLine'\nimport type { RulerWrapperProps, FinalPaletteType } from '../index-types'\n\nconst RulerComponent = ({\n  vertical,\n  width,\n  height,\n  thick,\n  scale,\n  offset,\n  lines,\n  palette,\n  showReferLine,\n  shadowStart,\n  shadowLength,\n  canvasSize,\n  showMinorTicks,\n  canvasWidth = 1000,\n  canvasHeight = 1000,\n  deleteLabel = '放开删除',\n  lockLine = false,\n  onAddLine,\n  onUpdateLine,\n  onDeleteLine\n}: RulerWrapperProps) => {\n  const canvasRef = useRef<HTMLCanvasElement | null>(null)\n  const rendererRef = useRef<Canvas2DRenderer | null>(null)\n  const ratio = typeof window !== 'undefined' ? window.devicePixelRatio : 1\n\n  // 缩放期间临时禁用参考线交互，防止滚轮事件被参考线拦截导致页面缩放\n  const [isInScale, setIsInScale] = useState(false)\n  const scaleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n  useEffect(() => {\n    setIsInScale(true)\n    if (scaleTimerRef.current) {\n      clearTimeout(scaleTimerRef.current)\n    }\n    scaleTimerRef.current = setTimeout(() => {\n      setIsInScale(false)\n    }, 1000)\n    return () => {\n      if (scaleTimerRef.current) {\n        clearTimeout(scaleTimerRef.current)\n      }\n    }\n  }, [scale])\n\n  const containerClass = vertical ? 'v-container' : 'h-container'\n\n  const rulerStyle = useMemo(\n    () => ({\n      width: width + 'px',\n      height: height + 'px',\n      cursor: lockLine ? 'default' : vertical ? 'ew-resize' : 'ns-resize',\n      [vertical ? 'borderRight' : 'borderBottom']: `1px solid ${palette.borderColor}`\n    }),\n    [width, height, vertical, palette.borderColor, lockLine]\n  )\n\n  // === 刻度计算 ===\n  const canvasOffset = vertical ? offset.y : offset.x\n  const marks = useMemo(() => {\n    return computeScaleMarks({\n      scale,\n      offset: canvasOffset,\n      viewportSize: vertical ? height : width,\n      thick,\n      canvasSize: canvasSize ?? Infinity,\n      showMinorTicks: showMinorTicks ?? false\n    })\n  }, [scale, canvasOffset, vertical, height, width, thick, canvasSize, showMinorTicks])\n\n  // === Canvas 绘制 ===\n  useEffect(() => {\n    const canvas = canvasRef.current\n    if (!canvas) return\n    const ctx = canvas.getContext('2d')\n    if (!ctx) return\n\n    if (!rendererRef.current) {\n      rendererRef.current = new Canvas2DRenderer()\n    }\n\n    canvas.width = Math.round(width * ratio)\n    canvas.height = Math.round(height * ratio)\n\n    rendererRef.current.render(\n      ctx,\n      [\n        {\n          type: 'ruler',\n          marks,\n          vertical,\n          thick,\n          width,\n          height,\n          ratio,\n          palette,\n          shadowStart,\n          shadowLength,\n          showShadowText: true,\n          canvasSize\n        }\n      ],\n      { x: 0, y: 0, width, height }\n    )\n  }, [marks, vertical, thick, width, height, palette, shadowStart, shadowLength, canvasSize, ratio])\n\n  // === 吸附预览线 ===\n  const [isCreatingLine, setIsCreatingLine] = useState(false)\n  const [previewScreenPos, setPreviewScreenPos] = useState(0)\n  const [previewWorldPos, setPreviewWorldPos] = useState(0)\n\n  const previewStyle = useMemo(() => {\n    const pos = previewScreenPos\n    const border = `1px dashed ${palette.guideLineColor}`\n    if (vertical) {\n      return { left: `${pos}px`, top: 0, height: '100%', width: '1px', borderLeft: border }\n    }\n    return { top: `${pos}px`, left: 0, width: '100%', height: '1px', borderBottom: border }\n  }, [previewScreenPos, vertical, palette.guideLineColor])\n\n  const updatePreview = useCallback(\n    (e: MouseEvent) => {\n      const rect = canvasRef.current?.getBoundingClientRect()\n      if (!rect) return\n\n      const screenPos = vertical ? e.clientX - rect.left : e.clientY - rect.top\n      const offsetVal = vertical ? offset.x : offset.y\n      let worldPos = (screenPos - offsetVal) / scale\n\n      // 吸附检测：吸附到最近主刻度（基于当前缩放级别的刻度间隔，不依赖可见刻度数组）\n      const snapThreshold = 10 / scale\n      const interval = getTickConfig(scale).interval\n      const gridPos = Math.round(worldPos / interval) * interval\n      const dist = Math.abs(worldPos - gridPos)\n\n      if (dist < snapThreshold) {\n        worldPos = gridPos\n      }\n\n      setPreviewScreenPos(worldPos * scale + offsetVal)\n      setPreviewWorldPos(worldPos)\n    },\n    [vertical, offset, scale]\n  )\n\n  const previewWorldPosRef = useRef(previewWorldPos)\n  useEffect(() => {\n    previewWorldPosRef.current = previewWorldPos\n  }, [previewWorldPos])\n\n  const updatePreviewWithRef = useCallback(\n    (e: MouseEvent) => {\n      updatePreview(e)\n      // 立即同步 ref，避免 useEffect 延迟\n      const rect = canvasRef.current?.getBoundingClientRect()\n      if (!rect) return\n      const screenPos = vertical ? e.clientX - rect.left : e.clientY - rect.top\n      const offsetVal = vertical ? offset.x : offset.y\n      let worldPos = (screenPos - offsetVal) / scale\n      const snapThreshold = 10 / scale\n      const interval = getTickConfig(scale).interval\n      const gridPos = Math.round(worldPos / interval) * interval\n      const dist = Math.abs(worldPos - gridPos)\n      if (dist < snapThreshold) {\n        worldPos = gridPos\n      }\n      previewWorldPosRef.current = worldPos\n    },\n    [updatePreview, vertical, offset, scale]\n  )\n\n  const handlePointerDown = useCallback(\n    (e: React.MouseEvent<HTMLCanvasElement>) => {\n      if (lockLine) return\n      e.stopPropagation()\n      setIsCreatingLine(true)\n      updatePreviewWithRef(e.nativeEvent)\n\n      const onMove = (moveEvent: MouseEvent) => {\n        updatePreviewWithRef(moveEvent)\n      }\n\n      const onUp = () => {\n        document.removeEventListener('mousemove', onMove)\n        document.removeEventListener('mouseup', onUp)\n\n        const worldPos = previewWorldPosRef.current\n        const limit = vertical ? canvasWidth : canvasHeight\n        const offsetVal = vertical ? offset.x : offset.y\n        const screenPos = worldPos * scale + offsetVal\n        const isOverRuler = screenPos <= thick\n        if (worldPos >= 0 && worldPos <= limit && !isOverRuler) {\n          onAddLine?.({\n            orientation: vertical ? 'v' : 'h',\n            position: Math.round(worldPos),\n            visible: true,\n            locked: false\n          })\n        }\n\n        setIsCreatingLine(false)\n      }\n\n      document.addEventListener('mousemove', onMove)\n      document.addEventListener('mouseup', onUp)\n    },\n    [lockLine, vertical, canvasWidth, canvasHeight, onAddLine, updatePreviewWithRef, scale, offset, thick]\n  )\n\n  return (\n    <div className={containerClass}>\n      <canvas\n        ref={canvasRef}\n        className=\"ruler\"\n        style={rulerStyle}\n        onMouseDown={handlePointerDown}\n      />\n      {isCreatingLine && (\n        <div className=\"preview-line\" style={previewStyle}>\n          <span className=\"preview-label\" style={{ color: palette.hoverColor }}>\n            {Math.round(previewWorldPos)}\n          </span>\n        </div>\n      )}\n      {showReferLine && (\n        <div className=\"lines\">\n          {lines.map((line) => (\n            <RulerLine\n              key={line.id}\n              line={line}\n              scale={scale}\n              offset={vertical ? offset.x : offset.y}\n              palette={palette}\n              vertical={vertical}\n              canvasWidth={canvasWidth}\n              canvasHeight={canvasHeight}\n              width={width}\n              height={height}\n              thick={thick}\n              lockLine={lockLine}\n              deleteLabel={deleteLabel}\n              isInScale={isInScale}\n              onUpdate={onUpdateLine}\n              onDelete={onDeleteLine}\n            />\n          ))}\n        </div>\n      )}\n    </div>\n  )\n}\n\nexport default memo(RulerComponent)\n","import { useState, useEffect, useCallback } from 'react'\nimport {\n  TransformEngine,\n  fitRect,\n  type TransformState,\n  type TransformEngineOptions\n} from '@sketch-ruler/core'\n\nexport interface CanvasTransformOptions {\n  initialScale?: number\n  initialOffset?: { x: number; y: number }\n  minZoom?: number\n  maxZoom?: number\n  enableAnimation?: boolean\n  animationMode?: TransformEngineOptions['animationMode']\n  dampingRatio?: number\n  naturalFrequency?: number\n  timeConstant?: number\n  autoCenter?: boolean\n  canvasSize?: { width: number; height: number }\n  viewportSize?: { width: number; height: number }\n  paddingRatio?: number\n}\n\nexport interface UseCanvasTransformReturn {\n  scale: number\n  offset: { x: number; y: number }\n  engine: TransformEngine\n  setTransform: (t: Partial<TransformState>) => void\n  panBy: (dx: number, dy: number) => void\n  zoomBy: (dScale: number, originX: number, originY: number) => void\n  zoomTo: (scale: number, originX: number, originY: number) => void\n  toWorldPoint: (screenX: number, screenY: number) => { x: number; y: number }\n  toScreenPoint: (worldX: number, worldY: number) => { x: number; y: number }\n  reset: () => void\n}\n\nexport function useCanvasTransform(options: CanvasTransformOptions = {}): UseCanvasTransformReturn {\n  const {\n    initialScale = 1,\n    initialOffset = { x: 0, y: 0 },\n    minZoom = 0.1,\n    maxZoom = 10,\n    enableAnimation = false,\n    animationMode,\n    dampingRatio,\n    naturalFrequency,\n    timeConstant,\n    autoCenter = false,\n    canvasSize,\n    viewportSize,\n    paddingRatio = 0.2\n  } = options\n\n  let startScale = initialScale\n  let startOffset = { x: initialOffset.x, y: initialOffset.y }\n\n  if (autoCenter && canvasSize && viewportSize) {\n    const cw = Number(canvasSize.width)\n    const ch = Number(canvasSize.height)\n    const vw = Number(viewportSize.width)\n    const vh = Number(viewportSize.height)\n\n    if (cw > 0 && ch > 0 && vw > 0 && vh > 0) {\n      const fit = fitRect(\n        { x: 0, y: 0, width: cw, height: ch },\n        { x: 0, y: 0, width: vw, height: vh },\n        'contain',\n        paddingRatio\n      )\n      startScale = Number.isFinite(fit.scale) ? fit.scale : initialScale\n      startOffset = {\n        x: Number.isFinite(fit.x) ? fit.x : initialOffset.x,\n        y: Number.isFinite(fit.y) ? fit.y : initialOffset.y\n      }\n    }\n  }\n\n  const [scale, setScale] = useState(startScale)\n  const [offset, setOffset] = useState({ x: startOffset.x, y: startOffset.y })\n  const [engine, setEngine] = useState<TransformEngine | null>(null)\n\n  useEffect(() => {\n    const eng = new TransformEngine(\n      { x: startOffset.x, y: startOffset.y, scale: startScale },\n      {\n        minZoom,\n        maxZoom,\n        enableAnimation,\n        animationMode,\n        dampingRatio,\n        naturalFrequency,\n        timeConstant\n      }\n    )\n    setEngine(eng)\n    const unsubscribe = eng.onUpdate((state) => {\n      setScale(state.scale)\n      setOffset({ x: state.x, y: state.y })\n    })\n    return () => {\n      unsubscribe()\n      eng.destroy()\n      setEngine(null)\n    }\n  }, [\n    minZoom,\n    maxZoom,\n    enableAnimation,\n    animationMode,\n    dampingRatio,\n    naturalFrequency,\n    timeConstant\n  ])\n\n  // 当 viewportSize / canvasSize 变化时重新 autoCenter\n  useEffect(() => {\n    if (!engine || !autoCenter || !canvasSize || !viewportSize) return\n    const cw = Number(canvasSize.width)\n    const ch = Number(canvasSize.height)\n    const vw = Number(viewportSize.width)\n    const vh = Number(viewportSize.height)\n    if (cw > 0 && ch > 0 && vw > 0 && vh > 0) {\n      const fit = fitRect(\n        { x: 0, y: 0, width: cw, height: ch },\n        { x: 0, y: 0, width: vw, height: vh },\n        'contain',\n        paddingRatio\n      )\n      engine.setTransform({ scale: fit.scale, x: fit.x, y: fit.y })\n    }\n  }, [\n    engine,\n    autoCenter,\n    canvasSize?.width,\n    canvasSize?.height,\n    viewportSize?.width,\n    viewportSize?.height,\n    paddingRatio\n  ])\n\n  const setTransform = useCallback(\n    (t: Partial<TransformState>) => {\n      engine?.setTransform(t)\n    },\n    [engine]\n  )\n\n  const panBy = useCallback(\n    (dx: number, dy: number) => {\n      engine?.panBy(dx, dy)\n    },\n    [engine]\n  )\n\n  const zoomBy = useCallback(\n    (dScale: number, originX: number, originY: number) => {\n      engine?.zoomBy(dScale, originX, originY)\n    },\n    [engine]\n  )\n\n  const zoomTo = useCallback(\n    (targetScale: number, originX: number, originY: number) => {\n      engine?.zoomTo(targetScale, originX, originY)\n    },\n    [engine]\n  )\n\n  const toWorldPoint = useCallback(\n    (screenX: number, screenY: number) => {\n      return engine?.toWorldPoint(screenX, screenY) ?? { x: screenX, y: screenY }\n    },\n    [engine]\n  )\n\n  const toScreenPoint = useCallback(\n    (worldX: number, worldY: number) => {\n      return engine?.toScreenPoint(worldX, worldY) ?? { x: worldX, y: worldY }\n    },\n    [engine]\n  )\n\n  const reset = useCallback(() => {\n    engine?.setTransform({ scale: startScale, x: startOffset.x, y: startOffset.y })\n  }, [engine, startScale, startOffset])\n\n  if (!engine) {\n    return {\n      scale,\n      offset,\n      engine: null as any,\n      setTransform: () => {},\n      panBy: () => {},\n      zoomBy: () => {},\n      zoomTo: () => {},\n      toWorldPoint: (x: number, y: number) => ({ x, y }),\n      toScreenPoint: (x: number, y: number) => ({ x, y }),\n      reset: () => {}\n    }\n  }\n\n  return {\n    scale,\n    offset,\n    engine,\n    setTransform,\n    panBy,\n    zoomBy,\n    zoomTo,\n    toWorldPoint,\n    toScreenPoint,\n    reset\n  }\n}\n","import { useEffect, useState, useCallback } from 'react'\nimport { InputManager } from '@sketch-ruler/canvas'\nimport type { TransformEngine } from '@sketch-ruler/core'\nimport type { InputManagerOptions } from '@sketch-ruler/canvas'\n\nexport function useInputManager(\n  engine: TransformEngine | null,\n  containerRef: React.RefObject<HTMLElement | null>,\n  options?: InputManagerOptions\n) {\n  const [inputManager, setInputManager] = useState<InputManager | null>(null)\n\n  useEffect(() => {\n    if (!engine || !containerRef.current) return\n\n    const im = new InputManager(engine, options)\n    setInputManager(im)\n    im.bind(containerRef.current)\n\n    return () => {\n      im.destroy()\n      setInputManager(null)\n    }\n  }, [engine, containerRef.current])\n\n  useEffect(() => {\n    if (options?.zoomMode) {\n      inputManager?.setZoomMode(options.zoomMode)\n    }\n  }, [options?.zoomMode, inputManager])\n\n  const getCursorClass = useCallback(() => {\n    return inputManager?.getCursorClass() ?? 'default'\n  }, [inputManager])\n\n  return {\n    inputManager,\n    getCursorClass\n  }\n}\n","import { eye64, closeEye64 } from './cornerImg64'\nimport React, {\n  useState,\n  useEffect,\n  useMemo,\n  useImperativeHandle,\n  useRef,\n  useCallback\n} from 'react'\nimport {\n  PluginManager,\n  importLines,\n  exportLines,\n  generateLineId,\n  getZoomOrigin\n} from '@sketch-ruler/core'\nimport type {\n  TransformEngine,\n  TransformState,\n  SketchRulerPlugin,\n  GuideLine\n} from '@sketch-ruler/core'\nimport './index.less'\nimport RulerWrapper from './RulerWrapper'\nimport { useCanvasTransform } from '../hooks/useCanvasTransform'\nimport { useInputManager } from '../hooks/useInputManager'\nimport type { SketchRulerProps, PaletteType, SketchRulerMethods, ZoomMode } from '../index-types'\n\nconst ZOOM_PRESETS = [0.1, 0.25, 0.33, 0.5, 0.66, 1, 1.5, 2, 3, 4, 6, 8, 16]\n\nconst DEFAULT_LINES: { h: number[]; v: number[] } = { h: [], v: [] }\nconst DEFAULT_SHADOW = { x: 0, y: 0, width: 0, height: 0 }\nconst DEFAULT_INITIAL_OFFSET = { x: 0, y: 0 }\n\nconst usePaletteConfig = (palette: PaletteType | undefined) => {\n  return useMemo(() => {\n    const mapped: PaletteType = {\n      ...palette,\n      tickColor: palette?.tickColor ?? '#BABBBC',\n      labelColor: palette?.labelColor ?? '#7D8694',\n      guideLineColor: palette?.guideLineColor ?? '#51d6a9',\n      guideLineLockedColor: palette?.guideLineLockedColor ?? '#d4d7dc',\n      hoverBg: palette?.hoverBg ?? 'transparent',\n      hoverColor: palette?.hoverColor ?? '#000',\n      borderColor: palette?.borderColor ?? '#eeeeef',\n      shadowColor: palette?.shadowColor ?? '#e9f7fe',\n      fontShadowColor: palette?.fontShadowColor ?? '#106ebe'\n    }\n    return {\n      bgColor: palette?.bgColor ?? '#f6f7f9',\n      tickColor: mapped.tickColor!,\n      labelColor: mapped.labelColor!,\n      guideLineColor: mapped.guideLineColor!,\n      guideLineLockedColor: mapped.guideLineLockedColor!,\n      hoverBg: mapped.hoverBg!,\n      hoverColor: mapped.hoverColor!,\n      borderColor: mapped.borderColor!,\n      shadowColor: mapped.shadowColor!,\n      fontShadowColor: mapped.fontShadowColor!\n    }\n  }, [palette])\n}\n\nconst SketchRule = React.forwardRef<SketchRulerMethods, SketchRulerProps>(\n  (\n    {\n      showRuler = true,\n      scale: propScale = 1,\n      thick = 16,\n      width = 1400,\n      height = 800,\n      canvasWidth = 700,\n      canvasHeight = 700,\n      palette,\n      lines = DEFAULT_LINES,\n      isShowReferLine = true,\n      snapThreshold = 5,\n      lockLine = false,\n      selfHandle = false,\n      zoomStep = 0.25,\n      minZoom = 0.1,\n      maxZoom = 10,\n      animationMode = 'ease-out',\n      zoomMode = 'pointer',\n      enableAnimation = false,\n      plugins = [],\n      autoCenter = true,\n      paddingRatio = 0.2,\n      shadow = DEFAULT_SHADOW,\n      initialOffset = DEFAULT_INITIAL_OFFSET,\n      showMinorTicks = false,\n      eyeIcon,\n      closeEyeIcon,\n      deleteLabel = '放开删除',\n      children,\n      onUpdateScale,\n      onZoomChange,\n      onUpdateLines,\n      onHandleCornerClick\n    }: SketchRulerProps,\n    ref\n  ) => {\n    const paletteConfig = usePaletteConfig(palette)\n    const [showReferLine, setShowReferLine] = useState(isShowReferLine)\n    const canvasEditRef = useRef<HTMLDivElement | null>(null)\n    const containerRef = useRef<HTMLDivElement | null>(null)\n    const cursorClassRef = useRef('default')\n    const [cursorClass, setCursorClass] = useState('default')\n\n    const rectWidth = width\n    const rectHeight = height\n\n    const canvasSize = useMemo(\n      () => ({ width: canvasWidth, height: canvasHeight }),\n      [canvasWidth, canvasHeight]\n    )\n    const viewportSize = useMemo(\n      () => ({ width: rectWidth, height: rectHeight }),\n      [rectWidth, rectHeight]\n    )\n\n    const { engine, scale, offset, setTransform, zoomBy, zoomTo, reset } = useCanvasTransform({\n      initialScale: propScale,\n      initialOffset,\n      minZoom,\n      maxZoom,\n      enableAnimation,\n      animationMode,\n      autoCenter,\n      canvasSize,\n      viewportSize,\n      paddingRatio\n    })\n\n    // 外部 prop 变化 → 同步到引擎（跳过首次渲染，避免覆盖 autoCenter 初始化）\n    const prevPropScaleRef = useRef(propScale)\n    useEffect(() => {\n      if (Math.abs(propScale - prevPropScaleRef.current) > 1e-10) {\n        prevPropScaleRef.current = propScale\n        const s = engine?.getState()\n        const currentScale = s?.scale\n        if (currentScale !== undefined && Math.abs(propScale - currentScale) > 1e-10) {\n          const origin = getZoomOrigin({\n            mode: zoomMode,\n            viewportSize: { width: rectWidth, height: rectHeight },\n            contentSize: { width: canvasWidth, height: canvasHeight },\n            offset: { x: s?.x ?? offset.x, y: s?.y ?? offset.y },\n            scale: s?.scale ?? scale\n          })\n          zoomTo(propScale, origin.x, origin.y)\n        }\n      }\n    }, [propScale, engine, zoomMode, rectWidth, rectHeight, canvasWidth, canvasHeight, zoomTo])\n\n    // 使用 InputManager 处理输入事件\n    const { inputManager } = useInputManager(engine, canvasEditRef, {\n      zoomStep,\n      zoomMode,\n      selfHandle,\n      viewportSize: { width: rectWidth, height: rectHeight },\n      contentSize: { width: canvasWidth, height: canvasHeight }\n    })\n\n    useEffect(() => {\n      inputManager?.setZoomMode(zoomMode)\n    }, [zoomMode, inputManager])\n\n    useEffect(() => {\n      if (animationMode) {\n        engine?.setAnimationMode(animationMode)\n      }\n    }, [animationMode, engine])\n\n    useEffect(() => {\n      const interval = setInterval(() => {\n        const cls = inputManager?.getCursorClass() ?? 'default'\n        if (cls !== cursorClassRef.current) {\n          cursorClassRef.current = cls\n          setCursorClass(cls)\n        }\n      }, 100)\n      return () => clearInterval(interval)\n    }, [inputManager])\n\n    // === 插件系统 ===\n    const pluginManagerRef = useRef(new PluginManager())\n    useEffect(() => {\n      const pm = pluginManagerRef.current\n      pm.clear()\n      for (const plugin of plugins) {\n        pm.register(plugin)\n      }\n    }, [plugins])\n\n    useEffect(() => {\n      pluginManagerRef.current.setApi({\n        getState: () => ({\n          scale,\n          offset: { ...offset },\n          lines: guideLines\n        }),\n        zoomBy,\n        zoomTo,\n        panBy: (dx: number, dy: number) => engine?.panBy(dx, dy),\n        setTransform\n      })\n    }, [scale, offset, engine, zoomBy, zoomTo, setTransform])\n\n    // === 参考线状态管理 ===\n    const [guideLines, setGuideLines] = useState<GuideLine[]>(() => importLines(lines))\n\n    const horizontalLines = useMemo(\n      () => guideLines.filter((l) => l.orientation === 'h' && l.visible !== false),\n      [guideLines]\n    )\n    const verticalLines = useMemo(\n      () => guideLines.filter((l) => l.orientation === 'v' && l.visible !== false),\n      [guideLines]\n    )\n\n    function syncGuideLines(newLines: { h: number[]; v: number[] }): void {\n      const existing = guideLines\n      const updated: GuideLine[] = []\n\n      const existingH = existing.filter((l) => l.orientation === 'h')\n      newLines.h.forEach((pos, idx) => {\n        if (idx < existingH.length) {\n          updated.push({ ...existingH[idx], position: pos })\n        } else {\n          updated.push({\n            id: generateLineId(),\n            orientation: 'h',\n            position: pos,\n            visible: true,\n            locked: false\n          })\n        }\n      })\n\n      const existingV = existing.filter((l) => l.orientation === 'v')\n      newLines.v.forEach((pos, idx) => {\n        if (idx < existingV.length) {\n          updated.push({ ...existingV[idx], position: pos })\n        } else {\n          updated.push({\n            id: generateLineId(),\n            orientation: 'v',\n            position: pos,\n            visible: true,\n            locked: false\n          })\n        }\n      })\n\n      setGuideLines(updated)\n    }\n\n    const linesKey = JSON.stringify(lines)\n    useEffect(() => {\n      syncGuideLines(lines)\n    }, [linesKey])\n\n    // autoCenter 已在 useCanvasTransform 内部处理，此处不再重复\n\n    useEffect(() => {\n      setShowReferLine(isShowReferLine)\n    }, [isShowReferLine])\n\n    function getExportedLines(): { h: number[]; v: number[] } {\n      return exportLines(guideLines)\n    }\n\n    const handleAddLine = (line: Omit<GuideLine, 'id'>): void => {\n      const newLine: GuideLine = { ...line, id: generateLineId() }\n      const next = [...guideLines, newLine]\n      setGuideLines(next)\n      pluginManagerRef.current.onLineCreate({ line: newLine })\n      onUpdateLines?.(exportLines(next))\n    }\n\n    const handleUpdateLine = (id: string, position: number): void => {\n      const line = guideLines.find((l) => l.id === id)\n      if (!line) return\n      const from = line.position\n      const next = guideLines.map((l) => (l.id === id ? { ...l, position } : l))\n      setGuideLines(next)\n      pluginManagerRef.current.onLineMove({ line: { ...line, position }, from, to: position })\n      onUpdateLines?.(exportLines(next))\n    }\n\n    const handleDeleteLine = (id: string): void => {\n      const line = guideLines.find((l) => l.id === id)\n      const next = guideLines.filter((l) => l.id !== id)\n      setGuideLines(next)\n      if (line) {\n        pluginManagerRef.current.onLineDelete({ line })\n      }\n      onUpdateLines?.(exportLines(next))\n    }\n\n    // === 通知外部缩放变化 ===\n    useEffect(() => {\n      onUpdateScale?.(scale)\n      onZoomChange?.({ scale, x: offset.x, y: offset.y })\n    }, [scale, offset.x, offset.y])\n\n    const getPointerOrigin = useCallback((): { x: number; y: number } => {\n      const parent = canvasEditRef.current?.parentElement\n      const rect = parent ? parent.getBoundingClientRect() : new DOMRect(0, 0, 0, 0)\n      return { x: rect.width / 2, y: rect.height / 2 }\n    }, [])\n\n    const zoomIn = useCallback(async () => {\n      const { x: cx, y: cy } = getPointerOrigin()\n      const from = scale\n      const to = from + zoomStep\n      const allowed = await pluginManagerRef.current.beforeZoom({\n        from,\n        to,\n        center: { x: cx, y: cy },\n        cancel: () => {}\n      })\n      if (allowed) {\n        zoomBy(zoomStep, cx, cy)\n        pluginManagerRef.current.afterZoom({ from, to, center: { x: cx, y: cy } })\n      }\n    }, [zoomBy, zoomStep, getPointerOrigin, scale])\n\n    const zoomOut = useCallback(async () => {\n      const { x: cx, y: cy } = getPointerOrigin()\n      const from = scale\n      const to = from - zoomStep\n      const allowed = await pluginManagerRef.current.beforeZoom({\n        from,\n        to,\n        center: { x: cx, y: cy },\n        cancel: () => {}\n      })\n      if (allowed) {\n        zoomBy(-zoomStep, cx, cy)\n        pluginManagerRef.current.afterZoom({ from, to, center: { x: cx, y: cy } })\n      }\n    }, [zoomBy, zoomStep, getPointerOrigin, scale])\n\n    const handleCornerClick = () => {\n      const next = !showReferLine\n      setShowReferLine(next)\n      onHandleCornerClick?.(next)\n    }\n\n    const setZoomMode = useCallback(\n      (mode: ZoomMode) => {\n        inputManager?.setZoomMode(mode)\n      },\n      [inputManager]\n    )\n\n    const zoomToPreset = useCallback(\n      async (preset: number) => {\n        const target =\n          ZOOM_PRESETS.find((p) => p >= preset) ?? ZOOM_PRESETS[ZOOM_PRESETS.length - 1]\n        const { x: cx, y: cy } = getPointerOrigin()\n        const from = scale\n        const allowed = await pluginManagerRef.current.beforeZoom({\n          from,\n          to: target,\n          center: { x: cx, y: cy },\n          cancel: () => {}\n        })\n        if (allowed) {\n          zoomTo(target, cx, cy)\n          pluginManagerRef.current.afterZoom({ from, to: target, center: { x: cx, y: cy } })\n        }\n      },\n      [zoomTo, getPointerOrigin, scale]\n    )\n\n    useImperativeHandle(ref, () => ({\n      engine,\n      reset,\n      zoomIn,\n      zoomOut,\n      setTransform,\n      setZoomMode,\n      zoomToPreset\n    }))\n\n    const cornerStyle = useMemo(() => {\n      return {\n        backgroundImage: showReferLine\n          ? `url(${eyeIcon || eye64})`\n          : `url(${closeEyeIcon || closeEye64})`,\n        width: `${thick}px`,\n        height: `${thick}px`,\n        borderRight: `1px solid ${paletteConfig.borderColor}`,\n        borderBottom: `1px solid ${paletteConfig.borderColor}`\n      }\n    }, [showReferLine, eyeIcon, closeEyeIcon, paletteConfig, thick])\n\n    const rectStyle = useMemo(() => {\n      return {\n        background: paletteConfig.bgColor,\n        width: rectWidth + 'px',\n        height: rectHeight + 'px',\n        left: 0,\n        top: 0\n      }\n    }, [rectHeight, rectWidth, paletteConfig])\n\n    // 处理children：分离 default 和 toolbar\n    const [defaultSlot, toolbarSlot] = React.Children.toArray(children).reduce(\n      (acc: [React.ReactNode | null, React.ReactNode | null], child: React.ReactNode) => {\n        if (typeof child === 'function') {\n          acc[1] = child\n        } else if (React.isValidElement(child)) {\n          const el = child as React.ReactElement<any>\n          if (el.props.slot === 'toolbar') {\n            acc[1] = el\n          } else {\n            acc[0] = child\n          }\n        } else {\n          acc[0] = child\n        }\n        return acc\n      },\n      [null, null]\n    )\n\n    const toolbarState = useMemo(\n      () => ({\n        scale,\n        offset,\n        zoomMode,\n        showReferLine\n      }),\n      [scale, offset, zoomMode, showReferLine]\n    )\n\n    const toolbarTools = useMemo(\n      () => ({\n        zoomIn,\n        zoomOut,\n        reset,\n        setZoomMode,\n        zoomToPreset,\n        toggleReferLine: handleCornerClick\n      }),\n      [zoomIn, zoomOut, reset, setZoomMode, zoomToPreset, handleCornerClick]\n    )\n\n    return (\n      <div className=\"sketch-ruler\" ref={containerRef}>\n        {toolbarSlot && (\n          <div className=\"sketch-ruler-toolbar\">\n            {typeof toolbarSlot === 'function'\n              ? (toolbarSlot as any)({ tools: toolbarTools, state: toolbarState })\n              : toolbarSlot}\n          </div>\n        )}\n        <div className={'canvasedit-parent ' + cursorClass} style={rectStyle}>\n          <div\n            ref={canvasEditRef}\n            className={'canvasedit ' + cursorClass}\n            style={{\n              width: canvasWidth + 'px',\n              height: canvasHeight + 'px',\n              transform: `matrix(${scale}, 0, 0, ${scale}, ${offset.x}, ${offset.y})`,\n              transformOrigin: '0 0'\n            }}\n          >\n            {defaultSlot}\n          </div>\n        </div>\n        {showRuler && (\n          <RulerWrapper\n            vertical={false}\n            width={rectWidth}\n            height={thick}\n            thick={thick}\n            scale={scale}\n            offset={offset}\n            lines={horizontalLines}\n            palette={paletteConfig}\n            showReferLine={showReferLine}\n            shadowStart={shadow.x}\n            shadowLength={shadow.width}\n            canvasSize={canvasWidth}\n            showMinorTicks={showMinorTicks}\n            canvasWidth={canvasWidth}\n            canvasHeight={canvasHeight}\n            deleteLabel={deleteLabel}\n            lockLine={lockLine}\n            onAddLine={handleAddLine}\n            onUpdateLine={handleUpdateLine}\n            onDeleteLine={handleDeleteLine}\n          />\n        )}\n        {showRuler && (\n          <RulerWrapper\n            vertical={true}\n            width={thick}\n            height={rectHeight}\n            thick={thick}\n            scale={scale}\n            offset={offset}\n            lines={verticalLines}\n            palette={paletteConfig}\n            showReferLine={showReferLine}\n            shadowStart={shadow.y}\n            shadowLength={shadow.height}\n            canvasSize={canvasHeight}\n            showMinorTicks={showMinorTicks}\n            canvasWidth={canvasWidth}\n            canvasHeight={canvasHeight}\n            deleteLabel={deleteLabel}\n            lockLine={lockLine}\n            onAddLine={handleAddLine}\n            onUpdateLine={handleUpdateLine}\n            onDeleteLine={handleDeleteLine}\n          />\n        )}\n        {showRuler && <a className=\"corner\" style={cornerStyle} onClick={handleCornerClick} />}\n      </div>\n    )\n  }\n)\n\nexport default SketchRule\n","import React, { useRef, useMemo, useEffect, useState, useCallback } from 'react'\nimport { MinimapEngine } from '@sketch-ruler/core'\n\nexport interface MinimapProps {\n  contentWidth: number\n  contentHeight: number\n  viewportX: number\n  viewportY: number\n  viewportWidth: number\n  viewportHeight: number\n  scale: number\n  width?: number\n  height?: number\n  onNavigate?: (x: number, y: number) => void\n  onDragStart?: () => void\n  onDragEnd?: () => void\n}\n\nconst Minimap: React.FC<MinimapProps> = ({\n  contentWidth,\n  contentHeight,\n  viewportX,\n  viewportY,\n  viewportWidth,\n  viewportHeight,\n  scale,\n  width = 200,\n  height = 150,\n  onNavigate,\n  onDragStart,\n  onDragEnd\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement | null>(null)\n  const [dragging, setDragging] = useState(false)\n  const dragRectRef = useRef({ left: 0, top: 0, width: 0, height: 0 })\n\n  const engine = useMemo(\n    () =>\n      new MinimapEngine({\n        contentWidth,\n        contentHeight,\n        viewportX,\n        viewportY,\n        viewportWidth,\n        viewportHeight,\n        scale,\n        width,\n        height\n      }),\n    [\n      contentWidth,\n      contentHeight,\n      viewportX,\n      viewportY,\n      viewportWidth,\n      viewportHeight,\n      scale,\n      width,\n      height\n    ]\n  )\n\n  const state = useMemo(() => engine.getState(), [engine])\n\n  const drawMinimap = useCallback(() => {\n    const canvas = canvasRef.current\n    if (!canvas) return\n    const ctx = canvas.getContext('2d')\n    if (!ctx) return\n\n    ctx.clearRect(0, 0, width, height)\n    ctx.fillStyle = '#fff'\n    ctx.fillRect(0, 0, width, height)\n\n    const s = state.miniScale\n    const cw = contentWidth * s\n    const ch = contentHeight * s\n    const ox = (width - cw) / 2\n    const oy = (height - ch) / 2\n\n    ctx.strokeStyle = '#e0e0e0'\n    ctx.lineWidth = 1\n    ctx.strokeRect(ox, oy, cw, ch)\n  }, [state.miniScale, width, height, contentWidth, contentHeight])\n\n  useEffect(() => {\n    drawMinimap()\n  }, [drawMinimap])\n\n  const handleCanvasPointerDown = useCallback(\n    (e: React.PointerEvent<HTMLCanvasElement>) => {\n      if (!engine.canPan()) {\n        startDrag(e, 'canvas', false)\n        return\n      }\n      startDrag(e, 'canvas', true)\n    },\n    [engine]\n  )\n\n  const handleViewportPointerDown = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n      if (!engine.canPan()) return\n      startDrag(e, 'viewport', true)\n    },\n    [engine]\n  )\n\n  const startDrag = useCallback(\n    (e: React.PointerEvent<HTMLElement>, source: 'canvas' | 'viewport', canMove: boolean) => {\n      const target = e.currentTarget as HTMLElement\n      target.setPointerCapture(e.pointerId)\n\n      const rect = canvasRef.current!.getBoundingClientRect()\n      const startState = engine.getState()\n\n      let accDx = 0\n      let accDy = 0\n      let hasMoved = false\n      let skipClick = false\n\n      let pendingTargetX = viewportX\n      let pendingTargetY = viewportY\n      let emitRafId: number | null = null\n\n      const session = engine.startDrag(\n        viewportX,\n        viewportY,\n        startState.viewportRect.left,\n        startState.viewportRect.top\n      )\n\n      function scheduleEmit() {\n        if (emitRafId !== null) return\n        emitRafId = requestAnimationFrame(() => {\n          emitRafId = null\n          onNavigate?.(pendingTargetX, pendingTargetY)\n        })\n      }\n\n      if (canMove) {\n        dragRectRef.current = { ...startState.viewportRect }\n        setDragging(true)\n        onDragStart?.()\n      }\n\n      const onMove = (ev: PointerEvent) => {\n        accDx += ev.movementX\n        accDy += ev.movementY\n\n        if (Math.abs(accDx) > 3 || Math.abs(accDy) > 3) {\n          skipClick = true\n          if (!hasMoved && canMove) {\n            hasMoved = true\n          }\n        }\n\n        if (canMove) {\n          const result = session.move(accDx, accDy)\n          dragRectRef.current = result.dragRect\n          pendingTargetX = result.targetX\n          pendingTargetY = result.targetY\n          scheduleEmit()\n        }\n      }\n\n      const onUp = (ev: PointerEvent) => {\n        target.releasePointerCapture(ev.pointerId)\n        target.removeEventListener('pointermove', onMove)\n        target.removeEventListener('pointerup', onUp)\n        target.removeEventListener('pointercancel', onUp)\n\n        if (emitRafId !== null) {\n          cancelAnimationFrame(emitRafId)\n          emitRafId = null\n        }\n\n        if (canMove) {\n          const endResult = session.end(accDx, accDy)\n          onNavigate?.(endResult.x, endResult.y)\n          setTimeout(() => {\n            setDragging(false)\n            onDragEnd?.()\n          }, 50)\n        } else if (!skipClick && source === 'canvas') {\n          const nav = engine.clickAt(ev.clientX, ev.clientY, rect.left, rect.top)\n          onNavigate?.(nav.x, nav.y)\n        }\n      }\n\n      target.addEventListener('pointermove', onMove)\n      target.addEventListener('pointerup', onUp)\n      target.addEventListener('pointercancel', onUp)\n    },\n    [engine, viewportX, viewportY, onNavigate, onDragStart, onDragEnd]\n  )\n\n  const containerStyle = useMemo(\n    () => ({\n      width: width + 'px',\n      height: height + 'px',\n      position: 'relative' as const,\n      border: '1px solid #e0e0e0',\n      borderRadius: '4px',\n      overflow: 'hidden',\n      background: '#fff',\n      boxShadow: '0 2px 8px rgba(0, 0, 0, 0.08)'\n    }),\n    [width, height]\n  )\n\n  const currentRect = dragging ? dragRectRef.current : state.viewportRect\n  const viewportStyle = useMemo(\n    () => ({\n      position: 'absolute' as const,\n      left: currentRect.left + 'px',\n      top: currentRect.top + 'px',\n      width: currentRect.width + 'px',\n      height: currentRect.height + 'px',\n      border: '1px solid #1890ff',\n      background: 'rgba(24, 144, 255, 0.15)',\n      cursor: 'move',\n      pointerEvents: 'auto' as const,\n      boxSizing: 'border-box' as const,\n      willChange: 'left, top, width, height'\n    }),\n    [currentRect]\n  )\n\n  return (\n    <div style={containerStyle}>\n      <canvas\n        ref={canvasRef}\n        style={{ display: 'block', width: '100%', height: '100%' }}\n        width={width}\n        height={height}\n        onPointerDown={handleCanvasPointerDown}\n      />\n      <div style={viewportStyle} onPointerDown={handleViewportPointerDown} />\n    </div>\n  )\n}\n\nexport default Minimap\n","import { useMemo } from 'react'\nimport { computeScaleMarks, getTickConfig, applyHysteresis } from '@sketch-ruler/core'\n\nexport function useRulerScale(\n  scale: number,\n  offset: number,\n  viewportSize: number,\n  thick: number,\n  canvasSize?: number,\n  showMinorTicks?: boolean\n) {\n  return useMemo(() => {\n    const marks = computeScaleMarks({\n      scale,\n      offset,\n      viewportSize,\n      thick,\n      canvasSize,\n      showMinorTicks\n    })\n    return {\n      marks,\n      currentConfig: getTickConfig(scale)\n    }\n  }, [scale, offset, viewportSize, thick, canvasSize, showMinorTicks])\n}\n","import { useState, useCallback, useMemo, useRef } from 'react'\nimport type { GuideLine } from '@sketch-ruler/core'\nimport { importLines, exportLines, generateLineId } from '@sketch-ruler/core'\nimport type { LineType } from '../index-types'\n\n// 创建本地别名供 hook 内部使用\nconst lineTypeToGuideLines = importLines\nconst guideLinesToLineType = exportLines\nexport { lineTypeToGuideLines, guideLinesToLineType }\n\nexport interface GuideLineCallbacks {\n  onLineCreate?: (line: GuideLine) => void\n  onLineDelete?: (line: GuideLine) => void\n  onLineMove?: (line: GuideLine, from: number, to: number) => void\n}\n\nexport function useGuideLines(\n  externalGuideLines?: GuideLine[],\n  externalLines?: LineType,\n  onGuideLineChange?: (lines: GuideLine[]) => void,\n  handleLine?: (props: LineType) => void,\n  callbacks?: GuideLineCallbacks\n) {\n  const isControlled = externalGuideLines !== undefined\n\n  // 用 ref 缓存 lines 的字符串表示，避免无限循环\n  const linesKeyRef = useRef('')\n  const [derivedLines, setDerivedLines] = useState<GuideLine[]>(() => {\n    if (externalGuideLines) return externalGuideLines\n    if (externalLines) return lineTypeToGuideLines(externalLines)\n    return []\n  })\n\n  const currentLines = useMemo(() => {\n    if (externalGuideLines !== undefined) return externalGuideLines\n    if (externalLines !== undefined) {\n      const key = JSON.stringify(externalLines)\n      if (key !== linesKeyRef.current) {\n        linesKeyRef.current = key\n        return lineTypeToGuideLines(externalLines)\n      }\n    }\n    return derivedLines\n  }, [externalGuideLines, externalLines, derivedLines])\n\n  const notify = useCallback(\n    (next: GuideLine[]) => {\n      onGuideLineChange?.(next)\n      handleLine?.(guideLinesToLineType(next))\n    },\n    [onGuideLineChange, handleLine]\n  )\n\n  const addLine = useCallback(\n    (line: Omit<GuideLine, 'id'>) => {\n      const newLine: GuideLine = { ...line, id: generateLineId() }\n      const next = [...currentLines, newLine]\n      if (!isControlled) setDerivedLines(next)\n      notify(next)\n      callbacks?.onLineCreate?.(newLine)\n      return newLine\n    },\n    [currentLines, isControlled, notify, callbacks]\n  )\n\n  const removeLine = useCallback(\n    (id: string) => {\n      const line = currentLines.find((l: GuideLine) => l.id === id)\n      const next = currentLines.filter((l) => l.id !== id)\n      if (!isControlled) setDerivedLines(next)\n      notify(next)\n      if (line) callbacks?.onLineDelete?.(line)\n    },\n    [currentLines, isControlled, notify, callbacks]\n  )\n\n  const updateLine = useCallback(\n    (id: string, position: number) => {\n      const line = currentLines.find((l) => l.id === id)\n      const from = line?.position\n      const next = currentLines.map((l: GuideLine) => (l.id === id ? { ...l, position } : l))\n      if (!isControlled) setDerivedLines(next)\n      notify(next)\n      if (line && from !== undefined) {\n        callbacks?.onLineMove?.(line, from, position)\n      }\n    },\n    [currentLines, isControlled, notify, callbacks]\n  )\n\n  return {\n    guideLines: currentLines,\n    addLine,\n    removeLine,\n    updateLine\n  }\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport type { GuideLine } from '@sketch-ruler/core'\nimport { useCanvasTransform } from './useCanvasTransform'\nimport { useGuideLines, lineTypeToGuideLines } from './useGuideLines'\nimport type { LineType, ZoomMode, PaletteType } from '../index-types'\n\nexport { lineTypeToGuideLines }\n\nexport interface UseSketchRulerOptions {\n  width?: number\n  height?: number\n  canvasWidth?: number\n  canvasHeight?: number\n  thick?: number\n  scale?: number\n  palette?: Partial<PaletteType>\n  lines?: LineType\n  snapThreshold?: number\n  lockLine?: boolean\n  minZoom?: number\n  maxZoom?: number\n  zoomStep?: number\n  autoCenter?: boolean\n  showRuler?: boolean\n  initialOffset?: { x: number; y: number }\n  enableAnimation?: boolean\n}\n\nexport function useSketchRuler(options: UseSketchRulerOptions = {}) {\n  const {\n    width = 1400,\n    height = 800,\n    canvasWidth = 1000,\n    canvasHeight = 700,\n    thick = 16,\n    scale: initialScale = 1,\n    palette,\n    lines: initialLines = { h: [], v: [] },\n    snapThreshold = 5,\n    lockLine = false,\n    minZoom = 0.1,\n    maxZoom = 10,\n    zoomStep = 0.25,\n    autoCenter = true,\n    showRuler = true,\n    initialOffset,\n    enableAnimation = false\n  } = options\n\n  const rectWidth = width\n  const rectHeight = height\n\n  const { engine, scale, offset, setTransform, panBy, zoomBy, zoomTo, reset } = useCanvasTransform({\n    initialScale: initialScale,\n    initialOffset: initialOffset ? { x: initialOffset.x, y: initialOffset.y } : { x: 0, y: 0 },\n    minZoom,\n    maxZoom,\n    enableAnimation,\n    autoCenter,\n    canvasSize: { width: canvasWidth, height: canvasHeight },\n    viewportSize: { width: rectWidth, height: rectHeight },\n    paddingRatio: 0.2\n  })\n\n  const [zoomMode, setZoomModeState] = useState<ZoomMode>('pointer')\n\n  const { guideLines, addLine, removeLine, updateLine } = useGuideLines(undefined, initialLines)\n\n  const horizontalLines = useMemo(\n    () => guideLines.filter((l) => l.orientation === 'h' && l.visible !== false),\n    [guideLines]\n  )\n  const verticalLines = useMemo(\n    () => guideLines.filter((l) => l.orientation === 'v' && l.visible !== false),\n    [guideLines]\n  )\n\n  const paletteCpu = useMemo(() => {\n    return {\n      bgColor: '#f6f7f9',\n      tickColor: '#BABBBC',\n      labelColor: '#7D8694',\n      guideLineColor: '#51d6a9',\n      guideLineLockedColor: '#d4d7dc',\n      hoverBg: '#000',\n      hoverColor: '#fff',\n      borderColor: '#eeeeef',\n      shadowColor: '#e9f7fe',\n      ...palette\n    }\n  }, [palette])\n\n  const zoomIn = useCallback(() => {\n    const cx = rectWidth / 2\n    const cy = rectHeight / 2\n    zoomBy(zoomStep, cx, cy)\n  }, [zoomBy, zoomStep, rectWidth, rectHeight])\n\n  const zoomOut = useCallback(() => {\n    const cx = rectWidth / 2\n    const cy = rectHeight / 2\n    zoomBy(-zoomStep, cx, cy)\n  }, [zoomBy, zoomStep, rectWidth, rectHeight])\n\n  const setZoomMode = useCallback((mode: ZoomMode) => {\n    setZoomModeState(mode)\n  }, [])\n\n  return {\n    engine,\n    scale,\n    offset,\n    rectWidth,\n    rectHeight,\n    zoomMode,\n    guideLines,\n    horizontalLines,\n    verticalLines,\n    paletteCpu,\n    setTransform,\n    panBy,\n    zoomBy,\n    zoomTo,\n    zoomIn,\n    zoomOut,\n    reset,\n    setZoomMode,\n    addLine,\n    removeLine,\n    updateLine\n  }\n}\n","import { useMemo } from 'react'\nimport { SnapEngine } from '@sketch-ruler/core'\nimport type { SnapResult, SnapRule } from '@sketch-ruler/core'\nimport type { GuideLine } from '@sketch-ruler/core'\n\nexport type { SnapResult, SnapRule, SnapTarget } from '@sketch-ruler/core'\n\nexport interface SnapOptions {\n  threshold?: number\n  strength?: number\n}\n\nexport function useSnapDetection(\n  scale: number,\n  offset: { x: number; y: number },\n  guideLines: GuideLine[],\n  options: SnapOptions = {}\n) {\n  const { threshold = 5, strength = 0.5 } = options\n\n  const guideLineTargets = useMemo(() => {\n    return guideLines.filter((l) => l.visible !== false).map((l) => l.position)\n  }, [guideLines])\n\n  const engine = useMemo(() => {\n    return new SnapEngine({\n      threshold,\n      scale,\n      strength,\n      guideLineTargets,\n      lines: guideLines\n    })\n  }, [threshold, scale, strength, guideLineTargets, guideLines])\n\n  const detect = (screenPos: number, direction: 'h' | 'v'): SnapResult | null => {\n    const offsetVal = direction === 'h' ? offset.y : offset.x\n    const worldPos = (screenPos - offsetVal) / scale\n    return engine.snap(worldPos, direction)\n  }\n\n  return { detect, engine }\n}\n","export { PluginManager } from '@sketch-ruler/core'\nexport type {\n  SketchRulerPlugin,\n  RulerRenderer,\n  BeforeZoomContext,\n  AfterZoomContext,\n  BeforePanContext,\n  AfterPanContext,\n  OnSnapContext,\n  OnLineContext,\n  OnLineMoveContext,\n  TickInfo,\n  LabelInfo,\n  RenderConfig,\n  Point,\n  SnapTarget,\n  PluginApi,\n  PluginContext\n} from '@sketch-ruler/core'\n\nimport type { SketchRulerPlugin } from '@sketch-ruler/core'\n\n/**\n * 辅助函数：创建带类型推断的插件\n */\nexport function definePlugin<TOptions = void>(\n  factory: (options: TOptions) => SketchRulerPlugin\n): (options: TOptions) => SketchRulerPlugin {\n  return (options: TOptions) => factory(options)\n}\n"],"x_google_ignoreList":[1,2],"mappings":"k/BAAA,IAAM,EAAQ,y9BAER,EAAa,03BCSnB,IAAI,EAAqB,OAAO,IAAI,4BAA4B,EAEhE,SAAS,EAAQ,EAAM,EAAQ,EAAU,CACvC,IAAI,EAAM,KAGV,GAFW,IAAX,IAAK,KAAmB,EAAM,GAAK,GACxB,EAAO,MAAlB,IAAK,KAAqB,EAAM,GAAK,EAAO,KACxC,QAAS,EAEX,IAAK,IAAI,IADT,GAAW,CAAC,EACS,EACT,IAAV,QAAuB,EAAS,GAAY,EAAO,SAChD,EAAW,EAElB,MADA,GAAS,EAAS,IACX,CACL,SAAU,EACJ,OACD,MACL,IAAgB,IAAX,IAAK,GAAwB,KAAT,EACzB,MAAO,CACT,CACF,CAEA,EAAQ,IAAM,EACd,EAAQ,KAAO,kBC9Bb,EAAO,QAAA,EAAA,OCgIT,GAAA,EAAA,EAAA,OA/H4B,CAC1B,OACA,QACA,SACA,UACA,WACA,cACA,eACA,QAAQ,EACR,SAAS,EACT,QAAQ,GACR,WAAW,GACX,cAAc,OACd,YAAY,GACZ,WACA,cACe,CACf,GAAM,CAAC,EAAa,IAAA,EAAA,EAAA,UAA0C,IAAI,EAC5D,GAAA,EAAA,EAAA,QAAiB,CAAI,EAC3B,EAAQ,QAAU,EAElB,IAAM,EAAM,EAAK,SAAW,EAAQ,EAE9B,GAAA,EAAA,EAAA,aAAsB,CAC1B,IAAM,EAAS,EAAK,QAAU,EAAW,UAAY,EAAW,YAAc,YACxE,EAAiC,EAAK,QAAU,GAAY,EAAY,OAAS,OAYvF,OAXI,EACK,CACL,KAAM,GAAG,EAAI,IACb,IAAK,EACL,OAAQ,GAAG,EAAO,IAClB,MAAO,MACP,WAAY,cAAc,EAAQ,iBAClC,SACA,eACF,EAEK,CACL,IAAK,GAAG,EAAI,IACZ,KAAM,EACN,MAAO,GAAG,EAAM,IAChB,OAAQ,MACR,aAAc,cAAc,EAAQ,iBACpC,SACA,eACF,CACF,EAAG,CAAC,EAAK,EAAU,EAAQ,eAAgB,EAAK,OAAQ,EAAU,EAAO,EAAQ,CAAS,CAAC,EAErF,GAAA,EAAA,EAAA,aAA0B,CAC9B,GAAI,IAAgB,KAAM,CAExB,IAAM,EAAgB,EAAc,GAAK,GAD3B,EAAW,EAAc,GAGjC,EADY,EAAc,EAAQ,GACP,EACjC,GAAI,GAAiB,EACnB,OAAO,CAEX,CACA,OAAO,OAAO,KAAK,MAAM,EAAK,QAAQ,CAAC,CACzC,EAAG,CAAC,EAAa,EAAK,SAAU,EAAa,EAAc,EAAa,EAAU,EAAO,EAAQ,CAAK,CAAC,EAyDvG,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,OAAc,QAAO,aAAA,EAAA,EAAA,aAvDnC,GAAwB,CACvB,GAAI,EAAQ,QAAQ,QAAU,EAAU,OACxC,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAClB,EAAe,EAAQ,QAAQ,QAAQ,EAEvC,IAAM,EAAa,EAAW,EAAE,QAAU,EAAE,QACtC,EAAW,EAAQ,QAAQ,SAC7B,EAAe,GAEb,EAAU,GAA0B,CAGxC,IAAI,EAAS,IAFQ,EAAW,EAAU,QAAU,EAAU,SAChC,GAAc,EAItC,EAAgB,GAAK,EACrB,GAAA,EAAA,EAAA,eAAyB,CAAK,EAAE,SAChC,EAAU,KAAK,MAAM,EAAS,CAAQ,EAAI,EACnC,KAAK,IAAI,EAAS,CAC3B,EAAO,IACT,EAAS,GAGX,EAAe,CAAM,EAIrB,IAAM,EAAgB,EAAS,GAAK,GADtB,EAAW,EAAc,GAIjC,EADY,EAAS,EAAQ,GACF,EAEjC,EAAe,GAAiB,EAGhC,IAAW,EAAQ,QAAQ,GAAI,KAAK,MAAM,CAAM,CAAC,CACnD,EAEM,MAAa,CACb,GACF,IAAW,EAAQ,QAAQ,EAAE,EAE/B,SAAS,oBAAoB,YAAa,CAAM,EAChD,SAAS,oBAAoB,UAAW,CAAI,EAC5C,EAAe,IAAI,CACrB,EAEA,SAAS,iBAAiB,YAAa,CAAM,EAC7C,SAAS,iBAAiB,UAAW,CAAI,CAC3C,EACA,CAAC,EAAU,EAAU,EAAO,EAAQ,EAAO,EAAQ,EAAO,EAAU,CAAQ,CAI3B,WAC9C,CAAC,EAAK,SACL,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,aAAa,MAAO,CAAE,MAAO,EAAQ,UAAW,WAC7D,CACG,CAAA,CAEL,CAAA,CAET,CAEsC,ECgItC,GAAA,EAAA,EAAA,OA5PwB,CACtB,WACA,QACA,SACA,QACA,QACA,SACA,QACA,UACA,gBACA,cACA,eACA,aACA,iBACA,cAAc,IACd,eAAe,IACf,cAAc,OACd,WAAW,GACX,YACA,eACA,kBACuB,CACvB,IAAM,GAAA,EAAA,EAAA,QAA6C,IAAI,EACjD,GAAA,EAAA,EAAA,QAA8C,IAAI,EAClD,EAAQ,OAAO,OAAW,IAAc,OAAO,iBAAmB,EAGlE,CAAC,EAAW,IAAA,EAAA,EAAA,UAAyB,EAAK,EAC1C,GAAA,EAAA,EAAA,QAA6D,IAAI,GAEvE,EAAA,EAAA,gBACE,EAAa,EAAI,EACb,EAAc,SAChB,aAAa,EAAc,OAAO,EAEpC,EAAc,QAAU,eAAiB,CACvC,EAAa,EAAK,CACpB,EAAG,GAAI,MACM,CACP,EAAc,SAChB,aAAa,EAAc,OAAO,CAEtC,GACC,CAAC,CAAK,CAAC,EAEV,IAAM,EAAiB,EAAW,cAAgB,cAE5C,GAAA,EAAA,EAAA,cACG,CACL,MAAO,EAAQ,KACf,OAAQ,EAAS,KACjB,OAAQ,EAAW,UAAY,EAAW,YAAc,aACvD,EAAW,cAAgB,gBAAiB,aAAa,EAAQ,aACpE,GACA,CAAC,EAAO,EAAQ,EAAU,EAAQ,YAAa,CAAQ,CACzD,EAGM,EAAe,EAAW,EAAO,EAAI,EAAO,EAC5C,GAAA,EAAA,EAAA,cACJ,EAAA,EAAA,mBAAyB,CACvB,QACA,OAAQ,EACR,aAAc,EAAW,EAAS,EAClC,QACA,WAAY,GAAc,IAC1B,eAAgB,GAAkB,EACpC,CAAC,EACA,CAAC,EAAO,EAAc,EAAU,EAAQ,EAAO,EAAO,EAAY,CAAc,CAAC,GAGpF,EAAA,EAAA,eAAgB,CACd,IAAM,EAAS,EAAU,QACzB,GAAI,CAAC,EAAQ,OACb,IAAM,EAAM,EAAO,WAAW,IAAI,EAC7B,IAEL,AACE,EAAY,UAAU,IAAI,EAAA,iBAG5B,EAAO,MAAQ,KAAK,MAAM,EAAQ,CAAK,EACvC,EAAO,OAAS,KAAK,MAAM,EAAS,CAAK,EAEzC,EAAY,QAAQ,OAClB,EACA,CACE,CACE,KAAM,QACN,QACA,WACA,QACA,QACA,SACA,QACA,UACA,cACA,eACA,eAAgB,GAChB,YACF,CACF,EACA,CAAE,EAAG,EAAG,EAAG,EAAG,QAAO,QAAO,CAC9B,EACF,EAAG,CAAC,EAAO,EAAU,EAAO,EAAO,EAAQ,EAAS,EAAa,EAAc,EAAY,CAAK,CAAC,EAGjG,GAAM,CAAC,EAAgB,IAAA,EAAA,EAAA,UAA8B,EAAK,EACpD,CAAC,EAAkB,KAAA,EAAA,EAAA,UAAgC,CAAC,EACpD,CAAC,EAAiB,KAAA,EAAA,EAAA,UAA+B,CAAC,EAElD,IAAA,EAAA,EAAA,aAA6B,CACjC,IAAM,EAAM,EACN,EAAS,cAAc,EAAQ,iBAIrC,OAHI,EACK,CAAE,KAAM,GAAG,EAAI,IAAK,IAAK,EAAG,OAAQ,OAAQ,MAAO,MAAO,WAAY,CAAO,EAE/E,CAAE,IAAK,GAAG,EAAI,IAAK,KAAM,EAAG,MAAO,OAAQ,OAAQ,MAAO,aAAc,CAAO,CACxF,EAAG,CAAC,EAAkB,EAAU,EAAQ,cAAc,CAAC,EAEjD,IAAA,EAAA,EAAA,aACH,GAAkB,CACjB,IAAM,EAAO,EAAU,SAAS,sBAAsB,EACtD,GAAI,CAAC,EAAM,OAEX,IAAM,EAAY,EAAW,EAAE,QAAU,EAAK,KAAO,EAAE,QAAU,EAAK,IAChE,EAAY,EAAW,EAAO,EAAI,EAAO,EAC3C,GAAY,EAAY,GAAa,EAGnC,EAAgB,GAAK,EACrB,GAAA,EAAA,EAAA,eAAyB,CAAK,EAAE,SAChC,EAAU,KAAK,MAAM,EAAW,CAAQ,EAAI,EACrC,KAAK,IAAI,EAAW,CAE7B,EAAO,IACT,EAAW,GAGb,GAAoB,EAAW,EAAQ,CAAS,EAChD,GAAmB,CAAQ,CAC7B,EACA,CAAC,EAAU,EAAQ,CAAK,CAC1B,EAEM,GAAA,EAAA,EAAA,QAA4B,CAAe,GACjD,EAAA,EAAA,eAAgB,CACd,EAAmB,QAAU,CAC/B,EAAG,CAAC,CAAe,CAAC,EAEpB,IAAM,GAAA,EAAA,EAAA,aACH,GAAkB,CACjB,GAAc,CAAC,EAEf,IAAM,EAAO,EAAU,SAAS,sBAAsB,EACtD,GAAI,CAAC,EAAM,OAGX,IAAI,IAFc,EAAW,EAAE,QAAU,EAAK,KAAO,EAAE,QAAU,EAAK,MACpD,EAAW,EAAO,EAAI,EAAO,IACN,EACnC,EAAgB,GAAK,EACrB,GAAA,EAAA,EAAA,eAAyB,CAAK,EAAE,SAChC,EAAU,KAAK,MAAM,EAAW,CAAQ,EAAI,EACrC,KAAK,IAAI,EAAW,CAC7B,EAAO,IACT,EAAW,GAEb,EAAmB,QAAU,CAC/B,EACA,CAAC,GAAe,EAAU,EAAQ,CAAK,CACzC,EAwCA,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,WAAhB,EACE,EAAA,EAAA,KAAC,SAAD,CACE,IAAK,EACL,UAAU,QACV,MAAO,EACP,aAAA,EAAA,EAAA,aA3CH,GAA2C,CAC1C,GAAI,EAAU,OACd,EAAE,gBAAgB,EAClB,EAAkB,EAAI,EACtB,EAAqB,EAAE,WAAW,EAElC,IAAM,EAAU,GAA0B,CACxC,EAAqB,CAAS,CAChC,EAEM,MAAa,CACjB,SAAS,oBAAoB,YAAa,CAAM,EAChD,SAAS,oBAAoB,UAAW,CAAI,EAE5C,IAAM,EAAW,EAAmB,QAC9B,EAAQ,EAAW,EAAc,EACjC,EAAY,EAAW,EAAO,EAAI,EAAO,EAEzC,EADY,EAAW,EAAQ,GACJ,EAC7B,GAAY,GAAK,GAAY,GAAS,CAAC,GACzC,IAAY,CACV,YAAa,EAAW,IAAM,IAC9B,SAAU,KAAK,MAAM,CAAQ,EAC7B,QAAS,GACT,OAAQ,EACV,CAAC,EAGH,EAAkB,EAAK,CACzB,EAEA,SAAS,iBAAiB,YAAa,CAAM,EAC7C,SAAS,iBAAiB,UAAW,CAAI,CAC3C,EACA,CAAC,EAAU,EAAU,EAAa,EAAc,EAAW,EAAsB,EAAO,EAAQ,CAAK,CASpF,CACd,CAAA,EACA,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,eAAe,MAAO,aACnC,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,gBAAgB,MAAO,CAAE,MAAO,EAAQ,UAAW,WAChE,KAAK,MAAM,CAAe,CACvB,CAAA,CACH,CAAA,EAEN,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,iBACZ,EAAM,IAAK,IACV,EAAA,EAAA,KAAC,EAAD,CAEQ,OACC,QACP,OAAQ,EAAW,EAAO,EAAI,EAAO,EAC5B,UACC,WACG,cACC,eACP,QACC,SACD,QACG,WACG,cACF,YACX,SAAU,EACV,SAAU,CACX,EAhBM,EAAK,EAgBX,CACF,CACE,CAAA,CAEJ,GAET,CAEkC,EC9NlC,SAAgB,EAAmB,EAAkC,CAAC,EAA6B,CACjG,GAAM,CACJ,eAAe,EACf,gBAAgB,CAAE,EAAG,EAAG,EAAG,CAAE,EAC7B,UAAU,GACV,UAAU,GACV,kBAAkB,GAClB,gBACA,eACA,mBACA,eACA,aAAa,GACb,aACA,eACA,eAAe,IACb,EAEA,EAAa,EACb,EAAc,CAAE,EAAG,EAAc,EAAG,EAAG,EAAc,CAAE,EAE3D,GAAI,GAAc,GAAc,EAAc,CAC5C,IAAM,EAAK,OAAO,EAAW,KAAK,EAC5B,EAAK,OAAO,EAAW,MAAM,EAC7B,EAAK,OAAO,EAAa,KAAK,EAC9B,EAAK,OAAO,EAAa,MAAM,EAErC,GAAI,EAAK,GAAK,EAAK,GAAK,EAAK,GAAK,EAAK,EAAG,CACxC,IAAM,GAAA,EAAA,EAAA,SACJ,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAI,OAAQ,CAAG,EACpC,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAI,OAAQ,CAAG,EACpC,UACA,CACF,EACA,EAAa,OAAO,SAAS,EAAI,KAAK,EAAI,EAAI,MAAQ,EACtD,EAAc,CACZ,EAAG,OAAO,SAAS,EAAI,CAAC,EAAI,EAAI,EAAI,EAAc,EAClD,EAAG,OAAO,SAAS,EAAI,CAAC,EAAI,EAAI,EAAI,EAAc,CACpD,CACF,CACF,CAEA,GAAM,CAAC,EAAO,IAAA,EAAA,EAAA,UAAqB,CAAU,EACvC,CAAC,EAAQ,IAAA,EAAA,EAAA,UAAsB,CAAE,EAAG,EAAY,EAAG,EAAG,EAAY,CAAE,CAAC,EACrE,CAAC,EAAQ,IAAA,EAAA,EAAA,UAA8C,IAAI,GAEjE,EAAA,EAAA,eAAgB,CACd,IAAM,EAAM,IAAI,EAAA,gBACd,CAAE,EAAG,EAAY,EAAG,EAAG,EAAY,EAAG,MAAO,CAAW,EACxD,CACE,UACA,UACA,kBACA,gBACA,eACA,mBACA,cACF,CACF,EACA,EAAU,CAAG,EACb,IAAM,EAAc,EAAI,SAAU,GAAU,CAC1C,EAAS,EAAM,KAAK,EACpB,EAAU,CAAE,EAAG,EAAM,EAAG,EAAG,EAAM,CAAE,CAAC,CACtC,CAAC,EACD,UAAa,CACX,EAAY,EACZ,EAAI,QAAQ,EACZ,EAAU,IAAI,CAChB,CACF,EAAG,CACD,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CAAC,GAGD,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,GAAU,CAAC,GAAc,CAAC,GAAc,CAAC,EAAc,OAC5D,IAAM,EAAK,OAAO,EAAW,KAAK,EAC5B,EAAK,OAAO,EAAW,MAAM,EAC7B,EAAK,OAAO,EAAa,KAAK,EAC9B,EAAK,OAAO,EAAa,MAAM,EACrC,GAAI,EAAK,GAAK,EAAK,GAAK,EAAK,GAAK,EAAK,EAAG,CACxC,IAAM,GAAA,EAAA,EAAA,SACJ,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAI,OAAQ,CAAG,EACpC,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAI,OAAQ,CAAG,EACpC,UACA,CACF,EACA,EAAO,aAAa,CAAE,MAAO,EAAI,MAAO,EAAG,EAAI,EAAG,EAAG,EAAI,CAAE,CAAC,CAC9D,CACF,EAAG,CACD,EACA,EACA,GAAY,MACZ,GAAY,OACZ,GAAc,MACd,GAAc,OACd,CACF,CAAC,EAED,IAAM,GAAA,EAAA,EAAA,aACH,GAA+B,CAC9B,GAAQ,aAAa,CAAC,CACxB,EACA,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,cACH,EAAY,IAAe,CAC1B,GAAQ,MAAM,EAAI,CAAE,CACtB,EACA,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,cACH,EAAgB,EAAiB,IAAoB,CACpD,GAAQ,OAAO,EAAQ,EAAS,CAAO,CACzC,EACA,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,cACH,EAAqB,EAAiB,IAAoB,CACzD,GAAQ,OAAO,EAAa,EAAS,CAAO,CAC9C,EACA,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,cACH,EAAiB,IACT,GAAQ,aAAa,EAAS,CAAO,GAAK,CAAE,EAAG,EAAS,EAAG,CAAQ,EAE5E,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,cACH,EAAgB,IACR,GAAQ,cAAc,EAAQ,CAAM,GAAK,CAAE,EAAG,EAAQ,EAAG,CAAO,EAEzE,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,iBAA0B,CAC9B,GAAQ,aAAa,CAAE,MAAO,EAAY,EAAG,EAAY,EAAG,EAAG,EAAY,CAAE,CAAC,CAChF,EAAG,CAAC,EAAQ,EAAY,CAAW,CAAC,EAiBpC,OAfK,EAeE,CACL,QACA,SACA,SACA,eACA,QACA,SACA,SACA,eACA,gBACA,OACF,EAzBS,CACL,QACA,SACA,OAAQ,KACR,iBAAoB,CAAC,EACrB,UAAa,CAAC,EACd,WAAc,CAAC,EACf,WAAc,CAAC,EACf,cAAe,EAAW,KAAe,CAAE,IAAG,GAAE,GAChD,eAAgB,EAAW,KAAe,CAAE,IAAG,GAAE,GACjD,UAAa,CAAC,CAChB,CAeJ,CCjNA,SAAgB,EACd,EACA,EACA,EACA,CACA,GAAM,CAAC,EAAc,IAAA,EAAA,EAAA,UAAiD,IAAI,EAyB1E,OAvBA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,GAAU,CAAC,EAAa,QAAS,OAEtC,IAAM,EAAK,IAAI,EAAA,aAAa,EAAQ,CAAO,EAI3C,OAHA,EAAgB,CAAE,EAClB,EAAG,KAAK,EAAa,OAAO,MAEf,CACX,EAAG,QAAQ,EACX,EAAgB,IAAI,CACtB,CACF,EAAG,CAAC,EAAQ,EAAa,OAAO,CAAC,GAEjC,EAAA,EAAA,eAAgB,CACV,GAAS,UACX,GAAc,YAAY,EAAQ,QAAQ,CAE9C,EAAG,CAAC,GAAS,SAAU,CAAY,CAAC,EAM7B,CACL,eACA,gBAAA,EAAA,EAAA,iBALO,GAAc,eAAe,GAAK,UACxC,CAAC,CAAY,CAId,CACF,CACF,CCXA,IAAM,EAAe,CAAC,GAAK,IAAM,IAAM,GAAK,IAAM,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,EAErE,EAA8C,CAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAE,EAC7D,EAAiB,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAQ,CAAE,EACnD,EAAyB,CAAE,EAAG,EAAG,EAAG,CAAE,EAEtC,EAAoB,IACxB,EAAA,EAAA,aAAqB,CACnB,IAAM,EAAsB,CAC1B,GAAG,EACH,UAAW,GAAS,WAAa,UACjC,WAAY,GAAS,YAAc,UACnC,eAAgB,GAAS,gBAAkB,UAC3C,qBAAsB,GAAS,sBAAwB,UACvD,QAAS,GAAS,SAAW,cAC7B,WAAY,GAAS,YAAc,OACnC,YAAa,GAAS,aAAe,UACrC,YAAa,GAAS,aAAe,UACrC,gBAAiB,GAAS,iBAAmB,SAC/C,EACA,MAAO,CACL,QAAS,GAAS,SAAW,UAC7B,UAAW,EAAO,UAClB,WAAY,EAAO,WACnB,eAAgB,EAAO,eACvB,qBAAsB,EAAO,qBAC7B,QAAS,EAAO,QAChB,WAAY,EAAO,WACnB,YAAa,EAAO,YACpB,YAAa,EAAO,YACpB,gBAAiB,EAAO,eAC1B,CACF,EAAG,CAAC,CAAO,CAAC,EAGR,EAAa,EAAA,QAAM,YAErB,CACE,YAAY,GACZ,MAAO,EAAY,EACnB,QAAQ,GACR,QAAQ,KACR,SAAS,IACT,cAAc,IACd,eAAe,IACf,UACA,QAAQ,EACR,kBAAkB,GAClB,gBAAgB,EAChB,WAAW,GACX,aAAa,GACb,WAAW,IACX,UAAU,GACV,UAAU,GACV,gBAAgB,WAChB,WAAW,UACX,kBAAkB,GAClB,UAAU,CAAC,EACX,aAAa,GACb,eAAe,GACf,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GACjB,WACA,eACA,eAAc,OACd,YACA,iBACA,eACA,gBACA,wBAEF,KACG,CACH,IAAM,EAAgB,EAAiB,CAAO,EACxC,CAAC,EAAe,KAAA,EAAA,EAAA,UAA6B,CAAe,EAC5D,IAAA,EAAA,EAAA,QAA8C,IAAI,EAClD,IAAA,EAAA,EAAA,QAA6C,IAAI,EACjD,IAAA,EAAA,EAAA,QAAwB,SAAS,EACjC,CAAC,GAAa,KAAA,EAAA,EAAA,UAA2B,SAAS,EAElD,EAAY,EACZ,EAAa,EAWb,CAAE,SAAQ,QAAO,SAAQ,gBAAc,SAAQ,SAAQ,UAAU,EAAmB,CACxF,aAAc,EACd,gBACA,UACA,UACA,kBACA,gBACA,aACA,YAAA,EAAA,EAAA,cAhBO,CAAE,MAAO,EAAa,OAAQ,CAAa,GAClD,CAAC,EAAa,CAAY,CAe1B,EACA,cAAA,EAAA,EAAA,cAbO,CAAE,MAAO,EAAW,OAAQ,CAAW,GAC9C,CAAC,EAAW,CAAU,CAYtB,EACA,cACF,CAAC,EAGK,IAAA,EAAA,EAAA,QAA0B,CAAS,GACzC,EAAA,EAAA,eAAgB,CACd,GAAI,KAAK,IAAI,EAAY,GAAiB,OAAO,EAAI,MAAO,CAC1D,GAAiB,QAAU,EAC3B,IAAM,EAAI,GAAQ,SAAS,EACrB,EAAe,GAAG,MACxB,GAAI,IAAiB,IAAA,IAAa,KAAK,IAAI,EAAY,CAAY,EAAI,MAAO,CAC5E,IAAM,GAAA,EAAA,EAAA,eAAuB,CAC3B,KAAM,EACN,aAAc,CAAE,MAAO,EAAW,OAAQ,CAAW,EACrD,YAAa,CAAE,MAAO,EAAa,OAAQ,CAAa,EACxD,OAAQ,CAAE,EAAG,GAAG,GAAK,EAAO,EAAG,EAAG,GAAG,GAAK,EAAO,CAAE,EACnD,MAAO,GAAG,OAAS,CACrB,CAAC,EACD,EAAO,EAAW,EAAO,EAAG,EAAO,CAAC,CACtC,CACF,CACF,EAAG,CAAC,EAAW,EAAQ,EAAU,EAAW,EAAY,EAAa,EAAc,CAAM,CAAC,EAG1F,GAAM,CAAE,gBAAiB,EAAgB,EAAQ,GAAe,CAC9D,WACA,WACA,aACA,aAAc,CAAE,MAAO,EAAW,OAAQ,CAAW,EACrD,YAAa,CAAE,MAAO,EAAa,OAAQ,CAAa,CAC1D,CAAC,GAED,EAAA,EAAA,eAAgB,CACd,GAAc,YAAY,CAAQ,CACpC,EAAG,CAAC,EAAU,CAAY,CAAC,GAE3B,EAAA,EAAA,eAAgB,CACV,GACF,GAAQ,iBAAiB,CAAa,CAE1C,EAAG,CAAC,EAAe,CAAM,CAAC,GAE1B,EAAA,EAAA,eAAgB,CACd,IAAM,EAAW,gBAAkB,CACjC,IAAM,EAAM,GAAc,eAAe,GAAK,UAC1C,IAAQ,GAAe,UACzB,GAAe,QAAU,EACzB,GAAe,CAAG,EAEtB,EAAG,GAAG,EACN,UAAa,cAAc,CAAQ,CACrC,EAAG,CAAC,CAAY,CAAC,EAGjB,IAAM,GAAA,EAAA,EAAA,QAA0B,IAAI,EAAA,aAAe,GACnD,EAAA,EAAA,eAAgB,CACd,IAAM,EAAK,EAAiB,QAC5B,EAAG,MAAM,EACT,IAAK,IAAM,KAAU,EACnB,EAAG,SAAS,CAAM,CAEtB,EAAG,CAAC,CAAO,CAAC,GAEZ,EAAA,EAAA,eAAgB,CACd,EAAiB,QAAQ,OAAO,CAC9B,cAAiB,CACf,QACA,OAAQ,CAAE,GAAG,CAAO,EACpB,MAAO,CACT,GACA,SACA,SACA,OAAQ,EAAY,IAAe,GAAQ,MAAM,EAAI,CAAE,EACvD,eACF,CAAC,CACH,EAAG,CAAC,EAAO,EAAQ,EAAQ,EAAQ,EAAQ,EAAY,CAAC,EAGxD,GAAM,CAAC,EAAY,KAAA,EAAA,EAAA,eAAA,EAAA,EAAA,aAAyD,CAAK,CAAC,EAE5E,IAAA,EAAA,EAAA,aACE,EAAW,OAAQ,GAAM,EAAE,cAAgB,KAAO,EAAE,UAAY,EAAK,EAC3E,CAAC,CAAU,CACb,EACM,IAAA,EAAA,EAAA,aACE,EAAW,OAAQ,GAAM,EAAE,cAAgB,KAAO,EAAE,UAAY,EAAK,EAC3E,CAAC,CAAU,CACb,EAEA,SAAS,GAAe,EAA8C,CACpE,IAAM,EAAW,EACX,EAAuB,CAAC,EAExB,EAAY,EAAS,OAAQ,GAAM,EAAE,cAAgB,GAAG,EAC9D,EAAS,EAAE,SAAS,EAAK,IAAQ,CAC3B,EAAM,EAAU,OAClB,EAAQ,KAAK,CAAE,GAAG,EAAU,GAAM,SAAU,CAAI,CAAC,EAEjD,EAAQ,KAAK,CACX,IAAA,EAAA,EAAA,gBAAmB,EACnB,YAAa,IACb,SAAU,EACV,QAAS,GACT,OAAQ,EACV,CAAC,CAEL,CAAC,EAED,IAAM,EAAY,EAAS,OAAQ,GAAM,EAAE,cAAgB,GAAG,EAC9D,EAAS,EAAE,SAAS,EAAK,IAAQ,CAC3B,EAAM,EAAU,OAClB,EAAQ,KAAK,CAAE,GAAG,EAAU,GAAM,SAAU,CAAI,CAAC,EAEjD,EAAQ,KAAK,CACX,IAAA,EAAA,EAAA,gBAAmB,EACnB,YAAa,IACb,SAAU,EACV,QAAS,GACT,OAAQ,EACV,CAAC,CAEL,CAAC,EAED,GAAc,CAAO,CACvB,EAGA,EAAA,EAAA,eAAgB,CACd,GAAe,CAAK,CACtB,EAAG,CAHc,KAAK,UAAU,CAG5B,CAAQ,CAAC,GAIb,EAAA,EAAA,eAAgB,CACd,GAAiB,CAAe,CAClC,EAAG,CAAC,CAAe,CAAC,EAMpB,IAAM,GAAiB,GAAsC,CAC3D,IAAM,EAAqB,CAAE,GAAG,EAAM,IAAA,EAAA,EAAA,gBAAmB,CAAE,EACrD,EAAO,CAAC,GAAG,EAAY,CAAO,EACpC,GAAc,CAAI,EAClB,EAAiB,QAAQ,aAAa,CAAE,KAAM,CAAQ,CAAC,EACvD,KAAA,EAAA,EAAA,aAA4B,CAAI,CAAC,CACnC,EAEM,IAAoB,EAAY,IAA2B,CAC/D,IAAM,EAAO,EAAW,KAAM,GAAM,EAAE,KAAO,CAAE,EAC/C,GAAI,CAAC,EAAM,OACX,IAAM,EAAO,EAAK,SACZ,EAAO,EAAW,IAAK,GAAO,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,UAAS,EAAI,CAAE,EACzE,GAAc,CAAI,EAClB,EAAiB,QAAQ,WAAW,CAAE,KAAM,CAAE,GAAG,EAAM,UAAS,EAAG,OAAM,GAAI,CAAS,CAAC,EACvF,KAAA,EAAA,EAAA,aAA4B,CAAI,CAAC,CACnC,EAEM,GAAoB,GAAqB,CAC7C,IAAM,EAAO,EAAW,KAAM,GAAM,EAAE,KAAO,CAAE,EACzC,EAAO,EAAW,OAAQ,GAAM,EAAE,KAAO,CAAE,EACjD,GAAc,CAAI,EACd,GACF,EAAiB,QAAQ,aAAa,CAAE,MAAK,CAAC,EAEhD,KAAA,EAAA,EAAA,aAA4B,CAAI,CAAC,CACnC,GAGA,EAAA,EAAA,eAAgB,CACd,KAAgB,CAAK,EACrB,IAAe,CAAE,QAAO,EAAG,EAAO,EAAG,EAAG,EAAO,CAAE,CAAC,CACpD,EAAG,CAAC,EAAO,EAAO,EAAG,EAAO,CAAC,CAAC,EAE9B,IAAM,GAAA,EAAA,EAAA,iBAA+D,CACnE,IAAM,EAAS,GAAc,SAAS,cAChC,EAAO,EAAS,EAAO,sBAAsB,EAAI,IAAI,QAAQ,EAAG,EAAG,EAAG,CAAC,EAC7E,MAAO,CAAE,EAAG,EAAK,MAAQ,EAAG,EAAG,EAAK,OAAS,CAAE,CACjD,EAAG,CAAC,CAAC,EAEC,IAAA,EAAA,EAAA,aAAqB,SAAY,CACrC,GAAM,CAAE,EAAG,EAAI,EAAG,GAAO,EAAiB,EACpC,EAAO,EACP,EAAK,EAAO,EAOd,MANkB,EAAiB,QAAQ,WAAW,CACxD,OACA,KACA,OAAQ,CAAE,EAAG,EAAI,EAAG,CAAG,EACvB,WAAc,CAAC,CACjB,CAAC,IAEC,EAAO,EAAU,EAAI,CAAE,EACvB,EAAiB,QAAQ,UAAU,CAAE,OAAM,KAAI,OAAQ,CAAE,EAAG,EAAI,EAAG,CAAG,CAAE,CAAC,EAE7E,EAAG,CAAC,EAAQ,EAAU,EAAkB,CAAK,CAAC,EAExC,IAAA,EAAA,EAAA,aAAsB,SAAY,CACtC,GAAM,CAAE,EAAG,EAAI,EAAG,GAAO,EAAiB,EACpC,EAAO,EACP,EAAK,EAAO,EAOd,MANkB,EAAiB,QAAQ,WAAW,CACxD,OACA,KACA,OAAQ,CAAE,EAAG,EAAI,EAAG,CAAG,EACvB,WAAc,CAAC,CACjB,CAAC,IAEC,EAAO,CAAC,EAAU,EAAI,CAAE,EACxB,EAAiB,QAAQ,UAAU,CAAE,OAAM,KAAI,OAAQ,CAAE,EAAG,EAAI,EAAG,CAAG,CAAE,CAAC,EAE7E,EAAG,CAAC,EAAQ,EAAU,EAAkB,CAAK,CAAC,EAExC,OAA0B,CAC9B,IAAM,EAAO,CAAC,EACd,GAAiB,CAAI,EACrB,KAAsB,CAAI,CAC5B,EAEM,IAAA,EAAA,EAAA,aACH,GAAmB,CAClB,GAAc,YAAY,CAAI,CAChC,EACA,CAAC,CAAY,CACf,EAEM,IAAA,EAAA,EAAA,aACJ,KAAO,IAAmB,CACxB,IAAM,EACJ,EAAa,KAAM,GAAM,GAAK,CAAM,GAAK,EAAa,EAAa,OAAS,GACxE,CAAE,EAAG,EAAI,EAAG,GAAO,EAAiB,EACpC,EAAO,EAOT,MANkB,EAAiB,QAAQ,WAAW,CACxD,OACA,GAAI,EACJ,OAAQ,CAAE,EAAG,EAAI,EAAG,CAAG,EACvB,WAAc,CAAC,CACjB,CAAC,IAEC,EAAO,EAAQ,EAAI,CAAE,EACrB,EAAiB,QAAQ,UAAU,CAAE,OAAM,GAAI,EAAQ,OAAQ,CAAE,EAAG,EAAI,EAAG,CAAG,CAAE,CAAC,EAErF,EACA,CAAC,EAAQ,EAAkB,CAAK,CAClC,GAEA,EAAA,EAAA,qBAAoB,QAAY,CAC9B,SACA,SACA,UACA,WACA,gBACA,eACA,eACF,EAAE,EAEF,IAAM,IAAA,EAAA,EAAA,cACG,CACL,gBAAiB,EACb,OAAO,IAAW,EAAM,GACxB,OAAO,GAAgB,EAAW,GACtC,MAAO,GAAG,EAAM,IAChB,OAAQ,GAAG,EAAM,IACjB,YAAa,aAAa,EAAc,cACxC,aAAc,aAAa,EAAc,aAC3C,GACC,CAAC,EAAe,GAAS,EAAc,EAAe,CAAK,CAAC,EAEzD,IAAA,EAAA,EAAA,cACG,CACL,WAAY,EAAc,QAC1B,MAAO,EAAY,KACnB,OAAQ,EAAa,KACrB,KAAM,EACN,IAAK,CACP,GACC,CAAC,EAAY,EAAW,CAAa,CAAC,EAGnC,CAAC,GAAa,IAAe,EAAA,QAAM,SAAS,QAAQ,EAAQ,EAAE,QACjE,EAAuD,IAA2B,CACjF,GAAI,OAAO,GAAU,WACnB,EAAI,GAAK,OACJ,GAAI,EAAA,QAAM,eAAe,CAAK,EAAG,CACtC,IAAM,EAAK,EACP,EAAG,MAAM,OAAS,UACpB,EAAI,GAAK,EAET,EAAI,GAAK,CAEb,MACE,EAAI,GAAK,EAEX,OAAO,CACT,EACA,CAAC,KAAM,IAAI,CACb,EAEM,IAAA,EAAA,EAAA,cACG,CACL,QACA,SACA,WACA,eACF,GACA,CAAC,EAAO,EAAQ,EAAU,CAAa,CACzC,EAEM,IAAA,EAAA,EAAA,cACG,CACL,UACA,WACA,SACA,eACA,gBACA,gBAAiB,EACnB,GACA,CAAC,GAAQ,GAAS,GAAO,GAAa,GAAc,EAAiB,CACvE,EAEA,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,eAAe,IAAK,YAAnC,CACG,KACC,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gCACZ,OAAO,IAAgB,WACnB,GAAoB,CAAE,MAAO,GAAc,MAAO,EAAa,CAAC,EACjE,EACD,CAAA,GAEP,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,qBAAuB,GAAa,MAAO,aACzD,EAAA,EAAA,KAAC,MAAD,CACE,IAAK,GACL,UAAW,cAAgB,GAC3B,MAAO,CACL,MAAO,EAAc,KACrB,OAAQ,EAAe,KACvB,UAAW,UAAU,EAAM,UAAU,EAAM,IAAI,EAAO,EAAE,IAAI,EAAO,EAAE,GACrE,gBAAiB,KACnB,WAEC,EACE,CAAA,CACF,CAAA,EACJ,IACC,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,GACV,MAAO,EACP,OAAQ,EACD,QACA,QACC,SACR,MAAO,GACP,QAAS,EACM,gBACf,YAAa,EAAO,EACpB,aAAc,EAAO,MACrB,WAAY,EACI,iBACH,cACC,eACD,eACH,WACV,UAAW,GACX,aAAc,GACd,aAAc,EACf,CAAA,EAEF,IACC,EAAA,EAAA,KAAC,EAAD,CACE,SAAU,GACV,MAAO,EACP,OAAQ,EACD,QACA,QACC,SACR,MAAO,GACP,QAAS,EACM,gBACf,YAAa,EAAO,EACpB,aAAc,EAAO,OACrB,WAAY,EACI,iBACH,cACC,eACD,eACH,WACV,UAAW,GACX,aAAc,GACd,aAAc,EACf,CAAA,EAEF,IAAa,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,SAAS,MAAO,GAAa,QAAS,EAAoB,CAAA,CAClF,GAET,CACF,EC5fM,GAAmC,CACvC,eACA,gBACA,YACA,YACA,gBACA,iBACA,QACA,QAAQ,IACR,SAAS,IACT,aACA,cACA,eACI,CACJ,IAAM,GAAA,EAAA,EAAA,QAA6C,IAAI,EACjD,CAAC,EAAU,IAAA,EAAA,EAAA,UAAwB,EAAK,EACxC,GAAA,EAAA,EAAA,QAAqB,CAAE,KAAM,EAAG,IAAK,EAAG,MAAO,EAAG,OAAQ,CAAE,CAAC,EAE7D,GAAA,EAAA,EAAA,aAEF,IAAI,EAAA,cAAc,CAChB,eACA,gBACA,YACA,YACA,gBACA,iBACA,QACA,QACA,QACF,CAAC,EACH,CACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,CACF,EAEM,GAAA,EAAA,EAAA,aAAsB,EAAO,SAAS,EAAG,CAAC,CAAM,CAAC,EAEjD,GAAA,EAAA,EAAA,iBAAgC,CACpC,IAAM,EAAS,EAAU,QACzB,GAAI,CAAC,EAAQ,OACb,IAAM,EAAM,EAAO,WAAW,IAAI,EAClC,GAAI,CAAC,EAAK,OAEV,EAAI,UAAU,EAAG,EAAG,EAAO,CAAM,EACjC,EAAI,UAAY,OAChB,EAAI,SAAS,EAAG,EAAG,EAAO,CAAM,EAEhC,IAAM,EAAI,EAAM,UACV,EAAK,EAAe,EACpB,EAAK,EAAgB,EACrB,GAAM,EAAQ,GAAM,EACpB,GAAM,EAAS,GAAM,EAE3B,EAAI,YAAc,UAClB,EAAI,UAAY,EAChB,EAAI,WAAW,EAAI,EAAI,EAAI,CAAE,CAC/B,EAAG,CAAC,EAAM,UAAW,EAAO,EAAQ,EAAc,CAAa,CAAC,GAEhE,EAAA,EAAA,eAAgB,CACd,EAAY,CACd,EAAG,CAAC,CAAW,CAAC,EAEhB,IAAM,GAAA,EAAA,EAAA,aACH,GAA6C,CAC5C,GAAI,CAAC,EAAO,OAAO,EAAG,CACpB,EAAU,EAAG,SAAU,EAAK,EAC5B,MACF,CACA,EAAU,EAAG,SAAU,EAAI,CAC7B,EACA,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,aACH,GAA0C,CACzC,EAAE,gBAAgB,EACb,EAAO,OAAO,GACnB,EAAU,EAAG,WAAY,EAAI,CAC/B,EACA,CAAC,CAAM,CACT,EAEM,GAAA,EAAA,EAAA,cACH,EAAoC,EAA+B,IAAqB,CACvF,IAAM,EAAS,EAAE,cACjB,EAAO,kBAAkB,EAAE,SAAS,EAEpC,IAAM,EAAO,EAAU,QAAS,sBAAsB,EAChD,EAAa,EAAO,SAAS,EAE/B,EAAQ,EACR,EAAQ,EACR,EAAW,GACX,EAAY,GAEZ,EAAiB,EACjB,EAAiB,EACjB,EAA2B,KAEzB,EAAU,EAAO,UACrB,EACA,EACA,EAAW,aAAa,KACxB,EAAW,aAAa,GAC1B,EAEA,SAAS,GAAe,CAClB,IAAc,OAClB,EAAY,0BAA4B,CACtC,EAAY,KACZ,IAAa,EAAgB,CAAc,CAC7C,CAAC,EACH,CAEI,IACF,EAAY,QAAU,CAAE,GAAG,EAAW,YAAa,EACnD,EAAY,EAAI,EAChB,IAAc,GAGhB,IAAM,EAAU,GAAqB,CAWnC,GAVA,GAAS,EAAG,UACZ,GAAS,EAAG,WAER,KAAK,IAAI,CAAK,EAAI,GAAK,KAAK,IAAI,CAAK,EAAI,KAC3C,EAAY,GACR,CAAC,GAAY,IACf,EAAW,KAIX,EAAS,CACX,IAAM,EAAS,EAAQ,KAAK,EAAO,CAAK,EACxC,EAAY,QAAU,EAAO,SAC7B,EAAiB,EAAO,QACxB,EAAiB,EAAO,QACxB,EAAa,CACf,CACF,EAEM,EAAQ,GAAqB,CAWjC,GAVA,EAAO,sBAAsB,EAAG,SAAS,EACzC,EAAO,oBAAoB,cAAe,CAAM,EAChD,EAAO,oBAAoB,YAAa,CAAI,EAC5C,EAAO,oBAAoB,gBAAiB,CAAI,EAE5C,IAAc,OAChB,qBAAqB,CAAS,EAC9B,EAAY,MAGV,EAAS,CACX,IAAM,EAAY,EAAQ,IAAI,EAAO,CAAK,EAC1C,IAAa,EAAU,EAAG,EAAU,CAAC,EACrC,eAAiB,CACf,EAAY,EAAK,EACjB,IAAY,CACd,EAAG,EAAE,CACP,MAAO,GAAI,CAAC,GAAa,IAAW,SAAU,CAC5C,IAAM,EAAM,EAAO,QAAQ,EAAG,QAAS,EAAG,QAAS,EAAK,KAAM,EAAK,GAAG,EACtE,IAAa,EAAI,EAAG,EAAI,CAAC,CAC3B,CACF,EAEA,EAAO,iBAAiB,cAAe,CAAM,EAC7C,EAAO,iBAAiB,YAAa,CAAI,EACzC,EAAO,iBAAiB,gBAAiB,CAAI,CAC/C,EACA,CAAC,EAAQ,EAAW,EAAW,EAAY,EAAa,CAAS,CACnE,EAEM,GAAA,EAAA,EAAA,cACG,CACL,MAAO,EAAQ,KACf,OAAQ,EAAS,KACjB,SAAU,WACV,OAAQ,oBACR,aAAc,MACd,SAAU,SACV,WAAY,OACZ,UAAW,+BACb,GACA,CAAC,EAAO,CAAM,CAChB,EAEM,EAAc,EAAW,EAAY,QAAU,EAAM,aACrD,GAAA,EAAA,EAAA,cACG,CACL,SAAU,WACV,KAAM,EAAY,KAAO,KACzB,IAAK,EAAY,IAAM,KACvB,MAAO,EAAY,MAAQ,KAC3B,OAAQ,EAAY,OAAS,KAC7B,OAAQ,oBACR,WAAY,2BACZ,OAAQ,OACR,cAAe,OACf,UAAW,aACX,WAAY,0BACd,GACA,CAAC,CAAW,CACd,EAEA,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,MAAO,WAAZ,EACE,EAAA,EAAA,KAAC,SAAD,CACE,IAAK,EACL,MAAO,CAAE,QAAS,QAAS,MAAO,OAAQ,OAAQ,MAAO,EAClD,QACC,SACR,cAAe,CAChB,CAAA,GACD,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,EAAe,cAAe,CAA4B,CAAA,CACnE,GAET,EC/OA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACA,EACA,CACA,OAAA,EAAA,EAAA,cASS,CACL,OAAA,EAAA,EAAA,mBAT8B,CAC9B,QACA,SACA,eACA,QACA,aACA,gBACF,CAEE,EACA,eAAA,EAAA,EAAA,eAA6B,CAAK,CACpC,GACC,CAAC,EAAO,EAAQ,EAAc,EAAO,EAAY,CAAc,CAAC,CACrE,CCnBA,IAAM,EAAuB,EAAA,YACvB,EAAuB,EAAA,YAS7B,SAAgB,EACd,EACA,EACA,EACA,EACA,EACA,CACA,IAAM,EAAe,IAAuB,IAAA,GAGtC,GAAA,EAAA,EAAA,QAAqB,EAAE,EACvB,CAAC,EAAc,IAAA,EAAA,EAAA,cACf,IACA,EAAsB,EAAqB,CAAa,EACrD,CAAC,EACT,EAEK,GAAA,EAAA,EAAA,aAA6B,CACjC,GAAI,IAAuB,IAAA,GAAW,OAAO,EAC7C,GAAI,IAAkB,IAAA,GAAW,CAC/B,IAAM,EAAM,KAAK,UAAU,CAAa,EACxC,GAAI,IAAQ,EAAY,QAEtB,MADA,GAAY,QAAU,EACf,EAAqB,CAAa,CAE7C,CACA,OAAO,CACT,EAAG,CAAC,EAAoB,EAAe,CAAY,CAAC,EAE9C,GAAA,EAAA,EAAA,aACH,GAAsB,CACrB,IAAoB,CAAI,EACxB,IAAa,EAAqB,CAAI,CAAC,CACzC,EACA,CAAC,EAAmB,CAAU,CAChC,EAuCA,MAAO,CACL,WAAY,EACZ,SAAA,EAAA,EAAA,aAtCC,GAAgC,CAC/B,IAAM,EAAqB,CAAE,GAAG,EAAM,IAAA,EAAA,EAAA,gBAAmB,CAAE,EACrD,EAAO,CAAC,GAAG,EAAc,CAAO,EAItC,OAHK,GAAc,EAAgB,CAAI,EACvC,EAAO,CAAI,EACX,GAAW,eAAe,CAAO,EAC1B,CACT,EACA,CAAC,EAAc,EAAc,EAAQ,CAAS,CA8B9C,EACA,YAAA,EAAA,EAAA,aA3BC,GAAe,CACd,IAAM,EAAO,EAAa,KAAM,GAAiB,EAAE,KAAO,CAAE,EACtD,EAAO,EAAa,OAAQ,GAAM,EAAE,KAAO,CAAE,EAC9C,GAAc,EAAgB,CAAI,EACvC,EAAO,CAAI,EACP,GAAM,GAAW,eAAe,CAAI,CAC1C,EACA,CAAC,EAAc,EAAc,EAAQ,CAAS,CAoB9C,EACA,YAAA,EAAA,EAAA,cAjBC,EAAY,IAAqB,CAChC,IAAM,EAAO,EAAa,KAAM,GAAM,EAAE,KAAO,CAAE,EAC3C,EAAO,GAAM,SACb,EAAO,EAAa,IAAK,GAAkB,EAAE,KAAO,EAAK,CAAE,GAAG,EAAG,UAAS,EAAI,CAAE,EACjF,GAAc,EAAgB,CAAI,EACvC,EAAO,CAAI,EACP,GAAQ,IAAS,IAAA,IACnB,GAAW,aAAa,EAAM,EAAM,CAAQ,CAEhD,EACA,CAAC,EAAc,EAAc,EAAQ,CAAS,CAO9C,CACF,CACF,CCpEA,SAAgB,EAAe,EAAiC,CAAC,EAAG,CAClE,GAAM,CACJ,QAAQ,KACR,SAAS,IACT,cAAc,IACd,eAAe,IACf,QAAQ,GACR,MAAO,EAAe,EACtB,UACA,MAAO,EAAe,CAAE,EAAG,CAAC,EAAG,EAAG,CAAC,CAAE,EACrC,gBAAgB,EAChB,WAAW,GACX,UAAU,GACV,UAAU,GACV,WAAW,IACX,aAAa,GACb,YAAY,GACZ,gBACA,kBAAkB,IAChB,EAEE,EAAY,EACZ,EAAa,EAEb,CAAE,SAAQ,QAAO,SAAQ,eAAc,QAAO,SAAQ,SAAQ,SAAU,EAAmB,CACjF,eACd,cAAe,EAAgB,CAAE,EAAG,EAAc,EAAG,EAAG,EAAc,CAAE,EAAI,CAAE,EAAG,EAAG,EAAG,CAAE,EACzF,UACA,UACA,kBACA,aACA,WAAY,CAAE,MAAO,EAAa,OAAQ,CAAa,EACvD,aAAc,CAAE,MAAO,EAAW,OAAQ,CAAW,EACrD,aAAc,EAChB,CAAC,EAEK,CAAC,EAAU,IAAA,EAAA,EAAA,UAAuC,SAAS,EAE3D,CAAE,aAAY,UAAS,aAAY,cAAe,EAAc,IAAA,GAAW,CAAY,EA0C7F,MAAO,CACL,SACA,QACA,SACA,YACA,aACA,WACA,aACA,iBAAA,EAAA,EAAA,aA/CM,EAAW,OAAQ,GAAM,EAAE,cAAgB,KAAO,EAAE,UAAY,EAAK,EAC3E,CAAC,CAAU,CA8CX,EACA,eAAA,EAAA,EAAA,aA5CM,EAAW,OAAQ,GAAM,EAAE,cAAgB,KAAO,EAAE,UAAY,EAAK,EAC3E,CAAC,CAAU,CA2CX,EACA,YAAA,EAAA,EAAA,cAxCO,CACL,QAAS,UACT,UAAW,UACX,WAAY,UACZ,eAAgB,UAChB,qBAAsB,UACtB,QAAS,OACT,WAAY,OACZ,YAAa,UACb,YAAa,UACb,GAAG,CACL,GACC,CAAC,CAAO,CA4BT,EACA,eACA,QACA,SACA,SACA,QAAA,EAAA,EAAA,iBA/B+B,CAG/B,EAAO,EAFI,EAAY,EACZ,EAAa,CACD,CACzB,EAAG,CAAC,EAAQ,EAAU,EAAW,CAAU,CA2BzC,EACA,SAAA,EAAA,EAAA,iBA1BgC,CAChC,IAAM,EAAK,EAAY,EACjB,EAAK,EAAa,EACxB,EAAO,CAAC,EAAU,EAAI,CAAE,CAC1B,EAAG,CAAC,EAAQ,EAAU,EAAW,CAAU,CAsBzC,EACA,QACA,aAAA,EAAA,EAAA,aAtB+B,GAAmB,CAClD,EAAiB,CAAI,CACvB,EAAG,CAAC,CAoBF,EACA,UACA,aACA,YACF,CACF,CCvHA,SAAgB,EACd,EACA,EACA,EACA,EAAuB,CAAC,EACxB,CACA,GAAM,CAAE,YAAY,EAAG,WAAW,IAAQ,EAEpC,GAAA,EAAA,EAAA,aACG,EAAW,OAAQ,GAAM,EAAE,UAAY,EAAK,EAAE,IAAK,GAAM,EAAE,QAAQ,EACzE,CAAC,CAAU,CAAC,EAET,GAAA,EAAA,EAAA,aACG,IAAI,EAAA,WAAW,CACpB,YACA,QACA,WACA,mBACA,MAAO,CACT,CAAC,EACA,CAAC,EAAW,EAAO,EAAU,EAAkB,CAAU,CAAC,EAQ7D,MAAO,CAAE,QANO,EAAmB,IAA4C,CAE7E,IAAM,GAAY,GADA,IAAc,IAAM,EAAO,EAAI,EAAO,IACb,EAC3C,OAAO,EAAO,KAAK,EAAU,CAAS,CACxC,EAEiB,QAAO,CAC1B,CChBA,SAAgB,EACd,EAC0C,CAC1C,MAAQ,IAAsB,EAAQ,CAAO,CAC/C"}