{"version":3,"file":"index.cjs","sources":["../../src/lib/reducer.ts","../../src/shared/hooks/use-layout-analysis.ts","../../src/shared/components/layout-analysis-layer.tsx"],"sourcesContent":["import { Reducer } from '@embedpdf/core';\nimport { LayoutAnalysisState } from './types';\nimport {\n  LayoutAnalysisAction,\n  INIT_LAYOUT_STATE,\n  CLEANUP_LAYOUT_STATE,\n  SET_PAGE_STATUS,\n  SET_PAGE_LAYOUT,\n  SET_PAGE_ERROR,\n  SET_LAYOUT_OVERLAY_VISIBLE,\n  SET_TABLE_STRUCTURE_OVERLAY_VISIBLE,\n  SET_TABLE_STRUCTURE_ENABLED,\n  SET_LAYOUT_THRESHOLD,\n  SET_TABLE_STRUCTURE_THRESHOLD,\n  SELECT_BLOCK,\n  SET_PAGE_TABLE_STRUCTURES,\n  CLEAR_PAGE_RESULTS,\n  CLEAR_ALL_RESULTS,\n} from './actions';\n\nexport const initialState: LayoutAnalysisState = {\n  documents: {},\n  layoutOverlayVisible: true,\n  tableStructureOverlayVisible: true,\n  tableStructureEnabled: false,\n  selectedBlockId: null,\n  layoutThreshold: 0.35,\n  tableStructureThreshold: 0.8,\n};\n\nexport const reducer: Reducer<LayoutAnalysisState, LayoutAnalysisAction> = (\n  state = initialState,\n  action,\n) => {\n  switch (action.type) {\n    case INIT_LAYOUT_STATE: {\n      const { documentId } = action.payload;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { pages: {} },\n        },\n      };\n    }\n\n    case CLEANUP_LAYOUT_STATE: {\n      const docId = action.payload;\n      const { [docId]: _, ...rest } = state.documents;\n      return { ...state, documents: rest };\n    }\n\n    case SET_PAGE_STATUS: {\n      const { documentId, pageIndex, status } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const page = doc.pages[pageIndex] ?? {\n        status: 'idle',\n        layout: null,\n        error: null,\n        tableStructureAnalyzed: false,\n      };\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: { ...page, status },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_PAGE_LAYOUT: {\n      const { documentId, pageIndex, layout } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: {\n                status: 'complete',\n                layout,\n                error: null,\n                tableStructureAnalyzed: false,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_PAGE_ERROR: {\n      const { documentId, pageIndex, error } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: { status: 'error', layout: null, error, tableStructureAnalyzed: false },\n            },\n          },\n        },\n      };\n    }\n\n    case CLEAR_PAGE_RESULTS: {\n      const { documentId, pageIndex } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const { [pageIndex]: _, ...restPages } = doc.pages;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { ...doc, pages: restPages },\n        },\n      };\n    }\n\n    case CLEAR_ALL_RESULTS: {\n      const { documentId } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { ...doc, pages: {} },\n        },\n      };\n    }\n\n    case SET_PAGE_TABLE_STRUCTURES: {\n      const { documentId, pageIndex, tableStructures } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const page = doc.pages[pageIndex];\n      if (!page?.layout) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: {\n                ...page,\n                layout: { ...page.layout, tableStructures },\n                tableStructureAnalyzed: true,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_LAYOUT_OVERLAY_VISIBLE:\n      return { ...state, layoutOverlayVisible: action.payload };\n\n    case SET_TABLE_STRUCTURE_OVERLAY_VISIBLE:\n      return { ...state, tableStructureOverlayVisible: action.payload };\n\n    case SET_TABLE_STRUCTURE_ENABLED:\n      return { ...state, tableStructureEnabled: action.payload };\n\n    case SET_LAYOUT_THRESHOLD:\n      return { ...state, layoutThreshold: action.payload };\n\n    case SET_TABLE_STRUCTURE_THRESHOLD:\n      return { ...state, tableStructureThreshold: action.payload };\n\n    case SELECT_BLOCK:\n      return { ...state, selectedBlockId: action.payload };\n\n    default:\n      return state;\n  }\n};\n","import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { useState, useEffect, useMemo } from '@framework';\nimport {\n  LayoutAnalysisPlugin,\n  LayoutAnalysisState,\n  PageAnalysisState,\n} from '@embedpdf/plugin-layout-analysis';\nimport { initialState } from '../../lib/reducer';\n\nexport const useLayoutAnalysisPlugin = () =>\n  usePlugin<LayoutAnalysisPlugin>(LayoutAnalysisPlugin.id);\nexport const useLayoutAnalysisCapability = () =>\n  useCapability<LayoutAnalysisPlugin>(LayoutAnalysisPlugin.id);\n\nexport const useLayoutAnalysis = (documentId: string) => {\n  const { provides } = useLayoutAnalysisCapability();\n  const [state, setState] = useState<LayoutAnalysisState>(initialState);\n\n  const scope = useMemo(() => provides?.forDocument(documentId), [provides, documentId]);\n\n  useEffect(() => {\n    if (!scope) return;\n    setState(scope.getState());\n    return scope.onStateChange((newState) => {\n      setState(newState);\n    });\n  }, [scope]);\n\n  const pages: Record<number, PageAnalysisState> = state.documents[documentId]?.pages ?? {};\n\n  return {\n    pages,\n    layoutOverlayVisible: state.layoutOverlayVisible,\n    tableStructureOverlayVisible: state.tableStructureOverlayVisible,\n    tableStructureEnabled: state.tableStructureEnabled,\n    layoutThreshold: state.layoutThreshold,\n    tableStructureThreshold: state.tableStructureThreshold,\n    selectedBlockId: state.selectedBlockId,\n    scope,\n    provides,\n  };\n};\n","import { useEffect, useState, useMemo, useCallback } from '@framework';\nimport type { CSSProperties } from '@framework';\n\nimport { useDocumentState } from '@embedpdf/core/@framework';\n\nimport { useLayoutAnalysisCapability } from '../hooks/use-layout-analysis';\nimport {\n  PageLayout,\n  LayoutAnalysisState,\n  LayoutBlock,\n  TableStructureElement,\n} from '@embedpdf/plugin-layout-analysis';\n\nexport interface LayoutAnalysisLayerProps {\n  documentId: string;\n  pageIndex: number;\n  scale?: number;\n  style?: CSSProperties;\n}\n\nconst CLASS_COLORS: Record<string, string> = {\n  text: 'rgba(59, 130, 246, 0.15)',\n  table: 'rgba(16, 185, 129, 0.15)',\n  image: 'rgba(245, 158, 11, 0.15)',\n  doc_title: 'rgba(139, 92, 246, 0.15)',\n  header: 'rgba(236, 72, 153, 0.15)',\n  footer: 'rgba(107, 114, 128, 0.15)',\n  formula: 'rgba(6, 182, 212, 0.15)',\n  chart: 'rgba(249, 115, 22, 0.15)',\n  abstract: 'rgba(168, 85, 247, 0.15)',\n  paragraph_title: 'rgba(99, 102, 241, 0.15)',\n  reference: 'rgba(75, 85, 99, 0.15)',\n};\n\nconst CLASS_BORDER_COLORS: Record<string, string> = {\n  text: 'rgba(59, 130, 246, 0.7)',\n  table: 'rgba(16, 185, 129, 0.7)',\n  image: 'rgba(245, 158, 11, 0.7)',\n  doc_title: 'rgba(139, 92, 246, 0.7)',\n  header: 'rgba(236, 72, 153, 0.7)',\n  footer: 'rgba(107, 114, 128, 0.7)',\n  formula: 'rgba(6, 182, 212, 0.7)',\n  chart: 'rgba(249, 115, 22, 0.7)',\n  abstract: 'rgba(168, 85, 247, 0.7)',\n  paragraph_title: 'rgba(99, 102, 241, 0.7)',\n  reference: 'rgba(75, 85, 99, 0.7)',\n};\n\nconst TABLE_STRUCTURE_COLOR = 'rgba(234, 88, 12, 0.12)';\nconst TABLE_STRUCTURE_BORDER = 'rgba(234, 88, 12, 0.5)';\n\nfunction getColorForLabel(label: string): string {\n  return CLASS_COLORS[label] ?? `hsla(${hashCode(label) % 360}, 70%, 50%, 0.15)`;\n}\n\nfunction getBorderColorForLabel(label: string): string {\n  return CLASS_BORDER_COLORS[label] ?? `hsla(${hashCode(label) % 360}, 70%, 50%, 0.7)`;\n}\n\nfunction hashCode(str: string): number {\n  let hash = 0;\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash * 31 + str.charCodeAt(i)) | 0;\n  }\n  return Math.abs(hash);\n}\n\nexport function LayoutAnalysisLayer({\n  documentId,\n  pageIndex,\n  scale: scaleOverride,\n  style,\n}: LayoutAnalysisLayerProps) {\n  const { provides: layoutAnalysis } = useLayoutAnalysisCapability();\n  const documentState = useDocumentState(documentId);\n  const [layout, setLayout] = useState<PageLayout | null>(null);\n  const [pluginState, setPluginState] = useState<LayoutAnalysisState | null>(null);\n\n  const scope = useMemo(\n    () => layoutAnalysis?.forDocument(documentId),\n    [layoutAnalysis, documentId],\n  );\n\n  const actualScale = useMemo(() => {\n    if (scaleOverride !== undefined) return scaleOverride;\n    return documentState?.scale ?? 1;\n  }, [scaleOverride, documentState?.scale]);\n\n  useEffect(() => {\n    if (!scope) {\n      setLayout(null);\n      setPluginState(null);\n      return;\n    }\n    setLayout(scope.getPageLayout(pageIndex));\n    setPluginState(scope.getState());\n\n    const unsub1 = scope.onPageLayoutChange((event) => {\n      if (event.pageIndex === pageIndex) {\n        setLayout(event.layout);\n      }\n    });\n\n    const unsub2 = scope.onStateChange((state) => {\n      setPluginState(state);\n    });\n\n    return () => {\n      unsub1();\n      unsub2();\n    };\n  }, [scope, pageIndex]);\n\n  const layoutOverlayVisible = pluginState?.layoutOverlayVisible ?? true;\n  const tableStructureOverlayVisible = pluginState?.tableStructureOverlayVisible ?? true;\n  const layoutThreshold = pluginState?.layoutThreshold ?? 0.35;\n  const tableStructureThreshold = pluginState?.tableStructureThreshold ?? 0.8;\n  const selectedBlockId = pluginState?.selectedBlockId ?? null;\n\n  const filteredBlocks = useMemo(() => {\n    if (!layout || !layoutOverlayVisible) return [];\n    return layout.blocks.filter((block) => block.score >= layoutThreshold);\n  }, [layout, layoutOverlayVisible, layoutThreshold]);\n\n  const handleBlockClick = useCallback(\n    (blockId: string) => {\n      layoutAnalysis?.selectBlock(selectedBlockId === blockId ? null : blockId);\n    },\n    [layoutAnalysis, selectedBlockId],\n  );\n\n  if (!layout || (!layoutOverlayVisible && !tableStructureOverlayVisible)) {\n    return null;\n  }\n\n  const containerStyle: CSSProperties = {\n    pointerEvents: 'none',\n    ...style,\n  };\n\n  return (\n    <div style={containerStyle} data-layout-analysis-layer=\"\">\n      {filteredBlocks.map((block) => (\n        <BlockOverlay\n          key={block.id}\n          block={block}\n          scale={actualScale}\n          isSelected={selectedBlockId === block.id}\n          onClick={handleBlockClick}\n        />\n      ))}\n\n      {tableStructureOverlayVisible &&\n        layout.tableStructures &&\n        Array.from(layout.tableStructures.entries())\n          .filter(([blockId]) => {\n            const parent = layout.blocks.find((b) => b.id === blockId);\n            return parent && parent.score >= layoutThreshold;\n          })\n          .map(([blockId, elements]) =>\n            elements\n              .filter((el) => el.score >= tableStructureThreshold)\n              .map((el, idx) => (\n                <TableStructureOverlay\n                  key={`ts-${blockId}-${idx}`}\n                  element={el}\n                  scale={actualScale}\n                />\n              )),\n          )}\n    </div>\n  );\n}\n\nfunction BlockOverlay({\n  block,\n  scale,\n  isSelected,\n  onClick,\n}: {\n  block: LayoutBlock;\n  scale: number;\n  isSelected: boolean;\n  onClick: (id: string) => void;\n}) {\n  const blockStyle: CSSProperties = {\n    position: 'absolute',\n    left: block.rect.origin.x * scale,\n    top: block.rect.origin.y * scale,\n    width: block.rect.size.width * scale,\n    height: block.rect.size.height * scale,\n    backgroundColor: getColorForLabel(block.label),\n    border: `1.5px solid ${getBorderColorForLabel(block.label)}`,\n    boxSizing: 'border-box',\n    pointerEvents: 'auto',\n    cursor: 'pointer',\n    opacity: isSelected ? 1 : 0.8,\n    outline: isSelected ? '2px solid #3b82f6' : 'none',\n    transition: 'opacity 0.15s',\n  };\n\n  const labelStyle: CSSProperties = {\n    position: 'absolute',\n    top: '-18px',\n    left: '0',\n    fontSize: '10px',\n    lineHeight: '16px',\n    padding: '0 4px',\n    backgroundColor: getBorderColorForLabel(block.label),\n    color: '#fff',\n    borderRadius: '2px',\n    whiteSpace: 'nowrap',\n    pointerEvents: 'none',\n  };\n\n  return (\n    <div\n      style={blockStyle}\n      data-block-id={block.id}\n      data-block-label={block.label}\n      onClick={() => onClick(block.id)}\n    >\n      <span style={labelStyle}>\n        {block.label} {(block.score * 100).toFixed(0)}%\n      </span>\n    </div>\n  );\n}\n\nfunction TableStructureOverlay({\n  element,\n  scale,\n}: {\n  element: TableStructureElement;\n  scale: number;\n}) {\n  const elStyle: CSSProperties = {\n    position: 'absolute',\n    left: element.rect.origin.x * scale,\n    top: element.rect.origin.y * scale,\n    width: element.rect.size.width * scale,\n    height: element.rect.size.height * scale,\n    backgroundColor: TABLE_STRUCTURE_COLOR,\n    border: `1px dashed ${TABLE_STRUCTURE_BORDER}`,\n    boxSizing: 'border-box',\n    pointerEvents: 'none',\n  };\n\n  return <div style={elStyle} data-table-element={element.label} />;\n}\n"],"names":["initialState","documents","layoutOverlayVisible","tableStructureOverlayVisible","tableStructureEnabled","selectedBlockId","layoutThreshold","tableStructureThreshold","useLayoutAnalysisCapability","useCapability","LayoutAnalysisPlugin","id","CLASS_COLORS","text","table","image","doc_title","header","footer","formula","chart","abstract","paragraph_title","reference","CLASS_BORDER_COLORS","getBorderColorForLabel","label","hashCode","str","hash","i","length","charCodeAt","Math","abs","BlockOverlay","block","scale","isSelected","onClick","blockStyle","position","left","rect","origin","x","top","y","width","size","height","backgroundColor","border","boxSizing","pointerEvents","cursor","opacity","outline","transition","labelStyle","fontSize","lineHeight","padding","color","borderRadius","whiteSpace","jsx","style","children","jsxs","score","toFixed","TableStructureOverlay","element","elStyle","documentId","pageIndex","scaleOverride","provides","layoutAnalysis","documentState","useDocumentState","layout","setLayout","useState","pluginState","setPluginState","scope","useMemo","forDocument","actualScale","useEffect","getPageLayout","getState","unsub1","onPageLayoutChange","event","unsub2","onStateChange","state","filteredBlocks","blocks","filter","handleBlockClick","useCallback","blockId","selectBlock","containerStyle","map","tableStructures","Array","from","entries","parent","find","b","elements","el","idx","setState","newState","pages","_a","usePlugin"],"mappings":"yPAoBaA,EAAoC,CAC/CC,UAAW,CAAA,EACXC,sBAAsB,EACtBC,8BAA8B,EAC9BC,uBAAuB,EACvBC,gBAAiB,KACjBC,gBAAiB,IACjBC,wBAAyB,IChBdC,EAA8B,IACzCC,gBAAoCC,EAAAA,qBAAqBC,ICQrDC,EAAuC,CAC3CC,KAAM,2BACNC,MAAO,2BACPC,MAAO,2BACPC,UAAW,2BACXC,OAAQ,2BACRC,OAAQ,4BACRC,QAAS,0BACTC,MAAO,2BACPC,SAAU,2BACVC,gBAAiB,2BACjBC,UAAW,0BAGPC,EAA8C,CAClDX,KAAM,0BACNC,MAAO,0BACPC,MAAO,0BACPC,UAAW,0BACXC,OAAQ,0BACRC,OAAQ,2BACRC,QAAS,yBACTC,MAAO,0BACPC,SAAU,0BACVC,gBAAiB,0BACjBC,UAAW,yBAUb,SAASE,EAAuBC,GAC9B,OAAOF,EAAoBE,IAAU,QAAQC,EAASD,GAAS,qBACjE,CAEA,SAASC,EAASC,GAChB,IAAIC,EAAO,EACX,IAAA,IAASC,EAAI,EAAGA,EAAIF,EAAIG,OAAQD,IAC9BD,EAAe,GAAPA,EAAYD,EAAII,WAAWF,GAAM,EAE3C,OAAOG,KAAKC,IAAIL,EAClB,CA6GA,SAASM,GAAaC,MACpBA,EAAAC,MACAA,EAAAC,WACAA,EAAAC,QACAA,IAOA,MAAMC,EAA4B,CAChCC,SAAU,WACVC,KAAMN,EAAMO,KAAKC,OAAOC,EAAIR,EAC5BS,IAAKV,EAAMO,KAAKC,OAAOG,EAAIV,EAC3BW,MAAOZ,EAAMO,KAAKM,KAAKD,MAAQX,EAC/Ba,OAAQd,EAAMO,KAAKM,KAAKC,OAASb,EACjCc,iBA5IsBzB,EA4IYU,EAAMV,MA3InCd,EAAac,IAAU,QAAQC,EAASD,GAAS,wBA4ItD0B,OAAQ,eAAe3B,EAAuBW,EAAMV,SACpD2B,UAAW,aACXC,cAAe,OACfC,OAAQ,UACRC,QAASlB,EAAa,EAAI,GAC1BmB,QAASnB,EAAa,oBAAsB,OAC5CoB,WAAY,iBAnJhB,IAA0BhC,EAsJxB,MAAMiC,EAA4B,CAChClB,SAAU,WACVK,IAAK,QACLJ,KAAM,IACNkB,SAAU,OACVC,WAAY,OACZC,QAAS,QACTX,gBAAiB1B,EAAuBW,EAAMV,OAC9CqC,MAAO,OACPC,aAAc,MACdC,WAAY,SACZX,cAAe,QAGjB,OACEY,EAAAA,IAAC,MAAA,CACCC,MAAO3B,EACP,gBAAeJ,EAAMzB,GACrB,mBAAkByB,EAAMV,MACxBa,QAAS,IAAMA,EAAQH,EAAMzB,IAE7ByD,SAAAC,EAAAA,KAAC,OAAA,CAAKF,MAAOR,EACVS,SAAA,CAAAhC,EAAMV,MAAM,KAAiB,IAAdU,EAAMkC,OAAaC,QAAQ,GAAG,QAItD,CAEA,SAASC,GAAsBC,QAC7BA,EAAApC,MACAA,IAKA,MAAMqC,EAAyB,CAC7BjC,SAAU,WACVC,KAAM+B,EAAQ9B,KAAKC,OAAOC,EAAIR,EAC9BS,IAAK2B,EAAQ9B,KAAKC,OAAOG,EAAIV,EAC7BW,MAAOyB,EAAQ9B,KAAKM,KAAKD,MAAQX,EACjCa,OAAQuB,EAAQ9B,KAAKM,KAAKC,OAASb,EACnCc,gBAlM0B,0BAmM1BC,OAAQ,oCACRC,UAAW,aACXC,cAAe,QAGjB,aAAQ,MAAA,CAAIa,MAAOO,EAAS,qBAAoBD,EAAQ/C,OAC1D,6BAtLO,UAA6BiD,WAClCA,EAAAC,UACAA,EACAvC,MAAOwC,EAAAV,MACPA,IAEA,MAAQW,SAAUC,GAAmBvE,IAC/BwE,EAAgBC,EAAAA,iBAAiBN,IAChCO,EAAQC,GAAaC,EAAAA,SAA4B,OACjDC,EAAaC,GAAkBF,EAAAA,SAAqC,MAErEG,EAAQC,EAAAA,QACZ,UAAMT,WAAgBU,YAAYd,GAClC,CAACI,EAAgBJ,IAGbe,EAAcF,EAAAA,QAAQ,aACtBX,EAAoCA,SACjCG,WAAe3C,QAAS,EAC9B,CAACwC,EAAe,MAAAG,OAAA,EAAAA,EAAe3C,QAElCsD,EAAAA,UAAU,KACR,IAAKJ,EAGH,OAFAJ,EAAU,WACVG,EAAe,MAGjBH,EAAUI,EAAMK,cAAchB,IAC9BU,EAAeC,EAAMM,YAErB,MAAMC,EAASP,EAAMQ,mBAAoBC,IACnCA,EAAMpB,YAAcA,GACtBO,EAAUa,EAAMd,UAIde,EAASV,EAAMW,cAAeC,IAClCb,EAAea,KAGjB,MAAO,KACLL,IACAG,MAED,CAACV,EAAOX,IAEX,MAAM1E,SAAuBmF,WAAanF,wBAAwB,EAC5DC,SAA+BkF,WAAalF,gCAAgC,EAC5EG,SAAkB+E,WAAa/E,kBAAmB,IAClDC,SAA0B8E,WAAa9E,0BAA2B,GAClEF,SAAkBgF,WAAahF,kBAAmB,KAElD+F,EAAiBZ,EAAAA,QAAQ,IACxBN,GAAWhF,EACTgF,EAAOmB,OAAOC,OAAQlE,GAAUA,EAAMkC,OAAShE,GADT,GAE5C,CAAC4E,EAAQhF,EAAsBI,IAE5BiG,EAAmBC,EAAAA,YACtBC,IACC,MAAA1B,GAAAA,EAAgB2B,YAAYrG,IAAoBoG,EAAU,KAAOA,IAEnE,CAAC1B,EAAgB1E,IAGnB,IAAK6E,IAAYhF,IAAyBC,EACxC,OAAO,KAGT,MAAMwG,EAAgC,CACpCrD,cAAe,UACZa,GAGL,OACEE,EAAAA,KAAC,MAAA,CAAIF,MAAOwC,EAAgB,6BAA2B,GACpDvC,SAAA,CAAAgC,EAAeQ,IAAKxE,GACnB8B,EAAAA,IAAC/B,EAAA,CAECC,QACAC,MAAOqD,EACPpD,WAAYjC,IAAoB+B,EAAMzB,GACtC4B,QAASgE,GAJJnE,EAAMzB,KAQdR,GACC+E,EAAO2B,iBACPC,MAAMC,KAAK7B,EAAO2B,gBAAgBG,WAC/BV,OAAO,EAAEG,MACR,MAAMQ,EAAS/B,EAAOmB,OAAOa,KAAMC,GAAMA,EAAExG,KAAO8F,GAClD,OAAOQ,GAAUA,EAAO3C,OAAShE,IAElCsG,IAAI,EAAEH,EAASW,KACdA,EACGd,OAAQe,GAAOA,EAAG/C,OAAS/D,GAC3BqG,IAAI,CAACS,EAAIC,IACRpD,EAAAA,IAACM,EAAA,CAECC,QAAS4C,EACThF,MAAOqD,GAFF,MAAMe,KAAWa,SAQxC,4BD9JkC3C,UAChC,MAAMG,SAAEA,GAAatE,KACd2F,EAAOoB,GAAYnC,EAAAA,SAA8BpF,GAElDuF,EAAQC,UAAQ,IAAM,MAAAV,OAAA,EAAAA,EAAUW,YAAYd,GAAa,CAACG,EAAUH,IAE1EgB,EAAAA,UAAU,KACR,GAAKJ,EAEL,OADAgC,EAAShC,EAAMM,YACRN,EAAMW,cAAesB,IAC1BD,EAASC,MAEV,CAACjC,IAIJ,MAAO,CACLkC,OAH+C,OAAAC,EAAAvB,EAAMlG,UAAU0E,SAAhB,EAAA+C,EAA6BD,QAAS,CAAA,EAIrFvH,qBAAsBiG,EAAMjG,qBAC5BC,6BAA8BgG,EAAMhG,6BACpCC,sBAAuB+F,EAAM/F,sBAC7BE,gBAAiB6F,EAAM7F,gBACvBC,wBAAyB4F,EAAM5F,wBAC/BF,gBAAiB8F,EAAM9F,gBACvBkF,QACAT,mFA9BmC,IACrC6C,YAAgCjH,EAAAA,qBAAqBC"}