Ë
    ÂÓ^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mZ ddl	m	Z	 ddl
mZ ddlmZmZ ddlmZmZ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 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*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z<  e!jz                  e>«      Z?de@de@dz  deAe@e@dz  f   fd„ZBdeCe@   dz  dede@dz  deCe   dz  fd„ZDdZEee@ e8d¬«      f   ZFee@dz   e9d¬«      f   ZGee@dz   e9d e.e«      ¬ «      f   ZHeeCe@   dz   e9d!d"d#¬«      f   ZIee@dz   e9d$d%¬«      f   ZJee@dz   e9d&¬«      f   ZKeeL e9d'd(d)¬«      f   ZMee@dz   e9d*¬«      f   ZNeeCeO   dz   e9d+d,¬«      f   ZPeeL e9d-d.¬«      f   ZQeeCe@   dz   e9d/d0¬«      f   ZRee@dz   e9d1d2d3¬«      f   ZSeeLdz   e9d4¬«      f   ZTeeLdz   e9d5¬«      f   ZUee@ e8d6¬«      f   ZVee@ e8d7¬«      f   ZWeeCe@   dz   e8d8¬«      f   ZXeeCe@    e8d9¬«      f   ZYee@ e8d:¬«      f   ZZeeCe@   dz   e8d;¬«      f   Z[ee@ e8d<¬«      f   Z\eeCe@   dz   e9d=d>d?¬«      f   Z] e6d@¬«      Z^dedAeddfdB„Z_e^jÁ                  dCdDdEig dF¢¬G«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÓdHeFdIeYdJe+dKe-dLeJdMeIdNe]dOe*dPe,dQeHdReKdSeMdTePdUeQdeNdVe1ddf"dW„«       Zae^jÁ                  dXg dY¢¬Z«      	 	 	 	 dÔdeZd[eeL e9d\d]d^¬«      f   d_eeOdz   e9d`dadb¬«      f   deNdVe1ddfdc„«       Zbddece@e@f   deeCeAe@e@e@f      deLfdf„ZddgeOddfdh„Zede@dieece@ef      djeCe@   deeAeLe@eCeCe@eOz        f      fdk„Zfe^jÁ                  dldmg¬Z«      	 	 	 dÕdne[deNdVe1ddfdo„«       Zge^jÁ                  dpg dq¢¬Z«      	 	 	 	 	 	 	 dÖdreeL e9dsdtdu¬«      f   dveeCe@   dz   e9dw e.e«      dx¬y«      f   dMeeCe@   dz   e9d!d"dz¬«      f   d{eeO e9d|d}¬«      f   deNdVe1d~eeCe@   dz   e9d\dd€¬«      f   ddfd�„«       Zhe^jÁ                  d‚dƒg¬Z«      d×d„„«       Zie^jÁ                  d…d†g¬Z«      	 	 dØdneeCe@    e8d‡¬«      f   deNdVe1ddfdˆ„«       Zje^jÁ                  d‰dŠg¬Z«      	 	 dØdeZdeNdVe1ddfd‹„«       Zke^jÁ                  dŒg d�¢¬Z«      	 	 	 dÕdneeCe@    e8dŽ¬«      f   dRee@dz   e9d�¬«      f   deNdVe1ddf
d�„«       Zle^jÁ                  d‘g d’¢¬Z«      	 	 	 	 	 dÙdeZdLeJdMeId“eeL e9d”d•¬«      f   deNdVe1ddfd–„«       Zme^jÁ                  dUg d—¢¬Z«      	 	 	 	 dÚdeZd˜e0d™e/deNdVe1ddfdš„«       Zn e6d›¬«      Zoe^já                  eodœ¬�«       eojÁ                  dCdDdEig dž¢¬G«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÛdŸeWd eXdHeGdQeHdJe+dKe-dLeJdMeIdNe]dOe*dPe,dReKdSeMdTePdUeQdeNdVe1d¡eRd¢eSddf(d£„«       Zq e6d¤¬«      Zre^já                  erd¥¬�«       erjÁ                  dCdDdEid¦g¬G«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÜd§eVdHeFdIeYd¨eTd©eUdJe+dKe-dLeJdMeIdNe]dOe*dPe,dQeHdReKdTePdeNdVe1ddf$dª„«       ZserjÁ                  dpd«g¬Z«      	 	 	 	 dÔdreeL e9dsdtd¬¬«      f   deNdVe1d~eeCe@   dz   e9d\dd­¬«      f   ddf
d®„«       ZterjÁ                  d…d¯g¬Z«      	 	 dØd°eeCe@    e8d±¬«      f   deNdVe1ddfd²„«       ZuerjÁ                  d³d´g¬Z«      	 	 dØdµe\deNdVe1ddfd¶„«       ZverjÁ                  d¨d·g¬Z«      	 	 dØdµe\deNdVe1ddfd¸„«       ZwerjÁ                  d¹dºg¬Z«      	 	 dØdµe\deNdVe1ddfd»„«       ZxerjÁ                  d¼d½g¬Z«      	 	 dØdµe\deNdVe1ddfd¾„«       ZyerjÁ                  d‘g d¿¢¬Z«      	 	 	 	 	 dÙdµe\dLeJdMeId“eeL e9d”dÀ¬«      f   deNdVe1ddfdÁ„«       Zz e6dÂ¬«      Z{erjá                  e{dœ¬�«       e{jÁ                  dCdDdEidÃdÄg¬G«      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dÝd§eVdŸeWd eXd¨eTd©eUdHeGdQeHdJe+dKe-dLeJdMeIdNe]dOe*dPe,dReKdTePdeNdVe1d¡eRd¢eSddf*dÅ„«       Z|dd�œd‘eCe@   dz  dLe@dz  dece@e@f   dz  fdÆ„Z}dÇeCeCe@eOz        dÈeCe@   de@fdÉ„Z~ edÊ«      ZdËee   dÌedÍee   f   dÎecddfdÏ„Z€dÐe�j                  �j                  dÌedÍee   f   dÑeCec   dee   fdÒ„Zƒy)Þz@Contains commands to interact with jobs on the Hugging Face Hub.é    N)ÚCallableÚIterable)Úfnmatch)ÚPath)ÚEmptyÚQueue)Ú	AnnotatedÚAnyÚTypeVar)Úurlsplit)ÚHfApiÚJobHardwareÚJobInfoÚJobStageÚVolumeÚ	constants)ÚTERMINAL_JOB_STAGES)ÚCLIError)Úlogging)Ú_format_size)Ú_split_mount)Úformat_durationÚparse_durationé   )Ú
EnvFileOptÚEnvOptÚSecretsFileOptÚ
SecretsOptÚ
SoftChoiceÚSshDryRunOptÚSshIdentityFileOptÚTokenOptÚexec_sshÚ
get_hf_apiÚparse_env_mapÚparse_volumesÚtyper_factory)ÚArgumentÚOption)Ú_dataclass_to_dictÚoutÚjob_idÚ	namespaceÚreturnc                 óü   — | st        d«      ‚| j                  d«      dkD  rt        d| › d�«      ‚d| vr| |fS | j                  dd«      \  }}|r|st        d| › d�«      ‚|�||k7  rt        d|› d|› d�«      ‚||fS )	a&  Extract namespace from job_id if provided in 'namespace/job_id' format.

    Allows users to pass job IDs copied from the Hub UI (e.g. 'username/job_id')
    instead of only bare job IDs. If the namespace is also provided explicitly via
    --namespace and conflicts, a CLIError is raised.
    zJob ID cannot be empty.ú/r   z<Job ID must be in the form 'job_id' or 'namespace/job_id': 'z'.z(Conflicting namespace: got --namespace='z ' but job ID implies namespace='ú')r   ÚcountÚsplit)r,   r-   Úextracted_namespaceÚparsed_job_ids       úc/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/huggingface_hub/cli/jobs.pyÚ_parse_namespace_from_job_idr7   :   sÁ   € ñ ÜÐ0Ó1Ð1à‡|�|�CÓ˜1ÒÜÐUÐV\ÐU]Ð]_Ð`ÓaÐaà
�&ÑØ�yÐ Ð à)/¯©°c¸1Ó)=Ñ&Ð˜Ù¡mÜÐUÐV\ÐU]Ð]_Ð`ÓaÐaàÐ Ð.AÒ!AÜØ6°y°kÐAaÐbuÐavÐvwÐxó
ð 	
ð Ð-Ð-Ð-ó    ÚvolumesÚapic                ó*  — | syg }| D �]  }|j                  t        j                  «      r |j                  t	        |g«      xs g «       ŒCt        ||¬«      \  }}}|€t        d|› d�«      ‚t        |«      j                  «       j                  «       st        d|› d�«      ‚|j                  |||�|nd|¬«      }|j                  d	u r5t        j                  d
|› d|j                  › d|j                  › d|› �«       |j!                  |«       �Œ
 |S )a  Parse `-v` specs for Jobs commands.

    Same as [`parse_volumes`] but the source side can also be a local directory: it is synced to a
    bucket via [`HfApi.sync_job_volume`] and the resulting bucket subfolder is mounted (read-only
    unless ':rw' is specified).
    N)Úrawz#Missing mount path in volume spec 'zC'. Expected 'LOCAL_DIR:/MOUNT_PATH[:ro|:rw]' (e.g. './data:/data').zVolume source 'z�' is not an existing local directory. To mount a repo or bucket instead, use the 'hf://' syntax (e.g. 'hf://buckets/my-org/my-bucket:/data').T)Ú	read_onlyr-   FzVolume 'zg' is mounted read-write. Once the job is over, pull back its data with:
  hf buckets sync hf://buckets/r0   ú )Ú
startswithr   ÚHF_PROTOCOLÚextendr&   r   r   r   Ú
expanduserÚis_dirÚsync_job_volumer=   r+   ÚhintÚsourceÚpathÚappend)	r9   r:   r-   ÚresultÚraw_specrF   Ú
mount_pathr=   Úvolumes	            r6   Ú_parse_and_sync_job_volumesrM   V   sK  € ñ Øà€FØó ˆØ×Ñœy×4Ñ4Ô5Ø�M‰Mœ-¨¨
Ó3Ò9°rÔ:Øô )5°XÀ8Ô(LÑ%ˆ�
˜IØÐÜØ5°h°Zð  @Cð  Dóð ô �F‹|×&Ñ&Ó(×/Ñ/Ô1ÜØ! & ð *zð zóð ð ×$Ñ$ØØØ#,Ð#8‘i¸dØð	 %ó 
ˆð ×Ñ˜uÑ$Ü�H‰HØ˜:˜,ð '2Ø28·-±-°ÀÀ&Ç+Á+ÀÈaÐPVÈxðYôð 	�‰�fÖð7ð8 €Mr8   gš™™™™™¹?zThe Docker image to use.)Úhelpz.Use a custom Docker image with `uv` installed.zcFlavor for the hardware. Run 'hf jobs hardware' to list available flavors. Defaults to `cpu-basic`.)rN   Ú
click_typez-lz--labelz3Set labels. E.g. --label KEY=VALUE or --label LABELz--namezIName the Job. Stored as the `name` label. Names do not have to be unique.zPMax duration: int with s (seconds, default), m (minutes), h (hours) or d (days).z-dz--detachz3Run the Job in the background and print the Job ID.zVThe namespace where the job will be running. Defaults to the current user's namespace.z--exposez÷Expose a container port through the jobs proxy. Repeat the flag for multiple ports (e.g. `--expose 8000 --expose 8001`). Each exposed port is reachable on the public jobs domain; access requires an HF token with read access to the job's namespace.z--sshz Make the job's container reachable over SSH. Connect with `hf jobs ssh <job_id>`. Requires an SSH public key registered on https://huggingface.co/settings/keys.z--withz%Run with the given packages installedz-pz--pythonz5The Python interpreter to use for the run environmentz!Suspend (pause) the scheduled Jobz8Allow multiple instances of this Job to run concurrentlyzWOne of annually, yearly, monthly, weekly, daily, hourly, or a CRON schedule expression.z$UV script to run (local file or URL)zArguments for the scriptzThe command to run.zJob ID (or 'namespace/job_id')zJob IDs (or 'namespace/job_id')z2Scheduled Job ID (or 'namespace/scheduled_job_id')z-vz--volumeaÓ  Mount one or more volumes. Format: hf://[TYPE/]SOURCE:/MOUNT_PATH[:ro|:rw] or LOCAL_DIR:/MOUNT_PATH[:ro|:rw]. TYPE is one of: models, datasets, spaces, buckets. TYPE defaults to models if omitted. models, datasets and spaces are always mounted read-only. buckets are read+write by default. A local directory source is first synced to a bucket and mounted read-only by default. E.g. -v hf://datasets/org/ds:/data or -v hf://buckets/org/b:/mnt:ro or -v ./inputs:/inputszRun and manage Jobs on the Hub.Újobc                 óX  — | j                  |j                  |j                  j                  d¬«      D ]  }t	        j
                  |«       Œ | j                  |j                  |j                  j                  ¬«      }|j                  j                  t        j                  k7  rc|j                  j                  rd|j                  j                  › �nd}t        d|j                  › d|j                  j                  › d|› �«      ‚t	        j
                  d|j                  › d	�«       y
)zcStream Job logs until the Job ends, then fail the command if the Job did not complete successfully.T)r,   r-   Úfollow©r,   r-   z: Ú zJob z finished with stage 'r1   z
 completedN)Úfetch_job_logsÚidÚownerÚnamer+   ÚtextÚwait_for_jobÚstatusÚstager   Ú	COMPLETEDÚmessager   )r:   rP   ÚlogÚfinalr^   s        r6   Ú_stream_logs_and_check_statusra   6  så   € à×!Ñ!¨¯©¸3¿9¹9¿>¹>ÐRVÐ!ÓWò ˆÜ�‰��ðð ×Ñ C§F¡F°c·i±i·n±nÐÓE€EØ‡|�|×ÑœX×/Ñ/Ò/Ø16·±×1EÒ1E�B�u—|‘|×+Ñ+Ð,Ñ-È2ˆÜ˜˜eŸh™h˜ZÐ'=¸e¿l¹l×>PÑ>PÐ=QÐQRÐSZÐR[Ð\Ó]Ð]Ü‡H�Hˆt�E—H‘H�:˜ZÐ(Õ)r8   ÚrunÚignore_unknown_optionsT)zFhf jobs run --name hello-world python:3.12 python -c 'print("Hello!")'z1hf jobs run --detach python:3.12 python script.pyz3hf jobs run -e FOO=foo python:3.12 python script.pyz;hf jobs run --secrets HF_TOKEN python:3.12 python script.pyz^hf jobs run -v hf://org/my-model:/data -v hf://buckets/org/b:/mnt python:3.12 python script.py)Úcontext_settingsÚexamplesÚimageÚcommandÚenvÚsecretsrX   ÚlabelrL   Úenv_fileÚsecrets_fileÚflavorÚtimeoutÚdetachÚexposeÚsshÚtokenc                 óà  — t        ||«      }t        ||«      }t        |¬«      }|j                  | |||t        ||¬«      t	        |||¬«      |	|
|||¬«      }t        j                  d|j                  |j                  ¬«       |€:t        j                  d|j                  j                  › d	|j                  › d
�«       t        |j                  j                  t        «      rDdj!                  d„ |j                  j                  D «       «      }t        j                  d|› �«       t        |j                  j"                  t$        «      r:t        j                  d|j                  j                  › d	|j                  › d�«       |r[|j                  j                  › d	|j                  › �}t        j                  d|› d|› d�«       t        j                  d|› d�«       yt'        ||«       y)z
Run a Job.©rr   ©rX   ©r:   r-   )rf   rg   rh   ri   Úlabelsr9   rm   rn   rp   rq   r-   úJob started©rV   ÚurlNú#Name this Job with `hf jobs labels r0   ú --name NAME`.ú
c              3   ó&   K  — | ]	  }d |› �–— Œ y­w©z  N© ©Ú.0rz   s     r6   ú	<genexpr>zjobs_run.<locals>.<genexpr>u  ó   è ø€ ÒF¨˜2˜c˜UœÑFùó   ‚úSExposed ports are reachable at (requires an HF token with read access to the job):
úUse `hf jobs ssh ú&` to open an SSH session into the job.úUse `hf jobs logs -f ú&` to stream logs, or `hf jobs inspect ú` to check status.úUse `hf jobs wait ú` to block until it finishes.)r%   r$   Úrun_jobÚ_parse_labels_maprM   r+   rI   rV   rz   rE   rW   rX   Ú
isinstancer[   Úexpose_urlsÚlistÚjoinÚssh_urlÚstrra   )rf   rg   rh   ri   rX   rj   rL   rk   rl   rm   rn   ro   rp   rq   r-   rr   Úenv_mapÚsecrets_mapr:   rP   ÚurlsÚjob_refs                         r6   Újobs_runrš   B  sœ  € ô< ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ
�+‰+ØØØØÜ  ¨TÔ2Ü+¨F¸ÀyÔQØØØØØð ó €Cô ‡J�Jˆ} §¡¨S¯W©WÕ5Ø€|Ü�‰Ð6°s·y±y·~±~Ð6FÀaÈÏÉÀxÈ~Ð^Ô_Ü�#—*‘*×(Ñ(¬$Ô/Ø�y‰yÑF¨s¯z©z×/EÑ/EÔFÓFˆÜ�‰ÐgÐhlÐgmÐnÔoÜ�#—*‘*×$Ñ$¤cÔ*Ü�‰Ð$ S§Y¡Y§^¡^Ð$4°A°c·f±f°XÐ=cÐdÔeÙØ—Y‘Y—^‘^Ð$ A c§f¡f XÐ.ˆÜ�‰Ð(¨¨	Ð1WÐX_ÐW`Ð`rÐsÔtÜ�‰Ð% g YÐ.KÐLÔMØÜ! # sÕ+r8   Úlogs)zhf jobs logs <job_id>zhf jobs logs -f <job_id>zhf jobs logs --tail 20 <job_id>z#hf jobs logs -f --tail 100 <job_id>)re   rR   z-fz--followzqFollow log output (stream until the job completes). Without this flag, only currently available logs are printed.Útailz-nz--tailzvNumber of lines to show from the end of the logs. When combined with --follow, starts streaming from the last N lines.c                 óê   — t        | |«      \  } }t        |¬«      }|j                  | |||¬«      }|D ]  }t        j                  |«       Œ |r%|r|› d| › �n| }t        j
                  d|› d�«       yy)a­  Fetch the logs of a Job.

    By default, prints currently available logs and exits (non-blocking).
    Use --follow/-f to stream logs in real-time until the job completes.
    Use --tail/-n to limit the number of lines returned (server-side when supported).

    Note: following exits when the log stream ends, regardless of whether the Job
    succeeded or failed. Run `hf jobs inspect <job_id>` to check the final status.
    rt   )r,   r-   rR   rœ   r0   z#Stream ended. Run `hf jobs inspect z6` to check the final status (e.g. COMPLETED or ERROR).N)r7   r$   rU   r+   rY   rE   )	r,   rR   rœ   r-   rr   r:   r›   r_   r™   s	            r6   Ú	jobs_logsrž   �  s‡   € ôN 5°V¸YÓGÑ€FˆIä
˜5Ô
!€CØ×Ñ V°yÈÐVZÐÓ[€DØò ˆÜ�‰��ðáÙ-6�Y�K˜q  Ñ)¸FˆÜ�‰Ð6°w°iÐ?uÐvÕwð r8   Újob_propertiesÚfiltersc                 óÂ   — |D ]Z  \  }}}| j                  |«      }|€|dk(  rŒ  yt        |j                  «       |j                  «       «      }|dk(  r|r	|dk(  sŒW|sŒZ y y)z5Check if scheduled job matches all specified filters.ú!=Fú=T)Úgetr   Úlower)rŸ   r    ÚkeyÚop_strÚpatternÚvalueÚmatchs          r6   Ú_matches_filtersr«   ³  sk   € à 'ò ÑˆˆV�WØ×"Ñ" 3Ó'ˆØˆ=Ø˜Š~ØÙÜ˜Ÿ™› w§}¡}£Ó7ˆØ�cŠM¡%¨V°t«^ÂÙðð r8   Únc                 óF   — d}d}t        | «      D ]  }t        ||¬«       Œ y )Nz[1Az[2K)Úend)ÚrangeÚprint)r¬   ÚLINE_UPÚ
LINE_CLEARÚis       r6   Ú_clear_liner´   Á  s)   € Ø€GØ€JÜ�1‹Xò 'ˆÜˆg˜:Ö&ñ'r8   Úmetrics_streamÚtable_headersc              #   óº  K  — |D �]J  }| |d   › d�t        |d   dz  d«      t        d|d   z  |d   z  d	«      › d�t        |d   «      › d
t        |d   «      › d�t        |d   «      › dt        |d   «      › d�g}|d   r§t        |d   t        «      r”|gdgt	        |«      z  gt	        |d   «      dz
  z  z   }t        |t        |d   «      «      D ]R  \  }}|d   |   }||d   › d�t        d|d   z  |d   z  d	«      › d�t        |d   «      › d
t        |d   «      › d�gz  }ŒT n!|dgt	        |«      t	        |«      z
  z  z  }|g}d| |f–— �ŒM d| g f–— y ­w)NÚcpu_usage_pctú%Úcpu_millicoresg     @�@r   éd   Úmemory_used_bytesÚmemory_total_bytesé   zB / ÚBÚrx_bpszbps / Útx_bpsÚbpsÚgpusrT   ÚutilizationúN/AFT)Úroundr   r�   ÚdictÚlenÚzipÚsorted)r,   rµ   r¶   ÚmetricsÚrowÚrowsÚgpu_idÚgpus           r6   Ú_get_jobs_stats_rowsrÐ   È  sê  è ø€ ð "ó "ˆàØ�Ñ'Ð(¨Ð*Ü�'Ð*Ñ+¨fÑ4°aÓ8Ü�S˜7Ð#6Ñ7Ñ7¸'ÐBVÑ:WÑWÐYZÓ[Ð\Ð\]Ð^Ü˜GÐ$7Ñ8Ó9Ð:¸$¼|ÈGÐThÑLiÓ?jÐ>kÐklÐmÜ˜G HÑ-Ó.Ð/¨v´lÀ7È8ÑCTÓ6UÐ5VÐVYÐZð
ˆð �6Š?œz¨'°&©/¼4Ô@Ø�5˜R˜D¤3 s£8™OÐ,´°G¸F±OÓ0DÀqÑ0HÑIÑIˆDÜ" 4¬°¸±Ó)@ÓAò ‘��VØ˜f‘o fÑ-�ØØ˜=Ñ)Ð*¨!Ð,Ü˜S 3Ð':Ñ#;Ñ;¸cÐBVÑ>WÑWÐYZÓ[Ð\Ð\]Ð^Ü# CÐ(;Ñ$<Ó=Ð>¸dÄ<ÐPSÐThÑPiÓCjÐBkÐklÐmðñ ‘ñð �E�7œc -Ó0´3°s³8Ñ;Ñ<Ñ<ˆCØ�5ˆDØ�V˜TÐ!Ô!ð+"ð, �˜Ð
Óùs   ‚EEÚstatszhf jobs stats <job_id>Újob_idsc           	      óº  — | �+g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }|€|j                  «       d   }| €O|j	                  |¬«      D �cg c]4  }|j
                  r|j
                  j                  nddv r|j                  ‘Œ6 } }t        | «      dk(  rt        j                  d«       yg d	¢}t        j                  j                  t        | «      «      5 }i }	| D ]+  }|g}
|
|d
d D �cg c]  }d|v sd|v rdnd‘Œ c}z  }
|
g|	|<   Œ- t        j                  «       }|	D ��
cg c]  }|	|   D ]  }
|
‘Œ Œ }}}
t        t!        ||¬«      «       | D �cg c]  }||j#                  ||¬«      |dœ‘Œ }}t%        |t&        |¬«      D ]‹  \  }}}|r|	j)                  |d«       n||	|<   t        j                  «       }||z
  t*        k\  sŒBt-        dt        |«      z   «       |	D ��
cg c]  }|	|   D ]  }
|
‘Œ Œ }}}
t        t!        ||¬«      «       |}Œ� 	 ddd«       yc c}w c c}w c c}
}w c c}w c c}
}w # 1 sw Y   yxY w)z7Fetch the resource usage statistics and metrics of JobsNrt   rX   ©r-   ÚUNKNOWN)ÚRUNNINGÚUPDATINGr   zNo running jobs found)	zJOB IDzCPU %zNUM CPUzMEM %z	MEM USAGEzNET I/Oz
GPU UTIL %z	GPU MEM %zGPU MEM USAGEr   r0   ÚUSAGEz-- / --z--)ÚheadersrS   )r,   rµ   r¶   )Úkwargs_listr¾   )r7   rH   r$   ÚwhoamiÚ	list_jobsr[   r\   rV   rÈ   r+   rY   ÚmultiprocessingÚpoolÚ
ThreadPoolÚtimer°   Ú	_tabulateÚfetch_job_metricsÚiflatmap_unorderedrÐ   ÚpopÚSTATS_UPDATE_MIN_INTERVALr´   )rÒ   r-   rr   Ú
parsed_idsr,   r:   rP   r¶   rÞ   Úrows_per_job_idrÌ   ÚheaderÚlast_update_timeÚ
total_rowsrÚ   ÚdonerÍ   Únows                     r6   Ú
jobs_statsrí   ä  s¨  € ð ÐØˆ
Øò 	&ˆFÜ <¸VÀYÓ OÑˆF�IØ×Ñ˜fÕ%ð	&ð ˆÜ
˜5Ô
!€CØÐØ—J‘J“L Ñ(ˆ	Ø€ð —}‘}¨y�}Ó9ö
àØ$'§J¢J�—
‘
× Ò °IÐBYÑYð �F‹Fð
ˆð 
ô
 ˆ7ƒ|�qÒÜ�‰Ð(Ô)Øò
€Mô 
×	Ñ	×	(Ñ	(¬¨W«Ó	6ð '¸$Ø<>ˆØò 	,ˆFØ$* 8ˆCØÐ^kÐlmÐlnÐ^oÖpÐTZ #¨¡-°7¸fÑ3D‘IÈ4ÑOÒpÑpˆCØ'* eˆO˜FÒ#ð	,ô  Ÿ9™9›;ÐØ(7×[˜fÀ?ÐSYÑCZÒ[¸C’cÐ[�cÐ[ˆ
Ñ[ô 	Œi˜
¨MÔ:Ô;ð "ö
ð ð	 !Ø"%×"7Ñ"7¸vÐQZÐ"7Ó"[Ø!.óð
ˆð 
ô #5°TÔ;OÐ]hÔ"iò 
	'ÑˆD�&˜$ÙØ×#Ñ# F¨DÕ1à*.� Ñ'Ü—)‘)“+ˆCØÐ%Ñ%Ô)BÓBÜ˜A¤ J£Ñ/Ô0Ø0?×c fÈ?Ð[aÑKbÒcÀCšcÐc˜cÐc�
ÑcÜ”i 
°MÔBÔCØ#&Ñ ñ
	'÷)'ð 'ùò'
ùò. qùó \ùò

ùó  d÷9'ð 'úsO   Á%9H6Ã0IÄH;
Ä&IÄ<I ÅIÅ,IÆ
AIÇ IÇ<I
ÈIÈ;IÉIzlist | ls | ps)z
hf jobs lszhf jobs ls -az&hf jobs ls --status running,schedulingz+hf jobs ls --label env=prod --label team=mlz%hf jobs ls --all --label hf-sandbox=1Úallz-az--allzWShow all Jobs (default shows running and scheduling). Cannot be combined with --status.r[   z--statuszfOnly show Jobs with the given status. Comma-separated or repeated, e.g. `--status running,scheduling`.)rO   rN   z{Only show Jobs with the given `key=value` label. Repeat to require several labels, e.g. `--label env=prod --label team=ml`.Úlimitz--limitzCMaximum number of Jobs to display. Set to 0 to show all (no limit).Úfilterz--filterz2(Deprecated) Use `--status` and `--label` instead.c                 óØ  — t        |¬«      }|rt        j                  d|› d�«       | r|rt        d«      ‚g }|xs g D ])  }	|j	                  d„ |	j                  d«      D «       «       Œ+ |r|}
n9| rd}
n4t        j                  j                  t        j                  j                  g}
i }|xs g D ].  }d|vrt        d	|› d
�«      ‚|j                  d«      \  }}	|	||<   Œ0 |j                  ||
|xs d¬«      }d}|dkD  r8t        t        j                  ||dz   «      «      }t        |«      |kD  rd}|d| }nt        |«      }g }|D �]  }t        |«      }|j!                  d«      xs i }|j!                  d«      xs g }|j!                  dd«      |d<   |j!                  d«      xs d|d<   |rdj#                  |«      nd|d<   |j!                  d«      r|d   dd j%                  dd«      nd|d<   |j!                  d«      xs i j!                  dd«      |d<   t'        |j!                  d «      «      |d!<   |j)                  |«       �Œ t        j*                  |g d"¢d¬#«       |rt        j,                  d$|› d%�«       |sg|s|rJd&j#                  g d'„ |D «       ¢d(„ |j/                  «       D «       ¢«      }t        j0                  d)|› �«       y| st        j,                  d*«       yyy)+z½List Jobs.

    Use `--status` to filter by status (see [`JobStage`] for possible values) and `--label` to filter by `key=value`
    labels. A Job must match every filter to be listed.
    rt   zIgnoring filter 'zc'. `-f`/`--filter` is deprecated and will be removed in a future release. Use `--status`/`--label`.z0`-a`/`--all` cannot be combined with `--status`.c              3   ó^   K  — | ]%  }|j                  «       sŒ|j                  «       –— Œ' y ­w©N)Ústrip)r‚   Úparts     r6   rƒ   zjobs_ps.<locals>.<genexpr>q  s   è ø€ ÒV¨TÈÏÉÍ˜DŸJ™JŸLÑVùs   ‚-˜-ú,Nr£   zInvalid label filter 'z"': must be in the form 'key=value')r-   r[   rw   Fr   r   TÚ	durationsrg   rV   rT   r,   Údocker_imagerÅ   úimage/spacer>   Ú
created_até   ÚTÚcreatedr[   r\   rÕ   Úrunning_secsÚruntime)r,   rù   rg   rý   r[   rÿ   ©rÙ   Úid_keyzOutput truncated to z4 Jobs. Use `--limit 0` to show all (or `--limit N`).ú, c              3   ó&   K  — | ]	  }d |› �–— Œ y­w)zstatus=Nr€   )r‚   Úss     r6   rƒ   zjobs_ps.<locals>.<genexpr>§  s   è ø€ Ò7 Q�W˜Q˜C”=Ñ7ùr…   c              3   ó2   K  — | ]  \  }}d |› d|› �–— Œ y­w)zlabel=r£   Nr€   )r‚   ÚkÚvs      r6   rƒ   zjobs_ps.<locals>.<genexpr>§  s$   è ø€ Ò:gÑPTÐPQÐST¸VÀAÀ3ÀaÈÀsÔ;KÑ:gùó   ‚zNo jobs matched filters: zHNo running jobs. Use `-a`/`--all` to include finished (and failed) jobs.)r$   r+   Úwarningr   rA   r3   r   rÖ   r©   Ú
SCHEDULINGrÜ   r’   Ú	itertoolsÚislicerÈ   r*   r¤   r“   Úreplacer   rH   ÚtablerE   ÚitemsrY   )rî   r[   rj   rï   r-   rr   rð   r:   Úraw_statusesr©   Úserver_statusesrw   Úitemr¦   Ú	jobs_iterÚ	truncatedÚjobsÚ	job_itemsrP   Újob_itemr÷   ÚcmdÚfilters_msgs                          r6   Újobs_psr  )  s  € ôt ˜5Ô
!€CáÜ�‰Ø ˜xð (pð pô	
ñ
 ‰vÜÐIÓJÐJð !€LØ’˜2ò WˆØ×ÑÑV°U·[±[ÀÓ5EÔVÕVðWñ Ø&‰Ù	Ø‰ä#×+Ñ+×1Ñ1´8×3FÑ3F×3LÑ3LÐMˆð  €FØ’˜ò ˆØ�d‰?ÜÐ3°D°6Ð9[Ð\Ó]Ð]Ø—Z‘Z “_‰
ˆˆUØˆˆsŠð	ð —‘¨	¸/ÐRXÒR`Ð\`�Óa€Ið €IØˆq‚yÜ”I×$Ñ$ Y°¸±	Ó:Ó;ˆÜˆt‹9�uÒØˆIØ˜˜�<‰Dä�I‹ˆð ')€IØó 
#ˆÜ% cÓ*ˆØ—L‘L Ó-Ò3°ˆ	Ø�l‰l˜9Ó%Ò+¨ˆØ%Ÿ\™\¨$°Ó3ˆ�ÑØ"*§,¡,¨~Ó">Ò"GÀ%ˆ�ÑÙ/2˜cŸh™h sœm¸ˆ�ÑØOWÏ|É|Ð\hÔOi˜h |Ñ4°S°bÐ9×AÑAÀ#ÀsÔKÐotˆ�ÑØ&Ÿl™l¨8Ó4Ò:¸×?Ñ?ÀÈÓSˆ�ÑÜ-¨i¯m©m¸NÓ.KÓLˆ�ÑØ×Ñ˜Ö"ð
#ô ‡I�IØÚTØõñ
 Ü�‰Ð'¨ wÐ.bÐcÔdÙÙ™6ØŸ)™)ØhÑ7¨,Ô7ÐhÑ:gÐX^×XdÑXdÓXfÔ:gÐhóˆKô �H‰HÐ0°°Ð>Õ?ÙÜ�H‰HÐ_Õ`ð ð r8   Úhardwarezhf jobs hardwarec                  ó^  — t        «       } | j                  «       }g }|D ]â  }d}|j                  rG|j                  j                  › d|j                  j                  › d|j                  j
                  › d�}|j                  rd|j                  d›�nd}|j                  rd|j                  dz  d	›�nd}|j                  |j                  |j                  |j                  |j                  |j                  |||d
œ«       Œä t        j                  |«       t        j                  d«       y)z(List available hardware options for JobsrT   zx ú (ú)ú$z.4fÚfreeé<   z.2f)rX   zpretty nameÚcpuÚramÚstorageÚacceleratorzcost/minz	cost/hourzLUse `hf jobs run --flavor <name> ...` to request a specific hardware flavor.N)r$   Úlist_jobs_hardwarer%  ÚquantityÚmodelÚvramÚunit_cost_usdrH   rX   Úpretty_namer"  r#  Úephemeral_storager+   r  rE   )r:   Úhardware_listr  ÚhwÚaccelerator_infoÚcost_minÚ	cost_hours          r6   Újobs_hardwarer2  ®  s  € ô ‹,€CØ×*Ñ*Ó,€MØ€EØò 
ˆØÐØ�>Š>Ø"$§.¡.×"9Ñ"9Ð!:¸"¸R¿^¹^×=QÑ=QÐ<RÐRTÐUW×UcÑUc×UhÑUhÐTiÐijÐkÐØ13×1AÒ1A�Q�r×'Ñ'¨Ð,Ñ-ÀvˆØ79×7GÒ7G�a˜×(Ñ(¨2Ñ-¨cÐ2Ñ3ÈVˆ	Ø�‰àŸ™Ø!Ÿ~™~Ø—v‘vØ—v‘vØ×/Ñ/Ø/Ø$Ø&ñ	õ	
ð
ô$ ‡I�IˆeÔÜ‡H�HÐ[Õ\r8   Úinspectzhf jobs inspect <job_id>z*Job IDs to inspect (or 'namespace/job_id')c                 ó  — g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }| D �cg c]  }|j                  ||¬«      ‘Œ }}t	        j
                  |D �cg c]  }t        |«      ‘Œ c}«       yc c}w c c}w )z0Display detailed information on one or more Jobsrt   rS   N)r7   rH   r$   Úinspect_jobr+   r  r*   )rÒ   r-   rr   ræ   r,   r:   r  rP   s           r6   Újobs_inspectr6  Ê  sŽ   € ð €JØò "ˆÜ8¸ÀÓKÑˆ�	Ø×Ñ˜&Õ!ð"ð €GÜ
˜5Ô
!€CØNUÖVÀFˆC�O‰O 6°YˆOÕ?ÐV€DÐVÜ‡I�I°$Ö7¨3Ô! #Õ&Ò7Õ8ùò WùÚ7ó   ¼BÁ+B
Úcancelzhf jobs cancel <job_id>c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)zCancel a Jobrt   rS   zJob cancelled©rV   N)r7   r$   Ú
cancel_jobr+   rI   )r,   r-   rr   r:   s       r6   Újobs_cancelr<  à  s=   € ô 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ‡N�N˜&¨I€NÔ6Ü‡J�Jˆ 6Ö*r8   Úwait)zhf jobs wait <job_id>z"hf jobs wait <job_id_1> <job_id_2>z"hf jobs ls -q | xargs hf jobs waitz,Job IDs to wait for (or 'namespace/job_id').zTMax time to wait: int with s (seconds, default), m (minutes), h (hours) or d (days).c           
      ó*  — g }t        «       }| D ]3  }t        ||«      \  }}|j                  |«       |j                  |«       Œ5 t	        |«      dkD  r3t        ddj                  d„ t        |t        ¬«      D «       «      z   «      ‚|j                  «       }|�t        |«      nd}	t        |¬«      }
t        j                  dt	        |«      › d	�«      }	 |
j                  ||	|¬
«      }|j!                  t	        |«      › d�«       t        j"                  |D �cg c]C  }|j$                  t        |j                  j&                  «      |j                  j(                  dœ‘ŒE c}«       |D �cg c],  }|j                  j&                  t*        j,                  k7  sŒ+|‘Œ. }}|r<t        t	        |«      › dt	        |«      › d�dj                  d„ |D «       «      z   «      ‚y# t        $ r" |j!                  d«       t        d|› d�«      d‚w xY wc c}w c c}w )a  Wait for one or more Jobs to reach a terminal state.

    Blocks until every Job has finished, then exits with code 0 if all Jobs completed
    successfully, or a non-zero exit code if any Job was canceled, errored or deleted.

    All Jobs must belong to the same namespace.
    r   z0All Job IDs must be in the same namespace, got: r  c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wró   )r•   )r‚   Únss     r6   rƒ   zjobs_wait.<locals>.<genexpr>  s   è ø€ ÒF Bœ˜BŸÑFùr  )r¦   Nrt   zWaiting for z Job(s) to finish...)rn   r-   z
Timed out.zTimed out after z waiting for Job(s) to finish.z Job(s) finished.)rV   r\   r^   z of z' Job(s) did not complete successfully: c              3   óh   K  — | ]*  }|j                   › d |j                  j                  › d�–— Œ, y­w)r  r  N)rV   r[   r\   )r‚   rP   s     r6   rƒ   zjobs_wait.<locals>.<genexpr>(  s,   è ø€ ÒK¸S˜3Ÿ6™6˜( " S§Z¡Z×%5Ñ%5Ð$6°aÔ8ÑKùs   ‚02)Úsetr7   rH   ÚaddrÈ   r   r“   rÊ   r•   rä   r   r$   r+   r[   rZ   ÚTimeoutErrorrë   r  rV   r\   r^   r   r]   )rÒ   rn   r-   rr   ræ   Ú
namespacesr,   Ú	parsed_idÚparsed_namespaceÚtimeout_secsr:   r[   r  rP   Úfaileds                  r6   Ú	jobs_waitrJ  í  só  € ð> €JÜ“€JØò )ˆÜ&BÀ6È9Ó&UÑ#ˆ	Ð#Ø×Ñ˜)Ô$Ø�‰Ð'Õ(ð)ô ˆ:ƒ˜ÒÜØ>Ø�i‰iÑF¬&°ÄÔ*EÔFÓFñGó
ð 	
ð —‘Ó €IØ.5Ð.A”> 'Ô*Àt€Lä
˜5Ô
!€CÜ�Z‰Z˜,¤s¨:£Ð&7Ð7KÐLÓM€Fð]Ø×Ñ 
°LÈIÐÓVˆð ‡K�K”3�t“9�+Ð.Ð/Ô0ä‡I�IÐhlÖmÐad�c—f‘f¤s¨3¯:©:×+;Ñ+;Ó'<ÈÏÉ×I[ÑI[Ó\ÒmÔnØ!ÖL�c S§Z¡Z×%5Ñ%5¼×9KÑ9KÓ%KŠcÐL€FÐLÙÜÜ�6‹{ˆm˜4¤ D£	˜{Ð*QÐRØ�i‰iÑKÀFÔKÓKñLó
ð 	
ð øô ò ]Ø�‰�LÔ!ÜÐ)¨'¨Ð2PÐQÓRÐX\Ð\ð]üò
 nùÚLs   ÃG ÄAHÅ+,HÆHÇ+Hrw   )z*hf jobs labels <job_id> --name training-v2z8hf jobs labels <job_id> --label env=prod --label team=mlzhf jobs labels <job_id> --clearÚclearz--clearzRemove all labels from the job.c                 óf  — |s|€|st        d«      ‚|s|�|rt        d«      ‚t        | |«      \  } }t        |¬«      }|�,|s*|j                  | |¬«      j                  xs i }i |¥d|i¥}nt        ||¬«      xs i }|j                  | ||¬«      }	t        j                  d	|	j                  ¬
«       y)zfUpdate labels on a Job. Passing --label replaces all existing labels; passing --name alone keeps them.NúePlease set a name with --name or at least one label with --label. To remove all labels, pass --clear.úlCannot set a name or labels and clear them at the same time. Please use --name/--label or --clear, not both.rt   rS   rX   ru   )r,   rw   r-   úLabels updatedr:  )
r   r7   r$   r5  rw   r�   Úupdate_job_labelsr+   rI   rV   )
r,   rX   rj   rK  r-   rr   r:   Úcurrent_labelsrw   rP   s
             r6   Újobs_labelsrR  ,  sÈ   € ñ" �T�\©%ÜØsó
ð 	
ñ 	�Ð!¡uÜØzó
ð 	
ô 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØÐ¡àŸ™°À)˜ÓL×SÑSÒYÐWYˆØ1�NÐ1 F¨DÑ1‰ä" 5¨tÔ4Ò:¸ˆØ
×
Ñ
 v°fÈ	Ð
Ó
R€CÜ‡J�JÐ C§F¡FÖ+r8   )zhf jobs ssh <job_id>zhf jobs ssh <job_id> --dry-runz)hf jobs ssh <job_id> -i ~/.ssh/id_ed25519Úidentity_fileÚdry_runc                 óê  — t        | |«      \  } }t        |¬«      }|j                  | |¬«      }|j                  j                  €t        d«      ‚|j                  j                  t        v r0t        d|j                  › d|j                  j                  › d�«      ‚|j                  j                  t        j                  k7  ràt        j                  d|j                  › d	|j                  j                  › d
�«      }|j                  |j                  |t        j                  g¬«      }|j                  j                  t        j                  k7  rA|j                  d«       t        d|j                  › d|j                  j                  › d�«      ‚|j                  d«       t        |j                  j                  «      }t        |j                   › d|j"                  › �|j$                  ||¬«       y)a   SSH into a running Job.

    If the Job is not yet running, waits until it reaches the RUNNING state before
    connecting. Requires the Job to be started with SSH enabled (`hf jobs run --ssh ...`)
    and your SSH public key to be registered at https://huggingface.co/settings/keys.
    rt   rS   Nz[SSH is not enabled on this job. Start a job with SSH support using `hf jobs run --ssh ...`.zCannot SSH into job 'z%': job has already finished (stage: 'z').zWaiting for job 'z' to be running (stage: 'z')...)r,   r-   ÚstageszJob finished.z1': job finished before reaching RUNNING (stage: 'zJob is running.ú@)ÚportrS  rT  )r7   r$   r5  r[   r”   r   r\   r   rV   r   rÖ   r+   rZ   rë   r   r#   ÚusernameÚhostnamerX  )	r,   rS  rT  r-   rr   r:   rP   r[   r”   s	            r6   Újobs_sshr[  Q  s¨  € ô* 5°V¸YÓGÑ€FˆIÜ
˜5Ô
!€CØ
�/‰/ °9ˆ/Ó
=€CØ
‡z�z×ÑÐ!ÜÐtÓuÐuØ
‡z�z×ÑÔ.Ñ.ÜÐ.¨s¯v©v¨hÐ6[Ð\_×\fÑ\f×\lÑ\lÐ[mÐmpÐqÓrÐrØ
‡z�z×Ñœ8×+Ñ+Ò+Ü—‘Ð/°·±¨xÐ7PÐQT×Q[ÑQ[×QaÑQaÐPbÐbgÐhÓiˆØ×Ñ c§f¡f¸	Ì8×K[ÑK[ÐJ\ÐÓ]ˆØ�:‰:×Ñœx×/Ñ/Ò/Ø�K‰K˜Ô(ÜØ'¨¯© xÐ/`Ðad×akÑak×aqÑaqÐ`rÐruÐvóð ð 	�‰Ð%Ô&Ü�s—z‘z×)Ñ)Ó*€GÜØ×ÑÐ
˜A˜g×.Ñ.Ð/Ð0Ø�\‰\Ø#Øö	r8   zFRun UV scripts (Python with inline dependencies) on HF infrastructure.Úuvru   )z,hf jobs uv run --name my-script my_script.pyz$hf jobs uv run --detach my_script.pyz1hf jobs uv run ml_training.py --flavor a10g-smallz+hf jobs uv run --with transformers train.pyzNhf jobs uv run -v hf://org/my-model:/data -v hf://buckets/org/b:/mnt script.pyÚscriptÚscript_argsÚwith_Úpythonc                 óî  — t        ||	«      }t        ||
«      }t        |¬«      }|j                  | |xs g |||||t        ||¬«      t	        |||¬«      |||||¬«      }t        j                  d|j                  |j                  ¬«       |€:t        j                  d|j                  j                  › d	|j                  › d
�«       t        |j                  j                  t        «      rDdj!                  d„ |j                  j                  D «       «      }t        j                  d|› �«       t        |j                  j"                  t$        «      r:t        j                  d|j                  j                  › d	|j                  › d�«       |r[|j                  j                  › d	|j                  › �}t        j                  d|› d|› d�«       t        j                  d|› d�«       yt'        ||«       y)ú8Run a UV script (local file or URL) on HF infrastructurert   ru   rv   )r]  r^  Údependenciesr`  rf   rh   ri   rw   r9   rm   rn   rp   rq   r-   rx   ry   Nr{   r0   r|   r}   c              3   ó&   K  — | ]	  }d |› �–— Œ y­wr   r€   r�   s     r6   rƒ   zjobs_uv_run.<locals>.<genexpr>¼  r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   )r%   r$   Ú
run_uv_jobr�   rM   r+   rI   rV   rz   rE   rW   rX   r�   r[   r‘   r’   r“   r”   r•   ra   )r]  r^  rf   rm   rh   ri   rX   rj   rL   rk   rl   rn   ro   rp   rq   r-   rr   r_  r`  r–   r—   r:   rP   r˜   r™   s                            r6   Újobs_uv_runrf  ƒ  s«  € ôB ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ
�.‰.ØØÒ% 2ØØØØØÜ  ¨TÔ2Ü+¨F¸ÀyÔQØØØØØð ó €Cô  ‡J�Jˆ} §¡¨S¯W©WÕ5Ø€|Ü�‰Ð6°s·y±y·~±~Ð6FÀaÈÏÉÀxÈ~Ð^Ô_Ü�#—*‘*×(Ñ(¬$Ô/Ø�y‰yÑF¨s¯z©z×/EÑ/EÔFÓFˆÜ�‰ÐgÐhlÐgmÐnÔoÜ�#—*‘*×$Ñ$¤cÔ*Ü�‰Ð$ S§Y¡Y§^¡^Ð$4°A°c·f±f°XÐ=cÐdÔeÙØ—Y‘Y—^‘^Ð$ A c§f¡f XÐ.ˆÜ�‰Ð(¨¨	Ð1WÐX_ÐW`Ð`rÐsÔtÜ�‰Ð% g YÐ.KÐLÔMØÜ! # sÕ+r8   z,Create and manage scheduled Jobs on the Hub.Ú	scheduledzRhf jobs scheduled run "0 0 * * *" --name daily-script python:3.12 python script.pyÚscheduleÚsuspendÚconcurrencyc                 óä  — t        ||
«      }t        ||«      }t        |¬«      }|j                  ||| ||||t        ||¬«      t	        |	||¬«      ||||¬«      }t        j                  d|j                  ¬«       |€:t        j                  d|j                  j                  › d	|j                  › d
�«       t        j                  d|j                  j                  › d	|j                  › d�«       y)zSchedule a Job.rt   ru   rv   )rf   rg   rh  ri  rj  rh   ri   rw   r9   rm   rn   rp   r-   úScheduled Job createdr:  Nú7Name this scheduled Job with `hf jobs scheduled labels r0   r|   úUse `hf jobs scheduled inspect ú` to view its details.)r%   r$   Úcreate_scheduled_jobr�   rM   r+   rI   rV   rE   rW   rX   )rh  rf   rg   ri  rj  rh   ri   rX   rj   rL   rk   rl   rm   rn   rp   r-   rr   r–   r—   r:   Úscheduled_jobs                        r6   Úscheduled_runrr  Ì  sý   € ô2 ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ×,Ñ,ØØØØØØØÜ  ¨TÔ2Ü+¨F¸ÀyÔQØØØØð -ó €Mô ‡J�JÐ&¨=×+;Ñ+;Õ<Ø€|Ü�‰ØEÀm×FYÑFY×F^ÑF^ÐE_Ð_`Ðan×aqÑaqÐ`rð  sAð  Bô	
ô ‡H�HÐ.¨}×/BÑ/B×/GÑ/GÐ.HÈÈ-×JZÑJZÐI[Ð[qÐrÕsr8   zhf jobs scheduled lsz1Show all scheduled Jobs (default hides suspended)z>Filter output based on conditions provided (format: key=value)c                 óä  — t        |¬«      }|j                  |¬«      }g }|xs g D ]€  }d|v ra|j                  dd«      \  }}	|j                  d«      rd}
|dd }nd}
|j	                  |j                  «       |
|	j                  «       f«       Œht        j                  d	|› d
�«       Œ‚ g }|D ]˜  }|j                  xs d}| s|rŒ|j                  j                  xs d}|j                  j                  xs g }|rdj                  |«      nd}|j                  |t        |«      |dœ}t        ||«      sŒˆ|j	                  |«       Œš g }|D �]  }t!        |«      }|j#                  d«      xs i }|j#                  d«      xs i }|j#                  d«      }|j#                  d«      xs g }|j#                  d«      xs d|d<   |rdj                  |«      nd|d<   |r)|j#                  d«      r|d   dd j%                  dd«      nd|d<   |j#                  d«      r|d   dd j%                  dd«      nd|d<   |j#                  d«      xs d|d<   |j	                  |«       �Œ t        j&                  |g d¢d¬«       |s2|r0dj                  d „ |D «       «      }t        j(                  d!|› �«       |r;|d"   d   }t        j*                  d#|› d$�«       t        j*                  d%|› d&�«       yy)'zList scheduled Jobsrt   rÔ   r£   r   ú!r¢   Néÿÿÿÿz Ignoring invalid filter format 'z'. Use key=value format.FrÅ   r>   )rV   rf   ri  rg   Újob_specr[   Úlast_jobrg   rø   rù   Úatrû   rü   Úlast_runÚnext_job_run_atÚnext_runri  )rV   rh  rù   rg   ry  r{  ri  rV   r   r  c              3   ó4   K  — | ]  \  }}}|› |› |› �–— Œ y ­wró   r€   )r‚   r  Úor  s       r6   rƒ   zscheduled_ps.<locals>.<genexpr>K  s"   è ø€ ÒD±°°A°q 1 # a S¨¨¤ÑDùs   ‚z#No scheduled jobs matched filters: r   rn  z(` to view details about a scheduled job.zUse `hf jobs scheduled trigger z)` to trigger a scheduled job immediately.)r$   Úlist_scheduled_jobsr3   ÚendswithrH   r¥   r+   r	  ri  rv  rø   rg   r“   rV   r•   r«   r*   r¤   r  r  rY   rE   )rî   r-   rr   rð   r:   Úscheduled_jobsr    Úfr¦   r©   ÚopÚfiltered_jobsrq  ri  Úimage_or_spacer  Úcommand_strÚpropsr  Úsjr  rv  Ústatus_dictrw  r  Úfirst_item_ids                             r6   Úscheduled_psrŠ     sú  € ô, ˜5Ô
!€CØ×,Ñ,°yÐ,ÓA€NØ*,€GØŠ\�rò XˆØ�!‰8ØŸ™  a›‰JˆC�à�|‰|˜CÔ Ø�Ø˜#˜2�h‘à�Ø�N‰N˜CŸI™I›K¨¨U¯[©[«]Ð;Õ<ä�K‰KÐ:¸1¸#Ð=UÐVÕWðXð €MØ'ò 
,ˆØ×'Ñ'Ò0¨5ˆÙ‘wØØ&×/Ñ/×<Ñ<ÒEÀˆØ×$Ñ$×,Ñ,Ò2°ˆÙ'*�c—h‘h˜s”m°ˆØ$×'Ñ'°.ÌSÐQXË\ÐfqÑrˆÜ  wÔ/ØØ×Ñ˜]Õ+ð
,ð #%€EØó ˆÜ! "Ó%ˆØ—8‘8˜JÓ'Ò-¨2ˆØ—h‘h˜xÓ(Ò.¨BˆØ—?‘? :Ó.ˆØ�l‰l˜9Ó%Ò+¨ˆØ&Ÿl™l¨>Ó:ÒC¸eˆˆ]ÑÙ+.˜#Ÿ(™( 3œ-°EˆˆY‰ÙDLÐQY×Q]ÑQ]Ð^bÔQc˜8 D™>¨#¨2Ð.×6Ñ6°s¸CÔ@ÐinˆˆZÑàEPÇ_Á_ÐUfÔEgˆKÐ)Ñ*¨3¨BÐ/×7Ñ7¸¸SÔAÐmrð 	ˆZÑð Ÿ(™( 9Ó-Ò6°ˆˆY‰Ø�‰�TÖðô ‡I�IØÚ_Øõñ
 ‘WØ—i‘iÑD¸GÔDÓDˆÜ�‰Ð6°{°mÐDÔEÙØ˜a™ ™ˆÜ�‰Ð2°=°/ÐAiÐjÔkÜ�‰Ð2°=°/ÐAjÐkÕlð r8   zhf jobs scheduled inspect <id>Úscheduled_job_idsz>Scheduled Job IDs to inspect (or 'namespace/scheduled_job_id')c                 ó  — g }| D ]"  }t        ||«      \  }}|j                  |«       Œ$ |} t        |¬«      }| D �cg c]  }|j                  ||¬«      ‘Œ }}t	        j
                  |D �cg c]  }t        |«      ‘Œ c}«       yc c}w c c}w )z:Display detailed information on one or more scheduled Jobsrt   ©Úscheduled_job_idr-   N)r7   rH   r$   Úinspect_scheduled_jobr+   r  r*   )	r‹  r-   rr   ræ   r,   r:   rŽ  r€  rq  s	            r6   Úscheduled_inspectr�  S  s£   € ð €JØ#ò "ˆÜ8¸ÀÓKÑˆ�	Ø×Ñ˜&Õ!ð"ð #ÐÜ
˜5Ô
!€Cð !2öàð 	×!Ñ!Ð3CÈyÐ!ÕYð€Nð ô ‡I�IÀnÖU°]Ô! -Õ0ÒUÕVùò	ùò Vr7  Údeletezhf jobs scheduled delete <id>rŽ  c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)zDelete a scheduled Job.rt   r�  zScheduled Job deletedr:  N)r7   r$   Údelete_scheduled_jobr+   rI   ©rŽ  r-   rr   r:   s       r6   Úscheduled_deleter•  l  óF   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ×ÑÐ.>È)ÐÔTÜ‡J�JÐ&Ð+;Ö<r8   zhf jobs scheduled suspend <id>c                 óÀ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       t        j
                  d| › d�«       y)z Suspend (pause) a scheduled Job.rt   r�  zScheduled Job suspendedr:  zUse `hf jobs scheduled resume z` to resume it.N)r7   r$   Úsuspend_scheduled_jobr+   rI   rE   r”  s       r6   Úscheduled_suspendr™  y  s^   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ×ÑÐ/?È9ÐÔUÜ‡J�JÐ(Ð-=Õ>Ü‡H�HÐ-Ð.>Ð-?¸ÐOÕPr8   Úresumezhf jobs scheduled resume <id>c                 óŽ   — t        | |«      \  } }t        |¬«      }|j                  | |¬«       t        j                  d| ¬«       y)z!Resume (unpause) a scheduled Job.rt   r�  zScheduled Job resumedr:  N)r7   r$   Úresume_scheduled_jobr+   rI   r”  s       r6   Úscheduled_resumer�  ‡  r–  r8   Útriggerzhf jobs scheduled trigger <id>c                 ó,  — t        | |«      \  } }t        |¬«      }|j                  | |¬«      }t        j                  d|j
                  |j                  ¬«       t        j                  d|j                  j                  › d|j
                  › d�«       y)	zJTrigger a scheduled Job to run immediately (does not change the schedule).rt   r�  zScheduled Job triggeredry   r‰   r0   z` to stream logs.N)
r7   r$   Útrigger_scheduled_jobr+   rI   rV   rz   rE   rW   rX   )rŽ  r-   rr   r:   rP   s        r6   Úscheduled_triggerr¡  ”  s|   € ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØ
×
#Ñ
#Ð5EÐQZÐ
#Ó
[€CÜ‡J�JÐ(¨S¯V©V¸¿¹ÕAÜ‡H�HÐ$ S§Y¡Y§^¡^Ð$4°A°c·f±f°XÐ=NÐOÕPr8   )z1hf jobs scheduled labels <id> --name daily-scriptz>hf jobs scheduled labels <id> --label env=prod --label team=mlz%hf jobs scheduled labels <id> --clearz)Remove all labels from the scheduled job.c                 óz  — |s|€|st        d«      ‚|s|�|rt        d«      ‚t        | |«      \  } }t        |¬«      }|�6|s4|j                  | |¬«      j                  j
                  xs i }i |¥d|i¥}nt        ||¬«      xs i }|j                  | ||¬«      }	t        j                  d	|	j                  ¬
«       y)zpUpdate labels on a scheduled Job. Passing --label replaces all existing labels; passing --name alone keeps them.NrM  rN  rt   r�  rX   ru   )rŽ  rw   r-   rO  r:  )r   r7   r$   r�  rv  rw   r�   Úupdate_scheduled_job_labelsr+   rI   rV   )
rŽ  rX   rj   rK  r-   rr   r:   rQ  rw   rq  s
             r6   Úscheduled_labelsr¤  ¢  sæ   € ñ" �T�\©%ÜØsó
ð 	
ñ 	�Ð!¡uÜØzó
ð 	
ô #?Ð?OÐQZÓ"[ÑÐ�iÜ
˜5Ô
!€CØÐ¡ð ×%Ñ%Ð7GÐS\Ð%Ó]×fÑf×mÑmÒsÐqsð 	ð 2�NÐ1 F¨DÑ1‰ä" 5¨tÔ4Ò:¸ˆØ×3Ñ3Ø)°&ÀIð 4ó €Mô ‡J�JÐ M×$4Ñ$4Ö5r8   z)Schedule UV scripts on HF infrastructure.zBhf jobs scheduled uv run "0 0 * * *" --name daily-script script.pyz<hf jobs scheduled uv run "0 0 * * *" script.py --with pandasc                 óò  — t        ||«      }t        ||«      }t        |¬«      }|j                  ||xs g | |||||||t        |
|	¬«      t	        |||¬«      ||||¬«      }t        j                  d|j                  ¬«       |	€:t        j                  d|j                  j                  › d	|j                  › d
�«       t        j                  d|j                  j                  › d	|j                  › d�«       y)rb  rt   ru   rv   )r]  r^  rh  ri  rj  rc  r`  rf   rh   ri   rw   r9   rm   rn   rp   r-   rl  r:  Nrm  r0   r|   rn  ro  )r%   r$   Úcreate_scheduled_uv_jobr�   rM   r+   rI   rV   rE   rW   rX   )rh  r]  r^  ri  rj  rf   rm   rh   ri   rX   rj   rL   rk   rl   rn   rp   r-   rr   r_  r`  r–   r—   r:   rP   s                           r6   Úscheduled_uv_runr§  Ï  só   € ô> ˜C Ó*€GÜ ¨Ó6€Kä
˜5Ô
!€CØ
×
%Ñ
%ØØÒ% 2ØØØØØØØØÜ  ¨TÔ2Ü+¨F¸ÀyÔQØØØØð! &ó €Cô$ ‡J�JÐ&¨3¯6©6Õ2Ø€|Ü�‰ÐJÈ3Ï9É9Ï>É>ÐJZÐZ[Ð\_×\bÑ\bÐ[cÐcqÐrÔsÜ‡H�HÐ.¨s¯y©y¯~©~Ð.>¸aÀÇÁ¸xÐG]Ð^Õ_r8   c                óš   — | s|€yi }| xs g D ]$  }d|v r|j                  dd«      n|df\  }}|||<   Œ& |�d|v rt        d«      ‚||d<   |S )a  Parse label key-value pairs from CLI arguments.

    Args:
        labels: List of label strings in KEY=VALUE format. If KEY only, then VALUE is set to empty string.

    Returns:
        Dictionary mapping label keys to values, or None if no labels or name provided.
    Nr£   r   rT   rX   z4--name and --label name=... cannot both be provided.)r3   r   )rw   rX   Ú
labels_mapÚ	label_varr¦   r©   s         r6   r�   r�     s}   € ñ �d�lØØ!#€JØ’\˜rò  ˆ	Ø03°yÑ0@�Y—_‘_ S¨!Ô,ÀyÐRTÀo‰
ˆˆUØˆ
�3Šð ð ÐØ�ZÑÜÐQÓRÐRØ!ˆ
�6ÑØÐr8   rÍ   rÙ   c           
      óô  — t        g | ¢|‘­Ž D �cg c]  }t        d„ |D «       «      ‘Œ }}t        t        j                  «       j                  t        |«      dz  «      }t        |«      t        |«      z   |kD  r|j                  t        |«      «      }||xx   dz  cc<   t        |«      t        |«      z   |k  r#|t        |«      z
  t        |«      z
  ||   z   ||<   t        |«      t        |«      z   |kD  rŒ dt        |«      z  j                  |Ž }g }|j                   |j                  |Ž «       |j                   |j                  |D �cg c]  }d|z  ‘Œ	 c}Ž «       | D ]r  }	t        |	|«      D �
�cg c];  \  }
}t        t        |
«      «      |kD  rt        |
«      d|dz
   dz   n
t        |
«      ‘Œ= }}
}|j                   |j                  |Ž «       Œt d	j                  |«      S c c}w c c}w c c}}
w )
z‰
    Inspired by:

    - stackoverflow.com/a/8356620/593036
    - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data
    c              3   óD   K  — | ]  }t        t        |«      «      –— Œ y ­wró   )rÈ   r•   )r‚   Úxs     r6   rƒ   z_tabulate.<locals>.<genexpr>*  s   è ø€ Ò/ a”cœ#˜a›&—kÑ/ùs   ‚ é   r¾   z{{:{}}} ú-Né   z...r}   )rÉ   ÚmaxÚshutilÚget_terminal_sizeÚcolumnsrÈ   ÚsumÚindexÚformatrH   r•   r“   )rÍ   rÙ   ÚcolÚ
col_widthsÚterminal_widthÚcol_to_minimizeÚ
row_formatÚlinesÚwrÌ   r­  Ú	col_widthÚrow_format_argss                r6   rá   rá   #  sê  € ô <?Ð;NÀÐ;NÀgÒ;NÖO°C”#Ñ/¨3Ô/Õ/ÐO€JÐOÜœ×1Ñ1Ó3×;Ñ;¼SÀ»\ÈBÑ=NÓO€NÜ
ˆg‹,œ˜Z›Ñ
(¨>Ò
9Ø$×*Ñ*¬3¨z«?Ó;ˆØ�?Ó#¨Ñ)Ó#Üˆw‹<œ#˜j›/Ñ)¨^Ò;Ø*8¼3¸z»?Ñ*JÌSÐQXË\Ñ*YÐ\fÐgvÑ\wÑ*wˆJ�Ñ'ô	 ˆg‹,œ˜Z›Ñ
(¨>Ó
9ð
 4�*œs 7›|Ñ+×3Ñ3°ZÐ@€JØ€EØ	‡L�LÐ"�×"Ñ" GÐ,Ô-Ø	‡L�LÐ"�×"Ñ"°jÖ$A° S¨1£WÒ$AÐBÔCØò :ˆô !$ C¨Ó 4÷
á��9ô 03´3°q³6«{¸YÒ/FŒC�‹F�?�Y ‘]Ð# eÒ+ÌCÐPQËFÑRð
ˆñ 
ð 	�‰Ð&�Z×&Ñ&¨Ð8Õ9ð:ð �9‰9�UÓÐùò# Pùò %Bùó
s   �G*ÅG/Å6A G4rü   ÚqueueÚfunc.Úkwargsc                 ó@   —  |di |¤ŽD ]  }| j                  |«       Œ y )Nr€   )Úput)rÁ  rÂ  rÃ  rI   s       r6   Ú_write_generator_to_queuerÆ  A  s#   € Ù‘.˜‘.ò ˆØ�	‰	�&Õñr8   rÞ   rÚ   c          	   #   ó6  K  — t        «       }|D �cg c]  }| j                  t        |||f«      ‘Œ }}	 	 	 |j                  d¬«      –— Œc c}w # t        $ r' t        d„ |D «       «      r|j                  «       rY nY Œ5w xY wn# t        $ r Y nw xY w	 |D �cg c]  }|j                  d¬«      ‘Œ nc c}w c} y# t        j                  $ r Y yw xY w# 	 |D �cg c]  }|j                  d¬«      ‘Œ nc c}w c} w # t        j                  $ r Y w w xY wxY w­w)a;  
    Takes a function that returns an iterable of items, and run it in parallel using threads to return the flattened iterable of items as they arrive.

    This is inspired by those three `map()` variants, and is the mix of all three:

    * `imap()`: like `map()` but returns an iterable instead of a list of results
    * `imap_unordered()`: like `imap()` but the output is sorted by time of arrival
    * `flatmap()`: like `map()` but given a function which returns a list, `flatmap()` returns the flattened list that is the concatenation of all the output lists
    gš™™™™™©?)rn   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wró   )Úready)r‚   Úasync_results     r6   rƒ   z%iflatmap_unordered.<locals>.<genexpr>\  s   è ø€ ÒN°�|×)Ñ)×+ÑNùs   ‚N)
r   Úapply_asyncrÆ  r¤   r   rî   ÚemptyÚKeyboardInterruptrÝ   rD  )rÞ   rÂ  rÚ   rÁ  rÃ  Úasync_resultsrÊ  s          r6   rã   rã   F  s  è ø€ ô “g€EØfqÖrÐ\b�T×%Ñ%Ô&?À%ÈÈvÐAVÕWÐr€MÐrðØðØ—i‘i¨�iÓ-Ò-ð ùò søô
 ò ÜÑNÀÔNÔNÐSX×S^ÑS^ÔS`ÙùðúàøÜò Ùðúð	Ø@MÖN°ˆ\×Ñ dÐÕ+ÑNùÖNøÜ×+Ñ+ò 	Ùð	ûð	Ø@MÖN°ˆ\×Ñ dÐÕ+ÑNùÖNøÜ×+Ñ+ò 	Ùð	ÿsÇ   ‚D‘ A±D´B ¶A Á
B ÁDÁ+B Á;B Á?B Â B ÂC Â	BÂC ÂBÂC ÂB; ÂB2Â1	B; Â:DÂ;CÃDÃCÃDÃDÃC=ÃC4Ã3	C=Ã<DÃ=DÄDÄDÄDÄD)NNNNNNNNNFNFNN)FNNN)NNN)FNNr»   NNN)r.   N)NN)NNFNN)NFNN)NNNNNNNNNNNFNFNNNN)NNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNN)„Ú__doc__r  rÝ   Úmultiprocessing.poolr²  rà   Úcollections.abcr   r   r   Úpathlibr   rÁ  r   r   Útypingr	   r
   r   Úurllib.parser   Úhuggingface_hubr   r   r   r   r   r   Úhuggingface_hub._jobs_apir   Úhuggingface_hub.errorsr   Úhuggingface_hub.utilsr   Ú$huggingface_hub.utils._cache_managerr   Úhuggingface_hub.utils._hf_urisr   Úhuggingface_hub.utils._parsingr   r   Ú
_cli_utilsr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Ú
_frameworkr(   r)   Ú_outputr*   r+   Ú
get_loggerÚ__name__Úloggerr•   Útupler7   r’   rM   rå   ÚImageArgÚImageOptÚ	FlavorOptÚ	LabelsOptÚNameOptÚ
TimeoutOptÚboolÚ	DetachOptÚNamespaceOptÚintÚ	ExposeOptÚSshEnabledOptÚWithOptÚ	PythonOptÚ
SuspendOptÚConcurrencyOptÚScheduleArgÚ	ScriptArgÚScriptArgsArgÚ
CommandArgÚJobIdArgÚ	JobIdsArgÚScheduledJobIdArgÚJobVolumesOptÚjobs_clira   rg   rš   rž   rÇ   r«   r´   rÐ   rí   r  r2  r6  r<  rJ  rR  r[  Úuv_appÚ	add_grouprf  Úscheduled_apprr  rŠ  r�  r•  r™  r�  r¡  r¤  Úscheduled_uv_appr§  r�   rá   rü   rÆ  rÞ   rß   rã   r€   r8   r6   ú<module>r      s<  ðñ Gã Û Û Û Û ß .Ý Ý ß ß *Ñ *Ý !ç T× TÝ 9Ý +Ý )Ý =Ý 7ß J÷÷ ÷ õ ÷ )ß ,ð 
ˆ×	Ñ	˜HÓ	%€ð.¨ð .¸¸t¹ð .ÈÈcÐSVÐY]ÑS]ÈoÑH^ó .ð8)Ø�#‰Y˜Ñð)Ø',ð)Ø9<¸t¹ð)à	ˆ&�\�DÑó)ðX  Ð ð ØÙØ'ôðñ€ð Øˆ$�JÙ
Ø=ôðñ€ð Øˆ$�JÙ
ØrÙ˜kÓ*ôðñ€	ð Øˆ�I�ÑÙ
ØØØBôðñ€	ð Øˆ$�JÙ
ØØXôðñ€ð Øˆ$�JÙ
Ø_ôðñ€
ð ØÙ
ØØØBôðñ€	ð Øˆ$�JÙ
Øeôðñ€ð Øˆ�I�ÑÙ
Øð Gôðñ€	ð ØÙ
Øð pôðñ€ð Øˆ�I�ÑÙ
ØØ4ôðñ€ð Øˆ$�JÙ
ØØØDôðñ€	ð Øˆ4�KÙ
Ø0ôðñ€
ð Øˆ4�KÙ
ØGôðñ€ð ØÙØfôðñ€ð ØÙØ3ôðñ€	ð Øˆ�I�ÑÙØ'ôðñ€ð Øˆ�IÙØ"ôðñ€
ð ØÙØ-ôðñ€ð Øˆ�I�ÑÙØ.ôðñ€	ð ØÙØAôðñÐ ð Øˆ�I�ÑÙ
ØØðeô	ð
ñ€ñ Ð?Ô@€ð	* uð 	*°7ð 	*¸tó 	*ð 
×ÑØ	Ø.°Ð5òð ó 
ð ØØØØ ØØ#'ØØØØØØ"Øñ!1,Øð1,àð1,ð 
ð1,ð ð	1,ð
 ð1,ð ð1,ð ð1,ð ð1,ð !ð1,ð ð1,ð ð1,ð ð1,ð ð1,ð 
ð1,ð ð1,ð  ð!1,ð" 
ò#1,ó
ð1,ðh 
×ÑØ
òð ó ð$ 	ð 	Ø"Øñ'&xØð&xàØÙØØð Eô	
ð	ñð&xð Øˆd‰
ÙØØð Jô	
ð	ñð&xð$ ð%&xð& ð'&xð( 
ò)&xóð&xðR T¨#¨s¨(¡^ð ¸dÀ5ÈÈcÐSVÈÑCWÑ>Xð Ð]aó ð'�3ð '˜4ó 'ðØðØ!)¨$¨s°C¨x©.Ñ!9ðØJNÈsÉ)ðàˆe�D˜#˜t D¨¨s©¡OÑ4Ð4Ñ5Ñ6óð8 
×Ñ�'Ð%=Ð$>ÐÓ?àØ"ØñA'ØðA'àðA'ð ðA'ð 
ò	A'ó @ðA'ðH 
×ÑØòð ó 	ð$ 	ð 	ð 	ð 	Ø"Øð 	ñSxaØ	ØÙØØØjô	
ð	ñ
ðxað ØˆS‰	�DÑÙØÙ! (Ó+Øyô	
ð	ñðxað" ØˆS‰	�DÑÙØØð Oô	
ð	ñð#xað2 ØÙØØVô	
ð	ñð3xað@ ðAxaðB ðCxaðD ØˆS‰	�DÑÙØØØEô	
ð	ñðExaðT 
òUxaó	ðxaðv 
×Ñ�*Ð(:Ð';ÐÓ<ò]ó =ð]ð6 
×Ñ�)Ð'AÐ&BÐÓCð #Øñ9ØØˆS‰	ÙØ=ô	
ð	ñð9ð ð9ð ð9ð 
ò9ó Dð9ð* 
×Ñ�(Ð&?Ð%@ÐÓAð #Øñ	+Øð	+àð	+ð ð	+ð 
ò		+ó Bð	+ð 
×ÑØ
òð ó ð( 	Ø"Øñ4
ØØˆS‰	ÙØ?ô	
ð	ñð4
ð Øˆd‰
ÙØgô	
ð	ñð4
ð ð4
ð ð4
ð 
ò4
óð4
ðn 
×ÑØòð ó ð ØØX]Ø"Øñ,Øð,à
ð,ð ð,ð �T™6 )Ð2SÔTÐTÑUð	,ð
 ð,ð ð,ð 
ò,óð,ð: 
×ÑØ	òð ó ð )-Ø!Ø"Øñ#Øð#à%ð#ð ð#ð ð	#ð
 ð#ð 
ò#óð#ñL 
ÐdÔ	e€Ø × Ñ �6 Ð Ô %ð ‡�Ø	Ø.°Ð5òð ó 
ð "&ØØØØØØØ ØØ#'ØØØØØ"ØØØñ'7,Øð7,àð7,ð ð7,ð ð	7,ð
 
ð7,ð ð7,ð ð7,ð ð7,ð ð7,ð ð7,ð !ð7,ð ð7,ð ð7,ð ð7,ð 
ð7,ð  ð!7,ð" ð#7,ð$ ð%7,ð& ð'7,ð( 
ò)7,ó
ð7,ñt Ð#QÔR€Ø × Ñ �= {Ð Ô 3ð ×ÑØ	Ø.°Ð5ØbÐcð ó ð Ø"&ØØØØØ ØØ#'ØØØØ"Øñ#,tØð,tàð,tð ð,tð ð	,tð
  ð,tð 
ð,tð ð,tð ð,tð ð,tð ð,tð ð,tð !ð,tð ð,tð ð,tð ð,tð  ð!,tð" ð#,tð$ 
ò%,tóð
,tð^ ×ÑÐ'Ð3IÐ2JÐÓKð 	Ø"Øð 	ñ%OmØ	ØÙØØØDô	
ð	ñ
ðOmð ðOmð ðOmð ØˆS‰	�DÑÙØØØQô	
ð	ñðOmð& 
ò'Omó LðOmðd ×Ñ�yÐ,LÐ+MÐÓNð #ØñWØ ØˆS‰	ÙØQô	
ð	ñðWð ðWð ðWð 
òWó OðWð0 ×Ñ�xÐ+JÐ*KÐÓLð #Øñ	=Ø'ð	=àð	=ð ð	=ð 
ò		=ó Mð	=ð ×Ñ�yÐ,LÐ+MÐÓNð #Øñ
QØ'ð
Qàð
Qð ð
Qð 
ò	
Qó Oð
Qð ×Ñ�xÐ+JÐ*KÐÓLð #Øñ	=Ø'ð	=àð	=ð ð	=ð 
ò		=ó Mð	=ð ×Ñ�yÐ,LÐ+MÐÓNð #Øñ
QØ'ð
Qàð
Qð ð
Qð 
ò	
Qó Oð
Qð ×ÑØòð ó ð ØØbgØ"Øñ6Ø'ð6à
ð6ð ð6ð �T™6 )Ð2]Ô^Ð^Ñ_ð	6ð
 ð6ð ð6ð 
ò6óð6ñB !Ð&QÔRÐ Ø × Ñ Ð(¨tÐ Ô 4ð ×ÑØ	Ø.°Ð5àLØFðð ó ð "&ØØ"&ØØØØØØØ ØØ#'ØØØ"ØØØñ)0`Øð0`àð0`ð ð0`ð ð	0`ð
  ð0`ð ð0`ð ð0`ð 
ð0`ð ð0`ð ð0`ð ð0`ð ð0`ð ð0`ð !ð0`ð ð0`ð  ð!0`ð" ð#0`ð$ ð%0`ð& ð'0`ð( ð)0`ð* 
ò+0`óð0`ðl GKò ˜d 3™i¨$Ñ.ð ¸¸t¹ð ÈtÐTWÐY\ÐT\É~Ð`dÑOdó ð,�D˜˜c C™i™Ñ)ð °D¸±Ið À#ó ñ6 ˆCƒL€ð U¨1¡Xð °X¸cÀ8ÈAÁ;Ð>NÑ5Oð ÐY]ð Ðbfó ð
Ø
×
Ò
×
)Ò
)ðà
�3˜ ™Ð#Ñ
$ðð �d‘ð	ð
 ˆa�[ôr8   