Ë
    ëÿæi+7  ã                   óæ  — d 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mZmZ ddlmZ dd	lmZ d
dlmZmZmZmZmZmZ d
dlmZ d
dlmZmZ erd
dlm Z   ejB                  e"«      Z# ejH                  d«      Z%dZ&dddœZ'e G d„ d«      «       Z(e	 	 	 	 d9dee(   de)dz  de)de)de)dz  de)dz  de*e)e)f   dz  de+e)   dz  de,e+e*   e+e*   e)dz  f   fd„«       Z- G d„ d e«      Z. G d!„ d"e«      Z/	 	 	 d:d#d$d%e*de)dz  de*e)e)f   dz  de)dz  ddfd&„Z0d'e*fd(„Z1d)e*fd*„Z2d+e*fd,„Z3d#d$d-e)ddfd.„Z4d#d$d/e*d0e5d-e)ddf
d1„Z6d/e*d2e(d0e5de+e)   fd3„Z7d4e+e*   d5e)de/fd6„Z8d#d$d7e+e)   d0e5de+e*   fd8„Z9y);z.Git LFS related type definitions and utilitiesé    N)ÚIterable)Ú	dataclass)Úceil)Úgetsize)ÚTYPE_CHECKINGÚBinaryIOÚ	TypedDict)Úunquote)Ú	constantsé   )Úbuild_hf_headersÚfix_hf_endpoint_in_urlÚhf_raise_for_statusÚhttp_backoffÚloggingÚvalidate_hf_hub_args)ÚSliceFileObj)Úsha256Úsha_fileobj)ÚCommitOperationAddz^[0-9a-f]{40}$zlfs-multipart-uploadzapplication/vnd.git-lfs+json)ÚAcceptzContent-Typec                   ór   — e Zd ZU dZeed<   eed<   eed<   edefd„«       Z	edefd„«       Z
ed	efd
„«       Zy)Ú
UploadInfoad  
    Dataclass holding required information to determine whether a blob
    should be uploaded to the hub using the LFS protocol or the regular protocol

    Args:
        sha256 (`bytes`):
            SHA256 hash of the blob
        size (`int`):
            Size in bytes of the blob
        sample (`bytes`):
            First 512 bytes of the blob
    r   ÚsizeÚsampleÚpathc                 ó®   — t        |«      }t        |d«      5 }|j                  d«      d d }t        |«      }d d d «        | |¬«      S # 1 sw Y   ŒxY w)NÚrbé   ©r   r   r   )r   ÚopenÚpeekr   )Úclsr   r   Úfiler   Úshas         úh/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/huggingface_hub/lfs.pyÚ	from_pathzUploadInfo.from_pathI   sT   € ä�t‹}ˆÜ�$˜Ô Ø—Y‘Y˜s“^ D SÐ)ˆFÜ˜dÓ#ˆC÷ ñ ˜ S°Ô8Ð8÷ Ðús   ˜ AÁAÚdatac                 ób   — t        |«      j                  «       } | t        |«      |d d |¬«      S )Nr   )r   r   r   )r   ÚdigestÚlen)r#   r(   r%   s      r&   Ú
from_byteszUploadInfo.from_bytesQ   s-   € ä�T‹l×!Ñ!Ó#ˆÙœ˜D›	¨$¨t°¨*¸SÔAÐAó    Úfileobjc                 óð   — |j                  d«      }|j                  dt        j                  «       t	        |«      }|j                  «       }|j                  dt        j                  «        | |||¬«      S )Nr   r   r    )ÚreadÚseekÚioÚSEEK_SETr   Útell)r#   r.   r   r%   r   s        r&   Úfrom_fileobjzUploadInfo.from_fileobjV   sX   € à—‘˜cÓ"ˆØ�‰�QœŸ™Ô$Ü˜'Ó"ˆØ�|‰|‹~ˆØ�‰�QœŸ™Ô$Ù˜ S°Ô8Ð8r-   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚbytesÚ__annotations__ÚintÚclassmethodÚstrr'   r,   r   r5   © r-   r&   r   r   6   sj   … ñð ƒMØ
ƒIØƒMàð9˜Sò 9ó ð9ð ðB˜eò Bó ðBð ð9 8ò 9ó ñ9r-   r   Úupload_infosÚtokenÚ	repo_typeÚrepo_idÚrevisionÚendpointÚheadersÚ	transfersÚreturnc                 óô  — |�|nt         j                  }d}|t         j                  v rt         j                  |   }|› d|› |› d�}	d|�|nddg| D �
cg c])  }
|
j                  j	                  «       |
j
                  dœ‘Œ+ c}
d	d
œ}|�dt        |«      i|d<   i t        ¥t        |¬«      ¥|xs i ¥}t        d|	||¬«      }t        |«       |j                  «       }|j                  dd«      }t        |t        «      st        d«      ‚|j                  d«      }t        |t         «      r|nd}|D �cg c]  }d|vsŒt#        |«      ‘Œ c}|D �cg c]  }d|v sŒt%        |«      ‘Œ c}|fS c c}
w c c}w c c}w )a�  
    Requests the LFS batch endpoint to retrieve upload instructions

    Learn more: https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md

    Args:
        upload_infos (`Iterable` of `UploadInfo`):
            `UploadInfo` for the files that are being uploaded, typically obtained
            from `CommitOperationAdd.upload_info`
        repo_type (`str`):
            Type of the repo to upload to: `"model"`, `"dataset"` or `"space"`.
        repo_id (`str`):
            A namespace (user or an organization) and a repo name separated
            by a `/`.
        revision (`str`, *optional*):
            The git revision to upload to.
        headers (`dict`, *optional*):
            Additional headers to include in the request
        transfers (`list`, *optional*):
            List of transfer methods to use. Defaults to ["basic", "multipart"].

    Returns:
        `LfsBatchInfo`: 3-tuple:
            - First element is the list of upload instructions from the server
            - Second element is a list of errors, if any
            - Third element is the chosen transfer adapter if provided by the server (e.g. "basic", "multipart", "xet")

    Raises:
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If an argument is invalid or the server response is malformed.
        [`HfHubHTTPError`]
            If the server returned an error.
    NÚ Ú/z.git/info/lfs/objects/batchÚuploadÚbasicÚ	multipart©Úoidr   r   )Ú	operationrG   ÚobjectsÚ	hash_algoÚnameÚref)rA   ÚPOST©rF   ÚjsonrR   zMalformed response from serverÚtransferÚerror)r   ÚENDPOINTÚREPO_TYPES_URL_PREFIXESr   Úhexr   r
   ÚLFS_HEADERSr   r   r   rX   ÚgetÚ
isinstanceÚlistÚ
ValueErrorr>   Ú_validate_batch_actionsÚ_validate_batch_error)r@   rA   rB   rC   rD   rE   rF   rG   Ú
url_prefixÚ	batch_urlrL   ÚpayloadÚrespÚ
batch_inforR   Úchosen_transferÚobjs                    r&   Úpost_lfs_batch_inforl   `   s±  € ðX $Ð/‰x´Y×5GÑ5G€HØ€JØ”I×5Ñ5Ñ5Ü×6Ñ6°yÑAˆ
Ø�*˜A˜j˜\¨'¨Ð2MÐN€IàØ"+Ð"7‘Y¸gÀ{Ð=Sñ 'ó
ñ
 '�ð —}‘}×(Ñ(Ó*ØŸ™óð 'ñ
ð ñ€Gð ÐØ ¤'¨(Ó"3Ð4ˆ�‰ðÜ
ðä
 Ô
'ðð Š=�bð€Gô
 ˜ 	°7ÀÔI€DÜ˜ÔØ—‘“€Jà�n‰n˜Y¨Ó-€GÜ�gœtÔ$ÜÐ9Ó:Ð:à —n‘n ZÓ0€OÜ)3°OÄSÔ)I‘oÈt€Oñ 29ÓO±¨#¸GÈ3Ò<NÔ	  Õ	%°ÑOÙ/6ÓI©w¨¸'ÀSº.Ô	˜sÕ	#¨wÑIØðð ùò9
ùò: 	PùÚIs   Á.E+Ä2	E0Ä<E0Å	E5ÅE5c                   ó"   — e Zd ZU eed<   eed<   y)ÚPayloadPartTÚ
partNumberÚetagN)r6   r7   r8   r<   r;   r>   r?   r-   r&   rn   rn   ·   s   … ØƒOØ
„Ir-   rn   c                   ó,   — e Zd ZU dZeed<   ee   ed<   y)ÚCompletionPayloadTz?Payload that will be sent to the Hub when uploading multi-part.rP   ÚpartsN)r6   r7   r8   r9   r>   r;   ra   rn   r?   r-   r&   rr   rr   ¼   s   … ÙIà	ƒHØ�ÑÔr-   rr   rQ   r   Úlfs_batch_actionc                 ó(  — t        |«       |j                  d«      }|€$t        j                  d| j                  › d�«       y|d   d   }t        |«       |d   j                  d«      }|�t        |«       |j                  di «      }|j                  d«      }	t        |d	   |¬
«      }
|	�	 t        |	«      }	t        | ||	|
¬«       nt        | |
¬«       |�xt        |«       t        |d	   |«      }t        d|t        ||¬«      | j                  j                  j!                  «       | j                  j"                  dœ¬«      }t%        |«       t        j                  | j                  › d�«       y# t        t        f$ r t        d|	› d�«      ‚w xY w)a9  
    Handles uploading a given object to the Hub with the LFS protocol.

    Can be a No-op if the content of the file is already present on the hub large file storage.

    Args:
        operation (`CommitOperationAdd`):
            The add operation triggering this upload.
        lfs_batch_action (`dict`):
            Upload instructions from the LFS batch endpoint for this object. See [`~utils.lfs.post_lfs_batch_info`] for
            more details.
        headers (`dict`, *optional*):
            Headers to include in the request, including authentication and user agent headers.

    Raises:
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If `lfs_batch_action` is improperly formatted
        [`HfHubHTTPError`]
            If the upload resulted in an error
    ÚactionsNzContent of file z. is already present upstream - skipping uploadrL   ÚverifyÚheaderÚ
chunk_sizeÚhref)rE   zTMalformed response from LFS batch endpoint: `chunk_size` should be an integer. Got 'z'.)rQ   rx   ry   Ú
upload_url)rQ   r{   rV   )rA   rF   rO   rW   z: Upload successful)rc   r_   ÚloggerÚdebugÚpath_in_repoÚ_validate_lfs_actionr   r<   rb   Ú	TypeErrorÚ_upload_multi_partÚ_upload_single_partr   r   Úupload_infor   r]   r   r   )rQ   rt   rA   rF   rE   rv   Úupload_actionÚverify_actionrx   ry   r{   Ú
verify_urlÚverify_resps                r&   Ú
lfs_uploadrˆ   Ã   sœ  € ô8 Ð,Ô-Ø×"Ñ" 9Ó-€GØ€ä�‰Ð'¨	×(>Ñ(>Ð'?Ð?mÐnÔoØð % YÑ/°Ñ9€MÜ˜Ô'Ø$ YÑ/×3Ñ3°HÓ=€MØÐ Ü˜]Ô+ð ×Ñ˜x¨Ó,€FØ—‘˜LÓ)€JÜ'¨°fÑ(=ÈÔQ€JØÐð	Ü˜Z›ˆJô
 	 Y°vÈ*ÐakÖlä i¸JÕGð Ð Ü˜]Ô+Ü+¨M¸&Ñ,AÀ8ÓLˆ
Ü"ØØÜ$¨5¸'ÔBØ"×.Ñ.×5Ñ5×9Ñ9Ó;ÀY×EZÑEZ×E_ÑE_Ñ`ô	
ˆô 	˜KÔ(Ü
‡L�L�I×*Ñ*Ð+Ð+>Ð?Õ@øô' œIÐ&ò 	ÜØfÐgqÐfrÐrtÐuóð ð	ús   Â-E2 Å2FÚ
lfs_actionc                 óº   — t        | j                  d«      t        «      r0| j                  d«      �*t        | j                  d«      t        «      st	        d«      ‚| S )ú.validates response from the LFS batch endpointrz   rx   z"lfs_action is improperly formatted)r`   r_   r>   Údictrb   )r‰   s    r&   r   r   
  sK   € ô 	�:—>‘> &Ó)¬3Ô/Ø�^‰^˜HÓ%Ð-´¸J¿N¹NÈ8Ó<TÔVZÔ1[äÐ=Ó>Ð>ØÐr-   Úlfs_batch_actionsc                 óP  — t        | j                  d«      t        «      rt        | j                  d«      t        «      st	        d«      ‚| j                  di «      j                  d«      }| j                  di «      j                  d«      }|�t        |«       |�t        |«       | S )r‹   rP   r   z)lfs_batch_actions is improperly formattedrv   rL   rw   )r`   r_   r>   r<   rb   r   )r�   r„   r…   s      r&   rc   rc     s—   € äÐ(×,Ñ,¨UÓ3´SÔ9¼jÐIZ×I^ÑI^Ð_eÓIfÔhkÔ>lÜÐDÓEÐEà%×)Ñ)¨)°RÓ8×<Ñ<¸XÓF€MØ%×)Ñ)¨)°RÓ8×<Ñ<¸XÓF€MØÐ Ü˜]Ô+ØÐ Ü˜]Ô+ØÐr-   Úlfs_batch_errorc                 ól  — t        | j                  d«      t        «      rt        | j                  d«      t        «      st	        d«      ‚| j                  d«      }t        |t
        «      r>t        |j                  d«      t        «      rt        |j                  d«      t        «      st	        d«      ‚| S )r‹   rP   r   z'lfs_batch_error is improperly formattedrZ   ÚmessageÚcode)r`   r_   r>   r<   rb   rŒ   )r�   Ú
error_infos     r&   rd   rd   "  s‹   € ä�×*Ñ*¨5Ó1´3Ô7¼JÀ×GZÑGZÐ[aÓGbÔdgÔ<hÜÐBÓCÐCØ ×$Ñ$ WÓ-€Jä�:œtÔ$Ü�z—~‘~ iÓ0´#Ô6Ü�z—~‘~ fÓ-¬sÔ3äÐBÓCÐCØÐr-   r{   c                 ó„   — | j                  d¬«      5 }t        d||¬«      }t        |«       ddd«       y# 1 sw Y   yxY w)aK  
    Uploads `fileobj` as a single PUT HTTP request (basic LFS transfer protocol)

    Args:
        upload_url (`str`):
            The URL to PUT the file to.
        fileobj:
            The file-like object holding the data to upload.

    Raises:
        [`HfHubHTTPError`]
            If the upload resulted in an error.
    T©Ú	with_tqdmÚPUT©r(   N)Úas_filer   r   )rQ   r{   r.   Úresponses       r&   r‚   r‚   0  s9   € ð 
×	Ñ	 TÐ	Ô	*¨gä  z¸Ô@ˆÜ˜HÔ%÷ 
+×	*Ñ	*ús   “6¶?rx   ry   c           	      óä   — t        || j                  |¬«      }t        | ||¬«      }t        d|t	        || j                  j
                  j                  «       «      t        ¬«      }t        |«       y)z@
    Uploads file using HF multipart LFS transfer protocol.
    )rx   rƒ   ry   )rQ   Úsorted_parts_urlsry   rV   )rX   rF   N)	Ú_get_sorted_parts_urlsrƒ   Ú_upload_parts_iterativelyr   Ú_get_completion_payloadr   r]   r^   r   )rQ   rx   ry   r{   rœ   Úresponse_headersÚcompletion_ress          r&   r�   r�   D  sn   € ô
 /°fÈ)×J_ÑJ_ÐlvÔwÐô 1ØÐ/@ÈZôÐô "ØØÜ$Ð%5°y×7LÑ7L×7SÑ7S×7WÑ7WÓ7YÓZÜô	€Nô ˜Õ'r-   rƒ   c           
      óV  — t        | j                  «       D ��cg c]1  \  }}|j                  «       rt        |«      dkD  rt	        |d«      |f‘Œ3 c}}d„ ¬«      D ��cg c]  \  }}|‘Œ	 }}}t        |«      }|t        |j                  |z  «      k7  rt        d«      ‚|S c c}}w c c}}w )Nr   é
   c                 ó   — | d   S )Nr   r?   )Úts    r&   Ú<lambda>z(_get_sorted_parts_urls.<locals>.<lambda>d  s   € ˜!˜Aš$r-   )Úkeyz0Invalid server response to upload large LFS file)ÚsortedÚitemsÚisdigitr+   r<   r   r   rb   )rx   rƒ   ry   Úpart_numr{   Ú_Úsorted_part_upload_urlsÚ	num_partss           r&   r�   r�   [  sÂ   € ô $ð -3¯L©L¬Nôá,:Ñ(�H˜jØ×#Ñ#Ô%¬#¨h«-¸!Ò*;ô �X˜rÓ" JÒ/Ø,:òñ
 õ
ô
ñ
‰MˆAˆzò 	ð
ð ñ 
ô Ð+Ó,€IØ”D˜×)Ñ)¨JÑ6Ó7Ò7ÜÐKÓLÐLØ"Ð"ùóùó
s   ™6B
ÁB%r    rP   c                 ó¼   — g }t        | «      D ]H  \  }}|j                  d«      }|�|dk(  rt        d|› d|dz   › �«      ‚|j                  |dz   |dœ«       ŒJ ||dœS )Nrp   rJ   zInvalid etag (`z`) returned for part r   )ro   rp   )rP   rs   )Ú	enumerater_   rb   Úappend)r    rP   rs   Úpart_numberrx   rp   s         r&   rŸ   rŸ   m  s|   € Ø "€EÜ(Ð)9Ö:Ñˆ�VØ�z‰z˜&Ó!ˆØˆ<˜4 2š:Ü˜¨t¨fÐ4IÈ+ÐXYÉ/ÐIZÐ[Ó\Ð\Ø�‰à)¨A™oØñõ	
ð	  ;ð  Ñ'Ð'r-   rœ   c                 ó6  — g }| j                  d¬«      5 }t        |«      D ]S  \  }}t        |||z  |¬«      5 }t        d||¬«      }t	        |«       |j                  |j                  «       d d d «       ŒU 	 d d d «       |S # 1 sw Y   ŒjxY w# 1 sw Y   |S xY w)NTr•   )Ú	seek_fromÚ
read_limitr—   r˜   )r™   r°   r   r   r   r±   rF   )	rQ   rœ   ry   rF   r.   Úpart_idxÚpart_upload_urlÚfileobj_sliceÚpart_upload_ress	            r&   rž   rž   |  s£   € ð €GØ	×	Ñ	 TÐ	Ô	*¨gÜ)2Ð3DÖ)EÑ%ˆH�oÜØØ$ xÑ/Ø%õð ä".¨u°oÈMÔ"Z�Ü# OÔ4Ø—‘˜×6Ñ6Ô7÷ð ñ *F÷ 
+ð €N÷ð ú÷ 
+ð €Nús"   •#B¸5BÁ-
BÂBÂBÂB)NNNN)NNN):r9   r2   ÚreÚcollections.abcr   Údataclassesr   Úmathr   Úos.pathr   Útypingr   r   r	   Úurllib.parser
   Úhuggingface_hubr   Úutilsr   r   r   r   r   r   Ú
utils._lfsr   Ú	utils.shar   r   Ú_commit_apir   Ú
get_loggerr6   r|   ÚcompileÚ	OID_REGEXÚLFS_MULTIPART_UPLOAD_COMMANDr^   r   r>   rŒ   ra   Útuplerl   rn   rr   rˆ   r   rc   rd   r‚   r<   r�   r�   rŸ   rž   r?   r-   r&   Ú<module>rË      sº  ðñ 5ã 	Û 	Ý $Ý !Ý Ý ß 5Ñ 5Ý  å %÷÷ õ %ß *ñ Ý/à	ˆ×	Ñ	˜HÓ	%€àˆB�J‰JÐ(Ó)€	à5Ð ð -Ø2ñ€ð ÷&9ð &9ó ð&9ðR ð  ØØ%)Ø"&ñSØ˜:Ñ&ðSà�‰:ðSð ðSð ð	Sð
 �D‰jðSð �D‰jðSð �#�s�(‰^˜dÑ"ðSð �C‰y˜4ÑðSð ˆ4�‰:�t˜D‘z 3¨¡:Ð-Ñ.òSó ðSôl�9ô ô
˜ô ð Ø%)ØñDAØ#ðDAàðDAð �‰:ðDAð �#�s�(‰^˜dÑ"ð	DAð
 �D‰jðDAð 
óDAðN Tó ð¨tó ð¨4ó ð&Ð#7ð &ÀSð &ÈTó &ð((Ð"6ð (Àð (ÐRUð (Ðcfð (Ðkoó (ð.# 4ð #°jð #Ècð #ÐVZÐ[^ÑV_ó #ð$(¨d°4©jð (¸sð (ÐGYó (ðØ#ðØ8<¸S¹	ðØORðà	ˆ$�Zôr-   