
    Yh              	         U d dl 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m	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ erd dlZd dlmZ  ed	          Zn ed	          Z ed
          Z ej        d          Zee e ge!f         Z"ee#e e f         ge!f         Z$ G d d          Z% G d de%          Z& G d de%          Z' G d de%          Z( G d de%          Z) G d de%          Z* G d de%          Z+ G d de%          Z, G d deeef                   Z- G d de%          Z.de%iZ/d e0d!<   d*d+d)Z1e%e&e*e'e)e(e+e,e.f	D ]Z2 e1e2           dS ),    )annotationsN)OrderedDict)FutureThreadPoolExecutor)groupby)
itemgetter)TYPE_CHECKINGAnyCallableClassVarGeneric
NamedTupleTypeVar)	ParamSpecPTfsspecc                  J    e Zd ZU dZdZded<   ddZddZddZddZ	ddZ
dS )	BaseCacheag  Pass-though cache: doesn't keep anything, calls every time

    Acts as base class for other cachers

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    noneClassVar[str]name	blocksizeintfetcherFetchersizereturnNonec                h    || _         d| _        || _        || _        d| _        d| _        d| _        d S Nr   )r   nblocksr   r   	hit_count
miss_counttotal_requested_bytes)selfr   r   r   s       `/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/fsspec/caching.py__init__zBaseCache.__init__<   s:    "	%&"""    start
int | Nonestopbytesc                n    |d}|| j         }|| j         k    s||k    rdS |                     ||          S )Nr   r)   )r   r   r&   r*   r,   s      r'   _fetchzBaseCache._fetchF   sF    =E<9DDI$3||E4(((r)   c                0    d| _         d| _        d| _        dS )zAReset hit and miss counts for a more ganular report e.g. by file.r   N)r#   r$   r%   r&   s    r'   _reset_statszBaseCache._reset_statsO   s    %&"""r)   strc           	     x    | j         dk    r| j        dk    rdS d| j         d| j          d| j         d| j         d	S )z2Return a formatted string of the cache statistics.r    z , z: z hits, z	 misses, z total requested bytes)r#   r$   r   r%   r2   s    r'   
_log_statszBaseCache._log_statsU   st    >Q4?a#7#72 FTY  F  F$.  F  F  F  FSWSm  F  F  F  	Fr)   c                    d| j         j         d| j         d| j         d| j         d| j         d| j         d| j         dS )	Nz

        <z:
            block size  :   z
            block count :   z
            file size   :   z
            cache hits  :   z
            cache misses:   z$
            total requested bytes: z
>
        )	__class____name__r   r"   r   r#   r$   r%   r2   s    r'   __repr__zBaseCache.__repr__\   s    
.
! !^  "\  "Y	 
 "^  "_  %)$>   	r)   Nr   r   r   r   r   r   r   r   r*   r+   r,   r+   r   r-   r   r   )r   r4   )r:   
__module____qualname____doc__r   __annotations__r(   r0   r3   r7   r;    r)   r'   r   r   *   s           !D    ' ' ' ') ) ) )' ' ' 'F F F F
 
 
 
 
 
r)   r   c                  P     e Zd ZdZdZ	 	 	 dd fdZddZd dZd!dZd"dZ	 xZ
S )#	MMapCachea  memory-mapped sparse file cache

    Opens temporary file, which is filled blocks-wise when data is requested.
    Ensure there is enough disc space in the temporary location.

    This cache method might only work on posix

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: Fetcher
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    location: str
        Where to create the temporary file. If None, a temporary file is
        created using tempfile.TemporaryFile().
    blocks: set[int]
        Set of block numbers that have already been fetched. If None, an empty
        set is created.
    multi_fetcher: MultiFetcher
        Function of the form f([(start, end)]) which gets bytes from remote
        as specified. This function is used to fetch multiple blocks at once.
        If not specified, the fetcher function is used instead.
    mmapNr   r   r   r   r   location
str | Noneblocksset[int] | Nonemulti_fetcherMultiFetcher | Noner   r   c                    t                                          |||           |t                      n|| _        || _        || _        |                                 | _        d S N)superr(   setrI   rG   rK   	_makefilecache)r&   r   r   r   rG   rI   rK   r9   s          r'   r(   zMMapCache.__init__   sX     	GT222%~ceee6 *^^%%


r)   mmap.mmap | bytearrayc                *   dd l }dd l}| j        dk    rt                      S | j        $t
          j                            | j                  s| j        (|                                }t                      | _
        nt          | j        d          }|                    | j        dz
             |                    d           |                                 nt          | j        d          } |j         |                                | j                  S )Nr   zwb+      1zr+b)rF   tempfiler   	bytearrayrG   ospathexistsTemporaryFilerP   rI   openseekwriteflushfileno)r&   rF   rW   fds       r'   rQ   zMMapCache._makefile   s    9>>;; = t}(E(E }$++--!ee$-//GGDIM"""HHTNNNHHJJJJdmU++Btydi000r)   r*   r+   endr-   c                X    t                               d| d|            |d}| j        }| j        k    s||k    rdS | j        z  }| j        z  }t	          ||dz             } fd|D             } xj        t           fd|D                       z  c_        g }t          t          |          d 	          D ]\  }}	t          t          t          d          |	                    }	|	d          j        z  }
t          |	d
          j        z   j        z    j                  } xj        ||
z
  z  c_        t                               d|	d          d|	d
          d|
 d| d	           |                    |
|f            j                            |	            xj        t%          |	          z  c_        |s j        ||         S  j        r}t                               d|            t                               |                    D ]<\  }}||         \  }
}t                               d|
 d|            | j        |
|<   =nH|D ]E\  }
}t                               d|
 d|                                 |
|           j        |
|<   F j        ||         S )NzMMap cache fetching -r   r)   rU   c              3  .   K   | ]}|j         v|V  d S rN   rI   .0ir&   s     r'   	<genexpr>z#MMapCache._fetch.<locals>.<genexpr>   s/      ??a!4;*>*>*>*>*>*>??r)   c              3  .   K   | ]}|j         v d V  dS )rU   Nrg   rh   s     r'   rk   z#MMapCache._fetch.<locals>.<genexpr>   s/      IIAT[8H8Ha8H8H8H8HIIr)   c                $    | d         | d         z
  S )Nr   rU   rC   )xs    r'   <lambda>z"MMapCache._fetch.<locals>.<lambda>   s    1! r)   )keyzMMap get blocks z ()zMMap copy block (zMMap get block ()loggerdebugr   r   ranger#   sumr   	enumeratetuplemapr   minr%   appendrI   updater$   lenrR   rK   r   )r&   r*   rc   start_block	end_blockblock_rangeneedranges__blockssstartsendidxrs   `             r'   r0   zMMapCache._fetch   s   9E99C99:::=E;)CDI#3t~-4>)	KQ77????;???#IIIIIIIIII ")D//7L7LMMM 	, 	,JAwC
1w7788GQZ$.0Fwr{T^3dnDdiPPD &&$-7&&LLO71:OOOOvOOOOO   MM64.))) Kw'''OOs7||+OOO 	):eCi(( 		ELL4F44555#D$6$6v$>$>?? , ,Q!'@@@$@@AAA*+
6$;'',
 !' E E?????@@@*.,,vt*D*D
6$;''z%)$$r)   dict[str, Any]c                >    | j                                         }|d= |S )NrR   )__dict__copyr&   states     r'   __getstate__zMMapCache.__getstate__   s!    ""$$'Nr)   r   c                l    | j                             |           |                                 | _        d S rN   )r   r|   rQ   rR   r   s     r'   __setstate__zMMapCache.__setstate__   s-    U###^^%%


r)   )NNN)r   r   r   r   r   r   rG   rH   rI   rJ   rK   rL   r   r   )r   rS   r*   r+   rc   r+   r   r-   r   r   r   r   r   r   )r:   r?   r@   rA   r   r(   rQ   r0   r   r   __classcell__r9   s   @r'   rE   rE   i   s         8 D  $"&-1& & & & & & &1 1 1 1,<% <% <% <%|   & & & & & & & &r)   rE   c                  0     e Zd ZdZdZd fd
ZddZ xZS )ReadAheadCachea!  Cache which reads only when we get beyond a block of data

    This is a much simpler version of BytesCache, and does not attempt to
    fill holes in the cache or keep fragments alive. It is best suited to
    many small reads in a sequential order (e.g., reading lines from a file).
    	readaheadr   r   r   r   r   r   r   c                x    t                                          |||           d| _        d| _        d| _        d S )Nr)   r   )rO   r(   rR   r*   rc   r&   r   r   r   r9   s       r'   r(   zReadAheadCache.__init__  s8    GT222

r)   r*   r+   rc   r-   c                   |d}||| j         k    r| j         }|| j         k    s||k    rdS ||z
  }|| j        k    r:|| j        k    r/| xj        dz  c_        | j        || j        z
  || j        z
           S | j        |cxk    r| j        k     rDn nA| xj        dz  c_        | j        || j        z
  d          }|t          |          z  }| j        }n| xj        dz  c_        d}t          | j         || j        z             }| xj	        ||z
  z  c_	        | 
                    ||          | _        || _        | j        t          | j                  z   | _        || j        d |         z   S Nr   r)   rU   )r   r*   rc   r#   rR   r$   r}   rz   r   r%   r   )r&   r*   rc   lparts        r'   r0   zReadAheadCache._fetch  s   =E;#	//)CDI#3%KDJ3$(??NNaNN:edj033CCDDZ5++++48+++++OOq OO:edj0223DTNAHEE OOq OOD$)S4>122""cEk1""\\%--

:DJ/dj!n$$r)   r<   r   r:   r?   r@   rA   r   r(   r0   r   r   s   @r'   r   r      sb          D     % % % % % % % %r)   r   c                  0     e Zd ZdZdZd fd
ZddZ xZS )FirstChunkCachezCaches the first block of a file only

    This may be useful for file types where the metadata is stored in the header,
    but is randomly accessed.
    firstr   r   r   r   r   r   r   c                l    ||k    r|}t                                          |||           d | _        d S rN   )rO   r(   rR   r   s       r'   r(   zFirstChunkCache.__init__.  s:    tIGT222#'


r)   r*   r+   rc   r-   c                   |pd}|| j         k    rt                              d           dS t          || j                   }|| j        k     r| j        | xj        dz  c_        || j        k    rD| xj        |z  c_        |                     d|          }|d | j                 | _        ||d          S |                     d| j                  | _        | xj        | j        z  c_        | j        ||         }|| j        k    r6| xj        || j        z
  z  c_        ||                     | j        |          z  }| xj	        dz  c_	        |S | xj        dz  c_        | xj        ||z
  z  c_        |                     ||          S )Nr   z,FirstChunkCache: requested start > file sizer)   rU   )
r   rs   rt   rz   r   rR   r$   r%   r   r#   )r&   r*   rc   datar   s        r'   r0   zFirstChunkCache._fetch5  s   
49LLGHHH3#ty!!4>!!z!1$''..#5..<<3//D!%&6&6!7DJ<'!\\!T^<<
**dn<**:eCi(DT^##**cDN.BB**T^S999NNaNNKOOq OO&&#+5&&<<s+++r)   r<   r   r   r   s   @r'   r   r   %  sb          D( ( ( ( ( (, , , , , , , ,r)   r   c                  ^     e Zd ZdZdZ	 dd fdZd ZddZddZd dZ	d! fdZ
d"dZ xZS )#
BlockCachea  
    Cache holding memory as a set of blocks.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    
blockcache    r   r   r   r   r   	maxblocksr   r   c                    t                                          |||           t          j        ||z            | _        || _         t          j        |          | j                  | _	        d S rN   )
rO   r(   mathceilr"   r   	functools	lru_cache_fetch_block_fetch_block_cachedr&   r   r   r   r   r9   s        r'   r(   zBlockCache.__init__l  sd     	GT222y	!122"#A9#6y#A#A$BS#T#T   r)   c                4    | j                                         S z
        The statistics on the block cache.

        Returns
        -------
        NamedTuple
            Returned directly from the LRU Cache used internally.
        r   
cache_infor2   s    r'   r   zBlockCache.cache_infot       '22444r)   r   c                    | j         }|d= |S )Nr   r   r   s     r'   r   zBlockCache.__getstate__  s    '(r)   r   c                    | j                             |            t          j        |d                   | j                  | _        d S )Nr   )r   r|   r   r   r   r   r   s     r'   r   zBlockCache.__setstate__  sH    U####J9#6u[7I#J#J$
 $
   r)   r*   r+   rc   r-   c                    |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }t          ||dz             D ]}|                     |           |                     ||||          S )Nr   r)   rU   start_block_numberend_block_number)r   r   ru   r   _read_cache)r&   r*   rc   r   r   block_numbers         r'   r0   zBlockCache._fetch  s    =E;)CDI#3 #dn4$.0 ""46F6JKK 	3 	3L$$\22221-	   
 
 	
r)   r   c                <   || j         k    rt          d| d| j          d          || j        z  }|| j        z   }| xj        ||z
  z  c_        | xj        dz  c_        t
                              d|           t                                          ||          }|S )=
        Fetch the block of data for `block_number`.
        'block_number=(' is greater than the number of blocks (rr   rU   zBlockCache fetching block %d)	r"   
ValueErrorr   r%   r$   rs   inforO   r0   )r&   r   r*   rc   block_contentsr9   s        r'   r   zBlockCache._fetch_block  s     $,&&9 9 9)-9 9 9  
 t~-dn$""cEk1""12LAAAs33r)   r   r   c           	        || j         z  }|| j         z  }| xj        dz  c_        ||k    r|                     |          }|||         S |                     |          |d         g}|                    t	          | j        t          |dz   |                               |                    |                     |          d|                    d                    |          S z
        Read from our block cache.

        Parameters
        ----------
        start, end : int
            The start and end byte positions.
        start_block_number, end_block_number : int
            The start and end block numbers.
        rU   Nr)   r   r#   r   extendry   ru   r{   join	r&   r*   rc   r   r   	start_posend_posblockouts	            r'   r   zBlockCache._read_cache  s     DN*	&!!111334FGGE7*++ ++,>??	

KLC
 JJ,,q02BCC    JJt//0@AA(7(KLLL88C== r)   r   
r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r-   
r*   r   rc   r   r   r   r   r   r   r-   )r:   r?   r@   rA   r   r(   r   r   r   r0   r   r   r   r   s   @r'   r   r   S  s         , D MOU U U U U U U	5 	5 	5   

 
 
 

 
 
 
.     $&! &! &! &! &! &! &! &!r)   r   c                  H     e Zd ZU dZdZded<   	 dd fdZddZddZ xZ	S )
BytesCacheaK  Cache which holds data in a in-memory bytes object

    Implements read-ahead by the block size, for semi-random reads progressing
    through the file.

    Parameters
    ----------
    trim: bool
        As we read more data, whether to discard the start of the buffer when
        we are more than a blocksize ahead of it.
    r-   r   r   Tr   r   r   r   r   trimboolr   r   c                    t                                          |||           d| _        d | _        d | _        || _        d S )Nr)   )rO   r(   rR   r*   rc   r   )r&   r   r   r   r   r9   s        r'   r(   zBytesCache.__init__  sA     	GT222
!%
#			r)   r*   r+   rc   c                V   |d}|| j         }|| j         k    s||k    rdS | j        L|| j        k    rA| j        :|| j        k     r/|| j        z
  }| xj        dz  c_        | j        |||z   |z
           S | j        rt          | j         || j        z             }n|}||k    s|| j         k    rdS | j        || j        k     rY| j        || j        k    rG| xj        ||z
  z  c_        | xj        dz  c_        | 	                    ||          | _        || _        nu| j        J | j        J | xj        dz  c_        || j        k     r| j        | j        |z
  | j        k    r6| xj        ||z
  z  c_        | 	                    ||          | _        || _        n| xj        | j        |z
  z  c_        | 	                    || j                  }|| _        || j        z   | _        n| j        || j        k    r| j        | j         k    rn|| j        z
  | j        k    r6| xj        ||z
  z  c_        | 	                    ||          | _        || _        nB| xj        || j        z
  z  c_        | 	                    | j        |          }| j        |z   | _        | j        t          | j                  z   | _        || j        z
  }| j        |||z   |z
           }| j        rT| j        | j        z
  | j        dz   z  }|dk    r4| xj        | j        |z  z  c_        | j        | j        |z  d          | _        |S r   )r   r*   rc   r#   rR   r   rz   r%   r$   r   r}   r   )r&   r*   rc   offsetbendnewr   nums           r'   r0   zBytesCache._fetch  sa    =E;)CDI#3J"##$dh TZ'FNNaNN:fv|e';;<<> 	ty#"677DDD5==EDI--3J%$*"4"4Hdh &&$,6&&OOq OOeT22DJDJJ:)))8'''OOq OOtz!!8#tx#~'F'F..$,>..!%eT!:!:DJ!&DJJ..$*u2DD..,,udj99C!&DJ!$tz!1DJJ%$//8di''48^dn44..$,>..!%eT!:!:DJ!&DJJ..$/A..,,tx66C!%c!1DJ:DJ/#j&3,"6679 	@8dj(dnq.@ACQww

dns22

!Z(<(>(>?

r)   c                *    t          | j                  S rN   )r}   rR   r2   s    r'   __len__zBytesCache.__len__=  s    4:r)   )T)
r   r   r   r   r   r   r   r   r   r   r   )r   r   )
r:   r?   r@   rA   r   rB   r(   r0   r   r   r   s   @r'   r   r     s         
 
 "D!!!! IM      G G G GR       r)   r   c                  F     e Zd ZU dZdZded<   	 	 	 	 dd fdZddZ xZS )AllBytesz!Cache entire contents of the fileallr   r   Nr   r+   r   Fetcher | Noner   r   bytes | Noner   r   c                    t                                          |||           |@| xj        dz  c_        | xj        | j        z  c_        |                     d| j                  }|| _        d S )NrU   r   )rO   r(   r$   r%   r   r   r   )r&   r   r   r   r   r9   s        r'   r(   zAllBytes.__init__F  sl     	GT222<OOq OO&&$)3&&<<49--D			r)   r*   r,   r-   c                @    | xj         dz  c_         | j        ||         S )NrU   )r#   r   r/   s      r'   r0   zAllBytes._fetchT  s#    !yt$$r)   )NNNN)
r   r+   r   r   r   r+   r   r   r   r   r=   	r:   r?   r@   rA   r   rB   r(   r0   r   r   s   @r'   r   r   A  s}         ++D !%"&!      % % % % % % % %r)   r   c                  F     e Zd ZU dZdZded<   	 	 dd fdZd fdZ xZS )KnownPartsOfAFilea  
    Cache holding known file parts.

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    data: dict
        A dictionary mapping explicit `(start, stop)` file-offset tuples
        with known bytes.
    strict: bool, default True
        Whether to fetch reads that go beyond a known byte-range boundary.
        If `False`, any read that ends outside a known part will be zero
        padded. Note that zero padding will not be used for reads that
        begin outside a known byte-range.
    partsr   r   NTr   r   r   r   r   r   #dict[tuple[int, int], bytes] | Nonestrictr   r   r
   c                `   t                                          |||           || _        |rt          |                                          }|d         g}|                    |d                   g}	|dd          D ]\  }
}|d         \  }}|
|k    r-||f|d<   |	dxx         |                    |
|f          z  cc<   C|                    |
|f           |	                    |                    |
|f                     t          t          ||	                    | _	        d S i | _	        d S )Nr   rU   rq   )
rO   r(   r   sortedkeyspopr{   dictzipr   )r&   r   r   r   r   r   r   old_offsetsoffsetsrI   r*   r,   start0stop0r9   s                 r'   r(   zKnownPartsOfAFile.__init__r  s4    	GT222  	 --K"1~&Ghh{1~../F*122 ; ;t 'E>>#)4.GBK2JJJ$((E4="9"99JJJJNNE4=111MM$((E4="9"9::::S&1122DIIIDIIIr)   r*   r+   r,   r   r-   c                   |d}|| j         }d}| j                                        D ]w\  \  }}}||cxk    r|k     rbn ||z
  }||||z   |z
           }| j        r||cxk    r|k    r2n n/|d||z
  t	          |          z
  z  z  }| xj        dz  c_        |c S |} nx| j        t          d||f d          t          j	        d||f d           t                              d| d	|            | xj        ||z
  z  c_        | xj        dz  c_        |t                                          ||          z   S )
Nr   r)       rU   z&Read is outside the known file parts: z. z%. IO/caching performance may be poor!z!KnownPartsOfAFile cache fetching re   )r   r   itemsr   r}   r#   r   r   warningswarnrs   rt   r%   r$   rO   r0   )	r&   r*   r,   r   loc0loc1r   offr9   s	           r'   r0   zKnownPartsOfAFile._fetch  s   =E<9D"&)//"3"3 	 	LT4$ u####t#####dl3te!334{ dd&:&:&:&:d&:&:&:&:&:
 7dUlSXX&=>>CNNa'NNJJJ
 !EE! $* <WudmWWWXXX 	3eT] 3 3 3	
 	
 	
 	GGGGGHHH""dUl2""1UWW^^E40000r)   )NT)r   r   r   r   r   r   r   r   r   r   r   r
   r=   r   r   s   @r'   r   r   Y  s          , "D!!!! 59      <+1 +1 +1 +1 +1 +1 +1 +1 +1 +1r)   r   c                  X    e Zd ZdZ G d de          ZdddZddZddZddZ	ddZ
dS ) UpdatableLRUzg
    Custom implementation of LRU cache that allows updating keys

    Used by BackgroudBlockCache
    c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )UpdatableLRU.CacheInfor   hitsmissesmaxsizecurrsizeN)r:   r?   r@   rB   rC   r)   r'   	CacheInfor    s4         			r)   r	     funcCallable[P, T]max_sizer   r   r   c                    t          j                    | _        || _        || _        d| _        d| _        t          j                    | _	        d S r!   )
collectionsr   _cache_func	_max_size_hits_misses	threadingLock_lock)r&   r  r  s      r'   r(   zUpdatableLRU.__init__  sA    +6+B+D+D
!
^%%


r)   argsP.argskwargsP.kwargsr   c                &   |r$t          d|                                           | j        5  || j        v rC| j                            |           | xj        dz  c_        | j        |         cd d d            S 	 d d d            n# 1 swxY w Y    | j        |i |}| j        5  || j        |<   | xj        dz  c_        t          | j                  | j	        k    r| j        
                    d           d d d            n# 1 swxY w Y   |S )Nz Got unexpected keyword argument rU   Flast)	TypeErrorr   r  r  move_to_endr  r  r  r}   r  popitem)r&   r  r  results       r'   __call__zUpdatableLRU.__call__  s    	PNv{{}}NNOOOZ 	) 	)t{""''---

a

{4(		) 	) 	) 	) 	) 	) 	) 	)"	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) T,V,,Z 	0 	0 &DKLLALL4;$.00###///		0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 s%   A BBB'ADD
D
r
   r   c                V    | j         5  || j        v cd d d            S # 1 swxY w Y   d S rN   )r  r  )r&   r  s     r'   is_key_cachedzUpdatableLRU.is_key_cached  sx    Z 	' 	'4;&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   	""r"  c                    | j         5  || j        |<   t          | j                  | j        k    r| j                            d           d d d            d S # 1 swxY w Y   d S )NFr  )r  r  r}   r  r!  )r&   r"  r  s      r'   add_keyzUpdatableLRU.add_key  s    Z 	0 	0 &DK4;$.00###///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   AAAAr  c                    | j         5  |                     | j        t          | j                  | j        | j                  cd d d            S # 1 swxY w Y   d S )N)r  r  r  r  )r  r	  r  r}   r  r  r  r2   s    r'   r   zUpdatableLRU.cache_info  s    Z 	 	>>T[))Z|	 "  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   :AAAN)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@   rA   r   r	  r(   r#  r%  r'  r   rC   r)   r'   r  r    s             J   & & & & &   &' ' ' '0 0 0 0     r)   r  c                  n     e Zd ZU dZdZded<   	 d!d" fdZd#dZd$dZd%dZ	d&dZ
d'd( fdZd)d Z xZS )*BackgroundBlockCachea  
    Cache holding memory as a set of blocks with pre-loading of
    the next block in the background.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored. If the
    next block is not in cache, it is loaded in a separate thread
    in non-blocking way.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    
backgroundr   r   r   r   r   r   r   r   r   r   r   c                >   t                                          |||           t          j        ||z            | _        || _        t          | j        |          | _        t          d          | _
        d | _        d | _        t          j                    | _        d S )NrU   max_workers)rO   r(   r   r   r"   r   r  r   r   r   _thread_executor_fetch_future_block_number_fetch_futurer  r  _fetch_future_lockr   s        r'   r(   zBackgroundBlockCache.__init__  s     	GT222y	!122"#/0A9#M#M  2q A A A6:'37"+."2"2r)   r  c                4    | j                                         S r   r   r2   s    r'   r   zBackgroundBlockCache.cache_info#  r   r)   r   c                2    | j         }|d= |d= |d= |d= |d= |S )Nr   r0  r1  r2  r3  r   r   s     r'   r   z!BackgroundBlockCache.__getstate__.  s:    '($%.//"&'r)   c                    | j                             |           t          | j        |d                   | _        t          d          | _        d | _        d | _        t          j
                    | _        d S )Nr   rU   r.  )r   r|   r  r   r   r   r0  r1  r2  r  r  r3  r   s     r'   r   z!BackgroundBlockCache.__setstate__7  sk    U####/0A5CU#V#V  2q A A A*.'!"+."2"2r)   r*   r+   rc   r-   c                V   |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }d }d }| j        5  | j        | j        J | j                                        r`t                              d           | j        	                    | j        
                                | j                   d | _        d | _        n@t          || j        cxk    o|k    nc           }|r| j        }| j        }d | _        d | _        d d d            n# 1 swxY w Y   |Gt                              d           | j        	                    |
                                |           t          ||dz             D ]}|                     |           |dz   }	| j        5  | j        R|	| j        k    rG| j                            |	          s-|	| _        | j                            | j        |	d          | _        d d d            n# 1 swxY w Y   |                     ||||          S )Nr   r)   z3BlockCache joined background fetch without waiting.z(BlockCache waiting for background fetch.rU   asyncr   )r   r   r3  r2  r1  doners   r   r   r'  r"  r   ru   r"   r%  r0  submitr   r   )
r&   r*   rc   r   r   fetch_future_block_numberfetch_future	must_joinr   end_block_plus_1s
             r'   r0   zBackgroundBlockCache._fetch?  s,   =E;)CDI#3 #dn4$.0$(!$ 	2 	2!-6BBB%**,, 2KK UVVV,44*1133T5T   7;D3)-D&& !%*:, , , ,+, , , ,! !I
 ! 2 594S1'+'9 ;?7-1*7	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2< #KKBCCC$,,##%%'@  
 ""46F6JKK 	3 	3L$$\2222 ,a/$ 		 		"*$440>>?OPP 5 3C/%)%:%A%A%'7& &"		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 1-	   
 
 	
s&    C
DDD!AHHHsyncr   log_infor4   c                >   || j         k    rt          d| d| j          d          || j        z  }|| j        z   }t                              d||           | xj        ||z
  z  c_        | xj        dz  c_        t                                          ||          }|S )r   r   r   rr   z!BlockCache fetching block (%s) %drU   )	r"   r   r   rs   r   r%   r$   rO   r0   )r&   r   r@  r*   rc   r   r9   s         r'   r   z!BackgroundBlockCache._fetch_block  s     $,&&9 9 9)-9 9 9  
 t~-dn$7<PPP""cEk1""1s33r)   r   r   c           	        || j         z  }|| j         z  }| xj        dz  c_        ||k    r|                     |          }|||         S |                     |          |d         g}|                    t	          | j        t          |dz   |                               |                    |                     |          d|                    d                    |          S r   r   r   s	            r'   r   z BackgroundBlockCache._read_cache  s     DN*	& 	!!111,,-?@@E7*++ ++,>??	

KLC
 JJ,,q02BCC    JJt//0@AA(7(KLLL88C== r)   r   r   r)  r   r>   r   )r?  )r   r   r@  r4   r   r-   r   )r:   r?   r@   rA   r   rB   r(   r   r   r   r0   r   r   r   r   s   @r'   r+  r+    s          2 'D&&&& MO3 3 3 3 3 3 3	5 	5 	5 	5   3 3 3 3J
 J
 J
 J
X      $(! (! (! (! (! (! (! (!r)   r+  z!dict[str | None, type[BaseCache]]cachesFclstype[BaseCache]clobberr   r   r   c                ~    | j         }|s)|t          v r t          d|dt          |                    | t          |<   dS )z'Register' cache implementation.

    Parameters
    ----------
    clobber: bool, optional
        If set to True (default is False) - allow to overwrite existing
        entry.

    Raises
    ------
    ValueError
    zCache with name z is already known: N)r   rC  r   )rD  rF  r   s      r'   register_cacherH    sL     8D Wtv~~UDUUvd|UUVVVF4LLLr)   )F)rD  rE  rF  r   r   r   )3
__future__r   r  r   loggingr   rY   r  r   r   concurrent.futuresr   r   	itertoolsr   operatorr   typingr	   r
   r   r   r   r   r   rF   typing_extensionsr   r   r   	getLoggerrs   r   r-   r   listMultiFetcherr   rE   r   r   r   r   r   r   r  r+  rC  rB   rH  crC   r)   r'   <module>rT     s   " " " " " " "           				      # # # # # # 9 9 9 9 9 9 9 9                               KKK++++++	#AAAGCLL 
	8	$	$
C:u$
%c3h(%/0< < < < < < < <~K& K& K& K& K&	 K& K& K&\+% +% +% +% +%Y +% +% +%\+, +, +, +, +,i +, +, +,\F! F! F! F! F! F! F! F!Rb b b b b b b bJ% % % % %y % % %0b1 b1 b1 b1 b1	 b1 b1 b1J9 9 9 9 971a4= 9 9 9xK! K! K! K! K!9 K! K! K!` 	)-        ( 

  A N1 r)   