Ë
    1²j21  ã                   óœ  — d dl mZ d dlmZ d dlmZmZ d dlmZ d„ Z	 G d„ de
«      Ze G d„ d	«      «       Z G d
„ d«      Zd„ Zd„ Zdedee   defd„Zdedefd„Zdedefd„Zdedee   defd„Zdedefd„Zdededefd„Zdededefd„Zdedefd„Zdedefd„ZdZedk(  �r÷d dlmZ  ee¬«      Zej?                  d d!d"¬#«       ej?                  d$d%ed&¬'«       ej?                  d(ed)d*¬+«       ejA                  «       Z! e«       Zg Z"e!jF                  D ]F  Z$ ee$«      Z%e%jM                  «       Z'e"jQ                  e%jR                  «       ejU                  e'«       ŒH ejV                  jY                  «       D � �cg c]  \  } } e| |«      ‘Œ c}} Z-ejV                  jY                  «       D � �cg c]  \  } }|‘Œ	 c}} Z.e.d    d    Z/ ee/«      Z0 ee/«      Z1 ee2«      jf                  d,z  ejh                  z  d-z  jM                  «       Z5e!jl                  jo                  d.«      jq                  d/«      5 Z9e5Z6e6d0ju                  e-«      z  Z6e6d0z  Z6e6e0z  Z6e6d0z  Z6e6e1z  Z6e9jw                  e6«       d1d1d1«       ejV                  jY                  «       D � �cg c]  \  } } e| |«      ‘Œ c}} Z<ejV                  j{                  «       D � cg c]  } | ‘Œ c} Z> ee>e/«      Z? ee/«      Z@ ee>e/«      ZA ee/«      ZB ee/«      ZCe!jl                  jo                  d2«      jq                  d/«      5 Z9e5Z6e6d3z  Z6e6d4z  Z6e6d0z  Z6e6d0ju                  e<«      z  Z6e6d0z  Z6e6e?z  Z6e6d0z  Z6e6eBz  Z6e6d0z  Z6e6e@z  Z6e6d0z  Z6e6eAz  Z6e6d0z  Z6e6eCz  Z6e9jw                  e6«       d1d1d1«       y1y1c c}} w c c}} w # 1 sw Y   �Œ9xY wc c}} w c c} w # 1 sw Y   y1xY w)5é    )Údefaultdict)ÚPath)ÚSequenceÚUnion)Ú	dataclassc                 ó
   — | d uS ©N© )Úxs    úP/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/triton/tools/link.pyÚ_existsr      s   € Ø�Dˆ=Ðó    c                   ó   — e Zd Zy)ÚLinkerErrorN)Ú__name__Ú
__module__Ú__qualname__r
   r   r   r   r      s   „ Ør   r   c                   óz   — e Zd ZU eed<   ee   ed<   ee   ed<   eeedf      ed<   eed<   eed<   eed<   eed	<   y)
ÚKernelLinkerMetaÚorig_kernel_nameÚ	arg_namesÚ
arg_ctypesNÚsizesÚsig_hashÚtriton_suffixÚsuffixÚ	num_specs)r   r   r   ÚstrÚ__annotations__r   r   Úintr
   r   r   r   r      sH   … àÓØ˜‰}ÓØ˜‘ÓØ�E˜#˜t˜)Ñ$Ñ%Ó%ØƒMØÓØƒKØƒNØ+r   r   c                   óX   — e Zd Zdd„Zdefd„Zdefd„Zdefd„Zd	edefd
„Zdede	fd„Z
y)ÚHeaderParserNc                 ó  — dd l }|j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        t        t        «      | _	        d | _
        y )Nr   z'//[\s]*tt-linker:[\s]*([\w]+):(.+):(.+)z^([\w]+)_([\w]+)_([\w]*)$z[\s]*(\w+)\s(\w+)[,]?z[c,d]z%//[\s]*tt-linker-backend:[\s]*([\w]+))ÚreÚcompileÚlinker_directivesÚkernel_nameÚc_sigÚ
arg_suffixÚbackend_name_rer   ÚlistÚkernelsÚbackend_name)Úselfr$   s     r   Ú__init__zHeaderParser.__init__   sr   € Ûð "$§¡Ð,XÓ!YˆÔàŸ:™:Ð&DÓEˆÔà—Z‘ZÐ ;Ó<ˆŒ
àŸ*™* WÓ-ˆŒà!Ÿz™zÐ*TÓUˆÔä"¤4Ó(ˆŒØ ˆÕr   Úheaderc                 óÞ  — |j                  «       D �]Y  }|j                  d«      sŒ| j                  j                  |«      }t	        |«      r¦|j                  d«      |j                  d«      |j                  d«      }}}| j                  |«      \  }}}	| j                  |«      \  }
}| j                  |	|«      \  }}| j                  dj                  ||g«      t        |||
|||	|	|¬«      «       Œâ| j                  j                  |«      }t	        |«      s�Œ
|j                  d«      }| j                  €	|| _        �Œ0| j                  |k7  s�ŒAt        d| j                  › d|› �«      ‚ y )	Nz//é   é   é   Ú_)r   r   r   r   r   r   r   r   zdiffering backend z vs. )Ú
splitlinesÚ
startswithr&   Úmatchr   ÚgroupÚ_match_nameÚ_match_c_sigÚ_match_suffixÚ_add_kernelÚjoinr   r*   r-   ÚRuntimeError)r.   r0   ÚlnÚmÚker_namer(   Ú	algo_infoÚnamer   r   Úc_typesr   r   r   r-   s                  r   Úextract_linker_metaz HeaderParser.extract_linker_meta0   s^  € Ø×#Ñ#Ó%ó 	lˆBØ�}‰}˜TÕ"Ø×*Ñ*×0Ñ0°Ó4�Ü˜1”:Ø12·±¸³¸Q¿W¹WÀQ»ZÈÏÉÐQRË Y˜e�HØ-1×-=Ñ-=¸hÓ-GÑ*�D˜( FØ)-×):Ñ):¸5Ó)AÑ&�G˜YØ'+×'9Ñ'9¸&À%Ó'HÑ$�I˜uØ×$Ñ$ØŸ™ $¨	Ð!2Ó3Ü(Ø-1Ø&/Ø'.Ø"'Ø%-Ø*0Ø#)Ø&/ô	õð ×,Ñ,×2Ñ2°2Ó6�AÜ˜q–zØ'(§w¡w¨q£z˜Ø×,Ñ,Ð4Ø0<˜DÖ-Ø!×.Ñ.°,Ô>Ü".Ð1CÀD×DUÑDUÐCVÐV[Ð\hÐ[iÐ/jÓ"kÐkñ9	lr   rB   c                 óÚ   — | j                   j                  |«      }t        |«      r8|j                  d«      |j                  d«      |j                  d«      }}}|||fS t	        |› d�«      ‚)Nr2   r3   r4   z is not a valid kernel name)r'   r8   r   r9   r   )r.   rB   rA   rD   r   r   s         r   r:   zHeaderParser._match_nameO   sd   € Ø×Ñ×"Ñ" 8Ó,ˆÜ�1Œ:Ø%&§W¡W¨Q£Z°·±¸³¸Q¿W¹WÀQ»Z˜F�(ˆDØ˜ 6Ð)Ð)Ü˜X˜JÐ&AÐBÓCÐCr   r(   c                 óÒ   — | j                   j                  |«      }t        |«      r4g g }}|D ]'  \  }}|j                  |«       |j                  |«       Œ) ||fS t	        |› d�«      ‚)Nz" is not a valid argument signature)r(   ÚfindallÚlenÚappendr   )r.   r(   rA   ÚtysÚargsÚtyÚarg_names          r   r;   zHeaderParser._match_c_sigV   so   € Ø�J‰J×Ñ˜uÓ%ˆÜˆqŒ6Ø˜B�ˆCØ !ò &‘��HØ—
‘
˜2”Ø—‘˜HÕ%ð&ð ˜�9Ðä˜U˜GÐ#EÐFÓGÐGr   r   c                 ó.  — |j                  d«      }dddœ}d}g }t        t        |«      «      D ]›  }d}|j                  t	        |«      «      }	|	sŒ"|t        t	        |«      «      z  }| j
                  j                  ||«      rB|dz  }|j                  d g|t        |«      z
  z  «       |j                  |||      «       |dz  }||d  }Œ� t        |«      dkD  rt        d|› �«      ‚|j                  d gt        |«      t        |«      z
  z  «       ||fS )Nú,r2   é   )ÚcÚdr   zHas invalid extra suffix: )
ÚsplitÚrangerJ   r7   r   r)   r8   ÚextendrK   Ú	Exception)
r.   r   r(   rM   Ús2ir   r   ÚiÚposÚidx_matcheds
             r   r<   zHeaderParser._match_suffixa   s  € Ø�{‰{˜3ÓˆØ˜BÑˆØˆ	Øˆä”s˜4“yÓ!ò 	"ˆAØˆCØ ×+Ñ+¬C°«FÓ3ˆKÙØØ”3”s˜1“v“;ÑˆCØ�‰×$Ñ$ V¨SÔ1Ø˜Q‘�	Ø—‘˜d˜V q¬3¨u«:¡~Ñ6Ô7Ø—‘˜S ¨¡Ñ-Ô.Ø�q‘�Ø˜C˜D�\‰Fð	"ô ˆv‹;˜Š?ÜÐ8¸¸ÐAÓBÐBØ�‰�d�Vœs 4›y¬3¨u«:Ñ5Ñ6Ô7à˜%ÐÐr   rD   Úkerc                 óf  — || j                   v r…| j                   |   d   }t        |j                  |j                  «      D ]P  \  }}||k7  sŒt        d|› ddj	                  |j                  «      › ddj	                  |j                  «      › �«      ‚ | j                   |   j                  |«       y )Néÿÿÿÿz Mismatched signature for kernel z: 
	existing sig is: rQ   z
	current is: )r,   Úzipr   r   r>   rK   )r.   rD   r]   ÚlastÚcurÚnew_s         r   r=   zHeaderParser._add_kernelz   s×   € Ø�4—<‘<ÑØ%)§\¡\°$Ñ%7¸Ñ%;ˆDä  §¡°#·.±.ÓAò ‘	��TØ˜$“;Ü%Ø:¸4¸&Ð@WÐX[×X`ÑX`Ðae×apÑapÓXqÐWrð  sCð  DG÷  DLñ  DLð  MP÷  M[ñ  M[ó  D\ð  C]ð  ^óð ðð 	�‰�TÑ×!Ñ! #Õ&r   )ÚreturnN)r   r   r   r/   r   rF   r:   r;   r<   r   r=   r
   r   r   r"   r"      sX   „ ó!ð"l¨#ó lð>D Có Dð	H #ó 	Hð  Cð  °ó  ð2
' ð 
'Ð*:ô 
'r   r"   c           	      óœ   — dj                  t        | j                  | j                  «      D ��cg c]  \  }}|› d|› �‘Œ c}}«      S c c}}w )Nú, ú )r>   r`   r   r   )rA   rN   Úargs      r   Úgen_signature_with_full_argsri   ‡   s<   € Ø�9‰9´3°q·|±|ÀQÇ[Á[Ó3Q×R©¨¨C˜˜˜A˜c˜U’mÓRÓSÐSùÓRs   ¯A
c           	      óp  — t        | j                  | j                  «      D ��cg c]  \  }}|dk7  sŒ|‘Œ }}}t        | j                  | j                  «      D ��cg c]  \  }}|dk7  sŒ|‘Œ }}}dj	                  t        ||«      D ��cg c]  \  }}|› d|› �‘Œ c}}«      }|S c c}}w c c}}w c c}}w )Nr2   rf   rg   )r`   r   r   r   r>   )rA   rN   ÚhintÚ	arg_typesrh   r   Úsigs          r   Úgen_signaturern   ‹   s™   € Ü$'¨¯©°a·g±gÓ$>×L™˜˜DÀ$È!Ã)’ÐL€IÑLÜ&)¨!¯+©+°q·w±wÓ&?×M™˜˜dÀ4È1Ã9’ÐM€IÑMØ
�)‰)´#°iÀÓ2K×L¡w r¨3˜�t˜1˜S˜E’]ÓLÓ
M€CØ€Jùó MùÛMùÛLs   ¤B&²B&ÁB,Á*B,ÂB2
rD   Úmetasrd   c           	      ó8   — d| › dt        |d   «      › d| › d| › d�	S )Nú
TT_ResultTy ú(TT_StreamTy stream, r_   z);
void load_ú();
void unload_ú();
    )ri   )rD   ro   s     r   Úmake_algo_declsru   “   sB   € ðØˆFÐ'Ô(DÀUÈ2ÁYÓ(OÐ'Pð QØˆ&ð ØˆFð ðð r   Úmetac                 ó    — d| j                   › dt        | «      › d| j                   › dt        | «      › d| j                   › d| j                   › d�S )Nrq   ú_default(TT_StreamTy stream, z);
TT_ResultTy rr   z, int algo_id);
void load_rs   rt   )r   ri   )rv   s    r   Úmake_global_declry   œ   su   € ðØ×"Ñ"Ð#Ð#@ÔA]Ð^bÓAcÐ@dð eØ×"Ñ"Ð#Ð#8Ô9UÐVZÓ9[Ð8\ð ]Ø× Ñ Ð
!ð "Ø×"Ñ"Ð#ð $ð	ð r   c                 ó¦   — d| j                   › dt        | «      › d�}|d| j                   › ddj                  | j                  «      › d�z  }|dz  }|S )	NúTT_ResultTy rx   z){
ú	  return ú	(stream, rf   z, 0);
ú}
©r   ri   r>   r   ©rv   Úsrcs     r   Úmake_default_algo_kernelr‚   ¦   sd   € Ø˜×.Ñ.Ð/Ð/LÔMiÐjnÓMoÐLpÐpuÐ
v€CØˆi˜×-Ñ-Ð.¨i¸¿	¹	À$Ç.Á.Ó8QÐ7RÐRYÐZÑ[€CØˆ5�L€CØ€Jr   c                 ór  — d| › d�}t        |d„ ¬«      D ];  }|d|j                  › d|j                  › d|j                  › dt	        |«      › d�	z  }Œ= |dz  }|d| › dt        |d	   «      › d
�z  }|dz  }t        |d„ ¬«      D ]ç  }d„ }dj                  t        |j                  |j                  «      D ��cg c]  \  }}|�	 |||«      ‘Œ c}}«      }|t        |j                  «      rd|› d�ndz  }t        |j                  |j                  «      D ��cg c]  \  }}|dk7  sŒ|‘Œ }	}}|d|j                  › d|j                  › d|j                  › ddj                  |	«      › d�	z  }Œé |dz  }|dz  }|dz  }dD ]ª  }
|d|
› d| › d�z  }t        |d„ ¬«      D ]2  }|d|
› d|j                  › d|j                  › d|j                  › d�	z  }Œ4 |d|
› d| › d�z  }|dz  }t        |d„ ¬«      D ]2  }|d|
› d|j                  › d|j                  › d|j                  › d�	z  }Œ4 |dz  }Œ¬ |S c c}}w c c}}w ) Nz// launcher for: ú
c                 ó   — | j                    S r	   ©r   ©rA   s    r   ú<lambda>z.make_kernel_hints_dispatcher.<locals>.<lambda>°   ó   € ¨Q¯[©[¨L€ r   )Úkeyr{   r5   rr   ú);
r_   z){c                 ó   — | j                    S r	   r†   r‡   s    r   rˆ   z.make_kernel_hints_dispatcher.<locals>.<lambda>¶   r‰   r   c                 ó>   — |dk(  r	d| › d|› d�S |dk(  r	d| › d|› d�S d S )	NrR   z((uintptr_t)z % z == 0)r2   ú(z == ú)r
   )Úvalrk   s     r   rˆ   z.make_kernel_hints_dispatcher.<locals>.<lambda>¸   sK   € Ø�rŠzð !-¨S¨E°°T°F¸&ÐA€ ð �qŠyð �S�E˜˜d˜V 1Ð%ð ð ð	 r   z && z  if (z)
zif (1)
r2   z    return r}   rf   z!  return TT_ERROR_INVALID_VALUE;
r~   ©ÚloadÚunloadz
// z for: c                 ó   — | j                    S r	   r†   r‡   s    r   rˆ   z.make_kernel_hints_dispatcher.<locals>.<lambda>Ì   ó   € °·±°€ r   úvoid ú();
z() {c                 ó   — | j                    S r	   r†   r‡   s    r   rˆ   z.make_kernel_hints_dispatcher.<locals>.<lambda>Ð   r•   r   ú  )Úsortedr   r   r   rn   ri   r>   r`   r   r   Úany)rD   ro   r�   rv   Úcond_fnr�   rk   Úcondsrh   r   Úmodes              r   Úmake_kernel_hints_dispatcherrŸ   ®   sÉ  € Ø˜d˜V 2Ð
&€CÜ�uÑ"8Ô9ò BˆØ�˜d×3Ñ3Ð4°A°d·m±m°_ÀAÀdÇkÁkÀ]ÐRgÔhuÐvzÓh{Ðg|ð  }Að  Bñ  	B‰ðBàˆ4�K€Càˆl˜4˜&Ð 5Ô6RÐSXÐY[ÑS\Ó6]Ð5^Ð^aÐbÑc€CØˆ4�K€CÜ�uÑ"8Ô9ò vˆñð 	ð —‘ä  §¡°·±Ó<÷
á��TØÐñ �C˜Õó
ó ˆð
 	¤s¨4¯:©:¤�&˜˜˜sÑ#¸Jñ 	ˆä*-¨d¯n©n¸d¿j¹jÓ*I×W™Y˜S $ÈTÐUVËY’SÐWˆ	ÑWØ�˜T×2Ñ2Ð3°1°T·]±]°OÀ1ÀTÇ[Á[ÀMÐQZÐ[_×[dÑ[dÐenÓ[oÐZpÐptÐuÑu‰ðvð  ˆ4�K€CØÐ/Ñ/€CØˆ5�L€Cà"ò ˆØ��t�f˜F 4 &¨Ð+Ñ+ˆÜ˜5Ñ&<Ô=ò 	]ˆDØ�U˜4˜&  $×"7Ñ"7Ð!8¸¸$¿-¹-¸ÈÈ$Ï+É+ÈÐV[Ð\Ñ\‰Cð	]à��t�f˜A˜d˜V 5Ð)Ñ)ˆØˆt‰ˆÜ˜5Ñ&<Ô=ò 	\ˆDØ�b˜˜˜a × 5Ñ 5Ð6°a¸¿¹°ÀaÈÏÉÀ}ÐTYÐZÑ[‰Cð	\àˆu‰‰ðð €Jùó-
ùó Xs   Â7H-ÄH3Ä%H3c                 óÌ   — d| j                   › dt        | «      › d�}|d| j                   › d�z  }|d| j                   › ddj                  | j                  «      › d	�z  }|d
z  }|S )Nr{   rr   z, int algo_id){
z   assert (algo_id < (int)sizeof(z_kernels));
r|   z_kernels[algo_id](stream, rf   r‹   r~   r   r€   s     r   Ú!make_kernel_meta_const_dispatcherr¡   ×   sƒ   € Ø˜×.Ñ.Ð/Ð/DÔEaÐbfÓEgÐDhÐhzÐ
{€CØÐ-¨d×.CÑ.CÐ-DÀMÐRÑR€CØˆY�t×,Ñ,Ð-Ð-GÈÏ	É	ÐRV×R`ÑR`ÓHaÐGbÐbfÐgÑg€CØˆ5�L€CØ€Jr   Únamesc                 ót   — dt        |«      › d�}|d|j                  › d�z  }| D ]  }|d|› d�z  }Œ |dz  }|S )Nz9typedef TT_ResultTy (*kernel_func_t)(TT_StreamTy stream, r‹   zkernel_func_t z_kernels[] = {
r™   z,
z};
)ri   r   )r¢   rv   r�   rD   s       r   Úmake_func_pointersr¤   à   sc   € àEÔFbÐcgÓFhÐEiÐimÐ
n€CØˆ^˜D×1Ñ1Ð2Ð2CÐDÑD€CØò ˆØ��D�6˜ˆ~Ñ‰ðàˆ6�M€CØ€Jr   c                 ót   — d}dD ]0  }|d|› d|j                   › d�z  }| D ]  }|d|› d|› d�z  }Œ |dz  }Œ2 |S )	NÚ r‘   r–   r5   z(void){
r™   r—   z}

©r   )r¢   rv   r�   rž   rD   s        r   Úmake_kernel_load_defr¨   ë   sn   € Ø
€CØ"ò ˆØ��t�f˜A˜d×3Ñ3Ð4°JÐ?Ñ?ˆØò 	+ˆDØ�R˜�v˜Q˜t˜f EÐ*Ñ*‰Cð	+àˆw‰‰ð	ð
 €Jr   c                 ó&   — d| j                   › d�}|S )Núint z_get_num_algos(void);r§   r€   s     r   Úmake_get_num_algos_declr«   õ   s   € Ø�×&Ñ&Ð'Ð'<Ð
=€CØ€Jr   c                 óp   — d| j                   › d�}|d| j                   › d| j                   › d�z  }|dz  }|S )Nrª   z_get_num_algos(void){
z  return (int)(sizeof(z_kernels) / sizeof(z_kernels[0]));
r~   r§   r€   s     r   Úmake_get_num_algos_defr­   ú   sP   € Ø�×&Ñ&Ð'Ð'?Ð
@€CØÐ# D×$9Ñ$9Ð#:Ð:MÈd×NcÑNcÐMdÐdtÐuÑu€CØˆ5�L€CØ€Jr   a0  
Triton ahead-of-time linker:

This program takes in header files generated by compile.py, and generates a
single entry-point responsible for dispatching the user's input to the right
kernel given the specializations that were compiled.

Example usage:
python link.py /path/to/headers/*.h -o kernel_name
Ú__main__)ÚArgumentParser)ÚdescriptionÚheadersú+z_Paths to header files to link. Must include linker directive annotations (autogenerated by ttc))ÚnargsÚhelpz--outz-ozOut filename)Útyper´   z--prefixr¦   z(String to prefix kernel dispatcher names)rµ   Údefaultr´   Úextrazlink.hz.hÚwr„   Nz.cz#include <stdint.h>
z#include <assert.h>
)DÚcollectionsr   Úpathlibr   Útypingr   r   Údataclassesr   r   rX   r   r   r"   ri   rn   r   ru   ry   r‚   rŸ   r¡   r¤   r¨   r«   r­   Údescr   Úargparser¯   ÚparserÚadd_argumentÚ
parse_argsrM   Úincludesr±   r0   Úh_pathÚ	read_textÚh_strrK   rD   rF   r,   ÚitemsÚ
algo_declsÚ
meta_listsrv   Úget_num_algos_declÚglobal_declÚ__file__Úparentr-   Úbackend_preludeÚoutÚwith_suffixÚopenÚfpr>   ÚwriteÚdefsÚkeysr¢   Úfunc_pointers_defÚmeta_const_defÚload_unload_defÚget_num_algos_defÚdefault_algo_kernel)rD   rv   s   00r   ú<module>rÚ      s˜  ðÝ #Ý ß "å !òô	�)ô 	ð ÷	,ð 	,ó ð	,÷g'ñ g'òTTòð˜#ð  hÐ/?Ñ&@ð ÀSó ðÐ+ð °ó ðÐ#3ð ¸ó ð% sð %°8Ð<LÑ3Mð %ÐRUó %ðRÐ,<ð Àó ð˜cð Ð)9ð ¸có ð ð Ð+;ð Àó ðÐ"2ð °só ð
Ð!1ð °có ð	€ð ˆzÓÝ'á¨Ô-€FØ
×ÑØØØnð ô ð
 ×Ñ˜ ¨D°~ÐÔFØ
×ÑØØØØ7ð	 ô ð ×ÑÓ€Dñ ‹^€FØ€HØ—,‘,ò *ˆÙ�f“ˆØ× Ñ Ó"ˆØ�‰˜Ÿ™Ô$Ø×"Ñ" 5Õ)ð	*ð AGÇÁ×@TÑ@TÓ@V×W±*°$¸‘/ $¨Õ-ÓW€JØ)/¯©×)=Ñ)=Ó)?×@™:˜4 ’$Ó@€JØ�a‰=˜Ñ€DÙ0°Ó6ÐÙ" 4Ó(€KÙ˜H“~×,Ñ,¨wÑ6¸×9LÑ9LÑLÈxÑW×bÑbÓd€OØ	�‰×	Ñ	˜dÓ	#×	(Ñ	(¨Ó	-ð °ØˆØˆt�y‰y˜Ó$Ñ$ˆØˆt‰ˆØÐ!Ñ!ˆØˆt‰ˆØˆ{ÑˆØ
�‰�Œ÷ð HNÇ~Á~×G[ÑG[ÓG]×^¹¸¸tÑ(¨¨tÕ4Ó^€DØ$Ÿn™n×1Ñ1Ó3Ö4�dŠTÒ4€EÙ*¨5°$Ó7ÐÙ6°tÓ<€NÙ*¨5°$Ó7€OÙ.¨tÓ4ÐÙ2°4Ó8ÐØ	�‰×	Ñ	˜dÓ	#×	(Ñ	(¨Ó	-ð °ØˆØÐ&Ñ&ˆØÐ&Ñ&ˆØˆt‰ˆØˆt�y‰y˜‹ÑˆØˆt‰ˆØÐ Ñ ˆØˆt‰ˆØÐ Ñ ˆØˆt‰ˆØˆ~ÑˆØˆt‰ˆØˆÑˆØˆt‰ˆØÐ"Ñ"ˆØ
�‰�Œ÷!ð ðg ùó8 XùÛ@÷
ñ üó _ùÚ4÷ð ús1   Å>NÆ2N$È7<N*ÊN7Ë	N=Ì+A)OÎ*N4ÏO