B
    2*™\4 ã               @   s  d dddddddgZ dd	lZdd	lZdd	lZdd	lZdd	lZdd	lZdd	lZ	dd	l
Zdd
lmZ dZd	add„ ZeejjƒZdZdd„ ZdZdd„ ZdddddddgZdddddd d!d"d#d$d%d&gZg ZxeD ]Ze e ¡ ¡ qÌW dtd'd(„Zdud)d*„Z d	d	d	d	d+œZ!e "d,ej#¡Z$d-d.„ Z%d/d0„ Z&e "d1ej#¡Z'e "d2ej(ej#B ¡Z)e "d3ej*ej#B ¡Z+d4d5„ Z,e "d6ej*ej#B ¡Z-d7d8„ Z.d9d:„ Z/e "d;¡Z0e "d<¡Z1e "d=¡Z2e "d>¡Z3d?d@„ Z4e "dA¡Z5dBdC„ Z6dDdE„ Z7dFdG„ Z8e "dHej#¡Z9dIdJ„ Z:dKdL„ Z;dMdN„ Z<dOdP„ Z=e "dQej#¡Z>dRdS„ Z?dTdU„ Z@dVdW„ ZAdXdY„ ZBdZZCe "d[¡ZDd\d]„ ZEd^d_„ ZFd`da„ ZGdbdc„ ZHG ddd „ d ƒZIG ded„ dƒZJG dfd„ deJƒZKdgdh„ ZLdidj„ ZMG dkdl„ dlƒZNG dmd„ dƒZOG dnd„ dePƒZQG dod„ deOƒZRdpdq„ ZSG drd„ deRƒZTG dsd„ deRƒZUd	S )vÚCookieÚ	CookieJarÚCookiePolicyÚDefaultCookiePolicyÚFileCookieJarÚLWPCookieJarÚ	LoadErrorÚMozillaCookieJaré    N)ÚtimegmFc              G   s(   t sd S tsdd l}| d¡atj | Ž S )Nr	   zhttp.cookiejar)ÚdebugÚloggerÚloggingZ	getLogger)Úargsr   © r   ú9C:\ALexclude\prg\programme\Python37\Lib\http\cookiejar.pyÚ_debug+   s    
r   zQa filename was not supplied (nor was the CookieJar instance initialised with one)c              C   sJ   dd l } dd l}dd l}|  ¡ }| d |¡ | ¡ }|jd| dd d S )Nr	   zhttp.cookiejar bug!
%sé   )Ú
stacklevel)ÚioÚwarningsÚ	tracebackÚStringIOÚ	print_excÚgetvalueÚwarn)r   r   r   ÚfÚmsgr   r   r   Ú_warn_unhandled_exception9   s
    r   i²  c             C   s¨   | d d… \}}}}}}|t kr d|  kr4dkr n nhd|  krLdkr n nPd|  krddkr n n8d|  kr|dkr n n d|  kr”dkr n nt| ƒS d S d S )	Né   é   é   é   r	   é   é;   é=   )Ú
EPOCH_YEARr
   )ÚttÚyearÚmonthZmdayÚhourÚminÚsecr   r   r   Ú_timegmH   s
    8Hr,   ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc             C   s@   | d krt j  ¡ }nt j  | ¡}d|j|j|j|j|j|jf S )Nz%04d-%02d-%02d %02d:%02d:%02dZ)	ÚdatetimeÚutcnowÚutcfromtimestampr'   r(   Údayr)   ÚminuteÚsecond)ÚtÚdtr   r   r   Ú	time2isozV   s
    r5   c             C   sR   | d krt j  ¡ }nt j  | ¡}dt| ¡  |jt|jd  |j|j	|j
|jf S )Nz#%s, %02d-%s-%04d %02d:%02d:%02d GMTr   )r-   r.   r/   ÚDAYSZweekdayr0   ÚMONTHSr(   r'   r)   r1   r2   )r3   r4   r   r   r   Útime2netscapei   s    r8   )ZGMTÚUTCZUTÚZz^([-+])?(\d\d?):?(\d\d)?$c             C   sj   d }| t krd}nTt | ¡}|rfdt| d¡ƒ }| d¡rR|dt| d¡ƒ  }| d¡dkrf| }|S )Nr	   i  r   é   é<   r   ú-)Ú	UTC_ZONESÚTIMEZONE_REÚsearchÚintÚgroup)ÚtzÚoffsetÚmr   r   r   Úoffset_from_tz_string€   s    

rF   c             C   sˆ  t |ƒ}|tjkrd S yt | ¡ ¡d }W nX tk
r„   yt |ƒ}W n tk
r\   d S X d|  krrdkr|n n|}nd S Y nX |d kr’d}|d kržd}|d krªd}t | ƒ} t |ƒ}t |ƒ}t |ƒ}|dk r0t t ¡ ¡d }|d }	|}
|| |	 }|	|
 }	t	|	ƒdkr0|	dkr(|d }n|d }t
||| ||||fƒ}|d k	r„|d kr^d}| ¡ }t|ƒ}|d kr|d S || }|S )Nr   r    r	   iè  éd   é2   r9   )rA   r-   ZMAXYEARÚMONTHS_LOWERÚindexÚlowerÚ
ValueErrorÚtimeZ	localtimeÚabsr,   ÚupperrF   )r0   ÚmonÚyrÚhrr*   r+   rC   ZimonZcur_yrrE   Ztmpr3   rD   r   r   r   Ú	_str2timeŽ   sV    

   

 



rS   zV^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$z+^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*aÒ  ^
    (\d\d?)            # day
       (?:\s+|[-\/])
    (\w+)              # month
        (?:\s+|[-\/])
    (\d+)              # year
    (?:
          (?:\s+|:)    # separator before clock
       (\d\d?):(\d\d)  # hour:min
       (?::(\d\d))?    # optional seconds
    )?                 # optional clock
       \s*
    ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
       \s*
    (?:\(\w+\))?       # ASCII representation of timezone in parens.
       \s*$c             C   sÜ   t  | ¡}|rl| ¡ }t |d  ¡ ¡d }t|d ƒ|t|d ƒt|d ƒt|d ƒt|d ƒf}t|ƒS |  	¡ } t
 d| d¡} d gd \}}}}}}	}
t | ¡}|d k	rÄ| ¡ \}}}}}}	}
nd S t||||||	|
ƒS )	Nr   r   r	   r;   é   é   Ú é   )ÚSTRICT_DATE_REr@   ÚgroupsrI   rJ   rK   rA   Úfloatr,   ÚlstripÚ
WEEKDAY_REÚsubÚLOOSE_HTTP_DATE_RErS   )ÚtextrE   ÚgrP   r&   r0   rQ   rR   r*   r+   rC   r   r   r   Ú	http2timeÜ   s    
"
ra   aÆ  ^
    (\d{4})              # year
       [-\/]?
    (\d\d?)              # numerical month
       [-\/]?
    (\d\d?)              # day
   (?:
         (?:\s+|[-:Tt])  # separator before clock
      (\d\d?):?(\d\d)    # hour:min
      (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
   )?                    # optional clock
      \s*
   ([-+]?\d\d?:?(:?\d\d)?
    |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
      \s*$c       
      C   sd   |   ¡ } d gd \}}}}}}}t | ¡}|d k	rL| ¡ \}}}}}}}}	nd S t|||||||ƒS )NrW   )r[   ÚISO_DATE_REr@   rY   rS   )
r_   r0   rP   rQ   rR   r*   r+   rC   rE   Ú_r   r   r   Úiso2time$  s    
rd   c             C   s*   |   d¡\}}| jd |… | j|d …  S )Nr	   )ÚspanÚstring)ÚmatchÚstartÚendr   r   r   Ú	unmatchedE  s    rj   z^\s*([^=\s;,]+)z&^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"z^\s*=\s*([^\s;,]*)z\\(.)c       
      C   s  g }x | D ]ø}|}g }xÜ|rôt  |¡}|rªt|ƒ}| d¡}t |¡}|rlt|ƒ}| d¡}t d|¡}n.t |¡}|r–t|ƒ}| d¡}| ¡ }nd }| 	||f¡ q| 
¡  d¡rÜ| 
¡ dd … }|rÖ| 	|¡ g }qt dd|¡\}}	|}qW |r| 	|¡ qW |S )Nr   z\1ú,z^[=\s;]*rV   )ÚHEADER_TOKEN_REr@   rj   rB   ÚHEADER_QUOTED_VALUE_REÚHEADER_ESCAPE_REr]   ÚHEADER_VALUE_REÚrstripÚappendr[   Ú
startswithÚreÚsubn)
Zheader_valuesÚresultr_   Z	orig_textÚpairsrE   ÚnameÚvalueZnon_junkZnr_junk_charsr   r   r   Úsplit_header_wordsN  s>    .






 
 ry   z([\"\\])c             C   s„   g }xt| D ]l}g }xN|D ]F\}}|d k	rTt  d|¡sHt d|¡}d| }d||f }| |¡ qW |r
| d |¡¡ q
W d |¡S )Nz^\w+$z\\\1z"%s"z%s=%sz; z, )rs   r@   ÚHEADER_JOIN_ESCAPE_REr]   rq   Újoin)ZlistsÚheadersrv   ÚattrÚkÚvr   r   r   Újoin_header_words¤  s    
 r€   c             C   s0   |   d¡r| dd … } |  d¡r,| d d… } | S )Nú"r   éÿÿÿÿ)rr   Úendswith)r_   r   r   r   Ústrip_quotes½  s
    

r„   c             C   s   d}g }xò| D ]ê}g }d}xÀt | d¡ƒD ]®\}}| ¡ }| d¡\}}	}
| ¡ }|sd|dkr*P nq*|	rp|
 ¡ nd }
|dkrÊ| ¡ }||kr|}|dkr®|
d k	r¨t|
ƒ}
d}n|dkrÊ|
d k	rÊtt|
ƒƒ}
| ||
f¡ q*W |r|sî| d	¡ | |¡ qW |S )
N)ÚexpiresÚdomainÚpathÚsecureÚversionÚportzmax-ageFú;ú=r	   r‰   Tr…   )r‰   Ú0)Ú	enumerateÚsplitÚstripÚ	partitionrK   r„   ra   rq   )Z
ns_headersZknown_attrsru   Z	ns_headerrv   Úversion_setÚiiZparamÚkeyÚsepÚvalÚlcr   r   r   Úparse_ns_headersÄ  s>    

r˜   z\.\d+$c             C   s:   t  | ¡rdS | dkrdS | d dks2| d dkr6dS dS )NFrV   r	   Ú.r‚   T)ÚIPV4_REr@   )r_   r   r   r   Úis_HDN	  s    
r›   c             C   sl   |   ¡ } |  ¡ }| |krdS t| ƒs(dS |  |¡}|dksB|dkrFdS | d¡sTdS t|dd … ƒshdS dS )NTFr‚   r	   r™   r   )rK   r›   Úrfindrr   )ÚAÚBÚir   r   r   Údomain_match  s    

r    c             C   s   t  | ¡rdS dS )NFT)rš   r@   )r_   r   r   r   Úliberal_is_HDN?  s    
r¡   c             C   s`   |   ¡ } |  ¡ }t| ƒr t|ƒs0| |kr,dS dS | d¡}|rL|  |¡rLdS |s\| |kr\dS dS )NTFr™   )rK   r¡   rr   rƒ   )r   rž   Úinitial_dotr   r   r   Úuser_domain_matchI  s    
r£   z:\d+$c             C   sB   |   ¡ }tj |¡d }|dkr,|  dd¡}t d|d¡}| ¡ S )Nr   rV   ZHost)Úget_full_urlÚurllibÚparseZurlparseZ
get_headerÚcut_port_rer]   rK   )ÚrequestÚurlÚhostr   r   r   Úrequest_host^  s    r«   c             C   s4   t | ƒ }}| d¡dkr,t |¡s,|d }||fS )Nr™   r‚   z.local)r«   Úfindrš   r@   )r¨   ÚerhnÚreq_hostr   r   r   Úeff_request_hostn  s    r¯   c             C   s4   |   ¡ }tj |¡}t|jƒ}| d¡s0d| }|S )Nú/)r¤   r¥   r¦   ZurlsplitÚescape_pathr‡   rr   )r¨   r©   Úpartsr‡   r   r   r   Úrequest_pathy  s    

r³   c             C   s^   | j }| d¡}|dkrV||d d … }yt|ƒ W qZ tk
rR   td|ƒ d S X nt}|S )Nú:r	   r   znonnumeric port: '%s')rª   r¬   rA   rL   r   ÚDEFAULT_HTTP_PORT)r¨   rª   rŸ   rŠ   r   r   r   Úrequest_portƒ  s    

r¶   z%/;:@&=+$,!~*'()z%([0-9a-fA-F][0-9a-fA-F])c             C   s   d|   d¡ ¡  S )Nz%%%sr   )rB   rO   )rg   r   r   r   Úuppercase_escaped_char•  s    r·   c             C   s   t j | t¡} t t| ¡} | S )N)r¥   r¦   ÚquoteÚHTTP_PATH_SAFEÚESCAPED_CHAR_REr]   r·   )r‡   r   r   r   r±   —  s    
r±   c             C   sP   |   d¡}|dkrL| |d d … }|  d¡}t| ƒrL|dksD|dkrLd| S | S )Nr™   r	   r   Zlocal)r¬   r›   )ÚhrŸ   Úbr   r   r   Úreach¥  s    

r½   c             C   s$   t | ƒ}t|t| jƒƒsdS dS d S )NTF)r«   r    r½   Zorigin_req_host)r¨   r®   r   r   r   Úis_third_partyÈ  s    
r¾   c               @   sJ   e Zd Zddd„Zdd„ Zddd„Zd	d
„ Zddd„Zdd„ Zdd„ Z	dS )r   Fc             C   s°   |d k	rt |ƒ}|d k	r$t t|ƒƒ}|d kr<|dkr<tdƒ‚|| _|| _|| _|| _|| _| ¡ | _	|| _
|| _|	| _|
| _|| _|| _|| _|| _|| _|| _t |¡| _d S )NTz-if port is None, port_specified must be false)rA   rZ   rL   r‰   rw   rx   rŠ   Úport_specifiedrK   r†   Údomain_specifiedÚdomain_initial_dotr‡   Úpath_specifiedrˆ   r…   ÚdiscardÚcommentÚcomment_urlÚrfc2109ÚcopyÚ_rest)Úselfr‰   rw   rx   rŠ   r¿   r†   rÀ   rÁ   r‡   rÂ   rˆ   r…   rÃ   rÄ   rÅ   ÚrestrÆ   r   r   r   Ú__init__ë  s.      
zCookie.__init__c             C   s
   || j kS )N)rÈ   )rÉ   rw   r   r   r   Úhas_nonstandard_attr  s    zCookie.has_nonstandard_attrNc             C   s   | j  ||¡S )N)rÈ   Úget)rÉ   rw   Údefaultr   r   r   Úget_nonstandard_attr  s    zCookie.get_nonstandard_attrc             C   s   || j |< d S )N)rÈ   )rÉ   rw   rx   r   r   r   Úset_nonstandard_attr  s    zCookie.set_nonstandard_attrc             C   s,   |d krt   ¡ }| jd k	r(| j|kr(dS dS )NTF)rM   r…   )rÉ   Únowr   r   r   Ú
is_expired  s
     zCookie.is_expiredc             C   sX   | j d krd}n
d| j  }| j| | j }| jd k	rFd| j| jf }n| j}d||f S )NrV   r´   z%s=%sz<Cookie %s for %s>)rŠ   r†   r‡   rx   rw   )rÉ   ÚpÚlimitZ	namevaluer   r   r   Ú__str__"  s    
 

zCookie.__str__c             C   sp   g }x,dD ]$}t | |ƒ}| d|t|ƒf ¡ q
W | dt| jƒ ¡ | dt| jƒ ¡ d| jjd |¡f S )N)r‰   rw   rx   rŠ   r¿   r†   rÀ   rÁ   r‡   rÂ   rˆ   r…   rÃ   rÄ   rÅ   z%s=%szrest=%sz
rfc2109=%sz%s(%s)z, )Úgetattrrq   ÚreprrÈ   rÆ   Ú	__class__Ú__name__r{   )rÉ   r   rw   r}   r   r   r   Ú__repr__,  s    

zCookie.__repr__)F)N)N)
rÙ   Ú
__module__Ú__qualname__rË   rÌ   rÏ   rÐ   rÒ   rÕ   rÚ   r   r   r   r   r   Ù  s   
 


c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r   c             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)rÉ   Úcookier¨   r   r   r   Úset_okD  s    zCookiePolicy.set_okc             C   s
   t ƒ ‚d S )N)rÝ   )rÉ   rÞ   r¨   r   r   r   Ú	return_okM  s    zCookiePolicy.return_okc             C   s   dS )NTr   )rÉ   r†   r¨   r   r   r   Údomain_return_okQ  s    zCookiePolicy.domain_return_okc             C   s   dS )NTr   )rÉ   r‡   r¨   r   r   r   Úpath_return_okV  s    zCookiePolicy.path_return_okN)rÙ   rÛ   rÜ   rß   rà   rá   râ   r   r   r   r   r   ;  s   		c               @   sö   e Zd ZdZdZdZdZeeB Zdddddddddeddf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„ 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-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdS )6r   r   r   rT   r	   NTFc             C   sp   || _ || _|| _|| _|| _|| _|	| _|
| _|| _|| _	|d k	rPt
|ƒ| _nd| _|d k	rft
|ƒ}|| _d S )Nr   )ÚnetscapeÚrfc2965Úrfc2109_as_netscapeÚhide_cookie2Ústrict_domainÚstrict_rfc2965_unverifiableÚstrict_ns_unverifiableÚstrict_ns_domainÚstrict_ns_set_initial_dollarÚstrict_ns_set_pathÚtupleÚ_blocked_domainsÚ_allowed_domains)rÉ   Úblocked_domainsÚallowed_domainsrã   rä   rå   ræ   rç   rè   ré   rê   rë   rì   r   r   r   rË   f  s     zDefaultCookiePolicy.__init__c             C   s   | j S )N)rî   )rÉ   r   r   r   rð   ‡  s    z#DefaultCookiePolicy.blocked_domainsc             C   s   t |ƒ| _d S )N)rí   rî   )rÉ   rð   r   r   r   Úset_blocked_domainsŠ  s    z'DefaultCookiePolicy.set_blocked_domainsc             C   s"   x| j D ]}t||ƒrdS qW dS )NTF)rî   r£   )rÉ   r†   Zblocked_domainr   r   r   Ú
is_blockedŽ  s    
zDefaultCookiePolicy.is_blockedc             C   s   | j S )N)rï   )rÉ   r   r   r   rñ   ”  s    z#DefaultCookiePolicy.allowed_domainsc             C   s   |d k	rt |ƒ}|| _d S )N)rí   rï   )rÉ   rñ   r   r   r   Úset_allowed_domains—  s    z'DefaultCookiePolicy.set_allowed_domainsc             C   s0   | j d krdS x| j D ]}t||ƒrdS qW dS )NFT)rï   r£   )rÉ   r†   Zallowed_domainr   r   r   Úis_not_allowed  s    

z"DefaultCookiePolicy.is_not_allowedc             C   sB   t d|j|jƒ x,dD ]$}d| }t| |ƒ}|||ƒsdS qW dS )Nz - checking cookie %s=%s)r‰   Úverifiabilityrw   r‡   r†   rŠ   Zset_ok_FT)r   rw   rx   rÖ   )rÉ   rÞ   r¨   ÚnÚfn_nameÚfnr   r   r   rß   ¥  s    


zDefaultCookiePolicy.set_okc             C   sZ   |j d krtd|j|jƒ dS |j dkr:| js:tdƒ dS |j dkrV| jsVtdƒ dS dS )Nz0   Set-Cookie2 without version attribute (%s=%s)Fr	   z$   RFC 2965 cookies are switched offz$   Netscape cookies are switched offT)r‰   r   rw   rx   rä   rã   )rÉ   rÞ   r¨   r   r   r   Úset_ok_version¸  s    
z"DefaultCookiePolicy.set_ok_versionc             C   sJ   |j rFt|ƒrF|jdkr*| jr*tdƒ dS |jdkrF| jrFtdƒ dS dS )Nr	   z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)Úunverifiabler¾   r‰   rè   r   ré   )rÉ   rÞ   r¨   r   r   r   Úset_ok_verifiabilityÇ  s    z(DefaultCookiePolicy.set_ok_verifiabilityc             C   s0   |j dkr,| jr,|j d¡r,td|jƒ dS dS )Nr	   ú$z'   illegal name (starts with '$'): '%s'FT)r‰   rë   rw   rr   r   )rÉ   rÞ   r¨   r   r   r   Úset_ok_nameÓ  s
    zDefaultCookiePolicy.set_ok_namec             C   sL   |j rHt|ƒ}|jdks(|jdkrH| jrH|  |j|¡sHtd|j|ƒ dS dS )Nr	   z7   path attribute %s is not a prefix of request path %sFT)rÂ   r³   r‰   rì   râ   r‡   r   )rÉ   rÞ   r¨   Úreq_pathr   r   r   Úset_ok_pathÜ  s    

zDefaultCookiePolicy.set_ok_pathc             C   sê  |   |j¡rtd|jƒ dS |  |j¡r8td|jƒ dS |jræt|ƒ\}}|j}| jrÌ| d¡dkrÌ| d¡}| dd|¡}|dkrÌ||d d … }||d |… }	|	 	¡ dkrÌt
|ƒdkrÌtd	|ƒ dS | d¡rä|dd … }
n|}
|
 d¡dk}|s|d
krtd|ƒ dS |jdkrX| |¡sX| d¡sXd|  |¡sXtd||ƒ dS |jdksr| j| j@ rŽt||ƒsŽtd||ƒ dS |jdks¨| j| j@ ræ|d t
|ƒ … }| d¡dkræt |¡sætd||ƒ dS dS )Nz"   domain %s is in user block-listFz&   domain %s is not in user allow-listr™   r   r	   r   )ÚcoZacZcomZeduZorgZnetZgovZmilrA   ZaeroZbizÚcatZcoopÚinfoZjobsZmobiZmuseumrw   ZproZtravelÚeuz&   country-code second level domain %sz.localz/   non-local domain %s contains no embedded dotzO   effective request-host %s (even with added initial dot) does not end with %sz5   effective request-host %s does not domain-match %sz.   host prefix %s for domain %s contains a dotT)ró   r†   r   rõ   rÀ   r¯   rç   Úcountrœ   rK   Úlenrr   r¬   r‰   rƒ   rê   ÚDomainRFC2965Matchr    ÚDomainStrictNoDotsrš   r@   )rÉ   rÞ   r¨   r®   r­   r†   rŸ   ÚjZtldZsldZundotted_domainZembedded_dotsZhost_prefixr   r   r   Úset_ok_domainç  sb    


z!DefaultCookiePolicy.set_ok_domainc          	   C   s†   |j r‚t|ƒ}|d krd}nt|ƒ}x\|j d¡D ]:}yt|ƒ W n tk
r`   td|ƒ dS X ||kr2P q2W td||jƒ dS dS )NÚ80rk   z   bad port %s (not numeric)Fz$   request port (%s) not found in %sT)r¿   r¶   ÚstrrŠ   r   rA   rL   r   )rÉ   rÞ   r¨   Úreq_portrÓ   r   r   r   Úset_ok_port"  s"    

zDefaultCookiePolicy.set_ok_portc             C   sB   t d|j|jƒ x,dD ]$}d| }t| |ƒ}|||ƒsdS qW dS )Nz - checking cookie %s=%s)r‰   rö   rˆ   r…   rŠ   r†   Z
return_ok_FT)r   rw   rx   rÖ   )rÉ   rÞ   r¨   r÷   rø   rù   r   r   r   rà   7  s    	


zDefaultCookiePolicy.return_okc             C   s<   |j dkr| jstdƒ dS |j dkr8| js8tdƒ dS dS )Nr	   z$   RFC 2965 cookies are switched offFz$   Netscape cookies are switched offT)r‰   rä   r   rã   )rÉ   rÞ   r¨   r   r   r   Úreturn_ok_versionI  s    z%DefaultCookiePolicy.return_ok_versionc             C   sJ   |j rFt|ƒrF|jdkr*| jr*tdƒ dS |jdkrF| jrFtdƒ dS dS )Nr	   z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)rû   r¾   r‰   rè   r   ré   )rÉ   rÞ   r¨   r   r   r   Úreturn_ok_verifiabilityR  s    z+DefaultCookiePolicy.return_ok_verifiabilityc             C   s    |j r|jdkrtdƒ dS dS )NZhttpsz(   secure cookie with non-secure requestFT)rˆ   Útyper   )rÉ   rÞ   r¨   r   r   r   Úreturn_ok_secure^  s    z$DefaultCookiePolicy.return_ok_securec             C   s   |  | j¡rtdƒ dS dS )Nz   cookie expiredFT)rÒ   Ú_nowr   )rÉ   rÞ   r¨   r   r   r   Úreturn_ok_expiresd  s    z%DefaultCookiePolicy.return_ok_expiresc             C   sP   |j rLt|ƒ}|d krd}x0|j  d¡D ]}||kr(P q(W td||j ƒ dS dS )Nr  rk   z0   request port %s does not match cookie port %sFT)rŠ   r¶   r   r   )rÉ   rÞ   r¨   r  rÓ   r   r   r   Úreturn_ok_portj  s    
z"DefaultCookiePolicy.return_ok_portc             C   s®   t |ƒ\}}|j}|r*| d¡s*d| }n|}|jdkr^| j| j@ r^|js^||kr^tdƒ dS |jdkr‚t||ƒs‚td||ƒ dS |jdkrªd|  	|¡sªtd||ƒ dS dS )Nr™   r	   zQ   cookie with unspecified domain does not string-compare equal to request domainFzQ   effective request-host name %s does not domain-match RFC 2965 cookie domain %sz;   request-host %s does not match Netscape cookie domain %sT)
r¯   r†   rr   r‰   rê   ÚDomainStrictNonDomainrÀ   r   r    rƒ   )rÉ   rÞ   r¨   r®   r­   r†   Ú	dotdomainr   r   r   Úreturn_ok_domainx  s&    

z$DefaultCookiePolicy.return_ok_domainc             C   s˜   t |ƒ\}}| d¡sd| }| d¡s0d| }|rH| d¡sHd| }n|}| |¡sd| |¡sddS |  |¡r|td|ƒ dS |  |¡r”td|ƒ dS dS )Nr™   Fz"   domain %s is in user block-listz&   domain %s is not in user allow-listT)r¯   rr   rƒ   ró   r   rõ   )rÉ   r†   r¨   r®   r­   r  r   r   r   rá   “  s"    






z$DefaultCookiePolicy.domain_return_okc             C   sb   t d|ƒ t|ƒ}t|ƒ}||kr&dS | |¡rR| d¡sN|||d … dkrRdS t d||ƒ dS )Nz- checking cookie path=%sTr°   r   z  %s does not path-match %sF)r   r³   r  rr   rƒ   )rÉ   r‡   r¨   rÿ   Úpathlenr   r   r   râ   ­  s    

z"DefaultCookiePolicy.path_return_ok)rÙ   rÛ   rÜ   r  r  r  ZDomainLiberalZDomainStrictrË   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   \  sJ   	;	c             C   s   t |  ¡ ƒ}t| j|ƒS )N)ÚsortedÚkeysÚmaprÍ   )Zadictr  r   r   r   Úvals_sorted_by_keyº  s    r  c          	   c   sZ   t | ƒ}xL|D ]D}d} y
|j W n tk
r4   Y nX d} t|ƒE d H  | s|V  qW d S )NFT)r  ÚitemsÚAttributeErrorÚ
deepvalues)ÚmappingÚvaluesÚobjr   r   r   r   ¾  s    

r   c               @   s   e Zd ZdS )ÚAbsentN)rÙ   rÛ   rÜ   r   r   r   r   r$  Ð  s    r$  c               @   sø   e Zd Ze d¡Ze d¡Ze d¡Ze d¡Ze d¡Z	e dej
¡Zd2d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„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd3d$d%„Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z dS )4r   z\Wz([\"\\])z\.?[^.]*z[^.]*z^\.+z^\#LWP-Cookies-(\d+\.\d+)Nc             C   s(   |d krt ƒ }|| _t ¡ | _i | _d S )N)r   Ú_policyÚ
_threadingÚRLockÚ_cookies_lockÚ_cookies)rÉ   Úpolicyr   r   r   rË   á  s
    
zCookieJar.__init__c             C   s
   || _ d S )N)r%  )rÉ   r*  r   r   r   Ú
set_policyé  s    zCookieJar.set_policyc             C   s”   g }| j  ||¡sg S td|ƒ | j| }xd| ¡ D ]X}| j  ||¡sHq4|| }x:| ¡ D ].}| j  ||¡svtdƒ qZtdƒ | |¡ qZW q4W |S )Nz!Checking %s for cookies to returnz   not returning cookiez   it's a match)	r%  rá   r   r)  r  râ   r"  rà   rq   )rÉ   r†   r¨   ÚcookiesZcookies_by_pathr‡   Zcookies_by_namerÞ   r   r   r   Ú_cookies_for_domainì  s     

zCookieJar._cookies_for_domainc             C   s.   g }x$| j  ¡ D ]}| |  ||¡¡ qW |S )N)r)  r  Úextendr-  )rÉ   r¨   r,  r†   r   r   r   Ú_cookies_for_requestþ  s    zCookieJar._cookies_for_requestc       	      C   sF  |j dd„ dd d}g }x$|D ]}|j}|sLd}|dkrL| d| ¡ |jd k	r~| j |j¡r~|dkr~| j d|j¡}n|j}|jd krœ| |j¡ n| d	|j|f ¡ |dkr"|j	rÎ| d
|j
 ¡ |j d¡r|j}|js| d¡r|dd … }| d| ¡ |jd k	r"d}|jr4|d|j  }| |¡ q"W |S )Nc             S   s
   t | jƒS )N)r  r‡   )Úar   r   r   Ú<lambda>  ó    z)CookieJar._cookie_attrs.<locals>.<lambda>T)r”   ÚreverseFr	   z$Version=%sz\\\1z%s=%sz
$Path="%s"r™   r   z$Domain="%s"z$Portz="%s")Úsortr‰   rq   rx   Únon_word_rer@   Úquote_rer]   rw   rÂ   r‡   r†   rr   rÁ   rŠ   r¿   )	rÉ   r,  r’   ÚattrsrÞ   r‰   rx   r†   rÓ   r   r   r   Ú_cookie_attrs  s>    



zCookieJar._cookie_attrsc             C   sº   t dƒ | j ¡  zŽtt ¡ ƒ | j_| _|  |¡}|  |¡}|r^| 	d¡s^| 
dd |¡¡ | jjrž| jjsž| 	d¡sžx$|D ]}|jdkr~| 
dd¡ P q~W W d | j ¡  X |  ¡  d S )NÚadd_cookie_headerr   z; ZCookie2r   z$Version="1")r   r(  ÚacquirerA   rM   r%  r  r/  r8  Z
has_headerZadd_unredirected_headerr{   rä   ræ   r‰   ÚreleaseÚclear_expired_cookies)rÉ   r¨   r,  r7  rÞ   r   r   r   r9  @  s$    







zCookieJar.add_cookie_headerc          
   C   s  g }d}d}x||D ]r}|d \}}d}d}	i }
i }x4|dd … D ]"\}}|  ¡ }||ksh||krl|}||kr€|d kr€d}||
krŠqF|dkr°|d kr¨tdƒ d}	P |  ¡ }|d	krÐ|r¾qF|d krÐtd
ƒ qF|dkrd}yt|ƒ}W n$ tk
r   tdƒ d}	P Y nX d	}| j| }||ks2||krb|d krX|dkrXtd| ƒ d}	P ||
|< qF|||< qFW |	rvq| |||
|f¡ qW |S )N)rÃ   rˆ   )r‰   r…   zmax-ager†   r‡   rŠ   rÄ   Ú
commenturlr	   Fr   Tr†   z%   missing value for domain attributer…   zM   missing or invalid value for expires attribute: treating as session cookiezmax-agez?   missing or invalid (non-numeric) value for max-age attribute)rŠ   rÄ   r=  z!   missing value for %s attribute)rK   r   rA   rL   r  rq   )rÉ   Ú	attrs_setÚcookie_tuplesÚboolean_attrsÚvalue_attrsZcookie_attrsrw   rx   Zmax_age_setZ
bad_cookieÚstandardrÊ   r~   r   r—   r   r   r   Ú_normalized_cookie_tuplesa  sf    





z#CookieJar._normalized_cookie_tuplesc             C   s$  |\}}}}|  dt¡}|  dt¡}|  dt¡}	|  dt¡}
|  dd ¡}|d k	rryt|ƒ}W n tk
rp   d S X |  dd¡}|  dd¡}|  d	d ¡}|  d
d ¡}|tk	rÀ|dkrÀd}t|ƒ}nXd}t|ƒ}| d¡}|dkr|dkrö|d |… }n|d |d … }t|ƒdkrd}|tk	}d}|r8t| 	d¡ƒ}|tkrTt
|ƒ\}}|}n| 	d¡shd| }d}|	tk	rž|	d krŠt|ƒ}	nd}t dd|	¡}	nd }	|
tkr¶d }
d}nH|
| jkrþy|  |||¡ W n tk
rê   Y nX td|||ƒ d S t||||	||||||||
||||ƒS )Nr†   r‡   rŠ   r…   r‰   rˆ   FrÃ   rÄ   r=  rV   Tr°   r‚   r	   r   r™   z\s+z2Expiring cookie, domain='%s', path='%s', name='%s')rÍ   r$  rA   rL   r±   r³   rœ   r  Úboolrr   r¯   r¶   rs   r]   r  ÚclearÚKeyErrorr   r   )rÉ   Útupr¨   rw   rx   rB  rÊ   r†   r‡   rŠ   r…   r‰   rˆ   rÃ   rÄ   rÅ   rÂ   rŸ   rÀ   rÁ   r®   r­   r¿   r   r   r   Ú_cookie_from_cookie_tupleÂ  s‚    


 





z#CookieJar._cookie_from_cookie_tuplec             C   s:   |   |¡}g }x&|D ]}|  ||¡}|r| |¡ qW |S )N)rC  rH  rq   )rÉ   r>  r¨   r?  r,  rG  rÞ   r   r   r   Ú_cookies_from_attrs_set  s    

 z!CookieJar._cookies_from_attrs_setc             C   sL   t | jdd ƒ}|d kr | jj }x&|D ]}|jdkr&d|_|r&d|_q&W d S )Nrå   r   Tr	   )rÖ   r%  rä   r‰   rÆ   )rÉ   r,  Zrfc2109_as_nsrÞ   r   r   r   Ú_process_rfc2109_cookies'  s    


z"CookieJar._process_rfc2109_cookiesc             C   s(  |  ¡ }| dg ¡}| dg ¡}| jj}| jj}|s8|rP|s@|rP|sH|rP|sT|sTg S y|  t|ƒ|¡}W n tk
r†   tƒ  g }Y nX |r$|r$y|  t	|ƒ|¡}	W n tk
rÆ   tƒ  g }	Y nX |  
|	¡ |ri }
x |D ]}d |
|j|j|jf< qâW |
fdd„}t||	ƒ}	|	r$| |	¡ |S )NzSet-Cookie2z
Set-Cookiec             S   s   | j | j| jf}||kS )N)r†   r‡   rw   )Z	ns_cookieÚlookupr”   r   r   r   Úno_matching_rfc2965_  s    z3CookieJar.make_cookies.<locals>.no_matching_rfc2965)r  Zget_allr%  rä   rã   rI  ry   Ú	Exceptionr   r˜   rJ  r†   r‡   rw   Úfilterr.  )rÉ   Úresponser¨   r|   Zrfc2965_hdrsZns_hdrsrä   rã   r,  Z
ns_cookiesrK  rÞ   rL  r   r   r   Úmake_cookies3  sB    





zCookieJar.make_cookiesc             C   sN   | j  ¡  z2tt ¡ ƒ | j_| _| j ||¡r:|  |¡ W d | j  ¡  X d S )N)	r(  r:  rA   rM   r%  r  rß   Ú
set_cookier;  )rÉ   rÞ   r¨   r   r   r   Úset_cookie_if_oki  s    
zCookieJar.set_cookie_if_okc             C   sl   | j }| j ¡  zJ|j|kr&i ||j< ||j }|j|krDi ||j< ||j }|||j< W d | j ¡  X d S )N)r)  r(  r:  r†   r‡   rw   r;  )rÉ   rÞ   ÚcZc2Zc3r   r   r   rQ  v  s    

 


 

zCookieJar.set_cookiec             C   s|   t d| ¡ ƒ | j ¡  zRtt ¡ ƒ | j_| _x6|  ||¡D ]&}| j 	||¡r>t d|ƒ |  
|¡ q>W W d | j ¡  X d S )Nzextract_cookies: %sz setting cookie: %s)r   r  r(  r:  rA   rM   r%  r  rP  rß   rQ  r;  )rÉ   rO  r¨   rÞ   r   r   r   Úextract_cookiesƒ  s    

zCookieJar.extract_cookiesc             C   st   |d k	r2|d ks|d kr t dƒ‚| j| | |= n>|d k	rX|d krJt dƒ‚| j| |= n|d k	rj| j|= ni | _d S )Nz8domain and path must be given to remove a cookie by namez.domain must be given to remove cookies by path)rL   r)  )rÉ   r†   r‡   rw   r   r   r   rE  ‘  s    
zCookieJar.clearc             C   sH   | j  ¡  z,x&| D ]}|jr|  |j|j|j¡ qW W d | j  ¡  X d S )N)r(  r:  rÃ   rE  r†   r‡   rw   r;  )rÉ   rÞ   r   r   r   Úclear_session_cookies¬  s    

zCookieJar.clear_session_cookiesc             C   sT   | j  ¡  z8t ¡ }x*| D ]"}| |¡r|  |j|j|j¡ qW W d | j  ¡  X d S )N)	r(  r:  rM   rÒ   rE  r†   r‡   rw   r;  )rÉ   rÑ   rÞ   r   r   r   r<  »  s    



zCookieJar.clear_expired_cookiesc             C   s
   t | jƒS )N)r   r)  )rÉ   r   r   r   Ú__iter__Î  s    zCookieJar.__iter__c             C   s   d}x| D ]}|d }q
W |S )Nr	   r   r   )rÉ   rŸ   rÞ   r   r   r   Ú__len__Ñ  s    
 zCookieJar.__len__c             C   s6   g }x| D ]}|  t|ƒ¡ q
W d| jjd |¡f S )Nz<%s[%s]>z, )rq   r×   rØ   rÙ   r{   )rÉ   ÚrrÞ   r   r   r   rÚ   ×  s    
 zCookieJar.__repr__c             C   s6   g }x| D ]}|  t|ƒ¡ q
W d| jjd |¡f S )Nz<%s[%s]>z, )rq   r  rØ   rÙ   r{   )rÉ   rX  rÞ   r   r   r   rÕ   Ü  s    
 zCookieJar.__str__)N)NNN)!rÙ   rÛ   rÜ   rs   Úcompiler5  r6  Zstrict_domain_reZ	domain_reZdots_reÚASCIIÚmagic_rerË   r+  r-  r/  r8  r9  rC  rH  rI  rJ  rP  rR  rQ  rT  rE  rU  r<  rV  rW  rÚ   rÕ   r   r   r   r   r   Ò  s6   





;!a\	6
c               @   s   e Zd ZdS )r   N)rÙ   rÛ   rÜ   r   r   r   r   r   ã  s    c               @   s4   e Zd Zddd„Zddd„Zddd„Zdd	d
„ZdS )r   NFc             C   sJ   t  | |¡ |d k	r6y|d  W n   tdƒ‚Y nX || _t|ƒ| _d S )NrV   zfilename must be string-like)r   rË   rL   ÚfilenamerD  Ú	delayload)rÉ   r\  r]  r*  r   r   r   rË   è  s    zFileCookieJar.__init__c             C   s
   t ƒ ‚d S )N)rÝ   )rÉ   r\  Úignore_discardÚignore_expiresr   r   r   Úsave÷  s    zFileCookieJar.savec          	   C   sJ   |d kr"| j d k	r| j }nttƒ‚t|ƒ}|  ||||¡ W d Q R X d S )N)r\  rL   ÚMISSING_FILENAME_TEXTÚopenÚ_really_load)rÉ   r\  r^  r_  r   r   r   r   Úloadû  s    
 
zFileCookieJar.loadc             C   s„   |d kr"| j d k	r| j }nttƒ‚| j ¡  zFt | j¡}i | _y|  |||¡ W n t	k
rn   || _‚ Y nX W d | j 
¡  X d S )N)r\  rL   ra  r(  r:  rÇ   Zdeepcopyr)  rd  ÚOSErrorr;  )rÉ   r\  r^  r_  Z	old_stater   r   r   Úrevert  s    
 
zFileCookieJar.revert)NFN)NFF)NFF)NFF)rÙ   rÛ   rÜ   rË   r`  rd  rf  r   r   r   r   r   å  s
   


	 c             C   s$  | j | jfd| jfd| jfg}| jd k	r8| d| jf¡ | jrH| d¡ | jrX| d¡ | jrh| d¡ | j	rx| d¡ | j
r–| dtt| j
ƒƒf¡ | jr¦| d	¡ | jr¼| d
| jf¡ | jrÒ| d| jf¡ t| j ¡ ƒ}x$|D ]}| |t| j| ƒf¡ qæW | dt| jƒf¡ t|gƒS )Nr‡   r†   rŠ   )Ú	path_specN)Ú	port_specN)Ú
domain_dotN)rˆ   Nr…   )rÃ   NrÄ   r=  r‰   )rw   rx   r‡   r†   rŠ   rq   rÂ   r¿   rÁ   rˆ   r…   r5   rZ   rÃ   rÄ   rÅ   r  rÈ   r  r  r‰   r€   )rÞ   r»   r  r~   r   r   r   Úlwp_cookie_str  s6    

  
 
 
 
  
  
rj  c               @   s(   e Zd Zd
dd„Zddd„Zdd	„ ZdS )r   Tc             C   sX   t   ¡ }g }x:| D ]2}|s"|jr"q|s2| |¡r2q| dt|ƒ ¡ qW d |dg ¡S )NzSet-Cookie3: %sÚ
rV   )rM   rÃ   rÒ   rq   rj  r{   )rÉ   r^  r_  rÑ   rX  rÞ   r   r   r   Ú
as_lwp_strH  s    

zLWPCookieJar.as_lwp_strNFc          	   C   sX   |d kr"| j d k	r| j }nttƒ‚t|dƒ"}| d¡ | |  ||¡¡ W d Q R X d S )NÚwz#LWP-Cookies-2.0
)r\  rL   ra  rb  Úwriterl  )rÉ   r\  r^  r_  r   r   r   r   r`  X  s    
 
zLWPCookieJar.savec             C   sD  |  ¡ }| j |¡s$d| }t|ƒ‚t ¡ }d}d}	d}
yÂxº|  ¡ }|dkrRP | |¡s^q@|t|ƒd …  ¡ }x€t|gƒD ]p}|d \}}i }i }x|	D ]}d||< q W x€|dd … D ]p\}}|d k	rØ| 	¡ }nd }||
ksì||	krð|}||	kr|d krd	}|||< q¾||
kr&|||< q¾|||< q¾W |j
}|d
ƒ}|dƒ}|d k	rZt|ƒ}|d krhd	}|dƒ}| d¡}t|dƒ|||dƒ|dƒ|||dƒ|dƒ|dƒ|dƒ|||dƒ|dƒ|ƒ}|sÔ|jrÔq€|sè| |¡rèq€|  |¡ q€W q@W W nB tk
r   ‚ Y n, tk
r>   tƒ  td||f ƒ‚Y nX d S )Nz5%r does not look like a Set-Cookie3 (LWP) format filezSet-Cookie3:)rh  rg  ri  rˆ   rÃ   )r‰   rŠ   r‡   r†   r…   rÄ   r=  rV   r	   Fr   Tr…   rÃ   r†   r™   r‰   rŠ   rh  ri  r‡   rg  rˆ   rÄ   r=  z&invalid Set-Cookie3 format file %r: %r)Úreadliner[  r@   r   rM   rr   r  r   ry   rK   rÍ   rd   r   rÃ   rÒ   rQ  re  rM  r   )rÉ   r   r\  r^  r_  Úmagicr   rÑ   Úheaderr@  rA  ÚlineÚdatarw   rx   rB  rÊ   r~   r   r—   r»   r…   rÃ   r†   rÀ   rS  r   r   r   rc  d  s„     




 






zLWPCookieJar._really_load)TT)NFF)rÙ   rÛ   rÜ   rl  r`  rc  r   r   r   r   r   ;  s   

c               @   s,   e Zd Ze d¡ZdZdd„ Zd	dd„ZdS )
r   z#( Netscape)? HTTP Cookie Filezr# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

c             C   sd  t   ¡ }| ¡ }| j |¡s(td| ƒ‚yôxî| ¡ }|dkr>P | d¡rT|d d… }| ¡  d¡s,| ¡ dkrpq,| d¡\}}	}
}}}}|dk}|	dk}	|dkr¨|}d }| d¡}d	}|dkrÆd }d
}t	d||d d	||	||
d	|||d d i ƒ}|sø|j
røq,|s| |¡rq,|  |¡ q,W W nB tk
r4   ‚ Y n, tk
r^   tƒ  td||f ƒ‚Y nX d S )Nz4%r does not look like a Netscape format cookies filerV   rk  r‚   )ú#rý   ú	ÚTRUEr™   FTr	   z+invalid Netscape format cookies file %r: %r)rM   ro  r[  r@   r   rƒ   r   rr   r   r   rÃ   rÒ   rQ  re  rM  r   )rÉ   r   r\  r^  r_  rÑ   rp  rr  r†   rÀ   r‡   rˆ   r…   rw   rx   r¢   rÃ   rS  r   r   r   rc  Ú  s`     
 

zMozillaCookieJar._really_loadNFc             C   s  |d kr"| j d k	r| j }nttƒ‚t|dƒÌ}| | j¡ t ¡ }x°| D ]¨}|sX|jrXqH|sh| |¡rhqH|j	rtd}nd}|j
 d¡rŠd}nd}|jd k	r¤t|jƒ}	nd}	|jd kr¾d}
|j}n|j}
|j}| d |j
||j||	|
|g¡d ¡ qHW W d Q R X d S )Nrm  rv  ZFALSEr™   rV   ru  rk  )r\  rL   ra  rb  rn  rq  rM   rÃ   rÒ   rˆ   r†   rr   r…   r  rx   rw   r{   r‡   )rÉ   r\  r^  r_  r   rÑ   rÞ   rˆ   r¢   r…   rw   rx   r   r   r   r`    s<    
 

  

zMozillaCookieJar.save)NFF)	rÙ   rÛ   rÜ   rs   rY  r[  rq  rc  r`  r   r   r   r   r   ³  s   
A)N)N)VÚ__all__rÇ   r-   rs   rM   Zurllib.parser¥   Zurllib.requestZ	threadingr&  Zhttp.clientZhttpZcalendarr
   r   r   r   r  ZclientZ	HTTP_PORTrµ   ra  r   r%   r,   r6   r7   rI   r(   rq   rK   r5   r8   r>   rY  rZ  r?   rF   rS   rX   ÚIr\   ÚXr^   ra   rb   rd   rj   rl   rm   ro   rn   ry   rz   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   re  r   r   rj  r   r   r   r   r   r   Ú<module>   s¨   

 

88!



U
D'


#b!  `    :x