o
    Ëý°j+¡  ã                   @   s¸  d dl mZ d dlZd dlZd dlZzd dlZW n ey#   dZY nw ejd  dk r¯d dlmZ e	fZ
eZd dlmZ d dlZd dlZd dlmZmZmZmZmZ d dlmZmZmZmZmZm Z m!Z! dd	„ Zd dl"Z"d d
l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ erŠd dl"m,Z, d dl-Z-d dl.Z.d dl/Z0d dl1m1Z1 d dl2Z2e3Z3d dl4m5Z6 d dl4m7Z8 nˆd dl9mZ e:fZ
e:Zd dl9m;Z d dlZd dlZd dl<Z<d dl=mZmZmZmZmZmZ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+ e�rd dl>m,Z, d dl?m&Z&m%Z%m Z  d dl@mAZ- d dl>mBZ" d dlCmAZ. d dl0Z0d dlDm1Z1 d dlEmFZ2 eGZ3d dl4m8Z8 e6Z6z
d dlmHZHmIZI W n e�y\   G dd„ deJƒZId`dd„ZKdd„ ZHY nw zd dlmLZM W n e�yw   G dd„ deNƒZMY nw zd dl<mOZO W n e�y•   ejPejQB dfd d!„ZOY nw d d"lRmSZT eUeTd#ƒ�r¥eTZSnd d$lRmVZW G d%d&„ d&eWƒZVG d'd(„ d(eTƒZSzd d)lXmYZY W n e�yÑ   d*d+„ ZYY nw d dl<Z<d dlZZZze[Z[W n e\�yò   d d,l]m^Z^ d-d.„ Z[Y nw zej_Z_ej`Z`W n# ea�y   e b¡ �p	d/Zcecd0k�rd1Zdnd2Zdd3d4„ Z_d5d6„ Z`Y nw zd d7lemfZf W n# e�yJ   d d8lgmhZhmiZi d dlZe jd9¡Zkd:d;„ Zld<d=„ ZfY nw zd d>lmmnZn W n e�yc   d d>lomnZn Y nw ejdd?… d@k �rse1ƒ jpZpnd dAlmmpZp zd dBlqmrZr W n0 e�y±   d dClqmsZs zd dDltmuZv W n e�y¦   dadFdG„ZvY nw G dHdI„ dIesƒZrY nw zd dJlwmxZx W n e�yÉ   dbdKdL„ZxY nw zd dMlqmyZy W nB e�y   zd dNlzm{Z| W n e�yò   d dNl}m{Z| Y nw zd dOl~mZm€Z€m�Z� W n
 e�y	   Y nw G dPdQ„ dQe‚ƒZyY nw zd dRlƒm„Z„m…Z… W dS  e�y[   e jdSej†¡Z‡dTdU„ Z…G dVdW„ dWe‚ƒZˆdbdXdY„Z‰G dZd[„ d[eŠƒZ‹G d\d]„ d]eŒƒZ�G d^d_„ d_eNƒZ„Y dS w )cé    )Úabsolute_importNé   )ÚStringIO)ÚFileType)ÚurlparseÚ
urlunparseÚurljoinÚurlsplitÚ
urlunsplit)ÚurlretrieveÚquoteÚunquoteÚurl2pathnameÚpathname2urlÚContentTooShortErrorÚ	splittypec                 C   s   t | tƒr
|  d¡} t| ƒS )Núutf-8)Ú
isinstanceÚunicodeÚencodeÚ_quote)Ús© r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pip/_vendor/distlib/compat.pyr      s   

r   )	ÚRequestÚurlopenÚURLErrorÚ	HTTPErrorÚHTTPBasicAuthHandlerÚHTTPPasswordMgrÚHTTPHandlerÚHTTPRedirectHandlerÚbuild_opener)ÚHTTPSHandler)Ú
HTMLParser)Úifilter)Úifilterfalse)ÚTextIOWrapper)r   r   r   r   r   r	   r
   r   )
r   r   r   r   r   r   r   r    r!   r"   )r   r   r   )Úfilterfalse)Úmatch_hostnameÚCertificateErrorc                   @   s   e Zd ZdS )r*   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r*   _   s    r*   é   c           
      C   sô   g }| sdS |   d¡}|d |dd… }}| d¡}||kr'tdt| ƒ ƒ‚|s1|  ¡ | ¡ kS |dkr;| d¡ n| d	¡sE| d	¡rN| t |¡¡ n| t |¡ 	d
d¡¡ |D ]
}| t |¡¡ q\t 
dd |¡ d tj¡}	|	 |¡S )zpMatching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        FÚ.r   r.   NÚ*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)ÚsplitÚcountr*   ÚreprÚlowerÚappendÚ
startswithÚreÚescapeÚreplaceÚcompileÚjoinÚ
IGNORECASEÚmatch)
ÚdnÚhostnameÚmax_wildcardsÚpatsÚpartsÚleftmostÚ	remainderÚ	wildcardsÚfragÚpatr   r   r   Ú_dnsname_matchc   s*   


ÿ
rH   c                 C   sä   | st dƒ‚g }|  dd¡}|D ]\}}|dkr%t||ƒr  dS | |¡ q|sJ|  dd¡D ]}|D ]\}}|dkrHt||ƒrC  dS | |¡ q2q.t|ƒdkr^td	|d
 tt|ƒ¡f ƒ‚t|ƒdkrntd||d f ƒ‚tdƒ‚)a=  Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        ztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDÚsubjectAltNamer   ÚDNSNÚsubjectÚ
commonNamer.   z&hostname %r doesn't match either of %sú, zhostname %r doesn't match %rr   z=no appropriate commonName or subjectAltName fields were found)	Ú
ValueErrorÚgetrH   r5   Úlenr*   r;   Úmapr3   )Úcertr?   ÚdnsnamesÚsanÚkeyÚvalueÚsubr   r   r   r)   •   s8   

€

€úþ
þr)   )ÚSimpleNamespacec                   @   ó   e Zd ZdZdd„ ZdS )Ú	ContainerzR
        A generic container for when multiple values need to be returned
        c                 K   s   | j  |¡ d S ©N©Ú__dict__Úupdate)ÚselfÚkwargsr   r   r   Ú__init__Ç   s   zContainer.__init__N)r+   r,   r-   Ú__doc__ra   r   r   r   r   rZ   Ã   s    rZ   )Úwhichc                    s"  dd„ }t j ˆ ¡r|ˆ |ƒrˆ S dS |du rt j dt j¡}|s#dS | t j¡}tj	dkr^t j
|vr:| dt j
¡ t j dd¡ t j¡}t‡ fd	d
„|D ƒƒrTˆ g}n‡ fdd„|D ƒ}nˆ g}tƒ }|D ](}t j |¡}||vrŽ| |¡ |D ]}	t j ||	¡}
||
|ƒr�|
    S qyqfdS )aK  Given a command, mode, and a PATH string, return the path which
        conforms to the given mode on the PATH, or None if there is no such
        file.

        `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result
        of os.environ.get("PATH"), or can be overridden with a custom search
        path.

        c                 S   s&   t j | ¡ot  | |¡ot j | ¡ S r[   )ÚosÚpathÚexistsÚaccessÚisdir)ÚfnÚmoder   r   r   Ú_access_checkÜ   s   ÿzwhich.<locals>._access_checkNÚPATHÚwin32r   ÚPATHEXTÚ c                 3   s"   � | ]}ˆ   ¡  |  ¡ ¡V  qd S r[   )r4   Úendswith©Ú.0Úext©Úcmdr   r   Ú	<genexpr>ù   s   €  zwhich.<locals>.<genexpr>c                    s   g | ]}ˆ | ‘qS r   r   rq   rt   r   r   Ú
<listcomp>ü   ó    zwhich.<locals>.<listcomp>)rd   re   ÚdirnameÚenvironrO   Údefpathr1   ÚpathsepÚsysÚplatformÚcurdirÚinsertÚanyÚsetÚnormcaseÚaddr;   )ru   rj   re   rk   ÚpathextÚfilesÚseenÚdirÚnormdirÚthefileÚnamer   rt   r   rc   Ï   s<   




ÿ€rc   )ÚZipFileÚ	__enter__)Ú
ZipExtFilec                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )rŽ   c                 C   s   | j  |j ¡ d S r[   r\   )r_   Úbaser   r   r   ra     ó   zZipExtFile.__init__c                 C   ó   | S r[   r   ©r_   r   r   r   r�     ó   zZipExtFile.__enter__c                 G   ó   |   ¡  d S r[   ©Úclose©r_   Úexc_infor   r   r   Ú__exit__  ó   zZipExtFile.__exit__N)r+   r,   r-   ra   r�   rš   r   r   r   r   rŽ     s    rŽ   c                   @   r�   )rŒ   c                 C   r’   r[   r   r“   r   r   r   r�   #  r”   zZipFile.__enter__c                 G   r•   r[   r–   r˜   r   r   r   rš   &  r›   zZipFile.__exit__c                 O   s    t j| g|¢R i |¤Ž}t|ƒS r[   )ÚBaseZipFileÚopenrŽ   )r_   Úargsr`   r�   r   r   r   r�   *  s   zZipFile.openN)r+   r,   r-   r�   rš   r�   r   r   r   r   rŒ   "  s    rŒ   )Úpython_implementationc                   C   s0   dt jv rdS tjdkrdS t j d¡rdS dS )z6Return a string identifying the Python implementation.ÚPyPyÚjavaÚJythonÚ
IronPythonÚCPython)r}   Úversionrd   r‹   r6   r   r   r   r   rŸ   1  s   

rŸ   )ÚCallablec                 C   s
   t | tƒS r[   )r   r¦   )Úobjr   r   r   ÚcallableC  ó   
r¨   r   ÚmbcsÚstrictÚsurrogateescapec                 C   ó6   t | tƒr| S t | tƒr|  tt¡S tdt| ƒj ƒ‚©Nzexpect bytes or str, not %s)	r   ÚbytesÚ	text_typer   Ú_fsencodingÚ	_fserrorsÚ	TypeErrorÚtyper+   ©Úfilenamer   r   r   ÚfsencodeW  ó   

ÿr·   c                 C   r­   r®   )	r   r°   r¯   Údecoder±   r²   r³   r´   r+   rµ   r   r   r   Úfsdecode`  r¸   rº   )Údetect_encoding)ÚBOM_UTF8Úlookupzcoding[:=]\s*([-\w.]+)c                 C   sH   | dd…   ¡  dd¡}|dks| d¡rdS |dv s | d¡r"d	S | S )
z(Imitates get_normal_name in tokenizer.c.Né   Ú_ú-r   zutf-8-)zlatin-1ú
iso-8859-1ziso-latin-1)zlatin-1-ziso-8859-1-ziso-latin-1-rÁ   )r4   r9   r6   )Úorig_encÚencr   r   r   Ú_get_normal_nameq  s   ÿrÄ   c                    sÈ   zˆj j‰W n ty   d‰Y nw d‰ d}d}‡fdd„}‡ ‡fdd„}|ƒ }| t¡r7d‰ |d	d… }d
}|s=|g fS ||ƒ}|rH||gfS |ƒ }|sR||gfS ||ƒ}|r^|||gfS |||gfS )a?  
        The detect_encoding() function is used to detect the encoding that should
        be used to decode a Python source file.  It requires one argument, readline,
        in the same way as the tokenize() generator.

        It will call readline a maximum of twice, and return the encoding used
        (as a string) and a list of any lines (left as bytes) it has read in.

        It detects the encoding from the presence of a utf-8 bom or an encoding
        cookie as specified in pep-0263.  If both a bom and a cookie are present,
        but disagree, a SyntaxError will be raised.  If the encoding cookie is an
        invalid charset, raise a SyntaxError.  Note that if a utf-8 bom is found,
        'utf-8-sig' is returned.

        If no encoding is specified, then the default of 'utf-8' will be returned.
        NFr   c                      s   zˆ ƒ W S  t y   Y dS w )Nó    )ÚStopIterationr   )Úreadliner   r   Úread_or_stop”  s
   ÿz%detect_encoding.<locals>.read_or_stopc                    sä   z|   d¡}W n ty   d}ˆd urd |ˆ¡}t|ƒ‚w t |¡}|s(d S t|d ƒ}zt|ƒ}W n tyQ   ˆd u rGd| }t|ƒ‚d ˆ|¡}t|ƒ‚w ˆ rp|j	dkrlˆd u rcd}t|ƒ‚d ˆ¡}t|ƒ‚|d	7 }|S )
Nr   z'invalid or missing encoding declarationz{} for {!r}r   zunknown encoding: zunknown encoding for {!r}: {}zencoding problem: utf-8z encoding problem for {!r}: utf-8z-sig)
r¹   ÚUnicodeDecodeErrorÚformatÚSyntaxErrorÚ	cookie_reÚfindallrÄ   r½   ÚLookupErrorr‹   )ÚlineÚline_stringÚmsgÚmatchesÚencodingÚcodec)Ú	bom_foundr¶   r   r   Úfind_cookieš  s@   ü
þÿù	

ÿz$detect_encoding.<locals>.find_cookieTr   z	utf-8-sig)Ú__self__r‹   ÚAttributeErrorr6   r¼   )rÇ   rÓ   ÚdefaultrÈ   rÖ   ÚfirstÚsecondr   )rÕ   r¶   rÇ   r   r»   |  s6   ÿ&


r»   )r8   é   )r   é   )Úunescape)ÚChainMap)ÚMutableMapping)Úrecursive_reprú...c                    s   ‡ fdd„}|S )zm
            Decorator to make a repr function return fillvalue for a recursive
            call
            c                    sL   t ƒ ‰ ‡‡ ‡fdd„}tˆdƒ|_tˆdƒ|_tˆdƒ|_tˆdi ƒ|_|S )Nc              	      sJ   t | ƒtƒ f}|ˆv rˆ S ˆ |¡ zˆ| ƒ}W ˆ |¡ |S ˆ |¡ w r[   )ÚidÚ	get_identr„   Údiscard)r_   rU   Úresult)Ú	fillvalueÚrepr_runningÚuser_functionr   r   Úwrapperñ  s   


ÿz=_recursive_repr.<locals>.decorating_function.<locals>.wrapperr,   rb   r+   Ú__annotations__)r‚   Úgetattrr,   rb   r+   rë   )ré   rê   ©rç   )rè   ré   r   Údecorating_functionî  s   z,_recursive_repr.<locals>.decorating_functionr   )rç   rî   r   rí   r   Ú_recursive_reprè  s   rï   c                   @   s´   e Zd ZdZdd„ Zdd„ Zdd„ Zd'd	d
„Zdd„ Zdd„ Z	dd„ Z
dd„ Zeƒ dd„ ƒZedd„ ƒZdd„ ZeZdd„ Zedd„ ƒZdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS )(rß   aÍ   A ChainMap groups multiple dicts (or other mappings) together
        to create a single, updateable view.

        The underlying mappings are stored in a list.  That list is public and can
        accessed or updated using the *maps* attribute.  There is no other state.

        Lookups search the underlying mappings successively until a key is found.
        In contrast, writes, updates, and deletions only operate on the first
        mapping.

        c                 G   s   t |ƒpi g| _dS )z˜Initialize a ChainMap by setting *maps* to the given mappings.
            If no mappings are provided, a single empty dictionary is used.

            N)ÚlistÚmaps)r_   rñ   r   r   r   ra     s   zChainMap.__init__c                 C   s   t |ƒ‚r[   )ÚKeyError©r_   rU   r   r   r   Ú__missing__  s   zChainMap.__missing__c              	   C   s6   | j D ]}z|| W   S  ty   Y qw |  |¡S r[   )rñ   rò   rô   )r_   rU   Úmappingr   r   r   Ú__getitem__  s   
ÿ
zChainMap.__getitem__Nc                 C   s   || v r| | S |S r[   r   ©r_   rU   rÙ   r   r   r   rO   $  s   zChainMap.getc                 C   ó   t tƒ j| jŽ ƒS r[   )rP   r‚   Úunionrñ   r“   r   r   r   Ú__len__'  r‘   zChainMap.__len__c                 C   rø   r[   )Úiterr‚   rù   rñ   r“   r   r   r   Ú__iter__*  r‘   zChainMap.__iter__c                    s   t ‡ fdd„| jD ƒƒS )Nc                 3   s   � | ]}ˆ |v V  qd S r[   r   )rr   Úm©rU   r   r   rv   .  s   € z(ChainMap.__contains__.<locals>.<genexpr>©r�   rñ   ró   r   rþ   r   Ú__contains__-  s   zChainMap.__contains__c                 C   s
   t | jƒS r[   rÿ   r“   r   r   r   Ú__bool__0  r©   zChainMap.__bool__c                 C   s   d  | d tt| jƒ¡¡S )Nz{0.__class__.__name__}({1})rM   )rÊ   r;   rQ   r3   rñ   r“   r   r   r   Ú__repr__3  s   ÿzChainMap.__repr__c                 G   s   | t j|g|¢R Ž ƒS )z?Create a ChainMap with a single dict created from the iterable.)ÚdictÚfromkeys)ÚclsÚiterablerž   r   r   r   r  8  s   zChainMap.fromkeysc                 C   s&   | j | jd  ¡ g| jdd… ¢R Ž S )zHNew ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]r   r.   N)Ú	__class__rñ   Úcopyr“   r   r   r   r  =  s   &zChainMap.copyc                 C   s   | j i g| j¢R Ž S )z;New ChainMap with a new dict followed by all previous maps.©r  rñ   r“   r   r   r   Ú	new_childC  s   zChainMap.new_childc                 C   s   | j | jdd… Ž S )zNew ChainMap from maps[1:].r.   Nr	  r“   r   r   r   ÚparentsG  s   zChainMap.parentsc                 C   s   || j d |< d S )Nr   )rñ   )r_   rU   rV   r   r   r   Ú__setitem__L  r‘   zChainMap.__setitem__c                 C   s0   z	| j d |= W d S  ty   td |¡ƒ‚w )Nr   ú(Key not found in the first mapping: {!r})rñ   rò   rÊ   ró   r   r   r   Ú__delitem__O  s
   ÿzChainMap.__delitem__c                 C   s(   z| j d  ¡ W S  ty   tdƒ‚w )zPRemove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.r   z#No keys found in the first mapping.)rñ   Úpopitemrò   r“   r   r   r   r  U  s
   ÿzChainMap.popitemc                 G   s8   z| j d j|g|¢R Ž W S  ty   td |¡ƒ‚w )zWRemove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].r   r  )rñ   Úpoprò   rÊ   )r_   rU   rž   r   r   r   r  \  s
   ÿzChainMap.popc                 C   s   | j d  ¡  dS )z'Clear maps[0], leaving maps[1:] intact.r   N)rñ   Úclearr“   r   r   r   r  c  ó   zChainMap.clearr[   )r+   r,   r-   rb   ra   rô   rö   rO   rú   rü   r   r  rï   r  Úclassmethodr  r  Ú__copy__r
  Úpropertyr  r  r  r  r  r  r   r   r   r   rß     s0    



rß   )Úcache_from_sourcec                 C   s6   |   d¡sJ ‚|d u rd}|rd}| | S d}| | S )Nz.pyTÚcÚo)rp   )re   Údebug_overrideÚsuffixr   r   r   r  j  s   ÿr  )ÚOrderedDict)rä   )ÚKeysViewÚ
ValuesViewÚ	ItemsViewc                   @   sþ   e Zd ZdZdd„ Zejfdd„Zejfdd„Zdd	„ Zd
d„ Z	dd„ Z
d6dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZeƒ Zefdd „Zd7d"d#„Zd7d$d%„Zd&d'„ Zd(d)„ Zed7d*d+„ƒZd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Z d4d5„ Z!d!S )8r  z)Dictionary that remembers insertion orderc                 O   sp   t |ƒdkrtdt |ƒ ƒ‚z| j W n ty-   g  | _}||dg|dd…< i | _Y nw | j|i |¤Ž dS )zÑInitialize an ordered dictionary.  Signature is the same as for
            regular dictionaries, but keyword arguments are not recommended
            because their insertion order is arbitrary.

            r.   z$expected at most 1 arguments, got %dN)rP   r³   Ú_OrderedDict__rootrØ   Ú_OrderedDict__mapÚ_OrderedDict__update)r_   rž   ÚkwdsÚrootr   r   r   ra   ‘  s   


ýzOrderedDict.__init__c                 C   sF   || vr| j }|d }|||g |d<  |d< | j|< || ||ƒ dS )z!od.__setitem__(i, y) <==> od[i]=yr   r.   N)r  r   )r_   rU   rV   Údict_setitemr#  Úlastr   r   r   r  ¡  s
    zOrderedDict.__setitem__c                 C   s0   || |ƒ | j  |¡\}}}||d< ||d< dS )z od.__delitem__(y) <==> del od[y]r.   r   N)r   r  )r_   rU   Údict_delitemÚ	link_prevÚ	link_nextr   r   r   r  «  s   
zOrderedDict.__delitem__c                 c   ó:   � | j }|d }||ur|d V  |d }||usdS dS )zod.__iter__() <==> iter(od)r.   rÜ   N©r  ©r_   r#  Úcurrr   r   r   rü   ´  ó   €
þzOrderedDict.__iter__c                 c   r)  )z#od.__reversed__() <==> reversed(od)r   rÜ   Nr*  r+  r   r   r   Ú__reversed__¼  r-  zOrderedDict.__reversed__c                 C   sb   z | j  ¡ D ]}|dd…= q| j}||dg|dd…< | j  ¡  W n	 ty)   Y nw t | ¡ dS )z.od.clear() -> None.  Remove all items from od.N)r   Ú
itervaluesr  r  rØ   r  )r_   Únoder#  r   r   r   r  Ä  s   ÿzOrderedDict.clearTc                 C   s|   | st dƒ‚| j}|r|d }|d }||d< ||d< n|d }|d }||d< ||d< |d }| j|= t | |¡}||fS )z¡od.popitem() -> (k, v), return and remove a (key, value) pair.
            Pairs are returned in LIFO order if last is true or FIFO order if false.

            zdictionary is emptyr   r.   rÜ   )rò   r  r   r  r  )r_   r%  r#  Úlinkr'  r(  rU   rV   r   r   r   r  Ð  s    
zOrderedDict.popitemc                 C   ó   t | ƒS )zod.keys() -> list of keys in od)rð   r“   r   r   r   Úkeysé  ó   zOrderedDict.keysc                    ó   ‡ fdd„ˆ D ƒS )z#od.values() -> list of values in odc                    s   g | ]}ˆ | ‘qS r   r   ©rr   rU   r“   r   r   rw   ï  rx   z&OrderedDict.values.<locals>.<listcomp>r   r“   r   r“   r   Úvaluesí  r  zOrderedDict.valuesc                    r5  )z.od.items() -> list of (key, value) pairs in odc                    s   g | ]}|ˆ | f‘qS r   r   r6  r“   r   r   rw   ó  ó    z%OrderedDict.items.<locals>.<listcomp>r   r“   r   r“   r   Úitemsñ  r  zOrderedDict.itemsc                 C   r2  )z0od.iterkeys() -> an iterator over the keys in od)rû   r“   r   r   r   Úiterkeysõ  r4  zOrderedDict.iterkeysc                 c   s   � | D ]}| | V  qdS )z2od.itervalues -> an iterator over the values in odNr   ©r_   Úkr   r   r   r/  ù  s   €ÿzOrderedDict.itervaluesc                 c   s   � | D ]	}|| | fV  qdS )z=od.iteritems -> an iterator over the (key, value) items in odNr   r;  r   r   r   Ú	iteritemsþ  s   €ÿzOrderedDict.iteritemsc                  O   sÆ   t | ƒdkrtdt | ƒf ƒ‚| stdƒ‚| d }d}t | ƒdkr%| d }t|tƒr6|D ]}|| ||< q,nt|dƒrI| ¡ D ]}|| ||< q?n|D ]\}}|||< qK| ¡ D ]\}}|||< qXdS )	a—  od.update(E, **F) -> None.  Update od from dict/iterable E and F.

            If E is a dict instance, does:           for k in E: od[k] = E[k]
            If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
            Or if E is an iterable of items, does:   for k, v in E: od[k] = v
            In either case, this is followed by:     for k, v in F.items(): od[k] = v

            rÜ   z8update() takes at most 2 positional arguments (%d given)z,update() takes at least 1 argument (0 given)r   r   r.   r3  N)rP   r³   r   r  Úhasattrr3  r9  )rž   r"  r_   ÚotherrU   rV   r   r   r   r^     s.   	ÿ
ÿ
ÿ

ÿzOrderedDict.updatec                 C   s0   || v r| | }| |= |S || j u rt|ƒ‚|S )z±od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
            If key is not found, d is returned if given, otherwise KeyError is raised.

            )Ú_OrderedDict__markerrò   )r_   rU   rÙ   ræ   r   r   r   r  &  s   
zOrderedDict.popNc                 C   s   || v r| | S || |< |S )zDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in odr   r÷   r   r   r   Ú
setdefault3  s   zOrderedDict.setdefaultc                 C   sj   |si }t | ƒtƒ f}||v rdS d||< z| s#d| jjf W ||= S d| jj|  ¡ f W ||= S ||= w )zod.__repr__() <==> repr(od)râ   r.   z%s()z%s(%r))rã   Ú
_get_identr  r+   r9  )r_   Ú_repr_runningÚcall_keyr   r   r   r  :  s   þzOrderedDict.__repr__c                    sX   ‡ fdd„ˆ D ƒ}t ˆ ƒ ¡ }t tƒ ƒD ]}| |d¡ q|r&ˆ j|f|fS ˆ j|ffS )z%Return state information for picklingc                    s   g | ]}|ˆ | g‘qS r   r   ©rr   r<  r“   r   r   rw   J  r8  z*OrderedDict.__reduce__.<locals>.<listcomp>N)Úvarsr  r  r  r  )r_   r9  Ú	inst_dictr<  r   r“   r   Ú
__reduce__H  s   zOrderedDict.__reduce__c                 C   s
   |   | ¡S )z!od.copy() -> a shallow copy of od)r  r“   r   r   r   r  R  ó   
zOrderedDict.copyc                 C   s   | ƒ }|D ]}|||< q|S )zˆOD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
            and values equal to v (which defaults to None).

            r   )r  r  rV   ÚdrU   r   r   r   r  V  s   
zOrderedDict.fromkeysc                 C   s6   t |tƒrt| ƒt|ƒko|  ¡ | ¡ kS t | |¡S )z›od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
            while comparison to a regular mapping is order-insensitive.

            )r   r  rP   r9  r  Ú__eq__©r_   r?  r   r   r   rK  a  s   
 zOrderedDict.__eq__c                 C   s
   | |k S r[   r   rL  r   r   r   Ú__ne__j  r©   zOrderedDict.__ne__c                 C   r2  )z@od.viewkeys() -> a set-like object providing a view on od's keys)r  r“   r   r   r   Úviewkeyso  r4  zOrderedDict.viewkeysc                 C   r2  )z<od.viewvalues() -> an object providing a view on od's values)r  r“   r   r   r   Ú
viewvaluess  r4  zOrderedDict.viewvaluesc                 C   r2  )zBod.viewitems() -> a set-like object providing a view on od's items)r  r“   r   r   r   Ú	viewitemsw  r4  zOrderedDict.viewitems)Tr[   )"r+   r,   r-   rb   ra   r  r  r  rü   r.  r  r  r3  r7  r9  r:  r/  r=  r^   r!  Úobjectr@  r  rA  r  rH  r  r  r  rK  rM  rN  rO  rP  r   r   r   r   r  …  s<    
	




	r  )ÚBaseConfiguratorÚvalid_identz^[a-z_][a-z0-9_]*$c                 C   s   t  | ¡}|std|  ƒ‚dS )Nz!Not a valid Python identifier: %rT)Ú
IDENTIFIERr=   rN   )r   rý   r   r   r   rS  �  s   
rS  c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚConvertingDictz A converting dictionary wrapper.c                 C   óJ   t  | |¡}| j |¡}||ur#|| |< t|ƒtttfv r#| |_||_	|S r[   )
r  rö   ÚconfiguratorÚconvertr´   rU  ÚConvertingListÚConvertingTupleÚparentrU   ©r_   rU   rV   ræ   r   r   r   rö   ”  ó   
ÿzConvertingDict.__getitem__Nc                 C   sL   t  | ||¡}| j |¡}||ur$|| |< t|ƒtttfv r$| |_||_	|S r[   )
r  rO   rW  rX  r´   rU  rY  rZ  r[  rU   ©r_   rU   rÙ   rV   ræ   r   r   r   rO      s   
ÿzConvertingDict.getr[   )r+   r,   r-   rb   rö   rO   r   r   r   r   rU  ‘  s    rU  c                 C   sD   t  | ||¡}| j |¡}||ur t|ƒtttfv r | |_||_	|S r[   )
r  r  rW  rX  r´   rU  rY  rZ  r[  rU   r^  r   r   r   r  ¬  s   
ÿr  c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )	rY  zA converting list wrapper.c                 C   rV  r[   )
rð   rö   rW  rX  r´   rU  rY  rZ  r[  rU   r\  r   r   r   rö   ¸  r]  zConvertingList.__getitem__éÿÿÿÿc                 C   s<   t  | |¡}| j |¡}||urt|ƒtttfv r| |_|S r[   )	rð   r  rW  rX  r´   rU  rY  rZ  r[  )r_   ÚidxrV   ræ   r   r   r   r  Ä  s   
ÿzConvertingList.popN)r_  )r+   r,   r-   rb   rö   r  r   r   r   r   rY  ¶  s    rY  c                   @   rY   )rZ  zA converting tuple wrapper.c                 C   sB   t  | |¡}| j |¡}||urt|ƒtttfv r| |_||_	|S r[   )
Útuplerö   rW  rX  r´   rU  rY  rZ  r[  rU   r\  r   r   r   rö   Ï  s   
ÿzConvertingTuple.__getitem__N)r+   r,   r-   rb   rö   r   r   r   r   rZ  Í  s    rZ  c                   @   sŒ   e Zd ZdZe d¡Ze d¡Ze d¡Ze d¡Z	e d¡Z
ddd	œZeeƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )rR  zQ
        The configurator base class which defines some useful defaults.
        z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$Úext_convertÚcfg_convert)rs   Úcfgc                 C   s   t |ƒ| _| | j_d S r[   )rU  ÚconfigrW  )r_   re  r   r   r   ra   í  s   
zBaseConfigurator.__init__c           	   	   C   s´   |  d¡}| d¡}z-|  |¡}|D ]"}|d| 7 }zt||ƒ}W q ty4   |  |¡ t||ƒ}Y qw |W S  tyY   t ¡ dd… \}}td||f ƒ}|||_	|_
|‚w )zl
            Resolve strings to objects using standard import and attribute
            syntax.
            r/   r   r.   NzCannot resolve %r: %s)r1   r  Úimporterrì   rØ   ÚImportErrorr}   r™   rN   Ú	__cause__Ú__traceback__)	r_   r   r‹   ÚusedÚfoundrF   ÚeÚtbÚvr   r   r   Úresolveñ  s&   



þüzBaseConfigurator.resolvec                 C   s
   |   |¡S )z*Default converter for the ext:// protocol.)ro  ©r_   rV   r   r   r   rb    rI  zBaseConfigurator.ext_convertc                 C   sü   |}| j  |¡}|du rtd| ƒ‚|| ¡ d… }| j| ¡ d  }|r|| j |¡}|r6|| ¡ d  }n1| j |¡}|rg| ¡ d }| j |¡sO|| }nz
t	|ƒ}|| }W n t
yf   || }Y nw |rr|| ¡ d… }ntd||f ƒ‚|s%|S )z*Default converter for the cfg:// protocol.NzUnable to convert %rr   zUnable to convert %r at %r)ÚWORD_PATTERNr=   rN   Úendre  ÚgroupsÚDOT_PATTERNÚINDEX_PATTERNÚDIGIT_PATTERNÚintr³   )r_   rV   Úrestrý   rJ  r`  Únr   r   r   rc    s8   
ÿÿízBaseConfigurator.cfg_convertc                 C   sÌ   t |tƒst |tƒrt|ƒ}| |_|S t |tƒs&t |tƒr&t|ƒ}| |_|S t |tƒs9t |tƒr9t|ƒ}| |_|S t |tƒrd| j	 
|¡}|rd| ¡ }|d }| j |d¡}|rd|d }t| |ƒ}||ƒ}|S )zù
            Convert values to an appropriate type. dicts, lists and tuples are
            replaced by their converting alternatives. Strings are checked to
            see if they have a conversion format and are converted if they do.
            ÚprefixNr  )r   rU  r  rW  rY  rð   rZ  ra  Ústring_typesÚCONVERT_PATTERNr=   Ú	groupdictÚvalue_convertersrO   rì   )r_   rV   rý   rJ  rz  Ú	converterr  r   r   r   rX  .  s2   ï
òÿ
ö
zBaseConfigurator.convertc                    sr   ˆ   d¡}t|ƒs|  |¡}ˆ   dd¡}t‡ fdd„ˆ D ƒƒ}|di |¤Ž}|r7| ¡ D ]
\}}t|||ƒ q,|S )z1Configure an object with a user-supplied factory.z()r/   Nc                    s    g | ]}t |ƒr|ˆ | f‘qS r   )rS  rE  ©re  r   r   rw   Q  s     z5BaseConfigurator.configure_custom.<locals>.<listcomp>r   )r  r¨   ro  r  r9  Úsetattr)r_   re  r  Úpropsr`   ræ   r‹   rV   r   r€  r   Úconfigure_customJ  s   

z!BaseConfigurator.configure_customc                 C   s   t |tƒr	t|ƒ}|S )z0Utility function which converts lists to tuples.)r   rð   ra  rp  r   r   r   Úas_tupleX  s   
zBaseConfigurator.as_tupleN)r+   r,   r-   rb   r7   r:   r|  rq  rt  ru  rv  r~  ÚstaticmethodÚ
__import__rf  ra   ro  rb  rc  rX  rƒ  r„  r   r   r   r   rR  Ù  s$    




þ"rR  )r.   )râ   r[   )ŽÚ
__future__r   rd   r7   r}   Ússlrg  Úversion_infor   Ú
basestringr{  r   r°   Útypesr   Ú	file_typeÚ__builtin__ÚbuiltinsÚConfigParserÚconfigparserr   r   r   r	   r
   Úurllibr   r   r   r   r   r   r   r   Úurllib2r   r   r   r   r   r   r    r!   r"   r#   ÚhttplibÚ	xmlrpclibÚQueueÚqueuer$   ÚhtmlentitydefsÚ	raw_inputÚ	itertoolsr%   Úfilterr&   r(   ÚioÚstrr'   ÚshutilÚurllib.parseÚurllib.requestÚurllib.errorÚhttp.clientÚclientÚrequestÚxmlrpc.clientÚhtml.parserÚhtml.entitiesÚentitiesÚinputr)   r*   rN   rH   rX   rZ   rQ  rc   ÚF_OKÚX_OKÚzipfilerŒ   rœ   r>  rŽ   ÚBaseZipExtFiler~   rŸ   Ú	sysconfigr¨   Ú	NameErrorÚcollections.abcr¦   r·   rº   rØ   Úgetfilesystemencodingr±   r²   Útokenizer»   Úcodecsr¼   r½   r:   rÌ   rÄ   Úhtmlr8   ÚcgirÞ   Úcollectionsrß   rà   Úreprlibrá   rï   Úimportlib.utilr  r  Úthreadrä   rB  Údummy_threadÚ_abcollr  r  r  r  Úlogging.configrR  rS  ÚIrT  rU  r  rð   rY  ra  rZ  r   r   r   r   Ú<module>   sB  ÿ$,(0
2Ébÿ	þCÿý

	ê
ïlÿ
ÿÝ ÿÿÿñ  

¤