
    TAiS                       % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
Jr  SSKJr  SSKJr  SSKJrJrJr  SSKJrJr  \R.                  S	:X  a  SSKr\R2                  rS
\S'   OSSKJr  \" / SQS9r\rS
\S'   \R:                  " \5      r\" S5      r \" S5      r!SS jr"S S jr#S!S jr$S"S jr%S#S$S jjr&S#S$S jjr'S%S jr(S#S$S jjr)S#S$S jjr*S#S&S jjr+\*\&\'\)/r,S'S jr-S(S jr.S)S jr/S#S jr0g)*zFFind Tesseract and Ghostscript binaries on Windows using the registry.    )annotationsN)CallableIterableIterator)chainPath)Any	TypeAliasTypeVar)InvalidVersionVersionwin32r   HKEYType)Mock)r   EnumKey	EnumValueHKEY_LOCAL_MACHINEOpenKey)specTTkeyc                     U R                  SSS9 Vs/ s H  n[        U5      PM     nn[        U5      S:  a"  UR                  S5        [        U5      S:  a  M"  US   US   US   4$ s  snf ! [         a     gf = f)z$Compare Ghostscript version numbers..   )maxsplitr         r   r   r   )splitintlenappend
ValueError)selemreleases      X/var/www/html/land-ocr/venv/lib/python3.13/site-packages/ocrmypdf/subprocess/_windows.pyghostscript_version_keyr)   (   s    )*q)AB)A3t9)AB'lQNN1 'lQ
GAJ
33 C  s'   A/ A*1A/ A/ *A/ /
A<;A<c              #     #    SnSnX2:  a   U" X5      v   US-  nX2:  a  M  X2:X  a  [        SU  35      eg ! [          a     M!  f = f7f)Ni  r   r   zToo many registry keys under )OSErrorr$   )keyenum_fnlimitns       r(   registry_enumr0   3   se     E	A
)	#/!FA ) 	z8>??   		s*   
A7 AA
AAAAc                6    [        U [        R                  5      $ N)r0   winregr   r,   s    r(   registry_subkeysr5   @   s    fnn--    c                6    [        U [        R                  5      $ r2   )r0   r3   r   r4   s    r(   registry_valuesr8   D   s    f..//r6   c              #    #    A  [         R                  " [         R                  S5       n[        [	        U5      [
        SS9nS S S 5        [         R                  " [         R                  SW 35       n[        U5       H  u  p4n[        U5      S-  v   M     S S S 5        g ! , (       d  f       Ne= f! , (       d  f       g = f! [         a  n[        R                  U5         S nAg S nAff = f7f)Nz SOFTWARE\Artifex\GPL Ghostscriptr   )r,   defaultz!SOFTWARE\Artifex\GPL Ghostscript\bin)r3   r   r   maxr5   r)   r8   r	   r+   logwarning)envk	latest_gs_gs_pathes         r(   registry_path_ghostscriptrE   H   s     ^^%%'J
 #)@)I
 ^^%%*KI;'W
!0!3A7me++ "4
 

 

 

  Asi   C0%C B"0C 3&B3C !C0"
B0,C 3
C=C  C0C 
C-C(#C0(C--C0c              #  >  #    A  [         R                  " [         R                  S5       n[        U5       H  u  p#nUS:X  d  M  [	        U5      nUv   M     S S S 5        g ! , (       d  f       g = f! [
         a  n[        R                  U5         S nAg S nAff = f7f)NzSOFTWARE\Tesseract-OCR
InstallDir)r3   r   r   r8   r	   r+   r=   r>   )r?   r@   subkeyval_valtypetesseract_pathrD   s          r(   registry_path_tesseractrL   Z   sz     ^^F557PQUV)8);%X\)%)#YN(( *< RQQ
  AsW   B%A1 A A A1 B 
A.*A1 -B.A1 1
B;BBBBc                    [         R                  " S[        U 5      5      nU(       a!   UR                  S5      n[	        U5      nSU4$ U R                  S4$ ! [
         a     Nf = f)a  Key function for comparing Ghostscript and Tesseract paths.

Ghostscript installs on Windows:
    %PROGRAMFILES%/gs/gs9.56.1/bin -> ('gs', Version('9.56.1'))
    %PROGRAMFILES%/gs/9.24/bin -> ('gs', Version('9.24'))

Tesseract looks like:
    %PROGRAMFILES%/Tesseract-OCR -> ('Tesseract-OCR', None)

Thus ensuring the resulting tuple will order the alternatives correctly,
e.g. gs10.0 > gs9.99.
zgs[/\\]?([0-9.]+)[/\\]binr   gsN)researchstrgroupr   r   name)pathmatchversion_strversions       r(   _gs_version_in_path_keyrX   f   sf     II2CI>E	++a.Kk*G=  99d?  		s   A 
A$#A$c                   ^ U (       d  [         R                  n U R                  SS5      mSU4S jjn[        [	        S U" 5        5       [
        SS95      $ )NPROGRAMFILES c               3  H  >#    [        T5      R                  5        H~  n U R                  5       (       d  M  U R                  R	                  5       S:X  a  U v   M>  U R                  R	                  5       S:X  d  M^  S U R                  S5       5        S h  vN   M     g  N	7f)Nztesseract-ocrrN   c              3  R   #    U  H  oR                  5       (       d  M  Uv   M     g 7fr2   )is_dir.0ps     r(   	<genexpr>;program_files_paths.<locals>.path_walker.<locals>.<genexpr>   s     I':!hhjAA':s   '	'z**/bin)r	   iterdirr^   rS   lowerglob)rT   program_filess    r(   path_walker(program_files_paths.<locals>.path_walker   st     '//1D;;==yy O3
"d*Ityy':III 2 Js   A4B";B"B 
B"c              3  $   #    U  H  ov   M     g 7fr2    r_   s     r(   rb   &program_files_paths.<locals>.<genexpr>   s     &1Qs   T)r,   reversereturnzIterator[Path])osenvirongetitersortedrX   )r?   rh   rg   s     @r(   program_files_pathsru   ~   sL    jjGGNB/MJ &&'	
 r6   c                <    S [         R                  " U 5       5       $ )Nc              3  H   #    U  H  o(       d  M  [        U5      v   M     g 7fr2   r   r_   s     r(   rb   !paths_from_env.<locals>.<genexpr>   s     82aGDGG2   
"")rp   get_exec_path)r?   s    r(   paths_from_envr{      s    8R--c288r6   c                    U(       d  [         R                  n[         R                  R                  S U " U5       5       5      $ )Nc              3  H   #    U  H  o(       d  M  [        U5      v   M     g 7fr2   rQ   r_   s     r(   rb   shim_path.<locals>.<genexpr>   s     ?>aQ63q66>ry   )rp   rq   pathsepjoin)	new_pathsr?   s     r(   	shim_pathr      s+    jj::???9S>???r6   c                    U R                  5       R                  S5      (       a  [        R                  /U-   n[         H4  n[        X25      n[        R                  " US   US9nU(       d  M/  XQS'     U$    U$ )zIAdjust our desired program and command line arguments for use on Windows.z.pyr   rT   )re   endswithsys
executableSHIMSr   shutilwhich)programargsr?   shimshimmed_path	new_args0s         r(   fix_windows_argsr      sq     }}&&$&  +LLa|<	9GK  Kr6   c              #     #    [        5       nUR                  nU  H  nU" U5      nXR;  d  M  U" U5        Uv   M      g7f)z'List unique elements, preserving order.N)setadd)iterabler,   seenseen_addelementr@   s         r(   unique_everseenr      s;      eDxxHL=QKM	 s   '>>c                >    [         R                  [        U 5      5      $ r2   )rQ   casefoldr   s    r(   _casefold_pathr      s    <<D	""r6   c                   ^  T c  [         R                  m [        R                  " U 4S j[         5       5      n[         R
                  R                  S [        U[        S9 5       5      $ )Nc              3  2   >#    U  H  o" T5      v   M     g 7fr2   rk   )r`   r   r?   s     r(   rb    shim_env_path.<locals>.<genexpr>   s     $A54T#YY5s   c              3  8   #    U  H  n[        U5      v   M     g 7fr2   r~   r_   s     r(   rb   r      s      G1AGs   r4   )	rp   rq   r   from_iterabler   r   r   r   r   )r?   
shim_pathss   ` r(   shim_env_pathr      sP    
{jj$$$A5$AAJ::?? '
G  r6   )r%   rQ   ro   ztuple[int, int, int])r,   r   r-   zCallable[[HKEYType, int], T]ro   Iterator[T])r,   r   ro   zIterator[str])r,   r   ro   zIterator[tuple[str, Any, int]]r2   rn   )rT   r	   ro   ztuple[str, Version | None])r   zCallable[[Any], Iterator[Path]]ro   rQ   )r   rQ   )r   zIterable[T]r,   zCallable[[T], Tkey]ro   r   )rT   r	   ro   rQ   )1__doc__
__future__r   loggingrp   rO   r   r   collections.abcr   r   r   	itertoolsr   pathlibr	   typingr
   r   r   packaging.versionr   r   platformr3   r   __annotations__unittest.mockr   	getLogger__name__r=   r   r   r)   r0   r5   r8   rE   rL   rX   ru   r{   r   r   r   r   r   r   rk   r6   r(   <module>r      s    M "  	 	  
 8 8   * * 5<<7 //Hi)"RF Hi !CLv
@.0$	0.9@ 		$
#r6   