
    DiigD                        U d 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
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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 m!Z!m"Z"m#Z# d
dl$m%Z%m&Z&m'Z'm(Z( d
dl)m*Z*m+Z+m,Z, d
dl
m-Z-m.Z.m/Z/ d
dl0m1Z1m2Z2 dZ3ee
j4                 e5d<   	 ddl6Z3n# e7$ r dZ3Y nw xY we!j8        Z8dZ9 ej:        e;          Z< ed          Z=deej>                 deej>                 fdZ?de@de@fdZAd ZBdejC        jD        dedededeEe         f
dZFdedeGfdZHedej>        dej>        fd             ZIedeeEe         eJed!f         eKeef         f         deLfd"            ZIdedeej>        eLf         fd#ZIde@fd$ZMdqde@d&e
jN        d'e@ddfd(ZOdd)d*e.d+ePd,ed-ed.ePde-fd/ZQ G d0 d1          ZR G d2 d3          ZS G d4 d5          ZT G d6 d7          ZU G d8 d9          ZVd&e@de@fd:ZWd&e@de@fd;ZXd<e@de@fd=ZYd&e@de@fd>ZZ	 	 	 drd?ed@ed!ef         dAePdBeeP         dCeeP         dDePddfdEZ[dFej\        deEej>                 ded!ef         fdGZ]	 	 dsdJeLdKeLdLeGdMeLde@f
dNZ^ej_        dOdfdPeeP         dQeeP         dRej`        dSee@eja        f         dTePdej>        fdUZb edV          ZcdeGfdWZdd@ee=ecf         dXedee=ecf         fdYZeddZ d[d\efd]e@d^e@dXed_ee@         d`eed!ef         ged!ef         f         deffdaZgd@ee=ecf         dee=ecf         fdbZhd@ee=ecf         dee=ecf         fdcZid@ee=ecf         dee=ecf         fddZjd@ee=ecf         dee=ecf         fdeZkd@ee=ecf         dee=ecf         fdfZld@ee=ecf         dee=ecf         fdgZmd@ee=ecf         dee=ecf         fdhZnd@ee=ecf         dee=ecf         fdiZodtdkeGddfdlZpdmee=ecf         dne=jq        doe=jr        decfdpZsdS )ua1  Testing utilities and infrastructure for Dynamo.

This module provides a comprehensive set of testing utilities including:
- Test result collection and validation
- Graph manipulation and comparison tools
- Test case management and execution helpers
- Specialized test decorators for different Python versions and features
- RNG state management
- Compilation counting and monitoring
- Debug utilities for bytecode transformation

The utilities in this module are used across Dynamo's test suite to ensure
consistent testing patterns and proper test isolation.
    N)Sequence)AnyCallableOptionaloverloadTypeVarUnion)	ParamSpec)patch)fx)	aot_eager)OutputGraph   )config
eval_frameoptimize_assertreset)create_instructiondebug_checksis_generatortransform_code_object)CheckFunctionManager	CompileIdGuardedCode)ConvertFrameReturnDynamoFrameTypewrap_guarded_code)CompileCounterIntsamenp   _Pxreturnc                     | d S |                                                                                      | j                  S N)detachclonerequires_grad_requires_gradr#   s    [/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/torch/_dynamo/testing.pyclone_mer-   ?   s6    yt88::,,Q_===    namec                 .    t          j        dd|           S )Nz^_orig_mod[.] resub)r/   s    r,   remove_optimized_module_prefixr5   E       6"B---r.   c                     ddl m d d fd}  t          j        |d          |           |i | j        fS )Nr   )InstructionTranslatorc                 H    |                                  j        j        | S r&   )
current_txoutputregion_tracker)_gmargskwargsr8   gmr<   s      r,   extract_graph_backendz8extract_graph_and_tracker.<locals>.extract_graph_backendO   s&     .99;;BQ
r.   T)backend	fullgraph)torch._dynamo.symbolic_convertr8   torchcompilegraph)fnr>   r?   rA   r8   r@   r<   s       @@@r,   extract_graph_and_trackerrI   I   s    DDDDDD	BN       E@EM/4@@@DDdUfUUU8^##r.   model
predictionlossexample_inputsc                 J   g }|                     |           |                     |           i }i }|                                 D ]_\  }}t          | t          j                  rt          |          }|}	|j        }
|j        t          j        |          }
|
||dz   <   |	||<   `|                     |           |                     |           i }| 	                                D ]3\  }}t          | t          j                  rt          |          }|||<   4|                     |           |D ]r}t          |t          t          f          r |                    d |D                        >t          |t          j                  r|                     |j                   s|S )Nz.gradc              3   X   K   | ]%}t          |t          j                  |j        V  &d S r&   )
isinstancerE   Tensorgrad).0inps     r,   	<genexpr>z"collect_results.<locals>.<genexpr>{   s5      XX*S%,:W:WX38XXXXXXr.   )appendnamed_parametersrP   r   OptimizedModuler5   rR   rE   
zeros_likenamed_bufferstuplelistextendrQ   )rJ   rK   rL   rM   resultsgradsparamsr/   param
param_copyrR   buffersbufferexamples                 r,   collect_resultsrf   Z   s    GNN:NN4 EF--// 	" 	"eeZ788 	81$77D
z:#E**D $dWn!tNN5NN6G++--  feZ788 	81$77DNN7! - -gt}-- 	-NNXXwXXXXXXX'5<00 -w|,,,Nr.   outc                    t          | t          j                  r| j        S t          | t          t
          f          rt          d | D                       S | dS t          | t                    rdS t          dt          |                     )Nc              3   4   K   | ]}t          |          V  d S r&   )requires_bwd_passrS   r#   s     r,   rU   z$requires_bwd_pass.<locals>.<genexpr>   s+      55A$Q''555555r.   FDon't know how to reduce)
rP   rE   rQ   r*   r\   r[   anyintNotImplementedErrortyperg   s    r,   rj   rj      s    #u|$$   	C$	'	' 55555555	u	C		 u
8$s))
D
DDr.   c                     d S r&    rq   s    r,   reduce_to_scalar_lossrt      s    >Acr.   .c                     d S r&   rs   rq   s    r,   rt   rt      s	     Cr.   c                    t          | t          j                  r)|                                 |                                 z  S t          | t
          t          f          r)t          d | D                       t          |           z  S t          |           j	        dv rt          | j                  S t          |           j	        dk    r| j                                        S t          | t                    rMt          d |                                 D                       t          |                                           z  S t!          dt          |                     )z/Reduce the output of a model to get scalar lossc              3   4   K   | ]}t          |          V  d S r&   rt   rk   s     r,   rU   z(reduce_to_scalar_loss.<locals>.<genexpr>   s+      99(++999999r.   )MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsSquashedNormalc              3   4   K   | ]}t          |          V  d S r&   rx   )rS   values     r,   rU   z(reduce_to_scalar_loss.<locals>.<genexpr>   s+      JJE(//JJJJJJr.   rl   )rP   rE   rQ   sumnumelr\   r[   lenrp   __name__rt   logitsmeandictvalueskeysro   rq   s    r,   rt   rt      s1   #u|$$ 
wwyy399;;&&	C$	'	' 
99S99999CHHDD	c	   
 

 %SZ000	c	/	/	/x||~~	C		 
JJSZZ\\JJJJJSHHJJN
 N
 
 	
 8$s))
D
DDr.   c                      t           j                            t           j                            t                    d          } t           j                            |           st          j        |            | S )Nz../debug)ospathjoindirname__file__existsmkdir)r   s    r,   	debug_dirr      sM    7<<11:>>D7>>$ 
Kr.   r1   codeextrac           	      x   t          t          j                            t	                      |           d          5 }|                    t          j        |                                           dt          j        |                                           d| d           d d d            d S # 1 swxY w Y   d S )Nwz


)	openr   r   r   r   writedisBytecodeinfo)r/   r   r   fds       r,   
debug_dumpr      s    	bgll9;;--s	3	3 
r
|D!!&&((UUcl4.@.@.D.D.F.FUUEUUU	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   A'B//B36B3)skipframe
cache_sizehooks_r   c                   dt           t                   dt          ddfd}t          j        j                                        }t          j        j                            d          5  |5  t          | j                  r&t                      cddd           cddd           S t          | j                   t          | j        |          \  }}t          i dddg dd	it                      t                      | j        g d
          }t          t!          |t#          | j        |          j        t'          d	d	                              cddd           cddd           S # 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zused to debug jump updatesinstructionscode_optionsr$   Nc                     |                      dt          d                     |                      dt          d                     d S )Nr   NOP)insertr   )r   r   s     r,   insert_nopsz&debug_insert_nops.<locals>.insert_nops   sF    A1%88999A1%8899999r.   debug_insert_nopsF_idr   )r   compiler_fnroot_txexportexport_constraintsframe_statelocal_scopeglobal_scopef_codetorch_function_mode_stackpackage)frame_idframe_compile_id)r\   r   rE   _dynamoutilsget_metrics_contextdynamo_timedr   r   r   r   r   r   localsglobalsr   r   r   guard_managerr   )	r   r   r   r   r   r   metrics_contextr   rG   s	            r,   r   r      sX   
:$s) :3 :4 : : : : m)==??O			)	)*=	>	> 
 
 
 
%% 	(%''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 	U\"""'kBBa!
 <&(
 
 
 !$U\599G1q999 
 
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sC   'E?*"E'E?%B)E'E?'E+	+E?.E+	/E??FFc                   l    e Zd Zd	dZdej        j        deej                 de	de
f         fdZd	dZdS )
CompileCounterr$   Nc                 <    d| _         |                                  d S Nr   )frame_countclearselfs    r,   __init__zCompileCounter.__init__   s    :;

r.   r@   rM   .c                     | xj         dz  c_         |j        j        D ]}d|j        v r| xj        dz  c_        |j        S )Nr   call)r   rG   nodesopop_countforward)r   r@   rM   nodes       r,   __call__zCompileCounter.__call__   sQ     	AHN 	# 	#D  "zr.   c                 d    t           j        rt          d          | _        nd| _        d| _        d S r   )r   debug_disable_compile_counterr   r   r   r   s    r,   r   zCompileCounter.clear   s3    / 	!033D Dr.   r$   N)r   
__module____qualname__r   rE   r   GraphModuler\   rQ   r   r   r   r   rs   r.   r,   r   r      s}           (&8<U\8J	#s(	        r.   r   c                   t    e Zd ZdeddfdZdej        j        deej	                 de
def         fdZd
d	ZdS )CompileCounterWithBackendrB   r$   Nc                 X    d| _         || _        g | _        |                                  d S r   )r   rB   graphsr   )r   rB   s     r,   r   z"CompileCounterWithBackend.__init__   s)    :;24

r.   r@   rM   .c                     ddl m} | xj        dz  c_        |j        j        D ]}d|j        v r| xj        dz  c_        | j                            |             || j	                  ||          S )Nr   )lookup_backendr   )
backends.registryr   r   rG   r   r   r   r   rV   rB   )r   r@   rM   r   r   s        r,   r   z"CompileCounterWithBackend.__call__  s     	655555AHN 	# 	#D  "2+~~dl++B???r.   c                 r    t           j        rt          d          | _        nd| _        d| _        g | _        d S r   )r   r   r   r   r   r   r   s    r,   r   zCompileCounterWithBackend.clear  s:    / 	!033D Dr.   r   )r   r   r   strr   rE   r   r   r\   rQ   r   r   r   r   rs   r.   r,   r   r      s             
@(&
@8<U\8J
@	#s(	
@ 
@ 
@ 
@     r.   r   c                   d    e Zd ZddZdej        j        deej                 de	de
f         fdZdS )	EagerAndRecordGraphsr$   Nc                     g | _         d S r&   )r   r   s    r,   r   zEagerAndRecordGraphs.__init__  s    24r.   r@   rM   .c                 D    | j                             |           |j        S r&   )r   rV   r   )r   r@   rM   s      r,   r   zEagerAndRecordGraphs.__call__  s"     	2zr.   r   r   r   r   r   rE   r   r   r\   rQ   r   r   r   rs   r.   r,   r   r     si        5 5 5 5(&8<U\8J	#s(	     r.   r   c                   d    e Zd ZddZdej        j        deej                 de	de
f         fdZdS )	AotEagerAndRecordGraphsr$   Nc                 0    g | _         g | _        g | _        d S r&   )r   	fw_graphs	bw_graphsr   s    r,   r   z AotEagerAndRecordGraphs.__init__$  s    245757r.   r@   rM   .c                 f     j                             |           dt          j        j        dt
          t          j                 dt          dt          f         f fd}dt          j        j        dt
          t          j                 dt          dt          f         f fd}t          ||||          S )Nr@   rM   r$   .c                 F    j                             |            | j        S r&   )r   rV   r   r@   rM   r   s     r,   fw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.fw_compiler.  #     N!!"%%%:r.   c                 F    j                             |            | j        S r&   )r   rV   r   r   s     r,   bw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler4  r   r.   )r   r   )
r   rV   rE   r   r   r\   rQ   r   r   r   )r   r@   rM   r   r   s   `    r,   r   z AotEagerAndRecordGraphs.__call__)  s     	2	$	6:5<6H	c3h	 	 	 	 	 		$	6:5<6H	c3h	 	 	 	 	 	 ##	
 
 
 	
r.   r   r   rs   r.   r,   r   r   #  si        8 8 8 8

(&
8<U\8J
	#s(	
 
 
 
 
 
r.   r   c                       e Zd ZddZd ZdS )InductorAndRecordGraphsr$   Nc                 "    g | _         g | _        d S r&   )r   inductor_graphsr   s    r,   r   z InductorAndRecordGraphs.__init__C  s    24;=r.   c                      dd l mc m}  j                            |           |j         fd}t          j        |d|          5  |                    ||          cd d d            S # 1 swxY w Y   d S )Nr   c                  T    j                             | d                     | i |S r   )r   rV   )r>   r?   old_compile_fx_innerr   s     r,   patchedz1InductorAndRecordGraphs.__call__.<locals>.patchedN  s4     ''Q000''8888r.   _compile_fx_inner)new)torch._inductor.compile_fx	_inductor
compile_fxr   rV   r   r   object)r   r@   rM   compile_fx_modr   r   s   `    @r,   r   z InductorAndRecordGraphs.__call__G  s   ;;;;;;;;;2-?	9 	9 	9 	9 	9 	9 \.*=7KKK 	A 	A!,,R@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   
A--A14A1r   )r   r   r   r   r   rs   r.   r,   r   r   B  s<        > > > >A A A A Ar.   r   c                 .    t          j        dd|           S )Nz(?m)^ *#.*\n?r1   r2   r   s    r,   strip_commentr  V  r6   r.   c                 f    d                     d |                     d          D                       S )Nr   c                 6    g | ]}|                                 S rs   )rstrip)rS   lines     r,   
<listcomp>z)remove_trailing_space.<locals>.<listcomp>[  s     AAAdkkmmAAAr.   )r   splitr   s    r,   remove_trailing_spacer  Z  s/    99AA

40@0@AAABBBr.   gm_strc                 :    t          t          |                     S r&   )r  r  )r	  s    r,   normalize_gmr  ^  s     !v!6!6777r.   c                 2    t          j        dd|           }|S )z-
    Normalize code: remove empty lines.
    z[\r\n]+r   r2   )r   normal_codes     r,   empty_line_normalizerr  d  s     &T400Kr.   r   rH   nargsexpected_opsexpected_ops_dynamicexpected_frame_countc                    t           j        s||}t                      }d t          |          D             }d t          |          D             } || }	 || }
t	                        t          |          |          } || } || } || } || }t	                       |                     t          ||	                     |                     t          ||	                     |                     t          ||
                     |                     t          ||
                     |                     |j	        |           ||                     |j
        |           d S d S )Nc                 8    g | ]}t          j        d d           S 
   rE   randnrS   r   s     r,   r  z!standard_test.<locals>.<listcomp>y  $    777QU[R  777r.   c                 8    g | ]}t          j        d d           S r  r  r  s     r,   r  z!standard_test.<locals>.<listcomp>z  r  r.   )r   assume_static_by_defaultr   ranger   r   
assertTruer   assertEqualr   r   )r   rH   r  r  r  r  actualargs1args2correct1correct2opt_fnval1aval2aval1bval2bs                   r,   standard_testr*  l  sx    * ,/C/O+F77%,,777E77%,,777Er5zHr5zH	GGG$_V$$R((FFENEFENEFENEFENE	GGGOOD))***OOD))***OOD))***OOD))***V')=>>>,77777  r.   r@   c                     | j         S r&   )r   )r@   rM   s     r,   dummy_fx_compiler,    s     :r.   T皙?speeduppvalue
is_correctpvalue_thresholdc                 4    |sdS ||k    r| ddS | dd|dS )NERRORz.3fzx SAMEzx p=z.2frs   )r.  r/  r0  r1  s       r,   format_speedupr4    sI      w   %%%%%+++v++++r.   cpusizestridedtypedevice
extra_sizec                    |}t          d | D                       r-|t          d t          | |          D                       dz   z  }|j        rZ|j        dk    r7	 t          j        |t
          j        |                              |          }n0t          j        |||          }nt          j	        |g||          }t          j
        || |          S )Nc              3   "   K   | ]
}|d k    V  dS )r   Nrs   )rS   ss     r,   rU   zrand_strided.<locals>.<genexpr>  s&      

Q1q5





r.   c              3   ,   K   | ]\  }}|d z
  |z  V  dS )r   Nrs   )rS   shaper7  s      r,   rU   zrand_strided.<locals>.<genexpr>  s/      LLf$LLLLLLr.   r   )r8  r9  )r8  )r6  r8  r9  )allr   zipis_floating_pointitemsizerE   r  float16tozeros
as_strided)r6  r7  r8  r9  r:  needed_sizerd   s          r,   rand_stridedrI    s     K


$


 
LL#dF:K:KLLLLLqP	
  M>Q [EM&QQQTT U  FF [E&IIIFF;-uVLLLFD&111r.   _Tc                      t           j         S r&   )r   r  rs   r.   r,   check_dynamic_shape_capturerL    s    ...r.   patchesc                      t          j                   dt          j        dt          j        dt
          f fd            }|S )Nr>   r?   r$   c            	          t          j                    5 }D ]/\  }}}|                    t          j        |||                     0 | i |cd d d            S # 1 swxY w Y   d S r&   )
contextlib	ExitStackenter_contextr   r   )r>   r?   stackmoduleattrvalrH   rM  s         r,   _fnz"_make_fn_with_patches.<locals>._fn  s    !## 	'u%, E E!c##ELs$C$CDDDD2t&v&&		' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   :AA #A )	functoolswrapsr"   r>   r?   rJ  )rH   rM  rW  s   `` r,   _make_fn_with_patchesrZ    s\    _R'27 'bi 'B ' ' ' ' ' ' ' Jr.   c                     | S r&   rs   r+   s    r,   <lambda>r\    s    a r.   )
xfail_prop	decoratorcls
cls_prefix	fn_suffixr]  r^  c          	      <   t          | | j         | j        i           }|j        |_        t	          |           D ]}|                    d          rt          | |          }t          |          s t          ||t          | |                     V| | }	t          |g|R  }
|	|
_        |$t          ||          rt          j        |
          }
t          ||	 ||
                     t          ||          st          ||t          | |                     |S )Ntest_)rp   r   	__bases__r   dir
startswithgetattrcallablesetattrrZ  hasattrunittestexpectedFailure)r_  r`  ra  r]  r^  rM  DummyTestClassr/   rH   new_namenew_fns              r,   make_test_cls_with_patchesrp    s9    Z777KKN"0"9NC > >??7## 	>d##BB<< gc4.@.@AAA+	++H*28888F&FO%'"j*A*A%!1&99NHii.?.?@@@@.. 	>ND'#t*<*<===r.   c                 N    t           j        dk    r| S t          j        |           S )N)r!      sysversion_infork  r   rH   s    r,   skipIfNotPy311rw    s%    
7""	=r.   c                 `    t           j        dk    r| S  t          j        d          |           S )Nr!      zRequires Python 3.12+rs  rv  s    r,   skipIfNotPy312r{    s0    
7""	18=011"555r.   c                 N    t           j        dk    rt          j        |           S | S )Nry  )rt  ru  rk  rl  rv  s    r,   xfailIfPy312r}    s&    
7""'+++Ir.   c                 `    t           j        dk    r t          j        d          |           S | S )Nry  zNot supported in Python 3.12+rs  rv  s    r,   skipIfPy312r    s0    
7""=x}<==bAAAIr.   c                 `    t           j        dk    r| S  t          j        d          |           S )N)r!   r  zRequires Python 3.10+rs  rv  s    r,   requiresPy310r    s0    
7""	5x}455b999r.   c                     d| _         | S NT)_expected_failure_dynamicrv  s    r,   expectedFailureDynamicr    s    #'B Ir.   c                     d| _         | S r  )!_expected_failure_codegen_dynamicrv  s    r,   expectedFailureCodegenDynamicr        +/B(Ir.   c                     d| _         | S r  )!_expected_failure_dynamic_wrapperrv  s    r,   expectedFailureDynamicWrapperr    r  r.   Fuse_xlac                 &   t          j        d           t          j        d           t          rt          j                            d           | r@dd lmc m} |                    dt          |
                                                     d S d S )Ni9  r   )rE   manual_seedrandomseedr    torch_xla.core.xla_modelcore	xla_modelset_rng_stater   
xla_device)r  xms     r,   reset_rng_stater  "  s    	d
K	 
	t 5---------
s2==??33444445 5r.   fr>   r?   c                      | |i |S r&   rs   )r  r>   r?   s      r,   &_skipped_function_for_test_reconstructr  -  s     1dfr.   )r1   )NNr   )Tr-  )F)t__doc__rP  r   rX  loggingos.pathr   r  r3   rt  typesrk  collections.abcr   typingr   r   r   r   r   r	   typing_extensionsr
   unittest.mockr   rE   r    torch._dynamo.backends.debuggingr   torch._dynamo.output_graphr   r1   r   r   r   r   bytecode_transformationr   r   r   r   guardsr   r   r   r   r   r   r   r   r   r    
ModuleType__annotations__numpyModuleNotFoundErrorunsupportedthree	getLoggerr   logr"   rQ   r-   r   r5   rI   nnModuler\   rf   boolrj   rt   r[   r   floatr   CodeTyper   rn   r   r   r   r   r   r   r  r  r  r  r*  r   r,  r4  float32r8  r9  rI  rJ  rL  rZ  rp   rp  rw  r{  r}  r  r  r  r  r  r  r>   r?   r  rs   r.   r,   <module>r     sO
         



        				 



   $ $ $ $ $ $ D D D D D D D D D D D D D D D D ' ' ' ' ' '              6 6 6 6 6 6 2 2 2 2 2 2 8 8 8 8 8 8 8 8 8 8 8 8            A @ @ @ @ @ @ @ @ @ I I I I I I I I I I * * * * * * * * "&HU % % %   	BBB $	g!!Yt__>& >8EL+A > > > >. . . . . .$ $ $"%8?%(+%36%HK%	#Y% % % %P	E3 	E4 	E 	E 	E 	E 
 Au| A A A A 
 A 
	tCy%S/4S>9	:
   

Es EuU\5-@'A E E E E,3    
 
S 
 
s 
D 
 
 
 
 QR%
 %
 %
%
(+%
47%
<?%
JM%
%
 %
 %
 %
P       ,       <       
 
 
 
 
 
 
 
>A A A A A A A A(. . . . . .C C C C C C8 8 8 8 8 8      #'*. !8 8
8c8 8 3-	8
 #3-8 8 
8 8 8 8B
(,U\(:c3h    !	
, 
,
,
, 
, 	
,
 	
, 
, 
, 
,  ',2 2
3-2SM2 ;2 #u|#$	2
 2 \2 2 2 2: WT]]/T / / / /
	hr2v. 	# 	(2r6BR 	 	 	 	" !%DOK  	  	
  #s(+,hsCx.@@A 
   >xB' HRV,<    6xB' 6HRV,< 6 6 6 6Xb"f% (2r6*:    HRV$ "b&)9    :hr2v& :8BF+; : : : :xB/ HRV4D    hr2v&6 8BF;K    hr2v&6 8BF;K    
5 5T 5d 5 5 5 5B "359     s   +B0 0B:9B: