a
    h\                     @   sr  d dl mZ d dlZd dlZd dlmZ d dlm	Z	 d dl
mZm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mZmZmZ d d	lmZmZ d d
l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)m*Z*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZAmBZB eC ZDejEFd ZGeGHeDjIjJZKeDjLeK eD_LeDjIeK eD_IdZMdd ZNdd ZOdd ZPdd ZQdd  ZRd!d" ZSejTUd#e=e< e; e> e? d$d% ZVd&d' ZWd(d) ZXd*d+ ZYd,d- ZZd.d/ Z[d0d1 Z\d2d3 Z]d4d5 Z^d6d7 Z_d8d9 Z`d:d; Zad<d= Zbd>d? Zcd@dA ZddBdC ZedDdE ZfdFdG ZgdHdI ZhdJdK ZidLdM ZjdNdO ZkdPdQ ZldRdS ZmdTdU ZndVdW ZodXdY ZpdZd[ ZqejTUd\e<d]d^ Zrd_d` Zsdadb ZtejTUdce#e"gddde ZuejTUdce#e"gdfdg ZvejTUdce#e"gdhdi ZwejTUdjejxejygdkdl Zzdmdn Z{dodp Z|dS )q    )escapeN)assert_allclose)datasetssvm)load_breast_cancer)NotFittedError)SimpleImputer)
ElasticNetLassoLinearRegressionLogisticRegression
PerceptronRidgeSGDClassifier)precision_scorerecall_score)GridSearchCVcross_val_score)OneVsOneClassifierOneVsRestClassifierOutputCodeClassifier)MultinomialNB)KNeighborsClassifier)Pipelinemake_pipeline)SVC	LinearSVC)DecisionTreeClassifierDecisionTreeRegressor)check_arrayshuffle)CheckingClassifier)assert_almost_equalassert_array_equal)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERSDOK_CONTAINERSLIL_CONTAINERS)check_classification_targetstype_of_target   c                  C   s$  t tdd} tt | g  W d    n1 s80    Y  d}tjt|dN tddgddgg}tddgddgg}t t	 
|| W d    n1 s0    Y  tjt|dN tddgddgg}tdd	gd
dgg}t t	 
|| W d    n1 s0    Y  d S )Nr   random_statez@Multioutput target data is not supported with label binarizationmatch      r+   g      ?g333333@g@皙?)r   r   pytestraisesr   predict
ValueErrornparrayr   fit)ovrmsgXy r>   Y/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/tests/test_multiclass.pytest_ovr_exceptions8   s    (0r@   c                  C   sP   t g d} t| }tjt|d t|  W d    n1 sB0    Y  d S )N)        g?       @g      @r.   )r7   r8   r*   r3   r4   r6   r)   )r=   r;   r>   r>   r?   !test_check_classification_targetsL   s    rC   c                  C   s   t tdd} | tjtjtj}t| jt	ks8J tdd}|tjtjtj}t
tj|kt
tj|kks~J t t } | tjtjtj}t
tj|kdksJ d S )Nr   r,   ?)r   r   r9   irisdatatargetr5   lenestimators_	n_classesr7   meanr   )r:   predclfpred2r>   r>   r?   test_ovr_fit_predictT   s    
$
rO   c                  C   s  t tjtjdd\} }tt }|| d d |d d t| || dd  |dd   |	| }tt }|
| |	| }t|| t|jtt|ksJ t||kdksJ ttjdd} g d}ttdd d	dd
}|| d d |d d t| || dd  |dd   |	| }ttdd d	dd
}|
| |	| }t||kt||kksJ tt }t|drJ d S )Nr   r,   d   rD      r1   r0   r0   r0   r0   r1   r+   r+   r   r   r1   r+   r0   r1   r+   r0   F)max_itertolr    r-      partial_fit)r    rE   rF   rG   r   r   rV   r7   uniquer5   r9   r"   rH   rI   rK   absrandomrandnr   r   hasattr)r<   r=   r:   rL   Zovr2rN   Zovr1pred1r>   r>   r?   test_ovr_partial_fitd   s2    
$


$
"
r]   c                  C   s   t t } ttjdd}g d}| |d d |d d t| dg|dd  }d}tj	t
|d& | j|dd  |d	 W d    n1 s0    Y  d S )
NrQ   r1   rR   rU      zAMini-batch contains \[.+\] while classes must be subset of \[.+\]r.   )r<   r=   )r   r   r7   rX   rY   rZ   rV   rW   r3   r4   r6   )r:   r<   r=   y1r;   r>   r>   r?   test_ovr_partial_fit_exceptions   s    
$ra   c                  C   s   t t } | tjtjtj}t| jt	ks4J t
t|g d t|tjkdks`J tt } | tjtjtj}t| jt	t	d  d ksJ t
t|g d t|tjkdksJ d S )N)r   r0   r1   ?r0   r1   )r   r   r9   rE   rF   rG   r5   rH   rI   rJ   r#   r7   rW   rK   r   )r:   rL   r>   r>   r?   test_ovr_ovo_regressor   s    

rc   sparse_containerc              	   C   s  t dd}tjddddddd	d
\}}|d d |d d  }}|dd  }t|||}||}t||| |}	|	|}
|jsJ t|
sJ t	|

 | |	|}|dk}t	||

  t }t||| |}	|	|d	kt}t	||	|
  d S )Nr0   alpharP      r^   r+   2   Tr   	n_samples
n_featuresrJ   Zn_labelslengthZallow_unlabeledr-   P         ?)r   r   make_multilabel_classificationr   r9   r5   multilabel_spissparser#   Ztoarraypredict_probar   r   decision_functionastypeint)rd   base_clfr<   YX_trainY_trainX_testrM   Y_predZclf_sprsZY_pred_sprsY_probarL   Zdec_predr>   r>   r?   test_ovr_fit_predict_sparse   s4    






r~   c                  C   s  t d} d| d dd d f< t d}d|dd df< d|d d df< d|d d df< tt }d}tjt|d || | W d    n1 s0    Y  |	| }t
t |t | || }t |d d d	d f dksJ || }t
|d d d
f t | jd  t d}d|dd df< tt }d}tjt|d || | W d    n1 sr0    Y  || }t
|d d d
f t | jd  d S )N
   r1   r   r^   )r   r+   r0   r1   z,Label .+ is present in all training examplesr.   r_   z/Label not 1 is present in all training examples)r7   oneszerosr   r   r3   ZwarnsUserWarningr9   r5   r#   r8   rt   rW   rs   shape)r<   r=   r:   r;   y_predr>   r>   r?   test_ovr_always_present   s0    


*

"
"

,
r   c                  C   s  t g dg dg dg dg dg} g d}t g dg dg d	g dg d	g}td
 }t tddt t t fD ]~}t	|
| |}t|j|ksJ |t g dgd }t|dg t	|
| |}|g dgd }t|g d qd S )Nr   r   r^   r   r^   r   r+   r   r   r   r      r   r   r   )eggsspamhamr   r   )r   r   r0   r   r0   r   r0   r   r   zham eggs spamr   r,   r   r      r   )r7   r8   setsplitr   r   r   r   r	   r   r9   classes_r5   r#   )r<   r=   rx   classesrw   rM   r   r>   r>   r?   test_ovr_multiclass   s"    ((r   c                     s   t g dg dg dg dg dg g dt g dgjtd d fd
d	} tddt t t fD ]}| | qzt	 t
ddt fD ]}| |dd qd S )Nr   r   r   r   r   )r   r   r   r   r   )r   r0   r0   r   r0   z	eggs spamFc                    s   t |  }t|jks"J |tg dgd }t|dg t| drj|	 }|j
dksjJ |rtg dg}||}dt|d ksJ |jtj|dd ||ksJ t |  }|g d	gd }|dksJ d S )
Nr   r   r   rt   )r^   r1   r0   Zaxisr   )r   r9   r   r   r5   r7   r8   r#   r[   rt   r   rs   rH   argmax)rw   test_predict_probarM   r   decr{   Zprobabilitiesr<   rx   r   r=   r>   r?   conduct_test  s    


"z%test_ovr_binary.<locals>.conduct_testr   r,   Tprobability)r   )F)r7   r8   Tr   r   r   r   r   r	   r   r   r   )r   rw   r>   r   r?   test_ovr_binary  s    (
r   c                  C   s   t g dg dg dg dg dg} t g dg dg dg d	g d
g}t tddt t t tddfD ]@}t|	| |}|
g dgd }t|g d |jstJ qtd S )N)r   r   r^   r   )r+   r+   r+   )r   r   r   r   )r   r0   r0   r   )r0   r0   r0   )r0   r   r0   r   r   r,   rn   re   )r   r   r   )r7   r8   r   r   r   r   r	   r
   r   r9   r5   r#   rp   )r<   r=   rw   rM   r   r>   r>   r?   test_ovr_multilabel:  s    ((r   c                  C   sJ   t t } | tjtj t| jdks.J | 	tjtjdksFJ d S )Nr+   rb   )
r   r   r   r9   rE   rF   rG   rH   rI   score)r:   r>   r>   r?   test_ovr_fit_predict_svcM  s    r   c               
   C   s   t dd} tdddD ]\}}}tjdddd	d
|dd\}}|d d |d d  }}|dd  |dd   }}	t| ||}
|
|}|
jsJ tt	|	|dd|d	d tt
|	|dd|d	d qd S )Nr0   re   )TF)RQ?gQ?)r   r2   rP   rg   r^   r1   rh   r   ri   rm   micro)Zaverage)decimal)r   zipr   ro   r   r9   r5   rp   r"   r   r   )rw   auprecZrecallr<   rx   ry   rz   r{   ZY_testrM   r|   r>   r>   r?   test_ovr_multilabel_datasetT  s,    

	

r   c               
   C   sH  t dd} dD ]2}tjddddd|d	d
\}}|d d |d d  }}|dd  }t| ||}tt ||}t|drJ ttjdd}t|drJ ||| t|drJ t|dsJ t	tjddddgid}	t|	}
t|
dr J |
|| t|
dsJ |
|}||}|dk}t|| qd S )Nr0   re   )FTrP   rg   r^   r+   rh   r   ri   rm   rs   Fr   rt   r   T)Z
param_gridrn   )r   r   ro   r   r9   r   SVRr[   r   r   r5   rs   r#   )rw   r   r<   rx   ry   rz   r{   rM   decision_onlygsZproba_after_fitr|   r}   rL   r>   r>   r?   !test_ovr_multilabel_predict_proban  s@    


	

r   c                  C   s   t dd} tjtj }}|d d |d d  }}|dd  }t| ||}tt ||}t|drpJ |	|}|
|}	t|	jddd |	jdd}
|
|  rJ d S )Nr0   re   rm   rs   r         ?)r   rE   rF   rG   r   r9   r   r   r[   r5   rs   r"   sumr   any)rw   r<   rx   ry   rz   r{   rM   r   r|   r}   rL   r>   r>   r?   #test_ovr_single_label_predict_proba  s    


r   c               	   C   sz   t jdddddddd\} }| d d	 |d d	  }}| d	d  }tt ||}t||dkt	|
| d S )
NrP   rg   r^   r+   rh   Tr   ri   rm   )r   ro   r   r   r   r9   r#   rt   ru   rv   r5   r<   rx   ry   rz   r{   rM   r>   r>   r?   %test_ovr_multilabel_decision_function  s    
	r   c                  C   sp   t jdddd\} }| d d |d d  }}| dd  }tt ||}t|| dk|	| d S )NrP   rg   r   )rj   rk   r-   rm   )
r   Zmake_classificationr   r   r   r9   r#   rt   Zravelr5   r   r>   r>   r?   'test_ovr_single_label_decision_function  s
    r   c                  C   sR   t tdd} g d}t| d|i}|tjtj |jjd j	}||v sNJ d S Nr   r,   )皙?rn   r2   Zestimator__C)
r   r   r   r9   rE   rF   rG   best_estimator_rI   C)r:   Cscvbest_Cr>   r>   r?   test_ovr_gridsearch  s    r   c                  C   s`   t dt fg} t| }|tjtj tt }|tjtj t|tj|tj d S )Ntree)	r   r   r   r9   rE   rF   rG   r#   r5   )rM   Zovr_piper:   r>   r>   r?   test_ovr_pipeline  s    
r   c                  C   sF   t tdd} tt | g  W d    n1 s80    Y  d S Nr   r,   )r   r   r3   r4   r   r5   ovor>   r>   r?   test_ovo_exceptions  s    r   c                  C   s\   t tdd} | tjtjtj}dd tjD }| |ttj|}t|| d S )Nr   r,   c                 S   s   g | ]}t |qS r>   )list).0ar>   r>   r?   
<listcomp>      z(test_ovo_fit_on_list.<locals>.<listcomp>)	r   r   r9   rE   rF   rG   r5   r   r#   )r   Zprediction_from_arrayZiris_data_listZprediction_from_listr>   r>   r?   test_ovo_fit_on_list  s    r   c                  C   s   t tdd} | tjtjtj t| jt	t	d  d ksDJ t t
 } | tjtjtj t| jt	t	d  d ksJ d S )Nr   r,   r0   r1   )r   r   r9   rE   rF   rG   r5   rH   rI   rJ   r   r   r>   r>   r?   test_ovo_fit_predict  s    
r   c                  C   s  t  } | j| j }}tt }||d d |d d t| ||dd  |dd   |	|}tt }|
|| |	|}t|jttd  d ksJ t||kdksJ t|| tt }||d d |d d t| ||dd  |dd   |	|}tt }|
||	|}t|| t|jtt|ks`J t||kdksxJ tt }tjdd}g d}||d d |d d g d	 ||dd  |dd   |	|}tt }|
||	|}t|| tt }g d
}	tdt|	t|}
tjt|
d, ||d d |	t| W d    n1 sv0    Y  tt }t|drJ d S )NrP   r0   r1   rD   <   rQ   )r0   r0   r1   r+   r+   r   r   r   r   r   r   r   r1   r1   rU   )r   r0   r1   r+   r   )r   r0   r1   r+   r   r^   r1   z6Mini-batch contains {0} while it must be subset of {1}r.   rV   )r   	load_irisrF   rG   r   r   rV   r7   rW   r5   r9   rH   rI   rJ   rK   r"   rY   Zrandr   formatr3   r4   r6   r   r[   )tempr<   r=   Zovo1r\   Zovo2rN   r   rL   Zerror_yZ
message_rer:   r>   r>   r?   test_ovo_partial_fit_predict  sR    
$




$



"



<
r   c            	      C   s  t jjd } ttdd}|t jt jdk |t j}|j| fksJJ |t jt j |t j}|j| tfksxJ t	|j
dd|t j t| tf}d}ttD ]b}t|d tD ]N}|j| t j}||dk|f  d7  < ||dk|f  d7  < |d7 }qqt	|t| ttD ]R}t|d d |f tg dsTJ tt|d d |f dks(J q(d S )Nr   r,   r0   r   )rA   r   rB      )rE   rF   r   r   r   r9   rG   rt   rJ   r#   r   r5   r7   r   rangerI   roundr   issubsetrH   rW   )	rj   Zovo_clfZ	decisionsvoteskijrL   Z	class_idxr>   r>   r?   test_ovo_decision_function2  s*    (r   c                  C   sR   t tdd} g d}t| d|i}|tjtj |jjd j	}||v sNJ d S r   )
r   r   r   r9   rE   rF   rG   r   rI   r   )r   r   r   r   r>   r>   r?   test_ovo_gridsearcha  s    r   c                  C   s   t ddgddgddgddgg} t g d}ttddd d}|| || }|| }t |}|| }t|d	d d f d tt j	|dd  dd
|dd   |d	 |d	 	 ksJ d S )Nr0   r1   r   r_   r1   r   r0   r1   Fr   r    rS   rT   r   r   )
r7   r8   r   r   r9   r5   rt   r   r#   r   )r<   r=   	multi_clfovo_predictionZovo_decisionr   Znormalized_confidencesr>   r>   r?   test_ovo_tiesj  s    "

$r   c                  C   s   t ddgddgddgddgg} t g d}tdD ]H}|| d }ttddd d	}|| || }|d
 |d ks8J q8d S )Nr0   r1   r   r_   r   r+   Fr   r   r   )r7   r8   r   r   r   r9   r5   )r<   Zy_refr   r=   r   r   r>   r>   r?   test_ovo_ties2  s    "r   c                  C   sB   t d} t g d}tt }|| | t|||  d S )Nr   )r   bcd)r7   eyer8   r   r   r9   r#   r5   )r<   r=   r   r>   r>   r?   test_ovo_string_y  s
    

r   c                  C   sf   t d} t dgd }tt }d}tjt|d || | W d    n1 sX0    Y  d S )Nr   r   zwhen only one classr.   )	r7   r   r8   r   r   r3   r4   r6   r9   r<   r=   r   r;   r>   r>   r?   test_ovo_one_class  s    

r   c                  C   sd   t j} t jd d df }tt }d}tjt|d || | W d    n1 sV0    Y  d S Nr   zUnknown label typer.   )rE   rF   r   r   r3   r4   r6   r9   r   r>   r>   r?   test_ovo_float_y  s    
r   c                  C   sF   t tdd} tt | g  W d    n1 s80    Y  d S r   )r   r   r3   r4   r   r5   ecocr>   r>   r?   test_ecoc_exceptions  s    r   c                  C   s   t tddddd} | tjtjtj t| jt	d ksBJ t t
 ddd} | tjtjtj t| jt	d ksJ d S )Nr   r,   r1   )Z	code_sizer-   )r   r   r9   rE   rF   rG   r5   rH   rI   rJ   r   r   r>   r>   r?   test_ecoc_fit_predict  s    r   c                  C   sV   t tdddd} g d}t| d|i}|tjtj |jjd j	}||v sRJ d S r   )
r   r   r   r9   rE   rF   rG   r   rI   r   )r   r   r   r   r>   r>   r?   test_ecoc_gridsearch  s    r   c                  C   sd   t j} t jd d df }tt }d}tjt|d || | W d    n1 sV0    Y  d S r   )rE   rF   r   r   r3   r4   r6   r9   r   r>   r>   r?   test_ecoc_float_y  s    
r   csc_containerc                 C   s   t jt j }}| |}ttdddd}t|dd}tjtdd |	|| W d    n1 sd0    Y  |	|| tjtdd |
| W d    n1 s0    Y  ttdd}|	||
| t|jd	ksJ d S )
NTF)Z	ensure_2dZaccept_sparse)Zcheck_XZcheck_X_paramsr   r,   zSparse data was passedr.   r   )rE   rF   rG   r!   r   r   r3   r4   	TypeErrorr9   r5   r   rH   rI   )r   r<   r=   ZX_spZbase_estimatorr   r>   r>   r?   (test_ecoc_delegate_sparse_base_estimator  s    *(r   c                  C   s~   t jdd} tjtj }}t| }t||j}|	|| t
|j}|j}|D ](}|jd | |d  |jd ksPJ qPd S )NprecomputedZkernelr   r0   )r   r   rE   rF   rG   r   r7   dotr   r9   rH   rI   Zpairwise_indices_r   )clf_precomputedr<   r=   	ovr_falselinear_kernelZn_estimatorsZprecomputed_indicesidxr>   r>   r?   test_pairwise_indices  s    
r   c            
      C   s   t jt j } }|d dksJ | dd } |dd }| jdksDJ tjdd| |}|jdksfJ t|| |}|jdksJ |j	D ]}|jdksJ qt
|| |}|jdksJ |jdksJ t|j	dksJ |j	D ]}|jdksJ q| | j }|jd	ksJ tjd
d||}|jdks4J t|||}|jdksTJ |jdksdJ t|j	dksxJ |j	D ]}|jdks~J q~t
|||}	|	jdksJ |jdksJ t|j	dksJ |	j	d jdksJ |	j	d jdksJ |	j	d jdksJ dS )a  Check the n_features_in_ attributes of the meta and base estimators

    When the training data is a regular design matrix, everything is intuitive.
    However, when the training data is a precomputed kernel matrix, the
    multiclass strategy can resample the kernel matrix of the underlying base
    estimator both row-wise and column-wise and this has a non-trivial impact
    on the expected value for the n_features_in_ of both the meta and the base
    estimators.
    r_   r   N)   r   linearr   r   r+   )r   r   r   r   c   r0   r1   rP   )rE   rF   rG   r   r   r   r9   Zn_features_in_r   rI   r   Z
n_classes_rH   r   )
r<   r=   clf_notprecomputedZovr_notprecomputedZestZovo_notprecomputedKr   Zovr_precomputedZovo_precomputedr>   r>   r?   test_pairwise_n_features_in  sD    




r  MultiClassClassifierc                 C   sH   t jdd}t  }| |}| jjr,J | |}| jjsDJ d S )Nr   r   )r   r   Z__sklearn_tags__Z
input_tagspairwise)r  r   r   r   Zovr_truer>   r>   r?   test_pairwise_tagF  s    r  c           
      C   sr   t jdd}t jdd}tjtj }}| |}| |}t||j}t|||dd}t|||dd}	t	|	| d S )Nr   r   r   raise)Zerror_score)
r   r   rE   rF   rG   r7   r   r   r   r#   )
r  r   r   r<   r=   Zmulticlass_clf_notprecomputedZmulticlass_clf_precomputedr   Zscore_not_precomputedZscore_precomputedr>   r>   r?   test_pairwise_cross_val_scoreT  s    r  c                 C   s|   t jd}tjtj }}t |}|jddg|jddgd	t
}t j||< tt t|d}| ||||| d S )N*   r0   r   r   rb   )pr,   )r7   rY   RandomStaterE   rF   rG   copychoicer   ru   boolnanr   r   r   r9   r   )r  rngr<   r=   masklrr>   r>   r?   test_support_missing_valuesj  s    	
 
r  make_yc                 C   sj   t d}| dt jd}tt }||| ||}t |jd df}d|dddf< t	|| dS )zUCheck that constant y target does not raise.

    Non-regression test for #21869
    r   )r   r0   )Zdtyper   r1   r0   N)
r7   r   Zint32r   r   r9   rs   r   r   r   )r  r<   r=   r:   r   expectedr>   r>   r?   test_constant_int_target}  s    


r  c                  C   sT   t dd\} }tddd}t|}|| | || | t|| ||  dS )z^Check that ovo is consistent with binary classifier.

    Non-regression test for #13617.
    T)Z
return_X_y   Zdistance)Zn_neighborsweightsN)r   r   r   r9   r#   r5   )r<   r=   rM   r   r>   r>   r?   )test_ovo_consistent_binary_classification  s    r  c                  C   s   t  } ttddd}d}d}tjt|d }|| j| j	 W d   n1 sT0    Y  t
|jjtspJ |t|jjv sJ dS )a  Check that we raise the proper AttributeError when the final estimator
    does not implement the `partial_fit` method, which is decorated with
    `available_if`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28108
    r  r,   )Z	estimatorz9This 'OneVsRestClassifier' has no attribute 'partial_fit'z:'LogisticRegression' object has no attribute 'partial_fit'r.   N)r   r   r   r   r3   r4   AttributeErrorrV   rF   rG   
isinstancevalue	__cause__str)rE   rM   Z	outer_msgZ	inner_msgZ	exec_infor>   r>   r?   )test_multiclass_estimator_attribute_error  s    .r  )}rer   numpyr7   r3   Zscipy.sparsesparserq   Znumpy.testingr   Zsklearnr   r   Zsklearn.datasetsr   Zsklearn.exceptionsr   Zsklearn.imputer   Zsklearn.linear_modelr	   r
   r   r   r   r   r   Zsklearn.metricsr   r   Zsklearn.model_selectionr   r   Zsklearn.multiclassr   r   r   Zsklearn.naive_bayesr   Zsklearn.neighborsr   Zsklearn.pipeliner   r   Zsklearn.svmr   r   Zsklearn.treer   r   Zsklearn.utilsr   r    Zsklearn.utils._mockingr!   Zsklearn.utils._testingr"   r#   Zsklearn.utils.fixesr$   r%   r&   r'   r(   Zsklearn.utils.multiclassr)   r*   r   rE   rY   r
  r  ZpermutationrG   sizepermrF   rJ   r@   rC   rO   r]   ra   rc   markZparametrizer~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r  r  r  r>   r>   r>   r?   <module>   s   $	$
)$(-	5/	
	
E



