
    h|X                        U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZ d dlZd dlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: ej;        dk    rd dl Z<nd dl<Z<dZ=dZ>ee?         e@d<    ejA        ddd           G d d                      ZB G d de:          ZCdS )    N)AnyFinalIterableOptionalTupleUnioncast)CIMultiDict   )hdrs)WebSocketDataQueue)DEFAULT_LIMIT)AbstractStreamWriter)WSMessageTypeError)calculate_timeout_whenset_exception
set_result)WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWS_KEYWebSocketErrorWebSocketReaderWebSocketWriterWSCloseCode	WSMessage	WSMsgType
ws_ext_genws_ext_parse)_INTERNAL_RECEIVE_TYPES)	ws_logger)	EofStream)JSONDecoderJSONEncoder)HTTPBadRequestHTTPException)BaseRequest)StreamResponse)      )WebSocketResponseWebSocketReadyr      THRESHOLD_CONNLOST_ACCESST)auto_attribsfrozenslotsc                   <    e Zd ZU eed<   ee         ed<   defdZdS )r+   okprotocolreturnc                     | j         S N)r2   selfs    P/var/www/html/prod/cognitive/venv/lib/python3.11/site-packages/aiohttp/web_ws.py__bool__zWebSocketReady.__bool__:   s	    w    N)__name__
__module____qualname__bool__annotations__r   strr:    r;   r9   r+   r+   5   sJ         HHHsm$      r;   r+   c                       e Zd ZU dZeed<   dZee         ed<   dZ	ee
         ed<   dZee         ed<   dZeed<   dZeed<   d	Zeed
<   dZee         ed<   dZeej                 ed<   dZeed<   dZeej        d                  ed<   dZee         ed<   dZeed<   dZeej                 ed<   dZeej                 ed<   dZeej         d                  ed<   dddddddde!d	dedee         dededee         de"e         d ed!ed"ed#df fd$Z#d`d%Z$d`d&Z%d`d'Z&d`d(Z'dad+Z(d`d,Z)d-ed#dfd.Z*d`d/Z+d0e,d#e-f fd1Z.d0e,d#e/d2ee         eef         fd3Z0d0e,d#e/ee         e
f         fd4Z1d0e,d5ee         d6e
d#dfd7Z2d0e,d#e3fd8Z4e5d#efd9            Z6e5d#ee         fd:            Z7e5d#ee         fd;            Z8e5d#e9eef         fd<            Z:dbd=ed>e;d#e;fd?Z<d#ee         fd@Z=dcdBe>d#dfdCZ?dcdBe>d#dfdDZ@	 dbdBe>dEeAd ee         d#dfdFZBdbdGed ee         d#dfdHZCdbdGe>d ee         d#dfdIZD	 dbeEjF        dJdGe;d ee         dKeGd#dfdLZHd`dMZIeJjK        dAddNdOedBe>dPed#efdQZLdOeJd#dfdRZMdOeJd#dfdSZNd`dTZOdbdee         d#ePfdUZQddVdee         d#efdWZRddVdee         d#e>fdXZSeEjT        ddYdZeUdee         d#e;fd[ZVdGe>d#dfd\ZWddd]ZXd#ePfd^ZYd-ed#dfd_ZZ xZ[S )er*   F_length_checkN_ws_protocol_writer_reader_closed_closingr   
_conn_lost_close_code_loop_waiting_close_wait
_exceptiong        _heartbeat_when_heartbeat_cb_pong_response_cb
_ping_taskg      $@TrB   i  @ )	timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizewriter_limitrT   rU   rV   rW   rX   rY   rZ   r[   r\   r4   c       	             t                                          d           || _        || _        || _        || _        || _        || _        |
|dz  | _        || _	        || _
        |	| _        d S )Ne   )statusg       @)super__init__
_protocols_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_pong_heartbeat	_compress_max_msg_size_writer_limit)r8   rT   rU   rV   rW   rX   rY   rZ   r[   r\   	__class__s             r9   ra   zWebSocketResponse.__init__Q   sz     	$$$# /#!# #,s?D +3))r;   c                     |                                   | j         | j                                         d | _        | j        "| j                                         d | _        d S d S r6   )_cancel_pong_response_cbrQ   cancelrS   r7   s    r9   _cancel_heartbeatz#WebSocketResponse._cancel_heartbeatk   si    %%''')%%'''!%D?&O""$$$"DOOO '&r;   c                 X    | j         "| j                                          d | _         d S d S r6   )rR   ro   r7   s    r9   rn   z*WebSocketResponse._cancel_pong_response_cbt   s6    !-"))+++%)D""" .-r;   c                 8   | j         d S |                                  | j        }||j        j        nd}| j        }|J |                                }t          || j         |          }|| _        | j	        "|
                    || j                  | _	        d S d S )Nr,   )rg   rn   _req	_protocol_timeout_ceil_thresholdrL   timer   rP   rQ   call_at_send_heartbeat)r8   reqtimeout_ceil_thresholdloopnowwhens         r9   _reset_heartbeatz"WebSocketResponse._reset_heartbeaty   s    ?"F%%'''i58_CM11! 	 ziikk%c4?<RSS#% "&dD4H!I!ID &%r;   c                    d | _         | j        }|| j        J |                                }|| j        k     r'|                    | j        | j                  | _         d S | j        }||j        j	        nd}t          || j        |          }|                                  |                    || j                  | _        | j                            dt           j                  }t$          j        dk    rt)          j        ||d          }n|                    |          }|                                s#|| _        |                    | j                   d S |                     |           d S )Nr,   r;   )r(      T)r{   eager_start)rQ   rL   rF   rv   rP   rw   rx   rs   rt   ru   r   rh   rn   _pong_not_receivedrR   
send_framer   PINGsysversion_infoasyncioTaskcreate_taskdonerS   add_done_callback_ping_task_done)r8   r{   r|   ry   rz   r}   coro	ping_tasks           r9   rx   z!WebSocketResponse._send_heartbeat   sj   !zDL$<$<<iikk%%%!%$d&:" "D Fi58_CM11! 	 &c4+?AWXX%%'''!%dD4K!L!L|&&sIN;;w&&  T$GGGII((..I~~ 	,'DO''(<=====  +++++r;   taskasyncio.Task[None]c                     |                                 s+|                                x}r|                     |           d| _        dS )z*Callback for when the ping task completes.N)	cancelled	exception_handle_ping_pong_exceptionrS   )r8   r   excs      r9   r   z!WebSocketResponse._ping_task_done   sI    ~~ 	2DNN,<,<%<S 	2,,S111r;   c                     | j         >| j         j        4|                     t          j        d| j         d                     d S d S d S )NzNo PONG received after z seconds)rs   	transportr   r   TimeoutErrorrh   r7   s    r9   r   z$WebSocketResponse._pong_not_received   se    9 TY%8%D,,$Ld.BLLL      ! %D%Dr;   r   c                 *   | j         rdS |                                  |                     t          j                   || _        | j        rD| j        s?| j        :| j        	                    t          t          j        |d          d           dS dS dS dS )z5Handle exceptions raised during ping/pong processing.Nr   )rH   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErO   rM   rI   rG   	feed_datar   r   ERRORr8   r   s     r9   r   z-WebSocketResponse._handle_ping_pong_exception   s    < 	F&&{'CDDD= 	M 	M4<3KL""9Y_c4#H#H!LLLLL	M 	M 	M 	M3K3Kr;   c                 <    d| _         |                                  dS )zdSet the connection to closed.

        Cancel any heartbeat timers and set the closed flag.
        TN)rH   rp   r7   s    r9   r   zWebSocketResponse._set_closed   s#    
      r;   requestc                   K   | j         | j         S |                     |          \  }}t                                          |           d {V }|J |                     |||           |                                 d {V  |S r6   )_payload_writer
_pre_startr`   prepare_post_startdrain)r8   r   r3   writerpayload_writerrl   s        r9   r   zWebSocketResponse.prepare   s      +''??733&$www77777777)))(F333""$$$$$$$$$r;   zCIMultiDict[str]c                 |   |j         }d|                    t          j        d                                                                          k    r@t          d                    |                    t          j                                      d|                    t          j        d                                          vr@t          d                    |                    t          j                                      d }t          j	        |v rbd |t          j	                 
                    d          D             }|D ]}|| j        v r|} n"t          j        d	|j        || j                   |                    t          j        d          }|d
vrt          d|           |                    t          j                  }	 |r%t#          t%          j        |                    dk    rt          d|          n'# t(          j        $ r t          d|          d w xY wt%          j        t/          j        |                                t4          z                                                                                       }t;          t          j        dt          j        dt          j        |i          }	d}
d}| j        rV|                    t          j                   }tC          |d          \  }}
|r!tE          |d|
          }||	t          j         <   |r||	t          j	        <   |	|||
fS )N	websocket z@No WebSocket UPGRADE hdr: {}
 Can "Upgrade" only to "WebSocket".)textupgradezNo CONNECTION upgrade hdr: {}c                 P    g | ]#}t          |                                          $S rB   )rA   strip).0protos     r9   
<listcomp>z0WebSocketResponse._handshake.<locals>.<listcomp>   s8        EKKMM""  r;   ,u<   %s: Client protocols %r don’t overlap server-known ones %r)1387zUnsupported version:    zHandshake error: Fr   T)isserver)rZ   r   server_notakeover)#headersgetr   UPGRADElowerr   r$   format
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitrb   r    warningremoteSEC_WEBSOCKET_VERSIONSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder
   SEC_WEBSOCKET_ACCEPTri   SEC_WEBSOCKET_EXTENSIONSr   r   )r8   r   r   r3   req_protocolsr   versionkey
accept_valresponse_headers
notakeoverrZ   
extensions
enabledexts                 r9   
_handshakezWebSocketResponse._handshake   sl    /'++dlB77==??EEGGGG 5&T\2233	    GKK<<BBDDDD 4;;KK00     #'&'11 $T%@AGGLL  M
 '  DO++$HE ,
 !RN!O	   ++d8"==*** &Gg&G&GHHHH kk$011	M G#f.s3344::$*Ec*E*EFFFF ;~ 	M 	M 	M &A#&A&ABBBL	M %L.//6688
 

&(( 	 'k):
 
 
> 		M T%BCCJ $0
T#J#J#J Hj M'%
  
 CM !>? 	E<DT89	
 	
s   :H $H,c                 F   |j         | _         |                     |          \  }}}}|                     d           | j                            |           |                                  || _        |j        j        }|J t          |j        |||| j
                  }||fS )Nr^   )rZ   r   limit)rL   r   
set_statusr   updateforce_closeri   rt   r   r   rk   )r8   r   r   r3   rZ   r   r   r   s           r9   r   zWebSocketResponse._pre_start3  s    ]
26//'2J2J/8ZG$$$!%/	$$$ !$
 
 
 r;   r3   r   c           	      X   || _         || _        |                                  | j        }|J t	          |j        d|          | _        |j                            t          | j        | j
        t          | j                                       |j                            d           d S )Ni   )r{   rZ   F)rE   rF   r~   rL   r   rt   rG   r3   
set_parserr   rj   r?   ri   
keep_alive)r8   r   r3   r   r{   s        r9   r   zWebSocketResponse._post_startH  s     %z)'*;UNNN##d04;O;O  	
 	
 	
 	##E*****r;   c                     | j         t          d          	 |                     |          \  }}}}t          d|          S # t          $ r t          dd           cY S w xY w)NzAlready startedTF)rF   RuntimeErrorr   r+   r%   )r8   r   _r3   s       r9   can_preparezWebSocketResponse.can_prepare[  s}    <#0111	2 $ 8 8AxA "$111  	/ 	/ 	/!%.....	/s   A AAc                     | j         S r6   )rH   r7   s    r9   closedzWebSocketResponse.closede  s
    |r;   c                     | j         S r6   )rK   r7   s    r9   
close_codezWebSocketResponse.close_codei  s    r;   c                     | j         S r6   )rE   r7   s    r9   ws_protocolzWebSocketResponse.ws_protocolm  s      r;   c                     | j         S r6   )ri   r7   s    r9   rZ   zWebSocketResponse.compressq  s
    ~r;   namedefaultc                 Z    | j         }||S |j        }||S |                    ||          S )z}Get optional transport information.

        If no value associated with ``name`` is found, ``default`` is returned.
        )rF   r   get_extra_info)r8   r   r   r   r   s        r9   r   z WebSocketResponse.get_extra_infou  s>    
 >N$	N''g666r;   c                     | j         S r6   )rO   r7   s    r9   r   zWebSocketResponse.exception  s
    r;   r;   messagec                    K   | j         t          d          | j                             |t          j                   d {V  d S NCall .prepare() first)rF   r   r   r   r   r8   r   s     r9   pingzWebSocketResponse.ping  sO      <6777l%%gy~>>>>>>>>>>>r;   c                    K   | j         t          d          | j                             |t          j                   d {V  d S r   )rF   r   r   r   PONGr   s     r9   pongzWebSocketResponse.pong  sO      <6777l%%gy~>>>>>>>>>>>r;   opcodec                 z   K   | j         t          d          | j                             |||           d{V  dS )z Send a frame over the websocket.Nr   )rF   r   r   )r8   r   r   rZ   s       r9   r   zWebSocketResponse.send_frame  sQ       <6777l%%gvx@@@@@@@@@@@r;   datac                   K   | j         t          d          t          |t                    st	          dt          |          z            | j                             |                    d          t          j	        |           d {V  d S )Nr   zdata argument must be str (%r)zutf-8r   )
rF   r   
isinstancerA   	TypeErrortyper   r   r   TEXTr8   r  rZ   s      r9   send_strzWebSocketResponse.send_str  s      <6777$$$ 	K<tDzzIJJJl%%KK  ).8 & 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r;   c                   K   | j         t          d          t          |t          t          t
          f          st          dt          |          z            | j                             |t          j
        |           d {V  d S )Nr   z#data argument must be byte-ish (%r)r   )rF   r   r  bytes	bytearray
memoryviewr  r  r   r   BINARYr  s      r9   
send_byteszWebSocketResponse.send_bytes  s      <6777$	: >?? 	PADJJNOOOl%%dI,<x%PPPPPPPPPPPr;   )dumpsr  c                V   K   |                       ||          |           d {V  d S )Nr   )r  )r8   r  rZ   r  s       r9   	send_jsonzWebSocketResponse.send_json  s>       mmEE$KK(m;;;;;;;;;;;r;   c                    K   | j         rd S | j        t          d          |                                  d {V  d| _         d S )NzResponse has not been startedT)	_eof_sentr   r   closer7   s    r9   	write_eofzWebSocketResponse.write_eof  sX      > 	F'>???jjllr;   )coder   r   r  r   c                  K   | j         t          d          | j        rdS |                                  	 | j                             ||           d{V  | j        }|J |r|                                 d{V  nx# t          j        t          j	        f$ r! | 
                    t          j                    t          $ r1}|| _        | 
                    t          j                   Y d}~dS d}~ww xY w| j        }|J | j        rX| j        J | j        J | j                                        | _        |                    t*          d           | j         d{V  | j        r|                                  dS 	 t1          j        | j                  4 d{V  	 |                                 d{V }|j        t:          j        u r.| 
                    |j                   	 ddd          d{V  dS \# 1 d{V swxY w Y   dS # t          j        $ r! | 
                    t          j                    t          $ r1}|| _        | 
                    t          j                   Y d}~dS d}~ww xY w)zClose websocket connection.Nr   FTr   ) rF   r   rH   r   r  r   r   r   CancelledErrorr   r   r   r   	ExceptionrO   rG   rM   rL   rN   create_futurer   r   rI   _close_transportasync_timeoutrT   rc   readr  r   CLOSEr  )r8   r  r   r   r   r   readermsgs           r9   r  zWebSocketResponse.close  sv      <6777< 	5	,$$T7333333333)F%%% %llnn$$$$$$$&(<= 	 	 	**;+GHHH 	 	 	!DO**;+GHHH44444	
 !!! = 	#:)))#+++#z7799D/333""""""""= 	!!###4	$,T];; $ $ $ $ $ $ $ $$ &------Cx9?2266sx@@@#$ $ $ $ $ $ $ $ $ $ $ $ $ $$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % 	 	 	**;+GHHH 	 	 	!DO**;+GHHH44444	s\   AB   AC5&C00C5 H A
G=)H <G==
HH 
HH 8I9&I44I9c                 J    d| _         || _        |                                  dS )z6Set the close code and mark the connection as closing.TN)rI   rK   rp   r8   r  s     r9   _set_closingzWebSocketResponse._set_closing  s)         r;   c                 <    || _         |                                  dS )z+Set the close code and close the transport.N)rK   r  r"  s     r9   r   z+WebSocketResponse._set_code_close_transport  s"    r;   c                 p    | j         ,| j         j        "| j         j                                         dS dS dS )zClose the transport.N)rs   r   r  r7   s    r9   r  z"WebSocketResponse._close_transport  s?    9 TY%8%DI%%''''' ! %D%Dr;   c                    K   | j         t          d          |p| j        }	 | j        rt          d          | j        r6| xj        dz  c_        | j        t          k    rt          d          t          S | j        rt          S 	 d| _        	 |r^t          j        |          4 d {V  | j                                          d {V }d d d           d {V  n# 1 d {V swxY w Y   n| j                                          d {V }|                                  d| _        | j        rt          | j        d            n)# d| _        | j        rt          | j        d            w w xY wn,# t           j        $ r  t$          $ rI t&          j        | _        |                                  d {V  t/          t0          j        d d           cY S t4          $ rR}|j        | _        |                     |j                   d {V  t/          t0          j        |d           cY d }~S d }~wt:          $ re}|| _        |                     t&          j                    |                                  d {V  t/          t0          j        |d           cY d }~S d }~ww xY w|j!        tD          vr|S |j!        t0          j#        u rE|                     |j$                   | j        s#| j%        r|                     d           d {V  n|j!        t0          j&        u r |                     t&          j                   nX|j!        t0          j'        u r)| j(        r"| )                    |j$                   d {V  P|j!        t0          j*        u r	| j(        rl|S )	Nr   Tz+Concurrent call to receive() is not allowedr   zWebSocket connection is closed.F)r  )r   )+rG   r   rd   rM   rH   rJ   r-   r   rI   r   r  rT   r  r~   rN   r   r   r   r!   r   OKrK   r  r   r   CLOSEDr   r  r   r  rO   r#  r   r  r   r  r  re   CLOSINGr   rf   r   r   )r8   rT   rU   r   r   s        r9   receivezWebSocketResponse.receive  s     <6777!:T%:C	} R"#PQQQ| *1$?&???&'HIII(( *))= $;& 8
 $1#8#I#I < < < < < < < <(,(9(9(;(;";";";";";";C< < < < < < < < < < < < < < < < < < < < < < < < < < < %)L$5$5$7$7777777))+++$)DM' ;"4#3T::: %*DM' ;"4#3T::::;'    ? ? ?#.> jjll""""""" !14>>>>>! = = =#&8 jjchj///////// #t<<<<<<<< = = ="%!!+">???jjll""""""" #t<<<<<<<<	= x666 
x9?**!!#(+++| 2 2
 **5*111111111Y...!!+.1111Y^+++ii)))))))))Y^+++Jsu   E/ E ) C	E 
C%%E (C%)7E  $E/ &E**E/ /AJ	JAH& J&J3AJJJrT   c                   K   |                      |           d {V }|j        t          j        ur t	          d|j         d|j        d          t          t          |j                  S )NReceived message :z is not WSMsgType.TEXT)r*  r  r   r  r   r  r	   rA   r8   rT   r   s      r9   receive_strzWebSocketResponse.receive_strK  sx      LL))))))))89>))$QCHQQsxQQQ   C"""r;   c                   K   |                      |           d {V }|j        t          j        ur t	          d|j         d|j        d          t          t          |j                  S )Nr-  r.  z is not WSMsgType.BINARY)r*  r  r   r  r   r  r	   r
  r/  s      r9   receive_byteszWebSocketResponse.receive_bytesS  sy      LL))))))))89+++$SCHSSsxSSS   E38$$$r;   )loadsrT   r3  c                T   K   |                      |           d {V } ||          S )Nr+  )r0  )r8   r3  rT   r  s       r9   receive_jsonzWebSocketResponse.receive_json[  s>       %%g%66666666uT{{r;   c                 $   K   t          d          )Nz"Cannot call .write() for websocket)r   )r8   r  s     r9   writezWebSocketResponse.writea  s      ?@@@r;   c                     | S r6   rB   r7   s    r9   	__aiter__zWebSocketResponse.__aiter__d  s    r;   c                    K   |                                   d {V }|j        t          j        t          j        t          j        fv rt          |S r6   )r*  r  r   r  r)  r(  StopAsyncIteration)r8   r   s     r9   	__anext__zWebSocketResponse.__anext__g  sL      LLNN""""""8	):I<LMMM$$
r;   c                 x    d| _         |                                  | j        t          | j        |           d S d S )NT)rI   rp   rG   r   r   s     r9   _cancelzWebSocketResponse._cancelm  sE        <#$,,,,,, $#r;   )r4   N)r   r   r4   Nr6   )r;   )r4   r*   )\r<   r=   r>   rD   r?   r@   rE   r   rA   rF   r   rG   r   rH   rI   rJ   intrK   rL   r   AbstractEventLooprM   rN   FuturerO   BaseExceptionrP   floatrQ   TimerHandlerR   rS   r   r   r   ra   rp   rn   r~   rx   r   r   r   r   r&   r   r   r   r   r   r   r+   r   propertyr   r   r   r   rZ   r   r   r   r
  r   r   r   r   r  r  jsonr  r#   r  r  r   r'  r  r#  r   r  r   r*  r0  r2  r3  r"   r5  r7  r9  r<  r>  __classcell__)rl   s   @r9   r*   r*   >   s;        M4"&L(3-&&&)-GXo&---,0GX()000GTHdJ!%K#%%%15E8G-.555Hd26K'../666*.J'... OU   37M8G/07777;x 34;;;/3Jd+,333
 +/%)#%+)* * * * "%	*
 * * E?* C=* * * * 
* * * * * *4# # # #* * * *
J J J J*!, !, !, !,F      M} M M M M M! ! ! !
[ 
5I 
 
 
 
 
 
T
"T
	!8C=#t;	<T
 T
 T
 T
l +  %8V2W        *+"+.6sm+ET+	+ + + +&2; 2> 2 2 2 2     X  HSM       X  !Xc] ! ! ! X! %T	*    X7 73 7 7 7 7 7 78M2    ? ?% ?$ ? ? ? ?
? ?% ?$ ? ? ? ? LPA AA&/A;CC=A	A A A A
 
3 
(3- 
4 
 
 
 
Q QU Qhsm Qt Q Q Q Q #'<
 "Z< < << 3-<
 < 
< < < <    )^cQU5 5 556;5JN5	5 5 5 5n! ! ! ! ! ! k  d        
( ( ( (
H HXe_ H	 H H H HT ?C # # #HUO #s # # # # AE % % %huo % % % % % '+jT  #;CE?	   A A$ A A A A       -= -T - - - - - - - -r;   r*   )Dr   r   r   r   rF  r   typingr   r   r   r   r   r   r	   attr	multidictr
   r   r   _websocket.readerr   _websocket.writerr   abcr   client_exceptionsr   helpersr   r   r   httpr   r   r   r   r   r   r   r   r   r   r   http_websocketr   logr    streamsr!   typedefsr"   r#   web_exceptionsr$   r%   web_requestr&   web_responser'   r   r  __all__r-   r?  r@   sr+   r*   rB   r;   r9   <module>rZ     s        



 E E E E E E E E E E E E E E E E E E  ! ! ! ! ! !       1 1 1 1 1 1 , , , , , , % % % % % % 1 1 1 1 1 1 F F F F F F F F F F                          4 3 3 3 3 3             . . . . . . . . 9 9 9 9 9 9 9 9 $ $ $ $ $ $ ( ( ( ( ( (w##### )* 5: ) ) ) T$d333       43u- u- u- u- u- u- u- u- u- u-r;   