Ë
    °ëj»A  ã                   ó  — d 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 ddlmZmZmZmZmZ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 m!Z!m"Z" d
dl#m$Z$ d
dl%m&Z&m'Z' erd
dl(m)Z)  e jT                  e+«      Z, ejZ                  d«      Z.dZ/dddœZ0e G d„ d«      «       Z1e"	 	 	 d9dee1   dee2   de2de2dee2   dee2   deee2e2f      deee3   ee3   f   fd„«       Z4 G d„ de«      Z5 G d „ d!e«      Z6	 	 	 d9d"d#d$edee2   deee2e2f      dee2   ddfd%„Z7d&e3fd'„Z8d(e3fd)„Z9d*e3fd+„Z:d"d#d,e2ddfd-„Z;d"d#d.ed/e<d,e2ddf
d0„Z=d.ed1e1d/e<dee2   fd2„Z>d3ee   d4e2de6fd5„Z?d"d#d6ee2   d/e<dee   fd7„Z@d"d#d6ee2   d/e<dee   fd8„ZAy):z.Git LFS related type definitions and utilitiesé    N)Ú	dataclass)Úceil)Úgetsize)ÚPath)ÚTYPE_CHECKINGÚBinaryIOÚDictÚIterableÚListÚOptionalÚTupleÚ	TypedDict)Úunquote)Ú	constantsé   )Úbuild_hf_headersÚfix_hf_endpoint_in_urlÚget_sessionÚhf_raise_for_statusÚhttp_backoffÚloggingÚtqdmÚ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        j                  |d«      5 }|j                  d«      d d }t	        |«      }d d d «        | |¬«      S # 1 sw Y   ŒxY w)NÚrbé   ©r!   r   r"   )r   ÚioÚopenÚpeekr   )Úclsr#   r!   Úfiler"   Úshas         ú`/home/oem/CyberBrain26-unified/dev-env/.venv/lib/python3.12/site-packages/huggingface_hub/lfs.pyÚ	from_pathzUploadInfo.from_pathN   s_   € ä�t‹}ˆÜ�W‰W�T˜4Ó ð 	$ DØ—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+   r0   r-   s      r.   Ú
from_byteszUploadInfo.from_bytesV   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Úseekr(   ÚSEEK_SETr   Útell)r+   r6   r"   r-   r!   s        r.   Úfrom_fileobjzUploadInfo.from_fileobj[   sX   € à—‘˜cÓ"ˆØ�‰�QœŸ™Ô$Ü˜'Ó"ˆØ�|‰|‹~ˆØ�‰�QœŸ™Ô$Ù˜ S°Ô8Ð8r5   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚbytesÚ__annotations__ÚintÚclassmethodÚstrr/   r4   r   r<   © r5   r.   r    r    ;   sj   … ñð ƒMØ
ƒIØƒMàð9˜Sò 9ó ð9ð ðB˜eò Bó ðBð ð9 8ò 9ó ñ9r5   r    Úupload_infosÚtokenÚ	repo_typeÚrepo_idÚrevisionÚendpointÚheadersÚreturnc                 óº  — |�|nt         j                  }d}|t         j                  v rt         j                  |   }|› d|› |› d�}d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        «       j                  |||
¬«      }t        |«       |j                  «       }|j                  dd«      }t        |t        «      st!        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

    Returns:
        `LfsBatchInfo`: 2-tuple:
            - First element is the list of upload instructions from the server
            - Second element is an list of errors, if any

    Raises:
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If an argument is invalid or the server response is malformed.
        [`HTTPError`](https://requests.readthedocs.io/en/latest/api/#requests.HTTPError)
            If the server returned an error.
    NÚ ú/z.git/info/lfs/objects/batchÚuploadÚbasicÚ	multipart©Úoidr!   r   )Ú	operationÚ	transfersÚobjectsÚ	hash_algoÚnameÚref)rH   ©rM   ÚjsonrY   zMalformed response from serverÚerror)r   ÚENDPOINTÚREPO_TYPES_URL_PREFIXESr   Úhexr!   r   ÚLFS_HEADERSr   r   Úpostr   r^   ÚgetÚ
isinstanceÚlistÚ
ValueErrorÚ_validate_batch_actionsÚ_validate_batch_error)rG   rH   rI   rJ   rK   rL   rM   Ú
url_prefixÚ	batch_urlrR   ÚpayloadÚrespÚ
batch_inforY   Úobjs                  r.   Úpost_lfs_batch_inforq   e   sƒ  € ðP $Ð/‰x´Y×5GÑ5G€HØ€JØ”I×5Ñ5Ñ5Ü×6Ñ6°yÑAˆ
Ø�*˜A˜j˜\¨'¨Ð2MÐN€IàØ˜{Ð+ð 'ö
ð
 ð —}‘}×(Ñ(Ó*ØŸ™óò
ð ñ€Gð ÐØ ¤'¨(Ó"3Ð4ˆ�‰ðÜ
ðä
 Ô
'ðð Š=�bð€Gô
 ‹=×Ñ˜i°¸wÐÓG€DÜ˜ÔØ—‘“€Jà�n‰n˜Y¨Ó-€GÜ�gœtÔ$ÜÐ9Ó:Ð:ð 29ÖO¨#¸GÈ3Ò<NÔ	  Õ	%ÒOØ/6ÖI¨¸'ÀSº.Ô	˜sÕ	#ÒIðð ùò3
ùò4 	PùÚIs   Á.EÄ	EÄ EÄ3	EÄ=Ec                   ó"   — e Zd ZU eed<   eed<   y)ÚPayloadPartTÚ
partNumberÚetagN)r=   r>   r?   rC   rB   rE   rF   r5   r.   rs   rs   ´   s   … ØƒOØ
„Ir5   rs   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.rV   ÚpartsN)r=   r>   r?   r@   rE   rB   r   rs   rF   r5   r.   rw   rw   ¹   s   … ÙIà	ƒHØ�ÑÔr5   rw   rW   r   Úlfs_batch_actionc                 óB  — 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        | |
¬«       |�…t        |«       t        |d	   |«      }t        «       j                  |t        ||¬«      | j                  j                   j#                  «       | j                  j$                  dœ¬«      }t'        |«       t        j                  | j                  › d�«       y# t        t        f$ r t        d|	› d�«      ‚w xY w)aw  
    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
        [`HTTPError`](https://requests.readthedocs.io/en/latest/api/#requests.HTTPError)
            If the upload resulted in an error
    ÚactionsNzContent of file z. is already present upstream - skipping uploadrR   ÚverifyÚheaderÚ
chunk_sizeÚhref)rL   zTMalformed response from LFS batch endpoint: `chunk_size` should be an integer. Got 'z'.)rW   r}   r~   Ú
upload_url)rW   r€   )rH   rM   rU   r]   z: Upload successful)ri   re   ÚloggerÚdebugÚpath_in_repoÚ_validate_lfs_actionr   rC   rh   Ú	TypeErrorÚ_upload_multi_partÚ_upload_single_partr   rd   r   Úupload_infor   rb   r!   r   )rW   ry   rH   rM   rL   r{   Úupload_actionÚverify_actionr}   r~   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ˆ
Ü!“m×(Ñ(ØÜ$¨5¸'ÔBØ"×.Ñ.×5Ñ5×9Ñ9Ó;ÀY×EZÑEZ×E_ÑE_Ñ`ð )ó 
ˆô
 	˜KÔ(Ü
‡L�L�I×*Ñ*Ð+Ð+>Ð?Õ@øô% œIÐ&ò 	ÜØfÐgqÐfrÐrtÐuóð ð	ús   Â-E? Å?FÚ
lfs_actionc                 óº   — t        | j                  d«      t        «      r0| j                  d«      �*t        | j                  d«      t        «      st	        d«      ‚| S )ú.validates response from the LFS batch endpointr   r}   z"lfs_action is improperly formatted)rf   re   rE   Údictrh   )rŽ   s    r.   r„   r„     sK   € ô 	�:—>‘> &Ó)¬3Ô/Ø�^‰^˜HÓ%Ð-´¸J¿N¹NÈ8Ó<TÔVZÔ1[äÐ=Ó>Ð>ØÐr5   Ú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�   rV   r!   z)lfs_batch_actions is improperly formattedr{   rR   r|   )rf   re   rE   rC   rh   r„   )r’   r‰   rŠ   s      r.   ri   ri     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ØÐ Ü˜]Ô+ØÐ Ü˜]Ô+ØÐr5   Ú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�   rV   r!   z'lfs_batch_error is improperly formattedr_   ÚmessageÚcode)rf   re   rE   rC   rh   r‘   )r”   Ú
error_infos     r.   rj   rj     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ØÐr5   r€   c                 ó†   — | j                  d¬«      5 }t        d||d¬«      }t        |«       ddd«       y# 1 sw Y   yxY w)a¤  
    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.

    Returns: `requests.Response`

    Raises:
     [`HTTPError`](https://requests.readthedocs.io/en/latest/api/#requests.HTTPError)
        If the upload resulted in an error.
    T©Ú	with_tqdmÚPUT©iô  iö  i÷  iø  ©r0   Úretry_on_status_codesN)Úas_filer   r   )rW   r€   r6   Úresponses       r.   r‡   r‡   ,  sE   € ð  
×	Ñ	 TÐ	Ó	*ð &¨gä  z¸ÐWkÔlˆÜ˜HÔ%÷&÷ &ñ &ús	   “7·A r}   r~   c                 óô  — t        || j                  |¬«      }t        j                  }t        j                  rKt	        | j
                  t        «      s1t	        | j
                  t        «      st        j                  d«       d}|rt        | ||¬«      nt        | ||¬«      }t        «       j                  |t        || j                  j                  j!                  «       «      t"        ¬«      }t%        |«       y)z@
    Uploads file using HF multipart LFS transfer protocol.
    )r}   rˆ   r~   zlhf_transfer is enabled but does not support uploading from bytes or BinaryIO, falling back to regular uploadF)rW   Úsorted_parts_urlsr~   )r^   rM   N)Ú_get_sorted_parts_urlsrˆ   r   ÚHF_HUB_ENABLE_HF_TRANSFERrf   Úpath_or_fileobjrE   r   ÚwarningsÚwarnÚ_upload_parts_hf_transferÚ_upload_parts_iterativelyr   rd   Ú_get_completion_payloadr   rb   rc   r   )rW   r}   r~   r€   r£   Úuse_hf_transferÚresponse_headersÚcompletion_ress           r.   r†   r†   B  sÙ   € ô
 /°fÈ)×J_ÑJ_ÐlvÔwÐô  ×9Ñ9€Oä×+Ò+Ü˜9×4Ñ4´cÔ:Ü˜9×4Ñ4´dÔ;ä�‰ðô	
ð  ˆñ ô 	"¨IÐIZÐgqÕrä&°ÐN_ÐlvÔwð ô !“]×'Ñ'ØÜ$Ð%5°y×7LÑ7L×7SÑ7S×7WÑ7WÓ7YÓZÜð (ó €Nô
 ˜Õ'r5   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   rF   )Úts    r.   ú<lambda>z(_get_sorted_parts_urls.<locals>.<lambda>n  s
   € ˜!˜A™$€ r5   )Úkeyz0Invalid server response to upload large LFS file)ÚsortedÚitemsÚisdigitr3   rC   r   r!   rh   )r}   rˆ   r~   Úpart_numr€   Ú_Úsorted_part_upload_urlsÚ	num_partss           r.   r¤   r¤   e  s¶   € ô $ð -3¯L©L«N÷á(�H˜jØ×#Ñ#Ô%¬#¨h«-¸!Ò*;ô �X˜rÓ" JÒ/óñ
 ô
÷
áˆAˆzò 	ð
Ðñ 
ô Ð+Ó,€IØ”D˜×)Ñ)¨JÑ6Ó7Ò7ÜÐKÓLÐLØ"Ð"ùóùó
s   ™6B
ÁB%r­   rV   c                 ó¼   — g }t        | «      D ]H  \  }}|j                  d«      }|�|dk(  rt        d|› d|dz   › �«      ‚|j                  |dz   |dœ«       ŒJ ||dœS )Nru   rP   zInvalid etag (`z`) returned for part r   )rt   ru   )rV   rx   )Ú	enumeratere   rh   Úappend)r­   rV   rx   Úpart_numberr}   ru   s         r.   r«   r«   w  s�   € Ø "€EÜ(Ð)9Ó:ò 	
Ñˆ�VØ�z‰z˜&Ó!ˆØˆ<˜4 2š:Ü˜¨t¨fÐ4IÈ+ÐXYÉ/ÐIZÐ[Ó\Ð\Ø�‰à)¨A™oØñõ	
ð		
ð  Ñ'Ð'r5   r£   c           	      ó8  — g }| j                  d¬«      5 }t        |«      D ]T  \  }}t        |||z  |¬«      5 }t        d||d¬«      }t	        |«       |j                  |j                  «       d d d «       ŒV 	 d d d «       |S # 1 sw Y   ŒkxY w# 1 sw Y   |S xY w)NTrš   )Ú	seek_fromÚ
read_limitrœ   r�   rž   )r    r½   r   r   r   r¾   rM   )	rW   r£   r~   rM   r6   Úpart_idxÚpart_upload_urlÚfileobj_sliceÚpart_upload_ress	            r.   rª   rª   †  s¹   € ð €GØ	×	Ñ	 TÐ	Ó	*ð 8¨gÜ)2Ð3DÓ)Eò 	8Ñ%ˆH�oÜØØ$ xÑ/Ø%ôð 
8ð ä".Ø˜?°ÐVjô#�ô $ OÔ4Ø—‘˜×6Ñ6Ô7÷
8ð 
8ñ	8÷8ð €N÷
8ð 
8ú÷8ð €Nús"   •#B¸6BÁ.
BÂBÂBÂBc                 óz  — 	 ddl m} dt	        j
                  |«      j                  v }|st        j                  d«       | j                  j                  }| j                  }t        |«      dkD  rd|dd  › �}t        j                  «       t        j                   k(  rd	nd }t#        d
d	|d||d¬«      5 }	  |d| j$                  ||ddddœ|rd|j&                  ini ¤Ž}	|s|j'                  |«       |	cd d d «       S # t        $ r t        d«      ‚w xY w# t(        $ r}
t+        d«      |
‚d }
~
ww xY w# 1 sw Y   y xY w)Nr   )Úmultipart_uploadzªFast uploading using 'hf_transfer' is enabled (HF_HUB_ENABLE_HF_TRANSFER=1) but 'hf_transfer' package is not available in your environment. Try `pip install hf_transfer`.Úcallbackz”You are using an outdated version of `hf_transfer`. Consider upgrading to latest version to enable progress bars using `pip install -U hf_transfer`.é(   u   (â€¦)iØÿÿÿTÚBzhuggingface_hub.lfs_upload)ÚunitÚ
unit_scaleÚtotalÚinitialÚdescÚdisabler[   é€   é   é   )Ú	file_pathÚ
parts_urlsr~   Ú	max_filesÚparallel_failuresÚmax_retriesz~An error occurred while uploading using `hf_transfer`. Consider disabling HF_HUB_ENABLE_HF_TRANSFER for better error handling.rF   )Úhf_transferrÈ   ÚImportErrorrh   ÚinspectÚ	signatureÚ
parametersr§   r¨   rˆ   r!   rƒ   r3   r�   ÚgetEffectiveLevelr   ÚNOTSETr   r¦   ÚupdateÚ	ExceptionÚRuntimeError)rW   r£   r~   rÈ   Úsupports_callbackrÎ   rÐ   rÑ   ÚprogressÚoutputÚes              r.   r©   r©   š  sw  € ð
Ý0ð #¤g×&7Ñ&7Ð8HÓ&I×&TÑ&TÐTÐÙÜ�‰ð cô	
ð ×!Ñ!×&Ñ&€EØ×!Ñ!€DÜ
ˆ4ƒy�2‚~Ø�t˜C˜D�z�lÐ#ˆô ×/Ñ/Ó1´W·^±^ÒC‰dÈ$€Gä	ØØØØØØØ)ô
ð ð 
ð	Ù%ð Ø#×3Ñ3Ø,Ø%ØØ"%Øññ 5F�J §¡Ñ0È2ñˆFñ !Ø�O‰O˜EÔ"Ø÷5ñ øô+ ò 
ÜðQó
ð 	
ð
ûôP ò 	Üð*óð ðûð	ú÷'ð ús;   ‚C< Â3D1Â5)DÃD1Ã<DÄ	D.ÄD)Ä)D.Ä.D1Ä1D:)NNN)Br@   rÜ   r(   Úrer§   Údataclassesr   Úmathr   Úos.pathr   Úpathlibr   Útypingr   r   r	   r
   r   r   r   r   Úurllib.parser   Úhuggingface_hubr   Úutilsr   r   r   r   r   r   r   r   Ú
utils._lfsr   Ú	utils.shar   r   Ú_commit_apir   Ú
get_loggerr=   r�   ÚcompileÚ	OID_REGEXÚLFS_MULTIPART_UPLOAD_COMMANDrc   r    rE   r‘   rq   rs   rw   r�   r„   ri   rj   r‡   rC   r†   r¤   r«   rª   r©   rF   r5   r.   ú<module>rø      sÙ  ðñ 5ã Û 	Û 	Û Ý !Ý Ý Ý ß \× \Ó \Ý  å %÷	÷ 	ó 	õ %ß *ñ Ý/à	ˆ×	Ñ	˜HÓ	%€àˆB�J‰JÐ(Ó)€	à5Ð ð -Ø2ñ€ð ÷&9ð &9ó ð&9ðR ð #Ø"Ø(,ñKØ˜:Ñ&ðKà�C‰=ðKð ðKð ð	Kð
 �s‰mðKð �s‰mðKð �d˜3 ˜8‘nÑ%ðKð ˆ4�‰:�t˜D‘zÐ!Ñ"òKó ðKô\�9ô ô
˜ô ð  Ø(,Ø"ñCAØ#ðCAàðCAð �C‰=ðCAð �d˜3 ˜8‘nÑ%ð	CAð
 �s‰mðCAð 
óCAðL Tó ð¨tó ð¨4ó ð&Ð#7ð &ÀSð &ÈTó &ð, (Ð"6ð  (Àð  (ÐRUð  (Ðcfð  (Ðkoó  (ðF# 4ð #°jð #Ècð #ÐVZÐ[^ÑV_ó #ð$(¨d°4©jð (¸sð (ÐGYó (ðØ#ðØ8<¸S¹	ðØORðà	ˆ$�Zóð(5Ø#ð5Ø8<¸S¹	ð5ØORð5à	ˆ$�Zô5r5   