o
    pfu                  
   @   sx  d Z ddlmZmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ zddlmZ W n eyX Z zeZW Y dZ[ndZ[ww ddl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! 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/m0Z0m1Z1m2Z2 ddl3m4Z4 ej5rddlm6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlZddlDZDddl mEZE ddl'mFZF ddlGmHZH ddlImJZJ ejKdddZLdgZMed-ddZNed d! ZOd"d# ZPer!d$d% ZQd&d' ZRnd(d% ZQd)d' ZRG d*d+ d+ejSZTG d,d de!ZUdS ).z*Manage filesystems on remote FTP servers.
    )print_functionunicode_literalsN)OrderedDict)contextmanager)FTP)FTP_TLS)cast)
error_perm
error_temp)PY2
raise_from	text_type   )
_ftp_parse)errors)FS)DEFAULT_CHUNK_SIZE)ResourceTypeSeekInfo)line_iterator)Mode)abspathbasenamedirnamenormpathsplit)epoch_to_datetime)AnyBinaryIO
ByteString	ContainerContextManagerDictIterableIteratorListOptionalSupportsIntTextTupleUnion)_OpendirFactory)RawInfo)Permissions)SubFS_FFTPFS)boundc              
   c   s"   z| j  d V  W d    W d S 1 sw   Y  W d S  tjy.   tjd| jd ty>   tjd| jd tya } z|d urTtj	|d||dtj
d|dd }~w ty } z$t|\}}|dkrytj||d|dv rtjtt|d	tj|dd }~ww )
Nzunable to connect to {})msgzlost connection to {}zftp error on resource '{}' ({})zftp error ({})552)pathr4   )501550r6   )_locksocketerrorr   RemoteConnectionErrorformathostEOFErrorr
   ResourceErrorOperationFailedr	   _parse_ftp_errorInsufficientStorageResourceNotFoundr   strPermissionDenied)fsr6   r<   codemessage rK   A/home/ertert/spirit/venv/lib/python3.10/site-packages/fs/ftpfs.py
ftp_errorsH   s6   &
rM   c                 c   sP    z| V  W z|    W d S  ty   Y d S w z|    W w  ty'   Y w w N)quit	Exception)ftprK   rK   rL   
manage_ftpd   s   rR   c                 C   s   t | d\}}}||fS )z(Extract code and message from ftp error. )r   	partition)r<   rI   _rJ   rK   rK   rL   rC   p   s   rC   c                 C   s   t | tr
| |S | S rN   )
isinstancer   encodestencodingrK   rK   rL   _encodey   s   r[   c                 C   s   t | tr| |dS | S )NreplacerV   bytesdecoderX   rK   rK   rL   _decode}   s   r`   c                 C      | S rN   rK   rY   rU   rK   rK   rL   r[         c                 C   ra   rN   rK   rb   rK   rK   rL   r`      rc   c                       s   e Zd Z fddZdd Zedd Zedd Zd	d
 Z fddZ	dd Z
dd Zd'ddZdd Zd(ddZd'ddZdd Zdd Zdd  Zd(d!d"Zd#d$ Zejfd%d&Z  ZS ))FTPFilec                    sN   t t|   || _|| _t|| _d| _t	 | _
|  | _d | _d | _d S )Nr   )superrd   __init__rH   r6   r   modepos	threadingLockr:   	_open_ftprQ   
_read_conn_write_conn)selfftpfsr6   rg   	__class__rK   rL   rf      s   



zFTPFile.__init__c                 C   s   | j  }|td |S )z Open an ftp object for the file.zTYPE I)rH   rk   voidcmdrF   rn   rQ   rK   rK   rL   rk      s   
zFTPFile._open_ftpc                 C   s6   | j d u r| jtdt| j| jj | j| _ | j S )NRETR )rl   rQ   transfercmdrF   r[   r6   rZ   rh   rn   rK   rK   rL   	read_conn   s
   
zFTPFile.read_connc                 C   sf   | j d u r0| jjr| jtdt| j| jj | _ | j S | jtdt| j| jj | j	| _ | j S )NzAPPE STOR )
rm   rg   	appendingrQ   ru   rF   r[   r6   rZ   rh   rv   rK   rK   rL   
write_conn   s   
zFTPFile.write_connc                 C   s   d}| | jj| j| jS )Nz<ftpfile {!r} {!r} {!r}>)r>   rH   ftp_urlr6   rg   )rn   _reprrK   rK   rL   __repr__   s   zFTPFile.__repr__c              
      s   | j s[| jK z9| jd ur| j  d | _| j  | jd ur'| j  d | _z| j  W n	 ty7   Y nw W t	t
|   nt	t
|   w W d    d S 1 sTw   Y  d S d S rN   )closedr:   rm   closerQ   voidresprl   rO   r
   re   rd   rv   rp   rK   rL   r      s&   




""zFTPFile.closec                 C   s   | j S rN   )rh   rv   rK   rK   rL   tell   s   zFTPFile.tellc                 C      | j jS rN   )rg   readingrv   rK   rK   rL   readable      zFTPFile.readablec              	   C   s   | j jstdg }|}| j}| jA |rL|dk rt}ntt|}z||}W n
 tj	y2   Y nw |s6n|
| |  jt|7  _|t|8 }|sW d    n1 sVw   Y  d|S )NzFile not open for readingr       )rg   r   IOErrorrw   r:   r   minrecvr;   r<   appendrh   lenjoin)rn   sizechunks	remainingconn	read_sizechunkrK   rK   rL   read   s0   


zFTPFile.readc                 C   sL   |  t|}t|}t|tjrt|j||d |< |S ||d |< |S rN   )r   r   rV   arraytypecode)rn   bufferdata
bytes_readrK   rK   rL   readinto   s   zFTPFile.readintoNc                 C   s   t t| |S rN   )nextr   )rn   r   rK   rK   rL   readline   s   zFTPFile.readlinec                 C   sF   g }d}t | D ]}|| |t|7 }|dkr ||kr  |S q|S )Nr   r   )r   r   r   )rn   hintlinesr   linerK   rK   rL   	readlines   s   
 zFTPFile.readlinesc                 C   r   rN   )rg   writingrv   rK   rK   rL   writable
  r   zFTPFile.writablec                 C   s   | j jstdt|tjr| }| j= | j}d}t|}|rJt	|t
}|||||  }||7 }||8 }|  j|7  _|s!W d    |S W d    |S 1 sUw   Y  |S )NFile not open for writingr   )rg   r   r   rV   r   tobytesr:   rz   r   r   r   sendrh   )rn   r   r   data_posremaining_data
chunk_size	sent_sizerK   rK   rL   write  s,   


zFTPFile.writec                 C   sT   | j jstdt }|D ]}t|tjr||  q|| q| | d S )Nr   )	rg   r   r   	bytearrayrV   r   extendr   r   )rn   r   r   r   rK   rK   rL   
writelines$  s   zFTPFile.writelinesc              	   C   s   | j c |d u r|  }| j| j}||}W d    n1 s#w   Y  | j| jd}|| t||k rG|d|t|   W d    n1 sQw   Y  W d    |S W d    |S 1 siw   Y  |S )Nw    )r:   r   rH   openbinr6   r   r   r   )rn   r   fr   rK   rK   rL   truncate0  s&   

	
		zFTPFile.truncatec                 C   s   dS )NTrK   rv   rK   rK   rL   seekable>  rc   zFTPFile.seekablec                 C   s   t |}|tjtjtjfvrtd| j^ |tjkr|}n|tjkr)| j| }n|tjkr9| j	| j
}|| }td|| _| j  |  | _| jrT| j  d | _| jri| j  d | _W d    |  S W d    |  S 1 svw   Y  |  S )Nzinvalid value for whencer   )intr   setcurrentend
ValueErrorr:   rh   rH   getsizer6   maxrQ   rO   rk   rl   r   rm   r   )rn   rh   whence_whencenew_pos	file_sizerK   rK   rL   seekB  s6   








zFTPFile.seek)r   rN   )__name__
__module____qualname__rf   rk   propertyrw   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rK   rK   rp   rL   rd      s*    






rd   c                       s  e Zd ZdZdddddddZ							
	dW fdd	Zdd Zdd Zedd Z	edd Z
edd Zdd Zdd Zedd Zedd ZdXd d!Zd"d# Zed$d% Zd&d' Zed(d) Zed*d+ ZdYd,d-Zed.d/ Zed0d1 Zed2d3 ZejrdZd4d5ZdZd6d7Zd[d9d:Z fd;d<Z d=d> Z!	
	d\d?d@Z"d]dCdDZ#dEdF Z$dGdH Z%dZdIdJZ&	
	
d^dKdLZ'dZdMdNZ(dOdP Z)dQdR Z*dSdT Z+ fdUdVZ,  Z-S )_r2   a  A FTP (File Transport Protocol) Filesystem.

    Optionally, the connection can be made securely via TLS. This is known as
    FTPS, or FTP Secure. TLS will be enabled when using the ftps:// protocol,
    or when setting the `tls` argument to True in the constructor.

    Examples:
        Create with the constructor::

            >>> from fs.ftpfs import FTPFS
            >>> ftp_fs = FTPFS("demo.wftpserver.com")

        Or via an FS URL::

            >>> ftp_fs = fs.open_fs('ftp://test.rebex.net')

        Or via an FS URL, using TLS::

            >>> ftp_fs = fs.open_fs('ftps://demo.wftpserver.com')

        You can also use a non-anonymous username, and optionally a
        password, even within a FS URL::

            >>> ftp_fs = FTPFS("test.rebex.net", user="demo", passwd="password")
            >>> ftp_fs = fs.open_fs('ftp://demo:password@test.rebex.net')

        Connecting via a proxy is supported. If using a FS URL, the proxy
        URL will need to be added as a URL parameter::

            >>> ftp_fs = FTPFS("ftp.ebi.ac.uk", proxy="test.rebex.net")
            >>> ftp_fs = fs.open_fs('ftp://ftp.ebi.ac.uk/?proxy=test.rebex.net')

     TF)invalid_path_charsnetwork	read_onlythread_safeunicode_pathsvirtual	anonymous 
      Nc	           	         sz   t t|   || _|| _|| _|| _|| _|| _|| _	|| _
| j
r/tttr/ttdt d| _d| _d| _i | _dS )au  Create a new `FTPFS` instance.

        Arguments:
            host (str): A FTP host, e.g. ``'ftp.mirror.nl'``.
            user (str): A username (default is ``'anonymous'``).
            passwd (str): Password for the server, or `None` for anon.
            acct (str): FTP account.
            timeout (int): Timeout for contacting server (in seconds,
                defaults to 10).
            port (int): FTP port number (default 21).
            proxy (str, optional): An FTP proxy, or ``None`` (default)
                for no proxy.
            tls (bool): Attempt to use FTP over TLS (FTPS) (default: False)

        zFTP over TLS not supportedlatin-1N)re   r2   rf   _host_userpasswdaccttimeoutportproxytlsrV   r   rP   r   r   CreateFailedrZ   _ftp_welcome	_features)	rn   r?   userr   r   r   r   r   r   rp   rK   rL   rf     s   
zFTPFS.__init__c                 C   s   d | j| jS )NzFTPFS({!r}, port={!r}))r>   r?   r   rv   rK   rK   rL   r}     s   zFTPFS.__repr__c                 C   s$   | j dkrdnd}|j| j| j dS )Nr   z<ftpfs '{host}'>z<ftpfs '{host}:{port}'>)r?   r   )r   r>   r?   )rn   _fmtrK   rK   rL   __str__  s   zFTPFS.__str__c                 C   s    | j d u r| jS d| j| jS )Nz{}@{})r   r   r>   r   rv   rK   rK   rL   r     s   z
FTPFS.userc                 C   s   | j d u r| jS | j S rN   )r   r   rv   rK   rK   rL   r?     s   z
FTPFS.hostc                 C   sR   i }| dd dkr'| D ]}|dr&|dd d\}}}|||< q|S )z0Parse a dict of features from FTP feat response.-r   211rS   r   N)r   
splitlines
startswithrT   )clsfeat_responsefeaturesr   keyrU   valuerK   rK   rL   _parse_features  s   
zFTPFS._parse_featuresc              	   C   s  | j rt nt }|d t| b || j| j| j |	| j
| j| j z|  W n	 ty6   Y nw i | _z
t|dd}W n tyP   d| _Y nw | || _d| jv r^dnd| _tsm|jjd| jd|_W d   n1 sww   Y  | j|_|j| _|S )	zOpen a new ftp object.r   FEATr   UTF8utf-8r)rZ   N)r   r   r   set_debuglevelrM   connectr?   r   r   loginr   r   r   prot_pAttributeErrorr   r`   sendcmdr	   rZ   r   r   sockmakefilefilewelcomer   )rn   r   r   rK   rK   rL   rk     s6   


zFTPFS._open_ftpc                 C   s   |   }t|S rN   )rk   rR   rs   rK   rK   rL   _manage_ftp  s   zFTPFS._manage_ftpc                 C   sl   | j dkr	| j}nd| j| j }| jdks| jdu rd}nd| j| j}| jr+dnd}d	|||}|S )
z*Get the FTP url this filesystem will open.r   z{}:{}r   Nr   z{}:{}@ftpsrQ   z	{}://{}{})r   r?   r>   r   r   r   )rn   
_host_part
_user_partschemeurlrK   rK   rL   r{     s   
zFTPFS.ftp_urlc                 C   s   |   S )z'~ftplib.FTP: the underlying FTP client.)_get_ftprv   rK   rK   rL   rQ   
  s   z	FTPFS.ftpdownloadc                 C   s,   |  |}|dkrt||d| j|S )zGet FTP url for resource.r   z{}{})validatepathr   NoURLr>   r{   )rn   r6   purpose_pathrK   rK   rL   geturl  s   
zFTPFS.geturlc                 C   s   | j d u r
|  | _ | j S rN   )r   rk   rv   rK   rK   rL   r     s   

zFTPFS._get_ftpc                 C   s   |    | jS )z*`dict`: Features of the remote FTP server.)r   r   rv   rK   rK   rL   r     s   zFTPFS.featuresc                 C   s   t t|}g }t| |d | jtdt|| jj |j W d    n1 s*w   Y  dd |D }dd t	
|D }tdd |D }|S )Nr9   zLIST c                 S   s$   g | ]}t |tr|d n|qS )r   r]   ).0r   rK   rK   rL   
<listcomp>-  s    z#FTPFS._read_dir.<locals>.<listcomp>c                 S   s   g | ]}t |qS rK   r   )r  raw_inforK   rK   rL   r  0      c                 S   s   i | ]}|j |qS rK   namer  inforK   rK   rL   
<dictcomp>1  r  z#FTPFS._read_dir.<locals>.<dictcomp>)r   r   rM   rQ   	retrlinesrF   r[   rZ   r   	ftp_parseparser   )rn   r6   r  r   _listdir_listingrK   rK   rL   	_read_dir%  s   zFTPFS._read_dirc                 C   
   d| j v S )z/bool: whether the server supports MLST feature.MLSTr   rv   rK   rK   rL   supports_mlst4     
zFTPFS.supports_mlstc                 C   r  )z3bool: whether the server supports the MDTM feature.MDTMr  rv   rK   rK   rL   supports_mdtm:  r  zFTPFS.supports_mdtmc                 C   s   |  |}t| |- |s| |s/t }| jtdt|| jj	 | 	 W d    dS W d    dS 1 s:w   Y  dS )Nrx   TF)
r   rM   isfileioBytesIOrQ   
storbinaryrF   r[   rZ   )rn   r6   wiper  
empty_filerK   rK   rL   create@  s   

zFTPFS.createc           	      C   s   z2t |dd }t |dd }t |dd }t |dd }t |dd }t |dd }W n
 ty<   Y dS w t||||||f}|S )	z+Parse a time from an ftp directory listing.r            r         N)r   r   calendartimegm)	r   	time_texttm_yeartm_monthtm_daytm_hourtm_mintm_sec
epoch_timerK   rK   rL   _parse_ftp_timeL  s   zFTPFS._parse_ftp_timec                 C   st   d }i }| dD ]$}|d\}}}|r$|  }| }|||< q	t|d }q	|dvr6||fS d |fS )N;=/).z..)r   rT   striplowerr   rstrip)r   r   r
  factsfactr   sepr   rK   rK   rL   _parse_facts^  s   
zFTPFS._parse_factsc                 c   s    |D ]s}|  | \}}|d u rq|dd}|dvrq|dk}i }||d|d< ||d< dt|r6tjntji|d< |d }|d	|d
d}	d}
|	 rUt|	}
|
|d	< d|v rf| |d |d< d|v rs| |d |d< |V  qd S )Ntyper   >   dirr   r>  r
  is_dirbasicrQ   detailsr   sizd0r   modifymodifiedr!  created)	r<  r6  getr   r   	directoryr   isdigitr1  )r   r   r   r
  r9  _typer@  r  rB  size_strr   rK   rK   rL   _parse_mlsxm  s4   zFTPFS._parse_mlsxc                 C   s   d S rN   rK   )rn   r6   factoryrK   rK   rL   opendir  rc   zFTPFS.opendirc              	   C   sT  |  |}|pd}|dkrtddddttjidS | jrx| jN t| |d | j	t
d	t|| jj }W d    n1 sCw   Y  t|| jj d
d }| |D ]}t|  W  d    S W d    n1 ssw   Y  t| |d" t|\}}| |}	||	vrt||	| }
|
W  d    S 1 sw   Y  d S )NrK   r4  r   Tr?  r=  )rA  rB  r9   zMLST r   r   )r   r   r   r   rI  r  r:   rM   rQ   r   rF   r[   rZ   r`   r   rM  r   r  r   rE   )rn   r6   
namespacesr  responser   r  dir_name	file_namerI  r  rK   rK   rL   getinfo  s:   

	

$zFTPFS.getinfostandardc                 C   s>   i }|    |dkr| j }d| jv |d< d| jv |d< |S )NrU  r   r   r  supports_mtime)r   _metacopyr   )rn   	namespacerW  rK   rK   rL   getmeta  s   
zFTPFS.getmetac              	      s   | j rT| |}| jA t| |d+ dt|| jj }| j|}| |	 d }t
|W  d    W  d    S 1 s@w   Y  W d    n1 sOw   Y  tt| |S )Nr9   zMDTM r   )r  r   r:   rM   r[   rQ   rZ   r   r1  r   r   re   r2   getmodified)rn   r6   r  cmdrQ  mtimerp   rK   rL   r[    s   
zFTPFS.getmodifiedc                 C   sJ   |  |}| j dd | |D }W d    |S 1 sw   Y  |S )Nc                 S   s   g | ]}|j qS rK   r	  r  rK   rK   rL   r    s    z!FTPFS.listdir.<locals>.<listcomp>)r   r:   scandir)rn   r6   r  dir_listrK   rK   rL   listdir  s   

zFTPFS.listdirc                 C   s   |  |}t| |dc |dkr#|r| |W  d    S t||r*| |sgz| jt|| jj	 W n/ t
yf } z#t|\}}|dkr]| |rSt|| |r]t|t|d }~ww W d    n1 sqw   Y  | |S )Nr9   r4  r8   )r   rM   rO  r   DirectoryExistsisdirrQ   mkdr[   rZ   r	   rC   existsrE   )rn   r6   permissionsrecreater  r<   rI   rU   rK   rK   rL   makedir  s.   







zFTPFS.makedirr   r   c           	   	   K   s   t |}|  | |}| jJ z| |}W n! tjy9   |jr(t||jr7| 	t
|s7t|Y nw |jrBt||jrJt|t| || }W d    |S 1 s]w   Y  |S rN   )r   validate_binr   r:   rT  r   rE   r   r   rb  r   r@  FileExpected	exclusive
FileExistsrd   to_platform_bin)	rn   r6   rg   	bufferingoptions_moder  r  ftp_filerK   rK   rL   r     s,   





zFTPFS.openbinc              	   C   s   |    | |}| j< | |rtj|dt| | | jt	|| jj
 W d    n1 s3w   Y  W d    d S W d    d S 1 sKw   Y  d S )Nr9   )checkr   r:   rb  r   ri  rM   rQ   deleter[   rZ   )rn   r6   r  rK   rK   rL   remove  s   

"zFTPFS.removec                 C   s   |  |}|dkrt t| |B z| jt|| jj W n+ tyK } zt	|\}}|dkrF| 
|r<t|| |sFt| d }~ww W d    d S 1 sWw   Y  d S )Nr4  r8   )r   r   RemoveRootErrorrM   rQ   rmdr[   rZ   r	   rC   r  DirectoryExpectedisemptyDirectoryNotEmpty)rn   r6   r  r<   rI   rU   rK   rK   rL   	removedir  s$   




"zFTPFS.removedirc              
   #   s    |}jt jrhg  t|d3 zjtdt|jj  fdd W n t	y@   
|js?t| w W d    n1 sKw   Y   rh D ]}t|V  qW	 W d    d S | D ]}|V  qoW d    d S 1 sw   Y  d S )Nr9   zMLSD c                    s     t| jjS rN   )r   r`   rQ   rZ   )lr   rn   rK   rL   <lambda>(  r  z FTPFS._scandir.<locals>.<lambda>)r   r:   r  rM   rQ   r  rF   r[   rZ   r	   rT  r@  r   rv  rM  r   r  values)rn   r6   rP  r  r  r  rK   r{  rL   _scandir  s6   


"zFTPFS._scandirc                 C   sL   | j s| |jst|| j||d}|d ur$|\}}t|||}|S )N)rP  )r  rT  r@  r   rv  r~  	itertoolsislice)rn   r6   rP  page	iter_infostartr   rK   rK   rL   r^  5  s   
zFTPFS.scandirc              	   K   s   |  |}| j6 t| | | jtdt|| jj | W d    n1 s)w   Y  W d    d S W d    d S 1 sAw   Y  d S )Nrx   )r   r:   rM   rQ   r  rF   r[   rZ   )rn   r6   r   r   rn  r  rK   rK   rL   uploadD  s   
"zFTPFS.uploadc                 C   s(   t |ts	td| |t| d S )Nzcontents must be bytes)rV   r^   	TypeErrorr  r  r  )rn   r6   contentsrK   rK   rL   
writebytesM  s   
zFTPFS.writebytesc              	   C   s   d}d| j v r)d }d|v r|d }nd|v r|d }|r)d|v r)d}tt|d }|rqt| |7 dtj|d d t|| jj	 }z| j
| W n	 tyV   Y n	w W d    d S W d    d S 1 sjw   Y  d S | |s{t|d S )	NFMFMTrF  rB  TzMFMT z%Y%m%d%H%M%SrS   )r   r   floatrM   datetimeutcfromtimestampstrftimer[   rQ   rZ   r   r	   rd  r   rE   )rn   r6   r  use_mfmtinfo_detailsr]  r\  rK   rK   rL   setinfoS  s@   


"

zFTPFS.setinfoc           	      C   s   |  |}t }t| |P |  <}z|tdt|| jj	 |j
 W n! tyG } zt|\}}|dkrB| |rBt| d }~ww W d    n1 sRw   Y  W d    n1 saw   Y  | }|S )Nrt   r8   )r   r  r  rM   r   
retrbinaryrF   r[   rQ   rZ   r   r	   rC   rb  r   ri  getvalue)	rn   r6   r  r   rQ   r<   rI   rU   
data_bytesrK   rK   rL   	readbytesp  s,   



zFTPFS.readbytesc                    sB   |   sz| j  W n	 ty   Y nw d | _tt|   d S rN   )isclosedrQ   rO   rP   r   re   r2   r   rv   rp   rK   rL   r     s   zFTPFS.close)r   r   r   r   r   NF)r   )FrN   )rU  )NF)r   r   )NN).r   r   r   __doc__rW  rf   r}   r   r   r   r?   classmethodr   rk   r   r{   rQ   r  r   r   r  r  r  r!  r1  r<  rM  typingTYPE_CHECKINGrO  rT  rZ  r[  r`  rg  r   rs  ry  r~  r^  r  r  r  r  r   r   rK   rK   rp   rL   r2   ]  s    #-























	rN   )Vr  
__future__r   r   r  r   r'  r  r  r  r;   ri   collectionsr   
contextlibr   ftplibr   r   ImportErrorerrr   r	   r
   sixr   r   r   r   r   r  r   baser   	constantsr   enumsr   r   r  r   iotoolsr   rg   r   r6   r   r   r   r   r   timer   r  r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   mmapr-   r.   re  r/   subfsr0   TypeVarr1   __all__rM   rR   rC   r[   r`   	RawIOBaserd   r2   rK   rK   rK   rL   <module>   sn    @

 R