U
    -e                     @   s  d 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
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 dd	l	mZmZ dd
lmZ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&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/m0Z0 ddl1m2Z2 ddl/m3Z3 zddl4Z5ddl4m6Z6m7Z7 W n" e8k
r~   d Z5 Z7Z6Y nX e39e:Z;ej<Z=dd Z>e#e?e@f e?dddZAdd ZBe@e@ee@e@f dddZCdd ZDed d! ZEedfe?d#d$d%ZFd&d' ZGd(d) ZHd*d+ ZId,d- ZJG d.d/ d/eKZLG d0d1 d1eMZNd2d3 ZOdgeegef eePePePePee? e?eeQ ePee@ ed5d6d7ZRG d8d9 d9ZSdhd;d<ZTe@e!e@ee@ f d=d>d?ZUe@e!e@e@e@e@f d@dAdBZVG dCdD dDe&jWZWdEdF ZXedGdH ZYdIdJ ZZdKdL Z[e0j\e,]dMk r(e[edNdO Z^n:e0j\j_ddP e,]dMj_e,]dQj_fkrbe[edRdS Z`e0j\e,]dTk re[edUdV Zanje0j\j_ddP e,]dTj_kre[edWdV Zan:e0j\j_ddP e,]dMj_e,]dQj_fkre[edXdV ZadYdZ Zbe"d[Zcejded\eec f eKe?d]d^d_Zee#ejfjge'jfjgf e e? d`dadbZhe#ejfjge'jfjgf ed\eec f eeK eec dcdddeZidS )iz)Some python utils function and classes.

    N)contextmanager)fieldsis_dataclass)BytesIO)Manager)Empty)
disk_usage)CodeTypeFunctionType)
AnyCallableDictIterableListOptionalSetTupleTypeVarUnion)urlparse)version)tqdm   )config)parallel_map   )logging)FinalLiteralc                 C   s^   | sdS dddddg}t | } |D ],\}}| | }|dkr"|dd	|   S q"t|  d
S )a6  Returns a human readable size string.

    If size_in_bytes is None, then returns "Unknown size".

    For example `size_str(1.5 * datasets.units.GiB) == "1.50 GiB"`.

    Args:
        size_in_bytes: `int` or `None`, the size, in bytes, that we want to
            format as a human-readable size string.
    zUnknown size)PiB           )TiB        )GiB   @)MiB   )KiB   g      ?z.2f z bytes)floatint)Zsize_in_bytesZ
_NAME_LISTnameZ
size_bytesvalue r.   X/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/datasets/utils/py_utils.pysize_strE   s    r0   )sizereturnc                 C   s  t | tr| S |  dr0t| dd d S |  drRt| dd d S |  drtt| dd d S |  d	rt| dd d
 S |  drt| dd d S |  drt| dd d }| dr|d S |S |  dr,t| dd d }| dr(|d S |S |  drht| dd d }| drd|d S |S |  drt| dd d }| dr|d S |S |  drt| dd d }| dr|d S |S td|  ddS )a)  
    Converts a size expressed as a string with digits an unit (like `"50MB"`) to an integer (in bytes).

    Args:
        size (`int` or `str`): The size to convert. Will be directly returned if an `int`.

    Example:

    ```py
    >>> convert_file_size_to_int("1MiB")
    1048576
    ```
    ZPIBNr    ZTIBr"   ZGIBr$   ZMIBr&   ZKIBr(   PBl     I5 b   TBl    J)GBi ʚ;MBi@B ZKBi  z`size=zM` is not in a valid format. Use an integer followed by the unit, e.g., '5GB'.)
isinstancer+   upperendswith
ValueError)r1   Zint_sizer.   r.   r/   convert_file_size_to_int]   s8    
r?   c                 C   sb   |  dd dd dd dd d	d
 dd dd dd dd ddd
 ddS )N\z\\.z\.*z.*+z\+z///(z\()z\)|z\|^z\^$z\$?)replacerstrip)patternr.   r.   r/   glob_pattern_to_regex   sD            	 
 rN   )stringrM   r2   c                 C   s`   t dd|}t || }|dkr6td|  d| t| }t d|}tt||}|S )a  Un-format a string using a python f-string pattern.
    From https://stackoverflow.com/a/36838374

    Example::

        >>> p = 'hello, my name is {name} and I am a {age} year old {what}'
        >>> s = p.format(name='cody', age=18, what='quarterback')
        >>> s
        'hello, my name is cody and I am a 18 year old quarterback'
        >>> string_to_dict(s, p)
        {'age': '18', 'name': 'cody', 'what': 'quarterback'}

    Args:
        string (str): input string
        pattern (str): pattern formatted like a python f-string

    Returns:
        Dict[str, str]: dictionary of variable -> value, retrieved from the input using the pattern

    Raises:
        ValueError: if the string doesn't match the pattern
    z{(.+?)}z(?P<_\1>.+)NzString z doesn't match the pattern )	resubsearchr>   listgroupsfindalldictzip)rO   rM   regexresultvalueskeys_dictr.   r.   r/   string_to_dict   s    r]   c                    s>   dd  fdd t | ts6| s6t|  d | S )zbConvert an object to its dictionary representation recursively.

    <Added version="2.4.0"/>
    c                 S   s   t | ot| t S N)r   r;   typeobjr.   r.   r/   _is_dataclass_instance   s    z&asdict.<locals>._is_dataclass_instancec                    s   | rVi }t | D ]<} t| |j}|jrF||jksF|jddr|||j< q|S t| trt	| drt
|  fdd| D  S t| ttfrt
|  fdd| D S t| tṙ fdd	|  D S t| S d S )
NZ$include_in_asdict_even_if_is_defaultF_fieldsc                    s   g | ]} |qS r.   r.   .0v_asdict_innerr.   r/   
<listcomp>   s     z1asdict.<locals>._asdict_inner.<locals>.<listcomp>c                 3   s   | ]} |V  qd S r^   r.   rd   rg   r.   r/   	<genexpr>   s     z0asdict.<locals>._asdict_inner.<locals>.<genexpr>c                    s   i | ]\}} | |qS r.   r.   re   krf   rg   r.   r/   
<dictcomp>   s      z1asdict.<locals>._asdict_inner.<locals>.<dictcomp>)r   getattrr,   initdefaultmetadatagetr;   tuplehasattrr_   rS   rV   itemscopydeepcopy)ra   rY   fr-   rh   rb   r.   r/   rh      s    
zasdict.<locals>._asdict_innerz is not a dict or a dataclass)r;   rV   	TypeErrorr`   r.   ry   r/   asdict   s
    r{   c              
   c   s6   t | |d}t| || z
dV  W 5 t| || X dS )z%Temporarily assign obj.attr to value.N)rn   setattr)ra   attrr-   originalr.   r.   r/   temporary_assignment   s
    
r   F)seedc              	   c   sd  t j }t j|  |r^tjr^ddl}|j }|j|  |j	
 r^|j	 }|j	|  |rtjrddl}ddlm} |j }	|jj| }
|j|
 | std| }|j}t|d}|r|j}||  z
dV  W 5 t j| |r&tjr&|j| |j	
 r&|j	| |r^tjr^|j|	 ||_|rT||_n
t|d X dS )zUTemporarily set the random seed. This works for python numpy, pytorch and tensorflow.r   N)contextzBSetting random seed for TensorFlow is only available in eager mode_rng)nprandomZ	get_stater   r   ZTORCH_AVAILABLEtorchZget_rng_stateZmanual_seedcudaZis_availableZget_rng_state_allZmanual_seed_allZTF_AVAILABLEZ
tensorflowZtensorflow.pythonr   Zget_global_generator	GeneratorZ	from_seedZset_global_generatorZexecuting_eagerlyr>   Z_seedrt   r   Z_set_global_seedZ	set_stateZset_rng_stateZset_rng_state_alldelattr)r   Zset_pytorchZset_tensorflowZnp_stater   Ztorch_stateZtorch_cuda_statestfZtfpycontextZtf_stateZtemp_genZ
tf_contextZtf_seedZtf_rng_initializedZtf_rngr.   r.   r/   	temp_seed   sH    









r   c                 c   s,   t  }| D ]}||kr
|| |V  q
dS )z=Iterate over iterable and return only unique values in order.N)setadd)rZ   seenr-   r.   r.   r/   unique_values%  s
    
r   c                    s    fdd}|S )z4If the value is None, return None, else call `func`.c                    s   | d k	r | S d S r^   r.   )r-   funcr.   r/   wrapper1  s    z'no_op_if_value_is_null.<locals>.wrapperr.   )r   r   r.   r   r/   no_op_if_value_is_null.  s    r   c                 C   s*   t | D ]\}}|dk	r||f  S qdS )zwReturn the index and the value of the first non-null value in the iterable. If all values are None, return -1 as index.N)N)	enumerate)iterableir-   r.   r.   r/   first_non_null_value7  s    r   c                  '   s4   t tj|  D ]   t fdd| D fV  qdS )z9Iterate over items of dictionaries grouped by their keys.c                 3   s   | ]}|  V  qd S r^   r.   )re   dkeyr.   r/   rj   C  s     zzip_dict.<locals>.<genexpr>N)r   	itertoolschainrs   )Zdictsr.   r   r/   zip_dict?  s    r   c                       s8   e Zd ZdZ fddZ fddZ fddZ  ZS )NonMutableDictzDict where keys can only be added but not modified.

    Will raise an error if the user try to overwrite one key. The error message
    can be customized during construction. It will be formatted using {key} for
    the overwritten key.
    c                    s,   | dd| _|rtdt j|| d S )N	error_msgz$Try to overwrite existing key: {key}z1NonMutableDict cannot be initialized with kwargs.)pop
_error_msgr>   super__init__)selfargskwargs	__class__r.   r/   r   N  s    zNonMutableDict.__init__c                    s(   || krt | jj|dt ||S )Nr   )r>   r   formatr   __setitem__)r   r   r-   r   r.   r/   r   W  s    zNonMutableDict.__setitem__c                    s@   t  fdd|D r4t jjt t|@ dt |S )Nc                 3   s   | ]}| kV  qd S r^   r.   )re   rl   r   r.   r/   rj   ]  s     z(NonMutableDict.update.<locals>.<genexpr>r   )anyr>   r   r   r   r   update)r   otherr   r   r/   r   \  s    zNonMutableDict.update)__name__
__module____qualname____doc__r   r   r   __classcell__r.   r.   r   r/   r   F  s   	r   c                   @   s   e Zd ZdZdddZdS )classpropertyz5Descriptor to be used as decorator for @classmethods.Nc                 C   s   | j d | S r^   )fget__get__)r   ra   objtyper.   r.   r/   r   e  s    zclassproperty.__get__)N)r   r   r   r   r   r.   r.   r.   r/   r   b  s   r   c           	   
      sn  | \ }}}}t |ts,t |s, |S |dk	rJt tjk rJt  |dk	rx|sxtdd tjD rxt	dddd t |tr|
 n|}|dk	r|dk	r|d ndd t| n|}tj|||d	|d
}t |tr fdd|D W  5 Q R  S  fdd|D }t |tr*|W  5 Q R  S t |trJt|W  5 Q R  S t|W  5 Q R  S W 5 Q R X dS )zEApply a function recursively to each element of a nested data struct.Nc                 s   s   | ]}d |j kV  qdS )notebookNr   )re   Ztqdm_clsr.   r.   r/   rj   v  s     z%_single_map_nested.<locals>.<genexpr>r)    T)endflush#ra   )disablepositionunitdescc              
      s&   i | ]\}}|t  |d dd fqS NT_single_map_nestedrk   functiontypesr.   r/   rm   ~  s      z&_single_map_nested.<locals>.<dictcomp>c              	      s    g | ]}t  |d dd fqS r   r   rd   r   r.   r/   ri     s     z&_single_map_nested.<locals>.<listcomp>)r;   rV   r   Zget_verbosityWARNINGZset_verbosity_warningr   r   __mro__printru   strrS   rs   r   array)	r   data_structZrankdisable_tqdmr   Zpbar_iterableZ	pbar_descZpbarmappedr.   r   r/   r   i  s$     ,
 r   T)r   r   	dict_onlymap_list	map_tuple	map_numpynum_procparallel_min_lengthr   r   r   r2   c              	      sZ  dkrDg |s<|r t |r, t |r< tj tt|ts`t|s` |S |	plt  }	t|trt|	 n|}|dkrd}|dkr|dkst
||k r҇ fddtj||	|
dD }n8t * tjddtd	 t |||	|
t}W 5 Q R X t|tr(tt| |S t|tr8|S t|trLt|S t|S dS )
a  Apply a function recursively to each element of a nested data struct.

    Use multiprocessing if num_proc > 1 and the length of data_struct is greater than or equal to
    `parallel_min_length`.

    <Changed version="2.5.0">

    Before version 2.5.0, multiprocessing was not used if `num_proc` was greater than or equal to ``len(iterable)``.

    Now, if `num_proc` is greater than or equal to ``len(iterable)``, `num_proc` is set to ``len(iterable)`` and
    multiprocessing is used.

    </Changed>

    Args:
        function (`Callable`): Function to be applied to `data_struct`.
        data_struct (`Any`): Data structure to apply `function` to.
        dict_only (`bool`, default `False`): Whether only apply `function` recursively to `dict` values in
            `data_struct`.
        map_list (`bool`, default `True`): Whether also apply `function` recursively to `list` elements (besides `dict`
            values).
        map_tuple (`bool`, default `False`): Whether also apply `function` recursively to `tuple` elements (besides
            `dict` values).
        map_numpy (`bool, default `False`): Whether also apply `function` recursively to `numpy.array` elements (besides
            `dict` values).
        num_proc (`int`, *optional*): Number of processes.
        parallel_min_length (`int`, default `2`): Minimum length of `data_struct` required for parallel
            processing.
            <Added version="2.5.0"/>
        types (`tuple`, *optional*): Additional types (besides `dict` values) to apply `function` recursively to their
            elements.
        disable_tqdm (`bool`, default `True`): Whether to disable the tqdm progressbar.
        desc (`str`, *optional*): Prefix for the tqdm progressbar.

    Returns:
        `Any`
    Nr   r   c              	      s    g | ]}t  |d dd fqS r   r   )re   ra   r   r.   r/   ri     s   zmap_nested.<locals>.<listcomp>)r   r   ignorezL.* is experimental and might be subject to breaking changes in the future\.$)messagecategory)appendrS   rs   r   Zndarrayr;   rV   r   Zis_progress_bar_enabledrZ   lenr   warningscatch_warningsfilterwarningsUserWarningr   r   rW   r[   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r   r/   
map_nested  sD    2


r   c                   @   s    e Zd ZdddZdddZdS )NestedDataStructureNc                 C   s   |d k	r|ng | _ d S r^   )datar   r   r.   r.   r/   r     s    zNestedDataStructure.__init__c                    sX   |d k	r|n j }t|tr. t| S t|ttfrN fdd|D S |gS d S )Nc                    s    g | ]}  |D ]}|qqS r.   )flatten)re   itemZ	flattenedr   r.   r/   ri     s       z/NestedDataStructure.flatten.<locals>.<listcomp>)r   r;   rV   r   rS   rZ   rs   r   r.   r   r/   r     s    
zNestedDataStructure.flatten)N)N)r   r   r   r   r   r.   r.   r.   r/   r     s   
r   rA   c                 C   s6   zt tj|j}W n tk
r,   Y dS X | |k S r   )r   ospathabspathfreeOSError)Zneeded_bytes	directoryZ
free_bytesr.   r.   r/   has_sufficient_disk_space  s
    r   )url_pathr2   c                 C   s   t | }d}|jdkr|jdkrd| krP| dsBtd|  d| dd} n`|jd	d }d
|krp|d
n|df\}}|d\}}d| d| d| d} | d| }| |fS )zMConvert a link to a file on a github repo in a link to the raw github object.N)httphttpsZs3z
github.comZblobz.pyzExternal import from github at z) should point to a file ending with '.py'rawr   z/tree/ZmasterrD   zhttps://github.com/z	/archive/z.zip-)r   schemenetlocr=   r>   rK   r   split)r   parsedsub_directoryZgithub_pathZ	repo_infobranchZ
repo_owner	repo_namer.   r.   r/   _convert_github_url  s    
r   )	file_pathr2   c           	   	      s  g }t | dd}||  W 5 Q R X td|  d g }d}|D ]8}td|}t|dkrl| }|rrqHtjd|tj	d	  d
krtjd|tj	d	  d
krqH 
dr4t fdd|D rqH 
dr 
d}t|\}}|d 
d||f n* 
dr|d 
d 
dd
f qH 
drd 
d}|d 
d|d
f qH|d 
d 
dd
f qH|S )a  Find whether we should import or clone additional files for a given processing script.
        And list the import.

    We allow:
    - library dependencies,
    - local dependencies and
    - external dependencies whose url is specified with a comment starting from "# From:' followed by the raw url to a file, an archive or a github repository.
        external dependencies will be downloaded (and extracted if needed in the dataset folder).
        We also add an `__init__.py` to each sub-folder of a downloaded folder so the user can import from them in the script.

    Note that only direct import in the dataset processing script will be handled
    We don't recursively explore the additional import to download further files.

    Example::

        import tensorflow
        import .c4_utils
        import .clicr.dataset-code.build_json_dataset  # From: https://raw.githubusercontent.com/clips/clicr/master/dataset-code/build_json_dataset
    zutf-8)encodingz	Checking z for additional imports.Fz[\s\S]*?"""[\s\S]*?r   z=^import\s+(\.?)([^\s\.]+)[^#\r\n]*(?:#\s+From:\s+)?([^\r\n]*))flagsNzQ^from\s+(\.?)([^\s\.]+)(?:[^\s]*)\s+import\s+[^#\r\n]*(?:#\s+From:\s+)?([^\r\n]*)c                 3   s    | ]}|d    dkV  qdS )r   r   N)group)re   impmatchr.   r/   rj   D  s     zget_imports.<locals>.<genexpr>   Zexternalr   ZinternalZlibrary)openextend	readlinesloggerdebugrP   rU   r   r   	MULTILINEr   r   r   r   )	r   linesrx   ZimportsZis_in_docstringlineZdocstr_start_matchr   r   r.   r   r/   get_imports  sF    

 
 r	  c                   @   s6   e Zd ZdZejejj	 ZdddZ
dd ZdS )	PicklerzHSame Pickler as the one from dill, but improved for notebooks and shellsTc                    s  t |}|tjkrtjtdk r.dd  n0tjjd d tdjtdjfkr^dd  |j|j	fdkrz"dd l
t| fd	d
}W n tk
r   Y nX n|j|j	fdkrz"dd lt| fdd}W n tk
r   Y nX n|j|j	fdkr@z"dd lt| fdd}W n tk
r<   Y nX n^|jdrtdd |jD rz"dd lt| fdd}W n tk
r   Y nX tjj| ||d d S )N0.3.6c                 S   s   t jj| d S r^   )dill_dillloginfopicklermsgr.   r.   r/   dill_loge  s    zPickler.save.<locals>.dill_logr   0.3.7c                 S   s   t jj| | d S r^   )r  r  r  tracer  r.   r.   r/   r  j  s    )_regexPatternr   c                    s<    | d|  |j |jf}| jj||d  | d d S )NzRe: r`   z# Re)rM   r   save_reducecompiler  ra   r   )r  rX   r.   r/   _save_regexq  s    
z!Pickler.save.<locals>._save_regex)r   ZTensorc                    sL   fdd} | d|  |    f}| j|||d  | d d S )Nc                    s
     | S r^   )Z
from_numpy)Znp_array)r   r.   r/   _create_tensor  s    z:Pickler.save.<locals>._save_tensor.<locals>._create_tensorzTo: r`   z# To)detachcpunumpyr  )r  ra   r  r   )r  r   r.   r/   _save_tensor  s    
z"Pickler.save.<locals>._save_tensor)ztiktoken.coreEncodingc                    sD    | d|  |j |j|j|jf}| jj||d  | d d S )NzEnc: r`   z# Enc)r,   Z_pat_strZ_mergeable_ranksZ_special_tokensr  r!  r  )r  tiktokenr.   r/   _save_encoding  s
    
z$Pickler.save.<locals>._save_encodingz
spacy.langc                 s   s   | ]}|j |jfd kV  qdS ))zspacy.languageZLanguageN)r   r   )re   clsr.   r.   r/   rj     s    zPickler.save.<locals>.<genexpr>c                    sH   fdd} | d|  |j | f}| j|||d  | d d S )Nc                    s(    j | d d }|| }||S )Nnlplang)utilZget_lang_classfrom_config
from_bytes)r   
bytes_dataZlang_clsr%  )spacyr.   r/   _create_lang  s    
z6Pickler.save.<locals>._save_lang.<locals>._create_langzSp: r`   z# Sp)r   to_bytesr  )r  ra   r,  r   )r  r+  r.   r/   
_save_lang  s    
z Pickler.save.<locals>._save_lang)save_persistent_id)r_   r
  dispatchr   DILL_VERSIONr   parsereleaser   r   rX   pklregisterImportErrorr   r"  
startswithr   r   r+  r  save)r   ra   r/  obj_typer  r   r#  r.  r.   )r  rX   r+  r"  r   r/   r7  _  sJ    
(

zPickler.savec                 C   s   t |tkrtj| | d S r^   )r_   r   r  r
  memoize)r   ra   r.   r.   r/   r9    s    zPickler.memoizeN)T)r   r   r   r   r  r  ZMetaCatchingDictr
  r0  rv   r7  r9  r.   r.   r.   r/   r
  Z  s   
Wr
  c                 C   s   t |dd|  dS )zpickle an object to a fileT)recurseN)r
  dumpra   filer.   r.   r/   r;    s    r;  c              	   c   sx   zXddd t | jD krPt| drPt| jtrPt| di  d V  W 5 Q R X nd V  W n tk
rr   d V  Y nX d S )NZPreTrainedTokenizerBasec                 S   s   g | ]
}|j qS r.   r   )re   Z
base_classr.   r.   r/   ri     s     z$_no_cache_fields.<locals>.<listcomp>cache)r_   r   rt   r;   r>  rV   r   r5  r`   r.   r.   r/   _no_cache_fields  s    

r?  c              	   C   s,   t  }t|  t| | W 5 Q R X | S )zpickle an object to a string)StringIOr?  r;  getvaluer<  r.   r.   r/   dumps  s    
rB  c                    s    fdd}|S )Nc                    s   | t j < | S r^   )r
  r0  r   tr.   r/   proxy  s    
zpklregister.<locals>.proxyr.   )rD  rE  r.   rC  r/   r4    s    r4  r  c                 C   s`  t jjd|  |jds\t|jtj	j
dkrR|jtj	j
d ds\|jdkr`dntj	|j}d}t jjrt|dr|j|j|j|j|j|j|j|j|j|j||j||j|j|jf}n<|j|j|j|j|j|j|j|j|j||j||j|j|jf}n8|j|j|j|j|j|j|j|j||j||j|j|jf}| jt||d	 t jjd
 dS )z
        From dill._dill.save_code
        This is a modified version that removes the origin (filename + line no.)
        of functions created in notebooks or shells for example.
        zCo: <r   r5   
ipykernel_<lambda>r   co_posonlyargcountr`   # CoN)r  r  r  r  co_filenamer6  r   r   r   r   sepco_namebasenamePY3rt   co_argcountrI  co_kwonlyargcount
co_nlocalsco_stacksizeco_flagsco_code	co_constsco_namesco_varnames	co_lnotabco_freevarsco_cellvarsr  r	   r  ra   rK  co_firstlinenor   r.   r.   r/   
_save_code  s    



r^  r   r  c                 C   s0  t jj| d| |jdsZt|jtj	j
dkrP|jtj	j
d dsZ|jdkr^dntj	|j}d}t|dr|j|j|j|j|j|j|j|j|j|j|j||j|j||j|j|j|j|j|jf}n6t|d	r,|j|j|j|j|j|j|j|j|j|j|j||j|j||j|j|j|jf}nt|d
r~|j|j|j|j|j|j|j|j|j|j|j||j||j|j|jf}nt|dr|j|j|j|j|j|j|j|j|j|j||j||j|j|jf}n<|j|j|j|j|j|j|j|j|j||j||j|j|jf}| j t jj!||d t jj| d d S )NzCo: %srF  r   r5   rG  rH  r   co_endlinetableco_exceptiontableco_linetablerI  r`   rJ  )"r  r  r  r  rK  r6  r   r   r   r   rL  rM  rN  rt   rY  rP  rI  rQ  rR  rS  rT  rU  rV  rW  rX  Zco_qualnamera  r_  Zco_columntabler`  rZ  r[  r  Z_create_coder\  r.   r.   r/   	save_codeF  s    


rb  z0.3.5c           
   	   C   sn  t j|s t jjd|  t| ddrjt jj}||ddd}t|t jj	kr~t jj
rb|jn|j}nt jj
rx|jn|j}tt| }t| dd}t| dd}t|t jj	ko|dk	}tt jj	|ft jj	t|< t jj
rPdt|jd	d
ko|dk	}|r
d| _|rd| _t|dd}| jt jj|j||j|j|j|j|f|d nldt|jd	d
kox|dk	oxt| dd}|rd| _|rd| _| jt jj|j||j|j|j|jf|d |r|| _|r|| _t jjr|s|s|s|s|s|s|r|   t jjd nJt jjd|  t|dt|dd}	t jj j!| ||	d t jjd dS )z
        From dill._dill.save_function
        This is a modified version that make globs deterministic since the order of
        the keys in the output dictionary of globalvars can change.
        zF1: _recurseFTr:  builtin_byrefNr   rW  r.   __kwdefaults__r`   # F1zF2: r   r   r,   # F2)"r  r  _locate_functionr  r  rn   detect
globalvarsidstackrO  __globals__func_globalsrV   sortedru   r   __code__rf  rc  r  _create_functionr   __defaults____closure____dict__	func_code	func_namefunc_defaultsfunc_closureZOLDER
clear_memoStockPicklersave_global)
r  ra   rm  globsrf  rc  Z_memoZ_superZfkwdefaultsr,   r.   r.   r/   save_function  s    

r  c              	   C   s6  t j|| st jjd|  t| dd }t| dd }t| dd }t| dt jj}g }|rddlm} ||ddd	}d
|j	i}	ntt jj
r|jn|j}|r||jkrt| d|j}|}	n>|d k	r|j	d k	rtt j|j	ddd |kr|}	n
d
|j	i}	|	|k}
tt|	 }	|
r|	}n|d k	r6tt| }|d k	r|	|k	rt jj
rhdd | D }ndd | D }|D ]0}||kr~|| t jj|	|ff  qƐq~|t jj|	|ff t jj
r|j}i }dD ]$}t||d }|d k	r|||< q|j|jkr|j|d< d
|	ks6|j	|	d
 kr@|j	|d< |j}t|tk	r`||d< d }|rn||f}t jj| t jj|j|	|j|j|f|f||d n|j}|jd k	r|t |d|jff d
|	ks|j	|	d
 kr|t |d|j	ff |jr|t |d|jff t jj| t jj|j!|	|j"|j#|ff||d |rt$t%| d }|r|r|D ]p}t |d|ff}z|&| W n t'k
r   Y qhY nX | j(|  t jj
r| )t*dd n
| )d qht jjd nHt jjd|  t|dt|d
d }t jj+j,| ||d t jjd d S )NF1: %src  	_postproc_main_modified_original_mainr   rm  Trd  r   _mainrw  c                 S   s   h | ]}t |qS r.   rn  re   gr.   r.   r/   	<setcomp>a  s      save_function.<locals>.<setcomp>c                 S   s   h | ]}t |qS r.   r  r  r.   r.   r/   r  c  s     r   rg  __annotations__r   r   ra   postproc_listr   cell_contents0UTF-8rh  F2: %sri  rj  )-r  r  rk  r  r  rn   __builtin__dill.detectrm  r   rO  rp  rq  rw  _import_modulerV   rr  ru   rZ   
itervaluesr   	_setitemsrv  r   r   r_   _save_with_postprocrt  rs  ru  r{  r   r|   rx  ry  rz  nextiterremover>   r  writebytesr}  r~  )r  ra   rc  r  r  r  r  rm  
globs_copyr  globs_is_globs_copyglob_idsstack_elementclosure
state_dict	fattrnamefattrstatetopmost_postproccellpossible_postprocr,   r.   r.   r/   r  &  s    











c              	   C   s  t j|| st|jtk	rt|dd }|d kr<t jjj}t jj	|dd}d}z,t j
||j\}}t|dd |krzd}W n tk
r   Y nX |rt jj| d| | jt|df|d t jj| d d S t jj| d	| t| d
d }t| dd }t| dd }	t| dt jj}
g }|rFddlm} ||ddd}d|ji}np|j}|	rr||
jkrrt| d|
j}|}nD|d k	r|jd k	rtt j	|jddd |kr|}n
d|ji}||k}tt| }|r|}n|d k	rtt| }|d k	rf||k	rfdd | D }|D ]0}||kr|| t jj||ff  qfq|t jj||ff |j}i }dD ]$}t||d }|d k	rt|||< qt|j|jkr|j|d< d|ks|j|d kr|j|d< |j}t|tk	r||d< d }|r||f}t jj| t jj|j||j|j|f|f||d |rtt | d }|r|r|D ]Z}t!|d|ff}z|"| W n t#k
r   Y qZY nX | j|  | $t%dd qZt jj| d nJt jj| d| t|dt|dd }t jj&j'| ||d t jj| d d S ) Nr   T)safeF__func__zF3: %sr`   z# F3r  rc  r  r  r  r   r  rd  r   r  rw  c                 S   s   h | ]}t |qS r.   r  r  r.   r.   r/   r    s     r  r  r   r  r  r  r  rh  r  ri  rj  )(r  r  rk  r_   rs  r	   rn   r  r   r  _getattributer   AttributeErrorr  r  r  r  rm  r   rp  rw  rV   rr  ru   rZ   r   r  rv  r  rt  ru  r  r  r|   r  r>   r  r  r}  r~  )r  ra   module_namemoduleZ_pypy_builtinfound_rc  r  r  r  r  rm  r  r  r  r  r  r  r  r  r  r  r  r  r  r,   r.   r.   r/   r    s    








c                 C   s(   t | j| j| j| j| j}| j|_|S r^   )r   r
   rs  rp  r   ru  rv  rg  )r   rY   r.   r.   r/   copyfunc@  s    r  Y.)queuer   r   r2   c                 C   s&   t |f |D ]\}}| | q|S r^   )r   put)r  r   r   r   rY   r.   r.   r/   _write_generator_to_queueI  s    r  )poolr2   c                 C   s   dd | j D S )Nc                 S   s   h | ]
}|j qS r.   )pid)re   rx   r.   r.   r/   r  P  s     z _get_pool_pid.<locals>.<setcomp>)_pool)r  r.   r.   r/   _get_pool_pidO  s    r  )r  r   kwargs_iterabler2   c             	   #   s   t }d}ttjjrtntj}| }|  fdd|D }zdzjddV  W n2 t	k
r   t
dd |D r rY qY nX t |krLd	}td
qLW 5 |sdd |D  X W 5 Q R X d S )NFc                    s   g | ]} t |fqS r.   )Zapply_asyncr  )re   r   r   r  r  r.   r/   ri   ^  s    z&iflatmap_unordered.<locals>.<listcomp>c                 S   s   g | ]}|j d dqS )皙?timeout)rr   re   Zasync_resultr.   r.   r/   ri   r  s     r  r  c                 s   s   | ]}|  V  qd S r^   )readyr  r.   r.   r/   rj   f  s     z%iflatmap_unordered.<locals>.<genexpr>TzkOne of the subprocesses has abruptly died during map operation.To debug the error, disable multiprocessing.)r  r;   multiprocessingr  Poolr   multiprocessQueuerr   r   allemptyRuntimeError)r  r   r  Zinitial_pool_pidZpool_changedZmanager_clsmanagerZasync_resultsr.   r  r/   iflatmap_unorderedS  s*    

r  )FF)	FTFFNr   NTN)rA   )jr   rv   	functoolsr   Zmultiprocessing.poolr  r   r  rP   r   r   
contextlibr   dataclassesr   r   ior   r@  r   r   shutilr   r	   r
   typingr   r   r   r   r   r   r   r   r   r   urllib.parser   r  r  Zmultiprocess.poolr  r   	packagingr   Z	tqdm.autor   r   r   parallelr   r   Ztyping_extensionsZ_typing_extensionsr   r   r5  Z
get_loggerr   r  	lru_cacher9  r0   r+   r   r?   rN   r]   r{   r   r   r   r   r   r   rV   r   propertyr   r   boolrs   r   r   r   r   r	  r
  r;  r?  rB  r4  r1  r2  r^  r3  rb  r  r  r  r  r  r  r  r  r  r.   r.   r.   r/   <module>   s   0
,!'

5		#         _
Ib
^*
 H *
 "$