Ë
    “0æjº(  ã                  óÌ   — d Z ddlmZ ddlmZmZ ddlZddlm	Z	 dZ
e G d„ d	«      «       Ze G d
„ d«      «       Zdd„Zdd„Z	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 dd„Zy)a  Deterministic timing layer: align original utterances to dubbed speech and flag gaps/lag.

Both tracks share the same video timeline, so no global alignment is needed: a correct dub puts
speech where the original actor speaks. Every decision here is threshold-based and reproducible.
é    )Úannotations)Ú	dataclassÚfieldNé   )Úmaskg{®Gáz„?c                  óÄ   — e Zd ZU dZded<   dZded<   dZded<   dZded	<   dZded
<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   y)Ú
ThresholdsgffffffÖ?ÚfloatÚline_merge_gapç      à?Úmin_lineç      ð?Úmatch_windowç      Ð?Úmissing_coverageÚ
late_startç333333ã?Úearly_startçffffffæ?Úearly_cutoffçš™™™™™é?ÚoverrunÚmid_gapÚunmatched_miné   ÚintÚdrift_windowçš™™™™™Ù?Údriftgš™™™™™ù?Ú
fast_ratioN)Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   r   r   r   r   r   r   r   r    © ó    ú2/root/repos/pocs/video-evals/src/dubeval/timing.pyr	   r	      s…   … à €N�EÓ Ø€HˆeÓØ€L�%ÓØ"Ð�eÓ"Ø€J�ÓØ€K�ÓØ€L�%ÓØ€GˆUÓØ€GˆUÓØ€M�5ÓØ€L�#ÓØ€Eˆ5ÓØ€J�Ôr&   r	   c                  óž   — e Zd ZU ded<   ded<   ded<    ee¬«      Zded<   d	Zded
<   edd„«       Z	edd„«       Z
edd„«       Zedd„«       Zy)ÚLiner   Úindexr
   ÚstartÚend)Údefault_factoryúlist[tuple[float, float]]Údubç        Úcoveragec                ó4   — | j                   | j                  z
  S ©N)r,   r+   ©Úselfs    r'   ÚdurzLine.dur*   s   € à�x‰x˜$Ÿ*™*Ñ$Ð$r&   c                óV   — | j                   rt        d„ | j                   D «       «      S d S )Nc              3  ó&   K  — | ]	  \  }}|–— Œ y ­wr3   r%   )Ú.0ÚsÚ_s      r'   ú	<genexpr>z!Line.dub_start.<locals>.<genexpr>0   ó   è ø€ Ò*™˜˜A”1Ñ*ùó   ‚)r/   Úminr4   s    r'   Ú	dub_startzLine.dub_start.   ó"   € à.2¯hªhŒsÑ* §¡Ô*Ó*Ð@¸DÐ@r&   c                óV   — | j                   rt        d„ | j                   D «       «      S d S )Nc              3  ó&   K  — | ]	  \  }}|–— Œ y ­wr3   r%   )r9   r;   Úes      r'   r<   zLine.dub_end.<locals>.<genexpr>4   r=   r>   )r/   Úmaxr4   s    r'   Údub_endzLine.dub_end2   rA   r&   c                óP   — | j                   sd S | j                  | j                  z
  S r3   )r/   r@   r+   r4   s    r'   Úonsetz
Line.onset6   s    € àŸ8š8ˆtÐD¨¯©¸$¿*¹*Ñ)DÐDr&   N)Úreturnr
   )rI   zfloat | None)r!   r"   r#   r$   r   Úlistr/   r1   Úpropertyr6   r@   rF   rH   r%   r&   r'   r)   r)   "   s   … àƒJØƒLØ	ƒJÙ%*¸4Ô%@€CÐ	"Ó@Ø€HˆeÓàò%ó ð%ð òAó ðAð òAó ðAð òEó ñEr&   r)   c           	     ó`   — t        dt        | d   |d   «      t        | d   |d   «      z
  «      S )Nr0   r   r   )rE   r?   )ÚaÚbs     r'   Ú_overlaprO   ;   s0   € Üˆs”C˜˜!™˜a ™d“O¤c¨!¨A©$°°!±£oÑ5Ó6Ð6r&   c           	     ó  — t        j                  t        j                  dg| j                  t         j                  «      dgg«      «      }t        t        t        j                  |dk(  «      t        j                  |dk(  «      «      «      S )z([start, end) index runs where m is True.r   r   éÿÿÿÿ)ÚnpÚdiffÚconcatenateÚastypeÚint8rJ   ÚzipÚflatnonzero)ÚmÚds     r'   Ú_runsr[   ?   s]   € ä
�‰”—‘   Q§X¡X¬b¯g©gÓ%6¸¸Ð<Ó=Ó>€AÜ””B—N‘N 1¨¡6Ó*¬B¯N©N¸1À¹7Ó,CÓDÓEÐEr&   c           
     óž  — t        | D �cg c]  }|d   |d   z
  |j                  k\  sŒ|‘Œ c}«      D ���cg c]  \  }\  }}t        |||«      ‘Œ }}}}t        |«      D ]  \  }}	||	_        Œ g }
t	        j
                  |D �	cg c]  }	|	j                  ‘Œ c}	«      }|D �]  }d\  }}t	        j                  ||d   dz
  «      }||d D ]°  }	|	j                  |d   |j                  z   kD  r n�t        ||	j                  |	j                  f«      }|dkD  rdn=t        t        |d   |	j                  z
  «      t        |	j                  |d   z
  «      «      }|dkD  r|n| }||j                  k  sŒ¥|�||kD  sŒ­|	|}}Œ² |€|
j                  |«       Œñ|j                  j                  |«       �Œ t        ||t         «      }|D ]u  }	t#        |	j                  t         z  «      t#        t	        j$                  |	j                  t         z  «      «      }}||kD  rt'        ||| j)                  «       «      nd|	_        Œw ||
fS c c}w c c}}}w c c}	w )z]Assign each dub segment to the original line it overlaps most (or the nearest within window).r   r   )Nr0   é   Nr0   )Ú	enumerater   r)   r*   rR   Úarrayr+   Úsearchsortedr   rO   r,   r?   ÚabsÚappendr/   r   ÚHOPr   Úceilr
   Úmeanr1   )Úorigr/   ÚdurationÚtÚxÚir:   rD   ÚlinesÚlnÚ	unmatchedÚstartsÚsegÚbestÚbest_ovÚloÚovÚgapÚscoreÚdmrM   rN   s                         r'   Úalignrw   E   s#  € ô -6À$Ö6d¸QÈ!ÈAÉ$ÐQRÐSTÑQUÉ+ÐYZ×YcÑYcÓJc²qÒ6dÓ,e×fÐf™y˜q¡& 1 aŒT�!�Q˜�]Ðf€EÒfÜ˜5Ó!ò ‰ˆˆ2Øˆ�ðà€IÜ�X‰X¨%Ö0 B�r—x“xÒ0Ó1€FØó !ˆØ!‰ˆˆgÜ�_‰_˜V S¨¡V¨b¡[Ó1ˆØ˜˜�*ò 	*ˆBØ�x‰x˜#˜a™& 1§>¡>Ñ1Ò1ÙÜ˜# §¡¨"¯&©&Ð1Ó2ˆBØ˜aš‘#¤S¬¨S°©V°b·f±f©_Ó)=¼sÀ2Ç8Á8ÈcÐRSÉfÑCTÓ?UÓ%VˆCØ˜qš&‘B s dˆEØ�a—n‘nÓ$¨$¨,¸%À'»/Ø " E�g‘ð	*ð ˆ<Ø×Ñ˜SÕ!à�H‰H�O‰O˜CÖ ð!ô 
ˆc�8œSÓ	!€BØò >ˆÜ�2—8‘8œc‘>Ó"¤C¬¯©°·±¼±Ó(=Ó$>ˆ1ˆØ/0°1ªu”e˜B˜q ˜GŸL™L›NÔ+¸#ˆ�ð>ð �)ÐÐùò1 7eùÔfùò 1s   ŠH>¨H>·IÂI
c                ó"   — | |k\  rdS | |k\  rdS dS )NÚcriticalÚmajorÚminorr%   )Úvaluerz   ry   s      r'   Ú_sevr}   c   s   € Ø (Ò*ˆ:ÐV¸5ÀEº>°ÐVÈwÐVr&   c                ó  ‡$— g Š$t        ||t        «      }t        ||t        «      }dVˆ$fd„	}	| D �]  }
t        |
j                  d«      t        |
j                  d«      |
j
                  €d nt        |
j
                  d«      |
j                  €d nt        |
j                  d«      t        |
j                  d«      dœ}|
j                  |j                  k  rt|
j                  dk\  re |	dt        |
j                  dd«      d|
j                  z
  |
j                  |
j                  d	|
j                  d
›d|
j                  d›d�d|
fi |¤Ž �Œ|
j                  s�Œ'|
j                  }||j                  kD  rV |	dt        |dd«      t        dd|dz  z   «      |
j                  |
j
                  d|d›d�d|d›d�|
fdt        |d«      i|¤Ž ni||j                   k  rY |	dt        | dd«      t        dd| dz  z   «      |
j
                  |
j                  d| d›d�d| d›d�|
fdt        |d«      i|¤Ž |
j                  |
j                  z
  }||j                   kD  rJ |	d t        |dd«      t        dd|d!z  z   «      |
j                  |
j                  d"|d›d#�d$|d›d%�|
fi |¤Ž n¶| |j"                  kD  r¦t%        |t'        |
j                  t        z  «      t'        |
j                  t        z  «       j)                  «       «      } |	d&t        | dd«      t        dd| d!z  z   «      |
j                  |
j                  d'| d›d(�|rd)nd*z   d+| d›d�|
fd,|i|¤Ž t'        t+        |
j                  |
j
                  «      t        z  «      }t'        t        |
j                  |
j                  «      t        z  «      }||kD  s�Œ�t-        |||  ||| z  «      D ]_  \  }}||z
  t        z  }||j.                  k\  sŒ"||z   t        z  } |	d-t        |dd«      t        dd.|d!z  z   «      |||z   |d›d/�d0|
fi |¤Ž Œa �Œ	 |D ];  \  }}||z
  |j0                  k\  sŒ |	d1t        ||z
  d2d3«      d4||||z
  d›d5�d6«       Œ= | D �
cg c]7  }
|
j                  €Œ|
j                  |j                  k\  sŒ*|
|
j                  f‘Œ9 }}
|j2                  }d7}||z   t5        |«      k  �r*t7        t9        j:                  ||||z    D ��cg c]  \  }}|‘Œ	 c}}«      «      }t=        |«      |j>                  k\  �rÂ||z   }|t5        |«      k  rºt=        t7        t9        j:                  |||z
  d8z   |d8z    D ��cg c]  \  }}|‘Œ	 c}}«      «      «      |j>                  k\  rg|d8z  }|t5        |«      k  rTt=        t7        t9        j:                  |||z
  d8z   |d8z    D ��cg c]  \  }}|‘Œ	 c}}«      «      «      |j>                  k\  rŒg||| }t7        t9        j:                  |D ��cg c]  \  }}|‘Œ	 c}}«      «      } |	d9t        t=        |«      d:d«      d;|d7   d7   j                  |d<   d7   j                  d=|d7kD  rd>nd?› d@t=        |«      d›dAt5        |«      › dB�dC| dD›dE|d7   d7   j@                  › dF|d<   d7   j@                  › dG�t        |d«      |D �
�cg c]  \  }
}|
j@                  ‘Œ c}}
¬H«	       |}n|d8z  }||z   t5        |«      k  r�Œ*|�rLg }| D ]¡  }
|
j                  sŒ|D � cg c]3  } |
j
                  | dI   | dJ   z   dz  cxk  r|
j                  k  sŒ/n n| ‘Œ5 }!} |
j                  |
j
                  z
  }"t5        |!«      dk\  sŒv|"dkD  sŒ||jC                  |
tE        dK„ |!D «       «      |"z  f«       Œ£ |r¢t7        t9        j:                  |D ��#cg c]  \  }}#|#‘Œ	 c}#}«      «      }|D ]l  \  }
}#|#||jF                  z  kD  sŒ |	dL|#|dz  k  rdMndNdO|
j
                  |
j                  dP|#d
›dQ|d
›dR|#|z  d
›dS�dT|
t        |#d8«      t        |d8«      ¬U«
       Œn ‰$S c c}
w c c}}w c c}}w c c}}w c c}}w c c}}
w c c} w c c}#}w )WNc                ó–   •— ‰	j                  | d|t        |d«      t        |d«      t        |d«      |||€d n|j                  |dœ
«       y )NÚtimingé   )
ÚcategoryÚsourceÚseverityÚ
confidencer+   r,   ÚdescriptionÚfix_hintÚ
line_indexÚevidence)rb   Úroundr*   )
ÚcatÚsevÚconfr:   rD   ÚdescÚhintÚlineÚevÚissuess
            €r'   Úaddzdetect.<locals>.addm   sO   ø€ Ø�‰ 3°(ÈÔ[`ÐaeÐghÓ[iÜ % a¨£´E¸!¸Q³KÐPTÐbfØ-1¨\¡T¸t¿z¹zÐWYñ[õ 	\r&   r�   )Ú
orig_startÚorig_endr@   rF   r1   r   ÚMISSING_DUBg333333ó?g      @gÍÌÌÌÌÌì?zOriginal speech of z.1fzs has only z.0%z dubbed speech under it.zTGenerate/insert the dubbed line for this window; it was dropped or placed elsewhere.Ú
LATE_STARTr   g       @gffffffî?r   é   zDub starts z.2fz+s after the original actor begins speaking.z#Shift this dubbed line earlier by ~zs (or trim leading silence).Úonset_deltaÚEARLY_STARTr   z#s before the original actor speaks.zDelay this dubbed line by ~zs.ÚEARLY_CUTOFFé   z	Dub ends zAs before the original line ends (actor still speaking, no voice).z3Slow this line down or extend translation to fill ~zs more.ÚOVERRUNzDub keeps talking zs after the original line endedz and runs into the next line.z (over silence/closed mouth).z(Speed up or shorten the translation by ~Úspills_into_nextÚMID_LINE_GAPgÍÌÌÌÌÌÜ?z:s silence in the dub while the original actor is speaking.zJRe-time the segments around this pause or fill it with the missing phrase.ÚUNMATCHED_SPEECHg      ø?g      @r   z;s of dubbed speech where the original has no speech nearby.zYCheck if this line belongs to another timestamp or is a hallucinated/duplicated TTS line.r   r   Ú
SYNC_DRIFTr   g      è?rQ   zDub is consistently ÚlateÚearlyz by ~zs over z lines.zApply a z+.2fzs offset to dubbed lines ú-ú.)Úmedian_onset_deltark   r+   r,   c              3  ó8   K  — | ]  }t        |d    «      –— Œ y­w)ÚwordN)Úlen)r9   ri   s     r'   r<   zdetect.<locals>.<genexpr>Ã   s   è ø€ Ò%A¸¤c¨!¨F©)§nÑ%Aùs   ‚ÚFAST_SPEECHr{   rz   gš™™™™™á?zDub speaks z chars/s vs a median of z (xz); likely time-squeezed.z9Use a shorter translation instead of speeding up the TTS.)Úchars_per_secÚmedian_chars_per_secr3   )$r   rc   rŠ   r+   r,   r@   rF   r1   r   r6   r}   r/   rH   r   r?   r   r   r   Úboolr   ÚanyrE   r[   r   r   r   r©   r
   rR   Úmedianra   r   r*   rb   Úsumr    )%rk   rm   r/   rf   rg   Ú	dub_wordsrh   rv   Úomr“   rl   r‘   rH   ÚtailÚspill_into_nextrM   rN   Úr0Úr1Úgr:   rD   ÚonsetsÚwrj   r;   ÚoÚmedÚjro   rY   Úratesri   ÚwsÚspanÚrr’   s%                                       @r'   ÚdetectrÁ   g   sÎ  ø€ à€FÜ	ˆc�8œSÓ	!€BÜ	ˆd�HœcÓ	"€Bõ\ð
 ó ,pˆÜ! "§(¡(¨AÓ.¼EÀ"Ç&Á&È!Ó<LØ#%§<¡<Ð#7™4¼UÀ2Ç<Á<ÐQRÓ=SØ!#§¡Ð!3™¼¸r¿z¹zÈ1Ó9MÜ §¡¨QÓ/ñ1ˆð �;‰;˜×+Ñ+Ò+°·±¸#²Ù�œt B§F¡F¨C°Ó5°s¸R¿[¹[Ñ7HÈ"Ï(É(ÐTV×TZÑTZØ% b§f¡f¨S \°¸R¿[¹[ÈÐ<MÐMeÐfØfÐhjñrànpòrñ Ø�vŠvÙØ—‘ˆØ�1—<‘<ÒÙ�œd 5¨#¨sÓ3´S¸¸sÀUÈQÁY¹Ó5OÐQS×QYÑQYÐ[]×[gÑ[gØ˜e C˜[Ð(SÐTØ5°e¸C°[Ð@\Ð]Ð_añ3ô " %¨›Oð3ð 02ó3ð �a—m‘m�^Ò#Ù�œt U F¨C°Ó5´s¸3ÀÀuÀfÈqÁjÑ@PÓ7QÐSU×S_ÑS_Ðac×aiÑaiØ˜u˜f S˜\Ð)LÐMØ-¨u¨f°S¨\¸Ð<¸bñeäNSÐTYÐ[\Ëoðeàacòeð �v‰v˜Ÿ
™
Ñ"ˆØ�!—.‘.Ò á�¤ T¨3°Ó 4´c¸$ÀÀdÈQÁhÁÓ6OÐQS×Q[ÑQ[Ð]_×]cÑ]cØ˜D ˜:Ð%fÐgØEÀdÈ3ÀZÈwÐWÐY[ñcà_aócð ˆU�Q—Y‘YÒÜ" 2¤c¨"¯&©&´3©,Ó&7¼¸B¿J¹JÌÑ<LÓ8MÐ#N×#RÑ#RÓ#TÓUˆOÙ�	œ4   s¨CÓ0´#°c¸3À$ÀÈÁ¹?Ó2KÈRÏVÉVÐUW×U_ÑU_Ø$ d U¨3 KÐ/NÐOÙ6EÑ2ÐKjñlà:¸D¸5À¸+ÀRÐHÈ"ñvð `oðvð suòvô
 ”�B—H‘H˜bŸl™lÓ+¬cÑ1Ó2ˆÜ”�B—F‘F˜BŸJ™JÓ'¬#Ñ-Ó.ˆØˆqŒ5Ü  A a  ¨2¨a°¨7Ñ 2Ó3ò p‘��BØ˜"‘W¤‘O�Ø˜Ÿ	™	“>Ø˜R™¤3™�AÙ˜¬¨Q°°SÓ(9¼3¸sÀDÈ1ÈqÉ5ÁLÓ;QÐSTÐVWÐZ[ÑV[Ø˜S˜'Ð![Ð\ØdÐfhñpàlnópò	pðM,pð\ ò m‰ˆˆ1Øˆq‰5�A—O‘OÓ#ÙÐ"¤D¨¨Q©°°SÓ$9¸3ÀÀ1Ø�q‘5˜�+ÐXÐYØkõmðmð (-Ök °·±Ñ0DÈÏÉÐXY×XjÑXjÓIjˆr�2—8‘8ŠnÐk€FÐkØ	�‰€AØ	€AØ
ˆa‰%”3�v“;Ó
Ü”B—I‘I¨V°A°a¸!±e¨_×=¡T Q¨šqÓ=Ó>Ó?ˆÜˆs‹8�q—w‘wÓØ�A‘ˆAØ”c˜&“k’/¤c¬%´·	±	ÈÐPQÐTUÑPUÐXYÑPYÐZ[Ð^_ÑZ_ÐI`×:aÁÀÀAº1Ó:aÓ0bÓ*cÓ&dÐhi×hoÑhoÒ&oØ�Q‘�ð ”c˜&“k’/¤c¬%´·	±	ÈÐPQÐTUÑPUÐXYÑPYÐZ[Ð^_ÑZ_ÐI`×:aÁÀÀAº1Ó:aÓ0bÓ*cÓ&dÐhi×hoÑhoÓ&oà˜˜1�+ˆCÜ”b—i‘i¨s× 3¡t q¨!¢Ó 3Ó4Ó5ˆAÙ�œd¤3 q£6¨3°Ó4°d¸CÀ¹FÀ1¹I¿O¹OÈSÐQSÉWÐUVÉZÏ^É^Ø&°°Q²¡v¸GÐ&DÀEÌ#ÈaË&ÐQTÈÐU\Ô]`ÐadÓ]eÐ\fÐfmÐnØ˜A˜2˜d˜)Ð#<¸SÀ¹VÀA¹Y¿_¹_Ð<MÈQÈsÐSUÉwÐWXÉz×O_ÑO_ÐN`Ð`aÐbÜ#(¨¨A£;ÈS×6QÁEÀBÈ°r·x³xÓ6QõSð ‰Aà�‰FˆAð ˆa‰%”3�v“;Ô
ò" ØˆØò 	KˆBØ—6’6ØØ&Öc˜¨"¯,©,¸1¸W¹:ÈÈ%ÉÑ;PÐTUÑ:UÔ*bÐXZ×XbÑXbÖ*b’!ÐcˆBÐcØ—:‘: §¡Ñ,ˆDÜ�2‹w˜!‹|  s£
Ø—‘˜b¤#Ñ%A¸bÔ%AÓ"AÀDÑ"HÐIÕJð	Kñ ÜœŸ	™	°×"7©¨¨A¢1Ó"7Ó8Ó9ˆCØò W‘��AØ�s˜QŸ\™\Ñ)Ó)Ù˜°!°c¸A±g²+¡wÀ7ÈDÐRT×R^ÑR^Ð`b×`jÑ`jØ% a¨ WÐ,DÀSÈÀIÈSÐQRÐUXÑQXÐY\ÐP]Ð]uÐvØSÐUWÜ&+¨A¨q£kÌÈcÐSTËöWðWð €MùòK lùó >ùó ;bùÓ:aùó !4ùó 7Rùò dùó
 #8sB   Ñ<aÒaÒ(aÓ9aÕ'a ×a&Øa,Û
a2Ü0a8Ýa8ß
a=c                ó  — t        ||t        «      t        ||t        «      }}| D �cg c]+  }|j                  €Œ|j                  dk\  sŒ |j                  ‘Œ- }}t	        |j                  «       t        z  d«      t	        |j                  «       t        z  d«      t	        t        ||z  j                  «       t        d|j                  «       «      z  «      d«      t	        t        || z  j                  «       t        d|j                  «       «      z  «      d«      |r(t	        t        t        j                  |«      «      d«      nd |r>t	        t        t        j                  t        j                  |«      d«      «      d«      dœS d dœS c c}w )Nr   r   r˜   éZ   )Úorig_speech_secondsÚdub_speech_secondsÚspeech_overlap_ratioÚunmatched_dub_ratior¦   Úp90_abs_onset_delta)r   rc   rH   r1   rŠ   r°   r
   rE   rR   r¯   Ú
percentilera   )rk   rf   r/   rg   r²   rv   rl   r¸   s           r'   ÚstatsrÊ   Ï   s.  € ä�$˜¤#Ó&¬¨S°(¼CÓ(@ˆ€BØ!&ÖW˜2¨"¯(©(Ñ*>À2Ç;Á;ÐRVÓCVˆb�h‹hÐW€FÐWä$ R§V¡V£X´¡^°QÓ7Ü# B§F¡F£H¬s¡N°AÓ6Ü %¤e¨R°"©W¯M©M«O¼cÀ!ÀRÇVÁVÃXÓ>NÑ,NÓ&OÐQRÓ SÜ$¤U¨B°"°©H¯>©>Ó+;¼cÀ!ÀRÇVÁVÃXÓ>NÑ+NÓ%OÐQRÓSÙDJœe¤E¬"¯)©)°FÓ*;Ó$<¸aÔ@ÐPTÙU[œu¤U¬2¯=©=¼¿¹À»ÈÓ+LÓ%MÈqÓQñð ð bfñð ùò Xs   §F	¹F	Á	F	)rM   útuple[float, float]rN   rË   rI   r
   )rY   z
np.ndarrayrI   zlist[tuple[int, int]])
rf   r.   r/   r.   rg   r
   rh   r	   rI   z,tuple[list[Line], list[tuple[float, float]]])r|   r
   rz   r
   ry   r
   rI   Ústr)rk   ú
list[Line]rm   r.   r/   r.   rf   r.   rg   r
   r±   ú
list[dict]rh   r	   rI   rÎ   )
rk   rÍ   rf   r.   r/   r.   rg   r
   rI   Údict)Ú__doc__Ú
__future__r   Údataclassesr   r   ÚnumpyrR   Úspeechr   rc   r	   r)   rO   r[   rw   r}   rÁ   rÊ   r%   r&   r'   ú<module>rÕ      sÁ   ðñõ
 #ç (ã å à
€ð ÷ð ó ðð  ÷Eð Eó ðEó07óFðØðØHóó<WðeØ*ðeØ6;ðeØHRðeØWaðeØfpóeðPØðØ"ôr&   