
    wive                    B   U 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	Z	d dl
mZ d dlmZmZmZmZmZmZ d dlm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mZ d dl m!Z! d dl"m#Z# erd dl$Z$d d	l%m&Z& d d
l'm(Z(m)Z)  G d de*          Z+ ej,        e-          Z.dZ/ ej0        d           G d d                      Z1ej0         G d d                      Z2da3de4d<   da5de4d<    ej0        d           G d d                      Z6 ed          Z7 G d dej8                  Z9e9j:        Z; G d dej8                  Z<e<j:        Z=ej0         G d d                      Z>d d!d<d*Z?d d!d<d+Z@d=d-ZAd>d/ZBd?d0ZCd@d2ZDdAd5ZEdBd6ZFdCd8ZGdDd9ZHdDd:ZIdCd;ZJdS )E    )annotationsN)defaultdict)DefaultDictOptionalTupleTYPE_CHECKINGTypeVarUnion)Self)dynamo_timedget_chromium_event_logger	warn_once)	is_fbcode)trace_structured_artifact)InstructionTranslator)
JsonDataTyRemoteCachec                      e Zd ZdS )ReservedWorkflowIdUserErrorN)__name__
__module____qualname__     a/root/.openclaw/workspace/chatterbox_venv_py311/lib/python3.11/site-packages/torch/_dynamo/pgo.pyr   r      s        Dr   r   
   T)frozenc                  F    e Zd ZU ded<   ded<   ded<   edd	            Zd
S )CodeIdstrfilenameintfirstlinenonamecodetypes.CodeTypereturnc                B    t          | j        | j        | j                  S N)r   co_filenameco_firstlinenoco_name)r%   s    r   makezCodeId.make`   s    d&(;T\JJJr   N)r%   r&   r'   r   )r   r   r   __annotations__staticmethodr-   r   r   r   r   r   Z   sX         MMMIIIK K K \K K Kr   r   c                  >    e Zd ZU  ej        d           Zded<   dS )	CodeStatec                 *    t          t                    S r)   )r   FrameStateSizeEntryr   r   r   <lambda>zCodeState.<lambda>h   s    ,? @ @ r   )default_factoryz%DefaultDict[str, FrameStateSizeEntry]automatic_dynamicN)r   r   r   dataclassesfieldr6   r.   r   r   r   r1   r1   e   sM         ?P{?P@@@ @ @      r   r1   z(Optional[DefaultDict[CodeId, CodeState]]_INIT_CODE_STATE_CODE_STATEc                      e Zd ZU dZded<   dS )InferStrideaX  
    Denotes the quantity stride[dim] * size[dim], which is what the stride would
    be for the next physical dimension that results in a contiguous layout.

    For example, given size = [2, 3], stride = [3, 1], we can replace this with
    stride = [InferStride(1), 1], because InferStride(1) = stride[1] * size[1] = 1 * 3 = 3

    Indirecting the representation in this way is important for the join operation
    on strides as if we join [2, 3][3, 1] and [2, 4][4, 1],
    we don't want [2, None][None, 1] which would get eventually symbolized into
    [2, s0][s1, 1] (notice that the relationship between s0 and s1 is broken).
    If we instead rewrite the expressions as InferStride so we have [2, 3][InferStride(1), 1]
    and [2, 4][InferStride(1), 1] we now join to [2, None][InferStride(1), 1] will
    result in [2, s0][s0, 1], as desired.
    r"   dimN)r   r   r   __doc__r.   r   r   r   r<   r<   p   s%            HHHHHr   r<   _Tc                      e Zd ZdZdZdS )	AutoUnsetz
    The identity element of our semilattice, a generic "don't know" element that
    is always subsumed when we get more information.
    r   Nr   r   r   r>   tokenr   r   r   rA   rA               
 EEEr   rA   c                      e Zd ZdZdZdS )AutoDynamicz
    The top element of our (bounded) semilattice, whenever you merge this with
    any other element you always get it again
    r   NrB   r   r   r   rF   rF      rD   r   rF   c                  L   e Zd ZU  ej        e          Zded<    ej        e          Zded<    ej        e          Z	ded<   d&d
Z
d'dZd(dZd(dZ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 )0r3   )defaultz"Union[int, AutoDynamic, AutoUnset]scalarzBUnion[AutoDynamic, AutoUnset, Tuple[Union[int, AutoDynamic], ...]]sizezOUnion[AutoDynamic, AutoUnset, Tuple[Union[int, AutoDynamic, InferStride], ...]]strider'   r    c                T   dddfd}| j         t          u r(| j        t          u r| j        t          u rd	S d
| j         S | j        t          u rXt	          | j         t
                    r>t	          | j        t
                    r$d || j                    d || j                   S dS )Ns/Union[int, AutoDynamic, AutoUnset, InferStride]r'   r    c                    | t           u rdS | t          u rdS t          | t                    rd| j         dS t          |           S )N?z
auto unsetzS())auto_dynamic
auto_unset
isinstancer<   r=   r    )rM   s    r   render_singlez1FrameStateSizeEntry.render.<locals>.render_single   sM    L  sj#|A{++ $AE}}}$1vvr   ss0Tuple[Union[int, AutoDynamic, InferStride], ...]c                R    dd                     fd| D                       z   dz   S )N[z, c              3  .   K   | ]} |          V  d S r)   r   ).0rM   rU   s     r   	<genexpr>zCFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>   s-      "@"@==#3#3"@"@"@"@"@"@r   ])join)rV   rU   s    r   render_tuplez0FrameStateSizeEntry.render.<locals>.render_tuple   s4    "@"@"@"@R"@"@"@@@@3FFr   zfully dynamic scalar or tensorzscalar ztensor size=z stride=zunusual {repr(self)})rM   rN   r'   r    )rV   rW   r'   r    )rJ   rR   rK   rI   rT   tuple)selfr_   rU   s     @r   renderzFrameStateSizeEntry.render   s    		 		 		 			G 	G 	G 	G 	G 	G 9$$)D)D{l**77....[L(($)U++ c
4;0N0N cbll49&=&=bb||TXT_G`G`bbb &%r   Nonec                   t          | j        t          j                  rJ | j                    t          | j        t
                    r.| j        D ]&}t          |t          j                  r
J |            't          | j        t
                    r.| j        D ](}t          |t          j                  r
J |            'd S d S r)   )rT   rI   torchSymIntrJ   r`   rK   )ra   rM   s1s      r   __post_init__z!FrameStateSizeEntry.__post_init__   s    dk5<88EE$+EE8di'' 	:Y : :%a66999969dk5)) 	<k < <%b%,77;;;;7;	< 	<< <r   r=   r"   boolc                j    | j         t          u rdS | j         t          u rdS | j         |         t          u S )NTF)rJ   rR   rS   ra   r=   s     r   is_size_dynamicz#FrameStateSizeEntry.is_size_dynamic   s7    9$$49
""5y~--r   c                    t          | j        t                    rt          d | j        D                       sdS | j        t
          u rdS | j        t          u rdS | j        |         t
          u S )Nc              3  B   K   | ]}t          |          t          u V  d S r)   )typer"   )r[   rM   s     r   r\   z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>   s,      0S0SAaC0S0S0S0S0S0Sr   FT)rT   rJ   r`   allrK   rR   rS   rk   s     r   is_stride_dynamicz%FrameStateSizeEntry.is_stride_dynamic   sv    " ty%((	-00S0S0S0S0S-S-S	 5;,&&4;*$$5{3<//r   xsTuple[int, ...]#Tuple[Union[AutoDynamic, int], ...]c                4    t          d | D                       S )Nc              3  \   K   | ]'}t          |t          j                  rt          n|V  (d S r)   )rT   re   rf   rR   )r[   xs     r   r\   z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>   s7      TTAZ5<%@%@G\\aTTTTTTr   )r`   )rr   s    r   _munge_symintz!FrameStateSizeEntry._munge_symint   s     TTQSTTTTTTr   rw   c                :    t          |t          t                    S N)rI   rJ   rK   )r3   rR   )clsrw   s     r   make_scalarzFrameStateSizeEntry.make_scalar   s    "!,|TTTTr   c                |    t          t          |                     |          |                     |                    S rz   )r3   rR   rx   )r{   rJ   rK   s      r   make_tensorzFrameStateSizeEntry.make_tensor   s@     #""4(($$V,,
 
 
 	
r   c                `    t          t          |                     |          t                    S rz   )r3   rS   rx   )r{   rJ   s     r   	make_sizezFrameStateSizeEntry.make_size  s0    """4((
 
 
 	
r   r?   yUnion[AutoDynamic, _T]c                p    | t           u r|S |t           u r| S | t          u s|t          u s| |k    rt          S | S r)   )rS   rR   )rw   r   s     r   _merge_atomzFrameStateSizeEntry._merge_atom  sF    
??H
??H\ 1 1Q!VVr   -Union[AutoDynamic, AutoUnset, Tuple[_T, ...]]ysAUnion[AutoDynamic, AutoUnset, Tuple[Union[AutoDynamic, _T], ...]]c                    |t           u r|S |t           u r|S |t          u s	|t          u rt          S t          |          t          |          k    rt          S t           fdt	          ||          D                       S )Nc              3  J   K   | ]\  }}                     ||          V  d S r)   )r   )r[   rw   r   r{   s      r   r\   z6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>%  s5      CCtq!S__Q**CCCCCCr   )rS   rR   lenr`   zip)r{   rr   r   s   `  r   _merge_atom_tupz#FrameStateSizeEntry._merge_atom_tup  s     II|!3!3r77c"ggCCCCs2r{{CCCCCCr   otherr   c                    |                      | j        |j                  | _        |                     | j        |j                  | _        |                     | j        |j                  | _        | S r)   )r   rI   r   rJ   rK   )ra   r   s     r   __ior__zFrameStateSizeEntry.__ior__'  sX    &&t{ELAA((EJ??	**4;EEr   N)r'   r    r'   rc   )r=   r"   r'   ri   )rr   rs   r'   rt   )rw   r"   r'   r3   )rJ   rs   rK   rs   r'   r3   )rJ   rs   r'   r3   )rw   r?   r   r?   r'   r   )rr   r   r   r   r'   r   )r   r   r'   r   )r   r   r   r7   r8   rS   rI   r.   rJ   rK   rb   rh   rl   rq   r/   rx   classmethodr|   r~   r   r   r   r   r   r   r   r3   r3      s        1B1B:1V1V1VFVVVV
 	*--- 	 . . . .
 	*---  . . . .& & & &:< < < <. . . .0 0 0 04 U U U \U U U U [U 
 
 
 [
 
 
 
 [
    \ D D D [D     r   r3   Fis_unspecialized_nn_moduletxr   r$   r    entryr   ri   r'   c                 
 t                               | j                  }t                      |         }|j        v }|j                 }t          j        |          
|z  }|r
j        |j        k    rt                              dj        
j                   t                      
                    dt          j                    ddt          
j                  t          j                  d           |rt                              d           	 dd
fd}|r܉
j        |j        k    rt!          
j        t"                    rt!          j        t"                    rt%          
j                  t%          j                  k    r |ddd           n`t'          t%          j                            D ]0}	
j        |	         j        |	         k    r |dd|	 dd|	           1n |ddd           |r܉
j        |j        k    rt!          
j        t"                    rt!          j        t"                    rt%          
j                  t%          j                  k    r |ddd           n`t'          t%          j                            D ]0}	
j        |	         j        |	         k    r |dd|	 dd|	           1n |ddd           |S )Nz%automatic dynamic int %s val %s != %sr6   rI   zscalar changer$   dim_changedreasoncachednewz%s is converted to a symbolic integer. It is an attribute of a user defined nn module class. If you wish to keep it static, you can mark the nn module class as `torch._dynamo.mark_static`.tup_namer    short_reasonlong_reasoniOptional[int]r'   rc   c                   |t          |           nt          |           |         }|t          |           nt          |           |         }t                              d| |||           t                                          dt          j                    |dn||t          |          t          |          d           d S )Nz#automatic dynamic %s %s %s %s != %sr6   rp   r   )getattrlogdebugr   log_instant_eventtimetime_nsr    )	r   r   r   r   	entry_tupold_entry_tupr   r$   	old_entrys	         r   log_tupz)update_automatic_dynamic.<locals>.log_tupX  s     )*	GE8$$$wuh7O7OPQ7R 	
 y Ix(((H--a0 	
 			1	
 	
 	
 	"##55LNN()	uuq%m,,9~~ 
	
 
	
 
	
 
	
 
	
r   rJ   r=   zdimensionality changezsize(rQ   zsize changer   rK   zstride(zstride changer)   )
r   r    r   r    r   r    r   r   r'   rc   )r   r-   f_codeget_code_stater6   copyrI   r   r   r   r   r   r   r    inforJ   rT   r`   r   rangerK   )r   r$   r   r   code_idframe_state	is_update	mut_entryr   r   r   s    ``       @r   update_automatic_dynamicr   .  s5    kk")$$G ""7+K55I-d3I	)$$II  Y%)999		3L		
 	
 	
 	"##55LNN')i.//5<(( 
	
 
	
 
	
 & 	HHK 	   PT
 
 
 
 
 
 
 
 
@  	.Y^y~55ine,, 	.EJ1N1N 	.9>""c%*oo55'>????s5:// H HA ~a(EJqM99mQGGGH GFGW--- 	0Y%)999i&.. 	0:elE3R3R 	09#$$EL(9(999%)@AAAAs5<0011 N NA '*el1o==.A.../1MMMN GHgw///r   c                   | j         x}t          | |||          S |j        ||j        j        |<   |S d }|j        D ])}||j        v rt          | ||j        |         |          }*|J |S )Nr   )distributed_stater   
all_stateslocal_stater6   )r   r$   r   r   stres	sub_states          r   process_automatic_dynamicr     s     ""+''A	
 
 
 	
 
	 27(.  	 	Iy222./5/I	   
r   Optional[str]c                    t           j        j        j        rt	          d           d S d } t          j                    r&t          j                    rt          j                    } t           j	        j        j
        }t           j	        j        j        x}.|                    d          rt          d          | d|  d| S t           j                                        x}|\  }}d| d| d|  d| S d S )NzHdynamo_pgo force disabled by torch._inductor.config.force_disable_cacheszmast:ztorch.compiler.config.job_id with prefix 'mast:' is reserved for automatically generated job id associated with a specific MAST job name and version.:)re   	_inductorconfigforce_disable_cachesr   distis_availableis_initializedget_rankcompilercache_key_tagjob_id
startswithr   _utils_internalget_mast_job_name_version)ranktagrname_versionmast_job_namemast_job_versions         r   get_cache_keyr     s   2 V	
 	
 	
 t D t244 }
.

-C ^"))6<<   	-$  
 ""d""S"""-GGIIIV*6''F}FF'7FF$FFFFF4r   	cache_keyc                    t           j        j        j        st                              d           d S ddlm} t          j	        
                     |            dd|  d          S )Nz'automatic_dynamic_local_pgo not enabledr   )	cache_dirdynamocode_state_z.pkl)re   _dynamor   automatic_dynamic_local_pgor   r   %torch._inductor.runtime.runtime_utilsr   ospathr^   )r   r   s     r   code_state_pathr     sf    =; 		;<<<t??????7<<		X/LY/L/L/LMMMr   c                 >   t           j        j        j        rdS t           j        j        j        x} | S t                      sdS t           j                                        rdS 	 ddl	m
} n# t          $ r Y dS w xY w|t           j                            d          k    S )NFr   )REMOTE_CACHE_VERSIONz'pytorch/remote_cache:dynamo_pgo_version)re   r   r   r   r   automatic_dynamic_remote_pgor   r   is_fb_unit_testtorch._inductor.fb.remote_cacher   ModuleNotFoundErrorjustknobs_getval_int)r   r   s     r   "should_use_remote_dynamo_pgo_cacher     s    2 u]!>>K;; u,,.. uHHHHHHH   uu  5#8#M#M1$ $  s   $A+ +
A98A9!Optional[RemoteCache[JsonDataTy]]c                 b    ddl m}  t                      sd S  | dt                      dd          S )Nr   create_cachez
dynamo-pgoFbRemoteDynamoPGOCacheRemoteDynamoPGOCache)torch._inductor.remote_cacher   r   r   r   s    r   get_remote_cacher     sK    999999-// t< 	  r   csDefaultDict[CodeId, CodeState]c                d    d                     d |                                 D                       S )N
c              3     K   | ]X\  }}|j          d |j         d |j         dd                    d |j                                        D                       z   V  YdS )r   z:
r   c              3  P   K   | ]!\  }}d | d|                                  V  "dS )z  z: N)rb   )r[   srcfss      r   r\   z.render_code_state.<locals>.<genexpr>.<genexpr>  sP       
 
*1#r%%%		%%
 
 
 
 
 
r   N)r!   r#   r$   r^   r6   items)r[   kvs      r   r\   z$render_code_state.<locals>.<genexpr>  s        
 Aq	 :3333333
)) 
 
565H5N5N5P5P
 
 
 
 
	
     r   )r^   r   )r   s    r   render_code_stater     s>    99  
 HHJJ     r   c                 <  	 t           t           S t                      } t          t                    a t	                      }|t           S d	fd}t          |          		t          j                            	          rt          dx}d          5  | 
                    ||	           t          	d
          5 }	 t          j        |          a | 
                    ||                                            |d          cd d d            cd d d            S # t          $ r  t                               d	d           Y nw xY w	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t%                      }|jt          dx}d          5  | 
                    ||	           	 |                    |          }|	 t)          |t*                    sJ |d         }t)          |t,                    sJ t/          j        |          }| 
                    |t3          |                     t          j        |          a  |d          cd d d            S # t          $ r  t                               d|d           Y nMw xY wt                               d|           n-# t          $ r  t                               d|d           Y nw xY wd d d            n# 1 swxY w Y   t                               d           t           J t           S )Ntyr    r'   r   c                   t          t          t                    sJ t                              d| t          t                               t          d|  ddd            t          j        t                    a	t          S )Nz$get_code_state %s hit %s, %d entriesget__code_statestringc                 *    t          t                    S r)   r   r:   r   r   r   r4   z-get_code_state.<locals>.hit.<locals>.<lambda>0      %k22 r   )
rT   r:   r   r   r   r   r   r   deepcopyr9   )r   r   s    r   hitzget_code_state.<locals>.hit)  s{    +{333337r3{CSCSTTT!"2"""22	
 	
 	

  =55r   zpgo.get_local_code_stateTlog_pt2_compile_eventr   rbcache_size_byteslocalz&get_code_state failed while reading %s)exc_infozpgo.get_remote_code_statedataremotez1get_code_state failed parsing remote result on %sz get_code_state remote miss on %sz'get_code_state failed remote read on %szget_code_state using default)r   r    r'   r   )r:   r   r   r1   r   r   r   r   existsr   add_event_dataopenpickleloadtell	Exceptionr   warningr   getrT   dictr    base64	b64decoder   loadsr   )
chromium_logr   r  r$   fremote_cache
cache_datar  payloadr   s
            @r   r   r     s   ,..L i((KI
 
 
 
 
 
 9%%DBGNN400..Dd
 
 
 	( 	( ''	'BBB dD!! 	(Q("(+a..K //qvvxx/PPP 3w<<	( 	( 	( 	( 	( 	( 	(	( 	( 	( 	( 	( 	( 	( 	( !   KK@$QU       	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	($ $%%L//Dt
 
 
 	L 	L ''	'BBBL)--i88
 )-)*d;;;;;)&1)$44444"("24"8"8$33D3w<<3XXX&,l7&;&;  #s8}}7	L 	L 	L 	L 	L 	L 	L 	L( %   O%%) $      HH?KKKK-    =ySW      	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L> HH+,,,"""s   (E.;E==D:
EE.'EEEEE.E	E.E	E..E25E2K)6J0K)BI'
K)''JK)JK)0'KK)KK))K-0K-rc   c                 8   t           t                              d           d S t           t          k    rt                              d           d S t	                      } | t                              d           d S t          |            t          |            d S )Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping)r:   r   r   r9   r   put_local_code_stateput_remote_code_stater	  s    r   put_code_stater&  q  s    DEEE&&&6777I9:::###)$$$$$r   c           	        t          dx}d          5  t                      }|                    ||            t          J t	          |           }|(t
                              d           	 d d d            d S |dz   }|dz   }dd	lm} t          j
        t          j                            |          d
            ||t                    5  t          |d          5 }t          j        t          |           |                    ||                                           d d d            n# 1 swxY w Y   t          j        ||           t
                              d|t'          t                               t)          ddd            d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nzpgo.put_local_code_stateTr  r	  z$put_code_state: local cache disabledz.tmpz.lockr   )FileLock)exist_ok)timeoutwbr  z*put_code_state: wrote local %s, %d entriesr$  r  c                 *    t          t                    S r)   r  r   r   r   r4   z&put_local_code_state.<locals>.<lambda>  s    )+66 r   )r   r   r  r:   r   r   r   filelockr(  r   makedirsr   dirnameLOCK_TIMEOUTr  r  dumpr  renamer   r   )r   r$   r  r   tmp_path	lock_pathr(  r  s           r   r$  r$    s   	88dPT	U	U	U " "022##DI#>>>&&&y))<HH;<<<" " " " " " " " &=7N	 	&%%%%%
BGOOD))D9999Xi666 	 	h%% MK+++++D16688+LLLM M M M M M M M M M M M M M M Ih%%%HH<dCDTDT   &&66  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	-" " " " " " " " " " " " " " " " " "sc   AF6<AF6F"AD2&F2D66F9D6:AFF6F"	"F6%F"	&F66F:=F:c                   t          dx}d          5  t                      }|                    ||            t          J t	                      }|(t
                              d           	 d d d            d S t          j        t                    }|                    |t          |                     dt          j        |                              d          i}|                    | |           t
                              d	| t          t                               t          d
dd            d d d            d S # 1 swxY w Y   d S )Nzpgo.put_remote_code_stateTr  r	  z%put_code_state: remote cache disabledr  r  asciiz+put_code_state: wrote remote %s, %d entriesr%  r  c                 *    t          t                    S r)   r  r   r   r   r4   z'put_remote_code_state.<locals>.<lambda>  r  r   )r   r   r  r:   r   r   r   r  dumpsr   r  	b64encodedecodeputr   )r   r$   r  r   contentr!  s         r   r%  r%    s   	99dQU	V	V	V 
 
022##DI#>>>&&&'))HH<===
 
 
 
 
 
 
 
 ,{++##D3w<<#HHHF$W--44W=="

 	J///99c+FVFV	
 	
 	
 	"#22	
 	
 	
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   AE;B<EEEc                     d a d ad S r)   )r:   r9   r   r   r   reset_code_stater>    s    Kr   )
r   r   r$   r    r   r3   r   ri   r'   r3   )r'   r   )r   r    r'   r   )r'   ri   )r'   r   )r   r   r'   r    )r'   r   r   )r   r    r'   rc   )K
__future__r   r  r   r7   enumloggingr   r  r   collectionsr   typingr   r   r   r   r	   r
   typing_extensionsr   torch._dynamo.configre   torch._utils_internaltorch.compiler.configtorch.distributeddistributedr   torch._dynamo.utilsr   r   r   torch._environmentr   torch._logging._internalr   typestorch._dynamo.symbolic_convertr   r   r   r   
ValueErrorr   	getLoggerr   r   r0  	dataclassr   r1   r9   r.   r:   r<   r?   EnumrA   rC   rS   rF   rR   r3   r   r   r   r   r   r   r   r   r&  r$  r%  r>  r   r   r   <module>rS     s   " " " " " " "         				   # # # # # # N N N N N N N N N N N N N N N N " " " " " "                         R R R R R R R R R R ( ( ( ( ( ( > > > > > >  ELLLDDDDDDDDDDDDDD	 	 	 	 	* 	 	 	 g!!j d###K K K K K K K $#K         >B  A A A A8< < < < < d###       $#( WT]]    	    _
    $)      J J J J J J J Jd (-` ` ` ` ` `P (-+ + + + + +\   FN N N N   .      S S S Sl% % % %$# # # #L
 
 
 
<     r   