U
    ÎZjV  ã                   @   sê  d Z ddlZddlZddlmZ ddlmZmZmZ ddl	Z	ddl
Z
ddlmZ ddlZddlZddlmZ ddlm  mZ ddlZddlmZ ddlm  mZ G dd„ dƒZeeegZzdd	l m!Z" e #e"¡ W n e$k
rê   Y nX e
j% &e
j% 'e(¡¡Z)ej* +d
¡G dd„ dƒƒZ,ej-dd„ ƒZ.G dd„ dƒZ/dd„ Z0ej* 1dddg¡ej* 1dddg¡dd„ ƒƒZ2dd„ Z3ej* 1deddfedd fg¡d!d"„ ƒZ4ej* 1d#dd$d%g¡ej* 1dddg¡d&d'„ ƒƒZ5d(d)„ Z6d*d+„ Z7d,d-„ Z8d.d/„ Z9dS )0z0
Tests for the pandas.io.common functionalities
é    N)Úpartial)ÚBytesIOÚStringIOÚUnsupportedOperation)ÚPath)Úis_platform_windowsc                   @   s&   e Zd ZdZddœdd„Zdd„ ZdS )ÚCustomFSPathz%For testing fspath on unknown objectsN)Úreturnc                 C   s
   || _ d S ©N©Úpath)Úselfr   © r   ú^/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/pandas/tests/io/test_common.pyÚ__init__   s    zCustomFSPath.__init__c                 C   s   | j S r
   r   ©r   r   r   r   Ú
__fspath__"   s    zCustomFSPath.__fspath__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   )Úlocalz*ignore:can't resolve package:ImportWarningc                   @   sV  e Zd ZdZdd„ Zdd„ Zdd„ Ze d¡d	d
„ ƒZ	dd„ Z
dd„ Zej de¡dd„ ƒZej deeeg¡dd„ ƒZdd„ Zdd„ Zejddd�dd„ ƒZdd„ Zej dejd ed!fejd ed"fejd#ed$fejded%fej d&ed'fej!d ed(fej"d ed)fej#d ed*fej$d ed+fg	¡d,d-„ ƒZ%ej d.ej&j'd ed!fej&j(d ed/fej&j)d#ed$fej&j*ded%fej&j+ded0fej&j,d ed(fej&j-d ed*fej&j.d ed+fg¡d1d2„ ƒZ/ej dejd ed!fej0d ed!fejd ed"fejd#ed$fejded%fej d&ed'fej!d ed(fej"d ed)fej#d ed*fej$d ed+fg
¡d3d4„ ƒZ1ej d5ejd d6fej0d d6fejd d7fejd#d8fejdd9fej d&d:fej!d d;fej"d d<fej#d d=fej$d d>fg
¡ej 2d?¡ej 2d@¡dAdB„ ƒƒƒZ3ej 2dC¡ej dDdEi d fdFdGdHidHfdIi dfdJi d fdKi d fdLi d fdMi d fdNdOe 4dP¡id fg¡dQdR„ ƒƒZ5ej 2d@¡dSdT„ ƒZ6dUS )VÚTestCommonIOCapabilitiesziindex,A,B,C,D
foo,2,3,4,5
bar,7,8,9,10
baz,12,13,14,15
qux,12,13,14,15
foo2,12,13,14,15
bar2,12,13,14,15
c                 C   sB   d}t  |¡}||kst‚tj |¡s*t‚tj |¡|ks>t‚d S )Nz
~/sometest)ÚicomÚ_expand_userÚAssertionErrorÚosr   ÚisabsÚ
expanduser©r   ÚfilenameZexpanded_namer   r   r   Útest_expand_user?   s
    
z)TestCommonIOCapabilities.test_expand_userc                 C   s2   d}t  |¡}||kst‚tj |¡|ks.t‚d S )Nz/somefolder/sometest)r   r   r   r   r   r   r   r   r   r   Útest_expand_user_normal_pathG   s    
z5TestCommonIOCapabilities.test_expand_user_normal_pathc                 C   sB   t  tdƒ¡}|dkst‚t  tdƒ¡}|tj dd¡ks>t‚d S )NÚ.zfoo//barÚfooÚbar)r   Ústringify_pathr   r   r   r   Újoin)r   Úrel_pathZredundant_pathr   r   r   Útest_stringify_path_pathlibN   s    z4TestCommonIOCapabilities.test_stringify_path_pathlibzpy.pathc                 C   s8   t j dd¡}t j |¡}t|ƒ}t |¡|ks4t‚d S )Nr$   r%   )r   r   r'   ÚabspathÚ	LocalPathr   r&   r   )r   r   Úabs_pathZlpathr   r   r   Útest_stringify_path_localpathT   s    z6TestCommonIOCapabilities.test_stringify_path_localpathc                 C   s"   t dƒ}t |¡}|dkst‚d S )Núfoo/bar.csv)r   r   r&   r   )r   ÚpÚresultr   r   r   Útest_stringify_path_fspath[   s    
z3TestCommonIOCapabilities.test_stringify_path_fspathc              
   C   sT   t  d¡}t ¡ �8}|jd|› �dd��}|t |¡ks<t‚W 5 Q R X W 5 Q R X d S )NÚfsspeczfile://Úwb©Úmode)ÚpytestÚimportorskipÚtmÚensure_cleanÚopenr   r&   r   )r   r2   r   Z
fsspec_objr   r   r   Ú!test_stringify_file_and_path_like`   s    

z:TestCommonIOCapabilities.test_stringify_file_and_path_likeÚ	path_typec                 C   s2   |\}}|d| ƒ}t j|dd�}||ks.t‚d S )Nr.   Zinfer)Úcompression)r   Zinfer_compressionr   )r   Zcompression_formatr<   Ú	extensionÚexpectedr   r=   r   r   r   Ú test_infer_compression_from_pathg   s    z9TestCommonIOCapabilities.test_infer_compression_from_pathc              
   C   sz   t jt ¡ d��`}|dt|ƒj d ƒ}t |d¡�2}t|jjƒ ¡ sJt	‚t
j |¡|jjksbt	‚W 5 Q R X W 5 Q R X d S )N)Údirz~/z	/sometestÚw)ÚtempfileÚTemporaryDirectoryr   ÚhomeÚnamer   Ú
get_handleÚhandleÚis_absoluter   r   r   r   )r   r<   Útmpr    Úhandlesr   r   r   Útest_get_handle_with_pathn   s
    z2TestCommonIOCapabilities.test_get_handle_with_pathc              	   C   sB   t ƒ }t |d¡�}|j|ks"t‚W 5 Q R X |jr6t‚| ¡  d S )NÚr)r   r   rG   rH   r   ÚclosedÚclose)r   Zinput_bufferrK   r   r   r   Útest_get_handle_with_bufferw   s
    
z4TestCommonIOCapabilities.test_get_handle_with_bufferc              	   C   s”   d}t jt|ƒddd��r}d}d}|j |¡}t|ƒ|ks>t‚t|ƒ|k rjt|j ¡ ƒdks`t‚||7 }qt||7 }q"|| d¡ks†t‚W 5 Q R X d S )	Nõ&   a,b,c
1,2,3
Â©,Â®,Â®
Look,a snake,ðŸ��ÚrbF©Úis_textó    é   r   úutf-8)r   rG   r   rH   ÚreadÚlenr   Úencode)r   ÚdatarK   r0   Ú	chunksizeÚchunkr   r   r   Ú)test_bytesiowrapper_returns_correct_bytes   s    
zBTestCommonIOCapabilities.test_bytesiowrapper_returns_correct_bytesÚpyarrowz0.15.0)Úmin_versionc              	   C   s‚   ddl m} d}t dddgddd	gd
ddgdœ¡}t|ƒ}tj|ddd��,}| |j¡ 	¡ }t
 ||¡ |jrtt‚W 5 Q R X d S )Nr   )ÚcsvrQ   Ú1õ   Â©ZLookÚ2õ   Â®za snakeÚ3u   ðŸ��©ÚaÚbÚcrR   FrS   )r_   ra   ÚpdÚ	DataFramer   r   rG   Úread_csvrH   Z	to_pandasr8   Úassert_frame_equalrN   r   )r   ra   r[   r?   ÚsrK   Údfr   r   r   Útest_get_handle_pyarrow_compat–   s    ÿz7TestCommonIOCapabilities.test_get_handle_pyarrow_compatc              	   C   s¦   t jt| jƒdd��}t j|dd�}W 5 Q R X t  t| jƒ¡}t ||¡ t jt| jƒdd��>}t|ƒ}t ||jdg ¡ t t  |¡|jdd … ¡ W 5 Q R X d S )Né   )r\   T)Zignore_indexr   )	rk   rm   r   Údata1Úconcatr8   rn   ÚnextZiloc)r   Úreaderr0   r?   ÚitÚfirstr   r   r   Útest_iterator¨   s    z&TestCommonIOCapabilities.test_iteratorz#reader, module, error_class, fn_extr   ra   ÚtxtZxlrdZxlsxÚfeatherÚtablesZh5ZdtaZsas7bdatÚjsonÚpicklec                 C   sÊ   t  |¡ tj tdd| ¡}d|› d�}d|› d�}d}d}	d	|› d
|› d�}
d|› d�}d|› d�}d|› �}t j|d|› d|› d|› d|	› d|
› d|› d|› d|› d�d�� ||ƒ W 5 Q R X d S )Nr[   údoes_not_exist.úFile (b')?.+does_not_exist\.ú'? does not existú:\[Errno 2\] No such file or directory: '.+does_not_exist\.ú'zExpected object or valueú7path_or_buf needs to be a string file path or file-likeú#\[Errno 2\] File .+does_not_exist\.ú$ does not exist: '.+does_not_exist\.õ<   \[Errno 2\] æ²¡æœ‰é‚£ä¸ªæ–‡ä»¶æˆ–ç›®å½•: '.+does_not_exist\.ú?\[Errno 2\] File o directory non esistente: '.+does_not_exist\.ú+Failed to open local file.+does_not_exist\.ú(ú|ú)©Úmatch)r6   r7   r   r   r'   ÚHEREÚraises)r   rv   ÚmoduleÚerror_classÚfn_extr   Úmsg1Úmsg2Úmsg3Úmsg4Úmsg5Úmsg6Úmsg7Úmsg8r   r   r   Útest_read_non_existent´   s"    
ÿ
ÿ
4þz/TestCommonIOCapabilities.test_read_non_existentz#method, module, error_class, fn_extÚhtmlZparquetc              	   C   sl   t  |¡ t dddgdddgdddgdœ¡}tj tddd	| ¡}t j|d
d�� |||ƒ W 5 Q R X d S )Nrr   é   é   é   rV   rg   r[   Zmissing_folderr   z@Cannot save file into a non-existent directory: .*missing_folderr�   )	r6   r7   rk   rl   r   r   r'   r�   r�   )r   Úmethodr‘   r’   r“   Zdummy_framer   r   r   r   Ú#test_write_missing_parent_directoryÚ   s    
$þz<TestCommonIOCapabilities.test_write_missing_parent_directoryc                 C   sÚ   t  |¡ tj dd| ¡}| tddd„ ¡ d|› d�}d|› d	�}d
}	d}
d|› d|› d	�}d|› d	�}d|› d	�}d|› �}t j|d|› d|› d|	› d|
› d|› d|› d|› d|› d�d�� ||ƒ W 5 Q R X d S )Nú~r   r   c                 S   s   t j d| ¡S )Nr$   )r   r   r'   )Úxr   r   r   Ú<lambda>
  rU   zJTestCommonIOCapabilities.test_read_expands_user_home_dir.<locals>.<lambda>r€   r�   r‚   rƒ   z0Unexpected character found when decoding 'false'r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   )r6   r7   r   r   r'   Úsetattrr   r�   )r   rv   r‘   r’   r“   Zmonkeypatchr   r”   r•   r–   r—   r˜   r™   rš   r›   r   r   r   Útest_read_expands_user_home_dirõ   s$    
ÿ
ÿ
4þz8TestCommonIOCapabilities.test_read_expands_user_home_dirzreader, module, path)Úior[   ra   ziris.csv)r¨   r[   Zfixed_widthzfixed_width_format.txt)r¨   r[   Úexcelz
test1.xlsx)r¨   r[   r{   zfeather-0_3_1.feather)r¨   r[   Z
legacy_hdfzdatetimetz_object.h5)r¨   r[   Ústatazstata10_115.dta)r¨   Úsasr[   ztest1.sas7bdat)r¨   r}   r[   ztsframe_v012.json)r¨   r[   r~   zcategorical.0.25.0.picklez8ignore:CategoricalBlock is deprecated:DeprecationWarningz;ignore:`np.object` is a deprecated alias:DeprecationWarningc                 C   sR   t  |¡ ||Ž }t|ƒ}||ƒ}||ƒ}| d¡rBt ||¡ nt ||¡ d S )Nz.pickle)r6   r7   r   Úendswithr8   Zassert_categorical_equalrn   )r   rv   r‘   r   ÚdatapathÚmypathr0   r?   r   r   r   Útest_read_fspath_all   s    &

z-TestCommonIOCapabilities.test_read_fspath_allz.ignore:In future versions `DataFrame.to_latex`z"writer_name, writer_kwargs, moduleÚto_csvÚto_excelÚengineZxlwtÚ
to_featherÚto_htmlÚto_jsonZto_latexÚ	to_pickleÚto_stataZ
time_stampz2019-01-01 00:00c                 C   sÆ   t  d¡}t  d¡}t dddgi¡}|�’}|�‚}t |¡ t|ƒ}	t||ƒ}
|
|f|Ž t|dƒ�}| 	¡ }W 5 Q R X |
|	f|Ž t|dƒ�}| 	¡ }W 5 Q R X ||ks®t
‚W 5 Q R X W 5 Q R X d S )NÚstringÚfspathÚArr   rž   rR   )r8   r9   rk   rl   r6   r7   r   Úgetattrr:   rX   r   )r   Zwriter_nameZwriter_kwargsr‘   Úp1Úp2rp   r¸   r¹   r®   ÚwriterÚfr?   r0   r   r   r   Útest_write_fspath_allS  s    



z.TestCommonIOCapabilities.test_write_fspath_allc           	   
   C   s    t  d¡ t dddgi¡}t d¡}t d¡}|�V}|�F}t|ƒ}|j|dd� |j|dd� tj|dd�}tj|dd�}W 5 Q R X W 5 Q R X t 	||¡ d S )	Nr|   rº   rr   rž   r¸   r¹   r%   )Úkey)
r6   r7   rk   rl   r8   r9   r   Zto_hdfÚread_hdfrn   )	r   rp   r¼   r½   r¸   r¹   r®   r0   r?   r   r   r   Útest_write_fspath_hdf5u  s    


"z/TestCommonIOCapabilities.test_write_fspath_hdf5N)7r   r   r   rs   r!   r"   r)   ÚtdZ
skip_if_nor-   r1   r;   r6   ÚmarkÚparametrizeÚ
path_typesr@   Ústrr   r   rL   rP   r^   rq   ry   rk   rm   ÚFileNotFoundErrorZread_fwfZ
read_excelZread_featherÚOSErrorrÂ   Z
read_stataZread_sasÚ	read_jsonZread_picklerœ   rl   r°   r´   r±   r³   Z
to_parquetr·   rµ   r¶   r¢   Z
read_tabler§   Úfilterwarningsr¯   Úto_datetimerÀ   rÃ   r   r   r   r   r   4   sÜ   	



÷þ
øþ
öþ


ý
ýý


ýêþÿÿ
øþÿr   c                 C   s   | ddddƒS )Nr¨   r[   ra   ztest_mmap.csvr   )r­   r   r   r   Ú	mmap_file�  s    rÎ   c                   @   sX   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zej 	d	d
dg¡ej 	dddg¡dd„ ƒƒZ
dS )ÚTestMMapWrapperc              	   C   s”   t dƒ}dd„ |_tƒ r"d}t}n
d}tj}tj||d�� t 	|d¡ W 5 Q R X t
|ƒ�}W 5 Q R X d}tjt|d�� t 	|d¡ W 5 Q R X d S )	NzI am not a filec                   S   s   dS )Néÿÿÿÿr   r   r   r   r   r¥   •  rU   z;TestMMapWrapper.test_constructor_bad_file.<locals>.<lambda>zThe parameter is incorrectz
[Errno 22]r�   TzI/O operation on closed file)r   Úfilenor   rÊ   ÚmmapÚerrorr6   r�   r   Z_maybe_memory_mapr:   Ú
ValueError)r   rÎ   Znon_fileÚmsgÚerrÚtargetr   r   r   Útest_constructor_bad_file“  s    


z)TestMMapWrapper.test_constructor_bad_filec                 C   s    t |ƒ�Ž}| ¡ }tj|dddd��h}|j}t|jjtjƒs@t‚|D ] }t	|ƒ}| 
¡ | 
¡ ksDt‚qDtjtdd�� t	|ƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )NrM   T)rT   Ú
memory_mapz^$r�   )r:   Ú	readlinesr   rG   rH   Ú
isinstanceÚbufferrÒ   r   ru   Ústripr6   r�   ÚStopIteration)r   rÎ   r×   ÚlinesZwrappersÚwrapperÚlineÚ	next_liner   r   r   Ú	test_next©  s     
   ÿzTestMMapWrapper.test_nextc              
   C   sR   t  ¡ �@}t  ¡ }| |¡ tjtdd�� tj|dd� W 5 Q R X W 5 Q R X d S )NzUnknown enginer�   Zpyt)r²   )	r8   r9   ÚmakeDataFramer°   r6   r�   rÔ   rk   rm   ©r   r   rp   r   r   r   Útest_unknown_engineº  s
    

z#TestMMapWrapper.test_unknown_enginec              	   C   sD   t  ¡ �2}t  ¡ }|j|dd� t  |tj|dd�¡ W 5 Q R X dS )z\
        'encoding' shouldn't be passed to 'open' in binary mode.

        GH 35058
        zw+br4   r   ©Z	index_colN)r8   r9   rä   r°   rn   rk   rm   rå   r   r   r   Útest_binary_modeÁ  s    
z TestMMapWrapper.test_binary_modeÚencodingzutf-16zutf-32Úcompression_Úbz2Úxzc              
   C   st   t  ¡ }t  ¡ �Z}t  t¡� |j|||d� W 5 Q R X d}tjt|d�� t	j
|||d� W 5 Q R X W 5 Q R X dS )zš
        bz2 and xz do not write the byte order mark (BOM) for utf-16/32.

        https://stackoverflow.com/questions/55171439

        GH 35681
        )r=   ré   z&UTF-\d+ stream does not start with BOMr�   N)r8   rä   r9   Zassert_produces_warningÚUnicodeWarningr°   r6   r�   ÚUnicodeErrorrk   rm   )r   ré   rê   rp   r   rÕ   r   r   r   Útest_warning_missing_utf_bomÌ  s    

z,TestMMapWrapper.test_warning_missing_utf_bomN)r   r   r   rØ   rã   ræ   rè   r6   rÅ   rÆ   rï   r   r   r   r   rÏ   ’  s   rÏ   c                   C   s‚   t  d¡st‚t  d¡st‚t  d¡r*t‚t  d¡r8t‚t  d¡rFt‚t  d¡rTt‚t  d¡rbt‚t  d¡rpt‚t  d	¡s~t‚d S )
Nzgcs://pandas/somethingelse.comzgs://pandas/somethingelse.comzhttp://pandas/somethingelse.comzrandom:pandas/somethingelse.comz/local/pathzrelative/local/pathzthis is not fsspec://urlz({'url': 'gs://pandas/somethingelse.com'}z#RFC-3986+compliant.spec://something)r   Zis_fsspec_urlr   r   r   r   r   Útest_is_fsspec_urlá  s    rð   ré   rW   Úformatra   r}   c              
   C   sš   t  ¡ }t  ¡ �t}tj|d| d��}t|d|› �ƒ|ƒ W 5 Q R X tj|d| d��(}|dkrltj|dd�}n
t |¡}W 5 Q R X W 5 Q R X t  	||¡ d S )NrB   )r5   ré   Zto_rM   ra   r   rç   )
r8   rä   r9   Úcodecsr:   r»   rk   rm   rË   rn   )ré   rñ   r?   r   rH   rp   r   r   r   Útest_codecs_encodingð  s    
ró   c                  C   s¤   t  ¡ } t  ¡ �~}t|dƒ�*}t d¡|ƒ�}|  |¡ W 5 Q R X W 5 Q R X t|dƒ�.}t d¡|ƒ�}tj	|dd�}W 5 Q R X W 5 Q R X W 5 Q R X t  
| |¡ d S )Nr3   rW   rR   r   rç   )r8   rä   r9   r:   rò   Ú	getwriterr°   Ú	getreaderrk   rm   rn   )r?   r   rH   Úencodedrp   r   r   r   Útest_codecs_get_writer_reader   s    
,r÷   zio_class,mode,msgÚtz*a bytes-like object is required, not 'str'ri   z%string argument expected, got 'bytes'c              
   C   sL   t  ¡ }| ƒ �4}tjt|d�� |j|d|› �d� W 5 Q R X W 5 Q R X d S )Nr�   rB   r4   )r8   rä   r6   r�   Ú	TypeErrorr°   )Zio_classr5   rÕ   r?   rÜ   r   r   r   Útest_explicit_encoding  s    rú   Úencoding_errorsÚstrictÚreplacec              
   C   s  d}d}|dkr<d| d |d  d | }t tjdd�}n.d	|d  d
 | d | d }t tjdd�}t ¡ �†}t|ƒ}| |¡ | dkr¶tj	t
|d�� ||| d� W 5 Q R X n>||| d�}|j| d�}	tj|	|	gi|	d gd�}
t ||
¡ W 5 Q R X d S )Nz'utf-8' codec can't decode byteó   ära   ó   ,ó   
rž   r   rç   s   {"s   ": {"s   ":"s   "}}Úindex)Zorientrý   r�   )rû   ©Úerrors)r  )r   rk   rm   rË   r8   r9   r   Úwrite_bytesr6   r�   ÚUnicodeDecodeErrorÚdecoderl   rn   )rû   rñ   rÕ   Zbad_encodingÚcontentrv   r   Úfilerp   Údecodedr?   r   r   r   Útest_encoding_errors  s<    ÿþýüûúÿ	

r
  c               
   C   sB   t  ¡ �0} tjtdd�� tj| ddd� W 5 Q R X W 5 Q R X d S )Nzunknown error handler namer�   rB   Úbadr  )r8   r9   r6   r�   ÚLookupErrorr   rG   r   r   r   r   Útest_bad_encdoing_errorsA  s    
r  c               	   C   s8   t jtdd�� } t d¡ | jtjks*t‚W 5 Q R X d S )Nz\[Errno 2\]r�   Zdoesnt_exist)r6   r�   rÉ   rk   rm   ÚerrnoÚENOENTr   )rÖ   r   r   r   Útest_errno_attributeH  s    
r  c               
   C   s@   t jtdd��( tƒ �} tj| ddd� W 5 Q R X W 5 Q R X d S )NrÑ   r�   rR   T)rÙ   )r6   r�   r   r   r   rG   )rÜ   r   r   r   Útest_fail_mmapO  s    r  c                  C   sd   G dd„ dƒ} t jtdd��> tƒ �,}t |d¡�}|j | ƒ ¡ W 5 Q R X W 5 Q R X W 5 Q R X d S )Nc                   @   s   e Zd Zdd„ ZdS )z&test_close_on_error.<locals>.TestErrorc                 S   s   t dƒ‚d S )NÚtest)rÊ   r   r   r   r   rO   X  s    z,test_close_on_error.<locals>.TestError.closeN)r   r   r   rO   r   r   r   r   Ú	TestErrorW  s   r  r  r�   rR   )r6   r�   rÊ   r   r   rG   Zcreated_handlesÚappend)r  rÜ   rK   r   r   r   Útest_close_on_errorU  s
    r  ):r   rò   r  Ú	functoolsr   r¨   r   r   r   rÒ   r   Úpathlibr   rC   r6   Zpandas.compatr   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsrÄ   Zpandasrk   Zpandas._testingZ_testingr8   Zpandas.io.commonÚcommonr   r   rÈ   rÇ   Zpy.pathr   r+   r  ÚImportErrorr   r*   ÚdirnameÚ__file__r�   rÅ   rÌ   r   ZfixturerÎ   rÏ   rð   rÆ   ró   r÷   rú   r
  r  r  r  r  r   r   r   r   Ú<module>   s`   

  Z
Oþþ

!