§
    ŠŠtjK;  ã                  ó¬   — d Z ddlmZ ddlmZ ddlmZmZ erddlZe G d„ d¦  «        ¦   «         Z	e G d„ d	¦  «        ¦   «         Z
 G d
„ d¦  «        ZdS )a  
Dynamo Profiler - tracks where Dynamo spends time during compilation.

This module provides profiling functionality for Dynamo tracing, showing per-function
cumtime (inclusive) and tottime (exclusive) in a cProfile-compatible format.
The output can be visualized with tools like snakeviz.

Usage:
    # Enable via config (prints pstats output):
    torch._dynamo.config.dynamo_profiler = True

    # Or save to file for snakeviz:
    torch._dynamo.config.dynamo_profiler = "/tmp/dynamo.prof"
    # Then: snakeviz /tmp/dynamo.prof
é    )Úannotations)Ú	dataclass)ÚAnyÚTYPE_CHECKINGNc                  ó8  — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   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<   e
d"d„¦   «         Ze
d#d„¦   «         Ze
d#d„¦   «         Ze
d#d„¦   «         Ze
d$d„¦   «         Ze
d%d „¦   «         Zd&d!„ZdS )'ÚFunctionTraceTiminga+  
    Timing data for a single inlined function trace.

    Follows cProfile conventions:
    - cumtime: total time in function including all subcalls (inclusive)
    - tottime: time in function excluding subcalls (exclusive)
    - caller info: who called this function (for building call graph)
    ÚstrÚ	func_nameÚfilenameÚintÚfirstlinenoÚ
cumtime_nsÚ
tottime_nsÚbytecode_countÚinline_depthNú
str | NoneÚcaller_func_nameÚcaller_filenamez
int | NoneÚcaller_firstlinenoTÚboolÚis_primitive_call© ú tuple[tuple[str, str, int], ...]Ú
call_stackÚreturnc                ó   — | j         S ©N©r   ©Úselfs    ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_dynamo/dynamo_profiler.pyÚtrace_time_nsz!FunctionTraceTiming.trace_time_ns=   s
   € àŒÐó    Úfloatc                ó   — | j         dz  S ©Ng    €„.Ar   r   s    r!   Útrace_time_msz!FunctionTraceTiming.trace_time_msA   ó   € àŒ Ñ$Ð$r#   c                ó   — | j         dz  S r&   r   r   s    r!   Ú
cumtime_mszFunctionTraceTiming.cumtime_msE   r(   r#   c                ó   — | j         dz  S r&   )r   r   s    r!   Ú
tottime_mszFunctionTraceTiming.tottime_msI   r(   r#   útuple[str, int, str] | Nonec                óD   — | j         �| j        pd| j        pd| j         fS dS )z/Return caller as a pstats-compatible key tuple.NÚ r   )r   r   r   r   s    r!   Ú
caller_keyzFunctionTraceTiming.caller_keyM   s:   € ð Ô Ð,àÔ$Ð*¨ØÔ'Ð,¨1ØÔ%ðð ð
 ˆtr#   útuple[str, int, str]c                ó*   — | j         | j        | j        fS )z6Return this function as a pstats-compatible key tuple.)r   r   r
   r   s    r!   Úfunc_keyzFunctionTraceTiming.func_keyX   s   € ð ”˜tÔ/°´Ð@Ð@r#   c                ó|   — d| j         › d| j        › d| j        › d| j        d›d| j        d›d| j        › d| j        › d	�S )
NzFunctionTraceTiming(z at ú:z
, cumtime=ú.2fzms, tottime=zms, bytecode=z, depth=ú))r
   r   r   r*   r,   r   r   r   s    r!   Ú__repr__zFunctionTraceTiming.__repr__]   s�   € ðJ 4¤>ð Jð J°t´}ð Jð JÀtÔGWð Jð JØ”ÐQðJð JØ8<¼ÐQðJð JàÔ+ðJð Jà59Ô5FðJð Jð Jð	
r#   )r   r   )r   r$   )r   r-   )r   r1   )r   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   Úpropertyr"   r'   r*   r,   r0   r3   r8   r   r#   r!   r   r      sž  € € € € € € ðð ð €N€N�NØ€M€M�MØÐÐÑà€O€O�OØ€O€O�OàÐÐÑàÐÐÑà#'ÐÐ'Ð'Ð'Ñ'Ø"&€OÐ&Ð&Ð&Ñ&Ø%)ÐÐ)Ð)Ð)Ñ)ð #ÐÐ"Ð"Ð"Ñ"ð 46€JÐ5Ð5Ð5Ñ5ð ðð ð ñ „Xðð ð%ð %ð %ñ „Xð%ð ð%ð %ð %ñ „Xð%ð ð%ð %ð %ñ „Xð%ð ðð ð ñ „Xðð ðAð Að Añ „XðAð
ð 
ð 
ð 
ð 
ð 
r#   r   c                  óT   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   d	Zd
ed<   dS )ÚProfilerStackEntryz@Stack entry for tracking function timing in the Dynamo profiler.r	   r
   r   r   r   Ústart_time_nsÚchild_time_nsTr   r   N)r9   r:   r;   r<   r=   r   r   r#   r!   r@   r@   e   s`   € € € € € € àJÐJà€N€N�NØ€M€M�MØÐÐÑØÐÐÑØÐÐÑØ"ÐÐ"Ð"Ð"Ñ"Ð"Ð"r#   r@   c                  óv   — e Zd ZdZd'd„Zd(d„Zd)d	„Zd*d„Zd+d„Zd,d„Z	d-d„Z
d.d„Z	 d/d0d „Z	 d1d2d#„Z	 d3d4d&„ZdS )5ÚDynamoProfilerStatez:State for Dynamo profiler tracking function trace timings.r   ÚNonec                ó"   — g | _         g | _        d S r   )ÚtimingsÚstackr   s    r!   Ú__init__zDynamoProfilerState.__init__t   s   € Ø24ˆŒØ/1ˆŒ
ˆ
ˆ
r#   Útimingr   c                ó:   — | j                              |¦  «         dS )z)Record timing data for a traced function.N)rG   Úappend)r    rJ   s     r!   Úrecord_timingz!DynamoProfilerState.record_timingx   s   € àŒ×Ò˜FÑ#Ô#Ð#Ð#Ð#r#   úlist[FunctionTraceTiming]c                ó   — | j         S )zGet all recorded timings.)rG   r   s    r!   Úget_timingszDynamoProfilerState.get_timings|   s
   € àŒ|Ðr#   r
   r	   r   r   r   rA   c           
     ó¬   ‡‡‡— t          ˆˆˆfd„| j        D ¦   «         ¦  «         }| j                             t          ‰‰‰|d|¬¦  «        ¦  «         dS )z'Push a new entry onto the timing stack.c              3  óZ   •K  — | ]%}|j         ‰k    o|j        ‰k    o
|j        ‰k    V — Œ&d S r   ©r
   r   r   )Ú.0Úentryr   r   r
   s     €€€r!   ú	<genexpr>z+DynamoProfilerState.push.<locals>.<genexpr>…   s_   øè è € ð 
ð 
ð ð ŒO˜yÒ(ð 1Ø” (Ò*ð1àÔ! [Ò0ð
ð 
ð 
ð 
ð 
ð 
r#   r   )r
   r   r   rA   rB   r   N)ÚanyrH   rL   r@   )r    r
   r   r   rA   Úis_primitives    ```  r!   ÚpushzDynamoProfilerState.push€   s™   øøø€ õ
 ð 
ð 
ð 
ð 
ð 
ð 
ð œð	
ñ 
ô 
ñ 
ô 
ð 
ˆð 	Œ
×ÒÝØ#Ø!Ø'Ø+ØØ".ðñ ô ñ		
ô 		
ð 		
ð 		
ð 		
r#   úProfilerStackEntry | Nonec                óF   — | j         r| j                              ¦   «         S dS )z(Pop the top entry from the timing stack.N)rH   Úpopr   s    r!   r\   zDynamoProfilerState.pop–   s#   € àŒ:ð 	$Ø”:—>’>Ñ#Ô#Ð#Øˆtr#   Úchild_cumtime_nsc                óN   — | j         r| j         d         xj        |z  c_        dS dS )zGAdd the child's cumulative time to the parent's child_time accumulator.éÿÿÿÿN)rH   rB   )r    r]   s     r!   Úadd_child_timez"DynamoProfilerState.add_child_timeœ   s7   € àŒ:ð 	=ØŒJ�rŒNÐ(Ô(Ð,<Ñ<Ð(Ô(Ð(Ð(ð	=ð 	=r#   útuple[str, str, int] | Nonec                óV   — | j         r!| j         d         }|j        |j        |j        fS dS )zLGet the current caller (top of stack) as (func_name, filename, firstlineno).r_   N)rH   r
   r   r   )r    rU   s     r!   Úget_current_callerz&DynamoProfilerState.get_current_caller¡   s1   € àŒ:ð 	HØ”J˜r”NˆEØ”O U¤^°UÔ5FÐGÐGØˆtr#   r   c                ó>   — t          d„ | j        D ¦   «         ¦  «        S )zOGet the full current call stack as tuple of (func_name, filename, firstlineno).c              3  ó>   K  — | ]}|j         |j        |j        fV — Œd S r   rS   )rT   rU   s     r!   rV   z5DynamoProfilerState.get_call_stack.<locals>.<genexpr>ª   sA   è è € ð 
ð 
ØEJˆUŒ_˜eœn¨eÔ.?Ð@ð
ð 
ð 
ð 
ð 
ð 
r#   )ÚtuplerH   r   s    r!   Úget_call_stackz"DynamoProfilerState.get_call_stack¨   s2   € åð 
ð 
ØNRÌjð
ñ 
ô 
ñ 
ô 
ð 	
r#   NFÚoutput_filer   Ú	print_rawr   úpstats.Statsc                ó$	  — ddl }ddl}ddl}ddl}|                     t
          ¦  «        }i }i }	| j        D �]'}
|
j        |
j        |
j	        f}||vrdddddœ||<   i |	|<   ||         }|dxx         dz  cc<   |dxx         |
j
        dz  z  cc<   |
j        r(|d	xx         dz  cc<   |d
xx         |
j        dz  z  cc<   |
j        �—|
j        |
j        pd|
j        pdf}||	|         vrdddddœ|	|         |<   |	|         |         }|dxx         dz  cc<   |dxx         |
j
        dz  z  cc<   |d
xx         |
j        dz  z  cc<   |
j        r|d	xx         dz  cc<   �Œ)|�rFt!          |                     ¦   «         d„ d¬¦  «        }t%          d¦  «         t%          dd›dd	d›ddd›dd
d›d�¦  «         t%          d¦  «         d}d}|D ]‚\  \  }}}}|d         }|d	         }|d         dz  }|d
         dz  }||z  }||z  }d|v r|                     d¦  «        d         n|}t%          |d›d|d›d|d›d|d›d|› d|› d|› d�¦  «         Œƒt%          d¦  «         t%          dt)          | j        ¦  «        › dt)          |¦  «        › �¦  «         t%          d |d!›d"|d!›d#�¦  «         t+          |	                     ¦   «         ¦  «        D ] }|	|         D ]}||vrdddddœ||<   i |	|<   ŒŒ!i }|                     ¦   «         D ]j\  }}i }|	|                              ¦   «         D ]&\  }}|d         |d	         |d         |d
         f||<   Œ'|d	         |d         |d         |d
         |f||<   Œk|                     ¦   «         }|                     ¦   «          |                     ¦   «           |j        ||                     ¦   «         ¬$¦  «        }||_        t;          d%„ |                     ¦   «         D ¦   «         ¦  «        |_        t;          d&„ |                     ¦   «         D ¦   «         ¦  «        |_         t;          d'„ |                     ¦   «         D ¦   «         ¦  «        |_!        |r,| "                    |¦  «         | #                    d(||¦  «         |S ))zØGenerate pstats.Stats object from recorded timings.

        Args:
            output_file: Optional file path to save the stats.
            print_raw: If True, print raw aggregate timings before returning.
        r   Ng        )ÚncallsÚpcallsÚtottimeÚcumtimerl   é   rn   g    eÍÍArm   ro   r/   c                ó   — | d         d         S )Nrp   ro   r   )Úxs    r!   ú<lambda>z5DynamoProfilerState.generate_pstats.<locals>.<lambda>ò   s   € °!°A´$°y´/€ r#   T)ÚkeyÚreversez 
=== Aggregate Timings (raw) ===z>8ú z>12z
  functionzP--------------------------------------------------------------------------------iè  ú/r_   z>10.2fzms zms  z (r5   r7   zTotal timings: z, unique functions: zSum tottime: r6   zms, Sum cumtime: Úms)Ústreamc              3  ó&   K  — | ]}|d          V — ŒdS )rp   Nr   ©rT   Úss     r!   rV   z6DynamoProfilerState.generate_pstats.<locals>.<genexpr>;  s&   è è € ÐBÐB¨  !¤ÐBÐBÐBÐBÐBÐBr#   c              3  ó&   K  — | ]}|d          V — ŒdS )r   Nr   r{   s     r!   rV   z6DynamoProfilerState.generate_pstats.<locals>.<genexpr><  s&   è è € ÐAÐA¨˜q œtÐAÐAÐAÐAÐAÐAr#   c              3  ó&   K  — | ]}|d          V — ŒdS )é   Nr   r{   s     r!   rV   z6DynamoProfilerState.generate_pstats.<locals>.<genexpr>=  s&   è è € Ð?Ð? a˜Q˜qœTÐ?Ð?Ð?Ð?Ð?Ð?r#   z/Saved pstats to %s. Visualize with: snakeviz %s)$ÚcProfileÚioÚloggingÚpstatsÚ	getLoggerr9   rG   r   r   r
   r   r   r   r   r   r   ÚsortedÚitemsÚprintÚsplitÚlenÚlistÚkeysÚProfileÚenableÚdisableÚStatsÚStringIOÚstatsÚsumÚvaluesÚtotal_callsÚ
prim_callsÚtotal_ttÚ
dump_statsÚinfo)r    rh   ri   r€   r�   r‚   rƒ   ÚlogÚ
aggregatedÚcaller_edgesÚtrt   Úaggr0   ÚedgeÚsorted_itemsÚtotal_cumtimeÚtotal_tottimer   Úlinenor
   rl   rm   rn   ro   Ú
short_fileÚ
stats_dictÚcallersÚdummy_profiler‘   s                                 r!   Úgenerate_pstatsz#DynamoProfilerState.generate_pstats®   sU  € ð 	ˆˆˆØˆ	ˆ	ˆ	ØˆˆˆØˆˆˆà×Ò¥Ñ)Ô)ˆð BDˆ
ð ð 	ð ”ð )	(ñ )	(ˆAØ”:˜qœ}¨a¬kÐ:ˆCà˜*Ð$Ð$àØØ"Ø"ð	#ð #�
˜3‘ð %'�˜SÑ!à˜S”/ˆCØ�ˆMˆMŒM˜QÑˆMˆM‰MØ�	ˆNˆNŒN˜aœl¨SÑ0Ñ0ˆNˆN‰NàÔ"ð 5Ø�H��” Ñ"��‘Ø�I��” !¤,°Ñ"4Ñ4��‘ð Ô Ð,àÔ%ØÔ(Ð-¨AØÔ&Ð,¨"ð�
ð
  \°#Ô%6Ð6Ð6à"#Ø"#Ø#&Ø#&ð	5ð 5�L Ô% jÑ1ð $ CÔ(¨Ô4�Ø�X��” !Ñ#��‘Ø�Y��” 1¤<°#Ñ#5Ñ5��‘ð �Y��” 1¤<°#Ñ#5Ñ5��‘ØÔ&ð (Ø˜�N�N”N aÑ'�N�N‘Nùàñ 	Ý!Ø× Ò Ñ"Ô"Ð(AÐ(AÈ4ðñ ô ˆLõ Ð5Ñ6Ô6Ð6ÝØÐXÐXÐX ÐXÐXÐX¨yÐXÐXÐX¸yÐXÐXÐXÐXñô ð õ �(‰OŒOˆOØˆMØˆMØ6Bð ð Ñ2Ñ-�˜6 9¨sØ˜Xœ�Ø˜Xœ�Ø˜iœ.¨4Ñ/�Ø˜iœ.¨4Ñ/�Ø Ñ(�Ø Ñ(�Ø8;¸x¸¸˜XŸ^š^¨CÑ0Ô0°Ô4Ð4ÈX�
ÝØÐVð ;ð ; 6ÐVð ;ð ;¨wÐVð ;ð ;À'ÐVð ;ð ;Ø ð;ð ;Ø$.ð;ð ;Ø17ð;ð ;ð ;ñô ð ð õ �(‰OŒOˆOÝØZ¥# d¤lÑ"3Ô"3ÐZÐZÍÈZÉÌÐZÐZñô ð õ ØY ÐYÐYÐYÀMÐYÐYÐYÐYñô ð õ ˜×)Ò)Ñ+Ô+Ñ,Ô,ð 		2ð 		2ˆCØ*¨3Ô/ð 2ð 2�
Ø ZÐ/Ð/à"#Ø"#Ø#&Ø#&ð	.ð .�J˜zÑ*ð 02�L Ñ,øð2ð ð 	ð #×(Ò(Ñ*Ô*ð 	ð 	‰HˆC�ØQSˆGØ$0°Ô$5×$;Ò$;Ñ$=Ô$=ð ð Ñ �
˜Dà˜”NØ˜”NØ˜”OØ˜”Oð	'�˜
Ñ#Ð#ð �H”Ø�H”Ø�I”Ø�I”ØðˆJ�s‰OˆOð !×(Ò(Ñ*Ô*ˆØ×ÒÑÔÐØ×ÒÑÔÐØ�”˜]°2·;²;±=´=ÐAÑAÔAˆà ˆŒÝÐBÐB¨j×.?Ò.?Ñ.AÔ.AÐBÑBÔBÑBÔBˆÔÝÐAÐA¨Z×->Ò->Ñ-@Ô-@ÐAÑAÔAÑAÔAˆÔÝÐ?Ð?¨:×+<Ò+<Ñ+>Ô+>Ð?Ñ?Ô?Ñ?Ô?ˆŒàð 	Ø×Ò˜[Ñ)Ô)Ð)Ø�HŠHØAØØñô ð ð ˆr#   Úprofile_fileÚsvg_filec           	     óÊ  — ddl }ddl}ddl}|                     d¦  «        st	          d¦  «         dS |                     d¦  «        st	          d¦  «         dS |€|                     dd¦  «        d         d	z   }	 |                     dd
dddd|g|j        |j        ¬¦  «        }|                     ddd|g|j        |j        |j        ¬¦  «        }|j         	                    ¦   «          | 
                    ¦   «         \  }}	| 
                    ¦   «         \  }}
|j        dk    r&t	          d|
                     ¦   «         › �¦  «         dS |j        dk    r&t	          d|	                     ¦   «         › �¦  «         dS |j                             |¦  «        st	          d|› �¦  «         dS t	          d|› �¦  «         |S # t          $ r}t	          d|› �¦  «         Y d}~dS d}~ww xY w)a{  Generate an SVG call graph from a profile file using gprof2dot and graphviz.

        Args:
            profile_file: Path to the pstats profile file.
            svg_file: Optional path for the output SVG. If not provided, uses
                profile_file with .svg extension.

        Returns:
            Path to the generated SVG file, or None if generation failed.
        r   NÚ	gprof2dotz8gprof2dot not found. Install with: pip install gprof2dotÚdotz3graphviz 'dot' not found. Install graphviz package.ú.rp   z.svgz-frƒ   z"--node-label=total-time-percentagez!--node-label=self-time-percentagez--node-label=total-time)ÚstdoutÚstderrz-Tsvgz-o)Ústdinr®   r¯   zgprof2dot failed: zgraphviz dot failed: zSVG file was not created: zSVG call graph saved to: zFailed to generate SVG: )ÚosÚshutilÚ
subprocessÚwhichr‡   ÚrsplitÚPopenÚPIPEr®   ÚcloseÚcommunicateÚ
returncodeÚdecodeÚpathÚisfileÚ	Exception)r    r¨   r©   r±   r²   r³   r«   r¬   Ú_Údot_errÚgprof2dot_errÚes               r!   Úgenerate_svgz DynamoProfilerState.generate_svgI  sN  € ð 	ˆ	ˆ	ˆ	ØˆˆˆØÐÐÐà�|Š|˜KÑ(Ô(ð 	ÝÐLÑMÔMÐMØ�4à�|Š|˜EÑ"Ô"ð 	ÝÐGÑHÔHÐHØ�4àÐØ#×*Ò*¨3°Ñ2Ô2°1Ô5¸Ñ>ˆHð*	à"×(Ò(àØØØ8Ø7Ø-Ø ðð "”Ø!”ð )ñ ô ˆIð ×"Ò"Ø˜  xÐ0ØÔ&Ø!”Ø!”ð	 #ñ ô ˆCð Ô×"Ò"Ñ$Ô$Ð$ØŸšÑ*Ô*‰JˆAˆwØ(×4Ò4Ñ6Ô6ÑˆAˆ}àÔ# qÒ(Ð(ÝÐC¨=×+?Ò+?Ñ+AÔ+AÐCÐCÑDÔDÐDØ�tàŒ~ Ò"Ð"ÝÐ@¨g¯nªnÑ.>Ô.>Ð@Ð@ÑAÔAÐAØ�tà”7—>’> (Ñ+Ô+ð ÝÐ=°8Ð=Ð=Ñ>Ô>Ð>Ø�tåÐ8¨hÐ8Ð8Ñ9Ô9Ð9ØˆOøåð 	ð 	ð 	ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ø�4�4�4�4�4øøøøð	øøøs+   Á;CF; Å/F; Å9,F; Æ'F; Æ;
G"ÇGÇG"TrÃ   c                óT  — ddl }| j        sdS |                      |d¬¦  «        }t          d¦  «         |j        |_        |                     d¦  «                             ¦   «          |r=t          d|› �¦  «         t          d|› �¦  «         |r|                      |¦  «         dS dS dS )	a#  Print profiler stats to stdout and optionally save to file.

        Args:
            output_file: Optional path to save the pstats profile.
            generate_svg: If True and output_file is provided, also generate an SVG
                call graph using gprof2dot and graphviz.
        r   NT)ri   z!
=== Dynamo Profiler (pstats) ===Ú
cumulativez
Profile saved to: zVisualize with: snakeviz )	ÚsysrG   r§   r‡   r®   ry   Ú
sort_statsÚprint_statsrÃ   )r    rh   rÃ   rÆ   r‘   s        r!   r—   zDynamoProfilerState.dump_stats‘  sØ   € ð 	ˆ
ˆ
ˆ
àŒ|ð 	ØˆFà×$Ò$ [¸DÐ$ÑAÔAˆÝÐ2Ñ3Ô3Ð3Ø”zˆŒØ×Ò˜Ñ&Ô&×2Ò2Ñ4Ô4Ð4àð 	/ÝÐ6¨Ð6Ð6Ñ7Ô7Ð7ÝÐ;¨kÐ;Ð;Ñ<Ô<Ð<àð /Ø×!Ò! +Ñ.Ô.Ð.Ð.Ð.ð	/ð 	/ð/ð /r#   )r   rE   )rJ   r   r   rE   )r   rN   )
r
   r	   r   r	   r   r   rA   r   r   rE   )r   rZ   )r]   r   r   rE   )r   ra   )r   r   )NF)rh   r   ri   r   r   rj   r   )r¨   r	   r©   r   r   r   )NT)rh   r   rÃ   r   r   rE   )r9   r:   r;   r<   rI   rM   rP   rY   r\   r`   rc   rg   r§   rÃ   r—   r   r#   r!   rD   rD   q   s$  € € € € € ØDÐDð2ð 2ð 2ð 2ð$ð $ð $ð $ðð ð ð ð
ð 
ð 
ð 
ð,ð ð ð ð=ð =ð =ð =ð
ð ð ð ð
ð 
ð 
ð 
ð AFðYð Yð Yð Yð Yðx 9=ðFð Fð Fð Fð FðR DHð/ð /ð /ð /ð /ð /ð /r#   rD   )r<   Ú
__future__r   Údataclassesr   Útypingr   r   rƒ   r   r@   rD   r   r#   r!   ú<module>rÌ      s  ððð ð  #Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %ð ð Ø€M€M€Mð ðF
ð F
ð F
ð F
ð F
ñ F
ô F
ñ „ðF
ðR ð#ð #ð #ð #ð #ñ #ô #ñ „ð#ðy/ð y/ð y/ð y/ð y/ñ y/ô y/ð y/ð y/ð y/r#   