U
    ڲgc                     @   s$  d Z dZ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	m
Z
 G dd dZG d	d
 d
ejjZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZedddddgZe
jdd fd!d"Ze
jdfd#d$ZdS )%z0Extensible memoizing collections and decorators.)
Cache	FIFOCacheLFUCacheLRUCacheMRUCacheRRCache	TLRUCacheTTLCachecachedcachedmethodz5.5.1    N   )keysc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_DefaultSize c                 C   s   dS Nr   r   self_r   r   7/tmp/pip-unpacked-wheel-voax59lc/cachetools/__init__.py__getitem__   s    z_DefaultSize.__getitem__c                 C   s   |dkst d S r   )AssertionError)r   r   valuer   r   r   __setitem__"   s    z_DefaultSize.__setitem__c                 C   s   dS r   r   r   r   r   r   pop%   s    z_DefaultSize.popN)__name__
__module____qualname__	__slots__r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZe Ze Zd!ddZdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd Zdd Zd"ddZefddZd#ddZedd Zedd Zedd  ZdS )$r   z?Mutable mapping to serve as a simple cache or cache base class.Nc                 C   s6   |r
|| _ | j tj k	rt | _t | _d| _|| _d S Nr   )	getsizeofr   dict_Cache__size_Cache__data_Cache__currsize_Cache__maxsizer   maxsizer   r   r   r   __init__0   s    zCache.__init__c                 C   s   d| j jt| j| j| jf S )Nz%s(%s, maxsize=%r, currsize=%r))	__class__r   reprr"   r$   r#   r   r   r   r   __repr__9   s    zCache.__repr__c                 C   s0   z| j | W S  tk
r*   | | Y S X d S N)r"   KeyError__missing__r   keyr   r   r   r   A   s    zCache.__getitem__c                 C   s   | j }| |}||kr td|| jks8| j| |k rP| j| |krP|   q8|| jkrj|| j|  }n|}|| j|< || j|< |  j|7  _d S )Nzvalue too large)r$   r   
ValueErrorr"   r!   r#   popitem)r   r0   r   r&   sizeZdiffsizer   r   r   r   G   s    




zCache.__setitem__c                 C   s&   | j |}| j|= |  j|8  _d S r,   )r!   r   r"   r#   )r   r0   r3   r   r   r   __delitem__W   s    zCache.__delitem__c                 C   s
   || j kS r,   )r"   r/   r   r   r   __contains__\   s    zCache.__contains__c                 C   s   t |d S r,   )r-   r/   r   r   r   r.   _   s    zCache.__missing__c                 C   s
   t | jS r,   )iterr"   r*   r   r   r   __iter__b   s    zCache.__iter__c                 C   s
   t | jS r,   )lenr"   r*   r   r   r   __len__e   s    zCache.__len__c                 C   s   || kr| | S |S d S r,   r   )r   r0   defaultr   r   r   geth   s    z	Cache.getc                 C   s4   || kr| | }| |= n|| j kr,t|n|}|S r,   )_Cache__markerr-   r   r0   r:   r   r   r   r   r   n   s    

z	Cache.popc                 C   s"   || kr| | }n| | |< }|S r,   r   r=   r   r   r   
setdefaultx   s    
zCache.setdefaultc                 C   s   | j S )zThe maximum size of the cache.)r$   r*   r   r   r   r&      s    zCache.maxsizec                 C   s   | j S )zThe current size of the cache.)r#   r*   r   r   r   currsize   s    zCache.currsizec                 C   s   dS )z+Return the size of a cache element's value.r   r   )r   r   r   r   r      s    zCache.getsizeof)N)N)N)r   r   r   __doc__objectr<   r   r!   r'   r+   r   r   r4   r5   r.   r7   r9   r;   r   r>   propertyr&   r?   staticmethodr   r   r   r   r   r   )   s*   
	




r   c                   @   s>   e Zd ZdZdddZejfddZejfddZd	d
 ZdS )r   z/First In First Out (FIFO) cache implementation.Nc                 C   s   t | || t | _d S r,   )r   r'   collectionsOrderedDict_FIFOCache__orderr%   r   r   r   r'      s    zFIFOCache.__init__c                 C   s@   || || z| j | W n tk
r:   d | j |< Y nX d S r,   )rF   move_to_endr-   r   r0   r   cache_setitemr   r   r   r      s
    zFIFOCache.__setitem__c                 C   s   || | | j |= d S r,   )rF   r   r0   cache_delitemr   r   r   r4      s    
zFIFOCache.__delitem__c                 C   sN   zt t| j}W n( tk
r:   tdt| j dY nX || |fS dS )z9Remove and return the `(key, value)` pair first inserted.%s is emptyN)nextr6   rF   StopIterationr-   typer   r   r/   r   r   r   r2      s
    zFIFOCache.popitem)N)	r   r   r   r@   r'   r   r   r4   r2   r   r   r   r   r      s
   
r   c                   @   sL   e Zd ZdZdddZejfddZejfddZejfd	d
Zdd Z	dS )r   z1Least Frequently Used (LFU) cache implementation.Nc                 C   s   t | || t | _d S r,   )r   r'   rD   Counter_LFUCache__counterr%   r   r   r   r'      s    zLFUCache.__init__c                 C   s(   || |}|| kr$| j |  d8  < |S r   rQ   r   r0   cache_getitemr   r   r   r   r      s    
zLFUCache.__getitem__c                 C   s"   || || | j |  d8  < d S r   rR   rH   r   r   r   r      s    zLFUCache.__setitem__c                 C   s   || | | j |= d S r,   rR   rJ   r   r   r   r4      s    
zLFUCache.__delitem__c                 C   sR   z| j d\\}}W n( tk
r>   tdt| j dY nX || |fS dS )z@Remove and return the `(key, value)` pair least frequently used.r   rL   N)rQ   most_commonr1   r-   rO   r   r   )r   r0   r   r   r   r   r2      s
    zLFUCache.popitem)N)
r   r   r   r@   r'   r   r   r   r4   r2   r   r   r   r   r      s   
r   c                   @   sT   e Zd ZdZdddZejfddZejfddZejfd	d
Zdd Z	dd Z
dS )r   z/Least Recently Used (LRU) cache implementation.Nc                 C   s   t | || t | _d S r,   )r   r'   rD   rE   _LRUCache__orderr%   r   r   r   r'      s    zLRUCache.__init__c                 C   s    || |}|| kr|  | |S r,   _LRUCache__updaterS   r   r   r   r      s    

zLRUCache.__getitem__c                 C   s   || || |  | d S r,   rW   rH   r   r   r   r      s    zLRUCache.__setitem__c                 C   s   || | | j |= d S r,   )rV   rJ   r   r   r   r4      s    
zLRUCache.__delitem__c                 C   sN   zt t| j}W n( tk
r:   tdt| j dY nX || |fS dS )z>Remove and return the `(key, value)` pair least recently used.rL   N)rM   r6   rV   rN   r-   rO   r   r   r/   r   r   r   r2      s
    zLRUCache.popitemc                 C   s4   z| j | W n tk
r.   d | j |< Y nX d S r,   )rV   rG   r-   r/   r   r   r   __update   s    zLRUCache.__update)N)r   r   r   r@   r'   r   r   r   r4   r2   rX   r   r   r   r   r      s   
	r   c                   @   sT   e Zd ZdZdddZejfddZejfddZejfd	d
Zdd Z	dd Z
dS )r   z.Most Recently Used (MRU) cache implementation.Nc                 C   s6   ddl m} |dtdd t| || t | _d S )Nr   )warnzMRUCache is deprecated   )
stacklevel)warningsrZ   DeprecationWarningr   r'   rD   rE   _MRUCache__order)r   r&   r   rZ   r   r   r   r'      s    zMRUCache.__init__c                 C   s    || |}|| kr|  | |S r,   _MRUCache__updaterS   r   r   r   r      s    

zMRUCache.__getitem__c                 C   s   || || |  | d S r,   r`   rH   r   r   r   r      s    zMRUCache.__setitem__c                 C   s   || | | j |= d S r,   )r_   rJ   r   r   r   r4     s    
zMRUCache.__delitem__c                 C   sN   zt t| j}W n( tk
r:   tdt| j dY nX || |fS dS )z=Remove and return the `(key, value)` pair most recently used.rL   N)rM   r6   r_   rN   r-   rO   r   r   r/   r   r   r   r2     s
    zMRUCache.popitemc                 C   s8   z| j j|dd W n tk
r2   d | j |< Y nX d S )NF)last)r_   rG   r-   r/   r   r   r   rY     s    zMRUCache.__update)N)r   r   r   r@   r'   r   r   r   r4   r2   ra   r   r   r   r   r      s   
	r   c                   @   s4   e Zd ZdZejdfddZedd Zdd ZdS )	r   z-Random Replacement (RR) cache implementation.Nc                 C   s   t | || || _d S r,   )r   r'   _RRCache__choice)r   r&   choicer   r   r   r   r'     s    zRRCache.__init__c                 C   s   | j S )z(The `choice` function used by the cache.)rc   r*   r   r   r   rd     s    zRRCache.choicec                 C   sN   z|  t| }W n( tk
r:   tdt| j dY nX || |fS dS )z/Remove and return a random `(key, value)` pair.rL   N)rc   list
IndexErrorr-   rO   r   r   r/   r   r   r   r2   $  s
    zRRCache.popitem)	r   r   r   r@   randomrd   r'   rB   r2   r   r   r   r   r     s
   
r   c                       s   e Zd ZdZG dd dZejdfddZej	fddZ	ej
fd	d
Z
e fddZedd Zdd Zdd Zdd Zdd Z  ZS )_TimedCachez0Base class for time aware cache implementations.c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )z_TimedCache._Timerc                 C   s   || _ d| _d S r   )_Timer__timer_Timer__nesting)r   timerr   r   r   r'   2  s    z_TimedCache._Timer.__init__c                 C   s   | j dkr|  S | jS d S r   rj   ri   Z_Timer__timer*   r   r   r   __call__6  s    
z_TimedCache._Timer.__call__c                 C   s2   | j dkr|   | _}n| j}|  j d7  _ |S )Nr   r   rl   r   timer   r   r   	__enter__<  s
    
z_TimedCache._Timer.__enter__c                 G   s   |  j d8  _ d S r   )rj   )r   excr   r   r   __exit__D  s    z_TimedCache._Timer.__exit__c                 C   s   t j| jffS r,   )rh   _Timerri   r*   r   r   r   
__reduce__G  s    z_TimedCache._Timer.__reduce__c                 C   s   t | j|S r,   )getattrri   )r   namer   r   r   __getattr__J  s    z_TimedCache._Timer.__getattr__N)	r   r   r   r'   rm   rp   rr   rt   rw   r   r   r   r   rs   1  s   rs   Nc                 C   s   t | || t|| _d S r,   )r   r'   rh   rs   _TimedCache__timer)r   r&   rk   r   r   r   r   r'   M  s    z_TimedCache.__init__c              
   C   s0   | j  }| | || W  5 Q R  S Q R X d S r,   rx   expire)r   Z
cache_reprro   r   r   r   r+   Q  s    
z_TimedCache.__repr__c              
   C   s0   | j  }| | || W  5 Q R  S Q R X d S r,   ry   )r   	cache_lenro   r   r   r   r9   V  s    
z_TimedCache.__len__c              
      s0   | j  }| | t jW  5 Q R  S Q R X d S r,   )rx   rz   superr?   rn   r(   r   r   r?   [  s    
z_TimedCache.currsizec                 C   s   | j S )z%The timer function used by the cache.)rx   r*   r   r   r   rk   a  s    z_TimedCache.timerc              	   C   s*   | j }| | t|  W 5 Q R X d S r,   )rx   rz   r   clearrn   r   r   r   r~   f  s    
z_TimedCache.clearc              
   O   s0   | j   tj| f||W  5 Q R  S Q R X d S r,   )rx   r   r;   r   argskwargsr   r   r   r;   k  s    z_TimedCache.getc              
   O   s0   | j   tj| f||W  5 Q R  S Q R X d S r,   )rx   r   r   r   r   r   r   r   o  s    z_TimedCache.popc              
   O   s0   | j   tj| f||W  5 Q R  S Q R X d S r,   )rx   r   r>   r   r   r   r   r>   s  s    z_TimedCache.setdefault)r   r   r   r@   rs   ro   	monotonicr'   r   r+   r9   rB   r?   rk   r~   r;   r   r>   __classcell__r   r   r}   r   rh   .  s   
rh   c                   @   s   e Zd ZdZG dd dZejdfddZdd Ze	j
fd	d
Z
e	jfddZe	jfddZdd Zdd Zedd ZdddZdd Zdd ZdS )r   z@LRU Cache implementation with per-item time-to-live (TTL) value.c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
zTTLCache._Link)r0   expiresrM   prevNc                 C   s   || _ || _d S r,   )r0   r   r   r0   r   r   r   r   r'   ~  s    zTTLCache._Link.__init__c                 C   s   t j| j| jffS r,   )r   _Linkr0   r   r*   r   r   r   rt     s    zTTLCache._Link.__reduce__c                 C   s   | j }| j}||_ ||_d S r,   )rM   r   )r   rM   r   r   r   r   unlink  s    zTTLCache._Link.unlink)NN)r   r   r   r   r'   rt   r   r   r   r   r   r   {  s   
r   Nc                 C   s>   t | ||| t  | _}| |_|_t | _	|| _
d S r,   )rh   r'   r   r   _TTLCache__rootr   rM   rD   rE   _TTLCache__links_TTLCache__ttl)r   r&   ttlrk   r   rootr   r   r   r'     s
    
zTTLCache.__init__c                 C   s8   z| j | }W n tk
r$   Y dS X |  |jk S d S NF)r   r-   rk   r   )r   r0   linkr   r   r   r5     s
    zTTLCache.__contains__c                 C   sT   z|  |}W n tk
r&   d}Y nX |  |jk  }|rF| |S || |S d S r   )_TTLCache__getlinkr-   rk   r   r.   )r   r0   rT   r   expiredr   r   r   r     s    

zTTLCache.__getitem__c              	   C   s   | j }| | || || W 5 Q R X z| |}W n( tk
r^   t| | j|< }Y n
X |  || j |_	| j
 |_}|j |_}| |_|_d S r,   )rk   rz   r   r-   r   r   r   r   r   r   r   rM   r   )r   r0   r   rI   ro   r   r   r   r   r   r   r     s    
zTTLCache.__setitem__c                 C   s8   || | | j |}|  |  |jk s4t|d S r,   )r   r   r   rk   r   r-   )r   r0   rK   r   r   r   r   r4     s
    
zTTLCache.__delitem__c              	   c   sD   | j }|j}||k	r@| j}||jk r.|jV  W 5 Q R X |j}qd S r,   )r   rM   rk   r   r0   )r   r   currro   r   r   r   r7     s    
zTTLCache.__iter__c                 C   sj   | j | | j}| |_|_t| j dd dD ]"}||_|j |_}| |_|_q4| | 	  d S )Nc                 S   s   | j S r,   r   )objr   r   r   <lambda>      z'TTLCache.__setstate__.<locals>.<lambda>)r0   )
__dict__updater   r   rM   sortedr   valuesrz   rk   )r   stater   r   r   r   r   r   __setstate__  s    zTTLCache.__setstate__c                 C   s   | j S )z,The time-to-live value of the cache's items.)r   r*   r   r   r   r     s    zTTLCache.ttlc           	      C   s   |dkr|   }| j}|j}| j}g }tj}tj}||k	r||jk s||j	|| |j	f || |j	 ||j	= |j}|
  |}q2|S )qRemove expired items from the cache and return an iterable of the
        expired `(key, value)` pairs.

        N)rk   r   rM   r   r   r4   r   r   appendr0   r   )	r   ro   r   r   linksr   rK   rT   rM   r   r   r   rz     s     zTTLCache.expirec              
   C   sv   | j f}| | ztt| j}W n( tk
rL   tdt| j dY nX || 	|fW  5 Q R  S W 5 Q R X dS zmRemove and return the `(key, value)` pair least recently used that
        has not already expired.

        rL   N)
rk   rz   rM   r6   r   rN   r-   rO   r   r   r   ro   r0   r   r   r   r2     s    
zTTLCache.popitemc                 C   s   | j | }| j | |S r,   )r   rG   r   r0   r   r   r   r   Z	__getlink  s    
zTTLCache.__getlink)N)r   r   r   r@   r   ro   r   r'   r5   r   r   r   r4   r7   r   rB   r   rz   r2   r   r   r   r   r   r   x  s   



r   c                   @   s   e Zd ZdZejG dd dZejdfddZ	dd Z
ejfd	d
ZejfddZejfddZdd Zedd ZdddZdd Zdd ZdS )r   z;Time aware Least Recently Used (TLRU) cache implementation.c                   @   s"   e Zd ZdZdddZdd ZdS )zTLRUCache._Itemr0   r   removedNc                 C   s   || _ || _d| _d S r   r   r   r   r   r   r'     s    zTLRUCache._Item.__init__c                 C   s   | j |j k S r,   r   )r   otherr   r   r   __lt__  s    zTLRUCache._Item.__lt__)NN)r   r   r   r   r'   r   r   r   r   r   _Item  s   
r   Nc                 C   s*   t | ||| t | _g | _|| _d S r,   )rh   r'   rD   rE   _TLRUCache__items_TLRUCache__order_TLRUCache__ttu)r   r&   tturk   r   r   r   r   r'     s    
zTLRUCache.__init__c                 C   s8   z| j | }W n tk
r$   Y dS X |  |jk S d S r   )r   r-   rk   r   )r   r0   itemr   r   r   r5     s
    zTLRUCache.__contains__c                 C   sT   z|  |}W n tk
r&   d}Y nX |  |jk  }|rF| |S || |S d S r   )_TLRUCache__getitemr-   rk   r   r.   )r   r0   rT   r   r   r   r   r   r     s    

zTLRUCache.__getitem__c              	   C   s   | j @}| |||}||k s,W 5 Q R  d S | | || || W 5 Q R X zd| |_W n tk
rp   Y nX t|| | j|< }t	
| j| d S NT)rk   r   rz   r   r   r-   r   r   r   heapqheappushr   )r   r0   r   rI   ro   r   r   r   r   r   r   (  s    
zTLRUCache.__setitem__c              	   C   sD   | j }|| | W 5 Q R X | j|}d|_||jk s@t|d S r   )rk   r   r   r   r   r-   )r   r0   rK   ro   r   r   r   r   r4   8  s    
zTLRUCache.__delitem__c              
   c   s:   | j D ].}| j}||jk r*|js*|jV  W 5 Q R X qd S r,   )r   rk   r   r   r0   )r   r   ro   r   r   r   r7   A  s    
zTLRUCache.__iter__c                 C   s   | j S )z1The local time-to-use function used by the cache.)r   r*   r   r   r   r   H  s    zTLRUCache.ttuc                 C   s   |dkr|   }| j}| j}t|t|d krNdd |D  | _}t| g }tj}tj}|r|d j	sz||d j
k st|}|j	s^||j|| |jf || |j ||j= q^|S )r   Nr[   c                 S   s   g | ]}|j s|qS r   )r   ).0r   r   r   r   
<listcomp>X  s      z$TLRUCache.expire.<locals>.<listcomp>r   )rk   r   r   r8   r   heapifyr   r4   r   r   r   heappopr   r0   )r   ro   itemsorderr   rK   rT   r   r   r   r   rz   M  s"    


zTLRUCache.expirec              
   C   st   | j d}| | ztt| j}W n& tk
rJ   td| jj dY nX || 	|fW  5 Q R  S W 5 Q R X dS r   )
rk   rz   rM   r6   r   rN   r-   r(   r   r   r   r   r   r   r2   e  s    
zTLRUCache.popitemc                 C   s   | j | }| j | |S r,   )r   rG   r   r   r   r   Z	__getitems  s    
zTLRUCache.__getitem)N)r   r   r   r@   	functoolstotal_orderingr   ro   r   r'   r5   r   r   r   r4   r7   rB   r   rz   r2   r   r   r   r   r   r     s   	

r   	CacheInfohitsmissesr&   r?   Fc                    s    fdd}|S )z_Decorator to wrap a function with a memoizing callable that saves
    results in a cache.

    c                    s  rd t tr(fddn.t tjjrHfddnfddd kr fdd}fdd	}}nhd kr fd
d}fdd	}}n6 fdd}fdd	}fdd}nld kr
 fdd}dd	 }nHd kr2 fdd}fdd	}n  fdd}fdd	}d }|_|_|_||_||_	t
| S )Nr   c                      s   t  j jS r,   )
_CacheInfor&   r?   r   cacher   r   r   r   getinfo  s    z*cached.<locals>.decorator.<locals>.getinfoc                      s   t d t S r,   )r   r8   r   r   r   r   r     s    c                      s   t  ddS r   )r   r   r   r   r   r   r     s    c                     s   d7  | |S r   r   r   r   )funcr   r   r   wrapper  s    z*cached.<locals>.decorator.<locals>.wrapperc                      s   d  d S r   r   r   r   r   r   cache_clear  s    z.cached.<locals>.decorator.<locals>.cache_clearc                     sn   | |}z | }d7 |W S  t k
r<   d7 Y nX | |}z| |< W n tk
rh   Y nX |S r   r-   r1   r   r   kresultv)r   r   r   r0   r   r   r   r     s    

c                      s       d d S r   r~   r   r   r   r   r     s    c                     s   | |}z2$  | }d7 |W  5 Q R  W S Q R X W n, t k
rh    d7 W 5 Q R X Y nX | |}z*  ||W  5 Q R  W S Q R X W n tk
r   | Y S X d S r   r-   r>   r1   r   )r   r   r   r0   lockr   r   r   r     s    

$c                	      s$        d W 5 Q R X d S r   r   r   )r   r   r   r   r   r   r     s    c                
      s"      W  5 Q R  S Q R X d S r,   r   r   )r   r   r   r   
cache_info  s    z-cached.<locals>.decorator.<locals>.cache_infoc                     s
    | |S r,   r   r   )r   r   r   r     s    c                   S   s   d S r,   r   r   r   r   r   r     s    c                     sZ   | |}z
 | W S  t k
r(   Y nX | |}z| |< W n tk
rT   Y nX |S r,   r   r   r   r   r   )r   r   r0   r   r   r     s    


c                      s       d S r,   r   r   r   r   r   r     s    c               
      s   | |}z&  | W  5 Q R  W S Q R X W n t k
rD   Y nX | |}z*  ||W  5 Q R  W S Q R X W n tk
r   | Y S X d S r,   r   r   )r   r   r0   r   r   r   r     s    
 
$c                	      s        W 5 Q R X d S r,   r   r   r   r   r   r   r     s    )
isinstancer   rD   abcMappingr   	cache_key
cache_lockr   r   r   update_wrapper)r   r   r   r   r   infor0   r   )r   r   r   r   r   	decorator  sB    



zcached.<locals>.decoratorr   )r   r0   r   r   r   r   r   r   r	   ~  s     r	   c                    s    fdd}|S )zoDecorator to wrap a class or instance method with a memoizing
    callable that saves results in a cache.

    c                    sj   d kr& fdd}fdd}n  fdd}fdd}|_ |_|_||_t| S )Nc                    s    | }|d kr | f||S | f||}z
|| W S  t k
rN   Y nX | f||}z|||< W n tk
r   Y nX |S r,   r   r   r   r   cr   r   )r   r0   methodr   r   r   %  s    
z0cachedmethod.<locals>.decorator.<locals>.wrapperc                    s    | }|d k	r|   d S r,   r   r   r   r   r   r   r~   5  s    z.cachedmethod.<locals>.decorator.<locals>.clearc              
      s    | }|d kr | f||S | f||}z*|  || W  5 Q R  W S Q R X W n t k
rn   Y nX | f||}z.|  |||W  5 Q R  W S Q R X W n tk
r   | Y S X d S r,   r   r   )r   r0   r   r   r   r   r   <  s    
 
$c              	      s0    | }|d k	r,|  |   W 5 Q R X d S r,   r   r   r   r   r   r~   N  s    
)r   r   r   r   r   r   )r   r   r~   r   r0   r   )r   r   r   "  s    zcachedmethod.<locals>.decoratorr   )r   r0   r   r   r   r   r   r
     s    9r
   )r@   __all____version__rD   collections.abcr   r   rg   ro    r   r   r   MutableMappingr   r   r   r   r   r   rh   r   r   
namedtupler   Zhashkeyr	   Z	methodkeyr
   r   r   r   r   <module>   s6   f%)J z 
 