ó
‡ˆ\c           @   s  d  d l  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 „  Z d „  Z e  j j d d d d g ƒ d „  ƒ Z e  j j d d d d g ƒ d „  ƒ Z e  j j d d d d d g ƒ d „  ƒ Z d „  Z  d „  Z! d „  Z" d „  Z# e  j j d d d g ƒ e  j j d d e$ e% g ƒ d  „  ƒ ƒ Z& e  j j d d d g ƒ e  j j d e% e j' d! ƒ e j' d" ƒ g ƒ d# „  ƒ ƒ Z( d$ „  Z) e  j j d% d e j* d& d' d( g ƒ d) „  ƒ Z+ e  j j d e$ d* g ƒ d+ „  ƒ Z, e  j j d, d[ d. e j* f g ƒ d/ „  ƒ Z- d0 „  Z. e  j j d1 e j/ e j0 g ƒ d2 „  ƒ Z1 e  j j d% d e j* d& d' d( g ƒ d3 „  ƒ Z2 e  j j d e$ d* g ƒ d4 „  ƒ Z3 e  j j4 d5 ƒ e  j j4 d6 ƒ d7 „  ƒ ƒ Z5 d8 „  Z6 e  j j d9 e j7 d  d- g d- d: g g ƒ e j7 d  d- g d- d  g g ƒ i d; d< 6d= d> 6d? f e j7 d  d- g d- d: g g ƒ e j7 d  d- g d- d: g g ƒ i d@ d< 6d= d> 6dA f e j7 d  d- g d- d: g g ƒ e j7 d  d- g d- d: g g ƒ i dB d< 6d@ d> 6dC f e j7 dD dE g dF dD g g d e% ƒe j7 dD dE g dF dD g g d e% ƒi  dG f g ƒ dH „  ƒ Z8 e  j j dI e j* e j9 f d( e j: f d  e j: f g ƒ e  j j dJ e j7 e j; e j/ e j< e j= e j> g ƒ e  j j dK d; d: e j7 d( d- g ƒ f dB dL e j7 d( d- d: g ƒ f g ƒ dM „  ƒ ƒ ƒ Z? e  j j dN e@ eA d= g ƒ e  j j dO e j* d( g ƒ e  j j dJ e j7 e j; e j/ e j< g ƒ dP „  ƒ ƒ ƒ ZB dQ „  ZC e  j j dR e j7 dD dE g dE dD g g d e$ ƒdD e j7 dE dE e@ eA g dE dE eA e@ g g d e$ ƒf e j7 e j* d. g d. e j* g g ƒ e j* e j7 d. d. e@ eA g d. d. eA e@ g g ƒ f e j7 e j* dE g dE e j* g g d e$ ƒe j* e j7 dE dE e@ eA g dE dE eA e@ g g d e$ ƒf e j7 d dE g dE d g g d e$ ƒd e j7 dE dE e@ eA g dE dE eA e@ g g d e$ ƒf g ƒ dS „  ƒ ZD e  j j dT e g ƒ e  j j dU dV e j* dW f d\ g ƒ dZ „  ƒ ƒ ZE d S(]   iÿÿÿÿN(   t   sparse(   t   assert_allclose(   t   assert_allclose_dense_sparse(   t   assert_array_equal(   t   assert_array_almost_equal(   t   assert_false(   t   MissingIndicator(   t   SimpleImputer(   t   Pipeline(   t
   make_union(   t   GridSearchCV(   t   tree(   t   sparse_random_matrixc   	      C   sQ  d | | f } t  } |  j j d k s: | j j d k rC t } n  t | d | ƒ} | j |  ƒ j |  j ƒ  ƒ } | | j | d | j	 t
 ƒ ƒ| | | d | j	 t
 ƒ ƒt | d | ƒ} | j t j |  ƒ ƒ | j t j |  j ƒ  ƒ ƒ } t j | ƒ r| j ƒ  } n  | | j | d | j	 t ƒ ƒ| | | d | j	 t ƒ ƒd S(   sâ   Utility function for testing imputation for a given strategy.

    Test with dense and sparse arrays

    Check that:
        - the statistics (mean, median, mode) are correct
        - the missing values are imputed correctlys<   Parameters: strategy = %s, missing_values = %s, sparse = {0}t   ft   strategyt   err_msgN(   R   t   dtypet   kindR   R   t   fitt	   transformt   copyt   statistics_t   formatt   FalseR    t
   csc_matrixt   issparset   toarrayt   True(	   t   Xt   X_trueR   t
   statisticst   missing_valuesR   t	   assert_aet   imputert   X_trans(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   _check_statistics   s$    
$	c          C   s¬   t  j j d d ƒ }  t  j |  d  d  d … <xz d d d d g D]f } t d | ƒ } | j t j |  ƒ ƒ } | j d k s€ t	 ‚ | j |  ƒ } | j d	 k s> t	 ‚ q> Wd  S(
   Ni
   i   t   meant   mediant   most_frequentt   constantR   (   i
   i   (   i
   i   (
   t   npt   randomt   randnt   nanR   t   fit_transformR    t
   csr_matrixt   shapet   AssertionError(   R   R   R!   t	   X_imputed(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_shape=   s    R   t   constie   c         C   s^   t  j d ƒ } t  j | d <t j t d t |  ƒ ƒ! t d |  ƒ } | j | ƒ Wd  QXd  S(   Ni   i   i    t   matchR   (   i   i   (   i    i    (	   R(   t   onesR+   t   pytestt   raisest
   ValueErrort   strR   R,   (   R   R   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt&   test_imputation_error_invalid_strategyJ   s
    R$   R%   R&   c      	   C   sj   t  j d ƒ } t  j | d  d  … d f <t j t d d ƒ' t d |  d t ƒ } | j | ƒ Wd  QXd  S(	   Ni   i   i    R3   t   DeletingR   t   verbose(   i   i   (	   R(   R4   R+   R5   t   warnst   UserWarningR   R   R,   (   R   R   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt    test_imputation_deletion_warningT   s
    R'   c         C   s¦   t  j d ƒ } d | d <t j | ƒ } t d |  d d ƒ } t j t d d ƒ | j | ƒ Wd  QX| j | j	 ƒ  ƒ t j t d d ƒ | j
 | ƒ Wd  QXd  S(	   Ni   i   i    R   R   R3   s   Provide a dense array(   i   i   (   R(   R4   R    R   R   R5   R6   R7   R   R   R   (   R   R   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_error_sparse_0^   s    
c         O   sJ   t  |  d ƒ r |  j n	 t |  ƒ } | d k r7 t j St j |  | | Ž S(   Nt   sizei    (   t   hasattrR@   t   lenR(   R+   R%   (   t   arrt   argst   kwargst   length(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   safe_mediano   s    $c         O   sJ   t  |  d ƒ r |  j n	 t |  ƒ } | d k r7 t j St j |  | | Ž S(   NR@   i    (   RA   R@   RB   R(   R+   R$   (   RC   RD   RE   RF   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt	   safe_meanu   s    $c          C   s9  t  j j d ƒ }  d } d } | | | | f } t  j | d ƒ } t  j d | d d ƒ } | d d  d … | d d  d … <d t  j d „  f d t  j d	 „  f g } xˆ| D]€\ } } }	 t  j | ƒ }
 t  j | ƒ } t  j | d ƒ } xÊt | d ƒ D]¸} | | d d k | | d | | d } t | d | | | | | | d ƒ } | d | | } | |  } t  j	 | | ƒ } | |  j
 t | ƒ ƒ |  } |	 | | | ƒ | | <t  j | | | f ƒ |
 d  d  … | f <d | k r0t  j | t  j	 | | | | ƒ f ƒ | d  d  … | f <n8 t  j | | t  j	 | | | ƒ f ƒ | d  d  … | f <t  j j | ƒ j |
 d  d  … | f ƒ t  j j | ƒ j | d  d  … | f ƒ qW| d k rét  j | ƒ j d
 d ƒ } n t  j | ƒ j d
 d ƒ } | d  d  … | f } t |
 | | | | ƒ q± Wd  S(   Ni    i
   i   i   i   R$   c         S   s   t  t j |  | f ƒ ƒ S(   N(   RH   R(   t   hstack(   t   zt   vt   p(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   <lambda>ˆ   s    R%   c         S   s   t  t j |  | f ƒ ƒ S(   N(   RG   R(   RI   (   RJ   RK   RL   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyRM   Š   s    t   axis(   R(   R)   t   RandomStatet   zerost   arangeR+   t   emptyt   ranget   maxt   repeatt   permutationRB   RI   t   shufflet   isnant   anyt   allR#   (   t   rngt   dimt   decR.   RP   t   valuest   testsR   t   test_missing_valuest   true_value_funR   R   t   true_statisticst   jt   nb_zerost   nb_missing_valuest	   nb_valuesRJ   RL   RK   t   cols_to_keep(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_mean_median{   sR    !	,(
(	&	)-c          C   sC  t  j d t  j t  j g d t  j t  j g d d t  j g d d t  j g d d t  j g d d t  j g d d t  j g d d t  j g g ƒ j ƒ  }  t  j d d d g d d d g d d d g d d d g d d d	 g d d d
 g d d d g d d d g g ƒ j ƒ  } d d d d d	 d
 d d g } t |  | d | t  j ƒ d  S(   Ni    i   iûÿÿÿi   iüÿÿÿiÿÿÿÿi   g      Àg      @g      @g      Àg      à?R%   (   R(   t   arrayR+   t	   transposeR#   (   R   t   X_imputed_mediant   statistics_median(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt$   test_imputation_median_special_casesÀ   s*    R   c         C   su   t  j d d d g d d d g d d d	 g g d
 | ƒ} t j t d d ƒ! t d |  ƒ } | j | ƒ Wd  QXd  S(   Nt   at   bi   i   t   ei   t   gt   hi	   R   R3   s   non-numeric dataR   (   R(   Ri   R5   R6   R7   R   R,   (   R   R   R   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt.   test_imputation_mean_median_error_invalid_typeÝ   s    t   Ut   Sc         C   s±   t  j t  j t  j d d g t  j d t  j d g t  j d d t  j g t  j d d d g g d | ƒ} d } t j t d	 | ƒ* t d
 |  ƒ } | j | ƒ j | ƒ Wd  QXd  S(   NRn   R   t   ct   dRo   Rr   R   s#   SimpleImputer does not support dataR3   R   (	   R(   Ri   R+   R5   R6   R7   R   R   R   (   R   R   R   R   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt/   test_imputation_const_mostf_error_invalid_typesé   s    	c          C   s³   t  j d d d d g d d d d g d d d d g d d d d g g ƒ }  t  j d d d g d d d g d d d g d d d g g ƒ } t |  | d t  j d d d g d ƒ d  S(	   Niÿÿÿÿi    i   i   i   i   i   R&   (   R(   Ri   R#   R+   (   R   R   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_most_frequentû   s    t   markert   NANt    i    c         C   sÔ   t  j |  |  d d g |  d |  d g |  d d |  g |  d d d g g d t ƒ} t  j d d d g d d d g d d d g d d d g g d t ƒ} t d |  d	 d
 ƒ } | j | ƒ j | ƒ } t | | ƒ d  S(   NRn   R   Rv   Rw   Ro   Rr   R   R   R   R&   (   R(   Ri   t   objectR   R   R   R   (   Rz   R   R   R!   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt%   test_imputation_most_frequent_objects  s     			t   categoryc         C   s§   t  j d ƒ } t j d ƒ } | j | d |  ƒ} t j d d d g d d d g d d d g d	 d d g g d t ƒ} t d
 d ƒ } | j	 | ƒ } t
 | | ƒ d  S(   Nt   pandasu,   Cat1,Cat2,Cat3,Cat4
,i,x,
a,,y,
a,j,,
b,j,x,R   Rn   t   it   xRc   t   yRo   R   R&   (   R5   t   importorskipt   iot   StringIOt   read_csvR(   Ri   R}   R   R,   R   (   R   t   pdR   t   dfR   R!   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt$   test_imputation_most_frequent_pandas*  s    	s   X_data, missing_valuei   g      ð?c         C   sj   t  j d |  d t ƒ} | | d <t j t d d ƒ- t d | d d	 d
 d ƒ } | j | ƒ Wd  QXd  S(   Ni   i   R   i    R3   s   imputing numericalR   R   R'   t
   fill_valueR‚   (   i   i   (   i    i    (   R(   t   fullt   floatR5   R6   R7   R   R,   (   t   X_datat   missing_valueR   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt+   test_imputation_constant_error_invalid_typeD  s    
	c          C   sÑ   t  j d d d d g d d d d g d d d d g d d	 d
 d g g ƒ }  t  j d
 d d d
 g d d
 d d
 g d d d
 d
 g d d	 d
 d
 g g ƒ } t d d d d d d
 ƒ } | j |  ƒ } t | | ƒ d  S(   Niÿÿÿÿi   i   i   i   i   i   i   i	   i    R   R   R'   R‹   (   R(   Ri   R   R,   R   (   R   R   R!   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt    test_imputation_constant_integerQ  s    	t   array_constructorc         C   sø   t  j t  j d d t  j g d t  j d t  j g d d t  j t  j g d d d t  j g g ƒ } t  j d d d d g d d d d g d d d d g d d d d g g ƒ } |  | ƒ } |  | ƒ } t d d	 d
 d ƒ } | j | ƒ } t | | ƒ d  S(   Ngš™™™™™ñ?i    g333333ó?gÍÌÌÌÌÌô?gffffffö?g      ø?iÿÿÿÿR   R'   R‹   (   R(   Ri   R+   R   R,   R   (   R’   R   R   R!   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_constant_floath  s    c         C   sÝ   t  j |  d d |  g d |  d |  g d d |  |  g d d d	 |  g g d
 t ƒ} t  j d d d d g d d d d g d d d d g d d d	 d g g d
 t ƒ} t d |  d d d d ƒ } | j | ƒ } t | | ƒ d  S(   NRn   Ro   Rv   Rw   Rp   R   Rq   Rr   R   R   t   missingR   R   R'   R‹   (   R(   Ri   R}   R   R,   R   (   Rz   R   R   R!   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_constant_objectƒ  s     			c         C   s³   t  j d ƒ } t j d ƒ } | j | d |  ƒ} t j d d d d g d d d d g d d	 d d g d
 d	 d d g g d t ƒ} t d d ƒ } | j	 | ƒ } t
 | | ƒ d  S(   NR€   u,   Cat1,Cat2,Cat3,Cat4
,i,x,
a,,y,
a,j,,
b,j,x,R   R   R   R‚   Rn   Rƒ   Rc   Ro   R   R'   (   R5   R„   R…   R†   R‡   R(   Ri   R}   R   R,   R   (   R   Rˆ   R   R‰   R   R!   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_constant_pandas›  s    	s    ignore: The default of the `iid`s"   ignore: You should specify a valuec          C   s©   t  d d d d ƒ}  |  j d } t d t d | ƒ f d t j d d ƒ f g ƒ } i d	 d
 d g d 6} t  d d d d ƒj ƒ  } t | | ƒ } | j |  | ƒ d  S(   Nid   t   densitygš™™™™™¹?i    R!   R   R   t   random_stateR$   R%   R&   t   imputer__strategyi   (	   R   t   dataR   R   R   t   DecisionTreeRegressorR   R
   R   (   R   R   t   pipelinet
   parameterst   Yt   gs(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt$   test_imputation_pipeline_grid_searchµ  s    c          C   s3  t  d d d d d d ƒ}  |  j ƒ  j ƒ  } t d d d d d	 t ƒ } | j | ƒ j | ƒ } d
 | d <t t j	 | | k ƒ ƒ |  j ƒ  } t d | j
 d d d d	 t ƒ } | j | ƒ j | ƒ } d
 | j
 d <t t j	 | j
 | j
 k ƒ ƒ |  j ƒ  j ƒ  } t d d d d d	 t ƒ } | j | ƒ j | ƒ } d
 | d <t | | ƒ |  j ƒ  j ƒ  } t d | j
 d d d d	 t ƒ } | j | ƒ j | ƒ } d
 | j
 d <t | j
 | j
 ƒ |  j ƒ  } t d | j
 d d d d	 t ƒ } | j | ƒ j | ƒ } d
 | j
 d <t t j	 | j
 | j
 k ƒ ƒ d  S(   Ni   R—   g      è?R˜   i    R   R   R$   R   iÿÿÿÿ(   i    i    (   i    i    (   R   R   R   R   R   R   R   R   R(   RZ   Rš   R   R   t   tocsc(   t   X_origR   R!   t   Xt(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_imputation_copyÊ  s:    
	
		s   X_fit, X_trans, params, msg_erri   s   missing-onlyt   featurest   autoR    sB   have missing values in transform but have no missing values in fitR)   s3   'features' has to be either 'missing-only' or 'all'RZ   s&   'sparse' has to be a boolean or 'auto'Rn   Ro   Rv   s1   MissingIndicator does not support data with dtypec         C   sR   t  d d ƒ } | j |   t j t d | ƒ | j |  ƒ j | ƒ Wd  QXd  S(   NR   iÿÿÿÿR3   (   R   t
   set_paramsR5   R6   R7   R   R   (   t   X_fitR"   t   paramst   msg_errt	   indicator(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_missing_indicator_errorø  s    s   missing_values, dtypet   arr_types,   param_features, n_features, features_indicesi   c         C   sŸ  t  j |  |  d g d |  d g g ƒ } t  j |  |  d g d d d g g ƒ } t  j d d d g d d d g g ƒ } t  j d d d g d d d g g ƒ }	 | | ƒ j | ƒ } | | ƒ j | ƒ } | j | ƒ } |	 j | ƒ }	 t d |  d | d	 t ƒ }
 |
 j | ƒ } |
 j | ƒ } | j d | k s6t ‚ | j d | k sOt ‚ t	 |
 j
 | ƒ t | | d  d  … | f ƒ t | |	 d  d  … | f ƒ | j t k s®t ‚ | j t k sÃt ‚ t | t  j ƒ sÛt ‚ t | t  j ƒ sót ‚ |
 j d	 t ƒ |
 j | ƒ } |
 j | ƒ } | j t k s6t ‚ | j t k sKt ‚ | j d
 k s`t ‚ | j d
 k sut ‚ t | j ƒ  | ƒ t | j ƒ  | ƒ d  S(   Ni   i   i   i   i
   i    R   R¥   R    t   csc(   R(   Ri   t   astypeR   R   R,   R   R.   R/   R   t	   features_R   R   t   boolt
   isinstancet   ndarrayR§   R   R   R   (   R   R­   R   t   param_featurest
   n_featurest   features_indicesR¨   R"   t   X_fit_expectedt   X_trans_expectedR«   t
   X_fit_maskt   X_trans_maskt   X_fit_mask_sparset   X_trans_mask_sparse(    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_missing_indicator_new  sB    ''	t   param_sparseR   c         C   sä  t  j | | d g d | d g g ƒ } t  j | | d g d d d g g ƒ } |  | ƒ j t  j ƒ } |  | ƒ j t  j ƒ } t d | d | ƒ } | j | ƒ } | j | ƒ } | t k rê | j d k sÒ t	 ‚ | j d k sàt	 ‚ nö | d	 k r5| d
 k r5t
 | t  j ƒ st	 ‚ t
 | t  j ƒ sàt	 ‚ n« | t k rtt
 | t  j ƒ sYt	 ‚ t
 | t  j ƒ sàt	 ‚ nl t j | ƒ r°| j d k s˜t	 ‚ | j d k sàt	 ‚ n0 t
 | t  j ƒ sÈt	 ‚ t
 | t  j ƒ sàt	 ‚ d  S(   Ni   i   i   i   i
   R   R    R®   R¦   i    (   R(   Ri   R¯   t   float64R   R,   R   R   R   R/   R²   R³   R   R    R   (   R­   R   R¾   R¨   R"   R«   R¹   Rº   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt#   test_missing_indicator_sparse_paramH  s0    	c          C   sƒ   t  j d d d g d d d g g d t ƒ}  t d d d d ƒ } | j |  ƒ } t | t  j t t t g t t t g g ƒ ƒ d  S(   NRn   Ro   Rv   R   R   R¥   RZ   (   R(   Ri   R}   R   R,   R   R   R   (   R   R«   R"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   test_missing_indicator_stringn  s
    -s   X, missing_values, X_trans_expc         C   sG   t  t d | d d ƒ t d | ƒ ƒ } | j |  ƒ } t | | ƒ d  S(   NR   R   R&   (   R	   R   R   R,   R   (   R   R   t   X_trans_expt   transR"   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt#   test_missing_indicator_with_imputerv  s
    t   imputer_constructors.   imputer_missing_values, missing_value, err_msgt   NaNs   Input contains NaNs   -1s(   types are expected to be both numerical.c         C   sj   t  j j d ƒ } | j d d ƒ } | | d <|  d | ƒ } t j t d | ƒ | j | ƒ Wd  QXd  S(   Ni*   i
   i    R   R3   (   i    i    (   R(   R)   RO   R*   R5   R6   R7   R,   (   RÅ   t   imputer_missing_valuesR   R   R[   R   R!   (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt(   test_inconsistent_dtype_X_missing_values  s    
(   i   i    (   s   -1iÿÿÿÿs(   types are expected to be both numerical.(F   R5   t   numpyR(   t   scipyR    R…   t   sklearn.utils.testingR   R   R   R   R   t   sklearn.imputeR   R   t   sklearn.pipelineR   R	   t   sklearn.model_selectionR
   t   sklearnR   t   sklearn.random_projectionR   R#   R1   t   markt   parametrizet   NoneR9   R>   R?   RG   RH   Rh   Rm   R}   R8   Rs   R   Rx   Ry   R+   R~   RŠ   R   R‘   R-   t   asarrayR“   R•   R–   t   filterwarningsR    R¤   Ri   R¬   R¿   t   int32R   t
   coo_matrixt
   lil_matrixt
   bsr_matrixR½   R   R   RÀ   RÁ   RÄ   RÈ   (    (    (    s8   lib/python2.7/site-packages/sklearn/tests/test_impute.pyt   <module>   s¸   	&	'
'
			E	*<	0$-	*0$	.	<<<$$				6.	0"		'*	*-0*	'*		