o
    [hS                     @   s<  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZ edd	d
gZG dd dZG dd deZG dd dZG dd deZG dd dejZG dd deZG dd deZG dd dZG dd deZG dd dejeef ZG dd  d eZG d!d" d"eZdS )#    N)
namedtuple)Sequence)shlex)SplitResult	parse_qsl	urlencodeurlsplit)run_in_threadpool)ScopeAddresshostportc                	   @   s  e Zd Z	d0dededejddfddZede	fd	d
Z
edefddZedefddZedefddZedefddZedefddZedejdef fddZedejdef fddZedejdef fddZedeje fddZedefddZdejdd fd d!Zdejdd fd"d#Zdejdd fd$d%Zd&ejeeje f dd fd'd(Zd)ejdefd*d+Zdefd,d-Zdefd.d/Z dS )1URL Nurlscope
componentsreturnc                 K   sF  |d ur|r
J d|rJ d| dd}| dd }| dd|d  }| d	d
}d }|d D ]\}	}
|	dkrA|
d} nq2|d urP| d| | }n.|d u rW|}n'|\}}ddddd| }||krr| d| | }n| d| d| | }|r|d|  7 }n|r|rJ dtdjdi |j }|| _d S )Nz"Cannot set both "url" and "scope".z+Cannot set both "scope" and "**components".schemehttpserver	root_pathr   pathquery_string    headerss   hostlatin-1z://P   i  )r   httpswswss:?z)Cannot set both "url" and "**components". )getdecoder   replacer   geturl_url)selfr   r   r   r   r   r   r   Zhost_headerkeyvaluer   r   default_portr#   r#   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/starlette/datastructures.py__init__   s:   

zURL.__init__c                 C   s   t | dst| j| _| jS )N_components)hasattrr   r(   r/   r)   r#   r#   r-   r   4   s   
zURL.componentsc                 C      | j jS N)r   r   r1   r#   r#   r-   r   :      z
URL.schemec                 C   r2   r3   )r   netlocr1   r#   r#   r-   r5   >   r4   z
URL.netlocc                 C   r2   r3   )r   r   r1   r#   r#   r-   r   B   r4   zURL.pathc                 C   r2   r3   )r   queryr1   r#   r#   r-   r6   F   r4   z	URL.queryc                 C   r2   r3   )r   fragmentr1   r#   r#   r-   r7   J   r4   zURL.fragmentc                 C   r2   r3   )r   usernamer1   r#   r#   r-   r8   N   r4   zURL.usernamec                 C   r2   r3   )r   passwordr1   r#   r#   r-   r9   R   r4   zURL.passwordc                 C   r2   r3   )r   hostnamer1   r#   r#   r-   r:   V   r4   zURL.hostnamec                 C   r2   r3   )r   r   r1   r#   r#   r-   r   Z   r4   zURL.portc                 C   s
   | j dv S )N)r   r    )r   r1   r#   r#   r-   	is_secure^      
zURL.is_securekwargsc           	      K   s   d|v sd|v sd|v sd|v rU| d| j}| d| j}| d| j}| d| j}|}|d ur9|d| 7 }|d urQ|}|d urJ|d| 7 }| d| }||d< | jjdi |}| | S )	Nr8   r9   r:   r   r!   @r5   r#   )	popr:   r   r8   r9   r   _replace	__class__r'   )	r)   r=   r:   r   r8   r9   r5   Zuserpassr   r#   r#   r-   r&   b   s&   zURL.replacec                 K   sB   t t| jdd}|dd | D  t| }| j|dS )NTkeep_blank_valuesc                 S      i | ]\}}t |t |qS r#   str.0r*   r+   r#   r#   r-   
<dictcomp>~       z,URL.include_query_params.<locals>.<dictcomp>r6   )	MultiDictr   r6   updateitemsr   multi_itemsr&   )r)   r=   paramsr6   r#   r#   r-   include_query_params|   s   zURL.include_query_paramsc                 K   s"   t dd | D }| j|dS )Nc                 S       g | ]\}}t |t |fqS r#   rE   rG   r#   r#   r-   
<listcomp>        z,URL.replace_query_params.<locals>.<listcomp>rK   )r   rN   r&   )r)   r=   r6   r#   r#   r-   replace_query_params      zURL.replace_query_paramskeysc                 C   sP   t |tr|g}tt| jdd}|D ]}||d  qt| }| j|dS )NTrB   rK   )	
isinstancerF   rL   r   r6   r?   r   rO   r&   )r)   rW   rP   r*   r6   r#   r#   r-   remove_query_params   s   
zURL.remove_query_paramsotherc                 C   s   t | t |kS r3   rE   r)   rZ   r#   r#   r-   __eq__      z
URL.__eq__c                 C      | j S r3   )r(   r1   r#   r#   r-   __str__      zURL.__str__c                 C   s6   t | }| jrt | jdd}| jj dt| dS )Nz********)r9   ())rF   r9   r&   rA   __name__repr)r)   r   r#   r#   r-   __repr__   s   zURL.__repr__)r   N)!rc   
__module____qualname__rF   r
   typingAnyr.   propertyr   r   r   r5   r   r6   r7   Unionr8   r9   r:   Optionalintr   boolr;   r&   rQ   rU   r   rY   r\   r_   re   r#   r#   r#   r-   r      sX    
%
r   c                	   @   sd   e Zd ZdZddedededd fddZddedededd	fd
dZdejee	f defddZ
d	S )URLPathz
    A URL path string that may also hold an associated protocol and/or host.
    Used by the routing to return `url_path_for` matches.
    r   r   protocolr   r   c                 C   s   |dv sJ t | |S )N)r   	websocketr   )rF   __new__)clsr   rp   r   r#   r#   r-   rr      s   zURLPath.__new__Nc                 C   s   || _ || _d S r3   )rp   r   )r)   r   rp   r   r#   r#   r-   r.      s   
zURLPath.__init__base_urlc                 C   s|   t |tr	t|}| jrddddddd| j |j }n|j}| jr(| j}n|j}|j	dt|  }tt|||dS )	Nr   r   )TFr    r   )r   rq   /)r   r5   r   )
rX   rF   r   rp   r;   r   r   r5   r   rstrip)r)   rt   r   r5   r   r#   r#   r-   make_absolute_url   s    
zURLPath.make_absolute_url)r   r   )rc   rf   rg   __doc__rF   rr   r.   rh   rk   r   rw   r#   r#   r#   r-   ro      s
     ro   c                   @   s:   e Zd ZdZdefddZdefddZdefdd	Zd
S )Secretz
    Holds a string value that should not be revealed in tracebacks etc.
    You should cast the value to `str` at the point it is required.
    r+   c                 C   s
   || _ d S r3   _valuer)   r+   r#   r#   r-   r.         
zSecret.__init__r   c                 C   s   | j j}| dS )Nz('**********')rA   rc   )r)   
class_namer#   r#   r-   re      s   
zSecret.__repr__c                 C   r^   r3   rz   r1   r#   r#   r-   r_      r`   zSecret.__str__N)rc   rf   rg   rx   rF   r.   re   r_   r#   r#   r#   r-   ry      s
    ry   c                   @   s   e Zd Zdejeeje f fddZdefddZ	dejee
f dejfdd	Zdeje fd
dZdefddZdefddZdS )CommaSeparatedStringsr+   c                 C   sD   t |trt|dd}d|_d|_dd |D | _d S t|| _d S )NT)posix,c                 S   s   g | ]}|  qS r#   )striprH   itemr#   r#   r-   rS          z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)rX   rF   r   
whitespacewhitespace_split_itemslist)r)   r+   splitterr#   r#   r-   r.      s   
zCommaSeparatedStrings.__init__r   c                 C   
   t | jS r3   )lenr   r1   r#   r#   r-   __len__   r}   zCommaSeparatedStrings.__len__indexc                 C   
   | j | S r3   )r   )r)   r   r#   r#   r-   __getitem__   r}   z!CommaSeparatedStrings.__getitem__c                 C   r   r3   )iterr   r1   r#   r#   r-   __iter__   r}   zCommaSeparatedStrings.__iter__c                 C   s&   | j j}dd | D }| d|dS )Nc                 S   s   g | ]}|qS r#   r#   r   r#   r#   r-   rS      s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>ra   rb   r~   r)   r   rN   r#   r#   r-   re      s   zCommaSeparatedStrings.__repr__c                 C   s   d dd | D S )N, c                 S   s   g | ]}t |qS r#   )rd   r   r#   r#   r-   rS      r   z1CommaSeparatedStrings.__str__.<locals>.<listcomp>)joinr1   r#   r#   r-   r_         zCommaSeparatedStrings.__str__N)rc   rf   rg   rh   rk   rF   r   r.   rm   r   sliceri   r   Iteratorr   re   r_   r#   r#   r#   r-   r      s    	r   c                   @   s:  e Zd Zdejd ejejejejejf  f dejddfddZ	dejdeje
 fdd	Zdejfd
dZdejfddZdejfddZdejeje
e
f  fddZd"dejdejdejfddZdejde
fddZdejdefddZdejej fddZdefddZdejdefddZde
fd d!ZdS )#ImmutableMultiDictargsr=   r   Nc                 O   s   t |dk s
J d|r|d }ng }|r!t| t|  }|s&g }n9t|dr8tt|}t| }n't|drKttj|}t| }nttj	tj
tjtjf  |}t|}dd |D | _|| _d S )N   Too many arguments.r   rO   rN   c                 S   s   i | ]\}}||qS r#   r#   rH   kvr#   r#   r-   rI     s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   rO   r0   rh   castr   MappingrN   ListTupleri   _dict_list)r)   r   r=   r+   r   r#   r#   r-   r.      s.   	





zImmutableMultiDict.__init__r*   c                    s    fdd| j D S )Nc                       g | ]
\}}| kr|qS r#   r#   rH   item_key
item_valuer*   r#   r-   rS         z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   r)   r*   r#   r   r-   getlist  r   zImmutableMultiDict.getlistc                 C   
   | j  S r3   )r   rW   r1   r#   r#   r-   rW     r}   zImmutableMultiDict.keysc                 C   r   r3   )r   valuesr1   r#   r#   r-   r     r}   zImmutableMultiDict.valuesc                 C   r   r3   )r   rN   r1   r#   r#   r-   rN     r}   zImmutableMultiDict.itemsc                 C   r   r3   r   r   r1   r#   r#   r-   rO   !  r}   zImmutableMultiDict.multi_itemsdefaultc                 C   s   || j v r
| j | S |S r3   r   r)   r*   r   r#   r#   r-   r$   $  s   

zImmutableMultiDict.getc                 C   r   r3   r   r   r#   r#   r-   r   )  r}   zImmutableMultiDict.__getitem__c                 C   s
   || j v S r3   r   r   r#   r#   r-   __contains__,  r}   zImmutableMultiDict.__contains__c                 C      t |  S r3   r   rW   r1   r#   r#   r-   r   /     zImmutableMultiDict.__iter__c                 C   r   r3   )r   r   r1   r#   r#   r-   r   2  r}   zImmutableMultiDict.__len__rZ   c                 C   s$   t || jsdS t| jt|jkS NF)rX   rA   sortedr   r[   r#   r#   r-   r\   5  s   zImmutableMultiDict.__eq__c                 C   s    | j j}|  }| d|dS Nra   rb   )rA   rc   rO   r   r#   r#   r-   re   :     zImmutableMultiDict.__repr__r3   )rc   rf   rg   rh   rk   r   r   r   ri   r.   rF   r   KeysViewrW   
ValuesViewr   	ItemsViewrN   rO   r$   r   rn   r   r   r   rm   r   r\   re   r#   r#   r#   r-   r      s2    
'r   c                   @   s  e Zd ZdejdejddfddZdejddfddZddejd	ejdejfd
dZdejfddZ	dejdej
fddZdddZddejd	ejdejfddZdejdej
ddfddZdejdejddfddZdejd ejej
ejejejf  f dejddfddZdS )rL   r*   r+   r   Nc                 C   s   |  ||g d S r3   )setlistr)   r*   r+   r#   r#   r-   __setitem__A  s   zMultiDict.__setitem__c                    s"    fdd| j D | _ | j = d S )Nc                        g | ]\}}| kr||fqS r#   r#   r   r   r#   r-   rS   E  rT   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r#   r   r-   __delitem__D  rV   zMultiDict.__delitem__r   c                    s$    fdd| j D | _ | j |S )Nc                    r   r#   r#   r   r   r#   r-   rS   I  rT   z!MultiDict.pop.<locals>.<listcomp>)r   r   r?   r   r#   r   r-   r?   H  s   zMultiDict.popc                    s,   | j  \ } fdd| jD | _ |fS )Nc                    r   r#   r#   r   r   r#   r-   rS   N  rT   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r|   r#   r   r-   r   L  s   zMultiDict.popitemc                    s"    fdd| j D }|   |S )Nc                    r   r#   r#   r   r   r#   r-   rS   R  r   z%MultiDict.poplist.<locals>.<listcomp>)r   r?   )r)   r*   r   r#   r   r-   poplistQ  s   
zMultiDict.poplistc                 C   s   | j   | j  d S r3   )r   clearr   r1   r#   r#   r-   r   V  s   
zMultiDict.clearc                 C   s*   || vr|| j |< | j||f | | S r3   )r   r   appendr   r#   r#   r-   
setdefaultZ  s   
zMultiDict.setdefaultr   c                    sR   |s
|   d  d S  fdd| jD }| fdd|D  | _|d | j < d S )Nc                    r   r#   r#   r   r   r#   r-   rS   e  rT   z%MultiDict.setlist.<locals>.<listcomp>c                    s   g | ]} |fqS r#   r#   )rH   r+   r   r#   r-   rS   f  r   )r?   r   r   )r)   r*   r   existing_itemsr#   r   r-   r   a  s
   zMultiDict.setlistc                 C   s   | j ||f || j|< d S r3   )r   r   r   r   r#   r#   r-   r   i  s   zMultiDict.appendr   r=   c                    s@   t |i |  fdd| jD }|   | _| j  d S )Nc                    s$   g | ]\}}|   vr||fqS r#   )rW   r   r+   r#   r-   rS   w  s   $ z$MultiDict.update.<locals>.<listcomp>)rL   r   rO   r   rM   )r)   r   r=   r   r#   r   r-   rM   m  s   	zMultiDict.updater3   r   N)rc   rf   rg   rh   ri   r   r   r?   r   r   r   r   r   r   r   r   rk   r   rM   r#   r#   r#   r-   rL   @  s,    
rL   c                       sr   e Zd ZdZdejdejejejej	ej	f  e
ef dej	ddf fddZde
fd	d
Zde
fddZ  ZS )QueryParamsz!
    An immutable multidict.
    r   r   r=   r   Nc                    s   t |dk s
J d|r|d ng }t|tr&t jt|ddfi | n t|tr=t jt|dddfi | n	t j|i | dd | jD | _d	d
 | j	
 D | _	d S )Nr   r   r   TrB   r   c                 S   rR   r#   rE   r   r#   r#   r-   rS     rT   z(QueryParams.__init__.<locals>.<listcomp>c                 S   rD   r#   rE   r   r#   r#   r-   rI     rJ   z(QueryParams.__init__.<locals>.<dictcomp>)r   rX   rF   superr.   r   bytesr%   r   r   rN   )r)   r   r=   r+   rA   r#   r-   r.     s   

zQueryParams.__init__c                 C   r   r3   )r   r   r1   r#   r#   r-   r_     r}   zQueryParams.__str__c                 C   s    | j j}t| }| d|dS r   )rA   rc   rF   )r)   r   r   r#   r#   r-   re     r   zQueryParams.__repr__)rc   rf   rg   rx   rh   rk   r   r   r   ri   rF   r   r.   r_   re   __classcell__r#   r#   r   r-   r   |  s$    	
r   c                	   @   s   e Zd ZdZdZ	ddedejdeddfd	d
Ze	de
fddZdejeef ddfddZddedejeef fddZdeddfddZdddZdS )
UploadFilez@
    An uploaded file included as part of the request data.
    i   Nr   filenamefilecontent_typer   c                 C   s,   || _ || _|d u rtj| jd}|| _d S )N)max_size)r   r   tempfileSpooledTemporaryFilespool_max_sizer   )r)   r   r   r   r#   r#   r-   r.     s
   
zUploadFile.__init__c                 C   s   t | jdd}| S )N_rolledT)getattrr   )r)   Zrolled_to_diskr#   r#   r-   
_in_memory  s   zUploadFile._in_memorydatac                    0   | j r| j| d S t| jj|I d H  d S r3   )r   r   writer	   )r)   r   r#   r#   r-   r        zUploadFile.writer   sizec                    s(   | j r
| j|S t| jj|I d H S r3   )r   r   readr	   )r)   r   r#   r#   r-   r     s   zUploadFile.readoffsetc                    r   r3   )r   r   seekr	   )r)   r   r#   r#   r-   r     r   zUploadFile.seekc                    s,   | j r| j  d S t| jjI d H  d S r3   )r   r   closer	   r1   r#   r#   r-   r     s   zUploadFile.close)Nr   )r   r   )rc   rf   rg   rx   r   rF   rh   IOr.   rj   rn   r   rk   r   r   rm   r   r   r   r#   r#   r#   r-   r     s&    
	r   c                
       s|   e Zd ZdZdejd ejeejeef f ej	ej
eejeef f  f dejeef ddf fddZd
dd	Z  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    r   r=   r   Nc                    s   t  j|i | d S r3   )r   r.   )r)   r   r=   r   r#   r-   r.     s   	zFormData.__init__c                    s0   |   D ]\}}t|tr| I d H  qd S r3   )rO   rX   r   r   r   r#   r#   r-   r     s   
zFormData.closer   )rc   rf   rg   rx   rh   rk   r   rF   r   r   r   r.   r   r   r#   r#   r   r-   r     s    r   c                	   @   s^  e Zd ZdZ			d'dejeef dejeje	e	f  de
ddfddZedejeje	e	f  fd	d
Zdeje fddZdeje fddZdejejeef  fddZd(dedejdejfddZdedeje fddZd)ddZdedefddZdejdefddZdejej fddZdefd d!Zd"ejdefd#d$Zdefd%d&ZdS )*Headersz3
    An immutable, case-insensitive multidict.
    Nr   rawr   r   c                 C   s   g | _ |d ur#|d u sJ d|d u sJ ddd | D | _ d S |d ur4|d u s/J d|| _ d S |d ur?|d | _ d S d S )Nz$Cannot set both "headers" and "raw".z&Cannot set both "headers" and "scope".c                 S   s(   g | ]\}}|  d |d fqS r   )lowerencoderG   r#   r#   r-   rS     s    z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r   )r   rN   )r)   r   r   r   r#   r#   r-   r.     s   
zHeaders.__init__c                 C   r   r3   r   r1   r#   r#   r-   r      r<   zHeaders.rawc                 C      dd | j D S )Nc                 S   s   g | ]	\}}| d qS r   r%   rG   r#   r#   r-   rS         z Headers.keys.<locals>.<listcomp>r   r1   r#   r#   r-   rW     r]   zHeaders.keysc                 C   r   )Nc                 S   s   g | ]	\}}| d qS r   r   rG   r#   r#   r-   rS     r   z"Headers.values.<locals>.<listcomp>r   r1   r#   r#   r-   r     r]   zHeaders.valuesc                 C   r   )Nc                 S   s$   g | ]\}}| d | d fqS r   r   rG   r#   r#   r-   rS     s    z!Headers.items.<locals>.<listcomp>r   r1   r#   r#   r-   rN   
  s   zHeaders.itemsr*   r   c                 C   s"   z| | W S  t y   | Y S w r3   )KeyErrorr   r#   r#   r-   r$     s
   
zHeaders.getc                    s"   |  d  fdd| jD S )Nr   c                    s"   g | ]\}}| kr| d qS r   r   r   get_header_keyr#   r-   rS     s
    z#Headers.getlist.<locals>.<listcomp>r   r   r   r   r#   r   r-   r     s   
zHeaders.getlistMutableHeadersc                 C   s   t | jd d  dS )N)r   )r   r   r1   r#   r#   r-   mutablecopy  r   zHeaders.mutablecopyc                 C   s<   |  d}| jD ]\}}||kr|d  S q
t|)Nr   )r   r   r   r%   r   r)   r*   r   Z
header_keyheader_valuer#   r#   r-   r   !  s   zHeaders.__getitem__c                 C   s0   |  d}| jD ]\}}||kr dS q
dS )Nr   TFr   r   r#   r#   r-   r   (  s   zHeaders.__contains__c                 C   r   r3   r   r1   r#   r#   r-   r   /  r   zHeaders.__iter__c                 C   r   r3   )r   r   r1   r#   r#   r-   r   2  r}   zHeaders.__len__rZ   c                 C   s"   t |tsdS t| jt|jkS r   )rX   r   r   r   r[   r#   r#   r-   r\   5  s   
zHeaders.__eq__c                 C   sF   | j j}t|  }t|t| kr| d|dS | d| jdS )Nra   rb   z(raw=)rA   rc   dictrN   r   r   )r)   r   as_dictr#   r#   r-   re   :  s
   zHeaders.__repr__)NNNr3   )r   r   )rc   rf   rg   rx   rh   r   rF   r   r   r   r
   r.   rj   r   rW   r   rN   ri   r$   r   r   r   rn   r   r   r   rm   r   r\   re   r#   r#   r#   r-   r     s8    
 
r   c                   @   s   e Zd ZdededdfddZdeddfddZedejej	e
e
f  fd	d
ZdededefddZdeddfddZdededdfddZdeddfddZdS )r   r*   r+   r   Nc           	      C   s   |  d}|d}g }t| jD ]\}\}}||kr"|| qt|dd D ]}| j|= q+|rA|d }||f| j|< dS | j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r      Nr   r   r   	enumerater   r   reversed)	r)   r*   r+   set_key	set_valueZfound_indexesidxr   r   r#   r#   r-   r   C  s   


zMutableHeaders.__setitem__c                 C   sV   |  d}g }t| jD ]\}\}}||kr|| qt|D ]}| j|= q"dS )z*
        Remove the header `key`.
        r   Nr   )r)   r*   Zdel_keyZpop_indexesr  r   r   r#   r#   r-   r   Y  s   

zMutableHeaders.__delitem__c                 C   r^   r3   r   r1   r#   r#   r-   r   g  s   zMutableHeaders.rawc                 C   sZ   |  d}|d}t| jD ]\}\}}||kr"|d  S q| j||f |S )zo
        If the header `key` does not exist, then set it to `value`.
        Returns the header value.
        r   )r   r   r   r   r%   r   )r)   r*   r+   r   r  r  r   r   r#   r#   r-   r   k  s   
zMutableHeaders.setdefaultrZ   c                 C   s   |  D ]\}}|| |< qd S r3   )rN   )r)   rZ   r*   valr#   r#   r-   rM   y  s   
zMutableHeaders.updatec                 C   s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r   N)r   r   r   r   )r)   r*   r+   Z
append_keyZappend_valuer#   r#   r-   r   }  s   
zMutableHeaders.appendvaryc                 C   s,   |  d}|d urd||g}|| d< d S )Nr  r   )r$   r   )r)   r  existingr#   r#   r-   add_vary_header  s   
zMutableHeaders.add_vary_header)rc   rf   rg   rF   r   r   rj   rh   r   r   r   r   r   r   rM   r   r  r#   r#   r#   r-   r   B  s     r   c                       sn   e Zd ZdZddejf fddZdejdejddfd	d
ZdejdejfddZ	dejddfddZ
  ZS )Statezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    Nstatec                    s"   |d u ri }t t| d| d S )N_state)r   r  __setattr__)r)   r  r   r#   r-   r.     s   zState.__init__r*   r+   r   c                 C   s   || j |< d S r3   r	  r   r#   r#   r-   r
    s   zState.__setattr__c                 C   s4   z| j | W S  ty   d}t|| jj|w )Nz!'{}' object has no attribute '{}')r	  r   AttributeErrorformatrA   rc   )r)   r*   messager#   r#   r-   __getattr__  s   zState.__getattr__c                 C   s   | j |= d S r3   r  r   r#   r#   r-   __delattr__  r   zState.__delattr__r3   )rc   rf   rg   rx   rh   Dictr.   ri   r
  r  r  r   r#   r#   r   r-   r    s    r  ) r   rh   collectionsr   collections.abcr   r   urllib.parser   r   r   r   Zstarlette.concurrencyr	   Zstarlette.typesr
   r   r   rF   ro   ry   r   r   r   rL   r   r   r   r   r   objectr  r#   r#   r#   r-   <module>   s,     "S<(-[J