Ë
    /æj’]  ã                   ó  — d 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 ddlmZ d	d
lmZ  ej$                  e«      Z ej*                  d«      Z ej*                  ddj/                   eej2                  «      «      › d�«      ZdZdZdZdZdZdZ  ej*                   ejB                  e«      › d�«      Z"de#e	z  de	fd„Z$de#e	z  de#de	fd„Z%de#e	z  de#de	fd„Z&de	de'fd„Z(de	de'fd„Z)de	d e*dz  de'fd!„Z+de#e	z  de'fd"„Z,d#e	de'fd$„Z-de#e	z  de'fd%„Z.de#e	z  de#de	dz  fd&„Z/de#e	z  de*fd'„Z0de#e	z  de*fd(„Z1de	de#e	z  ddfd)„Z2d*e	d+e	de#e	z  ddfd,„Z3de#e	z  de	fd-„Z4d*e#e	z  de#e	z  de#dz  fd.„Z5d/d0œd*e#e	z  de#e	z  d1e'de	dz  fd2„Z6d*e#e	z  de#e	z  de	dz  fd3„Z7de	de	fd4„Z8de	de	fd5„Z9ede	ded6   fd7„«       Z:d8e	d9e#ddfd:„Z;d*e	de	de	fd;„Z<de'fd<„Z=d*e#de#de#e	z  d e*dz  de'f
d=„Z>de#de#e	z  d e*dz  de'fd>„Z?d/d?œd*e#de#de#e	z  d e*dz  d@e'de'fdA„Z@de	de#e	z  deAe	   dz  fdB„ZBde	dCeAe	   de#e	z  de*fdD„ZCde#e	z  deAe	   fdE„ZDde#e	z  deEe	e*f   fdF„ZFd8e	dGeAe	   de#e	z  ddfdH„ZGde	de#e	z  de*fdI„ZHy)Jaj  Cache-wide shared blob store, deduplicating Xet files across cached repos.

Store entries at `<cache_dir>/blobs/<2-hex-prefix>/<xet_hash>` are regular files.
Per-repo `blobs/<etag>` entries are relative symlinks to them. A companion
`<xet_hash>.refs` manifest lists those symlinks so cache deletion only needs to inspect
the blobs it touches instead of scanning the entire store.

The manifest is a hint, not trusted metadata: every entry is validated against the
filesystem before use, and any missing or unreadable manifest makes garbage collection
leak the shared blob rather than risk deleting referenced content.
é    N)Úcontextmanager)ÚPath)Ú	Generator)ÚFileLockÚSoftFileLocké   )Ú	constantsé   )Úloggingz[0-9a-f]{64}z(?:ú|z)--.+Úblobsz.huggingface-shared-blobsÚ1z.refsz.locké
   z\.[0-9a-f]{8}\.tmpÚ	cache_dirÚreturnc                 ó&   — t        | «      t        z  S )zBReturn the path of the shared blob store inside a cache directory.)r   ÚSHARED_BLOBS_DIR_NAME)r   s    úf/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/huggingface_hub/utils/_shared_blobs.pyÚshared_blobs_dirr   7   s   € ä�	‹?Ô2Ñ2Ð2ó    Úxet_hashc                 ór   — t         j                  |«      €t        d|› d�«      ‚t        | «      |dd z  |z  S )zuReturn the store path for a given Xet file hash.

    Raises `ValueError` if `xet_hash` is not a valid Xet hash.
    NzInvalid Xet file hash: 'ú'.r   )Ú_XET_HASH_REGEXÚ	fullmatchÚ
ValueErrorr   ©r   r   s     r   Úshared_blob_pathr   <   sE   € ô
 × Ñ  Ó*Ð2ÜÐ3°H°:¸RÐ@ÓAÐAÜ˜IÓ&¨°"°1¨Ñ5¸Ñ@Ð@r   c                 óH   — t        | |«      j                  |› t        › �«      S )z=Return the reference manifest path for a given Xet file hash.)r   Ú	with_nameÚ_MANIFEST_SUFFIXr   s     r   Úshared_blob_manifest_pathr"   F   s%   € ä˜I xÓ0×:Ñ:¸h¸ZÔHXÐGYÐ;ZÓ[Ð[r   Úpathc                 ó|   — 	 t        j                  | j                  «       j                  «      S # t        $ r Y yw xY w©NF)ÚstatÚS_ISREGÚlstatÚst_modeÚOSError©r#   s    r   Ú_is_regular_filer,   K   ó4   € ðÜ�|‰|˜DŸJ™J›L×0Ñ0Ó1Ð1øÜò Ùðúó   ‚,/ ¯	;º;c                 ó|   — 	 t        j                  | j                  «       j                  «      S # t        $ r Y yw xY wr%   )r&   ÚS_ISDIRr(   r)   r*   r+   s    r   Ú_is_directoryr1   S   r-   r.   Ú
store_pathÚexpected_sizec           	      óx  — |€y	 | j                  «       }t        j                  |j                  «      sy|j
                  |k7  r*t        j                  d| › d|j
                  › d|› d�«       yt        j                  | t        j                  «      st        j                  d| › d�«       yy# t        $ r Y yw xY w)zPReturn whether `store_path` is a regular, readable payload of the expected size.FzShared blob 'z' has an unexpected size (z instead of z). Not using it.z ' is not readable. Not using it.T)r(   r*   r&   r'   r)   Úst_sizeÚloggerÚwarningÚosÚaccessÚR_OK)r2   r3   Ú
store_stats      r   Ú_is_usable_store_entryr<   [   s¿   € àÐàðØ×%Ñ%Ó'ˆ
ô �<‰<˜
×*Ñ*Ô+ØØ×Ñ˜]Ò*Ü�‰Ø˜J˜<Ð'AÀ*×BTÑBTÐAUÐUaÐboÐapð qð ô	
ð Ü�9‰9�Z¤§¡Ô)Ü�‰˜ z lÐ2RÐSÔTØØøô ò Ùðús   …B- Â-	B9Â8B9c                 ó¬   — t        | «      }|t        z  }t        |«      rt        |«      sy	 |j	                  «       t
        › d�k(  S # t        $ r Y yw xY w)z?Return whether `path` is an owned, supported shared blob store.Fú
)r   ÚSHARED_BLOBS_MARKER_NAMEr1   r,   Ú	read_textÚSHARED_BLOBS_LAYOUT_VERSIONr*   )r#   Ú	store_dirÚmarker_paths      r   Úis_shared_blobs_dirrD   r   s]   € ä�T“
€IØÔ6Ñ6€KÜ˜Ô#Ô+;¸KÔ+HØðØ×$Ñ$Ó&Ô-HÐ,IÈÐ*LÑLÐLøÜò Ùðús   ­A Á	AÁArB   c                 ó‚  — t         › d�}t        | j                  «       «      }|D ]P  }t        j	                  |j
                  «      �t        |«      s y	 |j                  |j                  «       «      s yŒR |D ]  }|j                  d¬«       Œ t        | j                  «       «       S # t        t        f$ r Y  yw xY w)z–Remove leftover marker temporaries.

    Returns whether the directory is empty afterwards, i.e. safe to mark. Any foreign content returns False.
    r>   FT©Ú
missing_ok)rA   ÚlistÚiterdirÚ_MARKER_TMP_REGEXr   Únamer,   Ú
startswithr@   r*   ÚUnicodeErrorÚunlinkÚany)rB   Úexpected_contentÚentriesÚentrys       r   Ú_cleanup_abandoned_marker_tempsrS   ~   sÇ   € ô
 6Ð6°bÐ9ÐÜ�9×$Ñ$Ó&Ó'€GØò ˆÜ×&Ñ& u§z¡zÓ2Ð:ÔBRÐSXÔBYÙð	Ø#×.Ñ.¨u¯©Ó/@ÔAÙð Bð	ð ò &ˆØ�‰ ˆÕ%ð&ä�9×$Ñ$Ó&Ó'Ð'Ð'øô	 œÐ&ò 	Úð	ús   ÁB+Â+B>Â=B>c                 ó¤  — t        | «      }|t        z  }	 |j                  d¬«       t        |«      ryt	        |«      rt        |«      st        j                  d|› d�«       yt        || «       |j                  |j                  › dt        j                  d«      › d�«      }	 |j                  t        › d	�«       |j                  t!        | «      «       t#        j$                  ||«       |j'                  d¬
«       t        |«      S # |j'                  d¬
«       w xY w# t(        $ r%}t        j                  d|› d|› �«       Y d}~yd}~ww xY w)zJCreate and mark the shared store, refusing to adopt an unmarked directory.T©Úexist_okz0Refusing to use unmarked shared blob directory 'r   Fú.é   ú.tmpr>   rF   z,Could not initialize shared blob directory 'ú': N)r   r?   ÚmkdirrD   r1   rS   r6   ÚdebugÚ_repair_shared_directory_moder    rK   ÚsecretsÚ	token_hexÚ
write_textrA   ÚchmodÚ_shared_blob_moder8   ÚreplacerN   r*   )r   rB   rC   Ú
tmp_markerÚes        r   Ú_ensure_shared_blobs_dirrf   ’   s8  € ä  Ó+€IØÔ6Ñ6€KðØ�‰ ˆÔ&Ü˜yÔ)ØÜ˜YÔ'Ô/NÈyÔ/YÜ�L‰LÐKÈIÈ;ÐVXÐYÔZØÜ% i°Ô;à ×*Ñ*¨k×.>Ñ.>Ð-?¸qÄ×ARÑARÐSTÓAUÐ@VÐVZÐ+[Ó\ˆ
ð	/Ø×!Ñ!Ô%@Ð$AÀÐ"DÔEØ×ÑÔ.¨yÓ9Ô:Ü�J‰J�z ;Ô/à×Ñ¨ÐÔ.Ü" 9Ó-Ð-øð ×Ñ¨ÐÕ.ûäò Ü�‰ÐCÀIÀ;ÈcÐRSÐQTÐUÔVÜûðús<   –D! ´/D! Á$A D! Â%AD
 Ã-D! Ä
DÄD! Ä!	EÄ*E
Å
Ec                 ó˜  — t        | «      sy t        | |«      j                  }	 |j                  d¬«       t        |«      st
        j                  d|› d�«       y 	 t        || «       |S # t        $ r%}t
        j                  d|› d|› �«       Y d }~y d }~ww xY w# t        $ r%}t
        j                  d|› d|› �«       Y d }~y d }~ww xY w)NTrU   z/Could not create shared blob prefix directory 'rZ   z2Refusing to use non-directory shared blob prefix 'r   z1Could not set shared blob prefix permissions on ')	rf   r   Úparentr[   r*   r6   r\   r1   r]   )r   r   Ú
prefix_dirre   s       r   Ú_ensure_prefix_dirrj   ¬   sÓ   € Ü# IÔ.ØÜ! )¨XÓ6×=Ñ=€JðØ×Ñ $ÐÔ'ô ˜Ô$Ü�‰ÐIÈ*ÈÐUWÐXÔYØðÜ% j°)Ô<ð Ðøô ò Ü�‰ÐFÀzÀlÐRUÐVWÐUXÐYÔZÜûðûô ò Ü�‰ÐHÈÈÐTWÐXYÐWZÐ[Ô\Üûðús/   ¤A* ÁB Á*	BÁ3BÂBÂ	C	Â$CÃC	c                 ó  — t         j                  dk(  ry	 t        j                  t	        | «      j                  «       j
                  «      }d|t        j                  z  rdndz  |t        j                  z  rdz  S dz  S # t        $ r Y yw xY w)zLReturn a read-only mode accessible to users who can traverse the cache root.Únté¶  é   é    r   rX   )	r8   rK   r&   ÚS_IMODEr   r)   r*   ÚS_IXGRPÚS_IXOTH©r   Ú
cache_modes     r   rb   rb   À   s€   € ä	‡w�w�$‚àðÜ—\‘\¤$ y£/×"6Ñ"6Ó"8×"@Ñ"@ÓAˆ
ð ˜Z¬$¯,©,Ò6‘E¸AÑ>È:ÔX\×XdÑXdÒKdÀ%ÑlÐlÐjkÑlÐløô ò Ùðús   –6B  Â 	BÂBc                 óÜ   — 	 t        j                  t        | «      j                  «       j                  «      }|dt         j
                  z  t         j                  z  z  S # t        $ r Y yw xY w)zQMirror cache-root access and inheritance bits on newly created store directories.iÀ  iÿ  )r&   rp   r   r)   r*   ÚS_ISGIDÚS_ISVTXrs   s     r   Ú_shared_directory_moderx   Ì   s[   € ðÜ—\‘\¤$ y£/×"6Ñ"6Ó"8×"@Ñ"@ÓAˆ
ð ˜¤§¡Ñ-´·±Ñ<Ñ=Ð=øô ò Ùðús   ‚6A Á	A+Á*A+c                 óž   — t        |«      }t        j                  | j                  «       j                  «      |k7  r| j                  |«       y y ©N)rx   r&   rp   r(   r)   ra   )r#   r   Úexpected_modes      r   r]   r]   Õ   s:   € Ü*¨9Ó5€MÜ‡|�|�D—J‘J“L×(Ñ(Ó)¨]Ò:Ø�
‰
�=Õ!ð ;r   Ú	blob_pathri   c                 óž  — t        |«      }t        j                  | |«       t        j                  dk(  st	        t        d«      sy|j                  «       j                  }| j                  «       j                  |k(  ry	 t        j                  | d|«       y# t        $ r, |t
        j                  z  r|t
        j                  z  s‚ Y yY yw xY w)zKMake a payload immutable and readable according to the shared cache policy.rl   ÚchownNéÿÿÿÿ)rb   r8   ra   rK   Úhasattrr&   Úst_gidr~   r*   ÚS_IRGRPÚS_IROTH)r|   ri   r   Ú	blob_modeÚ
target_gids        r   Ú _prepare_shared_blob_permissionsr†   Û   s¢   € ä! )Ó,€IÜ‡H�HˆY˜	Ô"Ü	‡w�w�$‚œg¤b¨'Ô2ØØ—‘Ó"×)Ñ)€JØ‡~�~Ó×Ñ *Ò,ØðÜ
�‰�˜B 
Õ+øÜò à”t—|‘|Ò#¨I¼¿¹Ò,DØñ -EÑ#ðús   Á?B Â0CÃCc                 óæ   — t        j                  | «      }|dd j                  «       dk(  r	d|dd › �}n|j                  d«      r|dd }t	        t         j
                  j                  |«      «      S )zCReturn an absolute path without the Windows extended-length prefix.Né   z\\?\unc\z\\z\\?\rX   )r8   ÚfspathÚlowerrL   r   r#   Úabspath)r#   Úpath_strs     r   Ú_path_for_comparisonr�   ì   si   € ä�y‰y˜‹€HØ��€|×ÑÓ˜~Ò-Ø˜( 1 2˜,˜Ð(‰Ø	×	Ñ	˜YÔ	'Ø˜A˜B�<ˆÜ”—‘—‘ Ó)Ó*Ð*r   c                 ó`  — t        | «      } t        |«      }	 | j                  |«      }t        |j                  «      dk7  sCt
        j                  |j                  d   «      �!|j                  d   dk7  s|j                  d   sy |j                  «       }d|v sd|v rd S |S # t        $ r Y y w xY w)Né   r   r
   r   r   r>   ú)r�   Úrelative_tor   ÚlenÚpartsÚ_REPO_DIR_REGEXr   Úas_posix)r|   r   Úrelative_pathÚrelative_strs       r   Ú_relative_blob_pathr˜   ö   s»   € Ü$ YÓ/€IÜ$ YÓ/€IðØ!×-Ñ-¨iÓ8ˆô 	ˆM×ÑÓ  AÒ%Ü×$Ñ$ ]×%8Ñ%8¸Ñ%;Ó<ÐDØ×Ñ˜qÑ! WÒ,Ø×"Ñ" 1Ò%àØ ×)Ñ)Ó+€LØ˜<Ñ'¨4°<Ñ+?ˆ4ÐQÀ\ÐQøô ò Ùðús   ˜B! Â!	B-Â,B-F©Úraise_on_io_errorrš   c                ó²  — t        | «      } t        | |«      €y	 t        j                  | j	                  «       j
                  «      syt        t        j                  | «      «      }t        | «      }|j                  «       r|n|j                  |z  }t        |«      }t        t        |«      «      }	 |j                  |«      }t!        |j"                  «      dk7  sDt$        j'                  |j"                  d   «      �"|j"                  d   |j"                  d   dd k7  ryt        |«      |z  S # t        $ r Y yt        $ r |r‚ Y yw xY w# t        $ r Y yw xY w)zMReturn the canonical store target if `blob_path` is a managed shared symlink.Nr   r
   r   )r   r˜   r&   ÚS_ISLNKr(   r)   r8   ÚreadlinkÚFileNotFoundErrorr*   r�   Úis_absoluterh   r   r‘   r   r’   r“   r   r   )r|   r   rš   Úlink_targetÚcomparable_blob_pathÚtargetrB   Úrelative_targets           r   Ú_shared_blob_targetr¤     sM  € ô �Y“€IÜ˜9 iÓ0Ð8Øð	Ü�|‰|˜IŸO™OÓ-×5Ñ5Ô6ØÜœ2Ÿ;™; yÓ1Ó2ˆô 0°	Ó:ÐØ'×3Ñ3Ô5‰[Ð;O×;VÑ;VÐYdÑ;d€FÜ! &Ó)€FÜ$Ô%5°iÓ%@ÓA€IðØ ×,Ñ,¨YÓ7ˆô 	ˆO×!Ñ!Ó" aÒ'Ü×$Ñ$ _×%:Ñ%:¸1Ñ%=Ó>ÐFØ× Ñ  Ñ# ×'<Ñ'<¸QÑ'?ÀÀÐ'CÒCàÜ˜IÓ&¨Ñ8Ð8øô+ ò ÙÜò ÙØÙðûô ò Ùðús/   š-D. ÁD. Â2E
 Ä.	EÄ9EÅEÅ
	EÅEc                 ó<   — t        | |«      }|�t        |«      r|S dS )z›Return the canonical store target if `blob_path` is a valid shared symlink.

    Callers check `is_shared_blobs_dir` once before resolving many blobs.
    N)r¤   r,   )r|   r   r¢   s      r   Úshared_blob_targetr¦   +  s(   € ô
 ! ¨IÓ6€FØÐ'Ô,<¸VÔ,Dˆ6ÐNÈ$ÐNr   c                 óH   — | j                  | j                  › t        › �«      S rz   )r    rK   r!   ©r2   s    r   Ú_manifest_path_for_store_pathr©   4  s#   € Ø×Ñ :§?¡?Ð"3Ô4DÐ3EÐ FÓGÐGr   c                 óH   — | j                  | j                  › t        › �«      S rz   )r    rK   Ú_LOCK_SUFFIXr¨   s    r   Ú_lock_path_for_store_pathr¬   8  s!   € Ø×Ñ :§?¡?Ð"3´L°>Ð BÓCÐCr   )NNNc              #   ó`  K  — t        | «      }t        j                  t        j                  z  }t	        t        d«      r|t        j
                  z  }t        j                  ||d«      }	 t        j                  t        j                  |«      j                  «      st        d|› d�«      ‚t	        t        d«      r	 t        j                  |d«       t        j                  |«       t        |d¬«      }	 |j                  «        	 d	–— 	 |j'                  «        y	# t        $ r Y ŒUw xY w# t        j                  |«       w xY w# t         $ r) t#        |› d�d¬«      }|j                  t$        ¬«       Y Œqw xY w# t        $ r Y y	w xY w# 	 |j'                  «        w # t        $ r Y w w xY wxY w­w)
zBLock publication, reference creation, and GC for one content hash.Ú
O_NOFOLLOWrm   z)Shared blob lock is not a regular file: 'r   Úfchmod)Úmodez.soft)ÚtimeoutN)r¬   r8   ÚO_WRONLYÚO_CREATr€   r®   Úopenr&   r'   Úfstatr)   r*   r¯   Úcloser   ÚacquireÚNotImplementedErrorr   Ú_SOFT_LOCK_TIMEOUTÚrelease)r2   Ú	lock_pathÚflagsÚfdÚlocks        r   Ú_shared_blob_lockr¿   <  se  è ø€ ô *¨*Ó5€Iô �K‰Kœ"Ÿ*™*Ñ$€EÜŒr�<Ô Ø”—‘ÑˆÜ	�‰�˜E 5Ó	)€Bð	Ü�|‰|œBŸH™H R›L×0Ñ0Ô1ÜÐEÀiÀ[ÐPRÐSÓTÐTÜ”2�xÔ ðÜ—	‘	˜"˜eÔ$ô 	�‰�ŒÜ�I EÔ*€Dð1Ø�‰Œð
Ûð	Ø�L‰L�Nøô ò Ùðûô 	�‰��ûô ò 1ä˜y˜k¨Ð/°eÔ<ˆØ�‰Ô/ˆÖ0ð1ûô ò 	Ùð	ûð	Ø�L‰L�NøÜò 	Ùð	ÿsµ   ‚A'F.Á*AD+ Â<D Ã"F.Ã5E ÄF	 ÄE: ÄF.Ä	D(Ä%D+ Ä'D(Ä(D+ Ä+EÅF.Å/E7Å4F.Å6E7Å7F.Å:	FÆF.ÆFÆF.Æ	F+ÆFÆF+Æ	F(Æ%F+Æ'F(Æ(F+Æ+F.Úmanifest_pathÚrelative_blob_pathc                 óÜ  — t         j                  t         j                  z  t         j                  z  }t	        t         d«      r|t         j
                  z  }t        j                  | |d«      }	 t        j                  t        j                  |«      j                  «      st        d| › d�«      ‚t	        t         d«      r	 t        j                  |d«       |› d�j                  «       }t        j                  ||«      t        |«      k7  rt        d| › d�«      ‚t        j                   |«       t        j"                  |«       y# t        $ r Y Œzw xY w# t        j"                  |«       w xY w)	zBAppend and flush one reference before its symlink is made visible.r®   rm   z-Shared blob manifest is not a regular file: 'r   r¯   r>   z*Could not append a complete reference to 'N)r8   r²   ÚO_APPENDr³   r€   r®   r´   r&   r'   rµ   r)   r*   r¯   ÚencodeÚwriter’   Úfsyncr¶   )rÀ   rÁ   r¼   r½   Úlines        r   Ú_append_manifest_referencerÈ   `  s  € ä�K‰Kœ"Ÿ+™+Ñ%¬¯
©
Ñ2€EÜŒr�<Ô Ø”—‘ÑˆÜ	�‰�  uÓ	-€BðÜ�|‰|œBŸH™H R›L×0Ñ0Ô1ÜÐIÈ-ÈÐXZÐ[Ó\Ð\Ü”2�xÔ ðÜ—	‘	˜"˜eÔ$ð %Ð% RÐ(×/Ñ/Ó1ˆÜ�8‰8�B˜Ó¤ T£Ò*ÜÐFÀ}ÀoÐUWÐXÓYÐYÜ
�‰�Œä
�‰��øô ò Ùðûô 	�‰��ús2   Á.AE Ã E ÃAE Å	EÅE ÅEÅE ÅE+c                 ó  — | j                  d| j                  › dt        j                  d«      › d�«      }t        j
                  j                  t        |«      t        | «      j                  ¬«      }t	        j                  ||«       |S )NrW   rX   z.shared)Ústart)
r    rK   r^   r_   r8   r#   Úrelpathr�   rh   Úsymlink)r|   r2   Útmp_linkr£   s       r   Ú_make_temporary_symlinkrÎ   v  sn   € Ø×"Ñ" Q y§~¡~Ð&6°a¼×8IÑ8IÈ!Ó8LÐ7MÈWÐ#UÓV€HÜ—g‘g—o‘oÔ&:¸:Ó&FÔNbÐclÓNm×NtÑNt�oÓu€OÜ‡J�Jˆ Ô)Ø€Or   c                  óJ   — t         j                   xr t         j                   S )z1Return whether the shared blob store may be used.)r	   ÚHF_HUB_DISABLE_SHARED_BLOBSÚHF_HUB_DISABLE_XET© r   r   Úshared_blobs_enabledrÓ   }  s   € ä×4Ñ4Ð4ÒY¼Y×=YÑ=YÐ9YÐYr   c                 óÆ  — t         j                  |«      �t        t        |«      «      syt	        ||«      }t        | |«      }|€yd}	 t        |«      5  t        ||«      s	 ddd«       |�|j                  d¬«       yyt        t        | «      |«      }t        t        |«      |«       t        j                  || «       ddd«       |�|j                  d¬«       	 t         j#                  d| › d�«       y# 1 sw Y   Œ8xY w# t        $ r:}t         j#                  d| › d|› �«       Y d}~|�|j                  d¬«       yyd}~ww xY w# |�|j                  d¬«       w w xY w)	zîMaterialize `blobs/<etag>` as a symlink to an existing store entry, if any.

    The reference manifest is flushed before the symlink becomes visible. Failures are
    best-effort misses and leave the regular download path untouched.
    NFTrF   zCould not symlink 'z' from shared blob store: úBlob 'z5' reused from shared blob store (no download needed).)r   r   rD   r   r   r˜   r¿   r<   rN   rÎ   r   rÈ   r©   r8   rc   r*   r6   r\   )r|   r   r   r3   r2   rÁ   rÍ   re   s           r   Útry_link_from_shared_storerÖ   ‚  sb  € ô × Ñ  Ó*Ð2Ô:MÔN^Ð_hÓNiÔ:jØÜ! )¨XÓ6€JÜ,¨Y¸	ÓBÐØÐ!Øà €Hð-Ü˜zÓ*ñ 	,Ü)¨*°mÔDØ÷	,ð ÐØ�O‰O tˆOÕ,ð  ô /¬t°I«À
ÓKˆHÜ&Ô'DÀZÓ'PÐRdÔeÜ�J‰J�x Ô+÷	,ð ÐØ�O‰O tˆOÕ,ä
‡L�L�6˜)˜Ð$YÐZÔ[Ø÷	,ð 	,ûô ò Ü�‰Ð*¨9¨+Ð5OÐPQÈsÐSÔTÛàÐØ�O‰O tˆOÕ,ð  ûð	ûð ÐØ�O‰O tˆOÕ,ð  úsO   Á	D ÁC7Á"D Â A C7Ã D Ã7D Ã<D Ä	EÄEÄ'E	 ÅEÅE	 Å	E c                 ó–   — t        «       r)t        j                  | «      �t        t	        |«      «      syt        t        || «      |«      S )zGReturn whether a usable store entry exists, without touching the cache.F)rÓ   r   r   rD   r   r<   r   )r   r   r3   s      r   Úhas_shared_blobrØ   ¥  sA   € ô !Ô"Ü×$Ñ$ XÓ.Ð6Ü"Ô#3°IÓ#>Ô?àÜ!Ô"2°9¸hÓ"GÈÓWÐWr   )Úreplace_existingrÙ   c                 ó\  — |�t         j                  |«      €yt        ||«      }t        | |«      }|�|€yt	        | «      }t        ||«      }t        |«      }	d}
d}	 t        |«      5  t        ||«      }
| xr t        ||«      }t        |	|«       |s%t        |||«       t        j                  ||«       d}	 t        j                  |
|«       	 ddd«       |
�|
j'                  d¬«       	 t"        j%                  d	| › d
�«       y# t        $ r |rt        j                   ||«       d}‚ w xY w# 1 sw Y   Œ`xY w# t        $ rL}t"        j%                  d| › d|› �«       |rt        d| › d�«      |‚Y d}~|
�|
j'                  d¬«       yyd}~ww xY w# |
�|
j'                  d¬«       w w xY w)zïMove a fresh Xet download into the store and replace its repo blob with a symlink.

    Best-effort: on failure the repo blob remains (or is restored as) a regular local
    file. Returns whether the repo blob was successfully shared.
    NFTzCould not publish 'z' to shared blob store: zCould not restore repo blob 'z' after shared-store failurerF   rÕ   z!' published to shared blob store.)r   r   rj   r˜   r   r   r©   r¿   rÎ   r<   rÈ   r†   r8   rc   r*   ÚshutilÚcopyfiler6   r\   rN   )r|   r   r   r3   rÙ   ri   rÁ   Úblob_path_objr2   rÀ   rÍ   Ú
blob_movedÚstore_is_usablere   s                 r   Úpublish_blob_to_shared_storerà   °  sË  € ð Ð¤× 9Ñ 9¸(Ó CÐ KØÜ# I¨xÓ8€JÜ,¨Y¸	ÓBÐØÐÐ/Ð7Øä˜“O€MÜ! )¨XÓ6€JÜ1°*Ó=€MØ €HØ€Jð-Ü˜zÓ*ñ 	Ü.¨}¸jÓIˆHØ"2Ð2ÒhÔ7MÈjÐZgÓ7hˆOÜ& }Ð6HÔIÙ"Ü0°À
ÈIÔVÜ—
‘
˜=¨*Ô5Ø!�
ðÜ—
‘
˜8 ]Õ3÷	ð* ÐØ�O‰O tˆOÕ,ä
‡L�L�6˜)˜Ð$EÐFÔGØøô ò ÙÜ—O‘O J°Ô>Ø!&�JØð	ú÷	ð 	ûô ò Ü�‰Ð*¨9¨+Ð5MÈaÈSÐQÔRÙÜÐ9¸)¸ÐD`ÐaÓbÐhiÐiÛàÐØ�O‰O tˆOÕ,ð  ûðûð ÐØ�O‰O tˆOÕ,ð  úsU   ÁD< Á(AD0Â:DÃD< Ä%D-Ä-D0Ä0D9Ä5D< Ä<	FÅ-FÅ2F ÆFÆF ÆF+c                 óò  — t        | «      }t        |«      sy 	 |j                  «       j                  «       }t        «       }t        t        j                  j                  |«      «      }|D ]d  }t        |«      }|j                  «       sd|j                  v rŒ-||z  }t        ||«      €Œ?	 t        ||d¬«      }|| k(  sŒT|j                  |«       Œf |S # t        t
        f$ r Y y w xY w# t        $ r Y  y w xY w)Nz..Tr™   )r©   r,   r@   Ú
splitlinesr*   rM   Úsetr   r8   r#   r‹   rŸ   r“   r˜   r¤   Úadd)	r2   r   rÀ   ÚlinesÚ
referencesrÇ   r–   Ú	candidater¢   s	            r   Ú_read_valid_manifest_referencesrè   ç  sÿ   € Ü1°*Ó=€MÜ˜MÔ*ØðØ×'Ñ'Ó)×4Ñ4Ó6ˆô  ›E€JÜ”R—W‘W—_‘_ YÓ/Ó0€IØò &ˆÜ˜T›
ˆØ×$Ñ$Ô&¨$°-×2EÑ2EÑ*EØØ Ñ-ˆ	Ü˜y¨)Ó4Ð<Øð	Ü(¨°IÐQUÔVˆFð �ZÓØ�N‰N˜9Õ%ð&ð Ðøô% ”\Ð"ò Ùðûô ò 	Úð	ús#   ™C Â+C)ÃC&Ã%C&Ã)	C6Ã5C6Úblob_paths_to_deletec                ó´   — t        | |«      }|�|r|j                  |«      sy	 t        | «      r| j                  «       j                  S dS # t
        $ r Y yw xY w)zHPredict bytes freed if all known references are part of a deletion plan.r   )rè   Úissubsetr,   r(   r5   r*   )r2   ré   r   ræ   s       r   Úexpected_shared_blob_freed_sizerì     sa   € ô 1°¸YÓG€JØÐ¡°:×3FÑ3FÐG[Ô3\ØðÜ-=¸jÔ-Iˆz×ÑÓ!×)Ñ)ÐPÈqÐPøÜò Ùðús   ¤$A Á	A Á	AÁAc                 ó<  — t        | «      }t        |«      s
t        «       S t        «       }	 t        |j	                  «       «      }|D ]²  }t        j                  d|j                  «      �t        |«      sŒ/	 t        |j	                  «       «      }|D ]e  }t        j                  |j                  «      €Œ#|j                  j                  |j                  «      sŒIt        |«      sŒU|j                  |«       Œg Œ´ |S # t
        $ r |cY S w xY w# t
        $ r Y ŒÓw xY w)zBReturn all valid canonical payload paths in a marked shared store.z[0-9a-f]{2})r   rD   rã   rH   rI   r*   Úrer   rK   r1   r   rL   r,   rä   )r   rB   ÚpathsÚprefix_dirsri   rQ   rR   s          r   Úshared_store_blob_pathsrñ     s  € ä  Ó+€IÜ˜yÔ)Ü‹uˆÜ“u€EðÜ˜9×,Ñ,Ó.Ó/ˆð "ò !ˆ
Ü�<‰<˜¨
¯©Ó8Ð@ÌÐV`ÔHaØð	Ü˜:×-Ñ-Ó/Ó0ˆGð ò 	!ˆEä×)Ñ)¨%¯*©*Ó5ÑAØ—J‘J×)Ñ)¨*¯/©/Õ:Ü$ UÕ+à—	‘	˜%Õ ñ	!ð!ð €Løô! ò ØŠðûô ò 	Ùð	ús#   ¬C> Á7DÃ>DÄDÄ	DÄDc                 ó¨   — i }t        | «      D ]2  }t        || «      }|€Œ|rŒ	 |j                  «       j                  ||<   Œ4 |S # t        $ r Y ŒBw xY w)z»Return store payloads without any valid manifest reference, with their sizes.

    Payloads with a missing or unreadable manifest are not listed, consistent with `sweep_shared_blob`.
    )rñ   rè   r(   r5   r*   )r   Úunreferencedr2   ræ   s       r   Úunreferenced_shared_blobsrô   *  sk   € ð
 %'€LÜ-¨iÓ8ò ˆ
Ü4°ZÀÓKˆ
ØÑ!ª*ðØ+5×+;Ñ+;Ó+=×+EÑ+E�˜ZÒ(ð	ð Ðøô ò Ùðús   ¤AÁ	AÁAræ   c                 óZ  ‡— | j                  | j                  › dt        j                  d«      › d�«      }t	        t
        j                  j                  ‰«      «      Š	 dj                  ˆfd„t        |«      D «       «      }|j                  |«       |j                  d«       |j                  d«      5 }t        j                  |j                  «       «       d d d «       t        j                  || «       |j!                  d¬	«       y # 1 sw Y   Œ2xY w# |j!                  d¬	«       w xY w)
NrW   rX   rY   Ú c              3   ób   •K  — | ]&  }|j                  ‰«      j                  «       › d �–— Œ( y­w)r>   N)r‘   r•   )Ú.0r#   r   s     €r   ú	<genexpr>z$_rewrite_manifest.<locals>.<genexpr>>  s-   øè ø€ ÒgÈD˜T×-Ñ-¨iÓ8×AÑAÓCÐDÀBÔGÑgùs   ƒ,/rm   ÚrbTrF   )r    rK   r^   r_   r   r8   r#   r‹   ÚjoinÚsortedr`   ra   r´   rÆ   Úfilenorc   rN   )rÀ   ræ   r   Útmp_pathÚcontentÚfiles     `   r   Ú_rewrite_manifestr  :  sè   ø€ Ø×&Ñ&¨-×*<Ñ*<Ð)=¸Q¼w×?PÑ?PÐQRÓ?SÐ>TÐTXÐ'YÓZ€HÜ”R—W‘W—_‘_ YÓ/Ó0€Ið)Ø—'‘'ÓgÔTZÐ[eÓTfÔgÓgˆØ×Ñ˜GÔ$Ø�‰�uÔØ�]‰]˜4Ó ð 	$ DÜ�H‰H�T—[‘[“]Ô#÷	$ä
�
‰
�8˜]Ô+à�‰ 4ˆÕ(÷		$ð 	$ûð 	�‰ 4ˆÕ(ús%   ÁAD Â5$D
ÃD Ä
DÄD ÄD*c                óÜ  — t        t        j                  j                  | «      «      } t        t        j                  j                  |«      «      }t        t        j                  j                  t	        |«      «      «      }	 | j                  |«      }t        |«      r]t        |j                  «      dk7  sEt        j                  | j                  «      �&| j                  j                  | j                  dd k7  ry	 t        | «      5  t        | |«      }|€
	 ddd«       yt!        | «      }|rt#        |||«       	 ddd«       yt%        | «      s
	 ddd«       y| j'                  «       j(                  }| j+                  «        |j+                  d¬«       |cddd«       S # t        $ r Y yw xY w# 1 sw Y   yxY w# t,        $ r%}t.        j1                  d| › d|› �«       Y d}~yd}~ww xY w)zÍCollect one shared blob if its manifest has no remaining valid references.

    Missing, invalid, or unreadable metadata is never grounds for deletion. Returns the
    number of payload bytes removed.
    r   r   NTrF   zCould not collect shared blob 'rZ   )r   r8   r#   r‹   r   r‘   r   rD   r’   r“   r   r   rK   rh   r¿   rè   r©   r  r,   r(   r5   rN   r*   r6   r\   )r2   r   Úexpected_store_dirÚrelative_store_pathræ   rÀ   Úsizere   s           r   Úsweep_shared_blobr  H  sº  € ô ”b—g‘g—o‘o jÓ1Ó2€JÜ”R—W‘W—_‘_ YÓ/Ó0€IÜœbŸg™gŸo™oÔ.>¸yÓ.IÓJÓKÐðØ(×4Ñ4Ð5GÓHÐô  Ð 2Ô3ÜÐ"×(Ñ(Ó)¨QÒ.Ü×$Ñ$ Z§_¡_Ó5Ð=Ø×Ñ×!Ñ! Z§_¡_°R°aÐ%8Ò8àðÜ˜zÓ*ñ 	Ü8¸ÀYÓOˆJØÐ!Ø÷	ð 	ô :¸*ÓEˆMÙÜ! -°¸YÔGØ÷	ð 	ô $ JÔ/Ø÷	ð 	ð ×#Ñ#Ó%×-Ñ-ˆDØ×ÑÔØ× Ñ ¨DÐ Ô1Ø÷	ñ 	øô ò Ùðú÷	ð 	ûô ò Ü�‰Ð6°z°lÀ#ÀaÀSÐIÔJÜûðúsl   ÂF" Ã>F= Ä	F1ÄF= Ä"F1Ä=F= ÅF1ÅF= Å=F1Æ	F= Æ"	F.Æ-F.Æ1F:Æ6F= Æ:F= Æ=	G+ÇG&Ç&G+)IÚ__doc__r8   rî   r^   rÛ   r&   Ú
contextlibr   Úpathlibr   Útypingr   Úfilelockr   r   rö   r	   r   Ú
get_loggerÚ__name__r6   Úcompiler   rû   rü   ÚREPO_TYPES_MAPPINGr”   r   r?   rA   r!   r«   r¹   ÚescaperJ   Ústrr   r   r"   Úboolr,   r1   Úintr<   rD   rS   rf   rj   rb   rx   r]   r†   r�   r˜   r¤   r¦   r©   r¬   r¿   rÈ   rÎ   rÓ   rÖ   rØ   rà   rã   rè   rì   rñ   Údictrô   r  r  rÒ   r   r   ú<module>r     s  ðñ
ó 
Û 	Û Û Û Ý %Ý Ý ç +å Ý ð 
ˆ×	Ñ	˜HÓ	%€à�"—*‘*˜_Ó-€Ø�"—*‘*  C§H¡H©V°I×4PÑ4PÓ-QÓ$RÐ#SÐSXÐYÓZ€àÐ Ø6Ð Ø!Ð ØÐ Ø€ØÐ Ø�B—J‘J 9 2§9¡9Ð-EÓ#FÐ"GÐG[Ð\Ó]Ð ð3  d¡
ð 3¨tó 3ð
A  d¡
ð A°cð A¸dó Að\¨¨t©ð \¸sð \Àtó \ð
˜4ð  Dó ð˜ð  ó ð tð ¸CÀ$¹Jð È4ó ð.	˜c D™jð 	¨Tó 	ð(¨tð (¸ó (ð(¨¨d©
ð °tó ð4 #¨¡*ð ¸ð ÀÀtÁó ð(	m  t¡ð 	m°ó 	mð> c¨D¡jð >°Só >ð"¨ð "¸¸t¹ð "Èó "ð°ð À$ð ÐSVÐY]ÑS]ð Ðbfó ð"+˜s T™zð +¨dó +ðR 3¨¡:ð R¸#À¹*ð RÈÈtÉó Rð& PUò 9Ø�T‰zð 9Ø&)¨D¡jð 9ØHLð 9à	ˆD�[ó 9ðFO #¨¡*ð O¸¸t¹ð OÈÈtÉó OðH¨dð H°tó HðD¨$ð D°4ó Dð ð  $ð  ¨9Ð5EÑ+Fò  ó ð ðF¨dð Èð ÐPTó ð, tð ¸ð À$ó ðZ˜dó Zð
 Øð Ø!$ð Ø14°t±ð ØLOÐRVÉJð à	ó ðFX ð X°°t±ð XÈCÐRVÉJð XÐ[_ó Xð" #ò4àð4ð ð4ð �T‰zð	4ð
 ˜‘:ð4ð ð4ð 
ó4ðn°ð ÀÀtÁð ÐPSÐTXÑPYÐ\`ÑP`ó ð6
Øð
Ø/2°4©yð
ØEHÈ4ÁZð
àó
ð s¨T¡zð °c¸$±ió ð6¨¨t©ð ¸¸TÀ3¸Y¹ó ð ) Tð )°s¸4±yð )ÈSÐSWÉZð )Ð\`ó )ð& $ð &°c¸D±jð &ÀSô &r   