
    9jfK                        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mZmZ ddl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l/m0Z0m1Z1 dZ2e
jf                  dz  e4d<   	 ddl5Z2e jn                  Z7dZ8 ejr                  e:      Z; ed      Z<dejz                  dz  dejz                  dz  fdZ>de?de?fdZ@d ZAd ZBdej                  j                  dedededeEe   f
dZFdedeGfd ZHedejz                  dejz                  fd!       ZIedeEe   eJed"f   z  eKeef   z  deLfd#       ZIdedejz                  eLz  fd$ZIde?fd%ZMdpde?d&e
j                  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>ZZd&e?de?fd?Z[	 	 	 dqd@edAed"ef   dBePdCePdz  dDePdz  dEePddfdFZ\dGej                  deEejz                     ded"ef   fdHZ^	 	 drdIeLdJeLdKeGdLeLde?f
dMZ_ej                  dNdfdOeeP   dPeeP   dQej                  dRe?ej                  z  dSePdejz                  fdTZc edU      ZddeGfdVZedAee<edf   dWedee<edf   fdXZfddY dZd[egd\e?d]e?dWed^e?dz  d_eed"ef   ged"ef   f   degfd`ZhdAee<edf   dee<edf   fdaZidAee<edf   dee<edf   fdbZjdAee<edf   dee<edf   fdcZkdAee<edf   dee<edf   fddZldAee<edf   dee<edf   fdeZmdAee<edf   dee<edf   fdfZndAee<edf   dee<edf   fdgZodAee<edf   dee<edf   fdhZpdsdieGddfdjZqdkee<edf   dle<j                  dme<j                  dedfdnZtdauej                  deeEej2                  j                        fdo       Zwy# e6$ r dZ2Y Hw xY w)ta1  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)Callable	GeneratorSequence)AnyoverloadTypeVar)	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                 v    | y | j                         j                         j                  | j                        S N)detachclonerequires_grad_requires_gradr"   s    U/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/testing.pyclone_mer,   ?   s.    y88:,,Q__==    namec                 0    t        j                  dd|       S )Nz^_orig_mod[.] resub)r.   s    r+   remove_optimized_module_prefixr4   E       66"B--r-   c                     ddl m d d fd}  t        j                  |d      |       |i | j                  fS )Nr   )InstructionTranslatorc                 T    | j                         j                  j                  | S r%   )
current_txoutputregion_tracker)_gmargskwargsr7   gmr;   s      r+   extract_graph_backendz8extract_graph_and_tracker.<locals>.extract_graph_backendO   s)     .99;BBQQ
r-   T)backend	fullgraph)torch._dynamo.symbolic_convertr7   torchcompilegraph)fnr=   r>   r@   r7   r?   r;   s       @@@r+   extract_graph_and_trackerrH   I   sJ    D	BN E@EMM/4@DdUfU88^##r-   c                     t               }  t        j                  |      |       |i |}||j                  |j                  |j
                  fS )N)rA   )AotEagerAndRecordGraphsrD   rE   graphs	fw_graphs	bw_graphs)rG   r=   r>   rA   results        r+   extract_graphrO   Z   sK    %'G/+U]]7+B/@@F7>>7#4#4g6G6GGGr-   model
predictionlossexample_inputsc                    g }|j                  |       |j                  |       i }i }| j                         D ]f  \  }}t        | t        j                        rt        |      }|}	|j                  }
|j                  t        j                  |      }
|
||dz   <   |	||<   h |j                  |       |j                  |       i }| j                         D ]/  \  }}t        | t        j                        rt        |      }|||<   1 |j                  |       |D ]g  }t        |t        t        f      r|j                  d |D               2t        |t        j                        sM|j                  |j                         i |S )Nz.gradc              3   j   K   | ]+  }t        |t        j                        s|j                   - y wr%   )
isinstancerD   Tensorgrad).0inps     r+   	<genexpr>z"collect_results.<locals>.<genexpr>   s!     X*S%,,:W388Xs   33)appendnamed_parametersrV   r   OptimizedModuler4   rX   rD   
zeros_likenamed_bufferstuplelistextendrW   )rP   rQ   rR   rS   resultsgradsparamsr.   param
param_copyrX   buffersbufferexamples                 r+   collect_resultsrl   `   sb    GNN:NN4 EF--/ 	"eeZ7781$7D
zz::##E*D $dWn!t	" NN5NN6G++- feZ7781$7D NN7! -gt}-NNXwXX'5<<0w||,- Nr-   outc                     t        | t        j                        r| j                  S t        | t        t
        f      rt        d | D              S | yt        | t              ryt        dt        |             )Nc              3   2   K   | ]  }t        |        y wr%   )requires_bwd_passrY   r"   s     r+   r[   z$requires_bwd_pass.<locals>.<genexpr>   s     5A$Q'5   FDon't know how to reduce)
rV   rD   rW   r)   rb   ra   anyintNotImplementedErrortyperm   s    r+   rp   rp      sb    #u||$   	C$	'5555		C	
8$s)
DDr-   c                      y r%    rx   s    r+   reduce_to_scalar_lossr{      s    >Ar-   .c                      y r%   rz   rx   s    r+   r{   r{      s     r-   c                 Z   t        | t        j                        r!| j                         | j	                         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                  j                         S t        | t              r:t        d | j                         D              t        | j                               z  S t!        dt        |             )z/Reduce the output of a model to get scalar lossc              3   2   K   | ]  }t        |        y wr%   r{   rq   s     r+   r[   z(reduce_to_scalar_loss.<locals>.<genexpr>   s     9(+9rr   )MaskedLMOutputSeq2SeqLMOutput!CausalLMOutputWithCrossAttentionsSquashedNormalc              3   2   K   | ]  }t        |        y wr%   r   )rY   values     r+   r[   z(reduce_to_scalar_loss.<locals>.<genexpr>   s     JE(/Jrr   rs   )rV   rD   rW   sumnumelrb   ra   lenrw   __name__r{   logitsmeandictvalueskeysrv   rx   s    r+   r{   r{      s    #u||$wwy399;&&	C$	'9S99CHDD	c		   

 %SZZ00	c		/	/xx||~	C	JSZZ\JJSHHJN
 
 	
 8$s)
DDr-   c                      t         j                  j                  t         j                  j                  t              d      } t         j                  j                  |       st        j                  |        | S )Nz../debug)ospathjoindirname__file__existsmkdir)r   s    r+   	debug_dirr      sC    77<<1:>D77>>$
Kr-   codeextrac           	      J   t        t        j                  j                  t	               |       d      5 }|j                  t        j                  |      j                          dt        j                  |      j                          d| d       d d d        y # 1 sw Y   y xY w)Nwz


)	openr   r   r   r   writedisBytecodeinfo)r.   r   r   fds       r+   
debug_dumpr      s}    	bggll9;-s	3 
r
||D!&&()cll4.@.D.D.F-GtE7RTU	

 
 
s   ABB")skipframe
cache_sizehooks_r   c                   dt         t           dt        ddfd}t        j                  j                  j                         }t        j                  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 Y   nxY wddd       y# 1 sw Y   yxY w)zused to debug jump updatesinstructionscode_optionsr#   Nc                 p    | j                  dt        d             | j                  dt        d             y )Nr   NOP)insertr   )r   r   s     r+   insert_nopsz&debug_insert_nops.<locals>.insert_nops   s.    A1%89A1%8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)rb   r   rD   _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   rF   s	            r+   r   r      s1   
:$s) :3 :4 : mm))==?O				)	)*=	> 
 
%%'
 
 
 	U\\"'kBa!
 <<&(
 !$U\\59GG1q9
+
 
 
 
 
 
 
s1   +E&.E	E& BE>	E&E	E&&E/c                   |    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y)
CompileCounterr#   Nc                 2    d| _         | j                          y Nr   )frame_countclearselfs    r+   __init__zCompileCounter.__init__   s    45

r-   r?   rS   .c                     | xj                   dz  c_         |j                  j                  D ]&  }d|j                  v s| xj                  dz  c_        ( |j
                  S )Nr   call)r   rF   nodesopop_countforward)r   r?   rS   nodes       r+   __call__zCompileCounter.__call__   sR     	AHHNN 	#D "	# zzr-   c                 p    t         j                  rt        d      | _        d| _        y d| _        d| _        y r   )r   debug_disable_compile_counterr   r   r   r   s    r+   r   zCompileCounter.clear   s2    //03D   !Dr-   r#   N)r   
__module____qualname__r   rD   r   GraphModulerb   rW   r   r   r   r   rz   r-   r+   r   r      sE    ((&&8<U\\8J	#s(	r-   r   c                       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y)CompileCounterWithBackendrA   r#   Nc                 N    d| _         || _        g | _        | j                          y r   )r   rA   rK   r   )r   rA   s     r+   r   z"CompileCounterWithBackend.__init__  s!    4524

r-   r?   rS   .c                    ddl m} | xj                  dz  c_        |j                  j                  D ]&  }d|j
                  v s| xj                  dz  c_        ( | j                  j                  |         || j                        ||      S )Nr   )lookup_backendr   )
backends.registryr   r   rF   r   r   r   rK   r\   rA   )r   r?   rS   r   r   s        r+   r   z"CompileCounterWithBackend.__call__  su     	6AHHNN 	#D "	# 	2+~dll+B??r-   c                 p    t         j                  rt        d      | _        nd| _        d| _        g | _        y r   )r   r   r   r   r   rK   r   s    r+   r   zCompileCounterWithBackend.clear  s.    //03D Dr-   r   )r   r   r   strr   rD   r   r   rb   rW   r   r   r   r   rz   r-   r+   r   r      sW      
@((&&
@8<U\\8J
@	#s(	
@r-   r   c                   t    e Zd ZddZdej
                  j                  deej                     de	de
f   fdZy)	EagerAndRecordGraphsr#   Nc                     g | _         y r%   )rK   r   s    r+   r   zEagerAndRecordGraphs.__init__  s	    24r-   r?   rS   .c                 P    | j                   j                  |       |j                  S r%   )rK   r\   r   )r   r?   rS   s      r+   r   zEagerAndRecordGraphs.__call__"  s      	2zzr-   r   r   r   r   r   rD   r   r   rb   rW   r   r   r   rz   r-   r+   r   r     s@    5((&&8<U\\8J	#s(	r-   r   c                   t    e Zd ZddZdej
                  j                  deej                     de	de
f   fdZy)	rJ   r#   Nc                 .    g | _         g | _        g | _        y r%   )rK   rL   rM   r   s    r+   r   z AotEagerAndRecordGraphs.__init__*  s    245757r-   r?   rS   .c                 p     j                   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?   rS   r#   .c                 R    j                   j                  |        | j                  S r%   )rL   r\   r   r?   rS   r   s     r+   fw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.fw_compiler4  !     NN!!"%::r-   c                 R    j                   j                  |        | j                  S r%   )rM   r\   r   r   s     r+   bw_compilerz5AotEagerAndRecordGraphs.__call__.<locals>.bw_compiler:  r   r-   )r   r   )
rK   r\   rD   r   r   rb   rW   r   r   r   )r   r?   rS   r   r   s   `    r+   r   z AotEagerAndRecordGraphs.__call__/  s     	2	$$	6:5<<6H	c3h		$$	6:5<<6H	c3h	 ##	
 	
r-   r   r   rz   r-   r+   rJ   rJ   )  s@    8

((&&
8<U\\8J
	#s(	
r-   rJ   c                       e Zd ZddZd Zy)InductorAndRecordGraphsNc                      g | _         g | _        y r%   )rK   inductor_graphsr   s    r+   r   z InductorAndRecordGraphs.__init__I  s    24;=r-   c                      dd l mc m}  j                  j	                  |       |j
                   fd}t        j                  |d|      5  |j                  ||      cd d d        S # 1 sw Y   y xY w)Nr   c                  P    j                   j                  | d           | i |S r   )r   r\   )r=   r>   old_compile_fx_innerr   s     r+   patchedz1InductorAndRecordGraphs.__call__.<locals>.patchedT  s+      ''Q0'888r-   _compile_fx_inner)new)torch._inductor.compile_fx	_inductor
compile_fxrK   r\   r   r
   object)r   r?   rS   compile_fx_modr   r   s   `    @r+   r   z InductorAndRecordGraphs.__call__M  sh    ;;2-??	9 \\.*=7K 	A!,,R@	A 	A 	As   A--A6r   )r   r   r   r   r   rz   r-   r+   r   r   H  s    >Ar-   r   c                 0    t        j                  dd|       S )Nz(?m)^ *#.*\n?r0   r1   )r   s    r+   strip_commentr  \  r5   r-   c                     dj                  | j                  d      D cg c]  }|j                          c}      S c c}w )Nr   )r   splitrstrip)r   lines     r+   remove_trailing_spacer  `  s.    99

40@AdkkmABBAs   =c                     | j                  d      }g }d}|D ].  }|j                         dk(  r|rd}nd}|j                  |       0 dj                  |      S )Nr   Fr0   T)r  stripr\   r   )r   linesrN   	saw_blankr  s        r+   _squash_blank_linesr  d  sd    JJtEFI ::<2IId 99Vr-   gm_strc                 D    t        |       }t        |      }t        |      S r%   )r  r  r  )r  strippedno_trailings      r+   normalize_gmr  s  s#     V$H'1K{++r-   c                 4    t        j                  dd|       }|S )z-
    Normalize code: remove empty lines.
    z[\r\n]+r   r1   )r   normal_codes     r+   empty_line_normalizerr  {  s     &&T40Kr-   r   rG   nargsexpected_opsexpected_ops_dynamicexpected_frame_countc                    t         j                  s||}t               }t        |      D cg c]  }t	        j
                  dd       }}t        |      D cg c]  }t	        j
                  dd       }	} || }
 ||	 }t                 t        |      |      } || } ||	 } || } ||	 }t                | j                  t        ||
             | j                  t        ||
             | j                  t        ||             | j                  t        ||             | j                  |j                  |       || j                  |j                  |       y y c c}w c c}w )N
   )r   assume_static_by_defaultr   rangerD   randnr   r   
assertTruer   assertEqualr   r   )r   rG   r  r  r  r  actualr   args1args2correct1correct2opt_fnval1aval2aval1bval2bs                    r+   standard_testr+    s?    **/C/O+F*/,7QU[[R 7E7*/,7QU[[R 7E75zH5zH	G$_V$R(FENEENEENEENE	GOOD)*OOD)*OOD)*OOD)*V'')=>,7  ! 87s   E"E'r?   c                     | j                   S r%   )r   )r?   rS   s     r+   dummy_fx_compiler-    s     ::r-   speeduppvalue
is_correctpvalue_thresholdc                 0    |sy||kD  r| ddS | dd|dS )NERRORz.3fzx SAMEzx p=z.2frz   )r.  r/  r0  r1  s       r+   format_speedupr4    s7       #f%%c]$vcl++r-   cpusizestridedtypedevice
extra_sizec                 Z   |}t        d | D              r"|t        d t        | |      D              dz   z  }|j                  r|t        j
                  k(  rGt	        j                  dd|ft        j                  |      j                  t        j
                        }ny|j                  dk(  r8	 t	        j                  |t        j                  |      j                  |      }n2t	        j                  |||      }nt	        j                  |g||      }t	        j                  || |      S )	Nc              3   &   K   | ]	  }|d kD    yw)r   Nrz   )rY   ss     r+   r[   zrand_strided.<locals>.<genexpr>  s     
Q1q5
s   c              3   2   K   | ]  \  }}|d z
  |z    yw)r   Nrz   )rY   shaper7  s      r+   r[   zrand_strided.<locals>.<genexpr>  s     Lf$Lrr   r   r      )r8  r9  )r8  )r6  r8  r9  )allr   zipis_floating_pointrD   float4_e2m1fn_x2randintuint8viewitemsizer  float16tozeros
as_strided)r6  r7  r8  r9  r:  needed_sizerj   s          r+   rand_stridedrN    s    K

$
L#dF:KLLqP	
 E***]]3ekk&d5))*  ^^q  [[EMM&QTT U F [[E&IF;-uVLFD&11r-   _Tc                  $    t         j                   S r%   )r   r  rz   r-   r+   check_dynamic_shape_capturerQ    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 ],  \  }}}|j                  t        j                  |||             .  | i |cd d d        S # 1 sw Y   y xY wr%   )
contextlib	ExitStackenter_contextr
   r   )r=   r>   stackmoduleattrvalrG   rR  s         r+   _fnz"_make_fn_with_patches.<locals>._fn  sh    !!# 	'u%, E!c##ELLs$CDE t&v&		' 	' 	's   9AA")	functoolswrapsr!   r=   r>   rO  )rG   rR  r\  s   `` r+   _make_fn_with_patchesr_    sB    __R'277 'bii 'B ' ' Jr-   c                     | S r%   rz   r*   s    r+   <lambda>ra    s    a r-   )
xfail_prop	decoratorcls
cls_prefix	fn_suffixrb  rc  c          	         t        | | j                   | j                  i       }|j                  |_        t	        |       D ]  }|j                  d      rt        | |      }t        |      st        ||t        | |             C| | }	t        |g| }
|	|
_        |!t        ||      rt        j                  |
      }
t        ||	 ||
             t        ||      rt        ||t        | |              |S )Ntest_)rw   r   	__bases__r   dir
startswithgetattrcallablesetattrr_  hasattrunittestexpectedFailure)rd  re  rf  rb  rc  rR  DummyTestClassr.   rG   new_namenew_fns              r+   make_test_cls_with_patchesru    s     ZL7KN"0"9"9NC >??7#d#BB<gc4.@A	{+H*288F&FO%'"j*A!11&9NHi.?@.ND'#t*<=>  r-   c                 V    t         j                  dk\  r| S t        j                  |       S )N)r       sysversion_inforp  r   rG   s    r+   skipIfNotPy311r|    s$    
7"	==r-   c                 b    t         j                  dk\  r| S  t        j                  d      |       S )Nr       zRequires Python 3.12+rx  r{  s    r+   skipIfNotPy312r    s,    
7"	18==01"55r-   c                     t         j                  dk\  st         j                  dk  r t        j                  d      |       S | S )N)r       r~  zRequires Python 3.12rx  r{  s    r+   skipIfOnlyNotPy312r    s9    
7"c&6&6&@4x}}34R88Ir-   c                 V    t         j                  dk\  rt        j                  |       S | S )Nr~  )ry  rz  rp  rq  r{  s    r+   xfailIfPy312r    s&    
7"''++Ir-   c                 b    t         j                  dk\  r t        j                  d      |       S | S )Nr~  zNot supported in Python 3.12+rx  r{  s    r+   skipIfPy312r  $  s,    
7"=x}}<=bAAIr-   c                     d| _         | S NT)_expected_failure_dynamicr{  s    r+   expectedFailureDynamicr  ,  s    #'B Ir-   c                     d| _         | S r  )!_expected_failure_codegen_dynamicr{  s    r+   expectedFailureCodegenDynamicr  2      +/B(Ir-   c                     d| _         | S r  )!_expected_failure_dynamic_wrapperr{  s    r+   expectedFailureDynamicWrapperr  8  r  r-   use_xlac                    t        j                  d       t        j                  d       t        rt        j                  j                  d       | r3dd lmc m} |j                  dt        |j                                      y y )Ni9  r   )rD   manual_seedrandomseedr   torch_xla.core.xla_modelcore	xla_modelset_rng_stater   
xla_device)r  xms     r+   reset_rng_stater  =  sX    	d
KK	
		t--
s2==?34 r-   fr=   r>   c                      | |i |S r%   rz   )r  r=   r>   s      r+   &_skipped_function_for_test_reconstructr  H  s     dfr-   c               #   4   K   g a 	 t          da y# da w xY ww)a\  
    Context manager to capture graph modules compiled by invoke_subgraph_inductor_compile.

    Usage:
        with _testing_capture_invoke_subgraph_inductor_compile_gms() as captured_gms:
            # code that triggers invoke_subgraph_inductor_compile
            pass
        # captured_gms will contain the list of captured graph modules
    N)6_testing_invoke_subgraph_inductor_compile_captured_gmsrz   r-   r+   5_testing_capture_invoke_subgraph_inductor_compile_gmsr  Q  s'      >@:FDDAE>>s    )r0   )NNr   )Tg?)F)x__doc__rU  r   r]  loggingos.pathr   r  r2   ry  typesrp  collections.abcr   r   r   typingr   r   r   typing_extensionsr	   unittest.mockr
   rD   r    torch._dynamo.backends.debuggingr   torch._dynamo.output_graphr   r0   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!   rW   r,   r   r4   rH   rO   nnModulerb   rl   boolrp   r{   ra   r   floatr   CodeTyper   ru   r   r   r   r   rJ   r   r  r  r  r  r  r+  r   r-  r4  float32r8  r9  rN  rO  rQ  r_  rw   ru  r|  r  r  r  r  r  r  r  r  r=   r>   r  r  contextmanagerr  rz   r-   r+   <module>r     s    
     	 
   9 9 ) ) '    6 2 8 8  A @ I I * #Et "
 $$	g!t_>t# >t(; >. . .$"H%88??%(+%36%HK%	#Y%P	E3 	E4 	E 
 Au|| A A 
 A 
	cU38_	$tCH~	5
 

Es Eu||e'; E,3 
S 
 
s 
D 
 QR%
%
(+%
47%
<?%
JM%
%
P , < 
 
>A A(. . .C C Cc c , , ,    $'+ !8
8c8 8 *	8
 *8 8 
8B
(,U\\(:c3h !	
,
,
, 
, 	
,
 	
,  !&2
3-2SM2 ;;2 %,,	2
 2 \\2B T]/T /
	hr2v. 	# 	(2r6BR 	" "DO	  	
 d
 #s(+,hsCx.@@A 
>xB' HRV,< 6xB' 6HRV,< 68BF+ R0@ Xb"f% (2r6*: HRV$ "b&)9 xB/ HRV4D hr2v&6 8BF;K hr2v&6 8BF;K 
5T 5d 5B "3599 :> 6 Fy		@ F F  	Bs   +O- -O87O8