{"version":3,"sources":["../src/lib/PDFViewer.tsx","../src/lib/PDFToolbar.tsx","../src/lib/PDFSidebar.tsx","../src/lib/PDFPage.tsx","../src/lib/PDFHighlight.tsx","../src/lib/PDFLoader.ts","../src/lib/useKeyboardShortcuts.ts","../src/lib/utils.ts"],"sourcesContent":["import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport * as pdfjsLib from 'pdfjs-dist'\nimport type { \n  PDFViewerProps, \n  PDFDocumentProxy, \n  PDFLoadingTask,\n  ToolbarTool,\n  ViewMode,\n  SidebarView,\n  ZoomMode,\n  PDFOutlineItem,\n  PDFAttachment,\n  PDFDocumentInfo\n} from './types'\nimport { PDFToolbar } from './PDFToolbar'\nimport { PDFSidebar } from './PDFSidebar'\nimport { PDFPage } from './PDFPage'\nimport { PDFLoader } from './PDFLoader'\nimport { useKeyboardShortcuts } from './useKeyboardShortcuts'\nimport './worker' // Auto-configure worker on import\n\nconst PDFViewerComponent: React.FC<PDFViewerProps> = ({\n  file,\n  page = 1,\n  scale = 1.0,\n  rotation = 0,\n  viewMode = 'single',\n  sidebarView = 'none',\n  zoomMode = 'auto',\n  activeTool = 'none',\n  enableKeyboardShortcuts = true,\n  onDocumentLoad,\n  onPageChange,\n  onScaleChange,\n  onRotationChange,\n  onViewModeChange,\n  onSidebarToggle,\n  onSidebarViewChange,\n  onToolChange,\n  onError,\n  onSearch,\n  onPrint,\n  onDownload,\n  onOpenFile,\n  onPresentationMode,\n  onDocumentInfo,\n  className = '',\n  style,\n  enableTextSelection = true,\n  highlights = [],\n  renderToolbar = true,\n  renderSidebar = true,\n  customToolbar,\n  width = '100%',\n  height = '600px',\n  enableAnnotations = true,\n  enableForms = true,\n  enableSearch = true,\n  enableThumbnails = true,\n  showPageControls = true,\n  showZoomControls = true,\n  showRotateControls = true,\n  showViewModeControls = true,\n  showOpenOption = true,\n  showSearchOption = true,\n  showPrintOption = true,\n  showDownloadOption = true,\n  showToolSelection = true,\n  showFitOptions = true,\n  showPresentationMode = true,\n}) => {\n  // Core PDF state\n  const [pdf, setPdf] = useState<PDFDocumentProxy | null>(null)\n  const [currentPage, setCurrentPage] = useState(page)\n  const [currentScale, setCurrentScale] = useState(scale)\n  const [currentRotation, setCurrentRotation] = useState(rotation)\n  const [currentViewMode, setCurrentViewMode] = useState<ViewMode>(viewMode)\n  const [currentZoomMode, setCurrentZoomMode] = useState<ZoomMode>(zoomMode)\n  const [currentTool, setCurrentTool] = useState<ToolbarTool>(activeTool)\n  const [numPages, setNumPages] = useState(0)\n  const [loading, setLoading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n  \n  // Sidebar state\n  const [sidebarOpen, setSidebarOpen] = useState(sidebarView !== 'none')\n  const [currentSidebarView, setCurrentSidebarView] = useState<SidebarView>(sidebarView)\n  const [outline, setOutline] = useState<PDFOutlineItem[]>([])\n  const [attachments, setAttachments] = useState<PDFAttachment[]>([])\n  const [documentInfo, setDocumentInfo] = useState<PDFDocumentInfo | null>(null)\n  \n  // Search state\n  const [searchTerm, setSearchTerm] = useState('')\n  const [searchResults, setSearchResults] = useState(0)\n  const [currentSearchResult, setCurrentSearchResult] = useState(0)\n  \n  // Presentation mode state\n  const [presentationMode, setPresentationMode] = useState(false)\n  \n  const loadingTaskRef = useRef<PDFLoadingTask | null>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const currentFileRef = useRef<string | File | ArrayBuffer | Uint8Array | null>(null)\n  const loadingAbortControllerRef = useRef<AbortController | null>(null)\n\n  // Clean up function\n  const cleanup = useCallback(() => {\n    // Cancel any ongoing loading\n    if (loadingAbortControllerRef.current) {\n      loadingAbortControllerRef.current.abort()\n      loadingAbortControllerRef.current = null\n    }\n    \n    if (loadingTaskRef.current) {\n      try {\n        loadingTaskRef.current.destroy()\n      } catch (error) {\n        console.warn('Error destroying loading task:', error)\n      }\n      loadingTaskRef.current = null\n    }\n    if (pdf) {\n      try {\n        pdf.destroy()\n      } catch (error) {\n        console.warn('Error destroying PDF document:', error)\n      }\n    }\n  }, [pdf])\n\n  // Stable file key reference\n  const fileKeyRef = useRef<string>('')\n  const lastSuccessfulFileRef = useRef<string>('')\n\n  // Generate stable file key\n  const getFileKey = useCallback((file: string | File | ArrayBuffer | Uint8Array) => {\n    if (typeof file === 'string') return file\n    if (file instanceof File) return `${file.name}-${file.size}-${file.lastModified}`\n    return `buffer-${file.byteLength}`\n  }, [])\n\n  // Load document metadata\n  const loadDocumentMetadata = useCallback(async (pdfDoc: PDFDocumentProxy) => {\n    try {\n      // Load document info\n      const info = await pdfDoc.getMetadata()\n      setDocumentInfo(info.info as PDFDocumentInfo)\n      \n      // Load outline\n      try {\n        const outlineData = await pdfDoc.getOutline()\n        if (outlineData) {\n          // Convert PDF.js outline format to our format\n          const convertOutline = (items: any[]): PDFOutlineItem[] => {\n            return items.map(item => ({\n              title: item.title || '',\n              bold: item.bold || false,\n              italic: item.italic || false,\n              color: item.color ? [item.color[0], item.color[1], item.color[2]] as [number, number, number] : undefined,\n              dest: item.dest,\n              url: item.url,\n              items: item.items ? convertOutline(item.items) : undefined\n            }))\n          }\n          setOutline(convertOutline(outlineData))\n        }\n      } catch (error) {\n        console.warn('No document outline available:', error)\n        setOutline([])\n      }\n      \n      // Load attachments\n      try {\n        const attachmentData = await pdfDoc.getAttachments()\n        if (attachmentData) {\n          const attachmentList: PDFAttachment[] = []\n          for (const [filename, data] of Object.entries(attachmentData) as [string, any][]) {\n            attachmentList.push({\n              filename,\n              content: data.content\n            })\n          }\n          setAttachments(attachmentList)\n        }\n      } catch (error) {\n        console.warn('No attachments available:', error)\n        setAttachments([])\n      }\n    } catch (error) {\n      console.warn('Error loading document metadata:', error)\n    }\n  }, [])\n\n  // Load PDF function with comprehensive error handling\n  const loadPDF = useCallback(async () => {\n    const fileKey = getFileKey(file)\n    \n    // Skip if same file is already loaded successfully\n    if (fileKey === lastSuccessfulFileRef.current && pdf) {\n      console.debug('PDF already loaded for this file, skipping reload')\n      return\n    }\n    \n    // Skip if already loading the same file\n    if (fileKey === fileKeyRef.current && loading) {\n      console.debug('PDF load already in progress for this file, skipping duplicate request')\n      return\n    }\n    \n    fileKeyRef.current = fileKey\n    \n    // Cancel previous loading if it's for a different file\n    if (loadingAbortControllerRef.current && fileKey !== fileKeyRef.current) {\n      loadingAbortControllerRef.current.abort()\n    }\n    \n    // Create new abort controller for this request\n    loadingAbortControllerRef.current = new AbortController()\n    \n    setLoading(true)\n    setError(null)\n    \n    try {\n      cleanup()\n      \n      const result = await PDFLoader.loadPDF({ file })\n      \n      // Check if request was aborted\n      if (loadingAbortControllerRef.current?.signal.aborted) {\n        console.debug('PDF load was cancelled')\n        return\n      }\n      \n      if (result.error) {\n        throw result.error\n      }\n      \n      if (!result.pdf) {\n        throw new Error('Failed to load PDF')\n      }\n      \n      setPdf(result.pdf)\n      setNumPages(result.pdf.numPages)\n      lastSuccessfulFileRef.current = fileKey\n      \n      // Load document metadata\n      await loadDocumentMetadata(result.pdf)\n      \n      if (onDocumentLoad) {\n        onDocumentLoad(result.pdf)\n      }\n      \n      console.debug(`PDF loaded successfully: ${result.pdf.numPages} pages`)\n    } catch (error: any) {\n      if (error.name === 'AbortError' || error.message?.includes('aborted')) {\n        console.debug('PDF load was cancelled')\n        return\n      }\n      \n      const errorMessage = error.message || 'Failed to load PDF'\n      console.error('PDF load error:', error)\n      setError(errorMessage)\n      if (onError) {\n        onError(error)\n      }\n    } finally {\n      setLoading(false)\n      loadingAbortControllerRef.current = null\n    }\n  }, [file, getFileKey, loading, pdf, cleanup, loadDocumentMetadata, onDocumentLoad, onError])\n\n  // Load PDF with debouncing\n  useEffect(() => {\n    const timeoutId = setTimeout(() => {\n      loadPDF()\n    }, 300) // 300ms debounce\n    \n    return () => clearTimeout(timeoutId)\n  }, [loadPDF])\n\n  // Sync props with internal state\n  useEffect(() => {\n    if (page !== currentPage) {\n      setCurrentPage(page)\n    }\n  }, [page, currentPage])\n\n  useEffect(() => {\n    if (scale !== currentScale) {\n      setCurrentScale(scale)\n    }\n  }, [scale, currentScale])\n\n  useEffect(() => {\n    if (rotation !== currentRotation) {\n      setCurrentRotation(rotation)\n    }\n  }, [rotation, currentRotation])\n\n  useEffect(() => {\n    if (viewMode !== currentViewMode) {\n      setCurrentViewMode(viewMode)\n    }\n  }, [viewMode, currentViewMode])\n\n  useEffect(() => {\n    if (activeTool !== currentTool) {\n      setCurrentTool(activeTool)\n    }\n  }, [activeTool, currentTool])\n\n  useEffect(() => {\n    if (sidebarView !== currentSidebarView) {\n      setCurrentSidebarView(sidebarView)\n      setSidebarOpen(sidebarView !== 'none')\n    }\n  }, [sidebarView, currentSidebarView])\n\n  // Navigation handlers\n  const handlePageChange = useCallback((newPage: number) => {\n    if (newPage >= 1 && newPage <= numPages && newPage !== currentPage) {\n      setCurrentPage(newPage)\n      if (onPageChange) {\n        onPageChange(newPage)\n      }\n    }\n  }, [currentPage, numPages, onPageChange])\n\n  const goToNextPage = useCallback(() => {\n    if (currentPage < numPages) {\n      handlePageChange(currentPage + 1)\n    }\n  }, [currentPage, numPages, handlePageChange])\n\n  const goToPrevPage = useCallback(() => {\n    if (currentPage > 1) {\n      handlePageChange(currentPage - 1)\n    }\n  }, [currentPage, handlePageChange])\n\n  const goToFirstPage = useCallback(() => {\n    handlePageChange(1)\n  }, [handlePageChange])\n\n  const goToLastPage = useCallback(() => {\n    handlePageChange(numPages)\n  }, [numPages, handlePageChange])\n\n  // Zoom handlers\n  const handleScaleChange = useCallback((newScale: number) => {\n    if (Math.abs(newScale - currentScale) > 0.01) {\n      setCurrentScale(newScale)\n      setCurrentZoomMode('auto') // Reset zoom mode when manually changing scale\n      if (onScaleChange) {\n        onScaleChange(newScale)\n      }\n    }\n  }, [currentScale, onScaleChange])\n\n  const zoomIn = useCallback(() => {\n    const newScale = Math.min(currentScale * 1.25, 5.0)\n    handleScaleChange(newScale)\n  }, [currentScale, handleScaleChange])\n\n  const zoomOut = useCallback(() => {\n    const newScale = Math.max(currentScale / 1.25, 0.25)\n    handleScaleChange(newScale)\n  }, [currentScale, handleScaleChange])\n\n  const handleZoomToFit = useCallback(() => {\n    setCurrentZoomMode('page-fit')\n    // Calculate fit-to-page scale based on container size\n    if (containerRef.current) {\n      const containerHeight = containerRef.current.clientHeight - 100 // Account for toolbar\n      const containerWidth = containerRef.current.clientWidth - (sidebarOpen ? 250 : 0)\n      const scale = Math.min(containerWidth / 612, containerHeight / 792) // Standard page size\n      handleScaleChange(scale)\n    }\n  }, [handleScaleChange, sidebarOpen])\n\n  const handleZoomToWidth = useCallback(() => {\n    setCurrentZoomMode('page-width')\n    // Calculate fit-to-width scale\n    if (containerRef.current) {\n      const containerWidth = containerRef.current.clientWidth - (sidebarOpen ? 250 : 0) - 40 // Account for padding\n      const scale = containerWidth / 612 // Standard page width\n      handleScaleChange(scale)\n    }\n  }, [handleScaleChange, sidebarOpen])\n\n  const handleActualSize = useCallback(() => {\n    setCurrentZoomMode('actual')\n    handleScaleChange(1.0)\n  }, [handleScaleChange])\n\n  // Zoom mode handlers\n  const handleZoomModeChange = useCallback((mode: ZoomMode) => {\n    setCurrentZoomMode(mode)\n    switch (mode) {\n      case 'page-fit':\n        handleZoomToFit()\n        break\n      case 'page-width':\n        handleZoomToWidth()\n        break\n      case 'actual':\n        handleActualSize()\n        break\n    }\n  }, [handleZoomToFit, handleZoomToWidth, handleActualSize])\n\n  // Rotation handler\n  const handleRotate = useCallback(() => {\n    const newRotation = (currentRotation + 90) % 360\n    setCurrentRotation(newRotation)\n    if (onRotationChange) {\n      onRotationChange(newRotation)\n    }\n  }, [currentRotation, onRotationChange])\n\n  const handleRotateCounterClockwise = useCallback(() => {\n    const newRotation = (currentRotation - 90 + 360) % 360\n    setCurrentRotation(newRotation)\n    if (onRotationChange) {\n      onRotationChange(newRotation)\n    }\n  }, [currentRotation, onRotationChange])\n\n  // View mode handlers\n  const handleViewModeChange = useCallback((mode: ViewMode) => {\n    setCurrentViewMode(mode)\n    if (onViewModeChange) {\n      onViewModeChange(mode)\n    }\n  }, [onViewModeChange])\n\n  // Sidebar handlers\n  const handleSidebarToggle = useCallback(() => {\n    const newOpen = !sidebarOpen\n    setSidebarOpen(newOpen)\n    if (!newOpen) {\n      setCurrentSidebarView('none')\n    } else if (currentSidebarView === 'none') {\n      setCurrentSidebarView('thumbnails')\n    }\n    if (onSidebarToggle) {\n      onSidebarToggle(newOpen)\n    }\n  }, [sidebarOpen, currentSidebarView, onSidebarToggle])\n\n  const handleSidebarViewChange = useCallback((view: SidebarView) => {\n    setCurrentSidebarView(view)\n    setSidebarOpen(view !== 'none')\n    if (onSidebarViewChange) {\n      onSidebarViewChange(view)\n    }\n  }, [onSidebarViewChange])\n\n  // Tool handlers\n  const handleToolChange = useCallback((tool: ToolbarTool) => {\n    setCurrentTool(tool)\n    if (onToolChange) {\n      onToolChange(tool)\n    }\n  }, [onToolChange])\n\n  // Search handlers\n  const handleSearch = useCallback((term: string) => {\n    setSearchTerm(term)\n    // TODO: Implement actual search functionality\n    setSearchResults(0)\n    setCurrentSearchResult(0)\n    if (onSearch) {\n      onSearch(term)\n    }\n  }, [onSearch])\n\n  const handleSearchNext = useCallback(() => {\n    if (searchResults > 0) {\n      setCurrentSearchResult((prev) => (prev % searchResults) + 1)\n    }\n  }, [searchResults])\n\n  const handleSearchPrevious = useCallback(() => {\n    if (searchResults > 0) {\n      setCurrentSearchResult((prev) => (prev === 1 ? searchResults : prev - 1))\n    }\n  }, [searchResults])\n\n  const handleClearSearch = useCallback(() => {\n    setSearchTerm('')\n    setSearchResults(0)\n    setCurrentSearchResult(0)\n  }, [])\n\n  // File handlers\n  const handleOpenFile = useCallback(() => {\n    const input = document.createElement('input')\n    input.type = 'file'\n    input.accept = '.pdf'\n    input.onchange = (e) => {\n      const file = (e.target as HTMLInputElement).files?.[0]\n      if (file && onOpenFile) {\n        onOpenFile(file)\n      }\n    }\n    input.click()\n  }, [onOpenFile])\n\n  const handlePrint = useCallback(() => {\n    if (onPrint) {\n      onPrint()\n    } else {\n      // Default print implementation\n      window.print()\n    }\n  }, [onPrint])\n\n  const handleDownload = useCallback(() => {\n    if (onDownload) {\n      onDownload()\n    } else if (typeof file === 'string') {\n      // Download from URL\n      const link = document.createElement('a')\n      link.href = file\n      link.download = 'document.pdf'\n      link.click()\n    } else if (file instanceof File) {\n      // Download File object\n      const url = URL.createObjectURL(file)\n      const link = document.createElement('a')\n      link.href = url\n      link.download = file.name\n      link.click()\n      URL.revokeObjectURL(url)\n    }\n  }, [file, onDownload])\n\n  // Presentation mode handlers\n  const handlePresentationMode = useCallback(() => {\n    setPresentationMode(!presentationMode)\n    if (onPresentationMode) {\n      onPresentationMode()\n    }\n    \n    // Request fullscreen\n    if (!presentationMode && containerRef.current) {\n      if (containerRef.current.requestFullscreen) {\n        containerRef.current.requestFullscreen()\n      }\n    } else if (document.exitFullscreen) {\n      document.exitFullscreen()\n    }\n  }, [presentationMode, onPresentationMode])\n\n  // Document info handler\n  const handleDocumentInfo = useCallback(() => {\n    if (documentInfo && onDocumentInfo) {\n      onDocumentInfo(documentInfo)\n    } else if (documentInfo) {\n      // Show default document info dialog\n      const info = Object.entries(documentInfo as Record<string, any>)\n        .filter(([, value]) => value)\n        .map(([key, value]) => `${key}: ${value}`)\n        .join('\\n')\n      alert(`Document Information:\\n\\n${info}`)\n    }\n  }, [documentInfo, onDocumentInfo])\n\n  // Outline click handler\n  const handleOutlineClick = useCallback((dest: any) => {\n    // TODO: Navigate to destination\n    console.log('Navigate to destination:', dest)\n  }, [])\n\n  // Keyboard shortcuts\n  useKeyboardShortcuts(enableKeyboardShortcuts && !presentationMode, {\n    onNextPage: goToNextPage,\n    onPreviousPage: goToPrevPage,\n    onFirstPage: goToFirstPage,\n    onLastPage: goToLastPage,\n    onZoomIn: zoomIn,\n    onZoomOut: zoomOut,\n    onActualSize: handleActualSize,\n    onRotateClockwise: handleRotate,\n    onRotateCounterClockwise: handleRotateCounterClockwise,\n    onPresentationMode: handlePresentationMode,\n    onHandTool: () => handleToolChange('pan'),\n    onTextSelection: () => handleToolChange('selection'),\n    onFind: () => handleSearch(''),\n    onFindNext: handleSearchNext,\n    onFindPrevious: handleSearchPrevious,\n    onDownload: handleDownload,\n    onPrint: handlePrint,\n    onOpenFile: handleOpenFile,\n    onGoToPage: () => {\n      const page = prompt('Go to page:')\n      if (page) {\n        const pageNum = parseInt(page, 10)\n        if (!isNaN(pageNum)) {\n          handlePageChange(pageNum)\n        }\n      }\n    },\n    onToggleSidebar: handleSidebarToggle,\n  })\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return cleanup\n  }, [cleanup])\n\n  const containerStyle: React.CSSProperties = {\n    width,\n    height,\n    display: 'flex',\n    flexDirection: 'column',\n    border: '1px solid #ddd',\n    backgroundColor: '#f5f5f5',\n    position: presentationMode ? 'fixed' : 'relative',\n    top: presentationMode ? 0 : 'auto',\n    left: presentationMode ? 0 : 'auto',\n    right: presentationMode ? 0 : 'auto',\n    bottom: presentationMode ? 0 : 'auto',\n    zIndex: presentationMode ? 9999 : 'auto',\n    ...style,\n  }\n\n  const mainContentStyle: React.CSSProperties = {\n    flex: 1,\n    display: 'flex',\n    overflow: 'hidden',\n  }\n\n  const viewerStyle: React.CSSProperties = {\n    flex: 1,\n    overflow: 'auto',\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: currentViewMode === 'continuous' ? 'flex-start' : 'center',\n    padding: '20px',\n    backgroundColor: '#525659',\n  }\n\n  if (loading) {\n    return (\n      <div className={`pdf-viewer ${className}`} style={containerStyle} ref={containerRef}>\n        <div style={viewerStyle}>\n          <div style={{ color: 'white', fontSize: '16px' }}>Loading PDF...</div>\n        </div>\n      </div>\n    )\n  }\n\n  if (error) {\n    return (\n      <div className={`pdf-viewer ${className}`} style={containerStyle} ref={containerRef}>\n        <div style={viewerStyle}>\n          <div style={{ color: '#ff6b6b', fontSize: '16px' }}>Error: {error}</div>\n        </div>\n      </div>\n    )\n  }\n\n  if (!pdf) {\n    return (\n      <div className={`pdf-viewer ${className}`} style={containerStyle} ref={containerRef}>\n        <div style={viewerStyle}>\n          <div style={{ color: 'white', fontSize: '16px' }}>No PDF loaded</div>\n        </div>\n      </div>\n    )\n  }\n\n  return (\n    <div className={`pdf-viewer ${className}`} style={containerStyle} ref={containerRef}>\n      {renderToolbar && !customToolbar && !presentationMode && (\n        <PDFToolbar\n          currentPage={currentPage}\n          totalPages={numPages}\n          scale={currentScale}\n          viewMode={currentViewMode}\n          zoomMode={currentZoomMode}\n          activeTool={currentTool}\n          searchTerm={searchTerm}\n          searchResults={searchResults}\n          currentSearchResult={currentSearchResult}\n          sidebarOpen={sidebarOpen}\n          onPageChange={handlePageChange}\n          onScaleChange={handleScaleChange}\n          onPrevPage={goToPrevPage}\n          onNextPage={goToNextPage}\n          onZoomIn={zoomIn}\n          onZoomOut={zoomOut}\n          onRotate={handleRotate}\n          onOpenFile={handleOpenFile}\n          onPrint={handlePrint}\n          onDownload={handleDownload}\n          onSearch={handleSearch}\n          onSearchNext={handleSearchNext}\n          onSearchPrevious={handleSearchPrevious}\n          onClearSearch={handleClearSearch}\n          onToolChange={handleToolChange}\n          onZoomToFit={handleZoomToFit}\n          onZoomToWidth={handleZoomToWidth}\n          onViewModeChange={handleViewModeChange}\n          onZoomModeChange={handleZoomModeChange}\n          onSidebarToggle={handleSidebarToggle}\n          onPresentationMode={handlePresentationMode}\n          onDocumentInfo={handleDocumentInfo}\n          showPageControls={showPageControls}\n          showZoomControls={showZoomControls}\n          showRotateControls={showRotateControls}\n          showViewModeControls={showViewModeControls}\n          showOpenOption={showOpenOption}\n          showSearchOption={showSearchOption}\n          showPrintOption={showPrintOption}\n          showDownloadOption={showDownloadOption}\n          showToolSelection={showToolSelection}\n          showFitOptions={showFitOptions}\n          showPresentationMode={showPresentationMode}\n        />\n      )}\n      {customToolbar}\n      \n      <div style={mainContentStyle}>\n        {renderSidebar && sidebarOpen && !presentationMode && (\n          <PDFSidebar\n            isOpen={sidebarOpen}\n            activeView={currentSidebarView}\n            pdf={pdf}\n            currentPage={currentPage}\n            outline={outline}\n            attachments={attachments}\n            onToggle={handleSidebarToggle}\n            onViewChange={handleSidebarViewChange}\n            onPageSelect={handlePageChange}\n            onOutlineClick={handleOutlineClick}\n          />\n        )}\n        \n        <div style={viewerStyle}>\n          {currentViewMode === 'continuous' ? (\n            // Continuous view - render multiple pages\n            <div style={{ display: 'flex', flexDirection: 'column', gap: '20px' }}>\n              {Array.from({ length: numPages }, (_, i) => i + 1).map(pageNum => (\n                <PDFPage\n                  key={pageNum}\n                  pageNumber={pageNum}\n                  scale={currentScale}\n                  rotation={currentRotation}\n                  pdf={pdf}\n                  enableTextSelection={enableTextSelection}\n                  highlights={highlights}\n                />\n              ))}\n            </div>\n          ) : currentViewMode === 'two-page' ? (\n            // Two-page view\n            <div style={{ display: 'flex', gap: '20px' }}>\n              <PDFPage\n                pageNumber={currentPage}\n                scale={currentScale}\n                rotation={currentRotation}\n                pdf={pdf}\n                enableTextSelection={enableTextSelection}\n                highlights={highlights}\n              />\n              {currentPage < numPages && (\n                <PDFPage\n                  pageNumber={currentPage + 1}\n                  scale={currentScale}\n                  rotation={currentRotation}\n                  pdf={pdf}\n                  enableTextSelection={enableTextSelection}\n                  highlights={highlights}\n                />\n              )}\n            </div>\n          ) : (\n            // Single page view\n            <PDFPage\n              pageNumber={currentPage}\n              scale={currentScale}\n              rotation={currentRotation}\n              pdf={pdf}\n              enableTextSelection={enableTextSelection}\n              highlights={highlights}\n            />\n          )}\n        </div>\n      </div>\n    </div>\n  )\n}\n\n// Memoize the component for performance\nconst propsComparison = (prevProps: PDFViewerProps, nextProps: PDFViewerProps) => {\n  // File comparison\n  if (prevProps.file !== nextProps.file) {\n    if (typeof prevProps.file === 'string' && typeof nextProps.file === 'string') {\n      return prevProps.file === nextProps.file\n    }\n    if (prevProps.file instanceof File && nextProps.file instanceof File) {\n      return (\n        prevProps.file.name === nextProps.file.name &&\n        prevProps.file.size === nextProps.file.size &&\n        prevProps.file.lastModified === nextProps.file.lastModified\n      )\n    }\n    return false\n  }\n\n  // Other props comparison\n  return (\n    prevProps.page === nextProps.page &&\n    prevProps.scale === nextProps.scale &&\n    prevProps.rotation === nextProps.rotation &&\n    prevProps.viewMode === nextProps.viewMode &&\n    prevProps.sidebarView === nextProps.sidebarView &&\n    prevProps.zoomMode === nextProps.zoomMode &&\n    prevProps.activeTool === nextProps.activeTool &&\n    prevProps.enableTextSelection === nextProps.enableTextSelection &&\n    prevProps.enableKeyboardShortcuts === nextProps.enableKeyboardShortcuts &&\n    prevProps.renderToolbar === nextProps.renderToolbar &&\n    prevProps.renderSidebar === nextProps.renderSidebar\n  )\n}\n\nexport const PDFViewer = React.memo(PDFViewerComponent, propsComparison)\n\nexport default PDFViewer ","import React, { useState, useRef } from 'react'\nimport type { PDFToolbarProps, ToolbarTool, ViewMode, ZoomMode } from './types'\n\nexport const PDFToolbar: React.FC<PDFToolbarProps> = ({\n  currentPage,\n  totalPages,\n  scale,\n  viewMode = 'single',\n  zoomMode = 'auto',\n  activeTool = 'none',\n  searchTerm = '',\n  searchResults = 0,\n  currentSearchResult = 0,\n  sidebarOpen = false,\n  onPageChange,\n  onScaleChange,\n  onPrevPage,\n  onNextPage,\n  onZoomIn,\n  onZoomOut,\n  onRotate,\n  onOpenFile,\n  onPrint,\n  onDownload,\n  onSearch,\n  onSearchNext,\n  onSearchPrevious,\n  onClearSearch,\n  onToolChange,\n  onZoomToFit,\n  onZoomToWidth,\n  onViewModeChange,\n  onZoomModeChange,\n  onSidebarToggle,\n  onPresentationMode,\n  onDocumentInfo,\n  className = '',\n  style,\n  showPageControls = true,\n  showZoomControls = true,\n  showRotateControls = true,\n  showViewModeControls = true,\n  showOpenOption = true,\n  showSearchOption = true,\n  showPrintOption = true,\n  showDownloadOption = true,\n  showToolSelection = true,\n  showFitOptions = true,\n  showPresentationMode = true,\n}) => {\n  const [pageInput, setPageInput] = useState(currentPage.toString())\n  const [searchInput, setSearchInput] = useState(searchTerm)\n  const [showSearchBar, setShowSearchBar] = useState(false)\n  const fileInputRef = useRef<HTMLInputElement>(null)\n\n  const handlePageInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    setPageInput(e.target.value)\n  }\n\n  const handlePageInputSubmit = (e: React.FormEvent) => {\n    e.preventDefault()\n    const pageNumber = parseInt(pageInput, 10)\n    if (!isNaN(pageNumber) && pageNumber >= 1 && pageNumber <= totalPages) {\n      onPageChange(pageNumber)\n    } else {\n      setPageInput(currentPage.toString())\n    }\n  }\n\n  const handleScaleSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {\n    const newScale = parseFloat(e.target.value)\n    onScaleChange(newScale)\n  }\n\n  const handleSearchSubmit = (e: React.FormEvent) => {\n    e.preventDefault()\n    if (onSearch && searchInput.trim()) {\n      onSearch(searchInput.trim())\n    }\n  }\n\n  const handleOpenFile = () => {\n    if (fileInputRef.current) {\n      fileInputRef.current.click()\n    }\n    if (onOpenFile) {\n      onOpenFile()\n    }\n  }\n\n  const handleToolChange = (tool: ToolbarTool) => {\n    if (onToolChange) {\n      onToolChange(tool)\n    }\n  }\n\n  const toggleSearchBar = () => {\n    setShowSearchBar(!showSearchBar)\n    if (!showSearchBar && onClearSearch) {\n      onClearSearch()\n      setSearchInput('')\n    }\n  }\n\n  React.useEffect(() => {\n    setPageInput(currentPage.toString())\n  }, [currentPage])\n\n  React.useEffect(() => {\n    setSearchInput(searchTerm)\n  }, [searchTerm])\n\n  // Styles\n  const toolbarStyle: React.CSSProperties = {\n    display: 'flex',\n    alignItems: 'center',\n    padding: '8px 16px',\n    backgroundColor: '#2c3e50',\n    color: 'white',\n    borderBottom: '1px solid #34495e',\n    gap: '8px',\n    flexWrap: 'wrap',\n    boxShadow: '0 2px 4px rgba(0,0,0,0.1)',\n    ...style,\n  }\n\n  const buttonStyle: React.CSSProperties = {\n    padding: '8px 12px',\n    border: 'none',\n    borderRadius: '6px',\n    backgroundColor: '#34495e',\n    color: 'white',\n    cursor: 'pointer',\n    fontSize: '14px',\n    display: 'flex',\n    alignItems: 'center',\n    gap: '6px',\n    transition: 'all 0.2s ease',\n    minWidth: '40px',\n    justifyContent: 'center',\n  }\n\n  const activeButtonStyle: React.CSSProperties = {\n    ...buttonStyle,\n    backgroundColor: '#3498db',\n    color: 'white',\n  }\n\n  const disabledButtonStyle: React.CSSProperties = {\n    ...buttonStyle,\n    opacity: 0.4,\n    cursor: 'not-allowed',\n    backgroundColor: '#34495e',\n  }\n\n  const inputStyle: React.CSSProperties = {\n    padding: '6px 8px',\n    border: '1px solid #495057',\n    borderRadius: '4px',\n    fontSize: '14px',\n    backgroundColor: '#495057',\n    color: 'white',\n    textAlign: 'center',\n    width: '60px',\n  }\n\n  const searchInputStyle: React.CSSProperties = {\n    padding: '6px 12px',\n    border: '1px solid #495057',\n    borderRadius: '4px',\n    fontSize: '14px',\n    backgroundColor: '#495057',\n    color: 'white',\n    width: '200px',\n  }\n\n  const selectStyle: React.CSSProperties = {\n    padding: '6px 8px',\n    border: '1px solid #495057',\n    borderRadius: '4px',\n    fontSize: '14px',\n    backgroundColor: '#495057',\n    color: 'white',\n    minWidth: '80px',\n  }\n\n  const separatorStyle: React.CSSProperties = {\n    width: '1px',\n    height: '32px',\n    backgroundColor: '#495057',\n    margin: '0 8px',\n  }\n\n  const toolGroupStyle: React.CSSProperties = {\n    display: 'flex',\n    gap: '4px',\n    alignItems: 'center',\n  }\n\n  const labelStyle: React.CSSProperties = {\n    fontSize: '12px',\n    color: '#bdc3c7',\n    fontWeight: '500',\n  }\n\n  return (\n    <div className={`pdf-toolbar ${className}`} style={toolbarStyle}>\n      {/* Hidden file input */}\n      <input\n        ref={fileInputRef}\n        type=\"file\"\n        accept=\".pdf,application/pdf\"\n        style={{ display: 'none' }}\n        onChange={(e) => {\n          // File handling would be implemented in parent component\n        }}\n      />\n\n      {/* Sidebar Toggle */}\n      <div style={toolGroupStyle}>\n        <button\n          onClick={onSidebarToggle}\n          style={sidebarOpen ? activeButtonStyle : buttonStyle}\n          title=\"Toggle sidebar (F4)\"\n        >\n          🗂️\n        </button>\n      </div>\n\n      <div style={separatorStyle} />\n\n      {/* File Operations Group */}\n      {showOpenOption && (\n        <div style={toolGroupStyle}>\n          <button\n            onClick={handleOpenFile}\n            style={buttonStyle}\n            title=\"Open PDF file (Ctrl+O)\"\n          >\n            📁 Open\n          </button>\n        </div>\n      )}\n\n      {showOpenOption && <div style={separatorStyle} />}\n\n      {/* Page Navigation Group */}\n      {showPageControls && (\n        <div style={toolGroupStyle}>\n          <span style={labelStyle}>PAGE</span>\n          <button\n            onClick={onPrevPage}\n            disabled={currentPage <= 1}\n            style={currentPage <= 1 ? disabledButtonStyle : buttonStyle}\n            title=\"Previous page (←)\"\n          >\n            ◀\n          </button>\n          \n          <form onSubmit={handlePageInputSubmit} style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n            <input\n              type=\"text\"\n              value={pageInput}\n              onChange={handlePageInputChange}\n              style={inputStyle}\n              title=\"Go to page\"\n            />\n            <span style={{ fontSize: '14px', color: '#bdc3c7' }}>/ {totalPages}</span>\n          </form>\n          \n          <button\n            onClick={onNextPage}\n            disabled={currentPage >= totalPages}\n            style={currentPage >= totalPages ? disabledButtonStyle : buttonStyle}\n            title=\"Next page (→)\"\n          >\n            ▶\n          </button>\n        </div>\n      )}\n\n      {(showPageControls && showZoomControls) && <div style={separatorStyle} />}\n\n      {/* Magnification/Zoom Group */}\n      {showZoomControls && (\n        <div style={toolGroupStyle}>\n          <span style={labelStyle}>ZOOM</span>\n          <button\n            onClick={onZoomOut}\n            style={buttonStyle}\n            title=\"Zoom out (-)\"\n          >\n            🔍−\n          </button>\n          \n          <select\n            value={scale}\n            onChange={handleScaleSelect}\n            style={selectStyle}\n            title=\"Zoom level\"\n          >\n            <option value={0.25}>25%</option>\n            <option value={0.5}>50%</option>\n            <option value={0.75}>75%</option>\n            <option value={1.0}>100%</option>\n            <option value={1.25}>125%</option>\n            <option value={1.5}>150%</option>\n            <option value={2.0}>200%</option>\n            <option value={3.0}>300%</option>\n            <option value={4.0}>400%</option>\n          </select>\n          \n          <button\n            onClick={onZoomIn}\n            style={buttonStyle}\n            title=\"Zoom in (+)\"\n          >\n            🔍+\n          </button>\n\n          {showFitOptions && (\n            <>\n              <button\n                onClick={onZoomToFit}\n                style={zoomMode === 'page-fit' ? activeButtonStyle : buttonStyle}\n                title=\"Fit to page\"\n              >\n                📄 Fit\n              </button>\n              <button\n                onClick={onZoomToWidth}\n                style={zoomMode === 'page-width' ? activeButtonStyle : buttonStyle}\n                title=\"Fit to width\"\n              >\n                ↔ Width\n              </button>\n              <button\n                onClick={() => onZoomModeChange?.('actual')}\n                style={zoomMode === 'actual' ? activeButtonStyle : buttonStyle}\n                title=\"Actual size\"\n              >\n                🎯 Actual\n              </button>\n            </>\n          )}\n        </div>\n      )}\n\n      {/* View Mode Controls */}\n      {showViewModeControls && (\n        <>\n          <div style={separatorStyle} />\n          <div style={toolGroupStyle}>\n            <span style={labelStyle}>VIEW</span>\n            <button\n              onClick={() => onViewModeChange?.('single')}\n              style={viewMode === 'single' ? activeButtonStyle : buttonStyle}\n              title=\"Single page view\"\n            >\n              📄 Single\n            </button>\n            <button\n              onClick={() => onViewModeChange?.('continuous')}\n              style={viewMode === 'continuous' ? activeButtonStyle : buttonStyle}\n              title=\"Continuous scroll view\"\n            >\n              📜 Scroll\n            </button>\n            <button\n              onClick={() => onViewModeChange?.('two-page')}\n              style={viewMode === 'two-page' ? activeButtonStyle : buttonStyle}\n              title=\"Two-page view\"\n            >\n              📖 Two Page\n            </button>\n            <button\n              onClick={() => onViewModeChange?.('book')}\n              style={viewMode === 'book' ? activeButtonStyle : buttonStyle}\n              title=\"Book view\"\n            >\n              📚 Book\n            </button>\n          </div>\n        </>\n      )}\n\n      {(showZoomControls && showToolSelection) && <div style={separatorStyle} />}\n\n      {/* Tool Selection Group */}\n      {showToolSelection && (\n        <div style={toolGroupStyle}>\n          <span style={labelStyle}>TOOLS</span>\n          <button\n            onClick={() => handleToolChange('pan')}\n            style={activeTool === 'pan' ? activeButtonStyle : buttonStyle}\n            title=\"Pan tool - Click and drag to move around\"\n          >\n            ✋ Pan\n          </button>\n          \n          <button\n            onClick={() => handleToolChange('selection')}\n            style={activeTool === 'selection' ? activeButtonStyle : buttonStyle}\n            title=\"Selection tool - Select text and areas\"\n          >\n            📄 Select\n          </button>\n          \n          <button\n            onClick={() => handleToolChange('annotation')}\n            style={activeTool === 'annotation' ? activeButtonStyle : buttonStyle}\n            title=\"Annotation tool - Add and edit annotations\"\n          >\n            ✏️ Annotate\n          </button>\n        </div>\n      )}\n\n      {(showToolSelection && showSearchOption) && <div style={separatorStyle} />}\n\n      {/* Search Group */}\n      {showSearchOption && (\n        <div style={toolGroupStyle}>\n          <button\n            onClick={toggleSearchBar}\n            style={showSearchBar ? activeButtonStyle : buttonStyle}\n            title=\"Search in document\"\n          >\n            🔍 Search\n          </button>\n          \n          {showSearchBar && (\n            <>\n              <form onSubmit={handleSearchSubmit} style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\n                <input\n                  type=\"text\"\n                  value={searchInput}\n                  onChange={(e) => setSearchInput(e.target.value)}\n                  placeholder=\"Search in PDF...\"\n                  style={searchInputStyle}\n                />\n                <button\n                  type=\"submit\"\n                  style={buttonStyle}\n                  title=\"Search\"\n                >\n                  🔍\n                </button>\n              </form>\n              \n              {searchResults > 0 && (\n                <div style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\n                  <span style={{ fontSize: '12px', color: '#bdc3c7' }}>\n                    {currentSearchResult + 1} of {searchResults}\n                  </span>\n                  <button\n                    onClick={onSearchPrevious}\n                    disabled={currentSearchResult <= 0}\n                    style={currentSearchResult <= 0 ? disabledButtonStyle : buttonStyle}\n                    title=\"Previous result\"\n                  >\n                    ▲\n                  </button>\n                  <button\n                    onClick={onSearchNext}\n                    disabled={currentSearchResult >= searchResults - 1}\n                    style={currentSearchResult >= searchResults - 1 ? disabledButtonStyle : buttonStyle}\n                    title=\"Next result\"\n                  >\n                    ▼\n                  </button>\n                  <button\n                    onClick={() => {\n                      if (onClearSearch) onClearSearch()\n                      setSearchInput('')\n                      setShowSearchBar(false)\n                    }}\n                    style={buttonStyle}\n                    title=\"Clear search\"\n                  >\n                    ✕\n                  </button>\n                </div>\n              )}\n            </>\n          )}\n        </div>\n      )}\n\n      {(showSearchOption && (showRotateControls || showPrintOption || showDownloadOption)) && (\n        <div style={separatorStyle} />\n      )}\n\n      {/* Document Actions Group */}\n      <div style={toolGroupStyle}>\n        {showRotateControls && onRotate && (\n          <button\n            onClick={onRotate}\n            style={buttonStyle}\n            title=\"Rotate document clockwise (R)\"\n          >\n            ↻ Rotate\n          </button>\n        )}\n\n        {showPresentationMode && onPresentationMode && (\n          <button\n            onClick={onPresentationMode}\n            style={buttonStyle}\n            title=\"Presentation mode (Ctrl+Alt+P)\"\n          >\n            🎦 Present\n          </button>\n        )}\n\n        <button\n          onClick={onDocumentInfo}\n          style={buttonStyle}\n          title=\"Document properties\"\n        >\n          ℹ️ Info\n        </button>\n\n        {showPrintOption && onPrint && (\n          <button\n            onClick={onPrint}\n            style={buttonStyle}\n            title=\"Print document (Ctrl+P)\"\n          >\n            🖨️ Print\n          </button>\n        )}\n\n        {showDownloadOption && onDownload && (\n          <button\n            onClick={onDownload}\n            style={buttonStyle}\n            title=\"Download PDF (Ctrl+S)\"\n          >\n            💾 Download\n          </button>\n        )}\n      </div>\n    </div>\n  )\n}\n\nexport default PDFToolbar ","import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport type { \n  PDFSidebarProps, \n  SidebarView, \n  PDFDocumentProxy, \n  PDFPageProxy,\n  PDFOutlineItem \n} from './types'\n\nexport const PDFSidebar: React.FC<PDFSidebarProps> = ({\n  isOpen,\n  activeView,\n  pdf,\n  currentPage,\n  outline,\n  attachments,\n  onToggle,\n  onViewChange,\n  onPageSelect,\n  onOutlineClick,\n  className = '',\n  style,\n}) => {\n  const [thumbnails, setThumbnails] = useState<{ [key: number]: string }>({})\n  const [loadingThumbnails, setLoadingThumbnails] = useState<Set<number>>(new Set())\n  const [expandedOutlineItems, setExpandedOutlineItems] = useState<Set<string>>(new Set())\n  const thumbnailsContainerRef = useRef<HTMLDivElement>(null)\n  const observer = useRef<IntersectionObserver | null>(null)\n\n  // Load thumbnail for a specific page\n  const loadThumbnail = useCallback(async (pageNum: number) => {\n    if (!pdf || thumbnails[pageNum] || loadingThumbnails.has(pageNum)) return\n\n    setLoadingThumbnails(prev => new Set(prev).add(pageNum))\n\n    try {\n      const page = await pdf.getPage(pageNum)\n      const viewport = page.getViewport({ scale: 0.2 }) // Small scale for thumbnails\n      \n      const canvas = document.createElement('canvas')\n      const context = canvas.getContext('2d')!\n      canvas.height = viewport.height\n      canvas.width = viewport.width\n\n      const renderContext = {\n        canvasContext: context,\n        viewport: viewport,\n      }\n\n      await page.render(renderContext).promise\n      \n      const thumbnailUrl = canvas.toDataURL()\n      setThumbnails(prev => ({ ...prev, [pageNum]: thumbnailUrl }))\n    } catch (error) {\n      console.warn(`Failed to load thumbnail for page ${pageNum}:`, error)\n    } finally {\n      setLoadingThumbnails(prev => {\n        const newSet = new Set(prev)\n        newSet.delete(pageNum)\n        return newSet\n      })\n    }\n  }, [pdf, thumbnails, loadingThumbnails])\n\n  // Setup intersection observer for lazy loading thumbnails\n  useEffect(() => {\n    if (activeView !== 'thumbnails' || !thumbnailsContainerRef.current) return\n\n    observer.current = new IntersectionObserver(\n      (entries) => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting) {\n            const pageNum = parseInt(entry.target.getAttribute('data-page') || '0')\n            if (pageNum > 0) {\n              loadThumbnail(pageNum)\n            }\n          }\n        })\n      },\n      { rootMargin: '50px' }\n    )\n\n    const thumbnailElements = thumbnailsContainerRef.current.querySelectorAll('[data-page]')\n    thumbnailElements.forEach(el => observer.current?.observe(el))\n\n    return () => {\n      if (observer.current) {\n        observer.current.disconnect()\n      }\n    }\n  }, [activeView, pdf, loadThumbnail])\n\n  // Handle outline item toggle\n  const handleOutlineToggle = useCallback((itemId: string) => {\n    setExpandedOutlineItems(prev => {\n      const newSet = new Set(prev)\n      if (newSet.has(itemId)) {\n        newSet.delete(itemId)\n      } else {\n        newSet.add(itemId)\n      }\n      return newSet\n    })\n  }, [])\n\n  // Render outline items recursively\n  const renderOutlineItems = useCallback((items: PDFOutlineItem[], level: number = 0): React.ReactNode => {\n    return items.map((item, index) => {\n      const itemId = `${level}-${index}`\n      const hasChildren = item.items && item.items.length > 0\n      const isExpanded = expandedOutlineItems.has(itemId)\n\n      return (\n        <div key={itemId} className=\"pdf-outline-item\">\n          <div \n            className=\"pdf-outline-item-content\"\n            style={{ \n              paddingLeft: `${level * 16 + 8}px`,\n              display: 'flex',\n              alignItems: 'center',\n              padding: '4px 8px',\n              cursor: 'pointer',\n              fontSize: '14px',\n              fontWeight: item.bold ? 'bold' : 'normal',\n              fontStyle: item.italic ? 'italic' : 'normal',\n              color: item.color ? `rgb(${item.color.join(',')})` : 'inherit'\n            }}\n            onClick={() => {\n              if (item.dest) {\n                onOutlineClick(item.dest)\n              }\n              if (hasChildren) {\n                handleOutlineToggle(itemId)\n              }\n            }}\n          >\n            {hasChildren && (\n              <span \n                style={{ \n                  marginRight: '4px',\n                  transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n                  transition: 'transform 0.2s ease'\n                }}\n              >\n                ▶\n              </span>\n            )}\n            <span>{item.title}</span>\n          </div>\n          {hasChildren && isExpanded && (\n            <div className=\"pdf-outline-children\">\n              {renderOutlineItems(item.items!, level + 1)}\n            </div>\n          )}\n        </div>\n      )\n    })\n  }, [expandedOutlineItems, handleOutlineToggle, onOutlineClick])\n\n  if (!isOpen) return null\n\n  const sidebarStyle: React.CSSProperties = {\n    width: '250px',\n    height: '100%',\n    backgroundColor: '#f8f9fa',\n    borderRight: '1px solid #dee2e6',\n    display: 'flex',\n    flexDirection: 'column',\n    overflow: 'hidden',\n    ...style,\n  }\n\n  const headerStyle: React.CSSProperties = {\n    display: 'flex',\n    borderBottom: '1px solid #dee2e6',\n    backgroundColor: '#e9ecef',\n  }\n\n  const tabStyle: React.CSSProperties = {\n    flex: 1,\n    padding: '8px 12px',\n    border: 'none',\n    backgroundColor: 'transparent',\n    cursor: 'pointer',\n    fontSize: '12px',\n    textAlign: 'center',\n    textTransform: 'uppercase',\n    fontWeight: '500',\n    transition: 'background-color 0.2s ease',\n  }\n\n  const activeTabStyle: React.CSSProperties = {\n    ...tabStyle,\n    backgroundColor: '#fff',\n    borderBottom: '2px solid #007bff',\n  }\n\n  const contentStyle: React.CSSProperties = {\n    flex: 1,\n    overflow: 'auto',\n    padding: '8px',\n  }\n\n  const closeButtonStyle: React.CSSProperties = {\n    position: 'absolute',\n    top: '8px',\n    right: '8px',\n    background: 'none',\n    border: 'none',\n    fontSize: '16px',\n    cursor: 'pointer',\n    color: '#6c757d',\n    padding: '4px',\n    borderRadius: '4px',\n  }\n\n  return (\n    <div className={`pdf-sidebar ${className}`} style={sidebarStyle}>\n      <button style={closeButtonStyle} onClick={onToggle} title=\"Close sidebar\">\n        ✕\n      </button>\n      \n      {/* Sidebar tabs */}\n      <div style={headerStyle}>\n        <button\n          style={activeView === 'thumbnails' ? activeTabStyle : tabStyle}\n          onClick={() => onViewChange('thumbnails')}\n          title=\"Show page thumbnails\"\n        >\n          📄 Pages\n        </button>\n        <button\n          style={activeView === 'outline' ? activeTabStyle : tabStyle}\n          onClick={() => onViewChange('outline')}\n          title=\"Show document outline\"\n        >\n          📋 Outline\n        </button>\n        <button\n          style={activeView === 'attachments' ? activeTabStyle : tabStyle}\n          onClick={() => onViewChange('attachments')}\n          title=\"Show attachments\"\n        >\n          📎 Files\n        </button>\n        <button\n          style={activeView === 'layers' ? activeTabStyle : tabStyle}\n          onClick={() => onViewChange('layers')}\n          title=\"Show layers\"\n        >\n          🗂️ Layers\n        </button>\n      </div>\n\n      {/* Sidebar content */}\n      <div style={contentStyle}>\n        {activeView === 'thumbnails' && (\n          <div ref={thumbnailsContainerRef} className=\"pdf-thumbnails\">\n            {pdf && Array.from({ length: pdf.numPages }, (_, i) => i + 1).map(pageNum => (\n              <div\n                key={pageNum}\n                data-page={pageNum}\n                className={`pdf-thumbnail ${pageNum === currentPage ? 'active' : ''}`}\n                style={{\n                  marginBottom: '8px',\n                  padding: '8px',\n                  border: pageNum === currentPage ? '2px solid #007bff' : '1px solid #dee2e6',\n                  borderRadius: '4px',\n                  cursor: 'pointer',\n                  backgroundColor: pageNum === currentPage ? '#e3f2fd' : 'white',\n                  textAlign: 'center',\n                }}\n                onClick={() => onPageSelect(pageNum)}\n              >\n                <div style={{ marginBottom: '4px', fontSize: '12px', fontWeight: '500' }}>\n                  Page {pageNum}\n                </div>\n                {thumbnails[pageNum] ? (\n                  <img\n                    src={thumbnails[pageNum]}\n                    alt={`Page ${pageNum}`}\n                    style={{\n                      maxWidth: '100%',\n                      height: 'auto',\n                      border: '1px solid #dee2e6',\n                    }}\n                  />\n                ) : loadingThumbnails.has(pageNum) ? (\n                  <div style={{ \n                    height: '120px', \n                    display: 'flex', \n                    alignItems: 'center', \n                    justifyContent: 'center',\n                    backgroundColor: '#f8f9fa',\n                    border: '1px solid #dee2e6'\n                  }}>\n                    Loading...\n                  </div>\n                ) : (\n                  <div style={{ \n                    height: '120px', \n                    backgroundColor: '#f8f9fa',\n                    border: '1px solid #dee2e6'\n                  }} />\n                )}\n              </div>\n            ))}\n          </div>\n        )}\n\n        {activeView === 'outline' && (\n          <div className=\"pdf-outline\">\n            {outline && outline.length > 0 ? (\n              renderOutlineItems(outline)\n            ) : (\n              <div style={{ \n                textAlign: 'center', \n                color: '#6c757d', \n                fontSize: '14px',\n                padding: '20px'\n              }}>\n                No document outline available\n              </div>\n            )}\n          </div>\n        )}\n\n        {activeView === 'attachments' && (\n          <div className=\"pdf-attachments\">\n            {attachments && attachments.length > 0 ? (\n              attachments.map((attachment, index) => (\n                <div\n                  key={index}\n                  style={{\n                    padding: '8px',\n                    marginBottom: '4px',\n                    border: '1px solid #dee2e6',\n                    borderRadius: '4px',\n                    cursor: 'pointer',\n                    display: 'flex',\n                    alignItems: 'center',\n                    gap: '8px',\n                  }}\n                  onClick={() => {\n                    // Download attachment\n                    const blob = new Blob([attachment.content])\n                    const url = URL.createObjectURL(blob)\n                    const link = document.createElement('a')\n                    link.href = url\n                    link.download = attachment.filename\n                    link.click()\n                    URL.revokeObjectURL(url)\n                  }}\n                >\n                  <span>📎</span>\n                  <span style={{ fontSize: '14px' }}>{attachment.filename}</span>\n                </div>\n              ))\n            ) : (\n              <div style={{ \n                textAlign: 'center', \n                color: '#6c757d', \n                fontSize: '14px',\n                padding: '20px'\n              }}>\n                No attachments found\n              </div>\n            )}\n          </div>\n        )}\n\n        {activeView === 'layers' && (\n          <div className=\"pdf-layers\">\n            <div style={{ \n              textAlign: 'center', \n              color: '#6c757d', \n              fontSize: '14px',\n              padding: '20px'\n            }}>\n              Layers functionality coming soon\n            </div>\n          </div>\n        )}\n      </div>\n    </div>\n  )\n}\n\nexport default PDFSidebar ","import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport * as pdfjsLib from 'pdfjs-dist'\nimport type { \n  PDFPageProps, \n  PDFPageProxy, \n  PDFPageViewport,\n  PDFRenderContext,\n  PDFRenderTask\n} from './types'\nimport { PDFHighlight } from './PDFHighlight'\n\nexport const PDFPage: React.FC<PDFPageProps> = ({\n  pageNumber,\n  scale = 1.0,\n  rotation = 0,\n  pdf,\n  onPageRender,\n  onError,\n  className = '',\n  style,\n  enableTextSelection = true,\n  highlights = [],\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const textLayerRef = useRef<HTMLDivElement>(null)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const renderingRef = useRef<boolean>(false)\n  const renderTaskRef = useRef<PDFRenderTask | null>(null)\n  \n  const [page, setPage] = useState<PDFPageProxy | null>(null)\n  const [viewport, setViewport] = useState<PDFPageViewport | null>(null)\n  const [rendering, setRendering] = useState(false)\n\n  // Cancel any ongoing render task\n  const cancelRender = useCallback(() => {\n    if (renderTaskRef.current) {\n      try {\n        renderTaskRef.current.cancel()\n      } catch (error) {\n        // Handle cases where render task is already destroyed/terminated\n        console.warn('Error canceling render task:', error)\n      }\n      renderTaskRef.current = null\n    }\n  }, []) // No dependencies needed since we use ref\n\n  // Render page to canvas\n  const renderPage = useCallback(async () => {\n    if (!pdf || !canvasRef.current) return\n\n    // Prevent concurrent renders using ref to avoid dependency loop\n    if (renderingRef.current) {\n      console.debug('Render already in progress, skipping')\n      return\n    }\n\n    try {\n      renderingRef.current = true\n      setRendering(true)\n      cancelRender()\n\n      // Get the page\n      const pdfPage = await pdf.getPage(pageNumber)\n      setPage(pdfPage)\n\n      // Calculate viewport\n      const pdfViewport = pdfPage.getViewport({ scale, rotation })\n      setViewport(pdfViewport)\n\n      // Prepare canvas\n      const canvas = canvasRef.current\n      const context = canvas.getContext('2d')\n      if (!context) {\n        throw new Error('Could not get canvas context')\n      }\n\n      canvas.height = pdfViewport.height\n      canvas.width = pdfViewport.width\n\n      // Clear text layer immediately to prevent misaligned text during render\n      if (enableTextSelection && textLayerRef.current) {\n        textLayerRef.current.innerHTML = ''\n        textLayerRef.current.style.width = `${pdfViewport.width}px`\n        textLayerRef.current.style.height = `${pdfViewport.height}px`\n      }\n\n      // Render the page\n      const renderContext: PDFRenderContext = {\n        canvasContext: context,\n        viewport: pdfViewport,\n        background: 'white',\n      }\n\n      const task = pdfPage.render(renderContext)\n      renderTaskRef.current = task\n\n      await task.promise\n\n      // Small delay to ensure canvas rendering is complete before text layer\n      await new Promise(resolve => setTimeout(resolve, 100))\n\n      // Render text layer for text selection after canvas is complete\n      if (enableTextSelection && textLayerRef.current) {\n        await renderTextLayer(pdfPage, pdfViewport)\n      }\n\n      if (onPageRender) {\n        onPageRender(pdfPage)\n      }\n    } catch (error) {\n      if (error && typeof error === 'object' && 'name' in error && error.name === 'RenderingCancelledException') {\n        // Rendering was cancelled, this is normal\n        return\n      }\n      \n      const errorMessage = error instanceof Error ? error.message : 'Failed to render page'\n      \n      // Handle transport/worker destroyed errors gracefully\n      if (errorMessage.includes('Transport destroyed') || \n          errorMessage.includes('Worker was terminated') ||\n          errorMessage.includes('destroyed')) {\n        console.warn('PDF page render interrupted due to worker termination:', errorMessage)\n        // Don't propagate worker destruction errors to parent - they will be handled by the loader\n        return\n      }\n      \n      console.error('PDF page render error:', errorMessage)\n      if (onError) {\n        onError(new Error(errorMessage))\n      }\n    } finally {\n      renderingRef.current = false\n      setRendering(false)\n      renderTaskRef.current = null\n    }\n  }, [pdf, pageNumber, scale, rotation, enableTextSelection, onPageRender, onError])\n\n  // Proper PDF.js TextLayer implementation for accurate text selection\n  const renderTextLayer = useCallback(async (pdfPage: PDFPageProxy, pdfViewport: PDFPageViewport) => {\n    if (!textLayerRef.current) return\n\n    try {\n      console.debug(`Rendering text layer for page ${pageNumber} at scale ${pdfViewport.scale}`)\n      \n      // Clear existing text layer completely\n      textLayerRef.current.innerHTML = ''\n      textLayerRef.current.style.width = `${pdfViewport.width}px`\n      textLayerRef.current.style.height = `${pdfViewport.height}px`\n      \n      // Get text content\n      const textContent = await pdfPage.getTextContent({\n        includeMarkedContent: false,\n        disableNormalization: false\n      })\n      \n      if (textContent.items.length === 0) return\n\n      // Use PDF.js standard approach for text positioning with proper scaling\n      textContent.items.forEach((textItem: any, index: number) => {\n        if (!textItem.str || typeof textItem.str !== 'string' || textItem.str.trim() === '') return\n        if (!textItem.transform || textItem.transform.length < 6) return\n\n        const [scaleX, skewY, skewX, scaleY, translateX, translateY] = textItem.transform\n        const style = textContent.styles[textItem.fontName] || {}\n        \n        // Calculate font size and apply viewport scale\n        const fontSize = Math.sqrt(scaleX * scaleX + skewY * skewY) * pdfViewport.scale\n        const fontHeight = Math.sqrt(skewX * skewX + scaleY * scaleY) * pdfViewport.scale\n        \n        // Apply viewport transformation to position\n        const left = translateX * pdfViewport.scale\n        const top = (translateY - Math.sqrt(skewX * skewX + scaleY * scaleY)) * pdfViewport.scale\n        \n        // Create text span with proper PDF.js positioning\n        const textSpan = document.createElement('span')\n        textSpan.textContent = textItem.str\n        textSpan.style.position = 'absolute'\n        textSpan.style.whiteSpace = 'pre'\n        textSpan.style.color = 'transparent'\n        textSpan.style.fontSize = `${fontSize}px`\n        textSpan.style.fontFamily = style.fontFamily || 'sans-serif'\n        textSpan.style.left = `${left}px`\n        textSpan.style.top = `${top}px`\n        \n        // Handle text scaling (important for proper selection)\n        if (textItem.width > 0) {\n          const textWidth = textItem.width * pdfViewport.scale\n          textSpan.style.width = `${textWidth}px`\n          \n          // Calculate horizontal scaling if needed\n          const ctx = document.createElement('canvas').getContext('2d')!\n          ctx.font = `${fontSize}px ${style.fontFamily || 'sans-serif'}`\n          const measuredWidth = ctx.measureText(textItem.str).width\n          \n          if (measuredWidth > 0) {\n            const scaleFactorX = textWidth / measuredWidth\n            if (Math.abs(scaleFactorX - 1) > 0.01) {\n              textSpan.style.transform = `scaleX(${scaleFactorX})`\n              textSpan.style.transformOrigin = '0% 0%'\n            }\n          }\n        }\n        \n        // Essential styles for text selection\n        textSpan.style.userSelect = 'text'\n        textSpan.style.pointerEvents = 'auto'\n        textSpan.style.cursor = 'text'\n        \n        // Add to text layer\n        textLayerRef.current?.appendChild(textSpan)\n      })\n\n    } catch (error) {\n      console.error('Error rendering text layer:', error)\n      if (onError) {\n        onError(new Error(`Text layer rendering failed: ${error instanceof Error ? error.message : 'Unknown error'}`))\n      }\n    }\n  }, [pageNumber, enableTextSelection, onError])\n\n  // Render when dependencies change\n  useEffect(() => {\n    renderPage()\n  }, [renderPage]) // Now stable since fewer dependencies\n\n  // Force text layer re-render when scale changes to fix text selection after zoom\n  useEffect(() => {\n    if (page && viewport && enableTextSelection && textLayerRef.current && !rendering) {\n      // Small delay to ensure viewport is fully updated\n      const timeoutId = setTimeout(() => {\n        console.debug(`Scale changed to ${scale}, re-rendering text layer`)\n        renderTextLayer(page, viewport).catch(error => {\n          console.warn('Failed to re-render text layer after scale change:', error)\n        })\n      }, 50)\n      \n      return () => clearTimeout(timeoutId)\n    }\n  }, [scale, page, viewport, enableTextSelection, rendering, renderTextLayer])\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return cancelRender\n  }, [cancelRender])\n\n  const containerStyle: React.CSSProperties = {\n    position: 'relative',\n    display: 'inline-block',\n    backgroundColor: 'white',\n    boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',\n    margin: '10px',\n    ...style,\n  }\n\n  const canvasStyle: React.CSSProperties = {\n    display: 'block',\n    maxWidth: '100%',\n    height: 'auto',\n  }\n\n  const textLayerStyle: React.CSSProperties = {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    width: viewport ? `${viewport.width}px` : '100%',\n    height: viewport ? `${viewport.height}px` : '100%',\n    overflow: 'hidden',\n    lineHeight: 1,\n    userSelect: enableTextSelection ? 'text' : 'none',\n    pointerEvents: enableTextSelection ? 'auto' : 'none',\n    cursor: enableTextSelection ? 'text' : 'default',\n    // Ensure text layer is above canvas but below highlights\n    zIndex: 1,\n    // Ensure crisp text rendering without GPU acceleration that can break alignment\n    fontSmooth: 'always',\n    WebkitFontSmoothing: 'antialiased',\n    // Prevent text selection highlighting from showing (since text is transparent)\n    WebkitUserSelect: enableTextSelection ? 'text' : 'none',\n    MozUserSelect: enableTextSelection ? 'text' : 'none',\n    msUserSelect: enableTextSelection ? 'text' : 'none',\n  }\n\n  const highlightLayerStyle: React.CSSProperties = {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    pointerEvents: 'none',\n    // Ensure highlights are above text layer\n    zIndex: 2,\n  }\n\n  return (\n    <div \n      className={`pdf-page ${className}`} \n      style={containerStyle}\n      ref={containerRef}\n    >\n      <canvas\n        ref={canvasRef}\n        style={canvasStyle}\n      />\n      \n      {enableTextSelection && (\n        <div\n          ref={textLayerRef}\n          style={textLayerStyle}\n          className=\"pdf-text-layer\"\n        />\n      )}\n      \n      {highlights.length > 0 && viewport && (\n        (() => {\n          // Debug logging for highlights\n          console.log(`PDFPage rendering highlights for page ${pageNumber}:`, {\n            totalHighlights: highlights.length,\n            pageHighlights: highlights.filter(h => h.pageNumber === pageNumber).length,\n            viewport: { width: viewport.width, height: viewport.height, scale: viewport.scale }\n          })\n          return (\n            <div style={highlightLayerStyle} className=\"pdf-highlight-layer\">\n              <PDFHighlight\n                highlights={highlights.filter(h => h.pageNumber === pageNumber)}\n                pageNumber={pageNumber}\n                viewport={viewport}\n              />\n            </div>\n          )\n        })()\n      )}\n    </div>\n  )\n}\n\nexport default PDFPage ","import React from 'react'\nimport type { PDFHighlightProps, PDFHighlight as PDFHighlightType, PDFRect } from './types'\n\nexport const PDFHighlight: React.FC<PDFHighlightProps> = ({\n  highlights,\n  pageNumber,\n  viewport,\n  onHighlightClick,\n  className = '',\n  style,\n}) => {\n  const handleHighlightClick = (highlight: PDFHighlightType) => {\n    if (onHighlightClick) {\n      onHighlightClick(highlight)\n    }\n    if (highlight.onClick) {\n      highlight.onClick(highlight)\n    }\n  }\n\n  const renderHighlight = (highlight: PDFHighlightType) => {\n    const { rects, color = '#ffff00', opacity = 0.3 } = highlight\n\n    return rects.map((rect: PDFRect, index: number) => {\n      // Simplified coordinate transformation\n      // PDF coordinates: origin at bottom-left, Y increases upward\n      // Screen coordinates: origin at top-left, Y increases downward\n      const canvasRect = {\n        left: rect.left * viewport.scale,\n        top: (viewport.height - rect.top - rect.height) * viewport.scale,\n        width: rect.width * viewport.scale,\n        height: rect.height * viewport.scale,\n      }\n\n      // Debug logging\n      console.log(`PDFHighlight render:`, {\n        original: rect,\n        viewport: { width: viewport.width, height: viewport.height, scale: viewport.scale },\n        transformed: canvasRect\n      })\n\n      const highlightStyle: React.CSSProperties = {\n        position: 'absolute',\n        left: `${canvasRect.left}px`,\n        top: `${canvasRect.top}px`,\n        width: `${canvasRect.width}px`,\n        height: `${canvasRect.height}px`,\n        backgroundColor: color,\n        opacity,\n        pointerEvents: 'auto',\n        cursor: highlight.onClick || onHighlightClick ? 'pointer' : 'default',\n        zIndex: 10,\n        border: '1px solid red', // Debug border to make highlights visible\n      }\n\n      return (\n        <div\n          key={`${highlight.id}-${index}`}\n          style={highlightStyle}\n          onClick={() => handleHighlightClick(highlight)}\n          title={highlight.content || `Highlight ${highlight.id}`}\n          className=\"pdf-highlight-rect\"\n        />\n      )\n    })\n  }\n\n  const containerStyle: React.CSSProperties = {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    width: `${viewport.width}px`,\n    height: `${viewport.height}px`,\n    pointerEvents: 'none',\n    ...style,\n  }\n\n  return (\n    <div className={`pdf-highlights ${className}`} style={containerStyle}>\n      {highlights\n        .filter(highlight => highlight.pageNumber === pageNumber)\n        .map(highlight => (\n          <div key={highlight.id} className=\"pdf-highlight\">\n            {renderHighlight(highlight)}\n          </div>\n        ))}\n    </div>\n  )\n}\n\nexport default PDFHighlight ","import * as pdfjsLib from 'pdfjs-dist'\nimport { retryWorkerConfiguration, getWorkerSrc } from './worker'\nimport type { PDFDocumentProxy, PDFLoadingTask } from './types'\n\ninterface PDFLoadOptions {\n  file: string | File | ArrayBuffer | Uint8Array\n  retries?: number\n  timeout?: number\n}\n\ninterface PDFLoadResult {\n  pdf: PDFDocumentProxy | null\n  error: Error | null\n  retriesUsed: number\n}\n\n/**\n * Robust PDF loader with retry logic and worker failure handling\n */\nexport class PDFLoader {\n  private static readonly DEFAULT_RETRIES = 3\n  private static readonly DEFAULT_TIMEOUT = 30000 // 30 seconds\n  \n  /**\n   * Load PDF with automatic retry on worker failures\n   */\n  static async loadPDF(options: PDFLoadOptions): Promise<PDFLoadResult> {\n    const { file, retries = this.DEFAULT_RETRIES, timeout = this.DEFAULT_TIMEOUT } = options\n    let lastError: Error | null = null\n    let retriesUsed = 0\n\n    for (let attempt = 0; attempt <= retries; attempt++) {\n             try {\n         console.log(`PDF Load attempt ${attempt + 1}/${retries + 1}, worker: ${getWorkerSrc()}`)\n         \n         // Create loading task\n         const loadingTask = await this.createLoadingTask(file)\n         \n         // Add timeout to the loading task\n         const pdf = await Promise.race([\n           loadingTask.promise,\n           new Promise<never>((_, reject) => \n             setTimeout(() => reject(new Error('PDF loading timeout')), timeout)\n           )\n         ])\n\n        console.log('PDF loaded successfully')\n        return { pdf, error: null, retriesUsed: attempt }\n        \n             } catch (error) {\n         retriesUsed = attempt + 1\n         lastError = error instanceof Error ? error : new Error(String(error))\n         \n         console.warn(`PDF load attempt ${attempt + 1} failed:`, lastError.message)\n         \n         // Check if it's a worker-related error\n         if (this.isWorkerError(lastError) && attempt < retries) {\n           console.log('Worker error detected, trying alternative worker...')\n           \n           // Wait a bit before retrying\n           await new Promise(resolve => setTimeout(resolve, 1000))\n           \n           // Try to configure a different worker\n           const retrySuccess = retryWorkerConfiguration()\n           if (!retrySuccess) {\n             console.warn('No more worker fallbacks available')\n             break\n           }\n           \n           // Wait a bit more for worker to initialize\n           await new Promise(resolve => setTimeout(resolve, 1000))\n         } else if (attempt < retries) {\n           // Non-worker error, still retry but with shorter delay\n           await new Promise(resolve => setTimeout(resolve, 500))\n         }\n       }\n     }\n\n     // If all attempts failed, try one more time with a fresh worker reset\n     if (!lastError || this.isWorkerError(lastError)) {\n       console.log('All attempts failed, trying complete worker reset...')\n       try {\n         // Import reset function to avoid circular dependency\n         const { resetWorkerConfiguration } = await import('./worker')\n         resetWorkerConfiguration()\n         \n         // Give more time for complete reset and reconfiguration\n         await new Promise(resolve => setTimeout(resolve, 2000))\n         \n         // One final attempt\n         const loadingTask = await this.createLoadingTask(file)\n         const pdf = await Promise.race([\n           loadingTask.promise,\n           new Promise<never>((_, reject) => \n             setTimeout(() => reject(new Error('Final attempt timeout')), 15000)\n           )\n         ])\n         \n         console.log('PDF loaded successfully after complete worker reset')\n         return { pdf, error: null, retriesUsed: retriesUsed + 1 }\n       } catch (finalError) {\n         console.error('Final attempt after worker reset also failed:', finalError)\n         lastError = finalError instanceof Error ? finalError : new Error(String(finalError))\n      }\n    }\n\n    return { pdf: null, error: lastError, retriesUsed }\n  }\n\n     /**\n    * Create PDF loading task based on file type\n    */\n   private static async createLoadingTask(file: string | File | ArrayBuffer | Uint8Array): Promise<PDFLoadingTask> {\n     if (typeof file === 'string') {\n       // URL\n       return pdfjsLib.getDocument({\n         url: file,\n         // Add some additional options for better reliability\n         stopAtErrors: false,\n         maxImageSize: 1024 * 1024, // 1MB max image size\n         cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/cmaps/`,\n         cMapPacked: true,\n       })\n     } else if (file instanceof File) {\n       // File object - convert to ArrayBuffer\n       const arrayBuffer = await file.arrayBuffer()\n       return pdfjsLib.getDocument({\n         data: arrayBuffer,\n         stopAtErrors: false,\n       })\n     } else {\n       // ArrayBuffer or Uint8Array\n       return pdfjsLib.getDocument({\n         data: file,\n         stopAtErrors: false,\n       })\n     }\n   }\n\n  /**\n   * Check if an error is related to worker issues\n   */\n  private static isWorkerError(error: Error): boolean {\n    const workerErrorKeywords = [\n      'worker',\n      'terminated',\n      'destroyed',\n      'Worker',\n      'Transport destroyed',\n      'Cannot resolve module',\n      'Failed to fetch',\n      'NetworkError',\n      'CORS',\n      'Invalid `workerSrc`',\n      'workerSrc',\n    ]\n\n    return workerErrorKeywords.some(keyword => \n      error.message.toLowerCase().includes(keyword.toLowerCase())\n    )\n  }\n\n  /**\n   * Preload worker to check if it's working\n   */\n  static async testWorker(): Promise<boolean> {\n    try {\n      // Try to load a minimal PDF to test the worker\n      const testPdfData = new Uint8Array([\n        37, 80, 68, 70, 45, 49, 46, 52, 10, 37, 226, 227, 207, 211, 10, 49, 32, 48, 32, 111, 98, 106, 10, 60, 60, 10, 47, 84, 121, 112, 101, 32, 47, 67, 97, 116, 97, 108, 111, 103, 10, 47, 80, 97, 103, 101, 115, 32, 50, 32, 48, 32, 82, 10, 62, 62, 10, 101, 110, 100, 111, 98, 106, 10, 50, 32, 48, 32, 111, 98, 106, 10, 60, 60, 10, 47, 84, 121, 112, 101, 32, 47, 80, 97, 103, 101, 115, 10, 47, 75, 105, 100, 115, 32, 91, 51, 32, 48, 32, 82, 93, 10, 47, 67, 111, 117, 110, 116, 32, 49, 10, 62, 62, 10, 101, 110, 100, 111, 98, 106, 10, 51, 32, 48, 32, 111, 98, 106, 10, 60, 60, 10, 47, 84, 121, 112, 101, 32, 47, 80, 97, 103, 101, 10, 47, 80, 97, 114, 101, 110, 116, 32, 50, 32, 48, 32, 82, 10, 47, 77, 101, 100, 105, 97, 66, 111, 120, 32, 91, 48, 32, 48, 32, 54, 49, 50, 32, 55, 57, 50, 93, 10, 62, 62, 10, 101, 110, 100, 111, 98, 106, 10, 120, 114, 101, 102, 10, 48, 32, 52, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 54, 53, 53, 51, 53, 32, 102, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53, 32, 48, 48, 48, 48, 48, 32, 110, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 55, 52, 32, 48, 48, 48, 48, 48, 32, 110, 32, 10, 48, 48, 48, 48, 48, 48, 48, 49, 50, 49, 32, 48, 48, 48, 48, 48, 32, 110, 32, 10, 116, 114, 97, 105, 108, 101, 114, 10, 60, 60, 10, 47, 83, 105, 122, 101, 32, 52, 10, 47, 82, 111, 111, 116, 32, 49, 32, 48, 32, 82, 10, 62, 62, 10, 115, 116, 97, 114, 116, 120, 114, 101, 102, 10, 49, 55, 56, 10, 37, 37, 69, 79, 70\n      ])\n\n      const loadingTask = pdfjsLib.getDocument({ data: testPdfData })\n      const testPdf = await Promise.race([\n        loadingTask.promise,\n        new Promise<never>((_, reject) => \n          setTimeout(() => reject(new Error('Worker test timeout')), 5000)\n        )\n      ])\n\n      await testPdf.destroy()\n      return true\n    } catch (error) {\n      console.warn('Worker test failed:', error)\n      return false\n    }\n  }\n} ","import { useEffect, useCallback } from 'react'\nimport type { ToolbarTool, ViewMode } from './types'\n\nexport interface KeyboardShortcutsHandlers {\n  onNextPage: () => void\n  onPreviousPage: () => void\n  onFirstPage: () => void\n  onLastPage: () => void\n  onZoomIn: () => void\n  onZoomOut: () => void\n  onActualSize: () => void\n  onRotateClockwise: () => void\n  onRotateCounterClockwise: () => void\n  onPresentationMode: () => void\n  onHandTool: () => void\n  onTextSelection: () => void\n  onFind: () => void\n  onFindNext: () => void\n  onFindPrevious: () => void\n  onDownload: () => void\n  onPrint: () => void\n  onOpenFile: () => void\n  onGoToPage: () => void\n  onToggleSidebar: () => void\n}\n\nexport const useKeyboardShortcuts = (\n  enabled: boolean = true,\n  handlers: Partial<KeyboardShortcutsHandlers> = {}\n) => {\n  const handleKeyDown = useCallback((event: KeyboardEvent) => {\n    if (!enabled) return\n\n    // Don't handle shortcuts when typing in inputs\n    const target = event.target as HTMLElement\n    if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n      return\n    }\n\n    const { key, ctrlKey, metaKey, shiftKey, altKey } = event\n    const modKey = ctrlKey || metaKey // Handle both Ctrl (PC) and Cmd (Mac)\n\n    // Prevent browser default for our handled shortcuts\n    let preventDefault = true\n\n    switch (key.toLowerCase()) {\n      // Navigation shortcuts\n      case 'n':\n      case 'j':\n        if (!modKey) {\n          handlers.onNextPage?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case 'p':\n      case 'k':\n        if (!modKey) {\n          handlers.onPreviousPage?.()\n        } else if (modKey && altKey && key === 'p') {\n          // Ctrl+Alt+P for presentation mode\n          handlers.onPresentationMode?.()\n        } else if (modKey && key === 'p') {\n          // Ctrl+P for print\n          handlers.onPrint?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case 'home':\n        handlers.onFirstPage?.()\n        break\n\n      case 'end':\n        handlers.onLastPage?.()\n        break\n\n      case 'arrowleft':\n        if (!modKey) {\n          handlers.onPreviousPage?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case 'arrowright':\n        if (!modKey) {\n          handlers.onNextPage?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case 'arrowup':\n      case 'pageup':\n        handlers.onPreviousPage?.()\n        break\n\n      case 'arrowdown':\n      case 'pagedown':\n        handlers.onNextPage?.()\n        break\n\n      case ' ':\n        // Space bar for next page (in presentation mode)\n        if (!shiftKey) {\n          handlers.onNextPage?.()\n        } else {\n          // Shift + Space for previous page\n          handlers.onPreviousPage?.()\n        }\n        break\n\n      case 'enter':\n        // Enter for next page (in presentation mode)\n        if (!shiftKey) {\n          handlers.onNextPage?.()\n        } else {\n          // Shift + Enter for previous page\n          handlers.onPreviousPage?.()\n        }\n        break\n\n      // Zoom shortcuts\n      case '+':\n      case '=':\n        if (modKey) {\n          handlers.onZoomIn?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case '-':\n        if (modKey) {\n          handlers.onZoomOut?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case '0':\n        if (modKey) {\n          handlers.onActualSize?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      // Rotation shortcuts\n      case 'r':\n        if (!modKey && !shiftKey) {\n          handlers.onRotateClockwise?.()\n        } else if (!modKey && shiftKey) {\n          handlers.onRotateCounterClockwise?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      // Tool shortcuts\n      case 'h':\n        if (!modKey) {\n          handlers.onHandTool?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case 's':\n        if (!modKey) {\n          handlers.onTextSelection?.()\n        } else if (modKey) {\n          // Ctrl+S for download\n          handlers.onDownload?.()\n        }\n        break\n\n      // Search shortcuts\n      case 'f':\n        if (modKey) {\n          handlers.onFind?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      case 'g':\n        if (modKey && !shiftKey) {\n          handlers.onFindNext?.()\n        } else if (modKey && shiftKey) {\n          handlers.onFindPrevious?.()\n        } else if (modKey && altKey) {\n          // Ctrl+Alt+G for go to page\n          handlers.onGoToPage?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      // File operations\n      case 'o':\n        if (modKey) {\n          handlers.onOpenFile?.()\n        } else {\n          preventDefault = false\n        }\n        break\n\n      // Note: 'p' case is handled above in navigation section for both\n      // page navigation and print (Ctrl+P) and presentation (Ctrl+Alt+P)\n\n      // Function keys\n      case 'f4':\n        handlers.onToggleSidebar?.()\n        break\n\n      default:\n        preventDefault = false\n        break\n    }\n\n    if (preventDefault) {\n      event.preventDefault()\n      event.stopPropagation()\n    }\n  }, [enabled, handlers])\n\n  useEffect(() => {\n    if (!enabled) return\n\n    document.addEventListener('keydown', handleKeyDown)\n    return () => {\n      document.removeEventListener('keydown', handleKeyDown)\n    }\n  }, [enabled, handleKeyDown])\n\n  return null\n}\n\nexport default useKeyboardShortcuts ","import * as pdfjsLib from 'pdfjs-dist'\nimport type { PDFDocumentProxy, PDFHighlight, PDFRect } from './types'\nimport { \n  isWorkerConfiguredProperly, \n  getWorkerSrc, \n  getWorkerRetryCount,\n  configurePDFWorker,\n  resetWorkerConfiguration\n} from './worker'\n\n/**\n * Create highlights for text search across all pages of a PDF document\n * @param pdfDocument - The loaded PDF document\n * @param searchText - Text to search and highlight\n * @param color - Highlight color (default: '#ffff00')\n * @param opacity - Highlight opacity (default: 0.3)\n * @returns Array of highlight objects\n */\nexport async function createHighlightsForText(\n  pdfDocument: PDFDocumentProxy,\n  searchText: string,\n  color: string = '#ffff00',\n  opacity: number = 0.3\n): Promise<PDFHighlight[]> {\n  if (!pdfDocument || !searchText.trim()) {\n    return []\n  }\n\n  const highlights: PDFHighlight[] = []\n  \n  try {\n    // Search through all pages\n    for (let pageNum = 1; pageNum <= pdfDocument.numPages; pageNum++) {\n      const page = await pdfDocument.getPage(pageNum)\n      const textContent = await page.getTextContent()\n      \n      // Combine all text items into a single string with position tracking\n      let fullText = ''\n      const textItems: any[] = []\n      \n      textContent.items.forEach((item: any) => {\n        if (item.str && typeof item.str === 'string') {\n          textItems.push({\n            text: item.str,\n            startIndex: fullText.length,\n            endIndex: fullText.length + item.str.length,\n            transform: item.transform,\n            width: item.width,\n            height: item.height\n          })\n          fullText += item.str\n        }\n      })\n      \n      // Search for the text (case-insensitive)\n      const searchRegex = new RegExp(searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi')\n      let match\n      \n      while ((match = searchRegex.exec(fullText)) !== null) {\n        const startIndex = match.index\n        const endIndex = startIndex + match[0].length\n        \n        // Find text items that contain this match\n        const rects: PDFRect[] = []\n        \n        for (const textItem of textItems) {\n          // Check if this text item overlaps with our match\n          if (textItem.endIndex > startIndex && textItem.startIndex < endIndex) {\n            const [scaleX, , , scaleY, translateX, translateY] = textItem.transform\n            \n            // Calculate the rectangle for this text item using PDF coordinates\n            const fontSize = Math.abs(scaleY)\n            const left = translateX\n            const top = translateY\n            const width = textItem.width || Math.abs(scaleX) * textItem.text.length\n            const height = fontSize\n            \n            rects.push({\n              left: left,\n              top: top,\n              width: width,\n              height: height\n            })\n          }\n        }\n        \n        if (rects.length > 0) {\n          const highlight = {\n            id: `highlight-${pageNum}-${startIndex}`,\n            pageNumber: pageNum,\n            rects: rects,\n            color: color,\n            opacity: opacity,\n            content: match[0]\n          }\n          \n          highlights.push(highlight)\n        }\n      }\n    }\n    \n    console.log(`Found ${highlights.length} highlights for \"${searchText}\"`)\n    return highlights\n    \n  } catch (error) {\n    console.error('Error creating highlights:', error)\n    return []\n  }\n}\n\n/**\n * Extract document metadata and information\n * @param pdfDocument - The loaded PDF document\n * @returns Document information object\n */\nexport async function extractDocumentInfo(pdfDocument: PDFDocumentProxy) {\n  try {\n    const metadata = await pdfDocument.getMetadata()\n    return {\n      numPages: pdfDocument.numPages,\n      fingerprints: pdfDocument.fingerprints,\n      ...metadata.info\n    }\n  } catch (error) {\n    console.error('Error extracting document info:', error)\n    return null\n  }\n}\n\n/**\n * Search for text in a specific page\n * @param pdfDocument - The loaded PDF document\n * @param pageNumber - Page number to search (1-based)\n * @param searchText - Text to search for\n * @returns Array of matches with position information\n */\nexport async function searchTextInPage(\n  pdfDocument: PDFDocumentProxy,\n  pageNumber: number,\n  searchText: string\n): Promise<Array<{ text: string, pageNumber: number, position: { x: number, y: number } }>> {\n  if (!pdfDocument || !searchText.trim() || pageNumber < 1 || pageNumber > pdfDocument.numPages) {\n    return []\n  }\n\n  try {\n    const page = await pdfDocument.getPage(pageNumber)\n    const textContent = await page.getTextContent()\n    const matches: Array<{ text: string, pageNumber: number, position: { x: number, y: number } }> = []\n    \n    let fullText = ''\n    const textItems: any[] = []\n    \n    textContent.items.forEach((item: any) => {\n      if (item.str && typeof item.str === 'string') {\n        textItems.push({\n          text: item.str,\n          startIndex: fullText.length,\n          endIndex: fullText.length + item.str.length,\n          transform: item.transform\n        })\n        fullText += item.str\n      }\n    })\n    \n    const searchRegex = new RegExp(searchText.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi')\n    let match\n    \n    while ((match = searchRegex.exec(fullText)) !== null) {\n      const startIndex = match.index\n      \n      // Find the text item that contains this match\n      for (const textItem of textItems) {\n        if (textItem.startIndex <= startIndex && textItem.endIndex > startIndex) {\n          const [, , , , translateX, translateY] = textItem.transform\n          matches.push({\n            text: match[0],\n            pageNumber: pageNumber,\n            position: { x: translateX, y: translateY }\n          })\n          break\n        }\n      }\n    }\n    \n    return matches\n  } catch (error) {\n    console.error('Error searching text in page:', error)\n    return []\n  }\n}\n\n/**\n * Get text content from a specific page\n * @param pdfDocument - The loaded PDF document\n * @param pageNumber - Page number (1-based)\n * @returns Plain text content of the page\n */\nexport async function getPageTextContent(\n  pdfDocument: PDFDocumentProxy,\n  pageNumber: number\n): Promise<string> {\n  if (!pdfDocument || pageNumber < 1 || pageNumber > pdfDocument.numPages) {\n    return ''\n  }\n\n  try {\n    const page = await pdfDocument.getPage(pageNumber)\n    const textContent = await page.getTextContent()\n    \n    return textContent.items\n      .map((item: any) => item.str || '')\n      .join(' ')\n      .trim()\n  } catch (error) {\n    console.error('Error getting page text content:', error)\n    return ''\n  }\n}\n\n/**\n * Download PDF file from URL with CORS handling\n * @param url - PDF file URL\n * @returns File blob or null if failed\n */\nexport async function downloadPDFFromUrl(url: string): Promise<Blob | null> {\n  try {\n    const response = await fetch(url, {\n      method: 'GET',\n      mode: 'cors',\n      headers: {\n        'Accept': 'application/pdf,*/*'\n      }\n    })\n    \n    if (!response.ok) {\n      throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n    }\n    \n    const blob = await response.blob()\n    \n    // Validate PDF header\n    const arrayBuffer = await blob.arrayBuffer()\n    const uint8Array = new Uint8Array(arrayBuffer)\n    const header = String.fromCharCode(...uint8Array.slice(0, 4))\n    \n    if (header !== '%PDF') {\n      throw new Error('Invalid PDF file: Missing PDF header')\n    }\n    \n    return blob\n  } catch (error) {\n    console.error('Error downloading PDF:', error)\n    return null\n  }\n}\n\n/**\n * Create a blob URL from file data\n * @param file - File object or blob\n * @returns Blob URL string\n */\nexport function createBlobUrl(file: File | Blob): string {\n  return URL.createObjectURL(file)\n}\n\n/**\n * Cleanup blob URL to free memory\n * @param url - Blob URL to cleanup\n */\nexport function cleanupBlobUrl(url: string): void {\n  if (url.startsWith('blob:')) {\n    URL.revokeObjectURL(url)\n  }\n}\n\n/**\n * Predefined sample texts for testing highlighting functionality\n */\nexport const SAMPLE_HIGHLIGHT_TEXTS = {\n  traceMonkey: \"r functions in order to verify that the call stack is refreshedat any point it needs to be used. In order to access the call stack,a function must be annotated as either FORCESSTACK or RE-QUIRESSTACK. These annotations are also required in order to callREQUIRESSTACK functions, which are presumed to access the callstack transitively. FORCESSTACK is a trusted annotation, appliedto only 5 functions, that means the function refreshes the call stack.REQUIRESSTACK is an untrusted a\",\n  \n  title: \"Trace-based Just-in-Time Type Specialization for Dynamic\",\n  \n  introduction: \"Dynamic languages such as JavaScript, Python, and Ruby, are popular since they are expressive, accessible to non-experts, and make deployment as easy as distributing a source file\",\n  \n  compilation: \"We present a trace-based compilation technique for dynamic languages that reconciles speed of compilation with excellent performance of the generated machine code\"\n} as const\n\n/**\n * Sample PDF URLs for testing\n */\nexport const SAMPLE_PDF_URLS = {\n  mozilla_tracemonkey: 'https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf',\n  local_tracemonkey: '/compressed.tracemonkey-pldi-09.pdf'\n} as const\n\n/**\n * Get current worker status and information\n * @returns Worker information object\n */\nexport function getWorkerInfo() {\n  return {\n    configured: isWorkerConfiguredProperly(),\n    workerSrc: getWorkerSrc(),\n    retryCount: getWorkerRetryCount()\n  }\n}\n\n/**\n * Test PDF.js worker functionality\n * @returns Promise that resolves to test result\n */\nexport async function testWorker(): Promise<{ success: boolean, message: string }> {\n  try {\n    await configurePDFWorker()\n    return { success: true, message: 'Worker test passed ✅' }\n  } catch (error) {\n    return { \n      success: false, \n      message: `Worker test failed: ${error instanceof Error ? error.message : 'Unknown error'} ❌` \n    }\n  }\n}\n\n/**\n * Reset PDF.js worker configuration\n */\nexport function resetWorker(): void {\n  resetWorkerConfiguration()\n}\n\n/**\n * Utility class for managing PDF operations\n */\nexport class PDFUtils {\n  static createHighlights = createHighlightsForText\n  static extractInfo = extractDocumentInfo\n  static searchInPage = searchTextInPage\n  static getPageText = getPageTextContent\n  static downloadFromUrl = downloadPDFFromUrl\n  static createBlobUrl = createBlobUrl\n  static cleanupBlobUrl = cleanupBlobUrl\n  static getWorkerInfo = getWorkerInfo\n  static testWorker = testWorker\n  static resetWorker = resetWorker\n  static samples = {\n    texts: SAMPLE_HIGHLIGHT_TEXTS,\n    urls: SAMPLE_PDF_URLS\n  }\n} "],"mappings":"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QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA,QAAK;AAAA,QAAI;AAAA,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","names":["React","useEffect","useRef","useState","useCallback","useState","useRef","jsx","jsxs","useEffect","useRef","useState","useCallback","jsx","jsx","jsxs","useRef","useState","useCallback","style","useEffect","resetWorkerConfiguration","useEffect","useCallback","jsx","jsxs","useState","useRef","useCallback","error","file","useEffect","scale","page","React"]}