
    &Vfk                        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 d dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ  G d dej                  Zd Zd Zd Zd Zd Zd Zd Zd Zd Z dS )    N)backend)distribution)ops)tree)utils)is_float_dtype)standardize_dtype)clear_sessionKerasTensor)Model)traceback_utilsc                        e Zd ZdZ fdZd Zd ZddZddZdd	Z	dd
Z
ddZddZddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ xZS )TestCaseNc                 :     t                      j        |i | d S N)super__init__)selfargskwargs	__class__s      X/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/testing/test_case.pyr   zTestCase.__init__   s%    $)&)))))    c                 v    t          d           t          j                    rt          j                     d S d S )NF)free_memory)r
   r   is_traceback_filtering_enableddisable_traceback_filtering)r   s    r   setUpzTestCase.setUp   sE     	%((((9;; 	:799999	: 	:r   c                 ^    t          j                    |                     fd           S )Nc                  ,    t          j                   S r   )shutilrmtree)temp_dirs   r   <lambda>z'TestCase.get_temp_dir.<locals>.<lambda>%   s    h 7 7 r   )tempfilemkdtemp
addCleanup)r   r$   s    @r   get_temp_dirzTestCase.get_temp_dir#   s2    #%%7777888r   ư>c                    t          |t          j                  st          j        |          }t          |t          j                  st          j        |          }t          j                            ||||           d S )N)atolrtol)
isinstancenpndarrayr   convert_to_numpytestingassert_allcloser   x1x2r,   r-   msgs         r   assertAllClosezTestCase.assertAllClose(   so    "bj)) 	.)"--B"bj)) 	.)"--B

""2r4"@@@@@r   c                     	 |                      |||||           n# t          $ r Y d S w xY w|pd}t          d| d|           )N)r,   r-   r7    z+The two values are close at all elements. 
z
.
Values: )r8   AssertionErrorr4   s         r   assertNotAllClosezTestCase.assertNotAllClose/   s    	BT#FFFF 	 	 	FF	iR  
 
 	
s    
++   c                    t          |t          j                  st          j        |          }t          |t          j                  st          j        |          }t          j                            |||           d S )N)decimal)r.   r/   r0   r   r1   r2   assert_almost_equal)r   r5   r6   r?   r7   s        r   assertAlmostEqualzTestCase.assertAlmostEqual;   sm    "bj)) 	.)"--B"bj)) 	.)"--B

&&r2w&?????r   c                    |                      t          |          t          |          |           t          ||          D ]\  }}t          |t          t
          f          st          |t          t
          f          r|                     |||           Vt          j        |          }t          j        |          }|                      |||           d S Nr7   )	assertEquallenzipr.   listtupleassertAllEqualr   r1   )r   r5   r6   r7   e1e2s         r   rJ   zTestCase.assertAllEqualB   s    R#b''s333"bkk 	2 	2FB"tUm,, 2
2e}0M0M 2##B#4444-b11-b11  RS 1111	2 	2r   c                 P    |                      t          |          ||           d S rC   )rE   rF   )r   iterableexpected_lenr7   s       r   	assertLenzTestCase.assertLenL   s)    X#>>>>>r   Tc                 &   t          |t                    r|                     |j        |           d S t	          j                    dk    r@dd l}|r|                     ||j                   d S |                     ||j                   d S t	          j                    dk    rEdd l	m
c m} |r|                     ||j                   d S |                     ||j                   d S |                     |dt	          j                     d           d S )N
tensorflowr   jaxzBackend z  does not support sparse tensors)r.   r   rE   sparser   rR   assertIsInstanceSparseTensorassertNotIsInstancejax.experimental.sparseexperimental	JAXSparseassertFalse)r   xrT   tf
jax_sparses        r   assertSparsezTestCase.assertSparseO   sE   a%% 	QXv....._,..#### =%%a99999((BO<<<<<_%''888888888 B%%a)=>>>>>((J,@AAAAAN7?,,NNN    r   c                 <   ddl m} ddl m} ddl m} |j        }|                                }t          j        |dd          }t          |          d d          }	 ||          5  |	                    |          }
d d d            n# 1 swxY w Y   |
                                }t          j        |dd          }| 
                    ||           | 
                    t          |	          t          t          |
                                ||          }t          j        |dd          } ||          5   |t          j        |                    }
d d d            n# 1 swxY w Y   |
                                }t          j        |dd          }| 
                    ||           t          |
          d d          }|	|fD ]}d|v r|                    d           | 
                    t          |	          t          |                     |
S )	Nr   )custom_object_scope)deserialize_keras_object)serialize_keras_objectT   )	sort_keysindent__annotations__)keras.src.savingra   rb   rc   r   
get_configjsondumpsdirfrom_configrE   setloadsremove)r   instancecustom_objectsra   rb   rc   clsconfigconfig_jsonref_dirrevived_instancerevived_configrevived_config_json
serializedserialized_jsonnew_dirlsts                    r   run_class_serialization_testz%TestCase.run_class_serialization_testf   s   888888======;;;;;;  $$&&j4BBBh--"  00 	7 	7"v66	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7)4466"jd1
 
 
 	&9:::Ws3/?+@+@'A'ABBB ,+H55
*Z4JJJ  00 	 	77
?++   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 *4466"jd1
 
 
 	&9:::&''*W% 	. 	.C C''

,---Ws7||444s$   'B		BB?E))E-0E-Fc                 j
   	
% ||t          d          t          d          |t          d          ||durt          d          |pi }|pi }||t          |t                    rdt          |d                   rO                     |t                                          t          |          t          |          d	           nt          |t                    rr                     |t                                          t          |	                                          t          |	                                          d	           nt          |t                    rN                     |t                                          t          |          t          |          d	           n$t          |t                    st          d
          ||t          j        d |          } |di |%                     %|           |                     %j        |d	            fd}d	
 fd	}fd}|||t          j        d |          }n|} |di |%t          |t                    r %j        di | n%                    |            |%           |t          j        fd|          }nt#          ||          } |di |%t          |t                    r %di ||}n	 %|fi |} |%            |%|d           |0%                    |          }                     ||j                   |||t)          ||          } |di |%t          |t                    r %di ||}n	 %|fi |} |%|d           |r |%||           |r4t+          j                    dk    rddl}|j                                        }|r |di i |ddi%t          j        %fd|          }t          |t                    r %di ||} %j        di |} n %|fi |}%                    |          } t5          t          j        |          t          j        |                     D ]4\  }!}"t9          |!j                  }#                     |#|"j                   5%j        D ]?}$t9          |$j                  }#t?          |#          r                     |#d           <dS dS dS )a  Run basic checks on a layer.

        Args:
            layer_cls: The class of the layer to test.
            init_kwargs: Dict of arguments to be used to
                instantiate the layer.
            input_shape: Shape tuple (or list/dict of shape tuples)
                to call the layer on.
            input_dtype: Corresponding input dtype.
            input_sparse: Whether the input is a sparse tensor (this requires
                the backend to support sparse tensors).
            input_data: Tensor (or list/dict of tensors)
                to call the layer on.
            call_kwargs: Dict of arguments to use when calling the
                layer (does not include the first input tensor argument)
            expected_output_shape: Shape tuple
                (or list/dict of shape tuples)
                expected as output.
            expected_output_dtype: dtype expected as output.
            expected_output_sparse: Whether the output is expected to be sparse
                (this requires the backend to support sparse tensors).
            expected_output: Expected output tensor -- only
                to be specified if input_data is provided.
            expected_num_trainable_weights: Expected number
                of trainable weights of the layer once built.
            expected_num_non_trainable_weights: Expected number
                of non-trainable weights of the layer once built.
            expected_num_seed_generators: Expected number of
                SeedGenerators objects of the layer once built.
            expected_num_losses: Expected number of loss tensors
                produced when calling the layer.
            supports_masking: If True, will check that the layer
                supports masking.
            expected_mask_shape: Expected mask shape tuple
                returned by compute_mask() (only supports 1 shape).
            custom_objects: Dict of any custom objects to be
                considered during deserialization.
            run_training_check: Whether to attempt to train the layer
                (if an input shape or input data was provided).
            run_mixed_precision_check: Whether to test the layer with a mixed
                precision dtype policy.
        Nz=input_shape and input_data cannot be passed at the same time.zLexpected_output_shape and expected_output cannot be passed at the same time.z=In order to use expected_output, input_data must be provided.TzCIn order to use expected_mask_shape, supports_masking must be True.r   z4The number of input shapes and dtypes does not matchrD   z(The type of input_shape is not supportedc                     dS )Nfloat32 )_s    r   r%   z)TestCase.run_layer_test.<locals>.<lambda>  s    ) r   z!Unexpected supports_masking valuec                                         | j                                       | j        d                               | j        d                               | j        d           %                    t          |           d           t          j                    dk    r++++                    | j        z   z   d           d S d S d S d S d S )Nz&Unexpected number of trainable_weightsrD   z*Unexpected number of non_trainable_weightsz,Unexpected number of non_trainable_variablesz$Unexpected number of seed_generatorstorchz!Unexpected number of torch_params)	
assertTruebuiltrP   trainable_weightsnon_trainable_weightsnon_trainable_variablesget_seed_generatorsr   torch_params)layer$expected_num_non_trainable_variables"expected_num_non_trainable_weightsexpected_num_seed_generatorsexpected_num_trainable_weightsr   s    r   run_build_assertsz2TestCase.run_layer_test.<locals>.run_build_asserts  sZ   OOEK(((-9+2@    
 2=/6D    
 4?18F    
 ,7'..0>     !!W,,2>6B0<&28923 <       -,>>BB<<r   Fc                 d
   1t          t                    rt          d                   r                    |t                                         t          |          t                    d           t          d |D                       }                    |d           nt          t                    r                    |j        d           nSt          t                    r                    |t                                         t          |	                                          t          	                                          d           d |
                                D             }                    |d           nt          t                    rr                    |t                                         t          |          t                    d           d |D             }                    |d           nt          d	          
"t          
t                    r                    |t                                         t          |          t          
          d           t          d
 |D                       }                    
|d           nt          
t                    r                    |t                                         t          |	                                          t          
	                                          d           d |
                                D             }                    
|d           nt          
t                    rr                    |t                                         t          |          t          
          d           d |D             }                    
|d           nIt          j        |          d         j        }                    
t!          j        |          d           r,t          j        |          D ]}                    |           |r	                    t'          	          t'          |                     t)          t          j        	          t          j        |                    D ]\  }}                    ||d                               | j                   d S d S d S )Nr   zUnexpected number of outputsrD   c              3   $   K   | ]}|j         V  d S r   shape.0vs     r   	<genexpr>zFTestCase.run_layer_test.<locals>.run_output_asserts.<locals>.<genexpr>C  s$      (A(AQ(A(A(A(A(A(Ar   zUnexpected output shapezUnexpected output dict keysc                 $    i | ]\  }}||j         S r   r   r   kr   s      r   
<dictcomp>zGTestCase.run_layer_test.<locals>.run_output_asserts.<locals>.<dictcomp>V  s     #J#J#J41aAqw#J#J#Jr   c                     g | ]	}|j         
S r   r   r   s     r   
<listcomp>zGTestCase.run_layer_test.<locals>.run_output_asserts.<locals>.<listcomp>c  s    #<#<#<AG#<#<#<r   z2The type of expected_output_shape is not supportedc              3   H   K   | ]}t          j        |j                  V  d S r   r   r	   dtyper   s     r   r   zFTestCase.run_layer_test.<locals>.run_output_asserts.<locals>.<genexpr>u  s@       ) )?@1!'::) ) ) ) ) )r   zUnexpected output dtypec                 H    i | ]\  }}|t          j        |j                   S r   r   r   s      r   r   zGTestCase.run_layer_test.<locals>.run_output_asserts.<locals>.<dictcomp>  s;     $ $ $ Aq 74QW==$ $ $r   c                 @    g | ]}t          j        |j                  S r   r   r   s     r   r   zGTestCase.run_layer_test.<locals>.run_output_asserts.<locals>.<listcomp>  s2     $ $ $?@1!'::$ $ $r   zUnexpected output value)r.   rI   is_shape_tuplerU   rE   rF   r   dictrn   keysitemsrH   
ValueErrorr   flattenr   r   r	   r_   typerG   r8   rP   losses)r   outputeageroutput_shapeoutput_dtyper\   ref_vr   expected_num_lossesexpected_outputexpected_output_dtypeexpected_output_shapeexpected_output_sparser   s           r   run_output_assertsz3TestCase.run_layer_test.<locals>.run_output_asserts8  s   $03U;; 2)!,A A 2 ))&%888$$F122: %   
 $)(A(A&(A(A(A#A#AL$$-$5 %    
   5u== #$$-5 %    
   5t<< ))&$777$$FKKMM**16688999 %   
 $K#J6<<>>#J#J#JL$$-$5 %    
   5t<< ))&$777$$F122: %   
 $=#<V#<#<#<L$$-$5 %     %L   %03U;; 4))&%888$$F122: %   
 $) ) )DJ) ) ) $ $L $$-$5 %    
   5t<< %))&$777$$FKKMM**16688999 %   
$ $$*LLNN$ $ $L $$-$5 %    
   5t<< ))&$777$$F122: %   
$ $DJ$ $ $L $$-$5 %     $(<#7#7#:#@L$$-1,??5 %   
 & )f-- ) )A%%a(((( 
F".$$T/%:%:DLLIII$'_55t|F7K7K% %  q ++!1*C ,     '2NN5<1DEEEEE
F 
F 32r   c                 n    G d dt                     } ||           }||ft          j                    dk    rt          j        t          j                  fd}d}t          j                    dk    rrd}|                    dd	|
           |                     |            dd           d S )Nc                   &     e Zd Z fdZddZ xZS )ETestCase.run_layer_test.<locals>.run_training_step.<locals>.TestModelc                 V    t                                                       || _        d S r   )r   r   r   )r   r   r   s     r   r   zNTestCase.run_layer_test.<locals>.run_training_step.<locals>.TestModel.__init__  s$    GG$$&&&!&DJJJr   Fc                 0    |                      ||          S )N)training)r   )r   r\   r   s      r   callzJTestCase.run_layer_test.<locals>.run_training_step.<locals>.TestModel.call  s    ::a(:;;;r   F)__name__
__module____qualname__r   r   __classcell__r   s   @r   	TestModelr     sL        ' ' ' ' '< < < < < < < <r   r   r   c               3      K   	  V  r   r   )datas   r   data_generatorzJTestCase.run_layer_test.<locals>.run_training_step.<locals>.data_generator  s      JJJr   autorR   Fsgdmse)	optimizerlossjit_compile   r   )steps_per_epochverbose)r   r   r   map_structurer1   compilefit)	r   
input_dataoutput_datar   modelr   r   r   input_sparses	          @r   run_training_stepz2TestCase.run_layer_test.<locals>.run_training_step  s    < < < < <E < < < Ie$$E,D  G++)'*BDII    " !K  L00\0#MME;MOOOIInn&&1IEEEEEr   c                 *    t          j        |           S r   )r   r   r\   s    r   r%   z)TestCase.run_layer_test.<locals>.<lambda>  s    cill r   c                 T    t          t          j        |           | j                  S r   )create_keras_tensorsr   r   r   )r\   r   s    r   r%   z)TestCase.run_layer_test.<locals>.<lambda>  s#    2	!ag|  r   )r   r   r   mixed_float16c                     t          | j        j        r t          j        | j                  rj        n| j                  S )Nr   )r   r   autocastr   r   r   compute_dtype)specr   s    r   r%   z)TestCase.run_layer_test.<locals>.<lambda>  sK    
  %~, ' 6tz B B,E// "&" " " r   r   r   r   ) r   r.   rI   r   rU   rE   rF   r   rn   r   rH   r   map_shape_structurer~   supports_maskingr   buildr   compute_maskr   create_eager_tensorsr   r   cudais_availablecompute_output_specrG   r   r	   r   weightsr   )&r   	layer_clsinit_kwargsinput_shapeinput_dtyper   r   call_kwargsr   r   r   r   r   r   r   r   r   r   expected_mask_shaperr   run_training_checkrun_mixed_precision_checkr   r   r   build_shapekeras_tensor_inputskeras_tensor_outputsoutput_maskr   r   
input_specoutput_spectensorr   r   weightr   s&   `    `  `````````                    @r   run_layer_testzTestCase.run_layer_test   s   D "z'=$   !,1L$   &:+=O   */?t/K/K   
 "'R!'R"{'>+u-- M.A3 3 M %%k5999  $$$$N !    
 K.. M%%k4888  ((**++((**++N !    
 K.. M%%k4888  $$$$N !    
  U33 M !KLLL"{':2##[ K
 	((K(())%@@@ '& 7    &	 &	 &	 &	 &	 &	 &	 &	 &	Px	F x	F x	F x	F x	F x	F x	F x	F x	F x	F x	Ft$	F $	F $	F $	F $	FN ![%<""0**J  *I,,,,E+t,, )**k****K(((e$$$ "&*&8    	' '## ';l' '# I,,,,E-t44 Q',u ( ()(-8( ($$ (-u-@'P'PK'P'P$e$$$u&:%HHHH".#001DEE  !4k6GHHH ![%<!1l 
 I,,,,E*d++ ?#e@@j@K@@#eJ>>+>>uk>>>>! B!!%[AAA ) FW_->->'-I-I,1J,C,C,E,E)( ;!	NN$M{$MG_$M$MNN!/    ( 
 j$// H"'%"D"D*"D"D"DK";%";"I"Ij"I"IKK"'%
"B"Bk"B"BK"'";";J"G"GK$'L--t|K/H/H% % 8 8LFD .fl;;E$$UDJ7777#m ; ;F-fl;;E%e,, ;((	:::c &=%<*; ;2; ;r   )r*   r*   N)r=   Nr   )T)NNFNNNNFNNNNNNNNNTT)r   r   r   maxDiffr   r   r)   r8   r<   rA   rJ   rP   r_   r~   r   r   r   s   @r   r   r      sG       G* * * * *: : :  
A A A A

 

 

 

@ @ @ @2 2 2 2? ? ? ?   .$  $  $  $ T ""$'++/-1%)  "&-g; g; g; g; g; g; g; g;r   r   c                  L    t          j                     dk    ot                      S )NrR   r   uses_gpur   r   r   tensorflow_uses_gpur  6  s    ?,;;r   c                  L    t          j                     dk    ot                      S )NrS   r  r   r   r   jax_uses_gpur  :  s    ?%4(**4r   c                  L    t          j                     dk    ot                      S )Nr   r  r   r   r   torch_uses_gpur  >  s    ?'6HJJ6r   c                  b    t          j                    } t          d | D                       rdS dS )Nc              3   @   K   | ]}|                     d           V  dS )gpuN)
startswith)r   ds     r   r   zuses_gpu.<locals>.<genexpr>E  s.      
0
011<<
0
0
0
0
0
0r   TF)r   list_devicesany)devicess    r   r  r  B  s9    '))G

0
0
0
0
000 t5r   c                     t          | t                    r!fd|                                 D             S t          fd|           S )Nc                 n    i | ]1\  }}t          j        |d           t          ||                   2S )_shaper   rT   )r   removesuffixr   )r   r   r   r   rT   s      r   r   z(create_keras_tensors.<locals>.<dictcomp>L  sX     
 
 
 1 q(++[q&. . .
 
 
r   c                 (    t          | |          S )Nr  r   )r   dtrT   s     r   r%   z&create_keras_tensors.<locals>.<lambda>S  s    +e2fEEE r   )r.   r   r   map_shape_dtype_structure)r   r   rT   s    ``r   r   r   J  sz    +t$$ 

 
 
 
 
 $))++	
 
 
 	
 %EEEE  r   c                    ddl m t          t          j                                                g d          rt          d           |rjt          j                    dk    r
dd lfdnNt          j                    dk    rdd l	m
c m fdn(t          d	t          j                               fd
t          | t                    r!fd|                                 D             S t          |           S )Nr   )random)float16r   float64int16int32int64z=dtype must be a standard float or int dtype. Received: dtype=rR   c                 $   t           j                            d          }d|                    |           z                      |          }t          j        ||                    |           dk               }j                            |          S )Nr   rd   ffffff?)r/   r  default_rngstandard_normalastypemultiplyrT   
from_dense)r   r  rngr\   r]   s       r   	create_fnz'create_eager_tensors.<locals>.create_fnh  sv    i++A..,,U333;;B??K3::e#4#4s#:;;y++A...r   rS   c                 (   t           j                            d          }d|                    |           z                      |          }t          j        ||                    |           dk               }j                            |d          S )Nr   rd   r   r   )n_batch)r/   r  r!  r"  r#  r$  BCOO	fromdense)r   r  r&  r\   r^   s       r   r'  z'create_eager_tensors.<locals>.create_fnq  s{    i++A..,,U333;;B??K3::e#4#4s#:;;!00A0>>>r   z#Sparse is unsupported with backend c                 `    t          j                            | d          dz  |          S )Nr   r   r=   )r   castuniform)r   r  r  s     r   r'  z'create_eager_tensors.<locals>.create_fn~  s6    8uI66:"   r   c                 b    i | ]+\  }}t          j        |d            ||                   ,S )r  )r   r  )r   r   r   r'  r   s      r   r   z(create_eager_tensors.<locals>.<dictcomp>  sL     
 
 
1 q(++YYq%(-C-C
 
 
r   )keras.src.backendr  rn   r   r   
differencer   r   rR   rX   rY   rT   r.   r   r   r  )r   r   rT   r'  r^   r  r]   s    ` @@@@r   r   r   Y  s   ((((((
4<**DDD  
 '$' '
 
 	

  ?,,####/ / / / / / _%''888888888? ? ? ? ? ? Igo6G6GII  	 	 	 	 	
 +t$$ 

 
 
 
 
#))++
 
 
 	
 %YUCCCr   c                 l    t          | t          t          f          ot          d | D                       S )Nc              3   ^   K   | ](}t          |t          t          d           f          V  )d S r   )r.   intr   )r   es     r   r   z!is_shape_tuple.<locals>.<genexpr>  sH       0 0-.
1sDJJ'((0 0 0 0 0 0r   )r.   rH   rI   allr   s    r   r   r     sE    a$'' C 0 0230 0 0 - - r   c                     t          |          r  t          |                    S t          |t                    r fdt	          |          D             S t          |t                    r)t           fdt	          |          D                       S t          |t
                    r! fd|                                D             S t          d| d           )z<Variant of tree.map_structure that operates on shape tuples.c                 8    g | ]\  }}t          ||          S r   r  r   sr  fns      r   r   z-map_shape_dtype_structure.<locals>.<listcomp>  s7     
 
 
48Aq%b!Q//
 
 
r   c              3   @   K   | ]\  }}t          ||          V  d S r   r9  r:  s      r   r   z,map_shape_dtype_structure.<locals>.<genexpr>  sE       
 
48Aq%b!Q//
 
 
 
 
 
r   c           	      F    i | ]\  }}|t          ||                   S r   r9  )r   r   r   r   r<  s      r   r   z-map_shape_dtype_structure.<locals>.<dictcomp>  s@     
 
 
1 (Qa99
 
 
r   z'Cannot map function to unknown objects z and )r   rI   r.   rH   rG   r   r   r   )r<  r   r   s   ` `r   r  r    s<   e 'r%,,&&&% 

 
 
 
<?u<M<M
 
 
 	
 % 
 
 
 
 
<?u<M<M
 
 
 
 
 	
 % 

 
 
 
 

 
 
 	

 IeII%II
 
 	
r   c                     g }t                      }|                     dd          D ]T}|j        D ]J}t          |          |vr7|                    |           |                    t          |                     KU|S )z;Get a List of all seed generators in the layer recursively.T)rn   _flatten_layers_seed_generatorsidappendadd)r   seed_generatorsseen_idssublayersgs        r   r   r     s    OuuH))$55 % %+ 	% 	%B"vvX%%&&r***RVV$$$	% r   )!rj   r"   r&   unittestnumpyr/   	keras.srcr   r   r   r   r   keras.src.backend.commonr   r	   %keras.src.backend.common.global_stater
   %keras.src.backend.common.keras_tensorr   keras.src.modelsr   keras.src.utilsr   r   r  r  r  r  r   r   r   r  r   r   r   r   <module>rQ     s                 " " " " " "                   3 3 3 3 3 3 6 6 6 6 6 6 ? ? ? ? ? ? = = = = = = " " " " " " + + + + + +^; ^; ^; ^; ^;x  ^; ^; ^;B< < <5 5 57 7 7    /D /D /Dd  
 
 
.	 	 	 	 	r   