ó
j·Ã^c        	   @@  sÎ  d  d l  m Z d  d l Z d  d l m Z d d l m Z d d l m Z d d d	 d
 d d d g Z	 dC Z e j d ƒ Z e j d ƒ Z e j d e j e j Bƒ Z d Z d Z d j d e d e ƒ Z i e d 6e d 6Z d d d d d d d d  d! g	 Z d" Z d# d$ j g  e D] Z e e ^ qƒ d% Z d& e d' Z d( e d# e d) Z d* Z e j d+ ƒ Z e j d, e d- ƒ Z  e j d, e d- ƒ Z! e j d, e d- ƒ Z" e j d, e d d. !d- ƒ Z# e j d/ e d0 ƒ Z$ d1 e e e f Z% e j e% e j e j Bƒ Z& e' d2 ƒ Z( e' d3 ƒ Z) e( e) Bd4 h BZ* e* d5 d6 h BZ+ e+ d7 h BZ, Z- d8 e d8 e	 ƒ f d9 „  ƒ  YZ. d: „  Z/ d; d< „ Z0 d= „  Z1 d> „  Z2 d? „  Z3 d@ „  Z4 dA „  Z5 dB „  Z6 d S(D   i    (   t   absolute_importN(   t
   namedtuplei   (   t   LocationParseError(   t   sixt   schemet   autht   hostt   portt   patht   queryt   fragmentt   httpt   httpss   %[a-fA-F0-9]{2}s   ^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)sQ   ^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$s   (?:[0-9]{1,3}\.){3}[0-9]{1,3}s   [0-9A-Fa-f]{1,4}s   (?:{hex}:{hex}|{ipv4})t   hext   ipv4t   ls32s   (?:%(hex)s:){6}%(ls32)ss   ::(?:%(hex)s:){5}%(ls32)ss%   (?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)ss2   (?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)ss6   (?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)ss/   (?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)ss'   (?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)ss&   (?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)ss   (?:(?:%(hex)s:){0,6}%(hex)s)?::sD   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._!\-~s   (?:t   |t   )s   (?:%25|%)(?:[s   ]|%[a-fA-F0-9]{2})+s   \[s   )?\]s!   (?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*s!   ^(/[^?#]*)(?:\?([^#]*))?(?:#.*)?$t   ^t   $iþÿÿÿt   (s   )\]$u(   ^(?:(.*)@)?(%s|%s|%s)(?::([0-9]{0,5}))?$sB   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~s   !$&'()*+,;=t   :t   @t   /t   ?t   Urlc           B@  sw   e  Z d  Z d Z d d d d d d d d „ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 d „  Z RS(	   sÍ   
    Data structure for representing an HTTP URL. Used as a return value for
    :func:`parse_url`. Both the scheme and host are normalized as they are
    both case-insensitive according to RFC 3986.
    c      	   C@  si   | r# | j  d ƒ r# d | } n  | d  k	 r> | j ƒ  } n  t t |  ƒ j |  | | | | | | | ƒ S(   NR   (   t
   startswitht   Nonet   lowert   superR   t   __new__(   t   clsR   R   R   R   R   R	   R
   (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyR   [   s    
c         C@  s   |  j  S(   s@   For backwards-compatibility with urlparse. We're nice like that.(   R   (   t   self(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   hostnamem   s    c         C@  s6   |  j  p d } |  j d k	 r2 | d |  j 7} n  | S(   s)   Absolute path including the query string.R   R   N(   R   R	   R   (   R    t   uri(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   request_urir   s    c         C@  s$   |  j  r d |  j |  j  f S|  j S(   s(   Network location including host and ports   %s:%d(   R   R   (   R    (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   netloc|   s    	c   	      C@  sî   |  \ } } } } } } } d } | d k	 r> | | d 7} n  | d k	 r[ | | d 7} n  | d k	 rt | | 7} n  | d k	 r— | d t | ƒ 7} n  | d k	 r° | | 7} n  | d k	 rÍ | d | 7} n  | d k	 rê | d | 7} n  | S(   sˆ  
        Convert self into a url

        This function should more or less round-trip with :func:`.parse_url`. The
        returned url may not be exactly the same as the url inputted to
        :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls
        with a blank port will have : removed).

        Example: ::

            >>> U = parse_url('http://google.com/mail/')
            >>> U.url
            'http://google.com/mail/'
            >>> Url('http', 'username:password', 'host.com', 80,
            ... '/path', 'query', 'fragment').url
            'http://username:password@host.com:80/path?query#fragment'
        u    u   ://u   @u   :u   ?u   #N(   R   t   str(	   R    R   R   R   R   R   R	   R
   t   url(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyR&   ƒ   s"    c         C@  s   |  j  S(   N(   R&   (   R    (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   __str__«   s    (    N(   t   __name__t
   __module__t   __doc__t	   __slots__R   R   t   propertyR!   R#   R$   R&   R'   (    (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyR   R   s   

(c         C@  s£   d } d } xV | D]N } |  j | ƒ } | d k  r: q n  | d k sR | | k  r | } | } q q W| d k s} | d k  rŠ |  d d f S|  |  |  | d | f S(   sì  
    .. deprecated:: 1.25

    Given a string and an iterable of delimiters, split on the first found
    delimiter. Return two split parts and the matched delimiter.

    If not found, then the first part is the full input string.

    Example::

        >>> split_first('foo/bar?baz', '?/=')
        ('foo', 'bar?baz', '/')
        >>> split_first('foo/bar?baz', '123')
        ('foo/bar?baz', '', None)

    Scales linearly with number of delims. Not ideal for large number of delims.
    i    t    i   N(   R   t   find(   t   st   delimst   min_idxt	   min_delimt   dt   idx(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   split_first¯   s    s   utf-8c   
      C@  s$  |  d	 k r |  St j |  ƒ }  t j d „  |  ƒ \ }  } |  j d d ƒ } | | j d ƒ k } t ƒ  } xª t d t	 | ƒ ƒ D]“ } | | | d !} t
 | ƒ }	 | rµ | d k sÓ |	 d k  rã | j ƒ  | k rã | | 7} q€ n  | j d t |	 ƒ d j ƒ  j d ƒ j ƒ  ƒ q€ W| j | ƒ S(
   sf   Percent-encodes a URI component without reapplying
    onto an already percent-encoded component.
    c         S@  s   |  j  d ƒ j ƒ  S(   Ni    (   t   groupt   upper(   t   match(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   <lambda>ß   s    s   utf-8t   surrogatepasst   %i    i   i€   i   N(   R   R   t   ensure_textt
   PERCENT_REt   subnt   encodet   countt	   bytearrayt   ranget   lent   ordt   decodet   extendR   t   zfillR7   (
   t	   componentt   allowed_charst   encodingt   percent_encodingst	   uri_bytest   is_percent_encodedt   encoded_componentt   it   bytet   byte_ord(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   _encode_invalid_charsÒ   s"    	
4c         C@  sÆ   |  j  d ƒ } g  } xO | D]G } | d k r4 q q | d k rP | j | ƒ q | r | j ƒ  q q W|  j d ƒ rš | s‡ | d rš | j d d ƒ n  |  j d ƒ r¹ | j d ƒ n  d j | ƒ S(	   NR   t   .s   ..i    R-   s   /.s   /..(   s   /.s   /..(   t   splitt   appendt   popR   t   insertt   endswitht   join(   R   t   segmentst   outputt   segment(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   _remove_path_dot_segmentsô   s     c         C@  s?  |  r;t  |  t j ƒ r* t j |  ƒ }  n  | t k r;t j |  ƒ } | rî t j |  ƒ } | rá | j	 d ƒ \ } } |  | | !} | j
 d ƒ rª | d k rª | d } n
 | d } d t | t ƒ } |  |  j ƒ  | |  | S|  j ƒ  Sq8t j |  ƒ s8t j d j g  |  j d ƒ D] } t | ƒ ^ qƒ ƒ Sq;n  |  S(   Ni   s   %25i   R;   RS   (   t
   isinstanceR   t   binary_typet
   ensure_strt   NORMALIZABLE_SCHEMESt   IPV6_ADDRZ_RER8   t
   ZONE_ID_REt   searcht   spanR   RR   t   UNRESERVED_CHARSR   t   IPV4_RERY   RT   t   _idna_encode(   R   R   t   is_ipv6R8   t   startt   endt   zone_idt   label(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   _normalize_host  s(    
8c         C@  sÙ   |  rÆ t  g  |  D] } t | ƒ d k ^ q ƒ rÆ y d d l m } Wn' t k
 rn t j t d ƒ d  ƒ n Xy# | j	 |  j
 ƒ  d t d t ƒSWqÆ | j k
 rÂ t j t d |  ƒ d  ƒ qÆ Xn  |  j
 ƒ  j	 d ƒ S(	   Ni€   i    (   t   idnas-   Unable to parse URL without the 'idna' modulet   strictt
   std3_rulesu#   Name '%s' is not a valid IDNA labelt   ascii(   t   anyRD   t   pip._vendorRo   t   ImportErrorR   t
   raise_fromR   R   R?   R   t   Truet	   IDNAError(   t   namet   xRo   (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyRh   .  s    1	#c         C@  sZ   t  j |  ƒ j ƒ  \ } } t | t ƒ }  t | t ƒ } | d k	 rV |  d | 7}  n  |  S(   sH   Percent-encodes a request target so that there are no invalid charactersR   N(   t	   TARGET_RER8   t   groupsRR   t
   PATH_CHARSt   QUERY_CHARSR   (   t   targetR   R	   (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   _encode_target@  s    c         @  s–  |  s t  ƒ  S|  } t j |  ƒ s/ d |  }  n  yt j |  ƒ j ƒ  \ } } } } } | d k pq | j ƒ  t k } | r‰ | j ƒ  } n  | rã t	 j | ƒ j ƒ  \ } }	 }
 | rË | rË t
 | t ƒ } n  |
 d k rò d }
 qò n d \ } }	 }
 |
 d k	 r8t |
 ƒ }
 d |
 k o!d k n s8t |  ƒ ‚ q8n  t |	 | ƒ }	 | rq| rqt | ƒ } t
 | t ƒ } n  | r| rt
 | t ƒ } n  | r­| r­t
 | t ƒ } n  Wn* t t f k
 rÚt j t | ƒ d ƒ SX| s| d k	 sù| d k	 rd } qd } n  t |  t j ƒ r)t j ‰  n	 t j ‰  ‡  f d †  } t  d | | ƒ d | | ƒ d | |	 ƒ d	 |
 d
 | | ƒ d | | ƒ d | | ƒ ƒ S(   s  
    Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is
    performed to parse incomplete urls. Fields not provided will be None.
    This parser is RFC 3986 compliant.

    The parser logic and helper functions are based heavily on
    work done in the ``rfc3986`` module.

    :param str url: URL to parse into a :class:`.Url` namedtuple.

    Partly backwards-compatible with :mod:`urlparse`.

    Example::

        >>> parse_url('http://google.com/mail/')
        Url(scheme='http', host='google.com', port=None, path='/mail/', ...)
        >>> parse_url('google.com:80')
        Url(scheme=None, host='google.com', port=80, path=None, ...)
        >>> parse_url('/foo?bar')
        Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...)
    s   //R-   i    iÿÿ  c         @  s   |  d  k r |  Sˆ  |  ƒ S(   N(   R   (   Rz   (   t   ensure_func(    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   ensure_type›  s    R   R   R   R   R   R	   R
   N(   NNN(   R   t	   SCHEME_RERd   t   URI_RER8   R|   R   R   Ra   t   SUBAUTHORITY_RERR   t   USERINFO_CHARSt   intR   Rn   R]   R}   R~   t   FRAGMENT_CHARSt
   ValueErrort   AttributeErrorR   Rv   R^   t	   text_typeR<   R`   (   R&   t
   source_urlR   t	   authorityR   R	   R
   t   normalize_uriR   R   R   R‚   (    (   R   s-   site-packages/pip/_vendor/urllib3/util/url.pyt	   parse_urlJ  s^    $			c         C@  s(   t  |  ƒ } | j p d | j | j f S(   s4   
    Deprecated. Use :func:`parse_url` instead.
    R   (   R   R   R!   R   (   R&   t   p(    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   get_host©  s    (   R   R   N(7   t
   __future__R    t   ret   collectionsR   t
   exceptionsR   t   packagesR   t	   url_attrsR   Ra   t   compileR=   Rƒ   t   UNICODEt   DOTALLR„   t   IPV4_PATt   HEX_PATt   formatt   LS32_PATt   _subst   _variationst   UNRESERVED_PATRY   Rz   t   IPV6_PATt   ZONE_ID_PATt   IPV6_ADDRZ_PATt   REG_NAME_PATR{   Rg   t   IPV6_RERb   t   BRACELESS_IPV6_ADDRZ_RERc   t   SUBAUTHORITY_PATR…   t   setRf   t   SUB_DELIM_CHARSR†   R}   R~   Rˆ   R   R5   RR   R]   Rn   Rh   R€   R   R‘   (    (    (    s-   site-packages/pip/_vendor/urllib3/util/url.pyt   <module>   sn   	.
	]	#"				
	_