
    g1                     $   U 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Zd dl	Z	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mZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(m)Z)m*Z+ ddl,m-Z- dd	l m.Z.m/Z/m0Z0 dd
l1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZF dZGerddlHmIZI eeJeJf   ZKneLZKe
j                  dk  re
j                  j                  d      rePfne
j                  dk  reQfndZR eS eTeU e+j                  d      dd             ZWee#eUdf      eXd<    e	j                  d      ZZee eJ      eXd<    e	j                  d      Z[ee eJ      eXd<    e	j                  d       Z]eeJ   eXd!<   eeAgeeeD      f   Z^e#ed"   e!eJ   f   Z_ ej                  ej                  d#$      Za G d% d&e%d'(      Zb G d) d*e"ed+         Zc G d, d+e j                        Ze G d- d"eKe.      Zf G d. d/ef      Zgd0eAd1dfd2Zh G d3 d4ec      Zi G d5 d6ei      Zj G d7 d8ei      Zk G d9 d:ec      Zl G d; d<el      Zm G d= d>el      Zn G d? d@e j                        Zo G dA dBeo      Zp G dC dDep      Zq G dE dFen      Zr G dG dHee      Zs G dI dJee      Zt G dK dLe0      Zu G dM dNe"eec   eec         Zv G dO dPe"eee   eee         Zw G dQ dRe/eeJecf         ZxdSeJd1eJfdTZydSeJd1eJfdUZzdSeJd1eJfdVZ{y)W    N)wraps)Path)MappingProxyType)TYPE_CHECKINGAny	AwaitableCallable	ContainerDictFinal	GeneratorIterableIteratorListMappingNoReturnOptionalPatternSetSizedTupleType	TypedDictUnioncast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUG)HttpVersion11)HandlerPathLike)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application)   
   win32)r<       .   .YARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$HTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ROUTE_RE/PATH_SEPr2   T)quotec                       e Zd ZU eed<   eed<   ee   ed<   eed<   eed<   eedf   ed<   ded	<   eed
<   ded<   eed<   y)	_InfoDictpath	formatterpattern	directoryprefixr7   routesr;   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r'   r@       N/var/www/openai/venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.pyrJ   rJ   h   sG    
INS\OKC())	K
  !!r[   rJ   F)totalc                   b   e Zd Zdddee   ddfdZedee   fd       Zeej                  defd              Z
ej                  dedefd	       Zej                  d
edefd       Zej                  deddfd       Zej                  defd       ZddZej                  dedefd       Zy)r3   Nnamer`   returnc                    || _         y N_nameselfr`   s     r\   __init__zAbstractResource.__init__|   s	    
r[   c                     | j                   S rc   rd   rg   s    r\   r`   zAbstractResource.name       zzr[   c                      y)zWExposes the resource's canonical path.

        For example '/foo/bar/{name}'

        Nr@   rj   s    r\   	canonicalzAbstractResource.canonical       r[   kwargsc                      y)z2Construct url for resource with additional params.Nr@   )rg   ro   s     r\   url_forzAbstractResource.url_for   rn   r[   requestc                    K   yw)zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        Nr@   rg   rr   s     r\   resolvezAbstractResource.resolve           rO   c                      y)zWAdd a prefix to processed URLs.

        Required for subapplications support.
        Nr@   rg   rO   s     r\   
add_prefixzAbstractResource.add_prefix   rn   r[   c                      yz;Return a dict with additional info useful for introspectionNr@   rj   s    r\   get_infozAbstractResource.get_info   rn   r[   c                      y rc   r@   rj   s    r\   freezezAbstractResource.freeze   s    r[   rK   c                      y)z Perform a raw match against pathNr@   rg   rK   s     r\   	raw_matchzAbstractResource.raw_match   rn   r[   ra   N)rV   rW   rX   r   rY   rh   propertyr`   abcabstractmethodrm   r   rq   r-   _Resolveru   rz   rJ   r}   r   boolr   r@   r[   r\   r3   r3   {   s1   04    hsm   3    	A A A A 	W    	    	J) J J 	/c /d / /r[   r3   r7   c                   @   e Zd Zddddedeeee   f   dee	   dee
   ddf
dZedefd	       Zedefd
       Zeej                   dee   fd              Zedee
   fd       Zej                   defd       Zej                   dededefd       Zdedee   fdZy)r7   Nexpect_handlerresourcemethodhandlerr   r   ra   c                `   |t         }t        j                  |      s
J d|       |j                         }t        j                  |      st        | d      t        |      sJ |       t        j                  |      rnt        j                  |      rt        j                  dt               n_t        |t              rt        |t               rn>t        j                  dt               t#        |      dt$        dt&        ffd       }||}|| _        || _        || _        || _        y )NzCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesrr   ra   c                    K    |       }t        j                  |      r
| d {   }t        |t              sJ |S 7 wrc   )asyncioiscoroutine
isinstancer/   )rr   resultold_handlers     r\   handler_wrapperz/AbstractRoute.__init__.<locals>.handler_wrapper   s@     $W-&&v.#)\F!&.999 *s   #A?A)_default_expect_handlerr   iscoroutinefunctionupperrD   match
ValueErrorcallableinspectisgeneratorfunctionwarningswarnDeprecationWarningr   type
issubclassr"   r   r-   r/   _method_handler_expect_handler	_resource)rg   r   r   r   r   r   r   s         @r\   rh   zAbstractRoute.__init__   s&    !4N**
 	<((:;	< 
 ##F+x'BCDD )') &&w/((1MMH" &:g|+LMM?AS 7^w >   "K%G-!r[   c                     | j                   S rc   )r   rj   s    r\   r   zAbstractRoute.method       ||r[   c                     | j                   S rc   )r   rj   s    r\   r   zAbstractRoute.handler   s    }}r[   c                      y)z8Optional route's name, always equals to resource's name.Nr@   rj   s    r\   r`   zAbstractRoute.name   rn   r[   c                     | j                   S rc   )r   rj   s    r\   r   zAbstractRoute.resource   s    ~~r[   c                      yr|   r@   rj   s    r\   r}   zAbstractRoute.get_info   rn   r[   argsro   c                      y)/Construct url for route with additional params.Nr@   rg   r   ro   s      r\   rq   zAbstractRoute.url_for   rn   r[   rr   c                 @   K   | j                  |       d {   S 7 wrc   )r   rt   s     r\   handle_expect_headerz"AbstractRoute.handle_expect_header   s     ))'2222s   )rV   rW   rX   rY   r   r%   r   r"   r   _ExpectHandlerr3   rh   r   r   r   r   r   r`   r   rJ   r}   r   rq   r-   r/   r   r@   r[   r\   r7   r7      sL    48/31"1" w\ 2231"
 !01" +,1" 
1"f       Ghsm G  G (#34   	J) J J 	>S >C >C > >3' 3h~>V 3r[   c                       e Zd ZdZdeeef   deddf fdZede	fd       Z
edefd       Zedefd	       Zedee   fd
       ZdefdZeded   fd       ZddZedd       Zej.                  dd       ZddZdef fdZ xZS )r2   )_route_apps_current_app_frozen
match_dictroutera   Nc                 \    t         |   |       || _        g | _        d | _        d| _        y NF)superrh   r   r   r   r   )rg   r   r   	__class__s      r\   rh   zUrlMappingMatchInfo.__init__   s-    $(*
37r[   c                 .    | j                   j                  S rc   )r   r   rj   s    r\   r   zUrlMappingMatchInfo.handler  s    {{"""r[   c                     | j                   S rc   )r   rj   s    r\   r   zUrlMappingMatchInfo.route
  s    {{r[   c                 .    | j                   j                  S rc   )r   r   rj   s    r\   r   z"UrlMappingMatchInfo.expect_handler  s    {{///r[   c                      y rc   r@   rj   s    r\   rU   z"UrlMappingMatchInfo.http_exception      r[   c                 6    | j                   j                         S rc   )r   r}   rj   s    r\   r}   zUrlMappingMatchInfo.get_info  s    {{##%%r[   )r;   .c                 ,    t        | j                        S rc   )tupler   rj   s    r\   appszUrlMappingMatchInfo.apps  s    TZZ  r[   c                     | j                   rt        d      | j                  || _        | j                  j	                  d|       y )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertrg   rQ   s     r\   add_appzUrlMappingMatchInfo.add_app  s=    <<NOO$ #D

!S!r[   c                 &    | j                   }|J |S rc   )r   r   s     r\   current_appzUrlMappingMatchInfo.current_app$  s    
r[   c                     t         r3|| j                  vr%t        dj                  | j                  |            || _        y )Nz1Expected one of the following apps {!r}, got {!r})r#   r   r   formatr   r   s     r\   r   zUrlMappingMatchInfo.current_app*  s?    $**$"GNN

C 
  r[   c                     d| _         y )NT)r   rj   s    r\   r   zUrlMappingMatchInfo.freeze5  s	    r[   c                 B    dt         |           d| j                   dS )Nz<MatchInfo z: >)r   __repr__r   rg   r   s    r\   r   zUrlMappingMatchInfo.__repr__8  s%    UW-/04;;-qAAr[   )rQ   r;   ra   N)ra   r;   r   )rV   rW   rX   	__slots__r   rY   r7   rh   r   r%   r   r   r   r   r   r'   rU   rJ   r}   r   r   r   r   setterr   r   __classcell__r   s   @r\   r2   r2      s   >I4S> - D  # # # }   0 0 0  7  &) & !e./ ! !"  
    B# B Br[   c                   N     e Zd ZdZdeddf fdZedefd       ZdefdZ	 xZ
S )MatchInfoError
_exceptionrU   ra   Nc                 Z    || _         t        | 	  i t        | j                                y rc   )r   r   rh   SystemRouterg   rU   r   s     r\   rh   zMatchInfoError.__init__@  s"    ([9:r[   c                     | j                   S rc   r   rj   s    r\   rU   zMatchInfoError.http_exceptionD      r[   c                 v    dj                  | j                  j                  | j                  j                        S )Nz<MatchInfoError {}: {}>)r   r   statusreasonrj   s    r\   r   zMatchInfoError.__repr__H  s.    (//OO""DOO$:$:
 	
r[   )rV   rW   rX   r   r'   rh   r   rU   rY   r   r   r   s   @r\   r   r   <  sB    I;} ; ;   
# 
r[   r   rr   ra   c                 8  K   | j                   j                  t        j                  d      }| j                  t
        k(  rW|j                         dk(  r5| j                  j                  d       d{    d| j                  _	        yt        d|z        y7 &w)zDefault handler for Expect header.

    Just send "100 Continue" to client.
    raise HTTPExpectationFailed if value of header is not "100-continue"
     z100-continues   HTTP/1.1 100 Continue

Nr   zUnknown Expect: %s)text)headersgetr   EXPECTversionr$   lowerwriterwriteoutput_sizer(   )rr   expects     r\   r   r   N  sz      __  b1F-'<<>^+..&&'GHHH)*GNN&'-AF-JKK (Hs   A/B1B2'Bc            	            e Zd Zdddee   ddf fdZdddedeee   e	f   d	ee
   dd
fdZddZdedefdZej"                  dedeeeef      fd       ZdefdZded
   fdZ xZS )r4   Nr_   r`   ra   c                `    t         |   |       i | _        d | _        t	               | _        y )Nr_   )r   rh   _routes
_any_routeset_allowed_methods)rg   r`   r   s     r\   rh   zResource.__init___  s+    d#1337*-%r[   r   r   r   r   r8   c                    | j                   j                  || j                        x}rt        d|j                   d      t        ||| |      }| j                  |       |S )Nz+Added route will never be executed, method z is already registeredr   )r   r   r   r   r   r8   register_route)rg   r   r   r   r   	route_objs         r\   	add_routezResource.add_routee  so     LL$$VT__==5=,, (  "&'4W	I&r[   c                     t        |t              s
J d|       |j                  t        j                  k(  r|| _        | j                  j                  |j                         || j                  |j                  <   y )Nz)Instance of Route class is required, got )	r   r8   r   r   METH_ANYr   r   addr   rg   r   s     r\   r   zResource.register_routew  sm    =
 	A6ui@	A 
 <<4==(#DO!!%,,/%*U\\"r[   rr   c                    K   | j                  |j                  j                        x}d t               fS | j                  j                  |j                  | j                        x}rt        ||      | j                  fS d | j                  fS wrc   )
_matchrel_url	path_safer   r   r   r   r   r2   r   )rg   rr   r   r   s       r\   ru   zResource.resolve  s}     ++goo&?&?@@JI;LL$$W^^T__EE5E&z594;P;PPPT****s   BBrK   c                      y rc   r@   r   s     r\   r  zResource._match  s    r[   c                 ,    t        | j                        S rc   lenr   rj   s    r\   __len__zResource.__len__      4<<  r[   c                 H    t        | j                  j                               S rc   iterr   valuesrj   s    r\   __iter__zResource.__iter__      DLL'')**r[   )r   r8   ra   N)rV   rW   rX   r   rY   rh   r   r   r"   r%   r   r   r   r-   r   ru   r   r   r   r  intr
  r   r  r   r   s   @r\   r4   r4   ^  s    04 0 0 0 48 tL)723
 !0 
$++W + + 	3 8DcN#;  ! !+(?3 +r[   r4   c                        e Zd Zdddedee   ddf fdZedefd       ZddZd	eddfd
Z	dedee
eef      fdZdedefdZdefdZdefdZdefdZ xZS )r5   Nr_   rK   r`   ra   c                ^    t         |   |       |r|j                  d      sJ || _        y )Nr_   rF   )r   rh   
startswith_path)rg   rK   r`   r   s      r\   rh   zPlainResource.__init__  s.    d#4??3///
r[   c                     | j                   S rc   r  rj   s    r\   rm   zPlainResource.canonical  rk   r[   c                 ,    | j                   sd| _         y y )NrF   r  rj   s    r\   r   zPlainResource.freeze  s    zzDJ r[   rO   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ || j                  z   | _        y NrF   r   )r  endswithr	  r  ry   s     r\   rz   zPlainResource.add_prefix  sH      %%%??3'''6{Qdjj(
r[   c                 &    | j                   |k(  ri S y rc   r  r   s     r\   r  zPlainResource._match  s    ::Ir[   c                      | j                   |k(  S rc   r  r   s     r\   r   zPlainResource.raw_match  s    zzT!!r[   c                     d| j                   iS )NrK   r  rj   s    r\   r}   zPlainResource.get_info  s    

##r[   c                 D    t        j                  | j                  d      S NTrK   encoded)r   buildr  rj   s    r\   rq   zPlainResource.url_for  s    yydjj$77r[   c                 h    | j                   d| j                   z   dz   nd}d| d| j                   dS )N'' r   z<PlainResource  r   )r`   r  rf   s     r\   r   zPlainResource.__repr__  s8    )-)>sTYY%B a

|155r[   r   )rV   rW   rX   rY   r   rh   r   rm   r   rz   r   r  r   r   rJ   r}   r   rq   r   r   r   s   @r\   r5   r5     s    ;? S 8C= D 
 3  ) ) )3 8DcN#; "c "d "$) $8 86# 6r[   r5   c                       e Zd Z ej                  d      Z ej                  d      ZdZdddede	e   ddf fd	Z
edefd
       ZdeddfdZdede	eeef      fdZdedefdZdefdZdedefdZdefdZ xZS )r6   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+Nr_   rK   r`   ra   c                   t         	|   |       || _        d}d}t        j	                  |      D ]  }| j
                  j                  |      }|rI|dj                  |j                  d      | j                        z  }|d|j                  d      z   dz   z  }j| j                  j                  |      }|r>| dj                  di |j                         z  }|d|j                  d      z   dz   z  }d|v sd|v rt        d| d	| d
      t        |      }||z  }|t        j                  |      z  }	 	 t        j                   |      }|j$                  j'                  t(              sJ |j'                  d      sJ || _        || _        y # t        j"                  $ r}t        d| d|       d d }~ww xY w)Nr_   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rF   r@   )r   rh   
_orig_pathrE   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrM   r  rG   _pattern
_formatter)
rg   rK   r`   rM   rL   partr   compiledexcr   s
            r\   rh   zDynamicResource.__init__  s   d#	NN4(DHH&&t,E<..u{{5/A499MMS5;;u#55;;	$$..t4E3,33Heoo6GHHS5;;u#55;;	d{cTk >$s4&!CDD &DIryy&G% )(	Jzz'*H **8444##C((( # xx 	J}WIS>?TI	Js   =F F?(F::F?c                     | j                   S rc   )r<  rj   s    r\   rm   zDynamicResource.canonical  r   r[   rO   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ t        j                  t        j
                  |      | j                  j                  z         | _        || j                  z   | _        y r  )	r  r  r	  r7  r9  r8  r;  rM   r<  ry   s     r\   rz   zDynamicResource.add_prefix  sp      %%%??3'''6{Q

299V#4t}}7L7L#LM 4??2r[   c                     | j                   j                  |      }|y |j                         j                         D ci c]  \  }}|t	        |       c}}S c c}}w rc   )r;  r1  r5  items_unquote_path_safe)rg   rK   r   keyvalues        r\   r  zDynamicResource._match  s_    ''-==B__=N=T=T=V
=VzsEC#E**=V
 	
 
s    Ac                      | j                   |k(  S rc   )r.  r   s     r\   r   zDynamicResource.raw_match  s    $&&r[   c                 4    | j                   | j                  dS )N)rL   rM   )r<  r;  rj   s    r\   r}   zDynamicResource.get_info  s    !__GGr[   partsc           
          | j                   j                  |j                         D ci c]  \  }}|t        |       c}}      }t	        j
                  |d      S c c}}w r!  )r<  
format_maprC  _quote_pathr   r$  )rg   rI  kvurls        r\   rq   zDynamicResource.url_for  sO    oo(()V1![^*;)VWyyc400 *Ws   A
c                 |    | j                   d| j                   z   dz   nd}dj                  || j                        S )Nr&  r'  r   z$<DynamicResource {name} {formatter}>)r`   rL   )r`   r   r<  rf   s     r\   r   zDynamicResource.__repr__  s@    )-)>sTYY%B5<< = 
 	
r[   )rV   rW   rX   r7  r9  r0  r4  r3  rY   r   rh   r   rm   rz   r   r  r   r   rJ   r}   r   rq   r   r   r   s   @r\   r6   r6     s    
"**;
<C"**NOKD;?  $S  $8C=  $D  $D 3  3 3 3
3 
8DcN#; 
'c 'd 'H) H1s 1s 1
# 
r[   r6   c                   n     e Zd Zdddedee   ddf fdZedefd       ZdeddfdZdede	fd	Z
 xZS )
PrefixResourceNr_   rO   r`   ra   c                    |r|j                  d      sJ |       |dv s|j                  d      rJ |       t        |   |       t	        |      | _        | j
                  dz   | _        y )NrF   )r   rF   r_   )r  r  r   rh   r6  _prefix_prefix2)rg   rO   r`   r   s      r\   rh   zPrefixResource.__init__	  sh    V..s3;V;3"&//#*>FF>d#$V,s*r[   c                     | j                   S rc   )rT  rj   s    r\   rm   zPrefixResource.canonical  r   r[   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ || j                  z   | _        | j                  dz   | _        y r  )r  r  r	  rT  rU  ry   s     r\   rz   zPrefixResource.add_prefix  sX      %%%??3'''6{Q,s*r[   c                      yr   r@   ry   s     r\   r   zPrefixResource.raw_match  s    r[   )rV   rW   rX   rY   r   rh   r   rm   rz   r   r   r   r   s   @r\   rR  rR    se    =A +s +Xc] +d + 3  + + +  r[   rR  c                   $    e Zd ZdZddddddddededee   d	ee   d
ede	de	de	ddf fdZ
dddedee	   defdZededefd       ZdefdZdeddfdZdedefdZdefdZdee   fdZdedefdZdedefdZdedefd Zdefd!Z  xZ!S )"r9   rN  N   Fr`   r   
chunk_size
show_indexfollow_symlinksappend_versionrO   rN   r`   r   r\  r]  r^  r_  ra   c                   t         
|   ||       	 t        |      j                         j	                  d      }|j                         st        d| d      || _        || _	        || _
        || _        || _        || _        t        d| j                  | |      t        d	| j                  | |      d
| _        t#        | j                         | _        y # t
        $ r}	t        d| d      |	d }	~	ww xY w)Nr_   T)strictr&  z' does not existz' is not a directoryGETr   HEAD)rb  rc  )r   rh   r   
expanduserru   FileNotFoundErrorr   is_dir
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr8   _handler   r   r   )rg   rO   rN   r`   r   r\  r]  r^  r_  r:  r   s             r\   rh   zStaticResource.__init__$  s    	d+	IY224<<D<II !q+?@AA#%% /-- !t||T. "d>	
 !$DLL 1' ! 	Iq+;<=5H	Is   )C 	C7"C22C7)r_  filenamec                N   || j                   }t        |      j                  d      }t        j                  | j
                  d      }t        dk  r||j                  dd      z  }n||z  }|r| j                  j                  |      }	 | j                  rTt        t        j                  j                  |            }|j                  | j                         |j!                         }n+|j!                         }|j                  | j                         |j'                         rZ|j)                  d      5 }|j+                         }d d d        | j-                        }	|j/                  | j0                  |	i      }|S |S # t"        t$        f$ r |cY S w xY w# 1 sw Y   RxY w)NrF   Tr"  r      %%25rb)rk  rY   lstripr   r$  rT  rC   replacerg  joinpathrj  r   osrK   normpathrelative_toru   r   re  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
rg   rm  r_  rO  unresolved_pathnormalized_pathfilepathf
file_byteshs
             r\   rq   zStaticResource.url_forH  sk    !!11Nx='',iiT\\48& ((e44C.C"oo66x@O((&*277+;+;O+L&MO#//@.668H.668H((9
 ! ]]4(A!"J )''
3nnd&6&6%:;

  12  
 )(s   BF 9FFFF$
byte_arrayc                     t        j                         }|j                  |        t        j                  |j                               }|j                  d      S )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r  mb64s      r\   r}  zStaticResource._get_file_hashq  s?    NN	&&qxxz2zz'""r[   c                 J    | j                   | j                  | j                  dS )N)rN   rO   rP   )rg  rT  r   rj   s    r\   r}   zStaticResource.get_infox  s!    llll
 	
r[   r   c                     d| j                   v rt        d      t        d|| | j                        | j                   d<   | j                  j                  d       y )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r8   r   r   r   )rg   r   s     r\   set_options_routez StaticResource.set_options_route  sR    $>??"/wT5I5I#
Y 	!!),r[   rr   c                 d  K   |j                   j                  }|j                  }|j                  | j                        s|| j
                  k7  rd t               fS | j                  }||vrd |fS dt        |t        | j
                        dz   d        i}t        || j                  |         |fS w)Nrm  r   )r  r  r   r  rU  rT  r   r   rD  r	  r2   r   )rg   rr   rK   r   allowed_methodsr   s         r\   ru   zStaticResource.resolve  s     ((t}}-$$,,2F;//((( "4T#dll:Ka:O:Q5R"ST
#JV0DEWWs   B.B0c                 ,    t        | j                        S rc   r  rj   s    r\   r
  zStaticResource.__len__  r  r[   c                 H    t        | j                  j                               S rc   r  rj   s    r\   r  zStaticResource.__iter__  r  r[   c                   K   |j                   d   }t        |      }|j                  r
t               | j                  j                  |      }t        j                         }|j                  d | j                  |       d {   S 7 w)Nrm  )

match_infor   anchorr)   rg  rv  r   get_running_looprun_in_executor_resolve_path_to_response)rg   rr   r  rm  r  loops         r\   rl  zStaticResource._handle  s|     $$Z0=??  /!//228<'')))$00/
 
 	
 
s   B B	BB	r  c                 P   	 | j                   rTt        t        j                  j	                  |            }|j                  | j                         |j                         }n+|j                         }|j                  | j                         	 |j                         r2| j                  rt        | j                  |      d      S t               	 t#        || j$                        S # t        gt        $ r}t               |d}~ww xY w# t         $ r}t               |d}~ww xY w)zFTake the unresolved path and query the file system to form a response.Nz	text/html)r   content_type)r\  )rj  r   rw  rK   rx  ry  rg  ru   r   CIRCULAR_SYMLINK_ERRORr+   rf  rh  r.   _directory_as_htmlr)   PermissionErrorr,   ri  )rg   r  r  	file_pathr:  s        r\   r  z(StaticResource._resolve_path_to_response  s   
	,$$"&rww'7'7'H"I++DOO<+335	+335	%%doo6
	-!###!44Y?%0 
 (/) " I$2B2BCC) 434 	, .e+	,   	-/u,	-s6   BC( 7D 
D (D	9DD		D%D  D%dir_pathc           	      x   |j                         sJ |j                  | j                        j                         }dt	        |       }d| d}g }|j                         }t        |      D ]  }|j                  | j                        j                         }t        | j                   d|       }	|j                         r|j                   d}
n|j                  }
|j                  d|	 dt	        |
       d        dj                  d	j                  |            }d
| d	| d}d| d}d| d	| d}|S )z"returns directory's index as html.z
Index of /z<h1>z</h1>rF   z<li><a href="z">z	</a></li>z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)rf  ry  rg  as_posixhtml_escapeiterdirsortedrL  rT  r`   appendr   join)rg   r  relative_path_to_dirindex_ofh1
index_list	dir_index_filerel_pathquoted_file_url	file_nameulbodyhead_strhtmls                  r\   r  z!StaticResource._directory_as_html  sK      '33DOODMMO,@ ABCH:U#
$$&	I&E((9BBDH)T\\N!H:*FGO ||~$zzl!,	!JJ	0;y3I2J)T ' %%dii
&;<"Rt9-$XJ.?@(2dV95r[   c                     | j                   d| j                   z   dz   nd}dj                  || j                  | j                        S )Nr&  r   z/<StaticResource {name} {path} -> {directory!r}>)r`   rK   rN   )r`   r   rT  rg  rf   s     r\   r   zStaticResource.__repr__  sG    (,		(=sTYY$2@GGDLLDOO H 
 	
r[   )"rV   rW   rX   r  rY   r&   r   r   r  r   rh   r   rq   staticmethodbytesr}  rJ   r}   r%   r  r-   r   ru   r
  r   r7   r  r/   rl  r   r  r  r   r   r   s   @r\   r9   r9   !  sn   K #37$  %$"2"2 "2
 sm"2 !0"2 "2 "2 "2 "2 
"2P *.	' ' !	'
 
'R #5 #S # #
) 
- -T -XW X X! !+(=1 +
W 
 
!D !D. !DF4 C @
# 
r[   r9   c                        e Zd Zdeddddf fdZdeddf fdZdeddfdZd	ed
edefdZde	fdZ
dedefdZdefdZdee   fdZdefdZ xZS )PrefixedSubAppResourcerO   rQ   r;   ra   Nc                 T    t         |   |       || _        | j                  |       y rc   )r   rh   _app_add_prefix_to_resources)rg   rO   rQ   r   s      r\   rh   zPrefixedSubAppResource.__init__  s%     	%%f-r[   c                 F    t         |   |       | j                  |       y rc   )r   rz   r  )rg   rO   r   s     r\   rz   z!PrefixedSubAppResource.add_prefix  s    6"%%f-r[   c                     | j                   j                  }|j                         D ]5  }|j                  |       |j	                  |       |j                  |       7 y rc   )r  router	resourcesunindex_resourcerz   index_resource)rg   rO   r  r   s       r\   r  z/PrefixedSubAppResource._add_prefix_to_resources  sP    !!((*H ##H-'!!(+ +r[   r   ro   c                     t        d      )Nz3.url_for() is not supported by sub-application rootr   r   s      r\   rq   zPrefixedSubAppResource.url_for  s    PQQr[   c                 4    | j                   | j                  dS )N)rQ   rO   )r  rT  rj   s    r\   r}   zPrefixedSubAppResource.get_info	  s    yyDLL99r[   rr   c                 "  K   | j                   j                  j                  |       d {   }|j                  | j                          t	        |j
                  t              r|j
                  j                  }||fS t               }||fS 7 awrc   )	r  r  ru   r   r   rU   r*   r  r   rg   rr   r  methodss       r\   ru   zPrefixedSubAppResource.resolve  s}     99++33G<<
499%j//1EF //??G 7"" eG7"" =s   )BBA"Bc                 \    t        | j                  j                  j                               S rc   )r	  r  r  rP   rj   s    r\   r
  zPrefixedSubAppResource.__len__  s     499##**,--r[   c                 \    t        | j                  j                  j                               S rc   )r  r  r  rP   rj   s    r\   r  zPrefixedSubAppResource.__iter__  s     DII$$++-..r[   c                 P    dj                  | j                  | j                        S )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rO   rQ   )r   rT  r  rj   s    r\   r   zPrefixedSubAppResource.__repr__  s(    =DD<<TYY E 
 	
r[   )rV   rW   rX   rY   rh   rz   r  r   rq   rJ   r}   r-   r   ru   r  r
  r   r7   r  r   r   r   s   @r\   r  r    s    .s . .4 .
. . .,s ,t ,RS RC RC R:) :#W # #. ./(=1 /
# 
r[   r  c                       e Zd Zej                  dedefd       Zej                  defd       Z	e
ej                  defd              Zy)rS   rr   ra   c                    K   yw)z1Return bool if the request satisfies the criteriaNr@   rt   s     r\   r   zAbstractRuleMatching.match"  rv   rw   c                      yr|   r@   rj   s    r\   r}   zAbstractRuleMatching.get_info&  rn   r[   c                      y)zReturn a strNr@   rj   s    r\   rm   zAbstractRuleMatching.canonical*  rn   r[   N)rV   rW   rX   r   r   r-   r   r   rJ   r}   r   rY   rm   r@   r[   r\   rS   rS   !  sy    @7 @t @ @ 	J) J J 3   r[   rS   c                        e Zd Z ej                  d      Zdeddf fdZedefd       Z	dedefdZ
dedefd	Zd
edefdZdefdZ xZS )Domainz(?!-)[a-z\d-]{1,63}(?<!-)rR   ra   Nc                 N    t         |           | j                  |      | _        y rc   )r   rh   
validation_domain)rg   rR   r   s     r\   rh   zDomain.__init__3  s    v.r[   c                     | j                   S rc   r  rj   s    r\   rm   zDomain.canonical7  r   r[   c                     t        |t              st        d      |j                  d      j	                         }|st        d      d|v rt        d      t        d|z         }|j                  J t         fd|j                  j                  d      D              st        d      |j                  d	k(  r|j                  S |j                   d
|j                   S )NzDomain must be strrA   zDomain cannot be emptyz://zScheme not supportedzhttp://c              3   T   K   | ]  }j                   j                  |       ! y wrc   )re_partr1  ).0xrg   s     r\   	<genexpr>z$Domain.validation.<locals>.<genexpr>E  s#     N6M4<<))!,6Ms   %(zDomain not validP   :)r   rY   	TypeErrorrstripr   r   r   raw_hostallr/  port)rg   rR   rO  s   `  r\   r  zDomain.validation;  s    &#&011s#))+566f_344)f$%||'''Ncll6H6H6MNN/0088r><<,,q
++r[   rr   c                    K   |j                   j                  t        j                        }|sy| j	                  |      S wr   )r   r   r   HOSTmatch_domain)rg   rr   hosts      r\   r   zDomain.matchK  s5     ""499-  &&s   >A r  c                 <    |j                         | j                  k(  S rc   )r   r  rg   r  s     r\   r  zDomain.match_domainQ  s    zz|t||++r[   c                     d| j                   iS )NrR   r  rj   s    r\   r}   zDomain.get_infoT  s    $,,''r[   )rV   rW   rX   r7  r9  r  rY   rh   r   rm   r  r-   r   r   r  rJ   r}   r   r   s   @r\   r  r  0  s    bjj56G/s /t / 3  , , , '7 't ', , ,() (r[   r  c                   r     e Zd Z ej                  d      Zdeddf fdZedefd       Z	dede
fdZ xZS )	
MaskDomainz(?!-)[a-z\d\*-]{1,63}(?<!-)rR   ra   Nc                     t         |   |       | j                  j                  dd      j                  dd      }t	        j
                  |      | _        y )NrA   z\.*z.*)r   rh   r  ru  r7  r9  _mask)rg   rR   maskr   s      r\   rh   zMaskDomain.__init__[  sC     ||##C/77TBZZ%
r[   c                 .    | j                   j                  S rc   )r  rM   rj   s    r\   rm   zMaskDomain.canonical`  s    zz!!!r[   r  c                 <    | j                   j                  |      d uS rc   )r  r1  r  s     r\   r  zMaskDomain.match_domaind  s    zz##D)55r[   )rV   rW   rX   r7  r9  r  rY   rh   r   rm   r   r  r   r   s   @r\   r  r  X  sU    bjj78G&s &t &
 "3 " "6 6 6r[   r  c                   ^    e Zd ZdeddddfdZedefd       ZdefdZ	d	e
defd
ZdefdZy)MatchedSubAppResourcerT   rQ   r;   ra   Nc                 X    t         j                  |        d| _        || _        || _        y )Nr   )r3   rh   rT  r  _rule)rg   rT   rQ   s      r\   rh   zMatchedSubAppResource.__init__i  s%    !!$'	
r[   c                 .    | j                   j                  S rc   )r  rm   rj   s    r\   rm   zMatchedSubAppResource.canonicalo  s    zz###r[   c                 4    | j                   | j                  dS )N)rQ   rT   )r  r  rj   s    r\   r}   zMatchedSubAppResource.get_infos  s    yy$**55r[   rr   c                   K   | j                   j                  |       d {   sd t               fS | j                  j                  j                  |       d {   }|j                  | j                         t        |j                  t              r|j                  j                  }||fS t               }||fS 7 7 cwrc   )r  r   r   r  r  ru   r   r   rU   r*   r  r  s       r\   ru   zMatchedSubAppResource.resolvev  s     ZZ%%g...;99++33G<<
499%j//1EF //??G 7"" eG7"" /<s"   C B<8C B>A"C >C c                 "    d| j                   dS )Nz<MatchedSubAppResource -> r   )r  rj   s    r\   r   zMatchedSubAppResource.__repr__  s    +DII=::r[   )rV   rW   rX   rS   rh   r   rY   rm   rJ   r}   r-   r   ru   r   r@   r[   r\   r  r  h  sc    1  $  $3 $ $6) 6	#W 	# 	#;# ;r[   r  c                        e Zd ZdZdddedeeee   f   de	de
e   ddf
 fd	Zdefd
Zede
e   fd       ZdededefdZdefdZ xZS )r8   zA route with resourceNr   r   r   r   r   ra   c                ,    t         |   ||||       y )Nr   )r   rh   )rg   r   r   r   r   r   s        r\   rh   zResourceRoute.__init__  s      	GNX 	 	
r[   c                 f    dj                  | j                  | j                  | j                        S )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r   r   r   )r   r   r   r   rj   s    r\   r   zResourceRoute.__repr__  s.    DKK;; L 
 	
r[   c                 H    | j                   y | j                   j                  S rc   )r   r`   rj   s    r\   r`   zResourceRoute.name  s    >>!~~"""r[   r   ro   c                 V    | j                   J  | j                   j                  |i |S )r   )r   rq   r   s      r\   rq   zResourceRoute.url_for  s.    ~~)))%t~~%%t6v66r[   c                 R    | j                   J | j                   j                         S rc   )r   r}   rj   s    r\   r}   zResourceRoute.get_info  s%    ~~)))~~&&((r[   )rV   rW   rX   __doc__rY   r   r%   r   r"   r3   r   r   rh   r   r   r`   r   rq   rJ   r}   r   r   s   @r\   r8   r8     s     48



 w\ 223

 #	

 !0

 



# 

 #hsm # #
7S 7C 7C 7
)) )r[   r8   c                        e Zd Zdeddf fdZdededefdZede	e   fd       Z
defd	Zd
edefdZedefd       Zedefd       ZdefdZ xZS )r   rU   ra   Nc                 d    t         |   t        j                  | j                         || _        y rc   )r   rh   r   r   rl  _http_exceptionr   s     r\   rh   zSystemRoute.__init__  s"    5-r[   r   ro   c                     t        d      )Nz).url_for() is not allowed for SystemRouter  r   s      r\   rq   zSystemRoute.url_for  s    FGGr[   c                      y rc   r@   rj   s    r\   r`   zSystemRoute.name  r   r[   c                     d| j                   iS )NrU   r  rj   s    r\   r}   zSystemRoute.get_info  s     $"6"677r[   rr   c                 "   K   | j                   wrc   r  rt   s     r\   rl  zSystemRoute._handle  s     """s   c                 .    | j                   j                  S rc   )r  r   rj   s    r\   r   zSystemRoute.status      ##***r[   c                 .    | j                   j                  S rc   )r  r   rj   s    r\   r   zSystemRoute.reason  r  r[   c                 &    dj                  |       S )Nz*<SystemRoute {self.status}: {self.reason}>rj   )r   rj   s    r\   r   zSystemRoute.__repr__  s    ;BBBMMr[   )rV   rW   rX   r'   rh   rY   r   rq   r   r   r`   rJ   r}   r-   r/   rl  r  r   r   r   r   r   s   @r\   r   r     s    .} . .HS HC HC H hsm  8) 8#W # # + + + + + +N# Nr[   r   c                   <    e Zd ZdefdZdeedef   fdZdefdZ	y)r:   ra   c                 B  K   | j                   j                  t        j                  vr| j	                          t        | | j                   j                  j                         d       }|| j	                           |        d {   }t        |t              sJ |S 7 wrc   )	rr   r   r   METH_ALL_raise_allowed_methodsgetattrr   r   r/   )rg   r   rets      r\   _iterz
View._iter  s}     <<dmm3'')t||2288:DA>'')Hn#~...
 s   BBBBNc                 >    | j                         j                         S rc   )r  	__await__rj   s    r\   r  zView.__await__  s    zz|%%''r[   c                     t         j                  D ch c]  }t        | |j                               s|! }}t	        | j
                  j                  |      c c}w rc   )r   r  hasattrr   r*   rr   r   )rg   r  r  s      r\   r  zView._raise_allowed_methods  sF    &*mmPmwtQWWY7O1mP"4<<#6#6HH Qs
   AA)
rV   rW   rX   r/   r  r   r   r  r   r  r@   r[   r\   r:   r:     s4    	^ 	(9S$%>? (I Ir[   r:   c                   P    e Zd Zdee   ddfdZdefdZdee   fdZ	de
defdZy)	ResourcesViewr  ra   Nc                     || _         y rc   
_resources)rg   r  s     r\   rh   zResourcesView.__init__  s	    #r[   c                 ,    t        | j                        S rc   )r	  r%  rj   s    r\   r
  zResourcesView.__len__  s    4??##r[   c              #   8   K   | j                   E d {    y 7 wrc   r$  rj   s    r\   r  zResourcesView.__iter__  s     ??""   r   c                     || j                   v S rc   r$  rg   r   s     r\   __contains__zResourcesView.__contains__  s    4??**r[   )rV   rW   rX   r   r3   rh   r  r
  r   r  objectr   r+  r@   r[   r\   r"  r"    sL    $$'7"8 $T $$ $#(#34 #+V + +r[   r"  c                   L    e Zd Zdee   fdZdefdZdee	   fdZ
dedefdZy)	
RoutesViewr  c                 d    g | _         |D ]$  }|D ]  }| j                   j                  |        & y rc   )r   r  )rg   r  r   r   s       r\   rh   zRoutesView.__init__  s/    ,.!H!##E* " "r[   ra   c                 ,    t        | j                        S rc   r  rj   s    r\   r
  zRoutesView.__len__  r  r[   c              #   8   K   | j                   E d {    y 7 wrc   r   rj   s    r\   r  zRoutesView.__iter__  s     <<r(  r   c                     || j                   v S rc   r2  r  s     r\   r+  zRoutesView.__contains__  s    $$r[   N)rV   rW   rX   r   r3   rh   r  r
  r   r7   r  r,  r   r+  r@   r[   r\   r.  r.    sD    +$'7"8 +! ! (=1  %& %T %r[   r.  c                       e Zd Z ej                  d      Zd4 fdZdedefdZ	de
e   fdZdefdZd	edefd
ZdedefdZdefdZdefdZdeeef   fdZd	eddfdZd	edefdZd	eddfdZd	eddfdZdddedee   defdZ ddddedede!e"e#e$   f   dee   dee%   de&fdZ'ddddddddede(dee   dee%   d ed!ed"ed#edefd$Z)dede"d%e*de&fd&Z+dede"d%e*de&fd'Z,dd(d)dede"dee   d*ed%e*de&fd+Z-dede"d%e*de&fd,Z.dede"d%e*de&fd-Z/dede"d%e*de&fd.Z0dede"d%e*de&fd/Z1dede#e$   d%e*de&fd0Z2d4 fd1Z3d2e4e5   de6e&   fd3Z7 xZ8S )5r1   z[.:-]ra   Nc                 Z    t         |           g | _        i | _        i | _        g | _        y rc   )r   rh   r%  _named_resources_resource_index_matched_sub_app_resourcesr   s    r\   rh   zUrlDispatcher.__init__  s-    24=?BDGI'r[   rr   c                   K   | j                   }t               }|j                  j                  }|r_|j	                  |d      D ])  }|j                  |       d {   \  }}||c S ||z  }+ |dk(  rn|j                  d      d   xs d}|r_| j                  D ])  }|j                  |       d {   \  }}||c S ||z  }+ |rt        t        |j                  |            S t        t                     S 7 7 Jw)Nr@   rF   r   )r7  r   r  r  r   ru   
rpartitionr8  r   r*   r   r+   )	rg   rr   resource_indexr  url_part	candidater   allowedr   s	            r\   ru   zUrlDispatcher.resolve  s    --$'E ??,,+//"=	,5,=,=g,F&F#
G)%%#w.O > 3**3/29cH & 77H(0(8(8(A"AJ%!!7* 8 !"6w~~"WXXln--7 'G$ #Bs+   AD C<4D #D 3C>4A	D >D c                 ,    t        | j                        S rc   )r  r6  rj   s    r\   r  zUrlDispatcher.__iter__.  s    D))**r[   c                 ,    t        | j                        S rc   )r	  r6  rj   s    r\   r
  zUrlDispatcher.__len__1  s    4(())r[   r   c                     || j                   v S rc   r6  r*  s     r\   r+  zUrlDispatcher.__contains__4  s    40000r[   r`   c                      | j                   |   S rc   rB  rf   s     r\   __getitem__zUrlDispatcher.__getitem__7  s    $$T**r[   c                 ,    t        | j                        S rc   )r"  r%  rj   s    r\   r  zUrlDispatcher.resources:  s    T__--r[   c                 ,    t        | j                        S rc   )r.  r%  rj   s    r\   rP   zUrlDispatcher.routes=  s    $//**r[   c                 ,    t        | j                        S rc   )r   r6  rj   s    r\   named_resourceszUrlDispatcher.named_resources@  s     5 566r[   c                    t        |t              s
J d|       | j                  rt        d      |j                  }|| j
                  j                  |      }|D ]P  }t        j                  |      rt        d|d      |j                         r8t        dj                  |             || j                  v r(t        dj                  || j                  |               || j                  |<   | j                  j                  |       t        |t              r| j                   j                  |       y | j#                  |       y )Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect route name z/, python keywords cannot be used for route namezoIncorrect route name {!r}, the name should be a sequence of python identifiers separated by dash, dot or columnz'Duplicate {!r}, already handled by {!r})r   r3   frozenr   r`   NAME_SPLIT_REr/  keyword	iskeywordr   isidentifierr   r6  r%  r  r  r8  r  )rg   r   r`   rI  r=  s        r\   register_resourcezUrlDispatcher.register_resourceC  sQ   &
 	OA(N	O 
 ;;OPP}}&&,,T2E$$T*$/x 8) ) 
 ((*$1 28	   t,,, ..4fT4;P;PQU;V.W  +3D!!$'x(h 56++228<)r[   c                     d|j                   x}v r&|j                  d      d   j                  d      d   }|j                  d      xs dS )z9Return a key to index the resource in the resource index.r,  r   rF   )rm   	partitionr:  r  )rg   r   	index_keys      r\   _get_resource_index_keyz%UrlDispatcher._get_resource_index_keyj  sR     2 2293 "++C03>>sCAFI$++r[   c                 |    | j                  |      }| j                  j                  |g       j                  |       y)z%Add a resource to the resource index.N)rS  r7  
setdefaultr  rg   r   resource_keys      r\   r  zUrlDispatcher.index_resourceu  s5    33H= 	''b9@@Jr[   c                 b    | j                  |      }| j                  |   j                  |       y)z*Remove a resource from the resource index.N)rS  r7  removerV  s      r\   r  zUrlDispatcher.unindex_resource}  s+    33H=\*11(;r[   r_   rK   c                   |r|j                  d      st        d      | j                  r?| j                  d   }|j                  |k(  r!|j	                  |      rt        t        |      S d|v s9d|v s5t        j                  |      s t        ||      }| j                  |       |S t        ||      }| j                  |       |S )NrF   z)path should be started with / or be emptyr,  r-  r_   )r  r   r%  r`   r   r   r4   rE   searchr5   rO  r6   )rg   rK   r`   r   s       r\   add_resourcezUrlDispatcher.add_resource  s    ,HII??r*H}}$););D)AHh//tsd{hood.C$T5H""8,O"4d3x(r[   )r`   r   r   r   r   c                P    | j                  ||      }|j                  |||      S )Nr_   r   )r]  r   )rg   r   rK   r   r`   r   r   s          r\   r   zUrlDispatcher.add_route  s1     $$T$5!!&'.!QQr[   rZ  Fr[  rO   r\  r]  r^  r_  c          
          |j                  d      sJ |j                  d      r|dd }t        ||||||||      }	| j                  |	       |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        rF   Nr[  r[  )r  r  r9   rO  )
rg   rO   rK   r`   r   r\  r]  r^  r_  r   s
             r\   
add_staticzUrlDispatcher.add_static  sf    $   %%%??3CR[F!)!!+)	
 	x(r[   ro   c                 H     | j                   t        j                  ||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADrg   rK   r   ro   s       r\   add_headzUrlDispatcher.add_head       t~~dnndGFvFFr[   c                 H     | j                   t        j                  ||fi |S )z+Shortcut for add_route with method OPTIONS.)r   r   METH_OPTIONSrc  s       r\   add_optionszUrlDispatcher.add_options  s"    t~~d//wI&IIr[   T)r`   
allow_headri  c                    | j                  ||      }|r" |j                  t        j                  |fi |  |j                  t        j                  |fi |S )zShortcut for add_route with method GET.

        If allow_head is true, another
        route is added allowing head requests to the same endpoint.
        r_   )r]  r   r   rb  METH_GET)rg   rK   r   r`   ri  ro   r   s          r\   add_getzUrlDispatcher.add_get  sU     $$T$5Ht~~wA&A!x!!$--CFCCr[   c                 H     | j                   t        j                  ||fi |S )z(Shortcut for add_route with method POST.)r   r   	METH_POSTrc  s       r\   add_postzUrlDispatcher.add_post  re  r[   c                 H     | j                   t        j                  ||fi |S )z'Shortcut for add_route with method PUT.)r   r   METH_PUTrc  s       r\   add_putzUrlDispatcher.add_put  s     t~~dmmT7EfEEr[   c                 H     | j                   t        j                  ||fi |S )z)Shortcut for add_route with method PATCH.)r   r   
METH_PATCHrc  s       r\   	add_patchzUrlDispatcher.add_patch  s     t~~dootWGGGr[   c                 H     | j                   t        j                  ||fi |S )z*Shortcut for add_route with method DELETE.)r   r   METH_DELETErc  s       r\   
add_deletezUrlDispatcher.add_delete  s"    t~~d..gHHHr[   c                 H     | j                   t        j                  ||fi |S )z?Shortcut for add_route with ANY methods for a class-based view.)r   r   r   rc  s       r\   add_viewzUrlDispatcher.add_view  s"     t~~dmmT7EfEEr[   c                 d    t         |           | j                  D ]  }|j                           y rc   )r   r   r%  )rg   r   r   s     r\   r   zUrlDispatcher.freeze  s%    HOO (r[   rP   c                 X    g }|D ]"  }|j                  |j                  |              $ |S )zAppend routes to route table.

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )extendregister)rg   rP   registered_routes	route_defs       r\   
add_routeszUrlDispatcher.add_routes  s3     I$$Y%7%7%=>    r[   r   )9rV   rW   rX   r7  r9  rK  rh   r-   r2   ru   r   rY   r  r  r
  r,  r   r+  r3   rD  r"  r  r.  rP   r   rH  rO  rS  r  r  r   r4   r]  r   r%   r   r"   r   r7   r   r&   r`  r   rd  rh  rl  ro  rr  ru  rx  rz  r   r   r0   r   r  r   r   s   @r\   r1   r1     s   BJJx(MJ'.W '.1D '.R+(3- +* *1V 1 1+ +(8 +.= .+
 +7.>)>!? 7%**: %*t %*N	,0@ 	,S 	,K'7 KD K<)9 <d <
 @D  x}  , #37
R
R 
R w\ 223	
R sm
R !0
R 

R" #37$  %$    
 sm  !0          
 DGS G7 Gc Gm GJ Jg J J J #DD D
 smD D D 
D&GS G7 Gc Gm GFC F' FS F] FHc HG Hs H} HIs IW I I IFF"&|"4F@CF	F

!*:!; 
!]@S 
!r[   r1   rF  c                 z    t         dk  r| j                  dd      } t        j                  | d      j                  S )Nro  rq  rr  Fr"  )rC   ru  r   r$  raw_pathrF  s    r\   rL  rL    s1    fc5)99%/888r[   c                 R    d| vr| S | j                  dd      j                  dd      S )Nrq  z%2FrF   rr  )ru  r  s    r\   rD  rD  	  s-    
%==$,,UC88r[   c                 H    t        |       }d| v r|j                  dd      }|S )Nrq  rr  )rL  ru  )rF  r   s     r\   r6  r6    s*     F
e|s+Mr[   )|r   r   r  	functoolsr  r  r   rL  rw  r7  sysr   r   pathlibr   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   yarlr   r   yarl_versionr   r   r    r!   r"   helpersr#   httpr$   typedefsr%   r&   web_exceptionsr'   r(   r)   r*   r+   web_fileresponser,   web_requestr-   web_responser.   r/   web_routedefr0   __all__web_appr;   rY   BaseDictdictversion_infoplatformr  OSErrorr   r  r   mapr  r/  rC   rZ   r9  rD   rE   r8  rG   r   r   partialr  rJ   r3   ABCr7   r2   r   r   r4   r5   r6   rR  r9   r  rS   r  r  r  r8   r   r:   r"  r.  r1   rL  rD  r6  r@   r[   r\   <module>r     ss   
        	 	 
    "     2 2  @ @   '  +   2 * $CH~HH '!cll&=&=g&F J,,w6,B  (-S6Hl6H6H6Mbq6Q-R'SeE#s(O$ S&0bjj+'gcl#  !+

1!%
  !ryy~%* % 7)Yx/G%HHI/0#c(:;i48"	 "&,/uh7 ,/^N3CGG N3b>B($5 >BB
( 
$L7 Lt L 1+ 1+l%6H %6PI
h I
X% 2O
^ O
d+
^ +
\377 %(! %(P6 6 ;2 ;:!)M !)HN- N<I< I(+E8$45yAQ7R +%/=1I %"F!NGC1A,A$B F!R9s 9s 99c 9c 9  r[   