
    sj+f                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZmZ ddlmZ g dZ eh d          Z eh d	          Zd
Zd
Zd
ZdZdZdZdZ dZ!dZ" G d de#          Z$dhdZ% e&            Z'e'a(de)d<    ej*                    Z+dZ,da-de)d<   didZ.djdZ/dhd Z0dkd#Z1dhd$Z2d%Z3d&Z4d'Z5d(Z6d)Z7dld+Z8dmd-Z9dnd0Z:dod2Z;d%Z<d3Z=dpd8Z>dqdrd;Z?dkd<Z@dsd=ZAdtd>ZBdudAZCdvdCZDdwdEZEdFZFdxdHZGdydzdNZHdhdOZId{dTZJdhdUZKdhdVZLd|dYZMd}d[ZNd~d]ZOdd_ZPddaZQddeZRddgZSdS )uh  Stdlib document-to-text extraction for ``read_file``.

Supports Jupyter notebooks, DOCX, and XLSX without adding hard dependencies.
When the optional ``firecrawl-anydoc`` package is installed (``pip install
firecrawl-anydoc``, imports as ``anydoc``), coverage widens to legacy Office
(.doc/.ppt/.xls), OpenDocument, RTF, EPUB, and PDF — converted to Markdown by
its Rust core. The stdlib extractors remain authoritative for their three
formats so behavior is identical whether or not anydoc is present.
Malformed documents raise :class:`ExtractionError`; callers can then fall back to
normal text/binary handling.
    )annotationsN)Path)AnyOptional)ElementTree)EXTRACTABLE_EXTENSIONSExtractionErrorextract_document_bytesextract_document_textis_extractable_document>   .docx.xlsx.ipynb>   .doc.odp.ods.odt.pot.pps.ppt.rtf.xls.docm.epub.ppsm.ppsx.pptm.pptx.xlsb.xlsm.pdfi   i     z<http://schemas.openxmlformats.org/wordprocessingml/2006/mainz9http://schemas.openxmlformats.org/spreadsheetml/2006/mainzChttp://schemas.openxmlformats.org/officeDocument/2006/relationshipsz<http://schemas.openxmlformats.org/package/2006/relationshipsc                      e Zd ZdZdS )r	   zDRaised when a supported-looking document cannot be rendered as text.N)__name__
__module____qualname____doc__     6/home/agent/.hermes/hermes-agent/tools/read_extract.pyr	   r	   >   s        NNNNr)   r	   pathstrreturnc                    t          |           j                                        }|t          v r|S |t          v rt                      |S dS )N )r   suffixlowerr   ANYDOC_EXTENSIONS_anydocr+   exts     r*   
_extensionr6   B   sL    
t**

!
!
#
#C
$$$

GII$9
2r)   r   _anydoc_moduleg     r@zOptional[float]_anydoc_failed_atOptional[Any]c                 B   t           t          urt           S t          5  t           t          urt           cddd           S t          2t	          j                    t          z
  t          k     r	 ddd           dS 	 ddlm}   | dd           n/# t          $ r" t	          j                    aY ddd           dS w xY w	 t          j        d          a n/# t          $ r" t	          j                    aY ddd           dS w xY wdaddd           n# 1 swxY w Y   t           S )a'  Lazily import the optional anydoc converter; None when unavailable.

    A failed load is retried after :data:`ANYDOC_RETRY_SECONDS` rather than
    disabling extraction for the rest of the process, so one transient
    failure (network blip, pip race) does not stick in long-lived workers.
    Nr   )ensureztool.doc_extractF)promptanydoc)r7   _ANYDOC_UNSET_anydoc_lockr8   time	monotonicANYDOC_RETRY_SECONDStools.lazy_depsr;   	Exception	importlibimport_module)_lazy_ensures    r*   r3   r3   U   s    ]**	 ! !..!! ! ! ! ! ! ! ! )  #447KKK! ! ! ! ! ! ! !	>>>>>> L+E::::: 	 	 	 $ 0 0! ! ! ! ! ! ! !		&4X>>NN 	 	 	 $ 0 0)! ! ! ! ! ! ! !$	 !+! ! ! ! ! ! ! ! ! ! ! ! ! ! !, s^   D,D9BDB9*D8B99D=CDC>/D=C>>DDDboolc                :    t          t          |                     S N)rH   r6   )r+   s    r*   r   r   x   s    
4  !!!r)   c                    t          |           }|dk    rt          |           S |dk    rt          |           S |dk    rt          |           S |t          v rt          |           S t          d|           )Nr   r   r   Unsupported document type: )r6   _extract_notebook_extract_docx_extract_xlsxr2   _extract_anydocr	   r4   s     r*   r   r   |   s    
T

C
h &&&
g~~T"""
g~~T"""
t$$$
@@@
A
AAr)   databytesc                n   t          |           t          k    r*t          dt          |           ddt          dd          t          |          }|t          v rt          | |          S |t          vrt          d|          d}	 t          j        |d          5 }|	                    |            |j
        }d	d	d	           n# 1 swxY w Y   t          |          |r&	 t          j        |           S # t          $ r Y S w xY wS # |r&	 t          j        |           w # t          $ r Y w w xY ww xY w)
zBExtract a document already fetched across a file backend boundary.Document too large to convert (, bytes, limit is )rL   r/   Fr0   deleteN)lenMAX_DOCUMENT_BYTESr	   r6   r2   _extract_anydoc_bytesr   tempfileNamedTemporaryFilewritenamer   osunlinkOSError)rQ   r+   r5   	temp_pathfhs        r*   r
   r
      s   
4yy%%%cc$iicccL^cccc
 
 	
 T

C
$T4000
(((DDDDEEE I
(EBBB 	 bHHTNNNI	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  %Y// 		)$$$$   	9 		)$$$$   	sf   	D
 C<D
 CD
 CD
 $C99
DD
D4D#"D4#
D0-D4/D00D4c                N   t                      }|t          d|           	 t          j                            |           }n/# t
          $ r"}t          t          |                    |d }~ww xY w|t          k    rt          d|ddt          dd          	 |                    |           }nc# t
          $ r"}t          t          |                    |d }~wt          $ r,}t          t          |          j         d|           |d }~ww xY wt          |t                    r|                                st          d          |                    d          dz   }t          |           j                                        d	k    rt%          |           }|r||z   }|S 
NrL   rT   rU   rV   rW   : z%Document contains no extractable text
r!   )r3   r	   ra   r+   getsizerc   r,   MAX_ANYDOC_BYTESto_markdownrD   typer$   
isinstancestriprstripr   r0   r1   _pdf_coverage_note)r+   modsizeexctextnotes         r*   rP   rP      s   
))C
{DDDDEEE1wt$$ 1 1 1c#hh''S01\d\\\GW\\\\
 
 	
	Gt$$ 1 1 1c#hh''S0 G G G
 c!3<<s<<==3FG dC   G

 GEFFF;;tt#DDzz  F**!$'' 	 $;DKs;   A 
A0A++A0B2 2
D<CD&'DD      g?
   g      4@Optional[list[str]]c                   t          j        d          dS 	 t          j        d| dgdt                    }n# t
          t          j        f$ r Y dS w xY w|j        dk    rdS |j        	                    dd	          
                    d
          }|r.|d                                         s|                                 |pdS )z5Per-page extracted text, or None when undeterminable.	pdftotextN-T)capture_outputtimeoutr   utf-8replace)errors)shutilwhich
subprocessrunPDF_PAGE_SCAN_TIMEOUTrc   SubprocessError
returncodestdoutdecodesplitro   pop)r+   procpagess      r*   _pdf_page_textsr      s    |K  (t~$$)
 
 

 Z/0   tt!tKwy99??EEE U2Y__&& 		=Ds   8 AAOptional[list[int]]c                @    t          |           }|dS d |D             S )zAPer-page extracted-text char counts, or None when undeterminable.Nc                P    g | ]#}t          |                                          $S r(   rZ   ro   .0pages     r*   
<listcomp>z)_pdf_page_char_counts.<locals>.<listcomp>   s(    000$C

000r)   )r   )r+   r   s     r*   _pdf_page_char_countsr      s-    D!!E}t00%0000r)   r   	list[int]c                    d t          |           D             }t          |          dk    r|dd         dgz   }d                    |          S )z3Compact 1-based range list, e.g. '2-29, 33-35, 42'.c                L    g | ]!\  }}||k    r| d | nt          |          "S )r}   r,   r   abs      r*   r   z _page_ranges.<locals>.<listcomp>   s8    OOO$!Q166ZZAZZZs1vvOOOr)      Nu   …, )_group_rangesrZ   join)r   partss     r*   _page_rangesr      sR    OO-:N:NOOOE
5zzBcrc
eW$99Ur)   list[list[int]]c                    g }| D ]<}|r!||d         d         dz   k    r||d         d<   %|                     ||g           =|S )z9Group sorted 1-based page numbers into [start, end] runs.r      )append)r   rangesps      r*   r   r      sb     F " " 	"a6":a=1,,,F2JqMMMM1a&!!!!Mr)   <   countstexts	list[str]emptyc                   t          |          }g }|dt                   D ]\  }}d}t          |dz
  dd          D ][}| |         t          k    rHd                    ||                                                   dt                   }	d|	 d|dz    d	} n\||k    rd
| nd| d| }
||z
  dz   }|                    d|
 d| d|dk    rdnd d	|            t          |          t          k    rQ|t          d         }t          d |D                       }|                    dt          |           d| d           d                    |          S )zPer-gap breakdown: each empty range labeled with the last text seen
    before it (usually a section divider/header page), so the agent can
    decide WHICH gaps it actually needs to read instead of OCRing all of
    them.Nr/   rx   r    u    — after "z" (pr   rW   zpage zpages r}   z  z (z pagesc              3  ,   K   | ]\  }}||z
  d z   V  dS )r   Nr(   r   s      r*   	<genexpr>z_gap_map.<locals>.<genexpr>$  s.      44tq!Q444444r)   u     … z more gaps (z pages)ri   )
r   PDF_GAP_MAP_MAX_ENTRIESrangePDF_EMPTY_PAGE_CHARSr   r   _GAP_CONTEXT_CHARSr   rZ   sum)r   r   r   r   linesr   r   labelprevsnippetspannrest
rest_pagess                 r*   _gap_mapr     s   
 5!!FE///0 
K 
K1!a%R(( 	 	Dd|333((5;#4#4#6#6778K9K8KL?w??D1H??? 4  1ff{q{{{*:1*:*:q*:*:EAII$II!IIa##RII%IIJJJJ
6{{,,,-../44t44444
Hc$iiHHZHHHIII99Ur)   display_pathOptional[str]c           
        t          |           }|rt          |          dk     rdS d |D             }d t          |          D             }t          |          }t          |          t          k     rdS t          |          |z  t          k     rt          |          t
          k     rdS |p| }dt          |           d| dt          |||           d| d		S )
u$  A warning header when many PDF pages produced no text, else ''.

    ``path`` is the file scanned with pdftotext (may be a host temp file
    for backend-transferred bytes); ``display_path`` is the path shown in
    the recovery command — the one the agent's terminal can actually see.
    rx   r/   c                P    g | ]#}t          |                                          $S r(   r   r   s     r*   r   z&_pdf_coverage_note.<locals>.<listcomp>3  s(    222Dc$**,,222r)   c                4    g | ]\  }}|t           k     |d z   S )r   )r   )r   ir   s      r*   r   z&_pdf_coverage_note.<locals>.<listcomp>4  s+    MMMtq!A8L4L4LQU4L4L4Lr)   z[EXTRACTION COVERAGE WARNING: z of u   pages in this PDF yielded no text. Those pages are likely scanned images (or blank) — their content is MISSING from the extracted text below, even where section headers appear with empty bodies. Unreadable gaps, each labeled with the last text extracted before it:
u   
Decide which gaps you actually need — do NOT OCR or render everything. For the gaps that matter, render just that range with `pdftoppm -jpeg -r 150 -f <first> -l <last> 'z' /tmp/page` and inspect each image with the vision_analyze tool, or use the ocr-and-documents skill (marker-pdf) for bulk OCR of large ranges.]
)r   rZ   	enumeratePDF_COVERAGE_MIN_EMPTYPDF_COVERAGE_MIN_RATIOPDF_COVERAGE_ABSOLUTE_EMPTYr   )r+   r   r   r   r   totalshowns          r*   rq   rq   )  s    D!!E CJJNNr22E222FMMy00MMMEKKE
5zz***rE

U333JJ444r DE	u::	 	 	 	 FE5))	 	 9>	 	 	r)   c                   t                      }|t          d|          t          |           t          k    r*t          dt          |           ddt          dd          	 |                    |           }n9# t
          $ r,}t          t          |          j         d|           |d }~ww xY wt          |t                    r|
                                st          d          |                    d          dz   }t          |          j                                        d	k    rt          | |          }|r||z   }|S rg   )r3   r	   rZ   rk   to_markdown_bytesrD   rm   r$   rn   r,   ro   rp   r   r0   r1   _pdf_coverage_note_from_bytes)rQ   r+   rr   ru   rt   rv   s         r*   r\   r\   O  sb   
))C
{DDDDEEE
4yy###ac$iiaaaL\aaaa
 
 	
G$$T** G G Gc!3<<s<<==3FGdC   G

 GEFFF;;tt#DDzz  F**,T488 	 $;DKs   &A< <
B2'B--B2c                   d}	 t          j        dd          5 }|                    |            |j        }ddd           n# 1 swxY w Y   t	          ||          |r&	 t          j        |           S # t          $ r Y S w xY wS # t          $ r. Y |r(	 t          j        |           dS # t          $ r Y dS w xY wdS w xY w# |r&	 t          j        |           w # t          $ r Y w w xY ww xY w)u  Coverage note for backend-transferred PDF bytes.

    pdftotext is path-oriented, so materialize the bytes in a private host
    temp file for the scan; the recovery command still names
    ``display_path`` — the path the agent's terminal backend can see.
    r/   r!   FrX   N)r   )r]   r^   r_   r`   rq   ra   rb   rc   )rQ   r   rd   re   s       r*   r   r   g  s    I(uEEE 	 HHTNNNI	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  "),GGG  		)$$$$   	     		)$$$$$   	 	  		)$$$$   	s   B AB AB 
AB !A66
BB
B?C B+ +
B98B9>B??C C,CC,
C(%C,'C((C,c                    t          | t                    r| S t          | t                    rd                    d | D                       S dS )Nr/   c              3  D   K   | ]}t          |t                    |V  d S rJ   rn   r,   )r   items     r*   r   z_source_text.<locals>.<genexpr>  s1      HH*T32G2GHtHHHHHHr)   )rn   r,   listr   )sources    r*   _source_textr   ~  sR    &# &$ IwwHHHHHHHH2r)   n_bytesintc                B    | dk    rt          | dz             dn|  dS )Ni   z KBz B)round)r   s    r*   _human_sizer     s0    ,3tOOeGdN##((((GOr)   payloadc           	         t          j        dd|           }t          dt          |          t          |                    d                    z
            }t          dt          |          dz  dz  |z
            S )zBApproximate decoded size of a base64 payload (whitespace ignored).z[^0-9+/=A-Za-z]r/   rx   =r         )resubminrZ   rp   max)r   cleanpaddings      r*   _base64_bytesr     sh    F%r733E!SZZ#ell3&7&7"8"8899Gq3u::>a''1222r)   ru   c                &   ddl m}  ||                               dd          }g }|                    d          D ]@}d |                    d          D             }|                    |r|d         nd           Ad                    |          S )	a=  Strip ANSI escapes and collapse ``\r`` progress-bar rewrites.

    tqdm and friends redraw the same line via carriage returns; Jupyter
    renders only the final frame, so keeping the text after the last ``\r``
    of each line reproduces what the notebook displays without the invisible
    intermediate frames.
    r   )
strip_ansiz
ri   c                    g | ]}||S r(   r(   )r   frames     r*   r   z&_clean_stream_text.<locals>.<listcomp>  s    ???E?%???r)   r   r/   )tools.ansi_stripr   r   r   r   r   )ru   r   cleanedr   lineframess         r*   _clean_stream_textr     s     ,+++++j&&vt44GEd## 3 3??TZZ%5%5???61VBZZr222299Ur)   i N  outputc                   t          | t                    sdS |                     d          }|dk    rHt          t	          |                     dd                              }|                                r|ndS |dv r|                     d          }d}t          |t                    r,t          d                    d |D                                 }d	|                     d
d           d|                     dd                               d          }| d|                                 S |dv r|                     d          }t          |t                    sSi }t          |                     d          t          t          f          r| d         |d<   dD ]\  }}|| v r| |         ||<   d|v rdS dD ]@}||v r:t          t	          ||                             }|                                r|c S A|
                                D ]c\  }}	t          |t                    rI|                    d          r4t          t	          |	                    }
d| dt          |
           dc S dd|v r)t	          |d                   }dt          |          ddS d                    d |D                       pd}d| dS dS ) aO  Render one notebook output as compact text.

    Keeps stream text, error tracebacks, and textual results; replaces
    token-heavy payloads (base64 images, HTML, widget state) with short
    sized placeholders. Handles both nbformat v4 output shapes and the
    legacy v3 ones (``pyout``/``pyerr``; data flat on the output dict).
    r/   output_typestreamru   >   errorpyerr	tracebackri   c              3  D   K   | ]}t          |t                    |V  d S rJ   r   r   r   s     r*   r   z(_notebook_output_text.<locals>.<genexpr>  s1      NN4
48M8MN$NNNNNNr)   zError: enamerh   evalue>   pyoutdisplay_dataexecute_resultrQ   
text/plain))pngz	image/png)jpegz
image/jpeg)svgzimage/svg+xml)html	text/htmlz(application/vnd.jupyter.widget-view+jsonu    [interactive widget — omitted])r  ztext/markdownzimage/[u    output — z
, omitted]r  u   [text/html output — rU   z chars, omitted]r   c              3  4   K   | ]}t          |          V  d S rJ   r   )r   ms     r*   r   z(_notebook_output_text.<locals>.<genexpr>  s(      //Q#a&&//////r)   unknownu    output — omitted])rn   dictgetr   r   ro   r   r   rp   r,   items
startswithr   r   rZ   )r   otypebodyr   tb_textheaderrQ   v3_keymimevaluers   r  mimess                r*   _notebook_output_textr    s    fd## rJJ}%%E!,vzz&"/E/E"F"FGGzz||+tt+"""JJ{++	i&& 	(		NN9NNNNN G Q6::gr22PPfjj26N6NPPWWX\]]%%G%%,,...;;;zz&!!$%% 	0D&**V,,sDk:: 4%+F^\"!R 0 0V##!'DJ5==55 4 	  	 Dt||),tDz*B*BCC::<<  KKK::<< 	K 	KKD%$$$ K)B)B K$\%%8%899J4JJ[->->JJJJJJ$[ 122DICIIIIIII		//$/////<9.5....2r)   r/   cellr  
jq_pointerfilenamec                j   |                      d          }t          |t                    sdS d d |D             D             }|sdS d                    |          }t	          |          t
          k    r?t	          |          t
          z
  }d}|r
|rd| d| }|d t
                   d|d	d
| dz   }|S )Noutputsr/   c                    g | ]}||S r(   r(   )r   ru   s     r*   r   z%_notebook_outputs.<locals>.<listcomp>  s    SSStdSdSSSr)   c              3  4   K   | ]}t          |          V  d S rJ   )r  )r   os     r*   r   z$_notebook_outputs.<locals>.<genexpr>  s+      JJQ 5a 8 8JJJJJJr)   ri   u    — full output: jq -r 'z' u   
… [rU   z output chars truncated])r  rn   r   r   rZ   _MAX_OUTPUT_CHARS)r  r  r   r"  blocksjoinedomittedhints           r*   _notebook_outputsr,    s    hhy!!Ggt$$ rSSJJ'JJJSSSF rYYvF
6{{&&&f++ 11 	H( 	HGzGGXGGD***+.a.a.a.aZ^.a.a.aaMr)   c           
        	 t          | dd          5 }t          j        |          }d d d            n# 1 swxY w Y   n7# t          t          t          j        f$ r}t          d|           |d }~ww xY wt          |t                    st          d          |	                    d          }t          |t                    rd t          |          D             }n-d t          |	                    d	g                     D             }|st          d
          t          j                            |           }dddd}dddd}g }	|D ] \  }
}t          |t                    s|	                    d          }||vr6||xx         dz  cc<   |dk    rd||          nd}|	                    d||          d| dt!          |	                    dd                                        d          df           |dk    rHt%          ||
|          }|r5|	                    d||          d|                    d          df           |	st          d          d                    |	                              d          dz   S )Nr   r   )encodingr   zNot a valid notebook: zNotebook root is not an objectcellsc                $    g | ]\  }}d | d|fS )z.cells[	].outputsr(   )r   r   r  s      r*   r   z%_extract_notebook.<locals>.<listcomp>  s-    TTTGAt(A((($/TTTr)   c                    g | ]N\  }}t          |t                    t          |                    d g                     D ]\  }}d| d| d|fOS )r/  z.worksheets[z].cells[r1  )rn   r  r   r  )r   wiwscir  s        r*   r   z%_extract_notebook.<locals>.<listcomp>  s     
 
 
B"d##
 &bffWb&9&9::	
 
 D 6B55555t<
 
 
 
r)   
worksheetszNotebook contains no cellsr   )markdowncoderawMarkdownCodeRaw	cell_typer   r9  r   r/   u	   # ── z cell    ──r   ri   r8  u   # ── Output (cell u   ) ──z#Notebook contains no readable cells)openjsonloadrc   
ValueErrorJSONDecodeErrorr	   rn   r  r  r   r   ra   r+   basenameextendr   rp   r,  r   )r+   re   nbrt   	raw_cellsr/  nb_namer   labelsoutr  r  typr0   rendereds                  r*   rM   rM     s   G$;;; 	r2B	 	 	 	 	 	 	 	 	 	 	 	 	 	 	Z!56 G G G<s<<==3FGb$ @>???wI)T"" 
TTy?S?STTT
 
#BFF<$<$<==
 
 
  <:;;;gt$$GQq11F$fUCCFC! h h
D$%% 	hh{##fsq&)Ull"VC["""

AsAA&AAA<PTPXPXYacePfPfCgCgCnCnosCtCtvxyzzz&==(z7CCH h

JVC[JJJHOO\`LaLacefggg ECDDD99S>>  &&--s2   A 5A 9A 9A A5A00A5zfzipfile.ZipFiler`   
ET.Elementc                    	 t          j        |                     |                    S # t          $ r}t	          d|           |d }~wt           j        $ r}t	          d| d|           |d }~ww xY w)NzMissing zMalformed XML in rh   )ET
fromstringreadKeyErrorr	   
ParseError)rM  r`   rt   s      r*   _zip_xmlrV  %  s    J}RWWT]]+++ : : :///00c9= J J J?$??#??@@cIJs    &) 
A3AA3A..A3c                   	 t          j        |           5 }t          |d          }d d d            n# 1 swxY w Y   nT# t           j        $ r}t	          d|           |d }~wt
          $ r"}t	          t          |                    |d }~ww xY wdt           d}g }|                    | d          D ]}g }|                                D ]w}|j	        | dk    r|
                    |j        pd           -|j	        | dk    r|
                    d	           Q|j	        | d
| dhv r|
                    d           x|                    d                    |                              d                     t          d |D                       st	          d          d                    |                              d          dz   S )Nzword/document.xmlzNot a valid DOCX: {}r   tr/   tab	brcrri   c              3  >   K   | ]}|                                 V  d S rJ   ro   r  s     r*   r   z _extract_docx.<locals>.<genexpr>C  s*      ..tzz||......r)   z!DOCX contains no extractable text)zipfileZipFilerV  
BadZipFiler	   rc   r,   _NS_Witertagr   ru   rE  r   r   anyrp   )	r+   rM  rootrt   wr   parabufnodes	            r*   rN   rN   .  s=   1_T"" 	5bB 344D	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 C C C838899sB 1 1 1c#hh''S01 	UAE		Q'''"" 	/ 	/IIKK 	! 	!Dxa777""

49?++++YYY&&

4    hhh1111

4   RWWS\\''--........... CABBB99U""4((4//s9   ? 3? 7? 7? BA!!B.BBc                   	 t          j        |           5 }t          |                                          }t	          ||          }t          |          }t          ||          }g }|D ]\  }}}	|dv rt          |                    |	d                    }
|
|vr3	 t          |
                    |
          |          }n# t          j        $ r Y iw xY w|                    d| d           |                    d |D                        |s|                    d           |                    d           	 d d d            n# 1 swxY w Y   nT# t           j        $ r}t!          d|           |d }~wt"          $ r"}t!          t%          |                    |d }~ww xY w|st!          d          d	                    |                              d	          d	z   S )
N>   hidden
veryHiddenr/   u   # ── Sheet: r>  c              3  @   K   | ]}d                      |          V  dS )r\  N)r   )r   rows     r*   r   z _extract_xlsx.<locals>.<genexpr>[  s,      ::c499S>>::::::r)   z(empty)zNot a valid XLSX: z'XLSX has no visible sheets with contentri   )ra  rb  setnamelist_shared_strings_workbook_sheets_workbook_rels_sheet_partr  _sheet_rowsrS  rQ  rU  r   rE  rc  r	   rc   r,   r   rp   )r+   rM  namessharedsheetsrelsrJ  r`   stateridpartrowsrt   s                r*   rO   rO   H  sW   1_T"" 	b&&E$R//F%b))F!"e,,DC$*   eS444"488C#4#455u$$&rwwt}}f==DD}   H

;d;;;<<<

::T:::::: *JJy)))

2	 	 	 	 	 	 	 	 	 	 	 	 	 	 	*  C C C838899sB 1 1 1c#hh''S01  IGHHH99S>>  &&--sl   E BE
#CE
CE
CA(E
>E 
EE EE F'%E88F'F""F'ry  set[str]c                    d|vrg S 	 t          j        |                     d                    }n# t           j        $ r g cY S w xY wdt           dfd|                     d          D             S )Nzxl/sharedStrings.xmlrX  rY  c           	     z    g | ]7}d                      d |                     d          D                       8S )r/   c              3  (   K   | ]}|j         pd V  dS r/   Nru   r   rZ  s     r*   r   z-_shared_strings.<locals>.<listcomp>.<genexpr>q  s(      ==QAFLb======r)   rZ  )r   re  )r   r   r   s     r*   r   z#_shared_strings.<locals>.<listcomp>q  sF    ^^^$BGG==$))qGGG*<*<=====^^^r)   si)rQ  rR  rS  rU  _NS_Sre  )rM  ry  rh  r   s      @r*   rt  rt  i  s    U**	}RWW%;<<===   			UA^^^^$))WXT\T\T\J]J]^^^^s   '1 AAlist[tuple[str, str, str]]c                    t          | d          }dt           ddt           dc}fd|                    | d          D             S )Nzxl/workbook.xmlrX  rY  c                    g | ]F}|                     d d          |                     dd          |                      dd          fGS )r`   Sheetr}  visibleidr/   r  )r   sheetrs     r*   r   z$_workbook_sheets.<locals>.<listcomp>w  sb        
67	#	#UYYw	%B%BEIIQRhhhXZD[D[\  r)   r  )rV  r  _NS_RELre  )rM  rh  r   r  s      @r*   ru  ru  t  so    B)**D>>>++++DAq   YY!{{{++   r)   dict[str, str]c                    d}||vri S 	 t          j        |                     |                    }n# t           j        $ r i cY S w xY wdt           d}d |                    |          D             S )Nzxl/_rels/workbook.xml.relsrX  z}Relationshipc                    i | ]B}|                     d           |                     d d          |                     dd          CS )Idr/   Targetr  )r   rels     r*   
<dictcomp>z"_workbook_rels.<locals>.<dictcomp>  sK    dddVYV]V]^bVcVcdCGGD"swwx44dddr)   )rQ  rR  rS  rU  _NS_PKG_RELre  )rM  ry  	rels_pathrh  rel_tags        r*   rv  rv  }  s    ,I	}RWWY//00=   			.;...Gdd		'@R@Rdddds   '2 AAtargetc                    |                      d          } t          j        |                     d          r| nd|            S )N/zxl/)lstrip	posixpathnormpathr  )r  s    r*   rw  rw    sA    ]]3F(9(9%(@(@TffnFnnUUUr)   refc                    d}| D ]R}|                                 s n;|dz  t          |                                          z   t          d          z
  dz   }St          |dz
  d          S )Nr      Ar   )isalphaordupperr   )r  idxchs      r*   
_col_indexr    sk    
C 8 8zz|| 	EBhRXXZZ(3s883a7sQw??r)   	xml_bytesrz  list[list[str]]c                  	 t          j        |           }dt           d}g }|                    | d          D ]}t	          |          t
          k    r ni 	d}|                    | d          D ]o}|                    d          r#t          |                    dd                    n|dz   }|t          k    rKt          |||          	|<   t          ||          }p|                    |d	k    r	fd
t          |dz             D             ng            |rTt          d |d         D                       s5|                                 |rt          d |d         D                       5|S )NrX  rY  rq  r   cr  r/   r   r   c                <    g | ]}                     |d           S )r/   r  )r   r   r/  s     r*   r   z_sheet_rows.<locals>.<listcomp>  s'    BBB!UYYq"%%BBBr)   c              3  >   K   | ]}|                                 V  d S rJ   r`  )r   r  s     r*   r   z_sheet_rows.<locals>.<genexpr>  s*      ??U5;;==??????r)   )rQ  rR  r  re  rZ   _MAX_XLSX_ROWS_PER_SHEETr  r  _MAX_XLSX_COLS_cell_valuer   r   r   rg  r   )
r  rz  rh  r   r  rq  max_colr  colr/  s
            @r*   rx  rx    s   =##DUADyyA## \ \t99000E "HHWWW%% 	( 	(D3788C==Q*TXXc2..///gPQkCn$$$T6155E#J'3''GGgQRllBBBBuWq[/A/ABBBBXZ[[[[
 s??d2h????? 


  s??d2h????? Kr)   r   c                   |                      | d          pd}|                     dd          }|dk    r.	 |t          |                   S # t          t          f$ r Y dS w xY w|dk    rQ|                     | d          }|dn4d                    d |                    | d          D                       S |dk    r|                                d	v rd
ndS |dk    r|pdS |S )Nvr/   rZ  r   	inlineStrisc              3  (   K   | ]}|j         pd V  dS r  r  r  s     r*   r   z_cell_value.<locals>.<genexpr>  s(      0\0\!20\0\0\0\0\0\r)   r   >   1TRUEtruer  FALSEez#ERROR)	findtextr  r   rB  
IndexErrorfindr   re  ro   )r  rz  r   r  rK  inlines         r*   r  r    s   MMQ'''""(bE
((3

C
czz	#e**%%J' 	 	 	22	
ka888$$^rr0\0\v{{VWSZSZSZG[G[0\0\0\)\)\\
czz*???vvWL
czz  Ls   A A"!A")r+   r,   r-   r,   )r-   r9   )r+   r,   r-   rH   )rQ   rR   r+   r,   r-   r,   )r+   r,   r-   rz   )r+   r,   r-   r   )r   r   r-   r,   )r   r   r-   r   )r   r   r   r   r   r   r-   r,   rJ   )r+   r,   r   r   r-   r,   )rQ   rR   r   r,   r-   r,   )r-   r,   )r   r   r-   r,   )r   r,   r-   r   )ru   r,   r-   r,   )r   r   r-   r,   )r/   r/   )r  r  r  r,   r   r,   r-   r,   )rM  rN  r`   r,   r-   rO  )rM  rN  ry  r  r-   r   )rM  rN  r-   r  )rM  rN  ry  r  r-   r  )r  r,   r-   r,   )r  r,   r-   r   )r  rR   rz  r   r-   r  )r  rO  rz  r   r   r,   r-   r,   )Tr'   
__future__r   rE   r@  ra   r  r   r   r   r]   	threadingr@   ra  pathlibr   typingr   r   	xml.etreer   rQ  __all__	frozensetr   r2   MAX_XLSX_BYTESrk   r[   r  r  rd  r  r  r  rD   r	   r6   objectr>   r7   __annotations__Lockr?   rB   r8   r3   r   r   r
   rP   r   r   r   r   r   r   r   r   r   r   r   r   rq   r\   r   r   r   r   r   r'  r  r,  rM   rV  rN   rO   rt  ru  rv  rw  r  rx  r  r(   r)   r*   <module>r     s  
 
 
 # " " " " "      				     				                                   ' ' ' ' ' '   ##?#?#?@@ I       " $ %  FC
OLO O O O Oi O O O    # # # # #y~  %)  ) ) ) )       F" " " "
B 
B 
B 
B   8   X           (1 1 1 1            2# # # # #L   0   .   P P P P3 3 3 3   (  = = = =@    "). ). ). ).XJ J J J0 0 0 04. . . .B_ _ _ _   	e 	e 	e 	eV V V V
      *     r)   