§
    �Øjëø  ã                   óh  — 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 d dlmZ d dlmZmZmZmZ d dlZd dlZd dlmZ d dlmZ d dlmZ d d	lmZ 	 d d
lmZ n# e$ r	 d dlmZ Y nw xY wd dl
mZ  e ed¦  «        o e ej!        d¦  «        Z"e"rej!        j#        Z$ndZ$h d£Z%ej&         '                    d¦  «          ej(        ¦   «         Z) ej*        ¦   «         Z+dZ,d ej-        z  ej.        z  ej/        z  ej0        z  ej1        z  ej2        z  Z3 e4ej5        ¦  «        Z5dej6        fd„Z7d„ Z8dNd„Z9defd„Z:d„ Z;d„ Z<d„ Z=d„ Z>d„ Z?de@fd„ZAde@fd„ZBd „ ZCdOd"eDfd#„ZEdPd"eDfd$„ZFdPd"eDfd%„ZGd&„ ZHd'„ ZId(„ ZJd)„ ZKd*„ ZLd+„ ZMdOd"eDfd,„ZNdPd"eDfd-„ZOdPd"eDfd.„ZPdeQfd/„ZRdefd0„ZSdQd2eQfd3„ZTdeDfd4„ZUd5„ ZVd6„ ZWd7„ ZXd8„ ZYd9„ ZZe G d:„ d;¦  «        ¦   «         Z[e G d<„ d=¦  «        ¦   «         Z\e G d>„ d?¦  «        ¦   «         Z]e G d@„ dA¦  «        ¦   «         Z^dB„ Z_dC„ Z`dD„ ZadEdFdFdGdEdd!d!d!d!ejb        d!dHdddfde^fdI„ZceddJk    rmd dleZed dlmZ eejf        dK         Zg eceg¦  «        Zheh i                    d!d!d!¬L¦  «        Zj eeg¦  «         k                    dM¦  «         l                    ej¦  «         dS dS )Ré    N)Údefaultdict)Ú	dataclass)ÚPath)ÚDictÚListÚOptionalÚUnion)Úmupdf)Úutils)Úget_raw_lines)ÚOCRMode)Útqdm)ÚProgressBarÚproÚoffice_to_pdf>   ÚDOCÚHWPÚPPTÚXLSÚDOCXÚHWPXÚPPTXÚXLSXTz	
![](%s)
Úpagec                 ó^   — t           5   | j        di |¤Žcddd¦  «         S # 1 swxY w Y   dS )zDSerialize PyMuPDF layout inference, which uses process-global state.N© )Ú_LAYOUT_LOCKÚ
get_layout)r   Úkwargss     ú˜/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf4llm/helpers/document_layout.pyÚget_layout_lockedr!   8   s�   € å	ð )ð )ØˆtŒÐ(Ð( Ð(Ð(ð)ð )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )s   ˆ"¢&©&c                 ó°  ‡‡— t          ¦   «         }| d         |_        |j        \  ŠŠ}}|                      d¦  «        }g }g }g }‰gˆfd„|j        D ¦   «         z   |gz   }	‰gˆfd„|j        D ¦   «         z   |gz   }
t          |	¦  «        dz
  |_        t          |
¦  «        dz
  |_        t          |j        ¦  «        D ]ñ}g }g }g }t          |j        ¦  «        D ]•}|
|         |	|         |
|dz            |	|dz            f}| 	                    |¦  «         t          j        ||dd¬¦  «        }| 	                    |¦  «         t          j        ||dd¬¦  «        }| 	                    |¦  «         Œ–| 	                    |¦  «         | 	                    |¦  «         | 	                    |¦  «         Œò||_        ||_        t          j        |¦  «        |_        |S )	zƒCreate a TableDetails object.

    The table dictionary is as returned by the Layout module with option
    "return_raw=True".
    Ú
group_bboxÚ
table_gridc                 ó   •— g | ]}|‰z   ‘ŒS r   r   )Ú.0ÚhÚy0s     €r    ú
<listcomp>z%get_table_details.<locals>.<listcomp>K   ó   ø€ Ð3Ð3Ð3 �a˜"‘fÐ3Ð3Ð3ó    c                 ó   •— g | ]}|‰z   ‘ŒS r   r   )r&   ÚvÚx0s     €r    r)   z%get_table_details.<locals>.<listcomp>L   r*   r+   é   F)ÚmarkdownÚocrpageT)ÚTableDetailsÚbboxÚgetÚh_linesÚv_linesÚlenÚ	row_countÚ	col_countÚrangeÚappendr   Úextract_cellsÚcellsÚextractÚtable_to_markdownr0   )Útab_dictÚtable_blocksÚtab_detÚx1Úy1Úgridr=   r>   Úmd_cellsr5   r6   ÚiÚrowÚtext_rowÚmd_rowÚjÚ	cell_bboxÚtextÚmd_textr.   r(   s                      @@r    Úget_table_detailsrO   >   s	  øø€ õ ‰nŒn€GØ˜LÔ)€G„LØ”\�N€BˆˆB�Ø�<Š<˜Ñ%Ô%€DØ€EØ€GØ€HØˆdÐ3Ð3Ð3Ð3 d¤lÐ3Ñ3Ô3Ñ3°r°dÑ:€GØˆdÐ3Ð3Ð3Ð3 d¤lÐ3Ñ3Ô3Ñ3°r°dÑ:€GÝ˜G™œ qÑ(€GÔÝ˜G™œ qÑ(€GÔÝ�7Ô$Ñ%Ô%ð  ð  ˆØˆØˆØˆÝ�wÔ(Ñ)Ô)ð 
	#ð 
	#ˆAØ  œ W¨Q¤Z°¸¸Q¹´ÀÈÈQÉÄÐPˆIØ�JŠJ�yÑ!Ô!Ð!ÝÔ&Ø˜i°%Àðñ ô ˆDð �OŠO˜DÑ!Ô!Ð!ÝÔ)Ø˜i°$Àðñ ô ˆGð �MŠM˜'Ñ"Ô"Ð"Ð"Ø�Š�SÑÔÐØ�Š�xÑ Ô Ð Ø�Š˜ÑÔÐÐØ€G„MØ€G„OÝÔ.¨xÑ8Ô8€GÔØ€Nr+   éd   é
   c                 ór  — | s| S t          d„ | D ¦   «         ¦  «        }t          |||z  ¦  «        }|g|z  }g }| D ]{}g }t          |¦  «        D ]R\  }	}
|
pd}
||	         }t          j        |
|¬¦  «        pdg}|                     d                     |¦  «        ¦  «         ŒS|                     |¦  «         Œ||S )z›
    Pre-wraps a table (List[List[str]]) so that tabulate cannot produce
    absurdly wide tables. Each column gets a width budget based on max_width.
    c              3   ó4   K  — | ]}t          |¦  «        V — Œd S ©N©r7   )r&   rH   s     r    ú	<genexpr>z*wrap_table_for_tabulate.<locals>.<genexpr>p   s(   è è € Ð-Ð- •3�s‘8”8Ð-Ð-Ð-Ð-Ð-Ð-r+   Ú )Úwidthú
)ÚmaxÚ	enumerateÚtextwrapÚwrapr;   Újoin)ÚtableÚ	max_widthÚmin_col_widthÚnum_colsÚ
base_widthÚ
col_widthsÚwrapped_tablerH   Únew_rowÚcol_idxÚcellrX   Úliness                r    Úwrap_table_for_tabulaterj   g   sñ   € ð
 ð Øˆõ Ð-Ð- uÐ-Ñ-Ô-Ñ-Ô-€Hõ �] I°Ñ$9Ñ:Ô:€JØ� Ñ(€Jà€Màð 
&ð 
&ˆØˆÝ& s™^œ^ð 	-ð 	-‰MˆG�TØ�:˜2ˆDØ˜wÔ'ˆEõ ”M $¨eÐ4Ñ4Ô4Ð<¸¸ˆEØ�NŠN˜4Ÿ9š9 UÑ+Ô+Ñ,Ô,Ð,Ð,à×Ò˜WÑ%Ô%Ð%Ð%àÐr+   Úreturnc                 óD  ‡— t          ‰j        ¦  «        t          |¦  «        k    sJ ‚t          d„ ¦  «        }ˆfd„| j        D ¦   «         }| j        | j        | j        ‰j        dœz  |d<   ||d<   g }t          t          ‰j        ¦  «        ¦  «        D ]�}‰j        |         }|dk    r||dz
           nd}	||         }
| 	                    ||j
        t          t          j        |j        |j        |j        |j        ¦  «        ¦  «        |	|
fdœ¦  «         Œ‚||d	<   ||d
<   |S )zÚCreate a page chunk dictionary for output.

    Args:
        doc: the ParsedDocument object
        page: the PageLayout object
        text: the page text string

    Returns:
        dict: page chunk dictionary
    c                  ó   — d S rT   r   r   r+   r    ú<lambda>z!make_page_chunk.<locals>.<lambda>“   s   €  € r+   c                 ó6   •— g | ]}|d          ‰j         k    ¯|‘ŒS )éÿÿÿÿ)Úpage_number)r&   Útr   s     €r    r)   z#make_page_chunk.<locals>.<listcomp>”   s*   ø€ ÐAÐAÐA�q q¨¤u°Ô0@Ò'@Ð'@�Ð'@Ð'@Ð'@r+   )Ú	file_pathÚ
page_countrq   ÚmetadataÚ	toc_itemsr   r/   )ÚindexÚclassr3   ÚposÚ
page_boxesrM   )r7   Úboxesr   Útocru   Úfilenamert   rq   r:   r;   ÚboxclassÚtupleÚpymupdfÚIRectr.   r(   rC   rD   )Údocr   rM   Ústring_lengthsÚchunkÚ	page_tocsrz   rG   ÚbÚstartÚstops    `         r    Úmake_page_chunkr‰   ‡   sN  ø€ õ ˆtŒz‰?Œ?�c .Ñ1Ô1Ò1Ð1Ð1Ð1Ý˜˜Ñ%Ô%€EØAÐAÐAÐA˜CœGÐAÑAÔA€IØœØ”\Ø”nØÔ'ð(ð (ñ €Eˆ*Ñð #€Eˆ+ÑØ€JÝ•3�t”z‘?”?Ñ#Ô#ð 
ð 
ˆØŒJ�qŒMˆØ)*¨Qª¨�˜q 1™uÔ%Ð%°AˆØ˜aÔ ˆØ×ÒàØœÝ�gœm¨A¬D°!´$¸¼¸a¼dÑCÔCÑDÔDØ˜t�}ð	ð ñ	
ô 	
ð 	
ð 	
ð %€Eˆ,ÑØ€Eˆ&�MØ€Lr+   c                 ó®   — t          | ¦  «        dk    r| S t          | ¦  «        }d|cxk    rdk    s!n d|cxk    rdk    sn d|cxk    rdk    rn ndS | S )	z?Check if character is in the Private Use Area (PUA) of Unicode.r/   i à  iÿø  i   iýÿ i   iýÿ rW   )r7   Úord)rM   Úos     r    Úomit_if_pua_charr�   ®   s‹   € å
ˆ4�y„y�A‚~€~ØˆÝˆD‰	Œ	€Aà	�1Ð	Ð	Ò	Ð	˜Ò	Ð	Ð	Ð	Ø�qÐ#Ð#Ò#Ð#˜GÒ#Ð#Ð#Ð#Ø˜Ð%Ð%Ò%Ð%˜XÒ%Ð%Ð%Ð%Ð%àˆrØ€Kr+   c                 óò  — g }g }t          | ¦  «        D ]…\  }}|j        dk    r|r|                     |¦  «         g }Œ*|rB|d         \  }}|j        |j        k    s|j        |j        k     r|                     |¦  «         g }|                     ||f¦  «         Œ†|r|                     |¦  «         i }|s|S t          |¦  «        D ]°\  }}|sŒ|                     d„ ¬¦  «         |d         d         |d         d         dfg}	|dd…         D ]Z\  }
}|	d         \  }}}|j        |j        dz   k    r|dz   }|	                     |
||f¦  «         ŒB|	                     |
||f¦  «         Œ[|	D ]\  }
}}|||
<   ŒŒ±|S )	zñMap the layout box number of each list-item to its hierarchy level.

    Args:
        layout_info (list): the bbox list "page.layout_information"

    Returns:
        dict: {bbox sequence number: level} where level is 1 for top-level.
    ú	list-itemrp   c                 ó   — | d         j         S )Nr/   )r.   )Úxs    r    rn   z)create_list_item_levels.<locals>.<lambda>ã   s   € ˜Q˜qœTœW€ r+   ©Úkeyr   r/   NrQ   )r[   r~   r;   r.   rC   rD   r(   Úsort)Úlayout_infoÚsegmentsÚsegmentrG   ÚitemÚ_Ú	prev_itemÚ	item_dictÚsÚleveled_itemsÚidxr3   Úprev_idxÚ	prev_bboxÚprev_lvlÚcurr_lvlÚlvls                    r    Úcreate_list_item_levelsr¤   ¼   sú  € ð €HØ€Gõ
 ˜[Ñ)Ô)ð "ð "‰ˆˆ4ØŒ=˜KÒ'Ð'Øð Ø—’ Ñ(Ô(Ð(Ø�ØØð 	Ø" 2œ;‰LˆAˆyØŒw˜œÒ%Ð%¨¬°9´<Ò)?Ð)?à—’ Ñ(Ô(Ð(Ø�Ø�Š˜˜4�yÑ!Ô!Ð!Ð!Øð !Ø�Š˜Ñ Ô Ð à€IØð ØÐõ ˜(Ñ#Ô#ð !ð !‰ˆˆ1Øð 	ØØ	�ŠÐ$Ð$ˆÑ%Ô%Ð%ð ˜Aœ$˜qœ' 1 Q¤4¨¤7¨AÐ.Ð/ˆØ˜1˜2˜2œð 	<ð 	<‰IˆC�Ø,9¸"Ô,=Ñ)ˆH�i àŒw˜œ¨Ñ*Ò*Ð*Ø# a™<�Ø×$Ò$ c¨4°Ð%:Ñ;Ô;Ð;Ð;à×$Ò$ c¨4°Ð%:Ñ;Ô;Ð;Ð;Ø+ð 	!ð 	!‰NˆC��sØ ˆI�c‰NˆNð	!àÐr+   c                 ó†   — t          | ¦  «        }d}| D ](}t          d„ |d         D ¦   «         ¦  «        }|r|dz  }Œ)||k    S )zƒDetect text bboxes with all mono-spaced lines.

    Returns True if all lines are mono-spaced.
    Used to output code blocks.
    r   c              3   ó¸   K  — | ]U}|d                                ¦   «         °t          |d         t          j        z  ot	          j        |¦  «         ¦  «        V — ŒVdS )rM   ÚflagsN)ÚisspaceÚboolr€   ÚTEXT_FONT_MONOSPACEDr   Úis_ocr_text©r&   rœ   s     r    rV   z is_monospaced.<locals>.<genexpr>ÿ   st   è è € ð 
ð 
àØ�V”9×$Ò$Ñ&Ô&ð
Ý��7”�gÔ:Ñ:ÐWÅ5ÔCTÐUVÑCWÔCWÐ?WÑXÔXð
ð 
ð 
ð 
ð 
ð 
r+   Úspansr/   )r7   Úall)Ú	textlinesÚ
line_countÚmonoÚlÚall_monos        r    Úis_monospacedr´   õ   sq   € õ �Y‘”€JØ€Dàð ð ˆÝð 
ð 
à�w”Zð
ñ 
ô 
ñ 
ô 
ˆð
 ð 	Ø�A‰IˆDøØ�:ÒÐr+   c                 ó  — | d         }| d         }|sdS |d         }|d         dz  rdS t          |¦  «        dk     rdS |d	         d         |d         d	         d         k     r|d
         |d         d
         dz  k    rdS dS )Nr­   r3   Fr   r§   r/   Té   ÚoriginÚsizegš™™™™™é?rU   )Úliner­   Ú	line_bboxÚspan0s       r    Úis_superscriptedr¼   	  s�   € Ø�ŒM€EØ�V”€IØð ØˆuØ�!ŒH€EØˆW„~˜Ñð ØˆtÝ
ˆ5�z„z�A‚~€~ØˆuàˆhŒ˜Ô˜U 1œX hÔ/°Ô2Ò2Ð2Ø�&ŒM˜U 1œX fÔ-°Ñ3Ò3Ð3àˆtØˆ5r+   c                 ó~  — d}t          | ¦  «        D ]ª\  }}|d         dz  }|d                              ¦   «         }|r,|dk    rd|› d�}n|                     d¦  «        r
|d	d
…         }|                     d¦  «        r5t          |                     ¦   «         d
         ¦  «        dk    r
|d	d…         }||dz   z  }Œ«|S )zÚOutput text without any markdown or other styling.
    Parameter is a list of span dictionaries. The spans may come from
    one or more original "textlines" items.
    Returns the text string of the boundary box.
    rW   r§   r/   rM   r   ú[z] ú Nrp   ú- r¶   éþÿÿÿ)r[   ÚstripÚendswithr7   Úsplit)r­   ÚoutputrG   rœ   ÚsuperscriptÚ	span_texts         r    Úget_plain_textrÈ     sÝ   € ð €FÝ˜%Ñ Ô ð "ð "‰ˆˆ1Ø˜”j 1‘nˆØ�f”I—O’OÑ%Ô%ˆ	Øð 	%à�AŠvˆvØ- 	Ð-Ð-Ð-�	�	Ø—’ Ñ%Ô%ð %Ø   œ�à�?Š?˜4Ñ Ô ð 	!¥S¨¯ª©¬¸Ô);Ñ%<Ô%<¸qÒ%@Ð%@Ø˜C˜R˜C”[ˆFØ�)˜c‘/Ñ!ˆˆØ€Mr+   c                 óè  — | sdS d|dz
  z  }|}| d         }|d         d         }|d         }|d         d         }|d                               ¦   «         }t          |¦  «        s+|                     d¦  «         |r|d         d         d         }| dd…         D ]¯}|d         d         }	|	|d	z
  k     ryt          |¦  «        }
||
z  }|                     ¦   «         d
|› �z   }|d         }t          |d         d                               ¦   «         ¦  «        s|                     d¦  «         n|                     |d         ¦  «         |	}Œ°t          |¦  «        }
||
z  }|                     ¦   «         d
z   S )z-
    Convert "list-item" bboxes to text.
    rW   ú   r/   r   r3   r­   rM   Nr¶   ú

)rÂ   r�   ÚpoprÈ   ÚrstripÚextend)r¯   ÚlevelÚindentrÅ   r¹   r.   r­   r»   Ú
span0_textÚthis_x0Úline_outputs              r    Úlist_item_to_textrÔ   2  s‡  € ð ð ØˆrØ�e˜a‘iÑ €FØ€FØ�QŒ<€DØ	ˆfŒ�aŒ€BØ�ŒM€EØ�ŒM˜!Ô€EØ�v”×$Ò$Ñ&Ô&€Jå˜JÑ'Ô'ð %Ø�	Š	�!‰ŒˆØð 	%Ø�q”˜&Ô! !Ô$ˆBà˜!˜"˜"”ð ð ˆØ�v”,˜q”/ˆØ�R˜!‘VÒÐÝ(¨Ñ/Ô/ˆKØ�kÑ!ˆFØ—]’]‘_”_ ¨f  Ñ6ˆFØ˜”MˆEÝ# E¨!¤H¨VÔ$4×$:Ò$:Ñ$<Ô$<Ñ=Ô=ð Ø—	’	˜!‘”�øà�LŠL˜˜gœÑ'Ô'Ð'ØˆˆÝ  Ñ'Ô'€KØ
ˆkÑ€Fà�=Š=‰?Œ?˜VÑ#Ð#r+   c                 óZ  — | sdS d}| d         }|d         }| dd…         D ]`}t          |¦  «        r4t          |¦  «        }||z  }|                     ¦   «         dz   }|d         }ŒE|                     |d         ¦  «         Œat          |¦  «        }||z  }|                     ¦   «         dz   S )	z,
    Convert "footnote" bboxes to text.
    rW   ú> r   r­   r/   Nú

> rË   )r¼   rÈ   rÍ   rÎ   )r¯   rÅ   r¹   r­   rÓ   s        r    Úfootnote_to_textrØ   W  sÆ   € ð ð Øˆrà€FØ�QŒ<€DØ�ŒM€Eà˜!˜"˜"”ð (ð (ˆå˜DÑ!Ô!ð 	(Ý(¨Ñ/Ô/ˆKØ�kÑ!ˆFØ—]’]‘_”_ xÑ/ˆFØ˜”MˆEˆEà�LŠL˜˜gœÑ'Ô'Ð'Ð'Ý  Ñ'Ô'€KØ
ˆkÑ€Fà�=Š=‰?Œ?˜VÑ#Ð#r+   c                 ó†   — d}| D ]6}d}|d         D ]}|d         }||z  }Œ||                      ¦   «         dz   z  }Œ7|dz  }|S )zpOutput a code block in plain text format.

    Basic difference is that lines are separated by line breaks.
    rW   r­   rM   rY   rË   ©rÍ   ©r¯   rÅ   r¹   Ú	line_textrœ   rÇ   s         r    Úcode_block_to_textrÝ   q  sq   € ð
 €FØð ,ð ,ˆØˆ	Ø�g”ð 	#ð 	#ˆAØ˜&œ	ˆIØ˜Ñ"ˆIˆIØ�)×"Ò"Ñ$Ô$ tÑ+Ñ+ˆˆØ
ˆfÑ€FØ€Mr+   FÚignore_codec                 ó6  — | sdS t          | d         ¦  «        rt          | ¦  «        S |st          | ¦  «        rt          | ¦  «        S g }| D ]9}|d         D ].}t	          |t
          ¦  «        sJ ‚|                     |¦  «         Œ/Œ:t          |¦  «        }|dz   S )zû
    Convert "text" bboxes to plain text, as well as boxclasses
    not specifically handled elsewhere.
    The text of all spans of all lines is written without line breaks.
    At the end, two newlines are added to separate from the next block.
    rW   r   r­   rË   )r¼   rØ   r´   rÝ   Ú
isinstanceÚdictr;   rÈ   )r¯   rÞ   r­   r²   rœ   rÅ   s         r    Útext_to_textrâ   �  sÄ   € ð ð ØˆrÝ˜	 !œÑ%Ô%ð +å 	Ñ*Ô*Ð*àð -�=¨Ñ3Ô3ð -Ý! )Ñ,Ô,Ð,à€EØð ð ˆØ�7”ð 	ð 	ˆAÝ˜a¥Ñ&Ô&Ð&Ð&Ð&Ø�LŠL˜‰OŒOˆOˆOð	õ ˜EÑ"Ô"€FØ�F‰?Ðr+   c                 óª   — | sdS d}| D ]A}d                      d„ |d         D ¦   «         ¦  «        }||                     ¦   «         dz   z  }ŒB|dz  }|dz   S )á  Convert text extracted from images to plain text format.

    In case text has been written inside a picture bbxox, we want to output it
    in some form. Because we cannot be sure about the formatting we simply
    write it line by line wrapped by markers.
    rY   z"----- Start of picture text -----
r¿   c                 ó   — g | ]
}|d          ‘ŒS ©rM   r   r¬   s     r    r)   z(picture_text_to_text.<locals>.<listcomp>¥  ó   € Ð=Ð=Ð=¨A˜a œiÐ=Ð=Ð=r+   r­   z ----- End of picture text -----
©r^   rÍ   ©r¯   rÞ   ÚcliprÅ   ÚtlrÜ   s         r    Úpicture_text_to_textrì   š  s{   € ð ð ØˆtØ2€FØð ,ð ,ˆØ—H’HÐ=Ð=°°G´Ð=Ñ=Ô=Ñ>Ô>ˆ	Ø�)×"Ò"Ñ$Ô$ tÑ+Ñ+ˆˆØ
Ð1Ñ1€FØ�D‰=Ðr+   c           	      óÚ  — t          d„ | D ¦   «         ¦  «        }g }d}| D ]•}|d         }dg|z  }t          |¦  «        |k     r$|d         d         d         |d         dz   k    rd}	nd}	t          ||	¬¦  «        D ]%\  }
}|d	                              ¦   «         › d
�||
<   Œ&|                     |¦  «         Œ–t          j        |ddt          d|z  ¦  «        pd¬¦  «        }||dz   z  }|dz   S )zÎConvert text extracted from unrecognized tables.

    We hope for some sort of table structure being present in the text spans:
    The maximum span count in the lines is assumed to equal column count.
    c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©r­   NrU   ©r&   rë   s     r    rV   z(fallback_text_to_text.<locals>.<genexpr>±  ó.   è è € Ð:Ð:¨"•S˜˜GœÑ%Ô%Ð:Ð:Ð:Ð:Ð:Ð:r+   rW   r­   r   r3   rQ   r/   )r‡   rM   r¿   rE   TrP   N)ÚtablefmtÚdisable_numparseÚmaxcolwidthsrY   )rZ   r7   r[   rÂ   r;   ÚtabulateÚint)r¯   rÞ   rê   Ú
span_countri   rÅ   rë   r­   r¹   rG   rK   rœ   Útab_texts                r    Úfallback_text_to_textrù   «  s1  € õ Ð:Ð:°	Ð:Ñ:Ô:Ñ:Ô:€JØ€EØ€FØð 
ð 
ˆØ�7”ˆàˆt�jÑ ˆÝˆu‰:Œ:˜
Ò"Ð" u¨Q¤x°Ô'7¸Ô':¸TÀ!¼WÀr¹\Ò'IÐ'IØˆAˆAàˆAÝ˜e¨1Ð-Ñ-Ô-ð 	.ð 	.‰DˆAˆqØ˜6œŸšÑ*Ô*Ð-Ð-Ð-ˆD�‰GˆGØ�Š�TÑÔÐÐÝÔ ØØØå˜˜zÑ)Ñ*Ô*Ð2¨dðñ ô €Hð ˆh˜‰oÑ€FØ�D‰=Ðr+   c                 óÒ  — d}d}d}d}d}t          | ¦  «        D �]I\  }}|d         t          j        z  }|d         t          j        z  ot	          j        |¦  «         }	|d         t          j        z  p|d         t          j        j        z  }
|d         t          j	        z  }|d         t          j        j
        z  }|d         t          j        j        z  }|d         t          j        j        z  }g }g }|r*|                     d¦  «         |                     d¦  «         |
r*|                     d¦  «         |                     d¦  «         |r*|                     d¦  «         |                     d¦  «         |r*|                     d	¦  «         |                     d	¦  «         |r*|                     d
¦  «         |                     d¦  «         |r*|                     d¦  «         |                     d¦  «         |	r*|                     d¦  «         |                     d¦  «         d                     |¦  «        }d                     t          |¦  «        ¦  «        }|d                              ¦   «         }|› |› |› d�}|                     |› d�¦  «        rœ|dt%          |¦  «         dz
  …         }	 	 ||f|d         |d         fk    rS|                     d¦  «        r>t%          |                     ¦   «         d         ¦  «        dk    r|dd…         }||z   dz   }n|r	||z   dz   }nd|z   |z   dz   }|d         }|d         }|r|                     d¦  «        }||z  }�ŒK||fS )a4  Output text with markdown style codes based on font properties.
    Parameter is a list of span dictionaries. The spans may come from
    one or more original "textlines" items.
    Returns the text string and the suffix for continuing styles.
    The text string always ends with the suffix and a space
    rW   r   r§   Ú
char_flagsz<sup>z</sup>z**r™   z~~z<u>z</u>z<mark>z</mark>ú`rM   r¿   Nr/   Úblockr¹   ú-rp   r¶   )r[   r€   ÚTEXT_FONT_SUPERSCRIPTrª   r   r«   ÚTEXT_FONT_BOLDr
   ÚFZ_STEXT_BOLDÚTEXT_FONT_ITALICÚFZ_STEXT_STRIKEOUTÚFZ_STEXT_UNDERLINEÚFZ_STEXT_HIGHLIGHTr;   r^   ÚreversedrÂ   rÃ   r7   rÄ   rÍ   )r­   rÅ   ÚprefixÚsuffixÚold_lineÚ	old_blockrG   rœ   rÆ   r±   ÚboldÚitalicÚ	strikeoutÚ	underlineÚ	highlightrÇ   rM   s                    r    Úget_styled_textr  Ê  s˜  € ð €FØ€FØ€FØ€HØ€Iå˜%Ñ Ô ð Nñ N‰ˆˆ1à˜”j¥7Ô#@Ñ@ˆØ�Œz�GÔ8Ñ8ÐUÅÔARÐSTÑAUÔAUÐ=UˆàˆgŒJ�Ô/Ñ/ð =Ø�Œ¥¤Ô!<Ñ<ð 	ð �7”�gÔ6Ñ6ˆØ�l”O¥g¤mÔ&FÑFˆ	Ø�l”O¥g¤mÔ&FÑFˆ	Ø�l”O¥g¤mÔ&FÑFˆ	ð ˆØˆàð 	$Ø�MŠM˜'Ñ"Ô"Ð"Ø�MŠM˜(Ñ#Ô#Ð#àð 	 Ø�MŠM˜$ÑÔÐØ�MŠM˜$ÑÔÐàð 	Ø�MŠM˜#ÑÔÐØ�MŠM˜#ÑÔÐàð 	 Ø�MŠM˜$ÑÔÐØ�MŠM˜$ÑÔÐàð 	"Ø�MŠM˜%Ñ Ô Ð Ø�MŠM˜&Ñ!Ô!Ð!àð 	%Ø�MŠM˜(Ñ#Ô#Ð#Ø�MŠM˜)Ñ$Ô$Ð$àð 	Ø�MŠM˜#ÑÔÐØ�MŠM˜#ÑÔÐà—’˜‘”ˆØ—’� &Ñ)Ô)Ñ*Ô*ˆà�f”I—O’OÑ%Ô%ˆ	ð Ð.˜)Ð. VÐ.Ð.Ð.ˆà�?Š?˜f˜<˜<˜<Ñ(Ô(ð 	6ØÐ.�s 6™{œ{˜l¨QÑ.Ð.Ô/ˆFð ð6à Ð)¨a°¬j¸!¸F¼)Ð-DÒDÐDØ—O’O CÑ(Ô(ð Eå˜Ÿš™œ rÔ*Ñ+Ô+¨aÒ/Ð/à   œ�Ø  6Ñ)¨CÑ/��Øð 6Ø  6Ñ)¨CÑ/��à˜Y‘¨Ñ/°#Ñ5�à�V”9ˆØ�g”Jˆ	Øð 	(Ø—]’] 3Ñ'Ô'ˆFØ�$‰ˆ‰Ø�6ˆ>Ðr+   c                 óv  — | sdS d|dz
  z  }| d         }|d         d         }|d         }|d         d         }|d                               ¦   «         }d}t          j        |¦  «        r.|dd	…                               ¦   «         }||d         d         d<   n†|                     d
¦  «        r|d	d…                              ¦   «         rd}nRd|v rN|                     d¦  «        d         }	|	                     d
¦  «        r|	d	d…                              ¦   «         rd}t          |d                               ¦   «         ¦  «        s+|                     d¦  «         |r|d         d         d         }||z   }
| dd	…         D ] }|d         d         }||dz
  k     rjt          |¦  «        \  }}|
|d|› |› �z   z  }
|d         }t          |d         d                               ¦   «         ¦  «        s|                     d¦  «         n| 	                    |d         ¦  «         |}Œ¡t          |¦  «        \  }}|
|z  }
|
dz   S )aÐ  
    Convert "list-item" bboxes to markdown.
    The first line is prefixed with "- ". Subsequent lines are appended
    without line break if their rectangle does not start to the left
    of the previous line.
    Otherwise, a linebreak and "- " are added to the output string.
    2 units of tolerance is used to avoid spurious line breaks.

    This post-layout heuristics helps cover cases where more than
    one list item is contained in a single bbox.
    rW   rÊ   r/   r   r3   r­   rM   rÀ   Nú.rp   r¿   r¶   rË   )
rÂ   r   Ústartswith_bulletrÃ   ÚisdigitrÄ   r�   rÌ   r  rÎ   )r¯   rÏ   rÐ   r¹   r.   r­   r»   rÑ   ÚstarterÚ
first_wordrÅ   rÒ   rÓ   r  s                 r    Úlist_item_to_mdr  )  sp  € ð ð ØˆrØ�e˜a‘iÑ €FØ�QŒ<€DØ	ˆfŒ�aŒ€BØ�ŒM€EØ�ŒM˜!Ô€EØ�v”×$Ò$Ñ&Ô&€Jà€GÝÔ˜zÑ*Ô*ð Ø   ”^×)Ò)Ñ+Ô+ˆ
Ø#-ˆˆWŒ�aÔ˜Ñ Ð Ø	×	Ò	˜SÑ	!Ô	!ð  j°°"°¤o×&=Ò&=Ñ&?Ô&?ð ØˆˆØ	�
Ð	Ð	Ø×%Ò% cÑ*Ô*¨1Ô-ˆ
Ø×Ò˜sÑ#Ô#ð 	¨
°3°B°3¬×(?Ò(?Ñ(AÔ(Að 	ØˆGå˜E &œM×/Ò/Ñ1Ô1Ñ2Ô2ð %à�	Š	�!‰ŒˆØð 	%Ø�q”˜&Ô! !Ô$ˆBà�gÑ€FØ˜!˜"˜"”ð 
ð 
ˆØ�v”,˜q”/ˆØ�R˜!‘VÒÐÝ"1°%Ñ"8Ô"8ÑˆK˜Ø�kÐ$<¨6Ð$<°7Ð$<Ð$<Ñ<Ñ<ˆFØ˜”MˆEÝ# E¨!¤H¨VÔ$4×$:Ò$:Ñ$<Ô$<Ñ=Ô=ð Ø—	’	˜!‘”�øà�LŠL˜˜gœÑ'Ô'Ð'ØˆˆÝ)¨%Ñ0Ô0Ñ€K�Ø
ˆkÑ€Fà�F‰?Ðr+   c                 ó  — | sdS | d         }|d         }d}| dd…         D ]O}t          |¦  «        r#t          |¦  «        \  }}||dz   z  }|d         }Œ4|                     |d         ¦  «         ŒPt          |¦  «        \  }}||z  }|dz   S )	ap  
    Convert "footnote" bboxes to markdown.
    The first line is prefixed with "> ". Subsequent lines are appended
    without line break if they do not start with a superscript.
    Otherwise, a linebreak and "> " are added to the output string.

    This post-layout heuristics helps cover cases where more than
    one list item is contained in a single bbox.
    rW   r   r­   rÖ   r/   Nr×   rË   )r¼   r  rÎ   )r¯   r¹   r­   rÅ   rÓ   r  s         r    Úfootnote_to_mdr  b  sº   € ð ð ØˆrØ�QŒ<€DØ�ŒM€EØ€FØ˜!˜"˜"”ð (ð (ˆÝ˜DÑ!Ô!ð 	(Ý"1°%Ñ"8Ô"8ÑˆK˜Ø�k HÑ,Ñ,ˆFØ˜”MˆEˆEà�LŠL˜˜gœÑ'Ô'Ð'Ð'Ý)¨%Ñ0Ô0Ñ€K�Ø
ˆkÑ€Fà�F‰?Ðr+   c                 ó¸   — g }|D ]9}|d         D ].}t          |t          ¦  «        sJ ‚|                     |¦  «         Œ/Œ:t          |¦  «        \  }}d| z  › d|› d�S )z6
    Convert "section-header" bboxes to markdown.
    r­   ú#r¿   rË   ©rà   rá   r;   r  ©Úheader_levelr¯   r­   r²   rœ   rÅ   r  s          r    Úsection_hdr_to_mdr  ~  s†   € ð €EØð ð ˆØ�7”ð 	ð 	ˆAÝ˜a¥Ñ&Ô&Ð&Ð&Ð&Ø�LŠL˜‰OŒOˆOˆOð	õ % UÑ+Ô+�N€FˆFØ�LÑ Ð/Ð/ 6Ð/Ð/Ð/Ð/r+   c                 ó¸   — g }|D ]9}|d         D ].}t          |t          ¦  «        sJ ‚|                     |¦  «         Œ/Œ:t          |¦  «        \  }}d| z  › d|› d�S )z�
    Convert "title" bboxes to markdown.
    The line text itself is handled like normal text.
    TODO: Consider joining with section_hdr.
    r­   r  r¿   rË   r  r  s          r    Útitle_to_mdr!  ‹  s†   € ð €EØð ð ˆØ�7”ð 	ð 	ˆAÝ˜a¥Ñ&Ô&Ð&Ð&Ð&Ø�LŠL˜‰OŒOˆOˆOð	õ % UÑ+Ô+�N€FˆFØ�LÑ Ð/Ð/ 6Ð/Ð/Ð/Ð/r+   c                 ó†   — d}| D ]6}d}|d         D ]}|d         }||z  }Œ||                      ¦   «         dz   z  }Œ7|dz  }|S )z'Output a code block in markdown format.z```
rW   r­   rM   rY   z```

rÚ   rÛ   s         r    Úcode_block_to_mdr#  š  so   € à€FØð ,ð ,ˆØˆ	Ø�g”ð 	#ð 	#ˆAØ˜&œ	ˆIØ˜Ñ"ˆIˆIØ�)×"Ò"Ñ$Ô$ tÑ+Ñ+ˆˆØ
ˆiÑ€FØ€Mr+   c                 ó<  — | sdS t          | d         ¦  «        rt          | ¦  «        S |st          | ¦  «        rt          | ¦  «        S g }| D ]9}|d         D ].}t	          |t
          ¦  «        sJ ‚|                     |¦  «         Œ/Œ:t          |¦  «        \  }}|dz   S )zê
    Convert "text" bboxes to markdown, as well as other boxclasses
    not specifically handled elsewhere.
    The line text is written without line breaks. At the end,
    two newlines are added to separate from the next block.
    rW   r   r­   rË   )r¼   r  r´   r#  rà   rá   r;   r  )r¯   rÞ   r­   r²   rœ   rÅ   r  s          r    Ú
text_to_mdr%  §  sÈ   € ð ð ØˆrÝ˜	 !œÑ%Ô%ð )å˜iÑ(Ô(Ð(Øð +�=¨Ñ3Ô3ð +Ý 	Ñ*Ô*Ð*à€EØð ð ˆØ�7”ð 	ð 	ˆAÝ˜a¥Ñ&Ô&Ð&Ð&Ð&Ø�LŠL˜‰OŒOˆOˆOð	õ % UÑ+Ô+�N€FˆFØ�F‰?Ðr+   c                 óª   — | sdS d}| D ]A}d                      d„ |d         D ¦   «         ¦  «        }||                     ¦   «         dz   z  }ŒB|dz  }|dz   S )rä   rY   ú<!-- Start of picture text -->
r¿   c                 ó   — g | ]
}|d          ‘ŒS ræ   r   r¬   s     r    r)   z&picture_text_to_md.<locals>.<listcomp>Ê  rç   r+   r­   z<br>z<!-- End of picture text -->
rè   ré   s         r    Úpicture_text_to_mdr)  ¿  s{   € ð ð ØˆtØ/€FØð .ð .ˆØ—H’HÐ=Ð=°°G´Ð=Ñ=Ô=Ñ>Ô>ˆ	Ø�)×"Ò"Ñ$Ô$ vÑ-Ñ-ˆˆØ
Ð.Ñ.€FØ�D‰=Ðr+   c                 ó  — t          d„ | D ¦   «         ¦  «        }d}|d|dz   z  dz   z  }|dd                     dg|z  ¦  «        z   dz   z  }| D ]2}dd                     d„ |d	         D ¦   «         ¦  «        z   dz   }||z  }Œ3|d
z  }|dz   S )z@
    Convert text extracted from images to markdown format.
    c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rï   rU   rð   s     r    rV   z&fallback_text_to_md.<locals>.<genexpr>Ô  rñ   r+   r'  ú|r/   rY   z---z|
c                 óB   — g | ]}|d                                ¦   «         ‘ŒS ræ   )rÂ   r¬   s     r    r)   z'fallback_text_to_md.<locals>.<listcomp>Ù  s&   € ÐGÐGÐG°a  &¤	§¢Ñ 1Ô 1ÐGÐGÐGr+   r­   z
<!-- End of picture text -->
)rZ   r^   )r¯   rÞ   rê   r÷   rÅ   rë   Últexts          r    Úfallback_text_to_mdr/  Ð  sÁ   € õ Ð:Ð:°	Ð:Ñ:Ô:Ñ:Ô:€JØ/€FØ
ˆc�Z !‘^Ñ$ tÑ+Ñ+€FØ
ˆc�C—H’H˜e˜W zÑ1Ñ2Ô2Ñ2°UÑ:Ñ:€FØð ð ˆØ�c—h’hÐGÐG¸2¸g¼;ÐGÑGÔGÑHÔHÑHÈ5ÑPˆØ�%‰ˆˆØ
Ð0Ñ0€FØ�D‰=Ðr+   c                 ó¬   — t          dt          | j        | j        z
  ¦  «        ¦  «        t          dt          | j        | j        z
  ¦  «        ¦  «        z  S )Nç        )rZ   ÚfloatrC   r.   rD   r(   )Úrects    r    Ú
_rect_arear4  ß  sC   € Ýˆs•E˜$œ' D¤GÑ+Ñ,Ô,Ñ-Ô-µ°C½¸t¼wÈÌÑ?PÑ9QÔ9QÑ0RÔ0RÑRÐRr+   c                 ó  — t          j        | d         ¦  «        }t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        t          |j        ¦  «        g| d         t          | ¦  «        dk    r| d         �t          | d         ¦  «        nd t          | ¦  «        dk    r| d         �t          | d         ¦  «        nd t          | ¦  «        dk    r| d         nd t          | ¦  «        dk    r| d         nd dœS )Nr   r/   r¶   é   é   é   )r3   ÚhtmlÚrowsÚcolsr=   r>   )	r€   ÚRectr2  r.   r(   rC   rD   r7   rö   )Ú
table_itemr3  s     r    Ú_html_table_metar>  ã  só   € ÝŒ<˜
 1œÑ&Ô&€Då�t”w‘”¥ t¤w¡¤µ°t´w±´ÅÀtÄwÁÄÐPØ˜1”õ �:‰Œ Ò"Ð" z°!¤}Ð'@õ �
˜1”ÑÔÐàõ �:‰Œ Ò"Ð" z°!¤}Ð'@õ �
˜1”ÑÔÐàå"% j¡/¤/°AÒ"5Ð"5�˜A”�¸4Ý$'¨
¡O¤O°aÒ$7Ð$7�:˜a”=�=¸Tðð ð r+   ç      à?Ú	thresholdc                 óÒ  — i }|s| |fS d„ | D ¦   «         }t          | ¦  «        }|D �]}t          |¦  «        }t          j        |d         ¦  «        }t	          |¦  «        }	d}
d}|	dk    r1|D ].\  }}||z  }|j        rŒt	          |¦  «        |	z  }||k    r|}
|}Œ/|
�||k     rh|j        |j        |j        |j	        df}| 
                    |¦  «         t          t          j        |¦  «        ¦  «        }
| 
                    |
|f¦  «         |                     |
g ¦  «         
                    |¦  «         �Œ|                     ¦   «         D ]}|                     d„ ¬¦  «         Œ||fS )	zGAssign table_html output to layout table boxes, adding unmatched boxes.c           	      óÖ   — g | ]f}t          |¦  «        d k    ¯|d         dk    ¯!t          t          j        |dd…         ¦  «        ¦  «        t          j        |dd…         ¦  «        f‘ŒgS ©r8  r7  r_   N)r7   r   r€   r�   r<  )r&   Úboxs     r    r)   z0_assign_html_tables_to_boxes.<locals>.<listcomp>ý  sp   € ð ð ð àÝˆs‰8Œ8�qŠ=ˆ=˜S œV wÒ.Ð.õ 
�wŒ}˜S  ! œWÑ%Ô%Ñ	&Ô	&­¬°S¸¸!¸´WÑ(=Ô(=Ð>à.Ð.Ð.r+   r3   Nr1  r   r_   c                 ó:   — | d         d         | d         d         fS )Nr3   r/   r   r   )r˜   s    r    rn   z._assign_html_tables_to_boxes.<locals>.<lambda>!  s   €  T¨&¤\°!¤_°d¸6´lÀ1´oÐ$F€ r+   r’   )Úlistr>  r€   r<  r4  Úis_emptyr.   r(   rC   rD   r;   r   r�   Ú
setdefaultÚvaluesr”   )Úlayout_boxesÚhtml_tablesr@  Úby_boxÚtable_boxesÚaugmented_boxesr=  ÚmetaÚ
table_rectÚ
table_areaÚbest_keyÚ
best_scorer“   Úbox_rectÚinterÚscoreÚ	syntheticÚitemss                     r    Ú_assign_html_tables_to_boxesrY  ÷  sÂ  € à&(€FØð $Ø˜VÐ#Ð#ðð àðñ ô €Kõ
 ˜<Ñ(Ô(€Oà!ð 5ñ 5ˆ
Ý 
Ñ+Ô+ˆÝ”\ $ v¤,Ñ/Ô/ˆ
Ý 
Ñ+Ô+ˆ
ØˆØˆ
Ø˜Š>ˆ>Ø!,ð 'ð '‘��XØ" XÑ-�Ø”>ð ØÝ" 5Ñ)Ô)¨JÑ6�Ø˜:Ò%Ð%Ø"�HØ!&�JøØÐ˜z¨IÒ5Ð5à”Ø”Ø”Ø”ØðˆIð ×"Ò" 9Ñ-Ô-Ð-Ý�Wœ]¨:Ñ6Ô6Ñ7Ô7ˆHØ×Ò ¨*Ð5Ñ6Ô6Ð6Ø×Ò˜( BÑ'Ô'×.Ò.¨tÑ4Ô4Ð4Ñ4à—’‘”ð Hð HˆØ�
Š
ÐFÐFˆ
ÑGÔGÐGÐGØ˜FÐ"Ð"r+   c                 ó(  — t          j        | ¦  «        }t          |¦  «        }|dk    rdS t          j        |j        |j        z   dz  |j        |j        z   dz  ¦  «        }|D ].}||v r dS ||z  }|j        st          |¦  «        |z  dk    r dS Œ/dS )Nr   Fr?  T)	r€   r<  r4  ÚPointr.   rC   r(   rD   rG  )rº   Útable_rectsÚ	line_rectÚ	line_areaÚcenterrP  rU  s          r    Ú_line_claimed_by_tabler`  %  sº   € Ý”˜YÑ'Ô'€IÝ˜9Ñ%Ô%€IØ�A‚~€~ØˆuÝŒ]Ø	Œ˜	œÑ	$¨Ñ+Ø	Œ˜	œÑ	$¨Ñ+ñô €Fð "ð ð ˆ
Ø�ZÐÐØ�4�4Ø˜JÑ&ˆØŒ~ð 	¥*¨UÑ"3Ô"3°iÑ"?À3Ò"FÐ"FØ�4�4øØˆ5r+   c                 óš   — t          j        | d         d         ¦  «        }| dd …         D ]}|t          j        |d         ¦  «        z  }Œ |S )Nr   r3   r/   ©r€   r<  )ri   r3  r¹   s      r    Ú_union_line_rectsrc  7  sP   € ÝŒ<˜˜aœ Ô(Ñ)Ô)€DØ�a�b�b”	ð +ð +ˆØ•”˜T &œ\Ñ*Ô*Ñ*ˆˆØ€Kr+   c           
      ó˜  ‡‡— t          j        | d d…         ¦  «        Št          ˆfd„‰D ¦   «         ¦  «        s| gi fS 	 d„ t          d |‰d¬¦  «        D ¦   «         }n# t          $ r | gi fcY S w xY w|s| gi fS g }i }ˆfd„|D ¦   «         }d }t          |dgz   ¦  «        D �]%\  }}	|	s|€|}Œ|	�r|��|dz
  }
|d	k    r‰j        n't          j        ||dz
           d
         ¦  «        j        }|
t          |¦  «        dz
  k    r‰j        n't          j        ||
dz            d
         ¦  «        j        }||k    r(t          |||
dz   …         ¦  «        }|j        |j        }}‰j
        |‰j        || d         f}|                     |¦  «         |||
dz   …         |t          t          j        |d d…         ¦  «        ¦  «        <   d }�Œ'||fS )Nr7  c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S rT   )Ú
intersects)r&   rP  rT  s     €r    rV   z0_split_text_box_around_tables.<locals>.<genexpr>@  s1   øè è € ÐMÐM°:ˆx×"Ò" :Ñ.Ô.ÐMÐMÐMÐMÐMÐMr+   c                 ó0   — g | ]}|d          |d         dœ‘ŒS ©r   r/   ©r3   r­   r   ©r&   r²   s     r    r)   z1_split_text_box_around_tables.<locals>.<listcomp>D  s8   € ð 
ð 
ð 
àð �q”T A a¤DÐ)Ð)ð
ð 
ð 
r+   F©ÚtextpageÚblocksrê   Úignore_invisiblec                 ó<   •— g | ]}t          |d          ‰¦  «        ‘ŒS ©r3   )r`  )r&   r¹   r\  s     €r    r)   z1_split_text_box_around_tables.<locals>.<listcomp>T  s(   ø€ ÐSÐSÐSÀTÕ% d¨6¤l°KÑ@Ô@ÐSÐSÐSr+   Tr/   r   r3   )r€   r<  Úanyr   Ú	Exceptionr[   r(   rD   r7   rc  r.   rC   r;   r   r�   )rD  Úfulltextr\  ri   Úsplit_boxesÚtextlines_by_boxÚclaimedr‡   rw   Ú
is_claimedÚendr(   rD   r3  Ú	split_boxrT  s     `            @r    Ú_split_text_box_around_tablesrz  >  s_  øø€ ÝŒ|˜C   œGÑ$Ô$€HÝÐMÐMÐMÐMÀÐMÑMÔMÑMÔMð Øˆu�bˆyÐðð
ð 
å"ØØØØ!&ð	ñ ô ð
ñ 
ô 
ˆˆøõ ð ð ð Øˆu�bˆyÐÐÐðøøøàð Øˆu�bˆyÐà€KØÐØSÐSÐSÐSÈUÐSÑSÔS€GØ€EÝ& w°$°Ñ'7Ñ8Ô8ð ñ ÑˆˆzØð 	˜e˜mØˆEˆEØñ 	˜EÑ-Ø˜!‘)ˆCà$¨šz˜z�”�­w¬|¸EÀ%È!Á)Ô<LÈVÔ<TÑ/UÔ/UÔ/Xð ð
 �#˜e™*œ* q™.Ò(Ð(ð ”�å”\ %¨¨a©¤.°Ô"8Ñ9Ô9Ô<ð ð
 �RŠxˆxÝ(¨¨u°s¸Q±w¨Ô)?Ñ@Ô@�Øœ $¤'�B�Ø!œ b¨(¬+°r¸3¸q¼6ÐBˆIØ×Ò˜yÑ)Ô)Ð)ØDIØ˜˜a™�ôEÐ�U¥7¤=°¸2¸A¸2´Ñ#?Ô#?Ñ@Ô@ÑAð ˆEùØÐ(Ð(Ð(s   Á A ÁA0Á/A0c                 óp  — t          | |¦  «        \  }}|s||i fS d„ |                     ¦   «         D ¦   «         }g }i }|D ]s}t          |¦  «        dk     s
|d         dv r|                     |¦  «         Œ5t	          |||¦  «        \  }	}
|                     |	¦  «         |                     |
¦  «         Œt|||fS )zBBuild opt-in HTML-table layout boxes before reading-order sorting.c                 óL   — g | ]!}|D ]}t          j        |d          ¦  «        ‘ŒŒ"S rp  rb  )r&   rX  r˜   s      r    r)   z*normalize_layout_boxes.<locals>.<listcomp>x  sM   € ð ð ð àØðð ð õ 	Œ�T˜&”\Ñ"Ô"ðð ð ð r+   r8  r7  )r_   ÚpictureÚformula)rY  rI  r7   r;   rz  rÎ   Úupdate)rJ  rK  rs  Únormalized_boxesÚhtml_tables_by_boxr\  Úoutput_boxesru  rD  rt  Úsplit_textliness              r    Únormalize_layout_boxesr„  o  s
  € å+GØØñ,ô ,Ñ(ÐÐ(ð ð 8ØÐ!3°RÐ7Ð7ðð à'×.Ò.Ñ0Ô0ðñ ô €Kð
 €LØÐØð 
1ð 
1ˆÝˆs‰8Œ8�aŠ<ˆ<˜3˜qœ6Ð%DÐDÐDØ×Ò Ñ$Ô$Ð$ØÝ'DØØØñ(
ô (
Ñ$ˆ�_ð
 	×Ò˜KÑ(Ô(Ð(Ø×Ò Ñ0Ô0Ð0Ð0ØÐ+Ð-=Ð=Ð=r+   c                 óŽ  — g }| D ]¿}t          |¦  «        dk     s|d         dk    rŒ"|dd…         }t          j        ||¦  «        sŒB|                     t	          t          j        |¦  «        ¦  «        ¦  «        }|r |                     d„ |D ¦   «         ¦  «         Œ˜|                     t          j	        |¦  «        ¦  «         ŒÀ|S )zûRects to exclude: table boxes in layout_information contained in
    container_clip, preferring each one's assigned HTML table bbox (the
    region actually emitted; see html_tables_by_box) over its own layout
    box, which need not be the same rect.r8  r7  r_   Nc              3   óJ   K  — | ]}t          j        |d          ¦  «        V — ŒdS )r3   Nrb  ©r&   r˜   s     r    rV   z(_nested_table_regions.<locals>.<genexpr>›  s0   è è € ÐNÐN¸$�7œ<¨¨V¬Ñ5Ô5ÐNÐNÐNÐNÐNÐNr+   )
r7   r   Úbbox_in_bboxr4   r   r€   r�   rÎ   r;   r<  )Úlayout_informationÚcontainer_clipr�  Úregionsr†   Ú	table_boxrK  s          r    Ú_nested_table_regionsr�  �  sÐ   € ð
 €GØð 
4ð 
4ˆÝˆq‰6Œ6�AŠ:ˆ:˜˜1œ š˜ØØ�b�q�b”Eˆ	ÝÔ! )¨^Ñ<Ô<ð 	ØØ(×,Ò,­Uµ7´=ÀÑ3KÔ3KÑ-LÔ-LÑMÔMˆØð 	4Ø�NŠNÐNÐNÀ+ÐNÑNÔNÑNÔNÐNÐNà�NŠN�7œ<¨	Ñ2Ô2Ñ3Ô3Ð3Ð3Ø€Nr+   c                 ó  ‡
‡— |s| S g }| D ]~}g }|d         D ]Q}|d         \  }}}}	||z   dz  ||	z   dz  cŠ
Št          ˆ
ˆfd„|D ¦   «         ¦  «        s|                     |¦  «         ŒR|r|                     |d         |dœ¦  «         Œ|S )zÐRemove spans whose bbox centre falls inside an excluded region; drop
    a line only once it has no spans left. Per-span (not per-line) so
    unrelated text get_raw_lines joined onto a table's line survives.r­   r3   g       @c              3   óˆ   •K  — | ]<}|d          ‰cxk    o|d         k    nc o|d         ‰cxk    o|d         k    nc V — Œ=dS )r   r¶   r/   r6  Nr   )r&   ÚrÚcxÚcys     €€r    rV   z)_drop_spans_in_regions.<locals>.<genexpr>­  sp   øè è € ÐRÐRÀQ�q˜”t˜rÐ)Ð)Ò)Ð) Q q¤TÒ)Ð)Ð)Ð)Ð@¨a°¬d°bÐ.@Ð.@Ò.@Ð.@¸A¸a¼DÒ.@Ð.@Ð.@Ð.@ÐRÐRÐRÐRÐRÐRr+   ri  )rq  r;   )ri   r‹  Ú
kept_linesr¹   Ú
kept_spansÚspanÚsx0Úsy0Úsx1Úsy1r‘  r’  s             @@r    Ú_drop_spans_in_regionsrš  ¡  sÝ   øø€ ð ð ØˆØ€JØð Kð KˆØˆ
Ø˜”Mð 	(ð 	(ˆDØ!% f¤ÑˆC��c˜3Ø˜C‘i 3Ñ&¨¨s©°cÑ(9ˆFˆB�ÝÐRÐRÐRÐRÐRÈ'ÐRÑRÔRÑRÔRð (Ø×!Ò! $Ñ'Ô'Ð'øØð 	KØ×Ò t¨F¤|¸jÐIÐIÑJÔJÐJøØÐr+   c                   ód   — e Zd ZU dZeed<   dZeed<   dZeed<   dZ	e
ed<   dZe
ed<   dZeed<   dS )r2   Nr3   r8   r9   r=   r>   r0   )Ú__name__Ú
__module__Ú__qualname__r3   r   Ú__annotations__r8   rö   r9   r=   rF  r>   r0   Ústrr   r+   r    r2   r2   ´  sr   € € € € € € à€Dˆ%ÐÐÑØ€IˆsÐÐÑØ€IˆsÐÐÑØ€Eˆ4ÐÐÑØ€GˆTÐÐÑØ€HˆcÐÐÑÐÐr+   r2   c                   óÐ   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dZee         ed<   dZ	ee
         ed<   dZee         ed	<   d
Zee         ed<   dZeee
                  ed<   dS )Ú	LayoutBoxr.   r(   rC   rD   r~   NÚimager_   Úmax_fontsizer   r  r¯   )rœ  r�  rž  r2  rŸ  r   r£  r   Úbytesr_   r   r¤  rö   r  r¯   r   r   r+   r    r¢  r¢  ¾  s®   € € € € € € à€I€I�IØ€I€I�IØ€I€I�IØ€I€I�IØ€M€M�Mð "€Eˆ8�EŒ?Ð!Ð!Ñ!ð !€Eˆ8�DŒ>Ð Ð Ñ ð #'€L�(˜3”-Ð&Ð&Ñ&Ø"#€L�(˜3”-Ð#Ð#Ñ#Ø&*€Iˆx˜˜Tœ
Ô#Ð*Ð*Ñ*Ð*Ð*r+   r¢  c                   óÄ   — e Zd ZU eed<   eed<   eed<   ee         ed<   dZe	ed<   dZ
eee                  ed<   dZeee                  ed	<   dZeee                  ed
<   dS )Ú
PageLayoutrq   rX   Úheightr{   FÚ
full_ocredNrs  ÚwordsÚlinks)rœ  r�  rž  rö   rŸ  r2  r   r¢  r©  r©   rs  r   r   rª  r«  r   r+   r    r§  r§  Ò  s›   € € € € € € àÐÐÑØ€L€L�LØ€M€M�MØ�	Œ?ÐÐÑØ€J�ÐÐÑØ%)€Hˆh�t˜D”zÔ"Ð)Ð)Ñ)Ø"&€Eˆ8�D˜”JÔÐ&Ð&Ñ&Ø"&€Eˆ8�D˜”JÔÐ&Ð&Ñ&Ð&Ð&r+   r§  c                   óª  — e Zd ZU dZee         ed<   dZeed<   dZ	ee
e
                  ed<   dZe
e         ed<   dZee         ed<   dZeed<   d	Zeed
<   dZeed<   dZeed<   ej        Zeed<   	 	 	 	 	 	 	 	 d$dededededededededeee
e         f         fd„Zd%defd„Z	 	 	 	 	 	 	 	 d&dedededededed ed!edeee
e         f         fd"„Zd#„ ZdS )'ÚParsedDocumentNr}   rt   r|   Úpagesru   FÚ
from_bytesé–   Ú	image_dpiÚpngÚimage_formatrW   Ú
image_pathÚuse_ocrTÚheaderÚfooterÚwrite_imagesÚembed_imagesrÞ   Úshow_progressÚpage_separatorsÚpage_chunksrk   c	                 ó 	  — |rg }
nd}
|r<t          | j        ¦  «        dk    r$t          d¦  «         t          | j        ¦  «        }n| j        }|D �]=}d}g }t	          |j        ¦  «        }t          |j        ¦  «        D �]Ì\  }}t          j        |j	        |j
        |j        |j        ¦  «        }|j        }|dk    r'|du r#|                     t          |¦  «        ¦  «         Œe|dk    r'|du r#|                     t          |¦  «        ¦  «         Œ’|dv rét          |j        t"          ¦  «        r|t$          |j        z  dz   z  }nit          |j        t&          ¦  «        rJt)          j        |j        ¦  «                             ¦   «         }d	| j        › d
�|z   }|t$          |z  dz   z  }n|dz  }|j        r%|dv r!|t3          |j        |p|j        |¬¦  «        z  }|                     t          |¦  «        ¦  «         �Œ|dk    r§|j                             d¦  «        r7||j        d         dz   z  }|                     t          |¦  «        ¦  «         �ŒÖ|j        d         }|j        r|                     dd¦  «        }||dz   z  }|                     t          |¦  «        ¦  «         �Œ,t=          |d¦  «        s7t          d|› d�¦  «         |                     t          |¦  «        ¦  «         �Œs|dk    rA|t?          |j         |j        ¦  «        z  }|                     t          |¦  «        ¦  «         �Œº|dk    rA|tC          |j         |j        ¦  «        z  }|                     t          |¦  «        ¦  «         �Œ|dk    rB|tE          |j        ||         ¦  «        z  }|                     t          |¦  «        ¦  «         �ŒI|dk    r;|tG          |j        ¦  «        z  }|                     t          |¦  «        ¦  «         �ŒŠ|tI          |j        |p|j        ¬¦  «        z  }|                     t          |¦  «        ¦  «         �ŒÎ|r|d|j%        ›d�z  }|s|
|z  }
�ŒtM          | |||¦  «        }|
                     |¦  «         �Œ?|
S )z<
        Serialize ParsedDocument to markdown text.
        rW   r8  zGenerating markdown text...úpage-headerFúpage-footer©r}  r~  rË   zdata:image/z;base64,©rÞ   rê   r_   r9  r0   rü   r¯   zWarning: box z has no textlinesÚtitleúsection-headerr�   Úfootnote©rÞ   z--- end of page.page_number=z ---

)'r7   r®  Úprintr   r¤   r{   r[   r€   r�   r.   r(   rC   rD   r~   r;   rà   r£  r   ÚGRAPHICS_TEXTr¥  Úbase64Ú	b64encodeÚdecoder³  r¯   r)  r©  r_   r4   ÚreplaceÚhasattrr!  r  r  r  r  r%  rq   r‰   )Úselfr¶  r·  r¸  r¹  rÞ   rº  r»  r¼  r   Údocument_outputÚthis_iteratorr   Ú	md_stringrƒ   Úlist_item_levelsrG   rD  rê   ÚbtypeÚdataÚ
table_textr„   s                          r    Úto_markdownzParsedDocument.to_markdownë  sÚ  € ð ð 	!Ø ˆOˆOà ˆOàð 	'�S ¤™_œ_¨qÒ0Ð0ÝÐ0Ñ1Ô1Ð1Ý'¨¬
Ñ3Ô3ˆMˆMà œJˆMØ!ð O	.ñ O	.ˆDØˆIØˆNå6°t´zÑBÔBÐå# D¤JÑ/Ô/ð B:ñ B:‘��3Ý”} S¤V¨S¬V°S´V¸S¼VÑDÔD�Øœ�ð ˜MÒ)Ð)¨f¸¨o¨oØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9ØØ˜MÒ)Ð)¨f¸¨o¨oØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9Øð Ð2Ð2Ð2Ý! #¤)­SÑ1Ô1ð -Ø!¥]°S´YÑ%>ÀÑ%GÑG˜	˜	Ý# C¤I­uÑ5Ô5ð -å%Ô/°´	Ñ:Ô:×AÒAÑCÔC˜ØH¨TÔ->ÐHÐHÐHÈ4ÑO˜Ø!¥]°TÑ%9¸FÑ%BÑB˜	˜	à! WÑ,˜	ð ”}ð Ø Ð$:Ð:Ð:Ø%Õ);Ø #¤Ø,7Ð,J¸4¼?Ø%)ð*ñ *ô *ñ ˜Ið
 #×)Ò)­#¨i©.¬.Ñ9Ô9Ð9ÙØ˜GÒ#Ð#Ø”y—}’} VÑ,Ô,ð !Ø! S¤Y¨vÔ%6¸Ñ%?Ñ?˜	Ø&×-Ò-­c°)©n¬nÑ=Ô=Ð=Ù Ø!$¤¨:Ô!6�JØ”ð Aà%/×%7Ò%7¸¸RÑ%@Ô%@˜
Ø ¨fÑ!4Ñ4�IØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9ÙÝ˜s KÑ0Ô0ð ÝÐB¨%ÐBÐBÐBÑCÔCÐCØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9ÙØ˜GÒ#Ð#Ø¥¨SÔ-=¸s¼}Ñ!MÔ!MÑM�IØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9Ñ9ØÐ.Ò.Ð.ØÕ!2°3Ô3CÀSÄ]Ñ!SÔ!SÑS�IØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9Ñ9Ø˜kÒ)Ð)Ø¥°´Ð@PÐQRÔ@SÑ!TÔ!TÑT�IØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9Ñ9Ø˜jÒ(Ð(Ø¥°´Ñ!>Ô!>Ñ>�IØ"×)Ò)­#¨i©.¬.Ñ9Ô9Ð9Ñ9à¥Øœ°;Ð3QÀ$Ä/ð"ñ "ô "ñ �Ið #×)Ò)­#¨i©.¬.Ñ9Ô9Ð9Ñ9Øð GØÐF¨4Ô+;ÐFÐFÐFÑF�	Øð .Ø 9Ñ,�‘å'¨¨d°I¸~ÑNÔN�Ø×&Ò& uÑ-Ô-Ð-Ñ-ØÐr+   c                 óh   — |} G d„ dt           j        ¦  «        }t          j        | |d¬¦  «        }|S )Nc                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ú-ParsedDocument.to_json.<locals>.LayoutEncoderc                 ó¤  •— t          |t          t          f¦  «        r&t          j        |¦  «                             ¦   «         S t          |t          j        t          j        t          j	        t          j
        t          j        f¦  «        rt          |¦  «        S t          |d¦  «        r|j        S t          ¦   «                              |¦  «        S )NÚ__dict__)rà   r¥  Ú	bytearrayrÈ  rÉ  rÊ  r€   r<  r[  ÚMatrixr�   ÚQuadrF  rÌ  rÚ  ÚsuperÚdefault)rÍ  rœ   Ú	__class__s     €r    rß  z5ParsedDocument.to_json.<locals>.LayoutEncoder.default[  s§   ø€ Ý˜a¥%­Ð!3Ñ4Ô4ð 8Ý!Ô+¨AÑ.Ô.×5Ò5Ñ7Ô7Ð7ÝØåœÝœÝœÝœÝœðñ	ô 	ð 
#õ   ™7œ7�NÝ˜1˜jÑ)Ô)ð &Øœ:Ð%Ý‘w”w—’ qÑ)Ô)Ð)r+   )rœ  r�  rž  rß  Ú__classcell__)rà  s   @r    ÚLayoutEncoderrØ  Z  s8   ø€ € € € € ð*ð *ð *ð *ð *ð *ð *ð *ð *r+   râ  F)ÚclsÚensure_ascii)ÚjsonÚJSONEncoderÚdumps)rÍ  rº  r™   râ  Újss        r    Úto_jsonzParsedDocument.to_jsonV  sQ   € àˆð	*ð 	*ð 	*ð 	*ð 	*�DÔ,ñ 	*ô 	*ð 	*õ& ŒZ˜ -¸eÐDÑDÔDˆØˆ	r+   rE   rP   rQ   Útable_formatÚtable_max_widthÚtable_min_col_widthc	                 óÚ  — |t           j        vrt          d|› d�¦  «         d}|rg }
nd}
|r<t          | j        ¦  «        dk    r$t          d¦  «         t          | j        ¦  «        }n| j        }|D �]w}d}g }t          |j        ¦  «        }t          |j        ¦  «        D �]\  }}t          j
        |j        |j        |j        |j        ¦  «        }|j        }|dk    r'|du r#|                     t          |¦  «        ¦  «         Œe|d	k    r'|du r#|                     t          |¦  «        ¦  «         Œ’|d
v rQ|j        r'|dk    r!|t%          |j        |p|j        |¬¦  «        z  }|                     t          |¦  «        ¦  «         Œç|dk    r^t)          |j        d         ||¬¦  «        }|t          j         |d|¬¦  «        dz   z  }|                     t          |¦  «        ¦  «         �ŒK|dk    rB|t-          |j        ||         ¦  «        z  }|                     t          |¦  «        ¦  «         �Œ“|dk    r;|t/          |j        ¦  «        z  }|                     t          |¦  «        ¦  «         �ŒÔ|t1          |j        |p|j        ¬¦  «        z  }|                     t          |¦  «        ¦  «         �Œ|s|
|z  }
�ŒPt3          | |||¦  «        }|
                     |¦  «         �Œy|
S )zb
        Serialize ParsedDocument to plain text. Optionally omit page headers or footers.
        zWarning: invalid table format 'z', using 'grid'.rE   rW   r8  zGenerating plain text ..r¾  Fr¿  rÀ  r}  rÁ  r_   r>   )r`   ra   T)ró   rò   rË   r�   rÄ  rÅ  )rõ   Útabulate_formatsrÆ  r7   r®  r   r¤   r{   r[   r€   r�   r.   r(   rC   rD   r~   r;   r¯   rì   r©  rj   r_   rÔ   rØ   râ   r‰   )rÍ  r¶  r·  rÞ   rº  r¼  rê  rë  rì  r   rÎ  rÏ  r   Útext_stringrƒ   rÑ  rG   rD  rê   rÒ  re   r„   s                         r    Úto_textzParsedDocument.to_textp  s\  € ð �xÔ8Ð8Ð8ÝÐR°LÐRÐRÐRÑSÔSÐSØ!ˆLàð 	!Ø ˆOˆOà ˆOàð 	'�S ¤™_œ_¨qÒ0Ð0ÝÐ-Ñ.Ô.Ð.Ý'¨¬
Ñ3Ô3ˆMˆMà œJˆMØ!ð 6	.ñ 6	.ˆDØˆKØˆNÝ6°t´zÑBÔBÐÝ# D¤JÑ/Ô/ð ,<ñ ,<‘��3Ý”} S¤V¨S¬V°S´V¸S¼VÑDÔD�Øœ�Ø˜MÒ)Ð)¨f¸¨o¨oØ"×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;ØØ˜MÒ)Ð)¨f¸¨o¨oØ"×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;ØØÐ2Ð2Ð2Ø”}ð ¨°)Ò);Ð);Ø#Õ';ØœMØ(3Ð(F°t´Ø!%ð(ñ (ô (ñ ˜ð
 #×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;Ð;à˜gÒ%Ð%Ý$;Øœ	 )Ô,Ø"1Ø&9ð%ñ %ô %�Mð
  Ý Ô)Ø)¸DÈ<ðñ ô ð !ñ!ñ�Kð #×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;Ñ;à˜kÒ)Ð)ØÕ#4°S´]ÐDTÐUVÔDWÑ#XÔ#XÑX�KØ"×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;Ñ;à˜jÒ(Ð(ØÕ#3°C´MÑ#BÔ#BÑB�KØ"×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;Ñ;ð  ¥<Øœ°;Ð3QÀ$Ä/ð$ñ $ô $ñ �Kð #×)Ò)­#¨kÑ*:Ô*:Ñ;Ô;Ð;Ñ;àð .Ø ;Ñ.�‘å'¨¨d°KÀÑPÔP�Ø×&Ò& uÑ-Ô-Ð-Ñ-ØÐr+   c                 ó    — ddl m}  || fi |¤ŽS )zGChunk the document into retrieval-friendly pieces using layout signals.r   )Ú	to_chunks)Úpymupdf4llm.helpers.chunkingrò  )rÍ  r   rò  s      r    rò  zParsedDocument.to_chunksÆ  s,   € à:Ð:Ð:Ð:Ð:Ð:Øˆy˜Ð(Ð( Ð(Ð(Ð(r+   )TTFFFFFF©F)TTFFFrE   rP   rQ   )rœ  r�  rž  r}   r   r   rŸ  rt   rö   r|   r   r®  r§  ru   r   r¯  r©   r±  r³  r´  r   ÚSELECT_KEEP_OLDrµ  r	   rÕ  ré  rð  rò  r   r+   r    r­  r­  Þ  sL  € € € € € € à"€Hˆh�sŒmÐ"Ð"Ñ"Ø€J�ÐÐÑØ $€Cˆ�$�t”*Ô	Ð$Ð$Ñ$Ø"€Eˆ4�
ÔÐ"Ð"Ñ"Ø#€Hˆh�tŒnÐ#Ð#Ñ#Ø€J�ÐÐÑØ€IˆsÐÐÑØ€L�#ÐÐÑØ€J�ÐÐÑØÔ.€GˆWÐ.Ð.Ñ.ð ØØ"Ø"Ø!Ø#Ø %Ø!ðið iàðið ðið ð	ið
 ðið ðið ðið ðið ðið 
ˆs�D˜”JˆÔ	ðið ið ið iðVð ¨cð ð ð ð ð8 ØØ!Ø#Ø!Ø"Ø"Ø#%ðTð TàðTð ðTð ð	Tð
 ðTð ðTð ðTð ðTð !ðTð 
ˆs�D˜”JˆÔ	ðTð Tð Tð Tðl)ð )ð )ð )ð )r+   r­  c                  óŠ  — ddl m}  d}d}d}	 t          j        ¦   «         }n	#  d}Y nxY w | ¦   «         }|r)|dk    r#ddlm} t          dt          ¬¦  «         |j        S |�d	}d	}nt          d
t          ¬¦  «         |||hh d£k    rdS |rm|r#ddlm	} t          dt          ¬¦  «         |j        S |r#ddlm
} t          dt          ¬¦  «         |j        S ddlm} t          dt          ¬¦  «         |j        S |r#ddlm} t          dt          ¬¦  «         |j        S |r#ddlm}	 t          dt          ¬¦  «         |	j        S dS )zlCheck availability of OCR tools and language data.

    Return the best OCR function available or None.
    r   )Údetect_rapidocr_backendNFÚrapidocr_onnxruntime)Úrapidocr_apiz"Using RapidOCR for OCR processing.©ÚfileTzDWarning: RapidOCR is missing. Install for much improved OCR results.>   FN)Úrapidtess_apiz.Using RapidOCR & Tesseract for OCR processing.)Úpaddletess_apiz/Using PaddleOCR & Tesseract for OCR processing.)Útesseract_apiz#Using Tesseract for OCR processing.)Úpaddleocr_apiz#Using PaddleOCR for OCR processing.)Úpymupdf4llm.ocr.detect_rapidocrr÷  r€   Úget_tessdataÚpymupdf4llm.ocrrù  rÆ  ÚINFO_MESSAGESÚexec_ocrrü  rý  rþ  rÿ  )
r÷  ÚtessdataÚrapidocr_availableÚpaddleocr_availableÚrapidocr_backendrù  rü  rý  rþ  rÿ  s
             r    Úselect_ocr_functionr	  Ì  s  € ð
 HÐGÐGÐGÐGÐGà€HØÐØÐðÝÔ'Ñ)Ô)ˆˆøðØˆˆˆøøøà.Ð.Ñ0Ô0ÐØð %Ð,Ð0FÒFÐFà0Ð0Ð0Ð0Ð0Ð0åÐ2½ÐGÑGÔGÐGØÔ$Ð$àÐ#Ø!ÐØ"ÐÐåÐTÕ[hÐiÑiÔiÐiàÐ$Ð&9Ð:Ð>RÐ>RÐ>RÒRÐRØˆtàð *Øð 	*Ø5Ð5Ð5Ð5Ð5Ð5åØ@Ý"ðñ ô ð ð !Ô)Ð)Ø ð 		*Ø6Ð6Ð6Ð6Ð6Ð6åÐCÍ-ÐXÑXÔXÐXØ!Ô*Ð*à5Ð5Ð5Ð5Ð5Ð5åÐ7½mÐLÑLÔLÐLØ Ô)Ð)àð 		*Ø4Ð4Ð4Ð4Ð4Ð4åÐ6½]ÐKÑKÔKÐKØÔ(Ð(Ø ð 	*Ø5Ð5Ð5Ð5Ð5Ð5åÐ7½mÐLÑLÔLÐLØ Ô)Ð)ð		*ð 	*s   Ž" ¢(c                 óÞ   — t          |d¬¦  «        dd…         }| D ]P}|j        D ]F}|j        dv r;|j        |d         k    r#|                     |j        ¦  «        dz   |_        Œ?d|_        ŒGŒQdS )z8Update title/section-header boxes with HTML header tags.T)ÚreverseNé   ©rÂ  rÃ  rp   r/   )Úsortedr{   r~   r¤  rw   r  )r®  Úheader_fontsizesr   rD  s       r    Úupdate_header_tagsr    s�   € õ Ð.¸Ð=Ñ=Ô=¸b¸q¸bÔAÐØð )ð )ˆØ”:ð 	)ð 	)ˆCØŒ|Ð:Ð:Ð:ØÔ#Ð'7¸Ô';Ò;Ð;Ø'7×'=Ò'=¸cÔ>NÑ'OÔ'OÐRSÑ'S�CÔ$Ð$à'(�CÔ$øð	)ð)ð )r+   c                 óœ  — |t           j        k    rdS t          j        | ¦  «        }|                     dd¦  «        dk    o|                     dd¦  «        dk    }|                     dd¦  «        }|                     dd¦  «        }|r|t           j        t           j        fv rd||fS |t           j        t           j        fv r|sd||fS |||fS )	zÝDecide whether to OCR a page.

    Returns a tuple (needs_ocr, ocr_spans) where needs_ocr is a boolean
    indicating whether OCR is needed, and ocr_spans is the number of
    existing OCR spans on the page (if any).
    )Fr   FÚimg_arear   Úvec_norectsÚ	needs_ocrFÚ	ocr_spansT)r   ÚNEVERr   Úanalyze_pager4   ÚFORCE_KEEP_OLDrõ  ÚFORCE_DROP_OLD)r   rµ  Úpage_analysisÚ	only_textr  r  s         r    Úmake_ocr_decisionr    sï   € ð •'”-ÒÐØˆåÔ& tÑ,Ô,€Mð 	×Ò˜* aÑ(Ô(¨AÒ-ð 	5Ø×Ò˜m¨QÑ/Ô/°1Ò4ð ð ×!Ò! +¨uÑ5Ô5€Ið ×!Ò! +¨qÑ1Ô1€IØð +�W¥Ô!7½Ô9PÐ QÐQÐQà�i Ð*Ð*à•7Ô)­7Ô+AÐBÐBÐBÈ9ÐBà�Y 	Ð)Ð)à�i Ð*Ð*r+   rW   r°  r²  Úengc                 ó"  ‡J— d }t          | t          j        ¦  «        r| }n| }t          j        | ¦  «        }|j        d         dk    r?|                     ¦   «         }|                     ¦   «          t          j        |¬¦  «        }�n|j        d         t          v �r
t          �r|r$|                     ¦   «          t          |¦  «        }nÇd }	 |j	        r?t          j                             |j	        ¦  «        \  }}t          j        |p|¬¦  «        }nt          j        ¦   «         }|                     |¦  «         |                     ¦   «          t          |¦  «        }|rt          j        |¦  «         n# |rt          j        |¦  «         w w xY wt          j        |¬¦  «        }|j        rut          j        |¦  «        }t'          j        t'          j        |¦  «        t          j        d¦  «        ¦  «        }|                     t          j        d¦  «        ¦  «         n&t0          j        }|rt5          dt6          ¬¦  «         d	}|r|	rt9          d
¦  «        ‚t;          ¦   «         }t=          ¦   «         }|j	        r|j	        n||_        |                      d¬¦  «        |_!        |j"        |_"        |j        |_        tG          j$        |¦  «        |_%        ||_&        ||_'        ||_(        g |_)        |
|_*        ||_+        |	|_,        |rt0          j-        }|rNt]          |¦  «        r||_/        nHta          ¦   «         }t]          |¦  «        r||_/        n#t0          j        |_/        nt0          j        |_/        t]          |¦  «        sc|j/        t0          j1        t0          j-        fv rt9          d¦  «        ‚|j/        t0          j        k    r t5          d¦  «         t0          j        |_/        |€te          |j"        ¦  «        }njt          |tf          ¦  «        r|dk     r||j"        z  }|dk     °|g}n;ti          |d¦  «        st9          d¦  «        ‚tk          t;          |¦  «        ¦  «        }tm          d„ |D ¦   «         ¦  «        r|d         |j"        k    rt9          d|j"        › d�¦  «        ‚|rJto          |¦  «        dk    r7t5          dto          |¦  «        › d|j        › d�¦  «         tq          |¦  «        }|D �]Í}| 9                    |¦  «        }| :                    ¦   «          d	}i }d}d	} tw          ||j/        ¦  «        \  }!}} |!r9 ||||d	¬¦  «         t5          d|j<        ›d|j<        dz   › d�t6          ¬¦  «         | =                    t|          t          j?        ¦   «         ¬¦  «        }"|" @                    ¦   «         d         }#d di}$|�||$d!<   tƒ          |fi |$¤Ž d }%t…          |¦  «        }&|&rŠ|jC        }'	 dd"lDmE}( t�           |(|¦  «        ¦  «        }%nO# tŽ          $ rB})t5          d#|j<        › d$t‘          |)¦  «        jI        › d$|)› �t6          ¬¦  «         d }%Y d })~)nd })~)ww xY w|'|_C        n# |'|_C        w xY wi }*i }+i },g }-|jC        D ]½}.t�          |.d%         ¦  «        }/|/d&         |/d         z
  d&k    s|/d'         |/d         z
  d&k    rŒB|.d(         d)k    r	|.d*         sŒWt•          |/|.d(         gz   ¦  «        }0|- K                    |0¦  «         |.d(         d)k    r,t•          t          jL        |.d%         ¦  «        ¦  «        }1|.|*|1<   Œ¾|&r"|%r t›          |-|%d+„ |#D ¦   «         ¬,¦  «        \  }-}+},|-|_C        t�          d-„ |jC        D ¦   «         ¦  «        }2|s*tG          jO        ||#¦  «         tG          jP        ||#¦  «         tG          jQ        |jR        |#|jC        ¦  «        |_C        d.„ |#D ¦   «         }3|2r%d/„ |" S                    ¦   «         d         D ¦   «         }4nd }4g }5d0„ | T                    ¦   «         D ¦   «         }6t«          |j<        dz   |jR        jV        |jR        jW        g ||3|5|6¬1¦  «        }7|jC        D �]7}8t±          |8Ž }9t          jY        |8d d2…         ¦  «        }:|9jZ        d3v �rR|j+        s|j,        rß| [                    |:|j&        ¬4¦  «        };t          jL        |;j\        ¦  «        }<|<j]        s›|j+        r |; ^                    |j'        ¦  «        |9__        nƒ|j,        rl|j        › d5|j<        dz   d6›d5to          |7j`        ¦  «        d7›d|j'        › �}=tG          ja        |j(        |=¦  «        \  }>}?|>|9__        |;                     |?¦  «         nd |9__        nd |9__        |9jZ        d3v rS|j*        rLd8„ tÅ          d |7jc        |:d	d	¬9¦  «        D ¦   «         }@tÉ          |@tË          |jC        |:|+¦  «        ¦  «        |9_f        �n™|9jZ        d)k    �rÅ|9jg        |9jh        |9ji        |9jj        fŠJ|+ k                    t•          t          jL        |:¦  «        ¦  «        g ¦  «        }A|ArÀto          |A¦  «        dk    r|Ad         nd }B|9jg        |9jh        |9ji        |9jj        g|Br|B k                    d:¦  «        nd |Br|B k                    d;¦  «        nd |Br|B k                    d<¦  «        nd |Br|B k                    d=¦  «        nd d |Ad> l                    d?„ |AD ¦   «         ¦  «        d@œ|9_m        �n|d }C|*rM|4�KtÝ          |* o                    ¦   «         ˆJfdA„¬B¦  «        }1|* k                    |1¦  «        }Dtá          |D|4¦  «        }C|C�:t�          |Cjq        ¦  «        |Cjr        |Cjs        |Cjt        |Cju        |Cjv        dCœ|9_m        nï|9jg        |9jh        |9ji        |9jj        gd d d d dDdCœ|9_m        nÈ|, k                    t•          t          jL        |:¦  «        ¦  «        ¦  «        |9_f        |9jf        €'dE„ tÅ          d |7jc        |:d	¬F¦  «        D ¦   «         |9_f        |9jZ        dGv rXd}E|9jf        D ]2}F|FdH         D ]'}Gtï          |GdI         ¦  «        }HtÝ          |E|H¦  «        }EŒ(Œ3| x                    |E¦  «         |E|9_y        |7j`         K                    |9¦  «         �Œ9|j)         K                    |7¦  «         �ŒÏ|| k    r|                     ¦   «          t6           z                    ¦   «         }I|IrHt5          ¦   «          t          j{        dJ¦  «         t          j{        |I |                    ¦   «         ¦  «         t6           }                    ¦   «          t6           ~                    d¦  «         tÿ          |j)        |¦  «         |S )KNÚformatÚImage)Ústream)r  ÚRootÚStructTreeRootz1Warning: OCR disabled because document is no PDF.rú  Fz#Cannot both embed and write images.T)Úsimplez.Force OCR is True but no OCR engine available.z/Warning: No OCR engine available, OCR disabled.r   Ú__getitem__z7'pages' parameter must be an int, or a sequence of intsc              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S rT   )rà   rö   )r&   Úps     r    rV   z!parse_document.<locals>.<genexpr>µ  s,   è è € Ð8Ð8 q•
˜1�cÑ"Ô"Ð8Ð8Ð8Ð8Ð8Ð8r+   rp   z='pages' parameter must be None, int, or a sequence of ints < r  r8  zParsing z pages of 'z'...)ÚdpiÚlanguageÚkeep_ocr_textzOCR on page.number=ú/r/   )r§   rê   rm  Ú
return_rawÚedge_threshold)Úpage_html_tablesz*Warning: HTML table engine failed on page z: r#   r¶   r6  Ú
class_namer_   r$   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS ©Útyper   r   ©r&   r†   s     r    r)   z"parse_document.<locals>.<listcomp>  s!   € ÐBÐBÐB A°1°V´9À²>°>˜a°>°>°>r+   )rs  c              3   óT   K  — | ]#}t          |¦  «        d k    o|d         dk    V — Œ$dS rC  rU   r3  s     r    rV   z!parse_document.<locals>.<genexpr>  sJ   è è € ð 
ð 
Ø01�C�‰FŒF�aŠKÐ+˜A˜aœD GšOð
ð 
ð 
ð 
ð 
ð 
r+   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r1  r   r3  s     r    r)   z"parse_document.<locals>.<listcomp>&  s!   € Ð8Ð8Ð8˜!¨¨6¬°aª¨�A¨¨¨r+   c                 ó*   — g | ]}|d          dk    ¯|‘ŒS r1  r   r3  s     r    r)   z"parse_document.<locals>.<listcomp>(  s(   € ð ð ð ØÀ!ÀFÄ)ÈqÂ.À.�À.À.À.r+   c                 ó>   — g | ]}|d          t           j        k    ¯|‘ŒS )Úkind)r€   ÚLINK_URIrj  s     r    r)   z"parse_document.<locals>.<listcomp>/  s)   € ÐNÐNÐN�q°°&´	½WÔ=MÒ0MÐ0M�Ð0MÐ0MÐ0Mr+   )rq   rX   r¨  r{   r©  rs  rª  r«  r7  rÀ  )rê   r(  rþ   Ú04dÚ02dc                 ó0   — g | ]}|d          |d         dœ‘ŒS rh  r   rj  s     r    r)   z"parse_document.<locals>.<listcomp>R  s8   € ð 	!ð 	!ð 	!àð "# 1¤°°!´Ð5Ð5ð	!ð 	!ð 	!r+   )rl  rm  rê   rn  Úonly_horizontalr:  r;  r=   r>   rË   c              3   ó&   K  — | ]}|d          V — ŒdS )r9  Nr   r‡  s     r    rV   z!parse_document.<locals>.<genexpr>‡  s&   è è € Ð+QÐ+Q¸T¨D°¬LÐ+QÐ+QÐ+QÐ+QÐ+QÐ+Qr+   )r3   r8   r9   r=   r>   r0   rK  r9  c                 ó.   •— t          j        | ‰¦  «        S rT   )r   Úiou)ÚkÚ
search_keys    €r    rn   z parse_document.<locals>.<lambda>‘  s   ø€ ½e¼iÈÈ:Ñ>VÔ>V€ r+   r’   )r3   r8   r9   r=   r>   r0   rW   c                 ó0   — g | ]}|d          |d         dœ‘ŒS rh  r   rj  s     r    r)   z"parse_document.<locals>.<listcomp>´  s8   € ð +ð +ð +àð "# 1¤°°!´Ð5Ð5ð+ð +ð +r+   rk  r  r­   r¸   z === Document parser messages ===)€rà   r€   ÚDocumentÚopenru   Úconvert_to_pdfÚcloseÚOFFICE_FORMATSÚOFFICE_TO_PDFÚnameÚosÚpathÚsplitextÚtempfileÚmktempÚsaveÚremoveÚis_pdfÚ_as_pdf_documentr
   Úpdf_dict_getÚpdf_trailerÚPDF_NAMEÚpdf_dict_delr   r  rÆ  r  Ú
ValueErrorÚsetr­  r}   Úget_tocr|   rt   r   Úextract_form_fields_with_pagesÚform_fieldsr±  r³  r´  r®  Ú
force_textr¹  r¸  r  Úcallablerµ  r	  r  r:   rö   rÌ  r  r®   r7   r   Ú	load_pageÚremove_rotationr  ÚnumberÚget_textpageÚFLAGSÚINFINITE_RECTÚextractDICTr!   r©   r‰  Úpymupdf4llm.helpers.table_htmlr.  rF  rr  r2  rœ  r   r;   r�   r„  rq  Úclean_picturesÚadd_image_orphansÚfind_reading_orderr3  ÚextractRAWDICTÚ	get_linksr§  rX   r¨  r¢  r<  r~   Ú
get_pixmapÚirectrG  Útobytesr£  r{   Úmd_pathr   rs  rš  r�  r¯   r.   r(   rC   rD   r4   r^   r_   rZ   ÚkeysrO   r3   r8   r9   r=   r>   r0   ÚroundÚaddr¤  ÚgetvalueÚmessagerÂ   ÚtruncateÚseekr  )Kr‚   r}   r±  Úocr_dpir³  r´  r®  rº  r¹  r¸  r]  rµ  Ú	force_ocrÚocr_languageÚocr_functionÚrender_html_tablesr-  Úoriginal_pathÚmydocrÓ  Ú	temp_pathÚrootÚextÚmypdfr  ÚdocumentÚpage_filterÚpnor   Úpage_full_ocredÚPAGE_ANALYSISÚ	OCR_SPANSÚ	ONLY_TEXTr  rl  rm  Úlayout_kwargsÚpage_html_tables_listÚ_render_html_tablesÚ_saved_raw_layoutr.  ÚexcÚtable_infosr�  ru  Únew_layout_infor†   Úgbboxr3   r“   Útables_existrs  rA   rª  r«  Ú
pagelayoutrD  Ú	layoutboxrê   Úpixrm  Úimg_filenameÚmd_filenameÚsave_img_filenameÚ	raw_linesrK  ÚsingleÚtab_detailsr@   r¤  r¹   r•  r¸   Úmsg_textrB  sK                                                                             @r    Úparse_documentrœ  9  se  ø€ ð& €MÝ�#•wÔ'Ñ(Ô(ð "ØˆˆàˆÝ”˜SÑ!Ô!ˆà„~�hÔ 7Ò*Ð*à×#Ò#Ñ%Ô%ˆØ�Š‰ŒˆÝ” DÐ)Ñ)Ô)ˆ‰Ø	Œ˜Ô	!¥^Ð	3Ñ	3½Ñ	3Øð 	)Ø�KŠK‰MŒMˆMÝ  Ñ/Ô/ˆDˆDàˆIð)Ø”:ð 2Ý "¤× 0Ò 0°´Ñ <Ô <‘I�D˜#Ý (¤°s°{¸dÐ CÑ CÔ C�I�Iõ !)¤Ñ 1Ô 1�IØ—
’
˜9Ñ%Ô%Ð%Ø—’‘”�Ý$ YÑ/Ô/�àð )Ý”I˜iÑ(Ô(Ð(øøð ð )Ý”I˜iÑ(Ô(Ð(Ð(ð)øøøå” DÐ)Ñ)Ô)ˆà„|ð õ Ô(¨Ñ/Ô/ˆÝÔ!¥%Ô"3°EÑ":Ô":½GÔ<LÈVÑ<TÔ<TÑUÔUˆØ×Ò�'Ô*Ð+;Ñ<Ô<Ñ=Ô=Ð=Ð=å”-ˆØð 	ÝØCÝ"ðñ ô ð ð ˆ	àð @˜ð @ÝÐ>Ñ?Ô?Ð?õ ‘u”uÐåÑÔ€HØ&+¤jÐ>˜œ
˜
°h€HÔØ—=’=¨�=Ñ-Ô-€H„LØÔ*€HÔØœ€HÔÝ Ô?ÀÑFÔF€HÔØ"€HÔØ(€HÔØ$€HÔØ€H„NØ$€HÔØ(€HÔØ(€HÔàð )ÝÔ(ˆàð 
)Ý�LÑ!Ô!ð 	1Ø&ˆHÔÐå.Ñ0Ô0ˆLÝ˜Ñ%Ô%ð 1Ø#*�Ô Ð å#*¤=�Ô Ð å"œ=ˆÔå�LÑ!Ô!ð -ØÔÝÔ"ÝÔ"ð 
ð 
ð 
õ ÐMÑNÔNÐNØÔ�wœ}Ò,Ð,ÝÐCÑDÔDÐDÝ&œ}ˆHÔà€}Ý˜EÔ,Ñ-Ô-ˆˆÝ	�E�3Ñ	Ô	ð )Ø�aŠiˆiØ�UÔ%Ñ%ˆEð �aŠiˆià�gˆˆÝ�U˜MÑ*Ô*ð )ÝÐRÑSÔSÐSå�S ™ZœZÑ(Ô(ˆõ Ð8Ð8¨KÐ8Ñ8Ô8Ñ8Ô8ð
à�rŒ?˜eÔ.Ò.Ð.åØ_ÈEÔL\Ð_Ð_Ð_ñ
ô 
ð 	
ð ð /�˜[Ñ)Ô)¨QÒ.Ð.ÝÐM�˜[Ñ)Ô)ÐMÐM°hÔ6GÐMÐMÐMÑNÔNÐNÝ! +Ñ.Ô.ˆàð I*ñ I*ˆØ�Š˜sÑ#Ô#ˆØ×ÒÑÔÐØˆØˆØˆ	Øˆ	Ý*;¸DÀ(ÔBRÑ*SÔ*SÑ'ˆ	�9˜iàð 	QàˆLØØØ%Ø#ð	ñ ô ð õ Ð;˜DœKÐ;Ð;¨4¬;°q©=Ð;Ð;Ð;Å-ÐPÑPÔPÐPà×$Ò$­5µwÔ7LÑ7NÔ7NÐ$ÑOÔOˆØ×%Ò%Ñ'Ô'¨Ô1ˆð & tÐ,ˆØÐ%Ø.<ˆMÐ*Ñ+Ý˜$Ð0Ð0 -Ð0Ð0Ð0ð !%ÐÝ"Ð#5Ñ6Ô6ÐØð 	<Ø $Ô 7Ðð<ØKÐKÐKÐKÐKÐKå(,Ð-=Ð-=¸dÑ-CÔ-CÑ(DÔ(DÐ%Ð%øÝð 
-ð 
-ð 
-õ
 ð3ÀÄð 3ð 3Ý˜C‘y”yÔ)ð3ð 3Ø-0ð3ð 3å&ðñ ô ð ð
 )-Ð%Ð%Ð%Ð%Ð%Ð%øøøøð
-øøøð +<�Ô'Ð'øÐ*;�Ô'Ð;Ð;Ð;Ð;ð ˆØÐØÐàˆØÔ(ð 	%ð 	%ˆAÝ˜˜<œÑ)Ô)ˆEØ�QŒx˜% œ(Ñ" aÒ'Ð'¨5°¬8°e¸A´hÑ+>À!Ò+CÐ+CàØ�Œ 'Ò)Ð)°!°L´/Ð)àÝ˜ ! L¤/Ð!2Ñ2Ñ3Ô3ˆDØ×"Ò" 4Ñ(Ô(Ð(ð �Œ 'Ò)Ð)Ý�GœM¨!¨L¬/Ñ:Ô:Ñ;Ô;�Ø#$�˜CÑ øàð 	Ð#8ð 	å&Ø#Ø)ØBÐB¨ÐBÑBÔBðñ ô ñ BˆOÐ/Ð1Að #2ˆÔõ ð 
ð 
Ø59Ô5Lð
ñ 
ô 
ñ 
ô 
ˆð ð 	2ÝÔ   vÑ.Ô.Ð.ÝÔ# D¨&Ñ1Ô1Ð1õ #(Ô":ØŒI�v˜tÔ6ñ#
ô #
ˆÔð 9Ð8˜vÐ8Ñ8Ô8ˆØð 	 ðð Ø#×2Ò2Ñ4Ô4°XÔ>ðñ ô ˆLˆLð  ˆLàˆØNÐN˜DŸNšNÑ,Ô,ÐNÑNÔNˆÝØœ a™Ø”)”/Ø”9Ô#ØØ&ØØØð	
ñ 	
ô 	
ˆ
ð Ô*ð N	/ñ N	/ˆCÝ! 3˜ˆIÝ”<  B Q B¤Ñ(Ô(ˆDàÔ!Ð%;Ð;Ñ;ØÔ(ð +¨HÔ,Að +ØŸ/š/¨t¸Ô9K˜/ÑLÔL�CÝ#œM¨#¬)Ñ4Ô4�EØ œ>ð /Ø#Ô0ð 8Ø.1¯kªk¸(Ô:OÑ.PÔ.P˜IœO˜OØ%Ô2ð 8Ø.6Ô.?ð  ,Jð  ,JÀ$Ä+ÈaÁ-ð  ,Jð  ,Jð  ,JÕVYÐZdÔZjÑVkÔVkð  ,Jð  ,Jð  ,JÐrzô  sHð  ,Jð  ,J˜LÝ=B¼]Ø (Ô 3°\ñ>ô >Ñ:˜KÐ):ð /:˜IœOØŸHšHÐ%6Ñ7Ô7Ð7øà*.˜	œ˜à&*�I”OØÔ%Ð)?Ð?Ð?ÀHÔDWÐ?ð	!ð 	!å!.Ø%)Ø#-Ô#6Ø!%Ø-2Ø,1ð"ñ "ô "ð	!ñ 	!ô 	!�Iõ$ +AØ!Ý-Ø Ô3°TÐ;Mñô ñ+ô +�IÔ'ùð Ô# wÒ.Ñ.Ø'œl¨I¬L¸)¼,È	ÌÐU�
Ø0×4Ò4µU½7¼=ÈÑ;NÔ;NÑ5OÔ5OÐQSÑTÔT�àð =õ 03°;Ñ/?Ô/?À1Ò/DÐ/D˜[¨œ^˜^È$�Fð &œLØ%œLØ%œLØ%œLð	!ð <BÐ%K V§Z¢Z°Ñ%7Ô%7Ð%7ÀtØ;AÐ%K V§Z¢Z°Ñ%7Ô%7Ð%7ÀtØ8>Ð!H §¢¨GÑ!4Ô!4Ð!4ÀDØ<BÐ#L 6§:¢:¨iÑ#8Ô#8Ð#8ÈØ$(Ø'2Ø &§¢Ð+QÐ+QÀ[Ð+QÑ+QÔ+QÑ QÔ Qð'ð '�I”O‘Oð( #'�KØ"ð P |Ð'?Ý!Ø'×,Ò,Ñ.Ô.Ð4VÐ4VÐ4VÐ4Vðñ ô ˜ð $/§?¢?°3Ñ#7Ô#7˜Ý&7¸À,Ñ&OÔ&O˜à"Ð.å$(¨Ô)9Ñ$:Ô$:Ø)4Ô)>Ø)4Ô)>Ø%0Ô%6Ø'2Ô':Ø(3Ô(<ð+ð +˜	œ˜ð !*¤Ø )¤Ø )¤Ø )¤ð	%ð *.Ø)-Ø%)Ø'+Ø(*ð+ð +˜	œ˜ð$ '7×&:Ò&:½5ÅÄÈtÑATÔATÑ;UÔ;UÑ&VÔ&V�	Ô#ØÔ&Ð.ð+ð +å!.Ø%)Ø#-Ô#6Ø!%Ø-2ð	"ñ "ô "ð+ñ +ô +�IÔ'ð Ô%Ð)DÐDÐDØ#$�LØ )Ô 3ð Cð C˜Ø$(¨¤Mð Cð C˜DÝ#(¨¨f¬Ñ#6Ô#6˜DÝ+.¨|¸TÑ+BÔ+B˜L˜LðCð %×(Ò(¨Ñ6Ô6Ð6Ø-9�IÔ*àÔ×#Ò# IÑ.Ô.Ð.Ñ.ØŒ×Ò˜jÑ)Ô)Ð)Ñ)Ø�‚|€|Ø�Š‰ŒˆÝ×%Ò%Ñ'Ô'€HØð *Ý‰ŒˆÝŒÐ:Ñ;Ô;Ð;ÝŒ˜ŸšÑ(Ô(Ñ)Ô)Ð)Ý×ÒÑÔÐÝ×Ò�qÑÔÐå�x”~Ð'7Ñ8Ô8Ð8Ø€Os=   ÃBE5 Å5F×=XØY3Ø
Y(Ø&8Y#ÙY3Ù#Y(Ù(Y3Ù3	Y<Ú__main__r/   )r¸  r¶  r·  z.md)rP   rQ   rô  )FN)r?  )mrÈ  Úiorå  ÚmathrK  rN  r\   Ú	threadingÚcollectionsr   Údataclassesr   Úpathlibr   Útypingr   r   r   r	   r€   rõ   r
   Úpymupdf4llm.helpersr   Ú"pymupdf4llm.helpers.get_text_linesr   r  r   r   r   ÚImportErrorÚpymupdf4llm.helpers.progressrÌ  r   ÚRUNNING_WITH_MARINAr   rI  rH  ÚTOOLSÚunset_quad_correctionsÚRLockr   ÚStringIOr  rÇ  ÚTEXT_COLLECT_STYLESÚTEXT_COLLECT_VECTORSÚTEXT_PRESERVE_IMAGESÚTEXT_ACCURATE_BBOXESÚTEXT_MEDIABOX_CLIPÚTEXT_IGNORE_ACTUALTEXTrc  r   ÚBULLETSÚPager!   rO   rj   r‰   r�   r¤   r´   r¼   rÈ   r   rÔ   rØ   rÝ   r©   râ   rì   rù   r  r  r  r  r!  r#  r%  r)  r/  r2  r4  r>  rY  r`  rc  rz  r„  r�  rš  r2   r¢  r§  r­  r	  r  r  rõ  rœ  rœ  ÚsysÚargvr}   ÚpdocrÕ  ÚmdÚwith_suffixÚ
write_textr   r+   r    ú<module>r¼     s   ðØ €€€Ø 	€	€	€	Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø <Ð <Ð <Ð <Ð <Ð <Ø #Ð #Ð #Ð #Ð #Ð #ð9Ø(Ð(Ð(Ð(Ð(Ð(Ð(øØð 9ð 9ð 9Ø8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð9øøøð "Ð !Ð !Ð !Ð !Ð !ð �g˜g uÑ-Ô-ÐW°'°'¸'¼+ÀÑ2WÔ2WÐ Øð Ø”KÔ-€M€Mà€Mð NÐMÐM€à „× $Ò $ TÑ *Ô *Ð *ØˆyŒÑ Ô €à�”‘”€Ø€ð ØÔ!ñ"àÔ"ñ#ð Ô"ñ#ð Ô"ñ	#ð
 Ô ñ!ð Ô$ñ%ð ð ˆ%�”Ñ
Ô
€ð)˜GœLð )ð )ð )ð )ð&ð &ð &ðRð ð ð ð@$¸ð $ð $ð $ð $ðNð ð ð6ð 6ð 6ðrð ð ð(ð ð ð$ð ð ð."$¨3ð "$ð "$ð "$ð "$ðJ$ 3ð $ð $ð $ð $ð4ð ð ð ð ¨ð ð ð ð ð2ð °ð ð ð ð ð"ð °$ð ð ð ð ð>\ð \ð \ð~6ð 6ð 6ðrð ð ð8
0ð 
0ð 
0ð0ð 0ð 0ð
ð 
ð 
ðð  tð ð ð ð ð0ð ¨tð ð ð ð ð"ð °ð ð ð ð ðS˜ð Sð Sð Sð Sð Dð ð ð ð ð(+#ð +#Àuð +#ð +#ð +#ð +#ð\°dð ð ð ð ð$ð ð ð.)ð .)ð .)ðb>ð >ð >ð<ð ð ð(ð ð ð& ðð ð ð ð ñ ô ñ „ðð ð+ð +ð +ð +ð +ñ +ô +ñ „ð+ð& ð'ð 'ð 'ð 'ð 'ñ 'ô 'ñ „ð'ð ðj)ð j)ð j)ð j)ð j)ñ j)ô j)ñ „ðj)ðZ=*ð =*ð =*ð@
)ð 
)ð 
)ð+ð +ð +ðD ØØØØØ
ØØØØØÔ#ØØØØØð#\ð \ð$ ð%\ð \ð \ð \ð~ ˆzÒÐà€J€J€JØÐÐÐÐÐàŒx˜Œ{€HØˆ>˜(Ñ#Ô#€Dð 
×	Ò	 u°UÀ5Ð	Ñ	IÔ	I€BØ€Dˆ�N„N×Ò˜uÑ%Ô%×0Ò0°Ñ4Ô4Ð4Ð4Ð4ð Ðs   Á A' Á'A5Á4A5