B
    Z0d|              	   @   s  d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dl	Z	d dl
Zd dl
mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZmZ dZe	jdZ d dl!m"Z"m#Z# e	jj$Z%dd	 Z&d
d Z'dd Z(dd Z)e	jddd Z*dd Z+e	j,ddddhe- fe- ddhfdhddhfe- dhfdfddhddhfe- dhfd fgd!d" Z.d#d$ Z/d%d& Z0d'd( Z1e	j,d)d*d+gd,d- Z2d.d/ Z3d0d1 Z4d2d3 Z5d4d5 Z6d6d7 Z7d8d9 Z8d:d; Z9d<d= Z:e	j,d>d+d*gd?d@ Z;dAdB Z<e	jdCdDdE Z=e	jdFdGdH Z>dIdJ Z?dKdL Z@dMdN ZAdOdP ZBdQdR ZCe	j,dSdTdUdVgdWdX ZDdYdZ ZEd[d\ ZFd]d^ ZGd_d` ZHdadb ZIdcdd ZJdedf ZKe	jd dgdh ZLdS )i    N)catch_warningssimplefilter)		DataFrameDatetimeIndexIndex
MultiIndexSeries	Timestampconcat
date_rangetimedelta_range)_maybe_removeensure_clean_pathensure_clean_store
safe_closeZbloscz7ignore:object name:tables.exceptions.NaturalNameWarning)HDFStoreread_hdfc          
   C   s   t | <}y t|}tdW d Q R X W n tk
r@   Y nX W d Q R X t | J}t|6}t  |d< t|dks~tt|d tkstW d Q R X W d Q R X d S )NZblaha   )	tmensure_cleanr   
ValueErrormakeDataFramelenAssertionErrortyper   )
setup_pathpathtbl r   U/var/www/html/venv/lib/python3.7/site-packages/pandas/tests/io/pytables/test_store.pytest_context.   s    

r!   c                sl   t jdfdd  fdd}|dd}|dd}td	 |dd}|dd}||ks\t||kshtd S )
N   c          	      sN   | t | d0x(t fdddD ]}| q*W W d Q R X  S )Nrbc                  s     j S )N)read
block_sizer   )chunk_num_blocksfhr   r    <lambda>D       z7test_no_track_times.<locals>.checksum.<locals>.<lambda>r*   )openiterupdatedigest)filenameZhash_factoryr&   chunkr   )r&   r'   r(   r    checksumA   s
    z%test_no_track_times.<locals>.checksumc          
      sX   t F}tddgi}t|dd}|jd|ddd | d W d Q R X  |S Q R X d S )Nr   r   w)modetableT)formatdata_columnsindextrack_times)r   r   r   put)r8   r   dfZhdf)r1   r   r   r    create_h5_and_return_checksumH   s    
z:test_no_track_times.<locals>.create_h5_and_return_checksumF)r8   Tr   )hashlibmd5timesleepr   )r   r;   Zchecksum_0_tt_falseZchecksum_0_tt_trueZchecksum_1_tt_falseZchecksum_1_tt_truer   )r1   r   r    test_no_track_times<   s    




r@   c          	   C   s(   t | }t|g kstW d Q R X d S )N)r   listr   )r   storer   r   r    test_iter_emptyh   s    
rC   c          
   C   s  t | h}t| |  t |d< t |d< t |d< t }d|d< d|d< |d d	k|d
< |d d	k|d< d|d< d|d< d|d< td|d< td|d< tdddd	d	|d< tdddd	d	|d< t	j
|j|jdd dgf< | jdd}tdd tdtjj ||d< W d Q R X |j|jjd  |jt|ksRt|jt|ksft|  W d Q R X t | 4}t }|d| |d}t| t| W d Q R X d S )!Nr   bcfooobj1barobj2Ar   bool1Bbool2Tbool3r   int1   int220010102
timestamp120010103
timestamp2i  	datetime1   	datetime2   )datetime)recordignorer:   Zbah)r   reprinfor   makeTimeSeriesZmakeStringSeriesr   r	   rZ   npnanlocr7   _consolidate_convertr   r   pderrorsZPerformanceWarning_handleZcreate_grouprootr/   r   strappend
get_storer)r   rB   r:   sr   r   r    	test_repro   sB    

rm   c          
   C   s   t | }t |d< t |d< t |d< d|ks:td|ksFtd|ksRtd|ks^td|ksjtd|ksvtd|ksttdd	 t |d
< W d Q R X d
|kstW d Q R X d S )Nr   rD   zfoo/barrE   z/foo/barz/foo/brH   T)r[   znode()))r   r   r_   r   r   r   )r   rB   r   r   r    test_contains   s    
rn   c          
   C   s   t | }t |d< t |d< t }t|d |d|d d  |d|dd   |jjj	j
dkspt|jjj	j
dkst|jjj	j
dkstt|d |d| d |dj	_
d}tjt|d |d W d Q R X W d Q R X d S )	Nr   rD   df1
   z0.15.2df2z/'NoneType' object has no attribute 'startswith')match)r   r   r_   r   makeTimeDataFramer   rj   rh   r   Z_v_attrsZpandas_versionr   rD   ro   Zget_nodepytestraises	Exceptionselect)r   rB   r:   msgr   r   r    test_versioning   s     


ry   zwhere, expected/Zfirst_groupZsecond_groupro   rq   Zthird_groupdf3s1df4) z/first_groupz/second_groupz/second_group/third_groupz/second_group)z/second_groupz/second_group/third_groupc             C   s  t dddgt dddgt dddgt d	d
dgtd
d	dgtdddgdddggtjddgddtjddgddd}tdddh}|d|d  |d|d  |d|d  |d|d  |d|d  |jd d!|d!  |jjd d"|d" d# |jjd$d%|d% d# t	t
|j| d&t	|ks<tx|j| d&D ]\}}}||ksbt|| \}}	|t|kst|	t|kstxR|D ]J}
d'||
g}||}d(|
krt|||
  nt|||
  qW qJW W d Q R X d S ))Nr   rP   rW         rY         	   rp      )r   rP   rW   )r   r   rY   zi,i,i)dtype)r   r   r   )rp   r      )ro   rq   r{   r}   r|   a1tb1tb2zwalk_groups.hdfr2   )r3   z/first_group/df1ro   z/first_group/df2rq   z/second_group/df3r{   z/second_group/s1r|   z/second_group/third_group/df4r}   z/first_groupr   r   )objz/second_groupr   )whererz   r:   )r   r   r`   arrayr   r9   rg   Zcreate_arrayZcreate_tabler   rA   walkr   setjoingetr   assert_frame_equalassert_series_equal)r   expectedr   ZobjsrB   r   groupsleavesZexpected_groupsZexpected_framesleafZ
frame_pathr   r   r   r    	test_walk   s:    "


r   c             C   s   t | }t }||d< |j}t|| t|d}t|| t }||d< |j}t|| x<dD ]4}d| d}t	j
t|d t|| W d Q R X qjW xdD ]}t|d|  qW W d Q R X d S )	Nr   r:   )dr3   r   handlecomplibz$'HDFStore' object has no attribute '')rr   )r3   r   r   r   _)r   r   r_   r   r   getattrrs   r:   r   rt   ru   AttributeError)r   rB   rl   resultr:   xrx   r   r   r    test_getattr
  s"    



r   c          	   C   s   t dtjdgdtjtjgdtdd}t ddgdtjgdtdd}t| ,}|j|dd	d
 t|d}t|| W d Q R X t| .}|j|dd	dd t|d}t|| W d Q R X t| .}|j|dd	dd t|d}t|| W d Q R X d S )Ng        g       @g      ?)Zcol1Zcol2abc)r7   acr:   r4   )r5   F)r5   ZdropnaT)	r   r`   ra   rA   r   to_hdfr   r   r   )r   Zdf_with_missingZdf_without_missingr   Zreloadedr   r   r    test_store_dropna'  s"    





r   c          	   C   s   t | }t d}|j|ddddid |  jddd}|j|dd	dd
 tt	|dt
||g |d j|ddddid |d j|dd	dd
 tt	|dt
|d |d g W d Q R X d S )NCZss3r4   r7   rY   )r5   Zmin_itemsizeZlonger)r   T)rj   r5   rL   Zss4)r   r   ZmakeMixedDataFrame	set_indexr   copyZreset_indexZassignr   r   r
   r   )r   r   r:   rq   r   r   r    test_to_hdf_with_min_itemsizeB  s    
r   r5   fixedr4   c          	   C   sZ   dg}t |t|d}t|2}|j|d| dd t|ddd}t|| W d Q R X d S )Nu   foo)r7   r4   surrogatepass)r5   rf   )rf   )r   r   r   r   r   r   r   )r5   r   dataZserr   r   r   r   r    test_to_hdf_errorsT  s    
r   c                s8  t | $ tdd  fdd}t }d|d< d|d<  jd	|ddgd
 |d	djdksft|d	djdkszt|d	djdkst jd|dgddgd |ddjdkst|ddjdkst|ddjdkstt d  d| d}t	j
t|d  d W d Q R X W d Q R X W d Q R X d S )NT)r[   c                s   t  | jj|S )N)r   rk   r4   cols)tcolumn)rB   r   r    colg  s    z$test_create_table_index.<locals>.colrF   stringrH   string2r'   )r6   r7   f2)r7   r6   Fz1cannot create table index on a Fixed format store)rr   )r   r   r   rs   rj   
is_indexedr   r   r9   rt   ru   	TypeErrorcreate_table_index)r   r   r:   rx   r   )rB   r    test_create_table_indexa  s&    
r   c                s   t | ҉ tdd  fdd}t }d|d< d|d<  jd	|dgd
 |d	djdks`t|d	djdksttd}tjt	|d |d	dj W d Q R X d}tjt	|d  j
d	dgd W d Q R X W d Q R X W d Q R X d S )NT)r[   c                s   t  | jj|S )N)r   rk   r4   r   )r   r   )rB   r   r    r     s    z:test_create_table_index_data_columns_argument.<locals>.colrF   r   rH   r   r'   )r6   r7   z('Cols' object has no attribute 'string2')rr   zcolumn string2 is not a data_column.
In order to read column string2 you must reload the dataframe 
into HDFStore and include string2 with the data_columns argument.)columns)r   r   r   rs   rj   r   r   rt   ru   r   r   )r   r   r:   rx   r   )rB   r    -test_create_table_index_data_columns_argument  s    
r   c          	   C   s   t jtdddtdgddgd}tddd	d
ddgi|d}t| D}|jd|dd |jddd}|jdgd d f }t	
|| W d Q R X d S )Nz
2000-01-01r   )periodsdateid)namesr   g?g333333?g?gffffff?g      ?)r7   r:   T)r6   zid == 1)r   r   )r   Zfrom_arraysr   ranger   r   rj   rw   ilocr   r   )r   idxr:   rB   actualr   r   r   r    test_mi_data_columns  s    
r   c          	   C   s   t  }d|d< d|d< |d dk|d< |d dk|d	< d
|d< d|d< d|d< td|d< td|d< tddddd|d< tddddd|d< tj|j|jdd dgf< | j	d
d}t
| $}|d| t |d| W d Q R X d S )NrF   rG   rH   rI   rJ   r   rK   rL   rM   TrN   r   rO   rP   rQ   rR   rS   rT   rU   i  rV   rW   rX   rY   )rZ   Z	df1_mixed)r   r   r	   rZ   r`   ra   rb   r7   rc   rd   r   rj   r   rw   )r   r:   rB   r   r   r    test_table_mixed_dtypes  s"    
r   c       	   	   C   s   d}dt  dddtdg}tjj||d}t  ddd	}t|d|d
}t|j|	td
 }t| J}|d| |d}t|| |d| |d}t|| W d Q R X d S )NzSun Mon Tue Wed Thuz
2012-05-01i  r   r   z
2014-05-01)holidaysZweekmaskr      )r   freqzMon Tue Wed Thu Fri Sat Sunr   r4   )rZ   r`   Z
datetime64re   offsetsZCustomBusinessDayr   r   weekdaymapsplitr   r9   rw   r   r   rj   )	r   Zweekmask_egyptr   Z
bday_egyptdtdtsrl   rB   r   r   r   r    test_calendar_roundtrip_issue  s     



r   c          
   C   s.  t | }t }t }||d< ||d< t|d t|dksFtt||d  t|d t|dkspttj	t
dd |d W d Q R X ||d< ||d< t|d	 t|d t|dkst||d< ||d< t|d t|dkst||d< ||d< |d= |d= t|dks tW d Q R X d S )
Nr   rD   r   r   z1'No object named a_nonexistent_store in the file')rr   Za_nonexistent_storezb/foorF   )r   r   r_   r   r   r   r   r   rt   ru   KeyErrorremove)r   rB   tsr:   r   r   r    test_remove  s6    




r   c          	   C   s   t | }ttjddtdddd}|jd|dd ||jtd	k }|	dd
}t
|| ddlm} |	dd
}t
|| |	dd}t
|| W d Q R X d S )N   rP   20130101)r   )r7   r:   r4   )r5   Z20130105z!index>datetime.datetime(2013,1,5)r   )rZ   zindex>datetime(2013,1,5))r   r   r`   randomrandnr   r9   r7   r	   rw   r   r   rZ   )r   rB   r:   r   r   rZ   r   r   r    test_same_name_scoping  s    
r   c          	   C   sD   t  }d|j_t| "}||d< |d }t || W d Q R X d S )NrF   frame)r   r   r7   namer   r   )r   r:   rB   reconsr   r   r    test_store_index_name"  s    
r   table_formatc          	   C   s   t ttdddtdddgdd}t ttdddtdddgdd}ttddd||d	}t	|X}|j
|d
| d t|d
}tj||dd t|jjtkstt|jjtkstW d Q R X d S )Ni  r   rP   u   colsג)r   i  u   rowsאr   )r   r7   r:   )r5   T)Zcheck_names)r   re   to_datetimerZ   r   r   r`   arangeZreshaper   r   r   r   r   r   r7   r   ri   r   r   )r   r   r   Zidx1r:   r   rq   r   r   r    test_store_index_name_numpy_str,  s      

r   c          	   C   sD   t  }|d }t| "}||d< |d }t || W d Q R X d S )NrJ   series)r   r   r   r   )r   r:   r   rB   r   r   r   r    test_store_series_nameD  s    
r   z6ignore:\nduplicate:pandas.io.pytables.DuplicateWarningc          	   C   sD   t | 2}t |d< t }||d< t|d | W d Q R X d S )Nr   )r   r   rs   r_   r   )r   rB   r   r   r   r    test_overwrite_nodeN  s
    
r   z9ignore:\nthe :pandas.io.pytables.AttributeConflictWarningc          
   C   sh  t  }t| }t|d |d| |d}|jtt	|j
k sRtt|d ttdtdd}|d| |ddg}|jtdk st|jd|d}|jddd d f }t || |dd	d
g}|jtdd k st|jd|d}|jddd d f }t || t|tsBtt|d t|d t  }t  jdjd}|jd|ddgd |d| |dddg}|d|}|d|}	t||	gdd}t||gdd}||jdk|jdk@  }t j||dd W d Q R X t| J}ttjddtdddd}|d| |dd}|t|jdk j
}
|j|
 }|jd|
d}t || |jd|
d}t || d}t j!t"|d" |jdtjt	|d d!d W d Q R X t j!t"|d" |jdtt	|d d W d Q R X t j!t"|d  |jdtt	|dd" W d Q R X t j!t"|d" |jdtt	|dd#d$ W d Q R X tdd%d}|jdd&d}||j
#| }t || ttjd#d}|d| |jddddgd}|jdddg }t || d'gd# }
d|
d(< |jd|
d}|j|
 }t || |jddd#d)}|dd# }t || W d Q R X d S )*Nr:   r   )rJ   rL   zindex<3rW   )r   r   rP   zindex>=3zindex<=4r   ro   rq   z{}_2)r   rJ   rL   )r6   zA>0zB>0r   )ZaxisF)Z
check_freqi  Z20000101)r   )r7   r7   zLwhere must be passed as a string, PyTablesExpr, or list-like of PyTablesExpr)rr   Zfloat64)r   )r   startrp   )r   r   stopi  zindex in selectionT)r   r   )$r   rs   r   r   rj   Zselect_as_coordinatesvaluesr`   r   r   r7   allr   r   r   rw   rb   r   
isinstancer   renamer5   r
   rJ   rL   r   r   r   Zselect_columnr   monthr   rt   ru   r   isin)r   r:   rB   rE   r   r   ro   rq   Z
df1_resultZ
df2_resultr   rx   Z	selectionr   r   r    test_coordinatesY  s    





&&$&

r   c          	   C   s   t | }ttjdtjdd}|d| |jddddd}|jddd	gf }t	|| |jddd
dd}t
|dkst|jd
dd	gf }t	|| W d Q R X d S )Nr   )rJ   rL   r:   zcolumns=['A']r   r   )r   r   r   rJ   r   (   )r   r   r`   r   randrj   rw   rb   r   r   r   r   )r   rB   r:   r   r   r   r   r    test_start_stop_table  s    
r   c          	   C   s|   t | j}tddgddgd}|jdgd d|dd |jddgdd	dd
}|jd	gddgf }t|| W d Q R X d S )Nr   rP   )rF   rH   rF   )selectorr   r   )r   r   r   )r   r   r   rH   )r   r   Zappend_to_multipleZselect_as_multiplerb   r   r   )r   rB   r:   r   r   r   r   r    test_start_stop_multiple  s    
r   c          	   C   s  t | l}ttjdtjddtdddd}|d| |jdddd	}|jddd d f }t	
|| |jddd
d	}|jdd
d d f }t	
|| |jdddd	}|jddd d f }t	
|| |j}|d| |jdddd	}|jdd }t	|| |jddd
d	}|jdd
 }t	|| t	 }tj|jddddf< tj|jdd
df< W d Q R X d S )Nr   )rJ   rL   r   )r   )r7   r:   r   r   )r   r   rp   r   r   rl   rW   r   r   r   )r   r   r`   r   r   r   r9   rw   r   r   r   rJ   r   r   ra   )r   rB   r:   r   r   rl   r   r   r    test_start_stop_fixed  s2    r   c          
   C   s   t tjdd}dd |jD |_dd |jD |_t| }|jd|dd d	}|d|g}t	
||jd d |jd d
 f  d}|d|g}t	
||jd d |jd d
d f  W d Q R X d S )N2   d   c             S   s   g | ]}|d qS )3dr   ).0rE   r   r   r    
<listcomp>  s    z-test_select_filter_corner.<locals>.<listcomp>c             S   s   g | ]}|d qS )r   r   )r   rE   r   r   r    r     s    r   r4   )r5   zcolumns=df.columns[:75]K   zcolumns=df.columns[:75:2]rP   )r   r`   r   r   r7   r   r   r9   rw   r   r   rb   )r   r:   rB   critr   r   r   r    test_select_filter_corner  s    
$r   c                s0   t   t  fdddd }t  | d S )Nc                s     | dS )Nr:   )r   )p)r:   r   r    r)   .  r*   z#test_path_pathlib.<locals>.<lambda>c             S   s
   t | dS )Nr:   )r   )r   r   r   r    r)   .  r*   )r   r   round_trip_pathlibr   )r   r   r   )r:   r    test_path_pathlib*  s    r   zstart, stop)r   rP   )r   rP   )NNc          	   C   sj   t tdddgtdddgd}t|6}|d| |jd| |d}t|| | | W d Q R X d S )	Ni2i2i2abcd)r   rD   Ztest_dataset)r   r   )r   r   r   rj   rw   r   r   )r   r   r   r:   rB   r   r   r   r     test_contiguous_mixed_data_table3  s    
r   c                s8   t    fdd}dd }t ||}t  | d S )Nc          	      s$   t | } |d W d Q R X d S )Nr:   )r   r   )r   rB   )r:   r   r    writerG  s    
z*test_path_pathlib_hdfstore.<locals>.writerc          	   S   s   t | }t|dS Q R X d S )Nr:   )r   r   )r   rB   r   r   r    readerK  s    
z*test_path_pathlib_hdfstore.<locals>.reader)r   r   r   r   )r   r  r  r   r   )r:   r    test_path_pathlib_hdfstoreD  s
    r  c                s0   t   t  fdddd }t  | d S )Nc                s     | dS )Nr:   )r   )r   )r:   r   r    r)   V  r*   z,test_pickle_path_localpath.<locals>.<lambda>c             S   s
   t | dS )Nr:   )r   )r   r   r   r    r)   V  r*   )r   r   r   r   )r   r   r   )r:   r    test_pickle_path_localpathS  s    r  c                s8   t    fdd}dd }t ||}t  | d S )Nc          	      s$   t | } |d W d Q R X d S )Nr:   )r   r   )r   rB   )r:   r   r    r  ^  s    
z,test_path_localpath_hdfstore.<locals>.writerc          	   S   s   t | }t|dS Q R X d S )Nr:   )r   r   )r   rB   r   r   r    r  b  s    
z,test_path_localpath_hdfstore.<locals>.reader)r   r   Zround_trip_localpathr   )r   r  r  r   r   )r:   r    test_path_localpath_hdfstore[  s
    r  c          
   C   sx   t ddd ddd}t }t >}t|}|jd|dgd |  ||d ||d	d
 W d Q R X W d Q R X d S )NT)r[   c             [   s"  zt | d}|d kr(dd l}| \}}|j|f||d|}|d krP| }t|t| kshtxj| D ]^}	||	jrr||	}
||	}|j	|
j	kst|rrx$|j
D ]}|jr|
|j jstqW qrW W d t| t| yt| W n ttfk
r   Y nX t| X d S )Nrr   )keyspropindexes)r   tempfilemkstempr   r  r   r   rk   Zis_tableZnrowsZaxesr   r   r   oscloseOSErrorr   r   )r'   new_fr  r  kwargsrB   r	  fdZtstorekZnew_tZorig_tr   r   r   r    do_copyn  s2    


ztest_copy.<locals>.do_copyr:   rJ   )r6   )r'   F)r'   r  )NNT)r   r   r   r   r   rj   r  )r   r  r:   r   str   r   r    	test_copyj  s    
'

r  c          
   C   s   t ddgddggd}t| v}d}tjt|d |j|ddd W d Q R X |j|dd	d t|d}t|| |	|st
|	|st
W d Q R X d S )
Nr   r   )r   r   z/Columns index has to be unique for fixed format)rr   r:   r   )r5   r4   )r   r   rt   ru   r   r   r   r   r   equalsr   )r   r:   r   rx   otherr   r   r    test_duplicate_column_name  s    

r  c          	   C   sT   t tjjdd}tddddd|_t| }||d< t|d | W d Q R X d S )	N)rp   r   )sizeZ0srp   Z1sZexample)r   r   r   r   r:   )	r   r`   r   normalr   r7   r   r   r   )r   r:   rB   r   r   r    !test_preserve_timedeltaindex_type  s
    
r  c          	   C   s   t tjddtdtdd}d|j_|jddd	}|jj|j	
  }t| F}|j|d
dd|dd td}t|}t|d
|d}||kstW d Q R X d S )Nr   r   abcdZABCDE)r7   r   lettersET)r  rj   r:   r   F)r3   rj   r6   r7   ZBCD)r   )r   r`   r   r   rA   r7   r   r   r   r   tolistr   r   r   r   )r   r:   r6   r   Z	cols2loadZcols2load_originalZ	df_loadedr   r   r     test_columns_multiindex_modified  s      
r  c             C   s<  t jt jt jt jt jg}t jt jt jg}x|D ]x}t	t
jdd|dd}t| L}tdd6 d}tjt|d |j|dd	dd
 W d Q R X W d Q R X W d Q R X q.W x|D ]}t	t
jdd|dd}t| X}tddB |j|dd	dd
 t|dd|jd  dd}t|s tW d Q R X W d Q R X qW d S )Nrp   rP   )r   T)r[   z-cannot have non-object label DataIndexableCol)rr   r:   r4   )r5   r6   z	index = [r   ])r   )r   ZmakeIntIndexZmakeFloatIndexZmakeDateIndexZmakeTimedeltaIndexZmakePeriodIndexZmakeStringIndexZmakeCategoricalIndexZmakeUnicodeIndexr   r`   r   r   r   r   rt   ru   r   r   r   r7   r   r   )r   Ztypes_should_failZtypes_should_runr7   r:   r   rx   r   r   r   r    $test_to_hdf_with_object_column_names  s,    

4

r!  )MrZ   r<   r  r>   warningsr   r   numpyr`   rt   Zpandasre   r   r   r   r   r   r	   r
   r   r   Zpandas._testingZ_testingr   Zpandas.tests.io.pytables.commonr   r   r   r   Z_default_compressormarkfilterwarningsZignore_natural_naming_warningZpandas.io.pytablesr   r   ZsingleZ
pytestmarkr!   r@   rC   rm   rn   ry   Z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    <module>   s~   ,,.-  )

q)	5