
    8Cfj                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ erd dlmZ ej&                  dk  reZn#d d	lmZ eed
   ed   ed   ed   ed   ed   f   Zd ZdZej2                  ej4                  z   dz   Zedz   Z e ed            dz   D  ci c]	  } | d| d c} Zd Z  ejB                  d ejD                  e      z        jF                  Z$ G d de%      Z& G d de%      Z'yc c} w )    )annotationsN)datetime)TYPE_CHECKINGAnyDictListOptionalUnion)ServerError)deprecation)Header)      )LiteralStrictLaxNonestrictlaxnone)r   r   r   z!#$%&'*+-.^_`|~:z ()/<=>?@[]{}    s   ";\\03oc                R    | t        |       r| S d| j                  t               dS )zQuote a string for use in a cookie header.
    If the string does not need to be double-quoted, then just return the
    string.  Otherwise, surround the string in doublequotes and quote
    (with a \) special characters.
    ")_is_legal_key	translate
TRANSLATOR)strs    V/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sanic/cookies/response.py_quoter!   '   s.     {mC(
3==,-Q//    z[%s]+c                      e Zd ZdZdZd fdZd Z fdZd Zd fdZ	 fdZ
 fd	Z fd
Z fdZ fdZ fdZed        Zedd       Zedd       Z	 	 	 	 d 	 	 	 	 	 	 	 	 	 	 	 d!dZ	 	 	 	 d 	 	 	 	 	 	 	 	 	 	 	 d"dZdddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d# fdZddddd	 	 	 	 	 	 	 	 	 	 	 d$ fdZ xZS )%	CookieJaraO  A container to manipulate cookies.

    CookieJar dynamically writes headers as cookies are added and removed
    It gets around the limitation of one header per name by using the
    MultiHeader class to provide a unique key that encodes to Set-Cookie.

    Args:
        headers (Header): The headers object to write cookies to.
    z
Set-Cookiec                0    t         |           || _        y N)super__init__headers)selfr)   	__class__s     r    r(   zCookieJar.__init__D   s    r"   c                d    t        dd       || vr| j                  ||dd        y || |   _        y )NzSetting cookie values using the dict pattern has been deprecated. You should instead use the cookies.add_cookie method. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr   F)securesamesite)r   
add_cookievaluer*   keyr0   s      r    __setitem__zCookieJar.__setitem__H   s=    S 	
 d?OOCutOD#DIOr"   c                f    t        dd       || v rt        | 	  |       | j                  |       y )NzDeleting cookie values using the dict pattern has been deprecated. You should instead use the cookies.delete_cookie method. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr   )r   r'   __delitem__delete_cookier*   r2   r+   s     r    r5   zCookieJar.__delitem__V   s:    S 	
 $;G$3r"   c                ,    t        | j                        S r&   )lencookiesr*   s    r    __len__zCookieJar.__len__b   s    4<<  r"   c                :    t        dd       t        | 	  |      S )NzAccessing cookies from the CookieJar by dict key is deprecated. You should instead use the cookies.get_cookie method. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr   )r   r'   __getitem__r7   s     r    r>   zCookieJar.__getitem__e   s(    S 	
 w"3''r"   c                8    t        dd       t        | 	         S )NzIterating over the CookieJar has been deprecated and will be removed in v24.3. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesL8@)r   r'   __iter__r*   r+   s    r    rA   zCookieJar.__iter__o   s&    S 		
 w!!r"   c                8    t        dd       t        | 	         S )Deprecated in v24.3zAccessing CookieJar.keys() has been deprecated and will be removed in v24.3. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr@   )r   r'   keysrB   s    r    rE   zCookieJar.keysx   s$    S 		
 w|~r"   c                8    t        dd       t        | 	         S )rD   zAccessing CookieJar.values() has been deprecated and will be removed in v24.3. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr@   )r   r'   valuesrB   s    r    rG   zCookieJar.values   s%    S 		
 w~r"   c                8    t        dd       t        | 	         S )rD   zAccessing CookieJar.items() has been deprecated and will be removed in v24.3. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr@   )r   r'   itemsrB   s    r    rI   zCookieJar.items   s$    S 		
 w}r"   c                :    t        dd       t        |   |i |S )rD   zAccessing cookies from the CookieJar using get is deprecated and will be removed in v24.3. You should instead use the cookies.get_cookie method. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr@   )r   r'   get)r*   argskwargsr+   s      r    rK   zCookieJar.get   s,    S 	
 w{D+F++r"   c                d    t        dd       | j                  |       t        |   |g|i |S )rD   zUsing CookieJar.pop() has been deprecated and will be removed in v24.3. To learn more, please see: https://sanic.dev/en/guide/release-notes/v23.3.html#response-cookiesr@   )r   deleter'   pop)r*   r2   rL   rM   r+   s       r    rP   zCookieJar.pop   s=    S 		
 	Cw{30000r"   c                :    t        dd       t        j                  S )rD   zuThe CookieJar.header_key property has been deprecated and will be removed in version 24.3. Use CookieJar.HEADER_KEY. r@   )r   r$   
HEADER_KEYr;   s    r    
header_keyzCookieJar.header_key   s#     	E	

 ###r"   c                Z    t        dd       | D ci c]  }|| j                   c}S c c}w )rD   zThe CookieJar.coookie_headers property has been deprecated and will be removed in version 24.3. If you need to check if a particular cookie key has been set, use CookieJar.has_cookie.r@   )r   rS   )r*   r2   s     r    cookie_headerszCookieJar.cookie_headers   s6     	L 		
 155T__$555s   (c                L    | j                   j                  | j                        S )z|A list of cookies in the CookieJar.

        Returns:
            List[Cookie]: A list of cookies in the CookieJar.
        )r)   getallrR   r;   s    r    r:   zCookieJar.cookies   s     ||""4??33r"   /NFc                    | j                   D ]J  }|j                  t        j                  |||      k(  s(|j                  |k(  s8|j
                  |k(  sH|c S  y)a  Fetch a cookie from the CookieJar.

        Args:
            key (str): The key of the cookie to fetch.
            path (str, optional): The path of the cookie. Defaults to `"/"`.
            domain (Optional[str], optional): The domain of the cookie.
                Defaults to `None`.
            host_prefix (bool, optional): Whether to add __Host- as a prefix to the key.
                This requires that path="/", domain=None, and secure=True.
                Defaults to `False`.
            secure_prefix (bool, optional): Whether to add __Secure- as a prefix to the key.
                This requires that secure=True. Defaults to `False`.

        Returns:
            Optional[Cookie]: The cookie if it exists, otherwise `None`.
        Nr:   r2   Cookiemake_keypathdomainr*   r2   r]   r^   host_prefixsecure_prefixcookies          r    
get_cookiezCookieJar.get_cookie   sR    0 ll 	F

fooc;NNKK4'MMV+	 r"   c                    | j                   D ]H  }|j                  t        j                  |||      k(  s(|j                  |k(  s8|j
                  |k(  sH y y)a  Check if a cookie exists in the CookieJar.

        Args:
            key (str): The key of the cookie to check.
            path (str, optional): The path of the cookie. Defaults to `"/"`.
            domain (Optional[str], optional): The domain of the cookie.
                Defaults to `None`.
            host_prefix (bool, optional): Whether to add __Host- as a prefix to the key.
                This requires that path="/", domain=None, and secure=True.
                Defaults to `False`.
            secure_prefix (bool, optional): Whether to add __Secure- as a prefix to the key.
                This requires that secure=True. Defaults to `False`.

        Returns:
            bool: Whether the cookie exists.
        TFrZ   r_   s          r    
has_cookiezCookieJar.has_cookie   sP    0 ll 	F

fooc;NNKK4'MMV+	 r"   Tr   r]   r^   r-   max_ageexpireshttponlyr.   partitionedcommentr`   ra   c                   t        ||||||||||	|
||      }| j                  j                  | j                  |       t        |   ||       |S )a5
  Add a cookie to the CookieJar.

        Args:
            key (str): Key of the cookie.
            value (str): Value of the cookie.
            path (str, optional): Path of the cookie. Defaults to "/".
            domain (Optional[str], optional): Domain of the cookie. Defaults to None.
            secure (bool, optional): Whether to set it as a secure cookie. Defaults to True.
            max_age (Optional[int], optional): Max age of the cookie in seconds; if set to 0 a
                browser should delete it. Defaults to None.
            expires (Optional[datetime], optional): When the cookie expires; if set to None browsers
                should set it as a session cookie. Defaults to None.
            httponly (bool, optional): Whether to set it as HTTP only. Defaults to False.
            samesite (Optional[SameSite], optional): How to set the samesite property, should be
                strict, lax, or none (case insensitive). Defaults to "Lax".
            partitioned (bool, optional): Whether to set it as partitioned. Defaults to False.
            comment (Optional[str], optional): A cookie comment. Defaults to None.
            host_prefix (bool, optional): Whether to add __Host- as a prefix to the key.
                This requires that path="/", domain=None, and secure=True. Defaults to False.
            secure_prefix (bool, optional): Whether to add __Secure- as a prefix to the key.
                This requires that secure=True. Defaults to False.

        Returns:
            Cookie: The instance of the created cookie.

        Raises:
            ServerError: If host_prefix is set without secure=True.
            ServerError: If host_prefix is set without path="/" and domain=None.
            ServerError: If host_prefix is set with domain.
            ServerError: If secure_prefix is set without secure=True.
            ServerError: If partitioned is set without host_prefix=True.

        Examples:
            Basic usage
            ```python
            cookie = add_cookie('name', 'value')
            ```

            Adding a cookie with a custom path and domain
            ```python
            cookie = add_cookie('name', 'value', path='/custom', domain='example.com')
            ```

            Adding a secure, HTTP-only cookie with a comment
            ```python
            cookie = add_cookie('name', 'value', secure=True, httponly=True, comment='My Cookie')
            ```

            Adding a cookie with a max age of 60 seconds
            ```python
            cookie = add_cookie('name', 'value', max_age=60)
            ```
        )r]   rh   rk   r^   rg   r-   ri   r.   rj   r`   ra   )r[   r)   addrR   r'   r3   )r*   r2   r0   r]   r^   r-   rg   rh   ri   r.   rj   rk   r`   ra   rb   r+   s                  r    r/   zCookieJar.add_cookie  sg    L ##'
 	&1 	C(r"   )r]   r^   r`   ra   c          
        | j                   j                  | j                  g       }|D ]k  }|j                  t        j                  |||      k7  s|j                  |k7  s|j                  |k7  sF| j                   j                  | j                  |       m 	 t        | )  |       | j                  |d||dd||       y# t        $ r Y %w xY w)a  
        Delete a cookie

        This will effectively set it as Max-Age: 0, which a browser should
        interpret it to mean: "delete the cookie".

        Since it is a browser/client implementation, your results may vary
        depending upon which client is being used.

        :param key: The key to be deleted
        :type key: str
        :param path: Path of the cookie, defaults to None
        :type path: Optional[str], optional
        :param domain: Domain of the cookie, defaults to None
        :type domain: Optional[str], optional
        :param host_prefix: Whether to add __Host- as a prefix to the key.
            This requires that path="/", domain=None, and secure=True,
            defaults to False
        :type host_prefix: bool
        :param secure_prefix: Whether to add __Secure- as a prefix to the key.
            This requires that secure=True, defaults to False
        :type secure_prefix: bool
         r   N)r2   r0   r]   r^   rg   r.   r`   ra   )r)   popallrR   r2   r[   r\   r]   r^   rm   r'   r5   KeyErrorr/   )	r*   r2   r]   r^   r`   ra   r:   rb   r+   s	           r    r6   zCookieJar.delete_cookieh  s    B !% 3 3DOOR H 	:F

fooc;NN;;$&==F*  &9	:	G$ 	#' 	 		
  		s   C 	CC)r)   r   )r2   r   returnr[   )rr   zDict[str, str])rr   zList[Cookie])rX   NFF)r2   r   r]   r   r^   Optional[str]r`   boolra   rt   rr   zOptional[Cookie])r2   r   r]   r   r^   rs   r`   rt   ra   rt   rr   rt   )r2   r   r0   r   r]   r   r^   rs   r-   rt   rg   Optional[int]rh   Optional[datetime]ri   rt   r.   Optional[SameSite]rj   rt   rk   rs   r`   rt   ra   rt   rr   r[   )r2   r   r]   r   r^   rs   r`   rt   ra   rt   rr   r   )__name__
__module____qualname____doc__rR   r(   r3   r5   r<   r>   rA   rE   rG   rI   rK   rP   propertyrS   rU   r:   rc   re   r/   r6   __classcell__r+   s   @r    r$   r$   7   s2    J$
 !(" 	,	1 $ $ 6 6 4 4  $!#  	
   
H  $!#  	
   
L  $!%&*',!!%!#ZZ Z
 Z Z Z Z $Z Z %Z Z Z Z Z  
!Z@  $!#9
9
 	9

 9
 9
 9
 
9
 9
r"   r$   c                      e Zd ZdZdZdZdddddd	d
dddd
Zh dZdddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d. fdZd Z	d/ fdZ
d0dZd Zed1d       Zej                  d2d       Zed3d       Zej                  d4d       Zed5d       Zej                  d2d        Zed5d!       Zej                  d2d"       Zed6d#       Zej                  d7d$       Zed8d%       Zej                  d9d&       Zed8d'       Zej                  d9d(       Zed:d)       Zej                  d;d*       Zed8d+       Zej                  d9d,       Ze	 d<	 	 	 	 	 	 	 d=d-       Z xZS )>r[   a'  A representation of a HTTP cookie, providing an interface to manipulate cookie attributes intended for a response.

    This class is a simplified representation of a cookie, similar to the Morsel SimpleCookie in Python's standard library.
    It allows the manipulation of various cookie attributes including path, domain, security settings, and others.

    Several "smart defaults" are provided to make it easier to create cookies that are secure by default. These include:

    - Setting the `secure` flag to `True` by default
    - Setting the `samesite` flag to `Lax` by default

    Args:
        key (str): The key (name) of the cookie.
        value (str): The value of the cookie.
        path (str, optional): The path for the cookie. Defaults to "/".
        domain (Optional[str], optional): The domain for the cookie.
            Defaults to `None`.
        secure (bool, optional): Whether the cookie is secure.
            Defaults to `True`.
        max_age (Optional[int], optional): The maximum age of the cookie
            in seconds. Defaults to `None`.
        expires (Optional[datetime], optional): The expiration date of the
            cookie. Defaults to `None`.
        httponly (bool, optional): HttpOnly flag for the cookie.
            Defaults to `False`.
        samesite (Optional[SameSite], optional): The SameSite attribute for
            the cookie. Defaults to `"Lax"`.
        partitioned (bool, optional): Whether the cookie is partitioned.
            Defaults to `False`.
        comment (Optional[str], optional): A comment for the cookie.
            Defaults to `None`.
        host_prefix (bool, optional): Whether to use the host prefix.
            Defaults to `False`.
        secure_prefix (bool, optional): Whether to use the secure prefix.
            Defaults to `False`.
    z__Host-z	__Secure-PathCommentDomainzMax-Agerh   SameSiteVersionSecureHttpOnlyPartitioned)
r]   rk   r^   max-agerh   r.   versionr-   ri   rj   >   r-   ri   rj   rX   NTFr   rf   c                  || j                   v rt        d      t        |      st        d      |r*|st        d      |dk7  rt        d      |rt        d      |r|st        d      |
r|st        d      | j	                  |||      | _        || _        t        | !          | j                  ||||||
d d d d		       || j                  d
|       || j                  d|       |	| j                  d|	       y y )NzCookie name is a reserved wordz&Cookie key contains illegal charactersz6Cannot set host_prefix on a cookie without secure=TruerX   z2Cannot set host_prefix on a cookie unless path='/'z8Cannot set host_prefix on a cookie with a defined domainz8Cannot set secure_prefix on a cookie without secure=TruezHCannot create a partitioned cookie without also setting host_prefix=True)	r]   rk   r^   r-   ri   rj   rh   r   r.   rh   r   r.   )_keysrq   r   r   r\   r2   r0   r'   r(   update
_set_value)r*   r2   r0   r]   r^   r-   rg   rh   ri   r.   rj   rk   r`   ra   r+   s                 r    r(   zCookie.__init__  s@   " $**;<<S!CDD!L  s{!H  !N  6J  { 0 
 ==k=A

 	"  $* 
	
 OOIw/OOIw/OOJ1  r"   c                H    t        d| dd       | j                  ||       y )NzSetting values on a Cookie object as a dict has been deprecated. This feature will be removed in v24.3. You should instead set values on cookies as object properties: cookie.z=... r@   )r   r   r1   s      r    r3   zCookie.__setitem__'  s1    >>AU%I 		
 	U#r"   c                   || j                   vrt        d|d|      ||j                         dk(  r$t        |      j	                         st        d      |j                         dk(  rt        |t              st        d      |j                         dk(  rG|j                         t        vr!t        dd	j                  t                     |j                         }t        | 5  ||       y )
NzUnknown cookie property: =r   z!Cookie max-age must be an integerrh   z,Cookie 'expires' property must be a datetimer.   z+Cookie 'samesite' property must be one of: ,)r   rq   lowerr   isdigit
ValueError
isinstancer   	TypeErrorSAMESITE_VALUESjointitler'   r3   )r*   r2   r0   r+   s      r    r   zCookie._set_value2  s    djj sEJKKyy{i'E
0B0B0D !DEE	)*UH2M NOO
*;;=7#&&)hh&?%@B  C'r"   c                N    t        dd       t        |       j                  |      S )a  Encode the cookie content in a specific type of encoding instructed by the developer.

        Leverages the `str.encode` method provided by Python.

        This method can be used to encode and embed ``utf-8`` content into
        the cookies.

        .. warning::
            Direct encoding of a Cookie object has been deprecated and will be removed in v24.3.

        Args:
            encoding (str): The encoding type to be used.

        Returns:
            bytes: The encoded cookie content.
        zTDirect encoding of a Cookie object has been deprecated and will be removed in v24.3.r@   )r   r   encode)r*   encodings     r    r   zCookie.encodeE  s+    " 	#	

 4y))r"   c                   | j                   dt        | j                        g}t        | j                        t        | j                         fd      D ]  \  }}|	|dus|dk(  r%	 |j                  d| j                  |   |fz         8|dk(  r3|j                  | j                  |   d|j                  d             p|| j                  v r|j                  | j                  |          |j                  | j                  |   d|        d	j                  |      S # t        $ r' |j                  | j                  |   d|       Y w xY w)
z$Format as a Set-Cookie header value.r   c                ,    j                  | d         S )Nr   )index)x	key_indexs    r    <lambda>z Cookie.__str__.<locals>.<lambda>b  s    	!(= r"   )r2   Fr   z%s=%drh   z%a, %d-%b-%Y %T GMTz; )r2   r!   r0   listr   sortedrI   appendr   strftime_flagsr   )r*   outputr2   r0   r   s       @r    __str__zCookie.__str__]  s9   !XXvdjj'9:;$	 JJL=
 	FJC  U%%7)#JgC%0H&HI I%MM !JJsO!NN+@A DKK'MM$**S/2MMTZZ_e"DE)	F, yy   % JC%&HIJs   .#D--,EEc                    | d   S )z*The path of the cookie. Defaults to `"/"`.r]    r;   s    r    r]   zCookie.pathy  s     F|r"   c                (    | j                  d|       y )Nr]   r   r*   r0   s     r    r]   zCookie.path~  s    &r"   c                $    | j                  d      S )z6The expiration date of the cookie. Defaults to `None`.rh   rK   r;   s    r    rh   zCookie.expires       xx	""r"   c                (    | j                  d|       y )Nrh   r   r   s     r    rh   zCookie.expires      	5)r"   c                $    | j                  d      S )z-A comment for the cookie. Defaults to `None`.rk   r   r;   s    r    rk   zCookie.comment  r   r"   c                (    | j                  d|       y )Nrk   r   r   s     r    rk   zCookie.comment  r   r"   c                $    | j                  d      S )z-The domain of the cookie. Defaults to `None`.r^   r   r;   s    r    r^   zCookie.domain  s     xx!!r"   c                (    | j                  d|       y )Nr^   r   r   s     r    r^   zCookie.domain      %(r"   c                $    | j                  d      S )z=The maximum age of the cookie in seconds. Defaults to `None`.r   r   r;   s    r    rg   zCookie.max_age  r   r"   c                (    | j                  d|       y )Nr   r   r   s     r    rg   zCookie.max_age  r   r"   c                &    | j                  dd      S )z1Whether the cookie is secure. Defaults to `True`.r-   Fr   r;   s    r    r-   zCookie.secure  s     xx%((r"   c                (    | j                  d|       y )Nr-   r   r   s     r    r-   zCookie.secure  r   r"   c                &    | j                  dd      S )z5Whether the cookie is HTTP only. Defaults to `False`.ri   Fr   r;   s    r    ri   zCookie.httponly  s     xx
E**r"   c                (    | j                  d|       y )Nri   r   r   s     r    ri   zCookie.httponly      
E*r"   c                $    | j                  d      S )z;The SameSite attribute for the cookie. Defaults to `"Lax"`.r.   r   r;   s    r    r.   zCookie.samesite  s     xx
##r"   c                (    | j                  d|       y )Nr.   r   r   s     r    r.   zCookie.samesite  r   r"   c                &    | j                  dd      S )z7Whether the cookie is partitioned. Defaults to `False`.rj   Fr   r;   s    r    rj   zCookie.partitioned  s     xxu--r"   c                (    | j                  d|       y )Nrj   r   r   s     r    rj   zCookie.partitioned  s    u-r"   c                l    |r|rt        d      |r| j                  |z   }|S |r| j                  |z   }|S )a  Create a cookie key with the appropriate prefix.

        Cookies can have one ow two prefixes. The first is `__Host-` which
        requires that the cookie be set with `path="/", domain=None, and
        secure=True`. The second is `__Secure-` which requires that
        `secure=True`.

        They cannot be combined.

        Args:
            key (str): The key (name) of the cookie.
            host_prefix (bool, optional): Whether to add __Host- as a prefix to the key.
                This requires that path="/", domain=None, and secure=True.
                Defaults to `False`.
            secure_prefix (bool, optional): Whether to add __Secure- as a prefix to the key.
                This requires that secure=True. Defaults to `False`.

        Raises:
            ServerError: If both host_prefix and secure_prefix are set.

        Returns:
            str: The key with the appropriate prefix.
        zXBoth host_prefix and secure_prefix were requested. A cookie should have only one prefix.)r   HOST_PREFIXSECURE_PREFIX)clsr2   r`   ra   s       r    r\   zCookie.make_key  sO    6 =8  //C'C 
 ##c)C
r"   )r2   r   r0   r   r]   r   r^   rs   r-   rt   rg   ru   rh   rv   ri   rt   r.   rw   rj   rt   rk   rs   r`   rt   ra   rt   )r2   r   r0   r   rr   r   )r   r   rr   bytes)rr   r   )r0   r   rr   r   )rr   rv   )r0   r   rr   r   )rr   rs   )rr   ru   )r0   intrr   r   )rr   rt   )r0   rt   rr   r   )rr   rw   )r0   r   rr   r   )FF)r2   r   r`   rt   ra   rt   rr   r   )rx   ry   rz   r{   r   r   r   r   r(   r3   r   r   r   r|   r]   setterrh   rk   r^   rg   r-   ri   r.   rj   classmethodr\   r}   r~   s   @r    r[   r[     s   "H KM $E 3F  $!%&*',!!%!#G2G2 G2
 G2 G2 G2 G2 $G2 G2 %G2 G2 G2 G2 G2R$(&*0!8   
[[' ' # # ^^* * # # ^^* * " " ]]) ) # # ^^* * ) ) ]]) ) + + __+ + $ $ __+ + . . . . HM##$(#AE#	# #r"   r[   )(
__future__r   restringsysr   typingr   r   r   r   r	   r
   sanic.exceptionsr   	sanic.logr   sanic.compatr   version_infor   r   r   DEFAULT_MAX_AGEr   ascii_lettersdigitsLEGAL_CHARSUNESCAPED_CHARSr   ranger   r!   compileescape	fullmatchr   dictr$   r[   )chs   0r    <module>r      s%   " 	  
  B B ( ! #fH	H +""V]]25GG/*/b	*:[*HIBbBr#h-I
	0 

7YRYY{%;;<FFj
 j
bFT FI Js   *D