§
    K" hðK  ã                   ó¬   — 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
mZ d dlmZ ddlmZ  G d„ d	e¦  «        Z G d
„ dej        ¦  «        ZdS )é    N)ÚOverflowableBufferÚReadOnlyFileBasedBuffer)ÚHTTPRequestParser)Ú	ErrorTaskÚWSGITask)ÚInternalServerErroré   )Ú	wasyncorec                   ó   — e Zd ZdZdS )ÚClientDisconnectedz3Raised when attempting to write to a closed socket.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úJc:\xampp_lite_8_4\www\timesheet\venv\Lib\site-packages\waitress/channel.pyr   r      s   € € € € € Ø=Ð=Ð=Ð=r   r   c                   ó²   — e Zd ZdZeZeZeZ	dZ
dZdZdZdZdZdZdd„Zd„ Zd„ Zd„ Zdd
„Zd„ Zd„ Zd„ Zd„ Zdd„Zdd„Zd„ Zdd„Zdd„Zd„ Zd„ Z d„ Z!d„ Z"dS )ÚHTTPChannelzÌ
    Setting self.requests = [somerequest] prevents more requests from being
    received until the out buffers have been flushed.

    Setting self.requests = [] allows more requests to be received.
    Nr   Fc                 óÀ  — || _         || _        t          |j        ¦  «        g| _        t          j        ¦   «         x| _        | _        |                     t          j
        t          j        ¦  «        | _        t          j        ¦   «         | _        t          j        ¦   «         | _        t$          j                             | ||¬¦  «         d| _        || _        g | _        d S )N)ÚmapT)ÚserverÚadjr   Úoutbuf_overflowÚoutbufsÚtimeÚcreation_timeÚlast_activityÚ
getsockoptÚsocketÚ
SOL_SOCKETÚ	SO_SNDBUFÚsendbuf_lenÚ	threadingÚLockÚrequests_lockÚ	ConditionÚoutbuf_lockr
   Ú
dispatcherÚ__init__Ú	connectedÚaddrÚrequests)Úselfr   Úsockr,   r   r   s         r   r*   zHTTPChannel.__init__8   s±   € ØˆŒØˆŒÝ*¨3Ô+>Ñ?Ô?Ð@ˆŒÝ26´)±+´+Ð=ˆÔ˜TÔ/ØŸ?š?­6Ô+<½fÔ>NÑOÔOˆÔõ 'œ^Ñ-Ô-ˆÔå$Ô.Ñ0Ô0ˆÔåÔ×%Ò% d¨D°cÐ%Ñ:Ô:Ð:ØˆŒØˆŒ	ØˆŒˆˆr   c                 ó   — | j          S )z·
        This method is inserted into the environment of any created task so it
        may occasionally check if the client has disconnected and interrupt
        execution.
        )r+   ©r.   s    r   Úcheck_client_disconnectedz%HTTPChannel.check_client_disconnectedJ   s   € ð ”>Ð!Ð!r   c                 ó,   — | j         p| j        p| j        S ©N)Útotal_outbufs_lenÚ
will_closeÚclose_when_flushedr1   s    r   ÚwritablezHTTPChannel.writableS   s   € ð
 Ô%ÐS¨¬ÐS¸DÔ<SÐSr   c                 óþ   — | j         s| j        }n| j        | j        j        k    r| j        }nd }|                      |¦  «         | j        r| j        sd| _        d| _        | j        r|  	                    ¦   «          d S d S )NFT)
r-   Ú_flush_somer5   r   Ú
send_bytesÚ_flush_some_if_lockableÚ_flush_exceptionr7   r6   Úhandle_close)r.   Úflushs     r   Úhandle_writezHTTPChannel.handle_writeZ   s¤   € ð
 Œ}ð 	ð Ô$ˆEˆEØÔ# t¤xÔ':Ò:Ð:ð
 Ô0ˆEˆEð ˆEà×Ò˜eÑ$Ô$Ð$àÔ"ð 	#¨4Ô+Að 	#Ø&+ˆDÔ#Ø"ˆDŒOàŒ?ð 	 Ø×ÒÑÔÐÐÐð	 ð 	 r   Tc                 óþ   — |rz	  ||¬¦  «        dfS # t           $ r1 | j        j        r| j                             d¦  «         d| _        Y dS t          $ r% | j                             d¦  «         d| _        Y dS w xY wd S )N©Údo_closeFúSocket errorT)FTz"Unexpected exception when flushing)ÚOSErrorr   Úlog_socket_errorsÚloggerÚ	exceptionr6   Ú	Exception)r.   r?   rC   s      r   r=   zHTTPChannel._flush_exceptionz   s´   € Øð 	%ð%Ø˜ xÐ0Ñ0Ô0°%Ð8Ð8øÝð %ð %ð %Ø”8Ô-ð :Ø”K×)Ò)¨.Ñ9Ô9Ð9Ø"&�”à$�}�}Ýð %ð %ð %Ø”×%Ò%Ð&JÑKÔKÐKØ"&�”à$�}�}ð	%øøøð	%ð 	%s   „ ’7A:Á*A:Á9A:c                 ór   — | j         p/| j        p(t          | j        ¦  «        | j        j        k    p| j         S r4   )r6   r7   Úlenr-   r   Úchannel_request_lookaheadr5   r1   s    r   ÚreadablezHTTPChannel.readableŠ   sG   € ð ŒOð &ØÔ&ð&å�4”=Ñ!Ô! D¤HÔ$FÒFð&ð Ô%ð	
ð 	
r   c                 óN  — 	 |                       | j        j        ¦  «        }nK# t          $ r> | j        j        r| j                             d¦  «         |                      ¦   «          Y d S w xY w|r/t          j        ¦   «         | _	        |  
                    |¦  «         d S d| _        d S )NrD   F)Úrecvr   Ú
recv_bytesrE   rF   rG   rH   r>   r   r   Úreceivedr+   )r.   Údatas     r   Úhandle_readzHTTPChannel.handle_readš   s³   € ð	Ø—9’9˜TœXÔ0Ñ1Ô1ˆDˆDøÝð 	ð 	ð 	ØŒxÔ)ð 6Ø”×%Ò% nÑ5Ô5Ð5Ø×ÒÑÔÐàˆFˆFð	øøøð ð 	#Ý!%¤¡¤ˆDÔØ�MŠM˜$ÑÔÐÐÐð #ˆDŒNˆNˆNs   ‚" ¢AA*Á)A*c                 óL  — d| j         _        d}t          |¦  «        }| j        5  | j        d                              |¦  «         | xj        |z  c_        | xj        |z  c_        d| _        |  	                    ¦   «          ddd¦  «         n# 1 swxY w Y   d| j         _
        dS )a  
        Send a 100-Continue header to the client. This is either called from
        receive (if no requests are running and the client expects it) or at
        the end of service (if no more requests are queued and a request has
        been read partially that expects it).
        Fs   HTTP/1.1 100 Continue

éÿÿÿÿTN)ÚrequestÚexpect_continuerK   r(   r   ÚappendÚcurrent_outbuf_countr5   Úsent_continuer:   Ú	completed)r.   Úoutbuf_payloadÚ	num_bytess      r   Úsend_continuezHTTPChannel.send_continue«   sí   € ð (-ˆŒÔ$Ø9ˆÝ˜Ñ'Ô'ˆ	ØÔð 	ð 	ØŒL˜Ô×#Ò# NÑ3Ô3Ð3ØÐ%Ô%¨Ñ2Ð%Ô%ØÐ"Ô" iÑ/Ð"Ô"Ø!%ˆDÔØ×ÒÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð "'ˆŒÔÐÐs   ¥ABÂBÂBc                 ó®  — |sdS | j         5  | j        s| j        r	 ddd¦  «         dS |�r| j        €|                      | j        ¦  «        | _        | j                             |¦  «        }| j        j        r.| j        j        r"| j	        s| j
        s|                      ¦   «          | j        j        rkd| _
        | j        j        sQ| j	                             | j        ¦  «         t          | j	        ¦  «        dk    r| j                             | ¦  «         d| _        |t          |¦  «        k    rn||d…         }|�°ddd¦  «         n# 1 swxY w Y   dS )zh
        Receives input asynchronously and assigns one or more requests to the
        channel.
        FNr	   T)r&   r6   r7   rV   Úparser_classr   rQ   rW   Úheaders_finishedr-   rZ   r^   r[   ÚemptyrX   rK   r   Úadd_task)r.   rR   Úns      r   rQ   zHTTPChannel.received½   s×  € ð ð 	Ø�5àÔð +	 ð +	 ð Œð  $Ô"9ð Øð+	 ð +	 ð +	 ñ +	 ô +	 ð +	 ð +	 ð +	 ð ñ ! Ø”<Ð'Ø#'×#4Ò#4°T´XÑ#>Ô#>�D”LØ”L×)Ò)¨$Ñ/Ô/�ð ”LÔ0ð)àœÔ5ð)ð !œMð)ð !Ô.ð	)ð ×&Ò&Ñ(Ô(Ð(à”<Ô)ð (à).�DÔ&àœ<Ô-ð 7Øœ×,Ò,¨T¬\Ñ:Ô:Ð:å˜tœ}Ñ-Ô-°Ò2Ð2ð
 !œK×0Ò0°Ñ6Ô6Ð6Ø#'�D”Là�˜D™	œ	’>�>ØØ˜A˜B˜B”x�ðC ñ ! ð+	 ð +	 ð +	 ñ +	 ô +	 ð +	 ð +	 ð +	 ð +	 ð +	 ð +	 øøøð +	 ð +	 ð +	 ð +	 ðZ ˆts   ŒE
©DE
Å
EÅEc                 ó6  — | j                              d¦  «        r~	 |                      |¬¦  «         | j        | j        j        k     r| j                              ¦   «          | j                              ¦   «          d S # | j                              ¦   «          w xY wd S ©NFrB   )r(   Úacquirer:   r5   r   Úoutbuf_high_watermarkÚnotifyÚrelease)r.   rC   s     r   r<   z#HTTPChannel._flush_some_if_lockableõ   s¡   € ð Ô×#Ò# EÑ*Ô*ð 	+ð+Ø× Ò ¨(Ð Ñ3Ô3Ð3àÔ)¨D¬HÔ,JÒJÐJØÔ$×+Ò+Ñ-Ô-Ð-àÔ ×(Ò(Ñ*Ô*Ð*Ð*Ð*ø�Ô ×(Ò(Ñ*Ô*Ð*Ð*øøøð	+ð 	+s   œAA; Á;Bc                 ób  — d}d}	 | j         d         }|                     ¦   «         }|dk    rm|                     | j        ¦  «        }|                      ||¬¦  «        }|r1|                     |d¦  «         ||z  }||z  }| xj        |z  c_        nd}nz|dk    °mt          | j         ¦  «        dk    rZ| j                              d¦  «        }	 | 	                    ¦   «          n,# t          $ r | j                             d¦  «         Y nw xY wd}|rn�Œ|rt          j        ¦   «         | _        dS dS )Nr   FTrB   r	   z'Unexpected error when closing an outbuf)r   Ú__len__Úgetr#   ÚsendÚskipr5   rK   ÚpopÚcloserI   rG   rH   r   r   )	r.   rC   ÚsentÚdobreakÚoutbufÚ	outbuflenÚchunkÚnum_sentÚtocloses	            r   r:   zHTTPChannel._flush_some  su  € ð ˆØˆð"	Ø”\ !”_ˆFð ŸšÑ(Ô(ˆIà˜a’-�-ØŸ
š
 4Ô#3Ñ4Ô4�ØŸ9š9 U°X˜9Ñ>Ô>�àð 	Ø—K’K ¨$Ñ/Ô/Ð/Ø Ñ)�IØ˜HÑ$�DØÐ*Ô*¨hÑ6Ð*Ô*Ð*ð #�Gàð ˜a’-�-õ" �t”|Ñ$Ô$ qÒ(Ð(Ø"œl×.Ò.¨qÑ1Ô1�GðYØŸš™œ˜˜øÝ$ð Yð Yð YØœ×-Ò-Ð.WÑXÔXÐXÐXÐXðYøøøð #�Gàð ØñE"	ðH ð 	Ý!%¤¡¤ˆDÔà�4àˆus   ÃC" Ã"$D	ÄD	c                 ób  — | j         5  | j        D ]A}	 |                     ¦   «          Œ# t          $ r | j                             d¦  «         Y Œ>w xY wd| _        d| _        | j                              ¦   «          d d d ¦  «         n# 1 swxY w Y   t          j
                             | ¦  «         d S )Nz.Unknown exception while trying to close outbufr   F)r(   r   rq   rI   rG   rH   r5   r+   ri   r
   r)   )r.   rt   s     r   r>   zHTTPChannel.handle_close3  s  € ØÔð 
	&ð 
	&Øœ,ð ð �ðØ—L’L‘N”N�N�NøÝ ð ð ð Ø”K×)Ò)ØHñô ð ð ð ðøøøð &'ˆDÔ"Ø"ˆDŒNØÔ×#Ò#Ñ%Ô%Ð%ð
	&ð 
	&ð 
	&ñ 
	&ô 
	&ð 
	&ð 
	&ð 
	&ð 
	&ð 
	&ð 
	&øøøð 
	&ð 
	&ð 
	&ð 
	&õ 	Ô×"Ò" 4Ñ(Ô(Ð(Ð(Ð(s1   ˆ
B“(§B¨$AÁBÁAÁ*BÂB	ÂB	c                 ón   — t           j                             | |¦  «         | | j        j        | j        <   dS )zTSee wasyncore.dispatcher

        This hook keeps track of opened channels.
        N)r
   r)   Úadd_channelr   Úactive_channelsÚ_fileno)r.   r   s     r   r{   zHTTPChannel.add_channelA  s4   € õ
 	Ô×(Ò(¨¨sÑ3Ô3Ð3Ø48ˆŒÔ# D¤LÑ1Ð1Ð1r   c                 ó~   — | j         }t          j                             | |¦  «         | j        j        }||v r||= dS dS )zTSee wasyncore.dispatcher

        This hook keeps track of closed channels.
        N)r}   r
   r)   Údel_channelr   r|   )r.   r   ÚfdÚacs       r   r   zHTTPChannel.del_channelI  sI   € ð
 Œ\ˆÝÔ×(Ò(¨¨sÑ3Ô3Ð3ØŒ[Ô(ˆà�ˆ8ˆ8Ø�2���ð ˆ8r   c                 óŠ  — | j         st          ‚|�r±| j        5  |                      ¦   «          | j         st          ‚t	          |¦  «        }t          |t          ¦  «        rU| j                             |¦  «         t          | j
        j        ¦  «        }| j                             |¦  «         d| _        n| j        | j
        j        k    r:t          | j
        j        ¦  «        }| j                             |¦  «         d| _        | j        d                              |¦  «         | xj        |z  c_        | xj        |z  c_        | j        | j
        j        k    rQ|                      | j        d¬¦  «        \  }}|s|r| j        | j
        j        k    r| j                             ¦   «          d d d ¦  «         n# 1 swxY w Y   |S dS )Nr   rU   FrB   )r+   r   r(   Ú#_flush_outbufs_below_high_watermarkrK   Ú
isinstancer   r   rX   r   r   r   rY   rh   r5   r;   r=   r:   r   Úpull_trigger)r.   rR   r]   ÚnextbufÚflushedrH   s         r   Ú
write_soonzHTTPChannel.write_soonY  s  € ØŒ~ð 	%õ %Ð$àñ '	ð Ô!ð "3ð "3Ø×8Ò8Ñ:Ô:Ð:à”~ð -Ý,Ð,Ý ™IœI�	å˜dÕ$;Ñ<Ô<ð ;à”L×'Ò'¨Ñ-Ô-Ð-Ý0°´Ô1IÑJÔJ�GØ”L×'Ò'¨Ñ0Ô0Ð0Ø01�DÔ-Ð-àÔ0°D´HÔ4RÒRÐRõ #5°T´XÔ5MÑ"NÔ"N˜Øœ×+Ò+¨GÑ4Ô4Ð4Ø45˜Ô1Ø”L Ô$×+Ò+¨DÑ1Ô1Ð1ØÐ-Ô-°Ñ:Ð-Ô-ØÐ&Ô&¨)Ñ3Ð&Ô&àÔ)¨T¬XÔ-@Ò@Ð@Ø+/×+@Ò+@ØÔ(°5ð ,Añ ,ô ,Ñ(�W˜ið
 "ð3à&ð3ð  Ô1°T´XÔ5HÒHÐHàœ×0Ò0Ñ2Ô2Ð2ðE"3ð "3ð "3ñ "3ô "3ð "3ð "3ð "3ð "3ð "3ð "3øøøð "3ð "3ð "3ð "3ðH Ðàˆqs   ™FF6Æ6F:Æ=F:c                 ó
  — | j         | j        j        k    rí| j        5  |                      | j        d¬¦  «        \  }}|r@| j                             ¦   «          | j                             ¦   «          	 d d d ¦  «         d S | j	        rc| j         | j        j        k    rN| j                             ¦   «          | j                             ¦   «          | j	        r| j         | j        j        k    °Nd d d ¦  «         d S # 1 swxY w Y   d S d S rf   )
r5   r   rh   r(   r=   r:   r   r…   Úwaitr+   )r.   Ú_rH   s      r   rƒ   z/HTTPChannel._flush_outbufs_below_high_watermarkŠ  sr  € ð Ô! D¤HÔ$BÒBÐBØÔ!ð ,ð ,Ø!%×!6Ò!6°tÔ7GÐRWÐ!6Ñ!XÔ!X‘��Iàð ð ”K×,Ò,Ñ.Ô.Ð.ØÔ$×)Ò)Ñ+Ô+Ð+àð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ”Nð,àÔ.°´Ô1OÒOÐOà”K×,Ò,Ñ.Ô.Ð.ØÔ$×)Ò)Ñ+Ô+Ð+ð	 ”Nð,àÔ.°´Ô1OÒOÐOð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,ð ,ð CÐBs   �AC6Á?A*C6Ã6C:Ã=C:c                 ó|  — | j         d         }|j        r|                      | |¦  «        }n|                      | |¦  «        }	 | j        r|                     ¦   «          nd|_        �nJ# t          $ r2 | j         	                    d|j
        j        z  ¦  «         d|_        Y �nt          $ �r | j                             d|j
        j        z  ¦  «         |j        sÊ| j        j        rt#          j        ¦   «         }nd}|j        }|j        }|                      | j        ¦  «        }t-          |¦  «        |_        ||_        	 |d         |j        d<   n# t.          $ r Y nw xY w|                      | |¦  «        }	 |                     ¦   «          n# t          $ r
 d|_        Y nw xY wd|_        Y nw xY w|j        rL| j        5  d| _        | j         D ]}|                     ¦   «          Œg | _         ddd¦  «         n# 1 swxY w Y   nÿt7          | j         ¦  «        dk    r|                      ¦   «          | j        dk    r| j        j        | _        |                     ¦   «          | j        5  | j                              d¦  «         | j        r"| j         r| j          !                    | ¦  «         nA| j        r:| j
        �3| j
        j"        r'| j
        j#        r| j$        s|  %                    ¦   «          ddd¦  «         n# 1 swxY w Y   | j        r| j          &                    ¦   «          tO          j'        ¦   «         | _(        dS )	z]Execute one request. If there are more, we add another task to the
        server at the end.r   Tz$Client disconnected while serving %szException while serving %sz:The server encountered an unexpected internal server errorÚ
CONNECTIONNr	   ))r-   ÚerrorÚerror_task_classÚ
task_classr+   ÚserviceÚclose_on_finishr   rG   ÚinforV   ÚpathrI   rH   Úwrote_headerr   Úexpose_tracebacksÚ	tracebackÚ
format_excÚversionÚheadersr`   r   ÚKeyErrorr&   r7   rq   rK   rƒ   rY   rh   rp   r   rc   rW   ra   rZ   r^   r…   r   r   )r.   rV   ÚtaskÚbodyÚreq_versionÚreq_headersÚerr_requests          r   r‘   zHTTPChannel.service¡  sü  € ð ”- Ô"ˆàŒ=ð 	2Ø×(Ò(¨¨wÑ7Ô7ˆDˆDà—?’? 4¨Ñ1Ô1ˆDð!	,ØŒ~ð ,Ø—’‘”��à'+�Ô$ùøÝ!ð 	(ð 	(ð 	(ØŒK×ÒÐCÀdÄlÔFWÑWÑXÔXÐXØ#'ˆDÔ Ð Ñ Ýð 	,ñ 	,ð 	,ØŒK×!Ò!Ð">ÀÄÔARÑ"RÑSÔSÐSàÔ$ð ,Ø”8Ô-ð XÝ$Ô/Ñ1Ô1�D�DàW�DØ%œo�Ø%œo�Ø"×/Ò/°´Ñ9Ô9�Ý$7¸Ñ$=Ô$=�Ô!ð '2�Ô#ðØ8CÀLÔ8Q�KÔ'¨Ñ5Ð5øÝð ð ð Ø�Dðøøøà×,Ò,¨T°;Ñ?Ô?�ð0Ø—L’L‘N”N�N�NøÝ)ð 0ð 0ð 0Ø+/�DÔ(Ð(Ð(ð0øøøð (,�Ô$øøð3	,øøøð6 Ôð .	)ØÔ#ð #ð #Ø*.�Ô'à#œ}ð $ð $�GØ—M’M‘O”O�O�OØ "�”ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #øõ �4”=Ñ!Ô! AÒ%Ð%Ø×8Ò8Ñ:Ô:Ð:ð Ô(¨1Ò,Ð,Ø,0¬HÔ,J�Ô)à�MŠM‰OŒOˆOð Ô#ð )ð )Ø”×!Ò! !Ñ$Ô$Ð$à”>ð ) d¤mð )Ø”K×(Ò(¨Ñ.Ô.Ð.Ð.à”Nð
)àœÐ0ØœÔ4ð 1àœÔ5ð 1ð !Ô.ð 1ð ×&Ò&Ñ(Ô(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð" Œ>ð 	'ØŒK×$Ò$Ñ&Ô&Ð&å!œY™[œ[ˆÔÐÐs†   Á#A( Á(8F/Â#BF/ÅEÅF/Å
EÅF/ÅEÅF/Å9FÆF/ÆF"ÆF/Æ!F"Æ"
F/Æ.F/Ç -G9Ç9G=È G=É(BK9Ë9K=Ì K=c                 ó`   — d| _         d| _        t          j        ¦   «         | _        g | _        dS )z%Cancels all pending / active requestsTFN)r6   r+   r   r   r-   r1   s    r   ÚcancelzHTTPChannel.cancel  s)   € àˆŒØˆŒÝ!œY™[œ[ˆÔØˆŒˆˆr   r4   )T)#r   r   r   r   r   r�   r   r�   r   r`   rV   r   r6   r7   rZ   r5   rY   r*   r2   r8   r@   r=   rM   rS   r^   rQ   r<   r:   r>   r{   r   rˆ   rƒ   r‘   r¢   r   r   r   r   r      s�  € € € € € ðð ð €JØ ÐØ$€Lð €GØ€MØ€JØÐØ€MØÐØÐðð ð ð ð$"ð "ð "ðTð Tð Tð ð  ð  ð@%ð %ð %ð %ð 
ð 
ð 
ð #ð #ð #ð"'ð 'ð 'ð$6ð 6ð 6ðp+ð +ð +ð +ð/ð /ð /ð /ðb)ð )ð )ð9ð 9ð 9ð 9ð
ð 
ð 
ð 
ð /ð /ð /ðb,ð ,ð ,ð.a)ð a)ð a)ðFð ð ð ð r   r   )r    r$   r   r—   Úwaitress.buffersr   r   Úwaitress.parserr   Úwaitress.taskr   r   Úwaitress.utilitiesr   Ú r
   rI   r   r)   r   r   r   r   ú<module>r¨      s  ðð €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð à HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ -Ð -Ð -Ð -Ð -Ð -Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2à Ð Ð Ð Ð Ð ð>ð >ð >ð >ð >˜ñ >ô >ð >ðjð jð jð jð j�)Ô&ñ jô jð jð jð jr   