Ë
    þÍ:j*C  ã                   ó6  — d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlZd dlmZmZmZmZ ddlmZ  e
d«      Zej*                  fded	ed
ededef
d„Zddej0                  dedededej0                  f
d„Z G d„ d«      Zdedefd„Z G d„ d«      Zy)é    N©ÚFraction)ÚAnyÚCallableÚcastÚOptionalÚTypeVarÚUnion)Ú_probe_video_from_fileÚ_read_video_from_fileÚ
read_videoÚread_video_timestampsé   )ÚtqdmÚTÚptsÚtimebase_fromÚtimebase_toÚ
round_funcÚreturnc                 ó6   — t        | d«      |z  |z  } ||«      S )zèconvert pts between different time bases
    Args:
        pts: presentation timestamp, float
        timebase_from: original timebase. Fraction
        timebase_to: new timebase. Fraction
        round_func: rounding function.
    r   r   )r   r   r   r   Únew_ptss        úu/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchvision/datasets/video_utils.pyÚpts_convertr      s%   € ô �s˜AÓ Ñ.°Ñ<€GÙ�gÓÐó    ÚtensorÚsizeÚstepÚdilationc                 ó(  — | j                  «       dk7  rt        d| j                  «       › �«      ‚| j                  d«      }| j                  «       }||z  ||z  f}|||dz
  z  dz   z
  |z  dz   |f}|d   dk  rd|f}t	        j
                  | ||«      S )a   
    similar to tensor.unfold, but with the dilation
    and specialized for 1d tensors

    Returns all consecutive windows of `size` elements, with
    `step` between windows. The distance between each element
    in a window is given by `dilation`.
    r   z*tensor should have 1 dimension instead of r   )ÚdimÚ
ValueErrorÚstrideÚnumelÚtorchÚ
as_strided)r   r   r   r   Úo_strider$   Ú
new_strideÚnew_sizes           r   Úunfoldr*      s§   € ð ‡z�zƒ|�qÒÜÐEÀfÇjÁjÃlÀ^ÐTÓUÐUØ�}‰}˜QÓ€HØ�L‰L‹N€EØ˜‘/ 8¨hÑ#6Ð7€JØ˜( d¨Q¡hÑ/°!Ñ3Ñ4¸Ñ=ÀÑAÀ4ÐH€HØ��{�Q‚Ø�t�9ˆÜ×Ñ˜F H¨jÓ9Ð9r   c                   óX   — e Zd ZdZdee   ddfd„Zdefd„Zdede	ee   e
e   f   fd„Zy)	Ú_VideoTimestampsDatasetzÚ
    Dataset used to parallelize the reading of the timestamps
    of a list of videos, given their paths in the filesystem.

    Used in VideoClips and defined at top level, so it can be
    pickled when forking.
    Úvideo_pathsr   Nc                 ó   — || _         y ©N)r-   )Úselfr-   s     r   Ú__init__z _VideoTimestampsDataset.__init__8   s
   € Ø&ˆÕr   c                 ó,   — t        | j                  «      S r/   ©Úlenr-   ©r0   s    r   Ú__len__z_VideoTimestampsDataset.__len__;   ó   € Ü�4×#Ñ#Ó$Ð$r   Úidxc                 ó2   — t        | j                  |   «      S r/   )r   r-   )r0   r8   s     r   Ú__getitem__z#_VideoTimestampsDataset.__getitem__>   s   € Ü$ T×%5Ñ%5°cÑ%:Ó;Ð;r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚlistÚstrr1   Úintr6   Útupler   Úfloatr:   © r   r   r,   r,   /   sO   „ ñð' D¨¡Ið '°$ó 'ð%˜ó %ð<˜sð < u¨T°#©Y¸À¹Ð-GÑ'Hô <r   r,   Úxc                 ó   — | S )zH
    Dummy collate function to be used with _VideoTimestampsDataset
    rD   )rE   s    r   Ú_collate_fnrG   B   s	   € ð €Hr   c                   óŒ  — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 d*dee   dededee   dee	ee
f      ded	ed
ededededededdfd„Zd+d„Zde	ee
f   ddfd„Zede	ee
f   fd„«       Zdee   dd fd„Ze	 d,dej&                  dededee   dee   deej&                  eee   ej&                  f   f   fd„«       Zd,dededee   ddfd„Zdefd„Zdefd„Zdefd „Zd!edeeef   fd"„Zeded#ed$edeeej&                  f   fd%„«       Zd!edeej&                  ej&                  e	ee
f   ef   fd&„Zde	ee
f   fd'„Zd(e	ee
f   ddfd)„Z y)-Ú
VideoClipsaE  
    Given a list of video files, computes all consecutive subvideos of size
    `clip_length_in_frames`, where the distance between each subvideo in the
    same video is defined by `frames_between_clips`.
    If `frame_rate` is specified, it will also resample all the videos to have
    the same frame rate, and the clips will refer to this frame rate.

    Creating this instance the first time is time-consuming, as it needs to
    decode all the videos in `video_paths`. It is recommended that you
    cache the results after instantiation of the class.

    Recreating the clips for different clip lengths is fast, and can be done
    with the `compute_clips` method.

    Args:
        video_paths (List[str]): paths to the video files
        clip_length_in_frames (int): size of a clip in number of frames
        frames_between_clips (int): step (in frames) between each clip
        frame_rate (float, optional): if specified, it will resample the video
            so that it has `frame_rate`, and then the clips will be defined
            on the resampled video
        num_workers (int): how many subprocesses to use for data loading.
            0 means that the data will be loaded in the main process. (default: 0)
        output_format (str): The format of the output video tensors. Can be either "THWC" (default) or "TCHW".
    Nr-   Úclip_length_in_framesÚframes_between_clipsÚ
frame_rateÚ_precomputed_metadataÚnum_workersÚ_video_widthÚ_video_heightÚ_video_min_dimensionÚ_video_max_dimensionÚ_audio_samplesÚ_audio_channelsÚoutput_formatr   c                 óF  — || _         || _        || _        || _        |	| _        |
| _        || _        || _        |j                  «       | _	        | j                  dvrt        d|› d�«      ‚|€| j                  «        n| j                  |«       | j                  |||«       y )N)ÚTHWCÚTCHWz5output_format should be either 'THWC' or 'TCHW', got ú.)r-   rN   rO   rP   rQ   rR   rS   rT   ÚupperrU   r"   Ú_compute_frame_ptsÚ_init_from_metadataÚcompute_clips)r0   r-   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   s                 r   r1   zVideoClips.__init__d   s³   € ð" 'ˆÔØ&ˆÔð )ˆÔØ*ˆÔØ$8ˆÔ!Ø$8ˆÔ!Ø,ˆÔØ.ˆÔØ*×0Ñ0Ó2ˆÔØ×ÑÐ%5Ñ5ÜÐTÐUbÐTcÐcdÐeÓfÐfà Ð(Ø×#Ñ#Õ%à×$Ñ$Ð%:Ô;Ø×ÑÐ0Ð2FÈ
ÕSr   c           	      ó6  — g | _         g | _        dd l}|j                  j                  j                  t        | j                  «      d| j                  t        ¬«      }t        t        |«      ¬«      5 }|D ]ˆ  }|j                  d«       t        t        |Ž «      \  }}|D �cg c]   } |j                  ||j                   ¬«      ‘Œ" }}| j                   j#                  |«       | j                  j#                  |«       ŒŠ 	 d d d «       y c c}w # 1 sw Y   y xY w)Nr   é   )Ú
batch_sizerN   Ú
collate_fn)Útotalr   ©Údtype)Ú	video_ptsÚ	video_fpsÚtorch.utils.dataÚutilsÚdataÚ
DataLoaderr,   r-   rN   rG   r   r4   Úupdater?   ÚzipÚ	as_tensorÚlongÚextend)r0   r%   ÚdlÚpbarÚbatchÚ	batch_ptsÚ	batch_fpsr   s           r   r[   zVideoClips._compute_frame_pts‰   sû   € ØˆŒØ&(ˆŒó 	 à*/¯+©+×*:Ñ*:×*EÑ*EÜ# D×$4Ñ$4Ó5ØØ×(Ñ(Ü"ð	 +Fó +
ˆô œ˜B›Ô ð 		1 DØò 1�Ø—‘˜A”Ü'+¬C°¨KÓ'8Ñ$�	˜9ð PYÖYÈ˜_˜UŸ_™_¨S¸¿
¹
ÖCÐY�	ÐYØ—‘×%Ñ% iÔ0Ø—‘×%Ñ% iÕ0ñ1÷		1ð 		1ùò Z÷		1ð 		1ús   Á2/DÂ!%D
Ã:DÄ
DÄDÚmetadatac                 óØ   — |d   | _         t        | j                   «      t        |d   «      k(  sJ ‚|d   | _        t        | j                   «      t        |d   «      k(  sJ ‚|d   | _        y )Nr-   re   rf   )r-   r4   re   rf   )r0   ru   s     r   r\   zVideoClips._init_from_metadata£   sm   € Ø# MÑ2ˆÔÜ�4×#Ñ#Ó$¬¨H°[Ñ,AÓ(BÒBÐBÐBØ! +Ñ.ˆŒÜ�4×#Ñ#Ó$¬¨H°[Ñ,AÓ(BÒBÐBÐBØ! +Ñ.ˆ�r   c                 óN   — | j                   | j                  | j                  dœ}|S )N©r-   re   rf   rx   )r0   Ú	_metadatas     r   ru   zVideoClips.metadataª   s*   € ð  ×+Ñ+ØŸ™ØŸ™ñ
ˆ	ð
 Ðr   Úindicesc                 óì  — |D �cg c]  }| j                   |   ‘Œ }}|D �cg c]  }| j                  |   ‘Œ }}|D �cg c]  }| j                  |   ‘Œ }}|||dœ} t        | «      || j                  | j
                  | j                  || j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  ¬«      S c c}w c c}w c c}w )Nrx   )rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   )r-   re   rf   ÚtypeÚ
num_framesr   rL   rN   rO   rP   rQ   rR   rS   rT   rU   )r0   rz   Úir-   re   rf   ru   s          r   ÚsubsetzVideoClips.subset³   së   € Ø4;Ö<¨q�t×'Ñ'¨Ó*Ð<ˆÐ<Ø07Ö8¨1�T—^‘^ AÓ&Ð8ˆ	Ð8Ø07Ö8¨1�T—^‘^ AÓ&Ð8ˆ	Ð8à&Ø"Ø"ñ
ˆð
 Œt�D‹zØØ"&§/¡/Ø!%§¡Ø—‘Ø"*Ø×(Ñ(Ø×*Ñ*Ø×,Ñ,Ø!%×!:Ñ!:Ø!%×!:Ñ!:Ø×.Ñ.Ø ×0Ñ0Ø×,Ñ,ô
ð 	
ùò =ùÚ8ùÚ8s   …C'¡C,½C1re   r}   r   Úfpsc                 óp  — |€d}|€|}t        | «      |z  |z  }t        j                  t        t	        j
                  |«      «      ||«      }| |   } t        | ||«      }|j                  «       st        j                  d«       t        |t        «      r|gt        |«      z  }||fS t        |||«      }||fS )Nr   z¥There aren't enough frames in the current video to get a clip for the given clip length and frames between clips. The video (and potentially others) will be skipped.)r4   rI   Ú_resample_video_idxrA   ÚmathÚfloorr*   r$   ÚwarningsÚwarnÚ
isinstanceÚslice)	re   r}   r   r€   rL   Útotal_framesÚ_idxsÚclipsÚidxss	            r   Úcompute_clips_for_videoz"VideoClips.compute_clips_for_videoÌ   sÆ   € ð ˆ;ð ˆCØÐØˆJÜ˜9“~¨
Ñ2°SÑ8ˆÜ×.Ñ.¬s´4·:±:¸lÓ3KÓ/LÈcÐS]Ó^ˆØ˜eÑ$ˆ	Ü�y *¨dÓ3ˆØ�{‰{Œ}Ü�M‰Mð\ôô
 �eœUÔ#Ø�7œS ›ZÑ'ˆDð �dˆ{Ðô ˜% ¨TÓ2ˆDØ�dˆ{Ðr   c                 óô  — || _         || _        || _        g | _        g | _        t        | j                  | j                  «      D ]S  \  }}| j                  |||||«      \  }}| j                  j                  |«       | j                  j                  |«       ŒU t        j                  | j                  D �cg c]  }t        |«      ‘Œ c}«      }	|	j                  d«      j                  «       | _        yc c}w )a„  
        Compute all consecutive sequences of clips from video_pts.
        Always returns clips of size `num_frames`, meaning that the
        last few frames in a video can potentially be dropped.

        Args:
            num_frames (int): number of frames for the clip
            step (int): distance between two clips
            frame_rate (int, optional): The frame rate
        r   N)r}   r   rL   r‹   Úresampling_idxsrl   re   rf   r�   Úappendr%   rm   r4   ÚcumsumÚtolistÚcumulative_sizes)
r0   r}   r   rL   re   r€   r‹   rŒ   ÚvÚclip_lengthss
             r   r]   zVideoClips.compute_clipsæ   sÓ   € ð %ˆŒØˆŒ	Ø$ˆŒØˆŒ
Ø!ˆÔÜ! $§.¡.°$·.±.ÓAò 	.‰NˆI�sØ×6Ñ6°yÀ*ÈdÐTWÐYcÓd‰KˆE�4Ø�J‰J×Ñ˜eÔ$Ø× Ñ ×'Ñ'¨Õ-ð	.ô —‘¸¿
¹
Ö'C°1¬¨A­Ò'CÓDˆØ ,× 3Ñ 3°AÓ 6× =Ñ =Ó ?ˆÕùò (Ds   Â7C5c                 ó"   — | j                  «       S r/   )Ú	num_clipsr5   s    r   r6   zVideoClips.__len__ý   s   € Ø�~‰~ÓÐr   c                 ó,   — t        | j                  «      S r/   r3   r5   s    r   Ú
num_videoszVideoClips.num_videos   r7   r   c                 ó    — | j                   d   S )zJ
        Number of subclips that are available in the video list.
        éÿÿÿÿ)r“   r5   s    r   r—   zVideoClips.num_clips  s   € ð ×$Ñ$ RÑ(Ð(r   r8   c                 óŠ   — t        j                  | j                  |«      }|dk(  r|}||fS || j                  |dz
     z
  }||fS )zw
        Converts a flattened representation of the indices into a video_idx, clip_idx
        representation.
        r   r   )ÚbisectÚbisect_rightr“   )r0   r8   Ú	video_idxÚclip_idxs       r   Úget_clip_locationzVideoClips.get_clip_location	  s[   € ô
 ×'Ñ'¨×(=Ñ(=¸sÓCˆ	Ø˜Š>ØˆHð ˜(Ð"Ð"ð ˜T×2Ñ2°9¸q±=ÑAÑAˆHØ˜(Ð"Ð"r   Úoriginal_fpsÚnew_fpsc                 ó
  — ||z  }|j                  «       rt        |«      }t        d d |«      S t        j                  | t        j
                  ¬«      |z  }|j                  «       j                  t        j                  «      }|S )Nrc   )	Ú
is_integerrA   rˆ   r%   ÚarangeÚfloat32r„   ÚtoÚint64)r}   r¢   r£   r   rŒ   s        r   r‚   zVideoClips._resample_video_idx  sf   € à˜gÑ%ˆØ�?‰?Ôô �t“9ˆDÜ˜˜t TÓ*Ð*Ü�|‰|˜J¬e¯m©mÔ<¸tÑCˆØ�z‰z‹|�‰œuŸ{™{Ó+ˆØˆr   c                 óò  — || j                  «       k\  r t        d|› d| j                  «       › d�«      ‚| j                  |«      \  }}| j                  |   }| j                  |   |   }ddlm}  |«       }|dk(  r‚| j                  dk7  rt        d«      ‚| j                  dk7  rt        d«      ‚| j                  dk7  rt        d	«      ‚| j                  dk7  rt        d
«      ‚| j                  dk7  rt        d«      ‚|dk(  r9|d   j                  «       }|d   j                  «       }	t        |||	«      \  }
}}�n‰t        |«      }|j                   }d}t#        t$        |d   j                  «       «      }t#        t$        |d   j                  «       «      }d\  }}t'        dd«      }t'        |j(                  j*                  |j(                  j,                  «      }|j.                  rxt'        |j0                  j*                  |j0                  j,                  «      }t3        |||t4        j6                  «      }t3        |||t4        j8                  «      }|j:                  }t=        || j                  | j                  | j                  | j                  ||f|| j                  | j>                  ||f|¬«      \  }
}}d|i}|�||d<   | j@                  �H| jB                  |   |   }tE        |tF        jH                  «      r||d   z
  }|
|   }
| j@                  |d<   tK        |
«      | jL                  k(  s J |
jN                  › d| jL                  › �«       ‚| jP                  dk(  r|
jS                  dddd«      }
|
|||fS )a7  
        Gets a subclip from a list of videos.

        Args:
            idx (int): index of the subclip. Must be between 0 and num_clips().

        Returns:
            video (Tensor)
            audio (Tensor)
            info (Dict)
            video_idx (int): index of the video in `video_paths`
        zIndex z out of range (z number of clips)r   )Úget_video_backendÚpyavz.pyav backend doesn't support _video_width != 0z/pyav backend doesn't support _video_height != 0z6pyav backend doesn't support _video_min_dimension != 0z6pyav backend doesn't support _video_max_dimension != 0z0pyav backend doesn't support _audio_samples != 0r›   N)r   r›   r   )
Úvideo_widthÚvideo_heightÚvideo_min_dimensionÚvideo_max_dimensionÚvideo_pts_rangeÚvideo_timebaseÚaudio_samplesÚaudio_channelsÚaudio_pts_rangeÚaudio_timebaserf   Ú	audio_fpsz x rX   é   é   )*r—   Ú
IndexErrorr¡   r-   r‹   Útorchvisionr«   rO   r"   rP   rQ   rR   rS   Úitemr   r   rf   r   rA   r   r²   Ú	numeratorÚdenominatorÚ	has_audior¶   r   rƒ   r„   ÚceilÚaudio_sample_rater   rT   rL   r�   r‡   r%   ÚTensorr4   r}   ÚshaperU   Úpermute)r0   r8   rŸ   r    Ú
video_pathÚclip_ptsr«   ÚbackendÚ	start_ptsÚend_ptsÚvideoÚaudioÚinfoÚ_inforf   r·   Úvideo_start_ptsÚvideo_end_ptsÚaudio_start_ptsÚaudio_end_ptsr¶   r²   Ú_Úresampling_idxs                           r   Úget_clipzVideoClips.get_clip!  sZ  € ð �$—.‘.Ó"Ò"Ü˜v c U¨/¸$¿.¹.Ó:JÐ9KÐK\Ð]Ó^Ð^Ø"×4Ñ4°SÓ9Ñˆ	�8Ø×%Ñ% iÑ0ˆ
Ø—:‘:˜iÑ(¨Ñ2ˆå1á#Ó%ˆà�fÒà× Ñ  AÒ%Ü Ð!QÓRÐRØ×!Ñ! QÒ&Ü Ð!RÓSÐSØ×(Ñ(¨AÒ-Ü Ð!YÓZÐZØ×(Ñ(¨AÒ-Ü Ð!YÓZÐZØ×"Ñ" aÒ'Ü Ð!SÓTÐTà�fÒØ  ™×(Ñ(Ó*ˆIØ˜r‘l×'Ñ'Ó)ˆGÜ!+¨J¸	À7Ó!KÑˆE�5š$ä*¨:Ó6ˆEØŸ™ˆIØˆIä"¤3¨°©×(8Ñ(8Ó(:Ó;ˆOÜ ¤ h¨r¡l×&7Ñ&7Ó&9Ó:ˆMà-2Ñ*ˆO˜]Ü% a¨›^ˆNÜ% e×&:Ñ&:×&DÑ&DÀe×FZÑFZ×FfÑFfÓgˆNØ�ŠÜ!)¨%×*>Ñ*>×*HÑ*HÈ%×J^ÑJ^×JjÑJjÓ!k�Ü"-¨o¸~È~Ô_c×_iÑ_iÓ"j�Ü +¨M¸>È>Ô[_×[dÑ[dÓ e�Ø!×3Ñ3�	Ü3ØØ ×-Ñ-Ø!×/Ñ/Ø$(×$=Ñ$=Ø$(×$=Ñ$=Ø!0°-Ð @Ø-Ø"×1Ñ1Ø#×3Ñ3Ø!0°-Ð @Ø-ô‰OˆE�5˜!ð   Ð+ˆDØÐ$Ø$-��[Ñ!à�?‰?Ð&Ø!×1Ñ1°)Ñ<¸XÑFˆNÜ˜.¬%¯,©,Ô7Ø!/°.ÀÑ2CÑ!C�Ø˜.Ñ)ˆEØ $§¡ˆD�ÑÜ�5‹z˜TŸ_™_Ò,ÐR°·±°¸SÀÇÁÐ@QÐ.RÓRÐ,à×Ñ Ò'à—M‘M ! Q¨¨1Ó-ˆEà�e˜T 9Ð,Ð,r   c                 ó|  — | j                   D �cg c]  }t        |«      ‘Œ }}| j                   D �cg c]!  }|j                  t        j                  «      ‘Œ# }}|r%t        j
                  |«      }|j                  «       }| j                  j                  «       }||d<   ||d<   |d= |d= |d= d|d<   |S c c}w c c}w )NÚvideo_pts_sizesre   r‹   r�   r“   r¹   Ú_version)	re   r4   r¨   r%   r©   ÚcatÚnumpyÚ__dict__Úcopy)r0   r”   rÖ   rE   re   Úds         r   Ú__getstate__zVideoClips.__getstate__y  sÀ   € Ø+/¯>©>Ö: aœ3˜q�6Ð:ˆÐ:ð
 15·±Ö?¨1�Q—T‘Tœ%Ÿ+™+Õ&Ð?ˆ	Ð?áÜŸ	™	 )Ó,ˆIð "Ÿ™Ó)ˆIð �M‰M×ÑÓ ˆØ.ˆÐ
ÑØ"ˆˆ+‰ð ˆgˆJØÐÐ ØÐ Ð!ð ˆˆ*‰Øˆùò3 ;ùò
 @s
   �B4±&B9rÜ   c                 ó"  — d|vr|| _         y t        j                  |d   t        j                  ¬«      }t        j                  ||d   d¬«      }|d= ||d<   || _         | j                  | j                  | j                  | j                  «       y )Nr×   re   rc   rÖ   r   )r!   )	rÚ   r%   rm   r©   Úsplitr]   r}   r   rL   )r0   rÜ   re   s      r   Ú__setstate__zVideoClips.__setstate__•  s{   € à˜QÑØˆDŒMØä—O‘O A k¡N¼%¿+¹+ÔFˆ	Ü—K‘K 	¨1Ð->Ñ+?ÀQÔGˆ	àÐÐ à"ˆˆ+‰ØˆŒà×Ñ˜4Ÿ?™?¨D¯I©I°t·±ÕGr   )r_   r   NNr   r   r   r   r   r   r   rW   )r   Nr/   )!r;   r<   r=   r>   r?   r@   rA   r   rC   Údictr   r1   r[   r\   Úpropertyru   r   Ústaticmethodr%   rÂ   rB   r
   rˆ   r�   r]   r6   r™   r—   r¡   r‚   rÔ   rÝ   rà   rD   r   r   rI   rI   I   sÆ  „ ñð: &(Ø$%Ø&*Ø:>ØØØØ$%Ø$%ØØ Ø#ñ#Tà˜#‘Yð#Tð  #ð#Tð "ð	#Tð
 ˜U‘Oð#Tð  (¨¨S°#¨X©Ñ7ð#Tð ð#Tð ð#Tð ð#Tð "ð#Tð "ð#Tð ð#Tð ð#Tð ð#Tð 
ó#TóJ1ð4/¨D°°c°©Nð /¸tó /ð ð˜$˜s C˜x™.ò ó ðð
˜d 3™ið 
¨Ló 
ð2 àquñØ—<‘<ðØ-0ðØ8;ðØBJÈ5Á/ðØ_gÐhmÑ_nðà	ˆu�|‰|˜U 4¨¡;°·±Ð#<Ñ=Ð=Ñ	>òó ðñ2@¨ð @°3ð @ÀHÈUÁOð @Ð_có @ð. ˜ó  ð%˜Có %ð)˜3ó )ð
# Sð 
#¨U°3¸°8©_ó 
#ð ð	¨ð 	¸5ð 	È5ð 	ÐUZÐ[`Ðbg×bnÑbnÐ[nÑUoò 	ó ð	ðV-˜Cð V- E¨%¯,©,¸¿¹ÀdÈ3ÐPSÈ8ÁnÐVYÐ*YÑ$Zó V-ðp˜d 3¨ 8™nó ð8H˜d 3¨ 8™nð H°ô Hr   rI   )r   )r�   rƒ   r…   Ú	fractionsr   Útypingr   r   r   r   r	   r
   r%   Útorchvision.ior   r   r   r   rh   r   r   r„   rA   r   rÂ   r*   r,   rG   rI   rD   r   r   ú<module>rç      s¾   ðÛ Û Û Ý ß @× @ã ß kÓ kå áˆCƒL€ð bf×akÑakñ 	�Sð 	¨ð 	Àð 	ÐV^ð 	Ðpsó 	ñ:�5—<‘<ð : sð :°#ð :Àð :ÈUÏ\É\ó :÷(<ñ <ð&�1ð ˜ó ÷ZHò ZHr   