
    jRN                    ~   d dl mZ 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	Z	d dl
m
Z
 d dlmZ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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m Z m!Z! d dl"m#Z#m$Z$m%Z%  G d d          Z& G d de&          Z' G d de&          Z( G d de&          Z) G d de&          Z*ej+        e,e-e.f         Z/ej0        e/         Z1ej2        e/         Z3ej+        e3e1f         Z4 G d de&          Z5 G d de6          Z7 G d de6          Z8 ej9        d          Z: G d d e&          Z;dS )!    )annotationsN)datetime)format_datetime
formatdate)partial)
guess_type)	token_hex)quote)md5_hexdigest)BackgroundTask)iterate_in_threadpool)URLHeadersMutableHeaders)ReceiveScopeSendc                      e Zd ZdZdZ	 	 	 	 	 d1d2dZd3dZd4d5dZed6d            Z		 	 	 	 	 	 	 	 d7d8d(Z
	 	 	 	 	 d9d:d)Zd;d0ZdS )<ResponseNutf-8   content
typing.Anystatus_codeintheaderstyping.Mapping[str, str] | None
media_type
str | None
backgroundBackgroundTask | NonereturnNonec                    || _         ||| _        || _        |                     |          | _        |                     |           d S N)r   r   r    renderbodyinit_headersselfr   r   r   r   r    s         ]/workspace/show-city-briefing-agent/.venv/lib/python3.11/site-packages/starlette/responses.py__init__zResponse.__init__   sM     '!(DO$KK((	'"""""    bytes | memoryviewc                z    |dS t          |t          t          f          r|S |                    | j                  S )Nr-   )
isinstancebytes
memoryviewencodecharsetr*   r   s     r+   r&   zResponse.render.   s<    ?3gz233 	N~~dl+++r-   c                B   |g }d}d}n2d |                                 D             }d |D             }d|v}d|v}t          | dd           }|\|rZ| j        dk     sO| j        dv sFt          t	          |                    }|                    d|                    d	          f           | j        }|d|rb|                    d
          r#d|	                                vr|d| j
        z   z  }|                    d|                    d	          f           || _        d S )NTc                    g | ]A\  }}|                                                     d           |                    d           fBS )latin-1)lowerr3   ).0kvs      r+   
<listcomp>z)Response.init_headers.<locals>.<listcomp>;   sF    jjjRVRSUVAGGII,,Y77)9L9LMjjjr-   c                    g | ]
}|d          S )r    )r:   hs     r+   r=   z)Response.init_headers.<locals>.<listcomp><   s    ...QAaD...r-   s   content-lengths   content-typer'   r   )   i0  r8   ztext/zcharset=z
; charset=)itemsgetattrr   strlenappendr3   r   
startswithr9   r4   raw_headers)	r*   r   rH   populate_content_lengthpopulate_content_typekeysr'   content_lengthcontent_types	            r+   r(   zResponse.init_headers5   s\   ?57K&*#$(!!jjZaZgZgZiZijjjK..+...D&7t&C#$34$?!tVT**' %++t/?:/M/M T^^N 1>3H3H3S3STUUU#(=#&&w// <JlFXFXFZFZ4Z4Zt| ;;1D1DY1O1OPQQQ&r-   r   c                d    t          | d          st          | j                  | _        | j        S )N_headers)raw)hasattrr   rH   rO   )r*   s    r+   r   zResponse.headersQ   s2    tZ(( 	A*t/?@@@DM}r-    /FlaxkeyrD   valuemax_age
int | Noneexpiresdatetime | str | int | Nonepathdomainsecureboolhttponlysamesite.typing.Literal['lax', 'strict', 'none'] | Nonec
                P   t           j                                        }
||
|<   |||
|         d<   |;t          |t                    rt          |d          |
|         d<   n||
|         d<   |||
|         d<   |||
|         d<   |rd|
|         d<   |rd|
|         d<   |	+|	                                d	v s
J d
            |	|
|         d<   |
                    d                                          }| j	        
                    d|                    d          f           d S )Nzmax-ageTusegmtrY   r[   r\   r]   r_   )strictrT   nonez1samesite must be either 'strict', 'lax' or 'none'r`   rR   )headers
   set-cookier8   )httpcookiesSimpleCookier0   r   r   r9   outputstriprH   rF   r3   )r*   rU   rV   rW   rY   r[   r\   r]   r_   r`   cookie
cookie_vals               r+   
set_cookiezResponse.set_cookieW   sg    04|/H/H/J/Js%,F3K	"'8,, 1)8)N)N)NsI&&)0sI&"&F3K$*F3K! 	)$(F3K! 	+&*F3K
#>>## (    C	  
 '/F3K
#]]"]--3355

0A0A)0L0L MNNNNNr-   c           
     @    |                      |dd|||||           d S )Nr   )rW   rY   r[   r\   r]   r_   r`   )ro   )r*   rU   r[   r\   r]   r_   r`   s          r+   delete_cookiezResponse.delete_cookie~   sA     	 	 		
 		
 		
 		
 		
r-   scoper   receiver   sendr   c                   K   |d         dk    rdnd} ||dz   | j         | j        d           d {V   ||dz   | j        d           d {V  | j        |                                  d {V  d S d S )	Ntype	websocketz
websocket.rR   http.response.startrv   statusr   http.response.body)rv   r'   )r   rH   r'   r    )r*   rr   rs   rt   prefixs        r+   __call__zResponse.__call__   s      !&v+!=!=2d!66*+ 
 
 	
 	
 	
 	
 	
 	
 	
 dF%9949MMNNNNNNNNN?&//########### '&r-   )Nr   NNNr   r   r   r   r   r   r   r   r    r!   r"   r#   )r   r   r"   r.   r%   )r   r   r"   r#   )r"   r   )rR   NNrS   NFFrT   )rU   rD   rV   rD   rW   rX   rY   rZ   r[   r   r\   r   r]   r^   r_   r^   r`   ra   r"   r#   )rS   NFFrT   )rU   rD   r[   rD   r\   r   r]   r^   r_   r^   r`   ra   r"   r#   rr   r   rs   r   rt   r   r"   r#   )__name__
__module____qualname__r   r4   r,   r&   r(   propertyr   ro   rq   r}   r?   r-   r+   r   r      s       JG #37!%,0# # # # #, , , ,' ' ' ' '8    X "/3!CH%O %O %O %O %OT !CH
 
 
 
 
($ $ $ $ $ $r-   r   c                      e Zd ZdZdS )HTMLResponsez	text/htmlNr   r   r   r   r?   r-   r+   r   r      s        JJJr-   r   c                      e Zd ZdZdS )PlainTextResponse
text/plainNr   r?   r-   r+   r   r      s        JJJr-   r   c                  6     e Zd ZdZ	 	 	 	 dd fdZddZ xZS )JSONResponsezapplication/jsonr   Nr   r   r   r   r   r   r   r   r    r!   r"   r#   c                R    t                                          |||||           d S r%   )superr,   )r*   r   r   r   r   r    	__class__s         r+   r,   zJSONResponse.__init__   s+     	+w
JOOOOOr-   r1   c                Z    t          j        |ddd d                              d          S )NF),:)ensure_ascii	allow_nanindent
separatorsr   )jsondumpsr3   r5   s     r+   r&   zJSONResponse.render   s7    z!
 
 
 &//	r-   r   NNNr~   )r   r   r"   r1   )r   r   r   r   r,   r&   __classcell__r   s   @r+   r   r      sp        #J
 37!%,0P P P P P P P       r-   r   c                  (     e Zd Z	 	 	 dd fdZ xZS )RedirectResponse3  Nurl	str | URLr   r   r   r   r    r!   r"   r#   c                    t                                          d|||           t          t          |          d          | j        d<   d S )Nr-   )r   r   r   r    z:/%#?=@[]!$&'()*+,;)safelocation)r   r,   r
   rD   r   )r*   r   r   r   r    r   s        r+   r,   zRedirectResponse.__init__   sM     	+w[efff#(S8M#N#N#NZ   r-   )r   NN)
r   r   r   r   r   r   r    r!   r"   r#   )r   r   r   r,   r   r   s   @r+   r   r      sX         37,0O O O O O O O O O O Or-   r   c                  D    e Zd ZU ded<   	 	 	 	 dddZddZddZddZdS ) StreamingResponseAsyncContentStreambody_iteratorr   Nr   ContentStreamr   r   r   r   r   r   r    r!   r"   r#   c                    t          |t          j                  r|| _        nt	          |          | _        || _        || j        n|| _        || _        |                     |           d S r%   )	r0   typingAsyncIterabler   r   r   r   r    r(   r)   s         r+   r,   zStreamingResponse.__init__   sp     gv344 	@!(D!6w!?!?D&-7-?$//Z$'"""""r-   rs   r   c                F   K   	  |             d {V }|d         dk    rd S )NTrv   zhttp.disconnectr?   )r*   rs   messages      r+   listen_for_disconnectz'StreamingResponse.listen_for_disconnect   s<      	#GIIooooooGv"333	r-   rt   r   c                (  K    |d| j         | j        d           d {V  | j        2 3 d {V }t          |t          t
          f          s|                    | j                  } |d|dd           d {V  S6  |dddd           d {V  d S )Nrx   ry   r{   Trv   r'   	more_bodyr-   F)r   rH   r   r0   r1   r2   r3   r4   )r*   rt   chunks      r+   stream_responsez!StreamingResponse.stream_response   s     d-*+ 
 
 	
 	
 	
 	
 	
 	
 	
  - 	Y 	Y 	Y 	Y 	Y 	Y 	Y%eeZ%899 3T\22$ 4eRVWWXXXXXXXXXX .
 d0#ERRSSSSSSSSSSSs   A<rr   r   c                r  K   t          j                    4 d {V dfd}                    |t          | j        |                      |t          | j        |                     d {V  d d d           d {V  n# 1 d {V swxY w Y   | j        |                                  d {V  d S d S )Nfunc+typing.Callable[[], typing.Awaitable[None]]r"   r#   c                ^   K    |              d {V  j                                          d S r%   )cancel_scopecancel)r   
task_groups    r+   wrapz(StreamingResponse.__call__.<locals>.wrap   s9      dff'..00000r-   )r   r   r"   r#   )anyiocreate_task_group
start_soonr   r   r   r    )r*   rr   rs   rt   r   r   s        @r+   r}   zStreamingResponse.__call__   s     *,, 	E 	E 	E 	E 	E 	E 	E
1 1 1 1 1 1 !!$0Dd(K(KLLL$wt97CCDDDDDDDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E ?&//########### '&s   AB
BBr   )r   r   r   r   r   r   r   r   r    r!   r"   r#   )rs   r   r"   r#   )rt   r   r"   r#   r   )r   r   r   __annotations__r,   r   r   r}   r?   r-   r+   r   r      s         %%%%
 37!%,0# # # # #"   T T T T$ $ $ $ $ $r-   r   c                      e Zd Zdd	dZdS )
MalformedRangeHeaderMalformed range header.r   rD   r"   r#   c                    || _         d S r%   )r   r5   s     r+   r,   zMalformedRangeHeader.__init__
  s    r-   N)r   )r   rD   r"   r#   r   r   r   r,   r?   r-   r+   r   r   	  s-              r-   r   c                      e Zd ZddZdS )RangeNotSatisfiablemax_sizer   r"   r#   c                    || _         d S r%   )r   )r*   r   s     r+   r,   zRangeNotSatisfiable.__init__  s     r-   N)r   r   r"   r#   r   r?   r-   r+   r   r     s(        ! ! ! ! ! !r-   r   z(\d*)-(\d*)c                      e Zd ZdZ	 	 	 	 	 	 	 	 d5d6dZd7dZd8d Zd9d#Zd:d'Zd;d*Z	e
d<d,            Zed=d.            Zd>d4ZdS )?FileResponsei   r   N
attachmentr[   str | os.PathLike[str]r   r   r   r   r   r   r    r!   filenamestat_resultos.stat_result | Nonemethodcontent_disposition_typerD   r"   r#   c
                   || _         || _        || _        |t          j        dt
                     |t          |p|          d         pd}|| _        || _        | 	                    |           | j
                            dd           | j        Ot          | j                  }
|
| j        k    r|	 d|
 }n|	 d| j         d}| j
                            d	|           || _        ||                     |           d S d S )
Nz;The 'method' parameter is not used, and it will be removed.r   r   zaccept-rangesr1   z; filename*=utf-8''z; filename=""zcontent-disposition)r[   r   r   warningswarnDeprecationWarningr   r   r    r(   r   
setdefaultr
   r   set_stat_headers)r*   r[   r   r   r   r    r   r   r   r   content_disposition_filenamecontent_dispositions               r+   r,   zFileResponse.__init__  s8    	& MM"   #H$455a8HLJ$$'"""999=$+0+?+?(+t}<<)A&t&tVr&t&t##)A&_&_t}&_&_&_#L##$9;NOOO&"!!+..... #"r-   os.stat_resultc                   t          |j                  }t          |j        d          }t          |j                  dz   t          |j                  z   }dt	          |                                d           d}| j                            d|           | j                            d|           | j                            d	|           d S )
NTrc   -r   Fusedforsecuritycontent-lengthzlast-modifiedetag)rD   st_sizer   st_mtimer   r3   r   r   )r*   r   rL   last_modified	etag_baser   s         r+   r   zFileResponse.set_stat_headers>  s    [011";#7EEE,--3c+:M6N6NN	N=!1!1!3!3UKKKNNN 0.AAA???-----r-   rr   r   rs   r   rt   r   c                  K   |d                                          dk    }| j        	 t          j                            t
          j        | j                   d {V }|                     |           |j	        }t          j
        |          st          d| j         d          n-# t          $ r t          d| j         d          w xY w| j        }t          |          }|                    d          }|                    d          }	||	4|                     |	|          s|                     ||           d {V  n	 |                     ||j                  }
n~# t&          $ r1} t)          |j        d	
          |||           d {V cY d }~S d }~wt,          $ r8}t)          ddd|j         i          } ||||           d {V cY d }~S d }~ww xY wt1          |
          dk    r0|
d         \  }}|                     ||||j        |           d {V  n#|                     ||
|j        |           d {V  | j        |                                  d {V  d S d S )Nr   HEADzFile at path z is not a file.z does not exist.)rr   rangezif-rangei  )r   i  zContent-Rangez*/)r   r      r   )upperr   r   	to_threadrun_syncosstatr[   r   st_modeS_ISREGRuntimeErrorFileNotFoundErrorr   get_should_use_range_handle_simple_parse_range_headerr   r   r   r   r   r   rE   _handle_single_range_handle_multiple_rangesr    )r*   rr   rs   rt   send_header_onlyr   moder   
http_rangehttp_if_rangerangesexcresponsestartends                  r+   r}   zFileResponse.__call__H  s+     !&x!6!6!8!8F!B#S$)O$<$<RWdi$P$PPPPPPP%%k222 #*|D)) S&'Qty'Q'Q'QRRRS	 % P P P"#N49#N#N#NOOOP *K&&&[[))
J//-";DDZDZ[hjuDvDv";%%d,<==========<11*k>QRR' c c cL.s{LLLUT[]abbbbbbbbbbbbbb& < < <,Xk]`]iXkXkFlmmm%XeWd;;;;;;;;;;;;;;< 6{{a#AY
s//eS+BUWghhhhhhhhhh224ATVfggggggggg?&//########### '&s<   A
B' '#C
E# #
G-&FGG&-GGGr   r^   c                  K    |d| j         | j        d           d {V  |r |dddd           d {V  d S t          j        | j        d           d {V 4 d {V }d	}|rO|                    | j                   d {V }t          |          | j        k    } |d||d           d {V  |O	 d d d           d {V  d S # 1 d {V swxY w Y   d S )
Nrx   ry   r{   r-   Fr   rbr   T)r   rH   r   	open_filer[   read
chunk_sizerE   )r*   rt   r   filer   r   s         r+   r   zFileResponse._handle_simpleo  s     d1T=MZ^Zjkklllllllll 	f$ 4cPUVVWWWWWWWWWWW"_TYTBBBBBBBBB f f f f f f fd 	 f"&))DO"<"<<<<<<<E #E

do =I$(<eZcddeeeeeeeee   f ff f f f f f f f f f f f f f f f f f f f f f f f f f f f f fs   "AC


CCr   r   	file_sizec                  K   d| d|dz
   d| | j         d<   t          ||z
            | j         d<    |dd| j        d	           d {V  |r |d
ddd           d {V  d S t          j        | j        d           d {V 4 d {V }|                    |           d {V  d}|rx|                    t          | j	        ||z
                       d {V }|t          |          z  }t          |          | j	        k    o||k     } |d
||d           d {V  |x	 d d d           d {V  d S # 1 d {V swxY w Y   d S )Nzbytes r   r   rS   content-ranger   rx      ry   r{   r-   Fr   r  r  T)r   rD   rH   r   r  r[   seekr  minr  rE   )	r*   rt   r   r   r  r   r  r   r   s	            r+   r   z!FileResponse._handle_single_range{  s      )O(N(Nq(N(N9(N(N_%),S5[)9)9%&d1STM]^^_________ 
	f$ 4cPUVVWWWWWWWWWWW"_TYTBBBBBBBBB f f f f f f fdii&&&&&&&&& 	 f"&))Cu,M,M"N"NNNNNNNESZZ'E #E

do = M%#+I$(<eZcddeeeeeeeee	   f ff f f f f f f f f f f f f f f f f f f f f f f f f f f f f fs   BD99
EEr   list[tuple[int, int]]c           	       K   t          d          }|                     |||| j        d                   \  }}d| | j        d<   t          |          | j        d<    |dd| j        d           d {V  |r |d	d
dd           d {V  d S t          j        | j        d           d {V 4 d {V }|D ]\  }	}
 |d	 ||	|
          dd           d {V  |                    |	           d {V  |	|
k     r^|	                    t          | j        |
|	z
                       d {V }|	t          |          z  }	 |d	|dd           d {V  |	|
k     ^ |d	ddd           d {V   |d	d| d                    d          dd           d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S )N   zcontent-typezmultipart/byteranges; boundary=r
  r   rx   r  ry   r{   r-   Fr   r  r  T   
z
--z--
r8   )r	   generate_multipartr   rD   rH   r   r  r[   r  r  r  r  rE   r3   )r*   rt   r   r  r   boundaryrL   header_generatorr  r   r   r   s               r+   r   z$FileResponse._handle_multiple_ranges  sG      R==+/+B+BHin)E,
 ,
(( )U((T(T_%),^)<)<%&d1STM]^^_________ 	$ 4cPUVVWWWWWWWWWWW"_TYTBBBBBBBBB       d"( a aJE3$(<FVFVW\^aFbFbquvvwwwwwwwww))E*********#++&*iiDOS5[0Q0Q&R&R R R R R R RU+"d,@%^b#c#cddddddddd  #++ $(<eZ^__``````````d 4 5x 5 5 5 < <Y G G%*                                      s   6C(F11
F;>F;r   c                    t          |j                  dz   t          |j                  z   }dt          |                                d           d}|t          |j        d          k    p||k    S )Nr   r   Fr   Trc   )rD   r   r   r   r3   r   )clsr   r   r   r   s        r+   r   zFileResponse._should_use_range  sw    ,--3c+:M6N6NN	N=!1!1!3!3UKKKNNN
;+? M M MMfQ^bfQffr-   r   c                z   g }	 |                      dd          \  }}n# t          $ r t                      w xY w|                                                                }|dk    rt          d          fdt
                              |          D             }t          |          dk    rt          d          t          fd|D                       rt                    t          d	 |D                       rt          d
          t          |          dk    r|S g }|D ]\  }}t          t          |                    D ]X}||         \  }	}
||
k    r||	k     r|                    |||f            n<t          ||	          t          ||
          f||<    n|                    ||f           |S )N=r   r1   zOnly support bytes rangec                   g | ]}|d k    |d         rt          |d                   nt          |d                   z
  |d         r9|d         r1t          |d                   k     rt          |d                   dz   nfS ))rR   rR   r   r   )r   )r:   _r  s     r+   r=   z4FileResponse._parse_range_header.<locals>.<listcomp>  s     
 
 

 H}}	 qT<AaD			y3qt99'<!"1W!A$W3qt99y3H3HAaD		Ai
 }}r-   r   z%Range header: range must be requestedc              3  @   K   | ]\  }}d |cxk    ok     nc  V  dS )r   Nr?   )r:   r   r  r  s      r+   	<genexpr>z3FileResponse._parse_range_header.<locals>.<genexpr>  sF      CCqA********+CCCCCCr-   c              3  (   K   | ]\  }}||k    V  d S r%   r?   )r:   r   r   s      r+   r  z3FileResponse._parse_range_header.<locals>.<genexpr>  s*      44zucus{444444r-   z)Range header: start must be less than end)split
ValueErrorr   rl   r9   _RANGE_PATTERNfindallrE   anyr   r   insertr  maxrF   )r   r  r   unitsrange_resultr   r   pp_startp_ends    `         r+   r   z FileResponse._parse_range_header  s   (*	)&,,S!44ME66 	) 	) 	)&(((	) ##%%G&'ABBB
 
 
 

 $++F33
 
 
 v;;!&'NOOOCCCCFCCCCC 	1%i00044V44444 	T&'RSSSv;;!M )+  	, 	,JE33v;;'' , ,!'5==7]]MM!eS\222E!$UG!4!4c#uoo FF1IEucl+++s    8 typing.Sequence[tuple[int, int]]r  r   rM   .tuple[int, typing.Callable[[int, int], bytes]]c                    t                    }d|z   t                    z   t          t                              z   t          fd|D                       d|z   z   }|fdfS )a  
        Multipart response headers generator.

        ```
        --{boundary}\n
        Content-Type: {content_type}\n
        Content-Range: bytes {start}-{end-1}/{max_size}\n
        \n
        ..........content...........\n
        --{boundary}\n
        Content-Type: {content_type}\n
        Content-Range: bytes {start}-{end-1}/{max_size}\n
        \n
        ..........content...........\n
        --{boundary}--\n
        ```
        ,   c              3     K   | ]L\  }}t          t          |                    t          t          |d z
                      z   z   ||z
  z   V  MdS )r   N)rE   rD   )r:   r   r   static_header_part_lens      r+   r  z2FileResponse.generate_multipart.<locals>.<genexpr>  sr       
 
 s U__s3sQw<<0003IIU{
 
 
 
 
 
r-      c                T    d d d|  d|dz
   d d                     d          S )	Nz--z
Content-Type: z
Content-Range: bytes r   r   rS   z

r8   )r3   )r   r   r  rM   r   s     r+   <lambda>z1FileResponse.generate_multipart.<locals>.<lambda>  se    X  !- (- 03A 8@   fY r-   )rE   rD   sum)r*   r   r  r   rM   boundary_lenrL   r0  s     ```  @r+   r  zFileResponse.generate_multipart  s    0 8}}!#l!2S5F5F!FSQY]]I[I[![ 
 
 
 
 %
 
 
 
 

 
            
 	
r-   )r   NNNNNNr   )r[   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r   r   rD   r"   r#   )r   r   r"   r#   r   )rt   r   r   r^   r"   r#   )rt   r   r   r   r   r   r  r   r   r^   r"   r#   )
rt   r   r   r  r  r   r   r^   r"   r#   )r   rD   r   r   r"   r^   )r   rD   r  r   r"   r  )
r   r+  r  rD   r   r   rM   rD   r"   r,  )r   r   r   r  r,   r   r}   r   r   r   classmethodr   staticmethodr   r  r?   r-   r+   r   r     s       J
 37!%,0#-1!(4#/ #/ #/ #/ #/J. . . .%$ %$ %$ %$N
f 
f 
f 
ff f f f$! ! ! !F g g g [g
 1 1 1 \1f)
 )
 )
 )
 )
 )
r-   r   )<
__future__r   http.cookiesrh   r   r   rer   r   r   r   email.utilsr   r   	functoolsr   	mimetypesr   secretsr	   urllib.parser
   r   anyio.to_threadstarlette._compatr   starlette.backgroundr   starlette.concurrencyr   starlette.datastructuresr   r   r   starlette.typesr   r   r   r   r   r   r   r   UnionrD   r1   r2   ContentIterableSyncContentStreamr   r   r   r   	Exceptionr   r   compiler   r   r?   r-   r+   <module>rL     sF   " " " " " "      				 				          3 3 3 3 3 3 3 3                                    + + + + + + / / / / / / 7 7 7 7 7 7 A A A A A A A A A A 0 0 0 0 0 0 0 0 0 0C$ C$ C$ C$ C$ C$ C$ C$L    8              8   .	O 	O 	O 	O 	Ox 	O 	O 	O ,sE:-
.OG, )'2 /1BBC4$ 4$ 4$ 4$ 4$ 4$ 4$ 4$n    9   
! ! ! ! !) ! ! !
 N++}
 }
 }
 }
 }
8 }
 }
 }
 }
 }
r-   