
    _ndT                        d dl mZmZ d dl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 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 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$  e#egegegegd          dd dd            Z% G d  d!          Z& G d" d#e	          Z'ej(        )                    d$eeg          d%             Z*d& Z+ej(        )                    d' eed d(d)*           eeddd+*          g          d,             Z,ej(        )                    d-ed.d/d+d0e-d1fed(d2d3d0e-d4fedd d)d0e.d5fed dd6d0e.d7fed(d8d+d0e.d9fg          d:             Z/d; Z0d< Z1ej(        )                    d=e2d>fed>fed?fej3        d@fg          dA             Z4dB Z5ej(        )                    dC eedd d)*           eed dd)*           eeddd3*           eh dD           e             e             edE           e             e            g	          dF             Z6ej(        )                    dG eeddHd6*           eedIdJd+*          f eeddHd6*           eedIdJd3*          f eeddHd6*           eedKdJd+*          f eeddHd6*           eedJdd)*          f eeddHd6*           eedKdd3*          f eedHdd)*           eedIdJd+*          f eedHdd)*           eedIdJd3*          f eedHdd)*           eed(d/d+*          f eedHdd)*           eeddId)*          f eedHdd)*           eeddLd3*          f eedIdJd+*           eedd(d6*          f eedIdJd+*           eed(dd)*          f eedIdJd+*           eedMdLd3*          f eedIdJd+*           eedMdLd6*          f eedIdJd3*           eedNdOd3*          f eedIdJd3*           eedNdOd)*          f eed/dd)*           eed d(d+*          f eed(dd)*           eed d(d+*          fg          dP             Z7ej(        )                    dQ e            g ee8          g e            g e            g e            g e            g e            g eeddd+*          g eed dd)*           eedd d3*          gg	          dR             Z9ej(        )                    dC e             e             ee8           e             e             e             e             e             e             eh dD           eeh dS           eeddd3*           eed dOd3*           eed dd3*           eedd d3*           eed d(d3*           eed dd+*           eedd d6*           edE           e             e            g          dT             Z:ej(        )                    dU eed d(d+*          dVf eed dd3*          dWf eh dD          dXf ee;ej<        ej=        h          ej=        fe>dY fdZd[d(d/gdHdKggfd[ ej?        d(d/gdHdKgg          fd\ ed(d/gdHdKgg          fd]d^ej@        A                    d           fd_e& e&            fe2d(fed`fdadbdcdddedf eBdg          fdfejC        fdh edE           e'd i          fdjg          dk             ZDej(        )                    dl eed d(d+*          ef edmdnh          ef eedVdoh          efd[efd\efd^efdefe>efe2efdpefdqefdfef edE          efdrefg          ds             ZEdt ZFdu ZGdv ZHdw ZIdx ZJdy ZKdz ZLd{ ZMd| ZNd} ZOd~ ZPd ZQd ZRd ZSd ZTd ZUd ZVdS )    )IntegralRealN)
csr_matrix)BaseEstimator)LeaveOneOut
deprecated)HiddenInterval)Options)
StrOptions)_ArrayLikes)	_Booleans)
_Callables)
_CVObjects)_InstancesOf)_MissingValues)_PandasNAConstraint)_IterablesNotString)_NoneConstraint)_RandomStates)_SparseMatrices)_VerboseHelper)
HasMethods)make_constraint)generate_invalid_param_val)generate_valid_param)validate_params)InvalidParameterError)abcd)r$   c                    dS )z/A function to test the validation of functions.N )r!   r"   r#   r$   argskwargss         Ilib/python3.11/site-packages/sklearn/utils/tests/test_param_validation.py_funcr*   #             c                       e Zd ZdZ edegi          d             Z e             edegi          d                         ZdS )_ClasszJA class to test the _InstancesOf constraint and the validation of methods.r!   c                     dS )zA validated methodNr&   selfr!   s     r)   _methodz_Class._method+   r+   r,   c                     dS )zA deprecated validated methodNr&   r0   s     r)   _deprecated_methodz_Class._deprecated_method/   r+   r,   N)	__name__
__module____qualname____doc__r   r   r2   r	   r4   r&   r,   r)   r.   r.   (   s        TT_cD6]##! ! $#! Z\\_cD6]##, , $# \, , ,r,   r.   c                   6    e Zd ZU dZdegiZeed<   d ZddZ	dS )
_Estimatorz<An estimator to test the validation of estimator parameters.r!   _parameter_constraintsc                     || _         d S Nr!   r0   s     r)   __init__z_Estimator.__init__:   s    r,   Nc                 .    |                                   d S r=   )_validate_params)r1   Xys      r)   fitz_Estimator.fit=   s    r,   NN)
r5   r6   r7   r8   r   r;   dict__annotations__r?   rD   r&   r,   r)   r:   r:   5   sV         FF$'$=D000             r,   r:   interval_typec                     t          | ddd          }d|v rd|vsJ t          | ddd          }d|vrd|v sJ t          | ddd          }d|v rd|v sJ t          | ddd          }d|vrd|vsJ dS )	z.Check the range of values depending on closed.   leftclosedrightbothneitherNr   )rH   intervals     r)   test_interval_rangerS   A   s     r1V<<<H>>ax////r1W===HX!x----r1V<<<H>>a8mmmmr1Y???HX!8"3"3"3"3"3"3r,   c                     t          t          ddd          } t          j        | v sJ t          t          ddd          } t          j         | v sJ t          t          ddd          } t          j        | vsJ t          j         | vsJ dS )zjCheck that inf is included iff a bound is closed and set to None.

    Only valid for real intervals.
    r   NrO   rM   rL   rQ   )r   r   npinfrR   s    r)   test_interval_inf_in_boundsrX   Q   s    
 ag666H6XdAf555HF7hdD;;;H6!!!!F7(""""""r,   rR      rL   rM   rP   c                 &    t           j        | vsJ dS )z)Check that np.nan is not in any interval.N)rU   nanrW   s    r)   test_nan_not_in_intervalr\   a   s     6!!!!!!r,   zparams, error, match      ?rK   )typerL   rO   rN   z=Expecting left to be an int for an interval over the integersg       @rQ   z>Expecting right to be an int for an interval over the integersz&left can't be None when closed == leftrO   z(right can't be None when closed == rightzright can't be less than leftc                 |    t          j        ||          5  t          di |  ddd           dS # 1 swxY w Y   dS )zNCheck that informative errors are raised for invalid combination of parametersmatchNr&   )pytestraisesr   )paramserrorrb   s      r)   test_interval_errorsrg   j   s    @ 
uE	*	*	*  6                 s   155c                      t          h ddh          } |                     d          sJ |                     d          sJ |                     d          rJ dt          |           v sJ dS )z*Sanity check for the StrOptions constraint>   r!   r"   r#   r#   r   r!   r$   z'c' (deprecated)N)r   is_satisfied_bystroptionss    r)   test_stroptionsrm      s    cU;;;G""3'''''""3'''''&&s+++++W------r,   c                     t          t          ddt          j        hdh          } |                     d          sJ |                     t          j                  sJ |                     d          rJ dt          |           v sJ dS )z'Sanity check for the Options constraintg            ?r   Gz?z-0.5 (deprecated)N)r   r   rU   rV   ri   rj   rk   s    r)   test_optionsrq      s    dT3/TFCCCG""4(((((""26*****&&t,,,,,#g,,......r,   ztype, expected_type_nameintfloatznumpy.ndarrayc                 V    t          |           }t          |          d| dk    sJ dS )z?Check the string representation of the _InstancesOf constraint.zan instance of ''N)r   rj   )r^   expected_type_name
constraints      r)   %test_instances_of_type_human_readablerx      s;     d##Jz??F1CFFFFFFFFFr,   c                     t          ddg          }  G d d          } G d d          }|                      |                      sJ |                      |                      rJ t          |           dk    sJ dS )	z Check the HasMethods constraint.r!   r"   c                       e Zd Zd Zd ZdS )test_hasmethods.<locals>._Goodc                     d S r=   r&   r1   s    r)   r!   z test_hasmethods.<locals>._Good.a       Dr,   c                     d S r=   r&   r}   s    r)   r"   z test_hasmethods.<locals>._Good.b   r~   r,   N)r5   r6   r7   r!   r"   r&   r,   r)   _Goodr{      s2        	 	 		 	 	 	 	r,   r   c                       e Zd Zd ZdS )test_hasmethods.<locals>._Badc                     d S r=   r&   r}   s    r)   r!   ztest_hasmethods.<locals>._Bad.a   r~   r,   N)r5   r6   r7   r!   r&   r,   r)   _Badr      s#        	 	 	 	 	r,   r   z"an object implementing 'a' and 'b'N)r   ri   rj   )rw   r   r   s      r)   test_hasmethodsr      s    S#J''J               %%eegg.....))$$&&11111z??BBBBBBBr,   rw   >   r!   r"   r#   rD   c                 R    t          |           }|                     |          rJ dS )z>Check that the value generated does not satisfy the constraintNr   ri   )rw   	bad_values     r)   test_generate_invalid_param_valr      s1      +:66I)))4444444r,   zinteger_interval, real_interval         i   
   c                 
   t          ||| g          }|                    |          rJ |                     |          rJ t          | || g          }|                    |          rJ |                     |          rJ dS )ztCheck that the value generated for an interval constraint does not satisfy any of
    the interval constraints.
    constraintsNr   )integer_intervalreal_intervalr   s      r)   +test_generate_invalid_param_val_2_intervalsr      s    b +M3C#D  I ,,Y77777//	:::::*}6F&G  I ,,Y77777//	:::::::r,   r   c                     t          j        t                    5  t          | d         |            ddd           dS # 1 swxY w Y   dS )zmCheck that the function raises NotImplementedError when there's no invalid value
    for the constraint.
    r   r   N)rc   rd   NotImplementedErrorr   r   s    r)   )test_generate_invalid_param_val_all_validr   7  s    * 
*	+	+ L L";q>{KKKKL L L L L L L L L L L L L L L L L Ls   ?AA>   rY   rK   r   c                 R    t          |           }|                     |          sJ dS )z;Check that the value generated does satisfy the constraint.N)r   ri   )rw   values     r)   test_generate_valid_paramr   P  s1    8 !,,E%%e,,,,,,,r,   zconstraint_declaration, valuegzG?*   r"   c                     | dz   S )NrY   r&   )xs    r)   <lambda>r   w  s
    QU r,   rE   z
array-likezsparse matrix)random_stater   r   )r   Nro   )booleanF)verboserY   )missing_valuesr_   )r   g      )r   Nr   r[   )r   missingr>   )	cv_objectr   c                 R    t          |           }|                    |          sJ dS )z+Sanity check for the is_satisfied_by methodN)r   ri   )constraint_declarationr   rw   s      r)   test_is_satisfied_byr   p  s3    @ !!788J%%e,,,,,,,r,   z1constraint_declaration, expected_constraint_classoption1option2rp   r   r   r   c                 :    t          |           }|j        |u sJ dS )zHCheck that make_constraint dispaches to the appropriate constraint classN)r   	__class__)r   expected_constraint_classrw   s      r)   test_make_constraintr     s-    * !!788J#<<<<<<<r,   c                      t          j        t          d          5  t          d           ddd           dS # 1 swxY w Y   dS )zNCheck that an informative error is raised when an unknown constraint is passedzUnknown constraintra   znot a valid constraintN)rc   rd   
ValueErrorr   r&   r,   r)   test_make_constraint_unknownr     s    	z)=	>	>	> 2 201112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   9= =c                  B   t          j        t          d          5  t          dd           ddd           n# 1 swxY w Y   t          j        t          d          5  t          ddgddi ddd           n# 1 swxY w Y   t          j        t          d	          5  t          di ddi ddd           n# 1 swxY w Y   t          j        t          d
          5  t          ddd           ddd           n# 1 swxY w Y   t          j        t          d          5  t          dgg dR ddiddi ddd           n# 1 swxY w Y   t          j        t          d	          5  t          dgg dR ddiddi ddd           dS # 1 swxY w Y   dS )zGCheck that validate_params works no matter how the arguments are passedz"The 'a' parameter of _func must bera   wrongrY   r#   Nz"The 'b' parameter of _func must ber#   "The 'c' parameter of _func must bez"The 'd' parameter of _func must be)r#   r$   r   )r   rK   r   r   er   rY   rK   r   four)rY   )rc   rd   r    r*   r&   r,   r)   test_validate_paramsr     s   	%I
 
 
   	g              
 
%I
 
 
 " " 	7|!q!!!" " " " " " " " " " " " " " "
 
%I
 
 
 # # 	""C>"""# # # # # # # # # # # # # # #
 
%I
 
 
 ! ! 	a1    ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 
%I
 
 
 4 4 	a3///333Q33(3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4
 
%I
 
 
 3 3 	a2)))222v2#q2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3sg   :>> A;;A?A?!B<<C C "DDD'E

EE0FFFc                  ^    t          dt          gi          d             }  | dd           dS )zTCheck that no error is raised when there are parameters without
    constraints
    r!   c                     d S r=   r&   )r!   r"   s     r)   funcz1test_validate_params_missing_params.<locals>.func      r,   rY   rK   N)r   rr   )r   s    r)   #test_validate_params_missing_paramsr     sA    
 cC5\""  #" 	DAJJJJJr,   c                      t                      t                    } t          j        t          d          5   | ddd           ddd           n# 1 swxY w Y   t          j        t          d          5  t          j        t          d          5   | 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 )
z5Check that validate_params functions can be decoratedzFunction _func is deprecatedra   rY   rK   r   r   Nr   r   )r	   r*   rc   warnsFutureWarningrd   r    )decorated_functions    r)    test_decorate_validated_functionr     s   %e,,	m+I	J	J	J & &1a1%%%%& & & & & & & & & & & & & & & 
m+I	J	J	J 0 0]!)N
 
 
 	0 	0 q!w////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0sG   AAA9CB0$C0B4	4C7B4	8CCCc                     t          j        t          d          5  t                                          d           ddd           n# 1 swxY w Y   t          j        t          d          5  t          j        t          d          5  t                                          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 )z-Check that validate_params works with methodsz+The 'a' parameter of _Class._method must bera   r   Nz)Function _deprecated_method is deprecatedz6The 'a' parameter of _Class._deprecated_method must be)rc   rd   r    r.   r2   r   r   r4   r&   r,   r)   test_validate_params_methodr     s   	%R
 
 
 " " 	!!!" " " " " " " " " " " " " " " 
m+V	W	W	W 1 1]!J
 
 
 	1 	1 HH''000		1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1sG   "A

AA0C"B:.C:B>	>CB>	CCCc                      t          d          } t          j        t          d          5  |                                  ddd           dS # 1 swxY w Y   dS )z9Check that validate_params works with Estimator instancesr   z'The 'a' parameter of _Estimator must bera   N)r:   rc   rd   r    rD   )ests    r)   test_validate_params_estimatorr      s     W

C	%N
 
 
   				                 s   AAAc                      t          j        t          d          5  t          h dddh           ddd           dS # 1 swxY w Y   dS )z@Check that the deprecated parameter must be a subset of options.z#deprecated options must be a subsetra   >   r!   r"   r#   r!   r$   r   N)rc   rd   r   r   r&   r,   r)   !test_stroptions_deprecated_subsetr     s    	z)N	O	O	O ; ;???Sz::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;s   ?AAc                  b   t          dt          t                    t          gi          d             }  | dddd            | g d           t	          j        t          d	          5 } | d
           ddd           n# 1 swxY w Y   t          |j                  }d|v sJ d|vsJ dS )zECheck that internal constraints are not exposed in the error message.paramc                     d S r=   r&   r   s    r)   fz!test_hidden_constraint.<locals>.f  r   r,   rY   rK   r   )r!   r"   r#   r   The 'param' parameterra   badr   Nzan instance of 'dict'zan instance of 'list')	r   r
   listrF   rc   rd   r    rj   r   r   exc_infoerr_msgs      r)   test_hidden_constraintr     s    gtd3455  65 AAAAAiiiLLL	%<
 
 
 		               (.!!G"g----"'111111s   +BBBc            	      z   t          dt          dh          t          t          dh                    gi          d             }  | d            | d           t          j        t
          d          5 } | d           d	d	d	           n# 1 swxY w Y   t          |j                  }d|v sJ d|vsJ d	S )
zBCheck that we can have 2 StrOptions constraints, one being hidden.r   autowarnc                     d S r=   r&   r   s    r)   r   z!test_hidden_stroptions.<locals>.f*  r   r,   r   ra   r   r   N)r   r   r
   rc   rd   r    rj   r   r   s      r)   test_hidden_stroptionsr   '  s!    g
F8 4 4fZ=Q=Q6R6RSTUU  VU AfIIIAfIII	%<
 
 
 		               (.!!GW      s   7BBBc                  z    t          t          d          sJ t          t                      j        d          sJ dS )zCheck that the validate_params decorator properly sets the parameter constraints
    as attribute of the decorated function/method.
    _skl_parameter_constraintsN)hasattrr*   r.   r2   r&   r,   r)   4test_validate_params_set_param_constraints_attributer   =  s?     5677777688#%ABBBBBBBr,   c                  
   t          ddgi          d             }  | d            | t          j        d                     t          j        t
          d          5   | d           d	d	d	           d	S # 1 swxY w Y   d	S )
zCheck that validate_params raise a deprecation message but still passes
    validation when using an int for a parameter accepting a boolean.
    r   r   c                     d S r=   r&   r   s    r)   r   z1test_boolean_constraint_deprecated_int.<locals>.fJ  r   r,   TFz4Passing an int for a boolean parameter is deprecatedra   rY   N)r   rU   bool_rc   r   r   )r   s    r)   &test_boolean_constraint_deprecated_intr   E  s    
 g	{+,,  -, AdGGGAbhuoo 
S
 
 
   	
!                 s   A88A<?A<c                  $   t          t          dgdd          dd            } t          j        t          d          5   | d           ddd           n# 1 swxY w Y    G d	 d
          } | |            |  |                       dS )z5Check that validation can be skipped for a parameter.Nno_validationparam1param2c                     d S r=   r&   r   s     r)   r   ztest_no_validation.<locals>.f\  r   r,   zThe 'param1' parameterra   r   )r   c                       e Zd ZdS )$test_no_validation.<locals>.SomeTypeN)r5   r6   r7   r&   r,   r)   SomeTyper   e  s        r,   r   )r   rE   )r   rr   rc   rd   r    )r   r   s     r)   test_no_validationr   Y  s    dGGHH   IH 
,4L	M	M	M  	                      AXAXXZZs   AAAc                      t          j        d          } t                      }|                    | j                  sJ |                    t          j        g d                    rJ dS )z9Add a specific test for checking support for `pandas.NA`.pandasr   N)rc   importorskipr   ri   NArU   array)pdna_constraints     r)   $test_pandas_na_constraint_with_pd_nar   l  sg    		X	&	&B'))M((/////,,RXiii-@-@AAAAAAAr,   c                      t                      } |                     g d          sJ |                     t          d                    sJ |                     d          rJ dS )zGCheck that a string does not satisfy the _IterableNotString constraint.r   r   zsome stringN)r   ri   rangerw   s    r)   test_iterable_not_stringr   u  sk    $&&J%%iii00000%%eBii00000))-8888888r,   c                  <   t                      } |                     d          sJ |                     t                                sJ |                     ddgddgfddgddgfg          sJ |                     d          sJ |                     d          rJ dS )zUCheck that the _CVObjects constraint accepts all current ways
    to pass cv objects.r   rY   rK   r   r   Nznot a CV object)r   ri   r   r   s    r)   test_cv_objectsr   }  s     J%%a(((((%%kmm44444%%AA'71a&1a&9I&JKKKKK%%d+++++))*;<<<<<<<r,   c                  h     G d dt                     }  | d                                           dS )zCheck that the validation from a scikit-learn estimator inherited by a third
    party estimator does not impose a match between the dict of constraints and the
    parameters of the estimator.
    c                   *     e Zd Z fdZd fd	Z xZS )7test_third_party_estimator.<locals>.ThirdPartyEstimatorc                 Z    || _         t                                          d           d S )Nr   r>   )r"   superr?   )r1   r"   r   s     r)   r?   z@test_third_party_estimator.<locals>.ThirdPartyEstimator.__init__  s+    DFGGq!!!!!r,   Nc                 L    t                                          ||           d S r=   )r  rD   )r1   rB   rC   r   s      r)   rD   z;test_third_party_estimator.<locals>.ThirdPartyEstimator.fit  s!    GGKK1r,   rE   )r5   r6   r7   r?   rD   __classcell__)r   s   @r)   ThirdPartyEstimatorr     sV        	" 	" 	" 	" 	"	 	 	 	 	 	 	 	 	 	r,   r  r   )r"   N)r:   rD   )r  s    r)   test_third_party_estimatorr    sT        j    !  """""r,   c                      t          dddd          } |                     d          sJ |                     d          rJ dS )z=Check for the type "real_not_int" in the Interval constraint.real_not_intr   rY   rP   rM   r]   N)r   ri   r   s    r)   test_interval_real_not_intr    sR    .!Qv>>>J%%c*****))!,,,,,,,r,   )r   )Wnumbersr   r   numpyrU   scipy.sparser   rc   sklearn.baser   sklearn.model_selectionr   sklearn.utilsr	   sklearn.utils._param_validationr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r*   r.   r:   markparametrizerS   rX   r\   	TypeErrorr   rg   rm   rq   rr   ndarrayrx   r   r   r   r   r   r   r^   float32float64callabler   randomRandomStaters   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r&   r,   r)   <module>r     s   " " " " " " " "     # # # # # #  & & & & & & / / / / / / $ $ $ $ $ $ 2 2 2 2 2 2 4 4 4 4 4 4 3 3 3 3 3 3 6 6 6 6 6 6 7 7 7 7 7 7 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 : : : : : : ? ? ? ? ? ? ? ? ? ? ? ? ; ; ; ; ; ; 9 9 9 9 9 9 ; ; ; ; ; ; : : : : : : 6 6 6 6 6 6 ; ; ; ; ; ; F F F F F F @ @ @ @ @ @ ; ; ; ; ; ; A A A A A A vTF$tfEEFF:a : : : : GF:
, 
, 
, 
, 
, 
, 
, 
,	  	  	  	  	  	  	  	  8T*:;;4 4 <;4# # #  XdAq(((((4tF*S*S*ST " "	 "
  sQ&IIL	
 q3)LLL	
 ta6JJ5	
 q47KK7	
 q2HH,	
+ < = <. . ./ / / 	e	5	w	_%	 G G GC C C( tQv...q$v...tT)444
???##
5

 5 5 5 % HXtQw777HT2q000	

 HXtQw777HT2q333	

 HXtQw777HT1a///	

 HXtQw777HT1d6222	

 HXtQw777HT1d9555	

 HXq$v666HT2q000	

 HXq$v666HT2q333	

 HXq$v666HT1a///	

 HXq$v666HT4F333	

 HXq$v666HT4I666	

 HXr1V444HT47333	

 HXr1V444HT1d6222	

 HXr1V444HT39555	

 HXr1V444HT37333	

 HXr1Y777HT1b333	

 HXr1Y777HT1b000	

 HXq$v666HT1a///	

 HXq$v666HT1a///	
KIL LZ; ;[L LZ;" 		d												$d6	2	2	23HXq$v666HT49555	
 "L L# "L 
T	
???##)))$$4i8881b3331d955549555q!I...q$v...tQw///
5
+ 4- -5 4- #	$1V	,	,	,d3	(AtI	6	6	6;	OOO	$	$c*	
BJ/	0	0"*=	??#	AA'(	xrx!Q!Q 0112	**q!fq!f%5667	..q112		a	s  	55<<(	26"%	E		JJOOO,3 <- -= <- 7	$1V	,	,	,h7	Y	*	+	+Z8	d|	$	$g.	{#	/*	'		:	l	I	N#	>*	E		J'	j! &= =' &=2 2 23 3 3D	 	 	0 0 01 1 1   ; ; ;2 2 2,! ! !,C C C  (  &B B B9 9 9= = =# # #&- - - - -r,   