
    7f                        d 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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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$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, dd	l-m.Z. d
dl/m0Z0m1Z1  ej2        d          Z3 ej2        dej4                  Z5 ej2        d          Z6 ej2        dej4                  j7        Z8d9                                Z:g dZ;dZ<dZ=e=>                     dj>        ej?         e          Z@d ZAd ZBd ZCd3dZDd3dZEd3dZFdedfdZGd ZH ej2        dej4                  ZI	 eHd             ZJ G d  d!          ZK G d" d#eK          ZL G d$ d%e          ZM ej2        d&          jN        ZOd' ZPd( ZQd4d)ZRd* ZS G d+ d,          ZT G d- d.ejU                  ZVejW        jX        fd/ZYd0 ZZ  eRe<          eY          ZYd1 Z[d2 Z\dS )5z$PyPI and direct package downloading.    Nwraps)CHECKOUT_DISTDistributionBINARY_DISTnormalize_pathSOURCE_DISTEnvironmentfind_distributions	safe_namesafe_versionto_filenameRequirementDEVELOP_DISTEGG_DISTparse_version)log)DistutilsError)	translate)Wheelunique_everseen   )_read_utf8_with_fallback_cfg_read_utf8_with_fallbackz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz)PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_name   z<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})py_major
setuptoolsc                 v    	 t          j        |           S # t          $ r}t          d|           |d }~ww xY w)Nz/Not a URL, existing file, or requirement spec: )r   parse
ValueErrorr   )speces     V/home/feoh/.local/pipx/shared/lib/python3.11/site-packages/setuptools/package_index.pyparse_requirement_argr)   H   sV     &&&   nCG4I
 
	s    
838c                    |                                  }d\  }}}|                    d          r|                    d          r| dd         }d}n{|                    dd          r| d	d
         }| dd         }d}nN|                    d          r| dd         }d}n,|                    dd          r| d	d
         }| dd         }d}|||fS )z=Return (base,pyversion) or (None,None) for possible .exe name)NNN.exez
.win32.exeNiwin32z	.win32-pyiiz.win-amd64.exeiz	win-amd64z.win-amd64-pyi)lowerendswith
startswith)namer.   basepy_verplats        r(   r   r   Q   s     JJLLE)D&$~~f >>,'' 	:DDDk3// 
	"R%[F:DDD^^,-- 	:DDDos33 	"R%[F:DD    c                    t           j                            |           }|\  }}}}}}t           j                            |                    d          d                   }|dk    r>|dk    r8t           j                            |                    d          d                   }d|v r|                    dd          \  }}||fS )N/zsourceforge.netdownload#r   )urllibr$   urlparseunquotesplit)	urlpartsschemeserverpath
parametersqueryfragmentr2   s	            r(   egg_info_for_urlrH   i   s    L!!#&&E8=5FFD*eX<

3 344D"""tz'9'9|##DJJsOOB$788
d{{C++h>r5   c              #     K   t          |           \  }}t          | ||          E d{V  |rOt                              |          }|r5t	          | |                    d          |t                    E d{V  dS dS dS )zEYield egg or source distribution objects that might be found at a URLNr   )
precedence)rH   distros_for_locationEGG_FRAGMENTmatchr   groupr   )r@   metadatar2   rG   rM   s        r(   r   r   t   s      %c**ND(#Cx888888888 ""8,, 	,U[[^^X-            	 	r5   c                    |                     d          r
|dd         }|                     d          rd|v rt          j        | ||          gS |                     d          rOd|v rKt          |          }|                                sg S t          | |j        |j        t          dz             gS |                     d	          r.t          |          \  }}}|t          | |||t          |          S t          D ]B}|                     |          r+|dt          |                    }t          | ||          c S Cg S )
z:Yield egg or source distribution objects based on basename.egg.zipNr-   z.egg-z.whlr   )locationproject_nameversionrJ   r+   )r/   r   from_locationr   is_compatiblerT   rU   r   r   r   r   
EXTENSIONSlen)rS   basenamerO   wheelwin_baser3   platformexts           r(   rK   rK      s   $$ !CRC=   JSH__*8XxHHII   
SH__h""$$ 	I!"/#a<  
 	
    %8%B%B"&(((Hfk8  
  G GS!! 	G3s88),H(8XFFFFF	G Ir5   c                 x    t          t          |           t          j                            |           |          S )zEYield possible egg or source distribution objects based on a filename)rK   r   osrD   rZ   )filenamerO   s     r(   distros_for_filenamerb      s3    x  "'"2"28"<"<h  r5   c           
   #     K   |                     d          }|s#t          d |dd         D                       rdS t          t          |                    D ]&}||         dd                                         r n't          |          }t          | |d                    |d|                   d                    ||d                   |||          V  dS )zGenerate the interpretation of a source distro name

    Note: if `location` is a filesystem filename, you should call
    ``pkg_resources.normalize_path()`` on it before passing it to this
    routine!
    rR   c              3   @   K   | ]}t          j        d |          V  dS )z	py\d\.\d$N)rerM   ).0ps     r(   	<genexpr>z(interpret_distro_name.<locals>.<genexpr>   s.      KKAbh|Q77KKKKKKr5      Nr   )
py_versionrJ   r]   )r?   anyrangerY   isdigitr   join)rS   rZ   rO   rj   rJ   r]   rA   rg   s           r(   r   r      s
      NN3E #KKqrrKKKKK  3u::  8BQB<!! 	E	 JJ
rrqrr       r5   c                 <     t                      fd            }|S )zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    c                  .    t           | i |          S Nr   )argskwargsfuncs     r(   wrapperzunique_values.<locals>.wrapper   s     ttT4V44555r5   r   )rt   ru   s   ` r(   unique_valuesrv      s5     4[[6 6 6 6 [6 Nr5   z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c           
   #     K   t                               |          D ]}|                                \  }}t          t	          t
          j        |                                                    d                              }d|v sd|v r_t                              |          D ]D}t          j                            | t          |                    d                              V  EdD ]|}|                    |          }|dk    r_t                              ||          }|rBt          j                            | t          |                    d                              V  }dS )zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager9   r   )z<th>Home Pagez<th>Download URLr8   N)RELfinditergroupssetmapstrstripr.   r?   HREFr<   r$   urljoin
htmldecoderN   findsearch)r@   pagerM   tagrelrelsposs          r(   find_external_linksr      sM      d## L L<<>>S3sy#))++"3"3C"8"899::t!3!3s++ L Ll**3
5;;q>>0J0JKKKKKK4 L Liinn"99KKc**E Ll**3
5;;q>>0J0JKKKKKL Lr5   c                   $    e Zd ZdZd Zd Zd ZdS )ContentCheckerzP
    A null content checker that defines the interface for checking content
    c                     dS )z3
        Feed a block of data to the hash.
        N selfblocks     r(   feedzContentChecker.feed   s	     	r5   c                     dS )zC
        Check the hash. Return False if validation fails.
        Tr   r   s    r(   is_validzContentChecker.is_valid   s	     tr5   c                     dS )zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        Nr   )r   reportertemplates      r(   reportzContentChecker.report  s	    
 	r5   N)__name__
__module____qualname____doc__r   r   r   r   r5   r(   r   r      sK                 r5   r   c                   \    e Zd Z ej        d          Zd Zed             Zd Z	d Z
d ZdS )HashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c                 T    || _         t          j        |          | _        || _        d S rq   )	hash_namehashlibnewhashexpected)r   r   r   s      r(   __init__zHashChecker.__init__  s%    "K	**	 r5   c                     t           j                            |          d         }|st                      S | j                            |          }|st                      S  | di |                                S )z5Construct a (possibly null) ContentChecker from a URLr8   r   )r<   r$   r=   r   patternr   	groupdict)clsr@   rG   rM   s       r(   from_urlzHashChecker.from_url  s{     <((--b1 	$!###""8,, 	$!###s''U__&&'''r5   c                 :    | j                             |           d S rq   )r   updater   s     r(   r   zHashChecker.feed!  s    	r5   c                 F    | j                                         | j        k    S rq   )r   	hexdigestr   r   s    r(   r   zHashChecker.is_valid$  s    y""$$55r5   c                 ,    || j         z  } ||          S rq   )r   )r   r   r   msgs       r(   r   zHashChecker.report'  s    'x}}r5   N)r   r   r   re   compiler   r   classmethodr   r   r   r   r   r5   r(   r   r     s        bj	# G
! ! !
 ( ( [(     6 6 6    r5   r   c                   <    e Zd ZdZ	 	 	 	 d+ fd	Z fdZd,d	Zd,d
Zd,dZd Z	d Z
d Zd Zd Zd-dZd Zd- fd	Zd Zd Zd Zd Zd Z	 	 	 	 d.dZd/dZd ZdZd Zd Zd-dZd  Zed!             Zd" Z d# Z!d$ Z"d% Z#d& Z$ed'             Z%d( Z&d) Z'd* Z( xZ)S )0r   z;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTc                 r    t                      j        |i | |dd |                    d                    z   | _        i | _        i | _        i | _        t          j        d	                    t          t          |                              j        | _        g | _        t          j        j        | _        d S )Nr7   |)superr   r/   	index_urlscanned_urlsfetched_urlspackage_pagesre   r   rn   r~   r   rM   allowsto_scanr<   requesturlopenopener)r   r   hosts	ca_bundle
verify_sslrr   kw	__class__s          r(   r   zPackageIndex.__init__/  s     	$%"%%%"S)Fy/A/A#/F/F+F)F%GGj#i*?*?!@!@AAGn,r5   c                     	 t          |j                   n# t          $ r Y d S w xY wt                                          |          S rq   )r   rU   	Exceptionr   add)r   distr   s     r(   r   zPackageIndex.addA  sS    	$,'''' 	 	 	44	ww{{4   s    
&&Fc           	         || j         v r|sdS d| j         |<   t          |          s|                     |           dS t          t	          |                    }|r-|                     |          sdS |                     d|           |s|r	|| j        v r$t          t          | j	        |                     dS |                     |          sd| j        |<   dS | 
                    d|           d| j        |<   d}|                     |||z            }|dS t          |t          j        j                  r(|j        dk    r| 
                    d|j        z             d| j        |j        <   d|j                            d	d
                                          vr|                                 dS |j        }|                                }t          |t0                    sTt          |t          j        j                  rd}n|j                            d          pd}|                    |d          }|                                 t6                              |          D ]W}	t          j                            |t?          |	                     d                              }
| !                    |
           X|"                    | j#                  r-tI          |dd          dk    r| %                    ||          }dS dS dS )z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i  zAuthentication error: %shtmlcontent-type zlatin-1charsetignorer   code  )&r   
URL_SCHEMEprocess_filenamelistr   url_okdebugr   r~   r   infoopen_url
isinstancer<   error	HTTPErrorr   r   r@   headersgetr.   closereadr   	get_paramdecoder   r{   r$   r   r   rN   process_urlr0   r   getattrprocess_index)r   r@   retrievediststmplfr2   r   r   rM   links              r(   r   zPackageIndex.process_urlJ  s   $###H#F!%## 	2!!#&&&F--..E 2{{3'' F

+S111 	 	C4+<$<$<TXu%%&&&F{{3 	%)Dc"F		,$$$!%#MMM#tcz**9Fa/00 	:QVs]]II0158999#'!% ~r::@@BBBBGGIIIFuvvxx$$$ 	2!V\344 F#)--i88EI;;w11D				]]4(( 	# 	#E<''jQ.H.HIIDT"""">>$.)) 	1ga.F.F#.M.M%%c400DDD	1 	1.M.Mr5   c                     t           j                            |          s|                     d|           d S t           j                            |          rl|sjt           j                            |          }t          j        |          D ]6}|                     t           j                            ||          d           7t          |          }|r:| 
                    d|           t          t          | j        |                     d S d S )NzNot found: %sTz	Found: %s)r`   rD   existswarnisdirrealpathlistdirr   rn   rb   r   r   r~   r   )r   fnnestedrD   itemr   s         r(   r   zPackageIndex.process_filename  s    w~~b!! 	IIor***F7== 	FV 	F7##B''D
4(( F F%%bgll4&>&>EEEE$R(( 	'JJ{B'''TXu%%&&&&&	' 	'r5   c                 N   t          |          }|o*|                    d                                          dk    }|s8|                     t          j                            |          d                   rdS d}|rt          ||z            |                     ||           dS )Nr   fileTz
Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details).
F)	r   rN   r.   r   r<   r$   r=   r   r   )r   r@   fatalsis_filer   s         r(   r   zPackageIndex.url_ok  s    sOO4

((**f4 	dkk&,"7"7"<"<Q"?@@ 	4W 	
  	 s+++IIc35r5   c                     t          t          j        j        |          }d |D             }t	          t          j        | j        |                     d S )Nc              3   v   K   | ]4}t          j        |          D ]}|                    d           ||fV  5dS )z	.egg-linkN)r`   r   r/   )rf   rD   entrys      r(   rh   z.PackageIndex.scan_egg_links.<locals>.<genexpr>  sm       
 
D))
 
 ~~k**	
5M
 
 
 
 
 
 
r5   )filterr`   rD   r   r   	itertoolsstarmapscan_egg_link)r   search_pathdirs	egg_linkss       r(   scan_egg_linkszPackageIndex.scan_egg_links  sY    bgm[11
 

 
 
	 	Yt19==>>>>>r5   c           
         t          t          j                            ||                    }t	          t          d t          t          j        |	                                                              }t          |          dk    rd S |\  }}t          t          j                            ||                    D ]?}t          j        j        |g|R  |_        t          |_        |                     |           @d S )Nri   )r   r`   rD   rn   r   r   r~   r   r   
splitlinesrY   r   rS   r	   rJ   r   )r   rD   r   contentlinesegg_path
setup_pathr   s           r(   r  zPackageIndex.scan_egg_link  s    *27<<e+D+DEEVD#ci1C1C1E1E"F"FGGHHu::??F$*&rw||D('C'CDD 	 	DGL6666DM)DOHHTNNNN	 	r5   c           	         d}|                     | j                  s|S t          t          t          j        j        |t          | j                  d                              d                              }t          |          dk    s
d|d         v r|S t          |d                   }t          |d                   }d| j                            |                                i           |<   t          |          t          |          fS )N)NNr7   ri   r;   r   r   T)r0   r   r   r~   r<   r$   r>   rY   r?   r   r   r   
setdefaultr.   r   )r   r   NO_MATCH_SENTINELrA   pkgvers         r(   _scanzPackageIndex._scan  s    &t~.. 	%$$S-tC4G4G4I4I/J/P/PQT/U/UVVWWu::??cU1Xoo$$ a!!58$$?C%%ciikk266t<3S!1!111r5   c                 \   t                               |          D ]f}	 |                     t          j                            |t          |                    d                                         W# t          $ r Y cw xY w|                     |          \  }}|sdS t          ||          D ]c}t          |          \  }}|                    d          r%|s#|r|d|d|z  }n|                     |           |                     |           dt                              d |          S )z#Process the contents of a PyPI pager   r   .pyz#egg=rR   c                 6    d|                      ddd          z  S )Nz<a href="%s#md5=%s">%s</a>r      ri   )rN   )ms    r(   <lambda>z,PackageIndex.process_index.<locals>.<lambda>  s    2QWWQ15E5EE r5   )r   r{   r  r<   r$   r   r   rN   r%   r   rH   r/   need_version_infoscan_urlPYPI_MD5sub)	r   r@   r   rM   r  r  new_urlr2   frags	            r(   r   zPackageIndex.process_index  sN    ]]4(( 	 	E

6<//ZA5O5OPPQQQQ    ::c??S 	2 +355 	# 	#G)'22JD$}}U## 0D 0 0GsssCC88GG**3///MM'""""||EEt
 
 	
s   AA22
A?>A?c                 2    |                      d|           d S )NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allr   r@   s     r(   r  zPackageIndex.need_version_info  s*     	
 	
 	
 	
 	
r5   c                     | j         | j        vr%|r | j        |g|R   |                     d           |                     | j                    d S )Nz6Scanning index of all packages (this may take a while))r   r   r   r   r  r   r   rr   s      r(   r   zPackageIndex.scan_all  sa    >!222 &	#%%%%%IINOOOdn%%%%%r5   c                    |                      | j        |j        z   dz              | j                            |j                  s%|                      | j        |j        z   dz              | j                            |j                  s|                     |           t          | j                            |j        d                    D ]}|                      |           d S )Nr7   r   )	r  r   unsafe_namer   r   keyrT   not_found_in_indexr   )r   requirementr@   s      r(   find_packageszPackageIndex.find_packages  s    dn{'>>DEEE!%%ko66 	KMM$.;+CCcIJJJ!%%ko66 	1##K000*..{CCDD 	 	CMM#	 	r5   c                     |                                   |                     |           | |j                 D ]!}||v r|c S |                     d||           "t	                                          ||          S )Nz%s does not match %s)prescanr)  r&  r   r   obtain)r   r(  	installerr   r   s       r(   r,  zPackageIndex.obtain  s    ;''') 	B 	BD{""JJ-{DAAAAww~~k9555r5   c                 2   |                     | j        d|z             |                                sd|                                 t	          j        |           t          |j        j        dt          j	        
                    |          d          dS )z-
        checker is a ContentChecker
        zValidating %%s checksum for %sz validation failed for z; possible download problem?N)r   r   r   r   r`   unlinkr   r   r1   rD   rZ   )r   checkerra   tfps       r(   
check_hashzPackageIndex.check_hash  s     	tz#Ch#NOOO!! 	IIKKKIh  <$$$bg&6&6x&@&@&@&@B  	 	r5   c                     |D ]y}| j         @t          |          r1|                    d          st          t	          |                    r|                     |           _| j                             |           zdS )z;Add `urls` to the list that will be prescanned for searchesNfile:)r   r   r0   r   r   r  append)r   urlsr@   s      r(   add_find_linkszPackageIndex.add_find_links  s     	) 	)C$!# %>>'** % ,,-- % c"""" ##C((((	) 	)r5   c                 p    | j         r't          t          | j        | j                              d| _         dS )z7Scan urls scheduled for prescanning (e.g. --find-links)N)r   r   r~   r  r   s    r(   r+  zPackageIndex.prescan)  s3    < 	3T]DL11222r5   c                     | |j                  r
| j        d}}n	| j        d}} |||j                   |                                  d S )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r&  r   r   r%  r   )r   r(  methr   s       r(   r'  zPackageIndex.not_found_in_index/  sX      		#H#DD 	E D 	S+)***r5   c                    t          |t                    st          |          }|rV|                     ||          }t	          |          \  }}|                    d          r|                     |||          }|S t          j        	                    |          r|S t          |          }t          |                     ||          dd          S )a  Locate and/or download `spec` to `tmpdir`, returning a local path

        `spec` may be a ``Requirement`` object, or a string containing a URL,
        an existing local filename, or a project/version requirement spec
        (i.e. the string form of a ``Requirement`` object).  If it is the URL
        of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one
        that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is
        automatically created alongside the downloaded file.

        If `spec` is a ``Requirement`` object or a string containing a
        project/version requirement spec, this method returns the location of
        a matching distribution (possibly after downloading it to `tmpdir`).
        If `spec` is a locally existing file or directory name, it is simply
        returned unchanged.  If `spec` is a URL, it is downloaded to a subpath
        of `tmpdir`, and the local filename is returned.  Various errors may be
        raised if a problem occurs during downloading.
        r  rS   N)r   r   r   _download_urlrH   r/   	gen_setupr`   rD   r   r)   r   fetch_distribution)r   r&   tmpdirrB   foundr2   rG   s          r(   r9   zPackageIndex.download:  s    $ $,, 	3%%F 3**488!1$!7!7h=='' D NN5(FCCE%% 3,T22t..tV<<j$OOOr5   c                 0   	                       d|           t                      	d}d	 	fd	}|r4                                                       |            ||          }|s| |||          }|& j                                           ||          }|"|s                      |            ||          }|                     drdpd|           dS                       d|           |                    |j                  S )
a|  Obtain a distribution suitable for fulfilling `requirement`

        `requirement` must be a ``pkg_resources.Requirement`` instance.
        If necessary, or if the `force_scan` flag is set, the requirement is
        searched for in the (online) package index as well as the locally
        installed packages.  If a distribution matching `requirement` is found,
        the returned distribution's ``location`` is the value you would have
        gotten from calling the ``download()`` method with the matching
        distribution's URL or filename.  If no matching distribution is found,
        ``None`` is returned.

        If the `source` flag is set, only source distributions and source
        checkout links will be considered.  Unless the `develop_ok` flag is
        set, development and system eggs (i.e., those using the ``.egg-info``
        format) will be ignored.
        zSearching for %sNc                 z   |}|| j                  D ]}|j        t          k    r2s0|vr+                    d|                               |           D|| v o|j        t
          k    p }|rJ                    |j        	          }||_        t          j
                            |j                  r|c S d S )Nz&Skipping development or system egg: %s)r&  rJ   r   r   r   r	   r9   rS   download_locationr`   rD   r   )
reqenvr   testloc
develop_okr   skippedsourcer?  s
        r(   r   z-PackageIndex.fetch_distribution.<locals>.findz  s    { CG $ $?l22:27**		D     D)))s{U;(F(Tf* $--v>>C-0D*w~~d&<== $#4r5   z:No local packages or working download links found for %s%sza source distribution of r   zBest match: %s)rS   rq   )r   r}   r+  r)  r   r   clonerC  )
r   r(  r?  
force_scanrJ  rH  local_indexr   r   rI  s
   ` ` ``   @r(   r>  zPackageIndex.fetch_distribution\  sm   4 			$k222%%	 	 	 	 	 	 	 	 	 	0  	%LLNNN{+++4$$D 	2/4[11D<|'4$$D<
<{+++4$$D<IIL77=2  
 4II&---::t'=:>>>r5   c                 H    |                      ||||          }||j        S dS )a3  Obtain a file suitable for fulfilling `requirement`

        DEPRECATED; use the ``fetch_distribution()`` method now instead.  For
        backward compatibility, this routine is identical but returns the
        ``location`` of the downloaded distribution instead of a distribution
        object.
        N)r>  rS   )r   r(  r?  rL  rJ  r   s         r(   fetchzPackageIndex.fetch  s0     &&{FJOO= tr5   c                    t                               |          }|r.d t          ||                    d          d           D             pg }t	          |          dk    rZt
          j                            |          }t
          j                            |          |k    rvt
          j        	                    ||          }t
          j        
                    |          r t
          j                            ||          st          j        ||           |}t          t
          j        	                    |d          dd          5 }|                    d|d         j        d	|d         j        d
t
          j                            |          d         d           d d d            n# 1 swxY w Y   |S |rt'          d|d|          t'          d          )Nc                      g | ]}|j         	|S r   )rU   )rf   ds     r(   
<listcomp>z*PackageIndex.gen_setup.<locals>.<listcomp>  s0       9  r5   r   zsetup.pywzutf-8)encodingz(from setuptools import setup
setup(name=r   z
, version=z, py_modules=[z])
z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rL   rM   r   rN   rY   r`   rD   rZ   dirnamern   r   samefileshutilcopy2openwriterT   rU   splitextr   )	r   ra   rG   r?  rM   r   rZ   dstr   s	            r(   r=  zPackageIndex.gen_setup  s   ""8,,  .xQNN    	 u::??w''11H wx((F22gll6844s++ #0@0@30O0O #L3///"Hbgll6:66gNNN 	RV


 a---a(((((221555  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 O 
	 . &.XXuu6   !G  s   	AF..F25F2i    c                    |                      d|           d }	 t                              |          }|                     |          }t	          |t
          j        j                  r"t          d|d|j	        d|j
                  |                                 }d}| j        }d}d|v rP|                    d          }	t          t          t          |	                    }|                     |||||           t#          |d	          5 }
	 |                    |          }|rI|                    |           |
                    |           |dz  }|                     |||||           nnb|                     |||
           d d d            n# 1 swxY w Y   ||r|                                 S S # |r|                                 w w xY w)NzDownloading %szCan't download :  r   r8   zcontent-lengthzContent-LengthwbTr   )r   r   r   r   r   r<   r   r   r   r   r   dl_blocksizeget_allmaxr~   int
reporthookrZ  r   r   r[  r2  r   )r   r@   ra   fpr0  r   blocknumbssizesizesr1  r   s               r(   _download_tozPackageIndex._download_to  s   		"C(((	!**3//Gs##B"fl455 $n25##rwwwG   ggiiGH"BD7**(8993sE??++XxTBBBh%% 
8GGBKKE U+++		%((( AXxTJJJJ 3777
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8 
8  



r 



s1   C3F8 A;FF8 FF8 FF8 8Gc                     d S rq   r   )r   r@   ra   rh  blksizerj  s         r(   rf  zPackageIndex.reporthook  s    r5   c                    |                     d          rt          |          S 	 t          || j                  S # t          t
          j        j        f$ r]}d                    d |j	        D                       }|r| 
                    ||           nt          |d|          |Y d }~d S d }~wt          j        j        $ r}|cY d }~S d }~wt          j        j        $ rD}|r| 
                    ||j                   nt          d|d|j                  |Y d }~d S d }~wt
          j        j        $ rC}|r| 
                    ||j                   nt          |d|j                  |Y d }~d S d }~wt
          j        j        t(          f$ r:}|r| 
                    ||           nt          d|d|          |Y d }~d S d }~ww xY w)Nr4  r`  c                 ,    g | ]}t          |          S r   )r   )rf   args     r(   rS  z)PackageIndex.open_url.<locals>.<listcomp>  s    777CHH777r5   zDownload error for r_  z7 returned a bad status line. The server might be down, )r0   
local_openopen_with_authr   r%   httpclient
InvalidURLrn   rr   r   r   r<   r   r   URLErrorreasonBadStatusLinelineHTTPExceptionOSError)r   r@   warningvr   s        r(   r   zPackageIndex.open_url  sm   >>'"" 	#c??"	T!#t{333DK23 	B 	B 	B((7777788C B		'3''''$SS%9::A (''''' |% 	 	 	HHHHHH|$ 	 	 	 		'18,,,,$n3633A  -,,,,,
 {( 	 	 	 		'16****$"%##qvv/   +***** )73 	T 	T 	T T		'1%%%%$nCCC%KLLRSS &%%%%%	TsL   ; GAB..GCGG#9D""G98E77G/G

Gc                 j   t          |          \  }}|r3d|v r.|                    dd                              dd          }d|v .nd}|                    d          r
|d d         }t          j                            ||          }|                     ||          p|                     ||          S )Nz...\___downloaded__rQ   r-   )rH   replacer/   r`   rD   rn   _download_vcs_download_other)r   r@   r?  r1   rG   ra   s         r(   r<  zPackageIndex._download_url5  s     *#..h 	$$,,||D#..66tSAA $,, $D==$$ 	9D7<<--!!#x00WD4H4Hh4W4WWr5   c                    t           j                            |           j        }|                    d          \  }}}t          ddgdgt          |          z  z             }t          t          |h|z            d          S )a  
        >>> rvcs = PackageIndex._resolve_vcs
        >>> rvcs('git+http://foo/bar')
        'git'
        >>> rvcs('hg+https://foo/bar')
        'hg'
        >>> rvcs('git:myhost')
        'git'
        >>> rvcs('hg:myhost')
        >>> rvcs('http://foo/bar')
        +svngithgN)	r<   r$   urlsplitrB   	partitionr}   boolnextiter)r@   rB   preseppostalloweds         r(   _resolve_vcszPackageIndex._resolve_vcsF  sv     &&s++2))#..S$uenvS		'99::D#))4000r5   c                    |                      |          }|sd S |dk    rt          d|           |                    d          \  }}}|                     |          \  }}|                     d| d| d|            t          j        |dd||g           t          |d	|d
d|g|d|dd	d|dg          }|2|                     d|            t          j        ||                    |S )Nr  z/Invalid config, SVN download is not supported: r;   zDoing z clone from z to rK  z--quietz-Ccheckoutz--cwdupz-rz-q)r  r  zChecking out )r  r   r  _vcs_split_rev_from_urlr   
subprocess
check_calldict)r   r@   spec_filenamevcsra   r  revco_commandss           r(   r  zPackageIndex._download_vcsY  s6   $$ 	4%<< G#GG   '0055!Q//44S		?3??C??X??@@@sGYXFGGGdHj)SAWhdD#tD
 
 
 ?II+c++,,,!+c"2333r5   c                 0   t           j                            |          j        }|dk    rAt           j                            t           j                            |          j                  S |                     |d           | 	                    ||          S )Nr   T)
r<   r$   r  rB   r   url2pathnamer=   rD   r   _attempt_download)r   r@   ra   rB   s       r(   r  zPackageIndex._download_otherr  sx    &&s++2V>..v|/D/DS/I/I/NOOOC%%c8444r5   c                 2    |                      |d           d S )NT)r   r!  s     r(   r  zPackageIndex.scan_urlz  s    d#####r5   c                     |                      ||          }d|                    dd                                          v r|                     |||          S |S )Nr   r   r   )rl  r   r.   _invalid_download_html)r   r@   ra   r   s       r(   r  zPackageIndex._attempt_download}  sY    ##C22W[[44::<<<<..sGXFFFOr5   c                 N    t          j        |           t          d|           )NzUnexpected HTML page found at )r`   r/  r   )r   r@   r   ra   s       r(   r  z#PackageIndex._invalid_download_html  s)    
	(CcCCDDDr5   c                 f   t           j                            |           }|j                            dd          d         }|j                            d          \  }}}|                    d          \  }}}|r||fn|df\  }}	|                    ||d          	                                }
|
|	fS )	a  
        Given a possible VCS URL, return a clean URL and resolved revision if any.

        >>> vsrfu = PackageIndex._vcs_split_rev_from_url
        >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', 'v69.0.0')
        >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', None)
        >>> vsrfu('http://foo/bar')
        ('http://foo/bar', None)
        r  r   r8   r;   @Nr   )rB   rD   rG   )
r<   r$   r  rB   r?   rD   r  
rpartition_replacegeturl)r@   rA   clean_schemeno_fragment_pathr  r  r  r  
clean_pathr  resolveds              r(   r  z$PackageIndex._vcs_split_rev_from_url  s     %%c**|))#q11"5 "'!5!5c!:!:!Q)44S99S$),>3++4,
C>>	 " 
 

 &(( 	 }r5   c                 *    t          j        |g|R   d S rq   )r   r   r#  s      r(   r   zPackageIndex.debug  s     	#r5   c                 *    t          j        |g|R   d S rq   )r   r   r#  s      r(   r   zPackageIndex.info       tr5   c                 *    t          j        |g|R   d S rq   )r   r   r#  s      r(   r   zPackageIndex.warn  r  r5   )r   r   NT)Frq   )FFFN)FF)*r   r   r   r   r   r   r   r   r   r  r  r  r   r  r   r)  r,  r2  r7  r+  r'  r9   r>  rO  r=  rb  rl  rf  r   r<  staticmethodr  r  r  r  r  r  r  r   r   r   __classcell__r   s   @r(   r   r   ,  s       EE -- - - - - -$! ! ! ! !31 31 31 31j' ' ' '     ? ? ?   2 2 2 
 
 
:
 
 
& & & &  6 6 6 6 6 6  ) ) )  	 	 	 P  P  PL P? P? P? P?d   , , ,\ L" " "H   T  T  T  TDX X X" 1 1 \1$  25 5 5$ $ $  E E E   \>          r5   r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 T    |                      d          }t          j        |          S )Nr   )rN   r   unescape)rM   whats     r(   decode_entityr    s!    ;;q>>D=r5   c                 ,    t          t          |           S )a  
    Decode HTML entities in the given text.

    >>> htmldecode(
    ...     'https://../package_name-0.1.2.tar.gz'
    ...     '?tokena=A&amp;tokenb=B">package_name-0.1.2.tar.gz')
    'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz'
    )
entity_subr  )texts    r(   r   r     s     mT***r5   c                       fd}|S )Nc                       fd}|S )Nc                      t          j                    }t          j                   	  | i |t          j        |           S # t          j        |           w xY wrq   )socketgetdefaulttimeoutsetdefaulttimeout)rr   rs   old_timeoutrt   timeouts      r(   _socket_timeoutz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeout  sd     244K$W---6tT,V,,(5555(5555s   A Ar   )rt   r  r  s   ` r(   r  z'socket_timeout.<locals>._socket_timeout  s*    	6 	6 	6 	6 	6 	6 r5   r   )r  r  s   ` r(   socket_timeoutr    s$    	 	 	 	 	 r5   c                     t           j                            |           }|                                }t	          j        |          }|                                }|                    dd          S )a9  
    Encode auth from a URL suitable for an HTTP header.
    >>> str(_encode_auth('username%3Apassword'))
    'dXNlcm5hbWU6cGFzc3dvcmQ='

    Long auth strings should not cause a newline to be inserted.
    >>> long_auth = 'username:' + 'password'*10
    >>> chr(10) in str(_encode_auth(long_auth))
    False
    
r   )r<   r$   r>   encodebase64	b64encoder   r  )authauth_s
auth_bytesencoded_bytesencodeds        r(   _encode_authr    s[     \!!$''FJ$Z00M""$$G??4$$$r5   c                   $    e Zd ZdZd Zd Zd ZdS )
Credentialz:
    A username/password pair. Use like a namedtuple.
    c                 "    || _         || _        d S rq   usernamepassword)r   r  r  s      r(   r   zCredential.__init__  s      r5   c              #   .   K   | j         V  | j        V  d S rq   r  r   s    r(   __iter__zCredential.__iter__  s(      mmr5   c                 &    dt          |           z  S )Nz%(username)s:%(password)s)varsr   s    r(   __str__zCredential.__str__  s    *T$ZZ77r5   N)r   r   r   r   r   r  r  r   r5   r(   r  r    sK         ! ! !  8 8 8 8 8r5   r  c                   @     e Zd Z fdZed             Zd Zd Z xZS )
PyPIConfigc                 `   t                               g dd          }t                                          |           t          j                            t          j                            d          d          }t          j                            |          rt          | |           dS dS )z%
        Load from ~/.pypirc
        )r  r  
repositoryr   ~z.pypircN)
r  fromkeysr   r   r`   rD   rn   
expanduserr   r   )r   defaultsrcr   s      r(   r   zPyPIConfig.__init__  s     ==!G!G!GLL"""W\\"',,S119==7>>" 	3(r22222	3 	3r5   c                       fd                                  D             }t          t           j        |                    S )Nc                 d    g | ],}                     |d                                           *|-S )r  )r   r   )rf   sectionr   s     r(   rS  z2PyPIConfig.creds_by_repository.<locals>.<listcomp>  sI     &
 &
 &
xx..4466&
&
 &
 &
r5   )sectionsr  r~   _get_repo_cred)r   sections_with_repositoriess   ` r(   creds_by_repositoryzPyPIConfig.creds_by_repository	  sR    &
 &
 &
 &
==??&
 &
 &
" C+-GHHIIIr5   c                    |                      |d                                          }|t          |                      |d                                          |                      |d                                                    fS )Nr  r  r  )r   r   r  )r   r  repos      r(   r  zPyPIConfig._get_repo_cred  st    xx..4466ZHHWj))//11HHWj))//11
 
 
 	
r5   c                 v    | j                                         D ]\  }}|                    |          r|c S dS )z
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)r  itemsr0   )r   r@   r  creds       r(   find_credentialzPyPIConfig.find_credential  sN    
 !% 8 > > @ @ 	 	J~~j)) tr5   )	r   r   r   r   propertyr  r  r  r  r  s   @r(   r  r    st        	3 	3 	3 	3 	3 J J XJ
 
 
      r5   r  c                    t           j                            |           }|\  }}}}}}|                    d          rt          j                            d          |dv rt          |          \  }	}
nd}	|	sMt                      	                    |           }|r*t          |          }	|j        | f}t          j        dg|R   |	rodt          |	          z   }	||
||||f}t           j                            |          }t           j                            |          }|                    d|	           nt           j                            |           }|                    dt&                      ||          }|	rct           j                            |j                  \  }}}}}}||k    r2||
k    r,||||||f}t           j                            |          |_        |S )	z4Open a urllib2 request, handling HTTP authentication:znonnumeric port: '')rt  httpsNz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz
User-Agent)r<   r$   r=   r/   rt  ru  rv  
_splituserr  r  r   r  r   r   r  
urlunparser   Request
add_header
user_agentr@   )r@   r   parsedrB   netlocrD   paramsrF   r  r  addressr  r   rA   r  r   rg  s2h2path2param2query2frag2s                          r(   rs  rs  %  s    \""3''F06-FFD&% s <k$$%:;;;""""6**gg J||++C00 	Jt99D=#%DHAIDIIII .,t,,,vud:,))%00.((11?D1111.((--|Z000	B 4 06|/D/DRV/L/L,Bvvu<<B'MMvvu<E\,,U33BFIr5   c                 D    |                      d          \  }}} |r|nd| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.r  N)r  )hostuserdelims      r(   r  r  T  s0     ,,D%#DDtd**r5   c                     | S rq   r   )r@   s    r(   
fix_sf_urlr  _  s    Jr5   c                    t           j                            |           \  }}}}}}t           j                            |          }t
          j                            |          rt           j                            |           S |	                    d          rt
          j        
                    |          rg }t          j        |          D ]}	t
          j                            ||	          }
|	dk    rt          |
          } nzt
          j        
                    |
          r|	dz  }	|                    d                    |	                     d}|                    | d                    |                    }d\  }}nd	\  }}}d
di}t!          j        |          }t           j                            | ||||          S )z7Read a local path, with special support for directoriesr7   z
index.htmlz<a href="{name}">{name}</a>)r1   zB<html><head><title>{url}</title></head><body>{files}</body></html>r  )r@   files)   OK)r   zPath not foundz	Not foundr   z	text/html)r<   r$   r=   r   r  r`   rD   isfiler   r/   r   r   rn   r   r5  formatioStringIOr   r   )r@   rB   rC   rD   paramrF   r  ra   r  r   filepathbodyr   statusmessager   body_streams                    r(   rr  rr  c  s   /5|/D/DS/I/I,FFD%~**400H	w~~h C~%%c***	s		 Ch 7 7 CH%% 
	@ 
	@Aw||Ha00HL  /99x(( SLL6==1=EEFFFFWD;;3dii.>.>;??D# B{+G+d##K<!!#vwMMMr5   rq   )r    )]r   sysr  r`   re   r  rX  r  r  r   r   configparserr   http.clientrt  urllib.parser<   urllib.requesturllib.error	functoolsr   r"   pkg_resourcesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   	distutilsr   distutils.errorsr   fnmatchr   setuptools.wheelr   more_itertoolsr   unicode_utilsr   r   r   rL   Ir   r  rM   r   r?   rX   __all___SOCKET_TIMEOUT_tmplr  version_infor  r)   r   rH   r   rK   rb   r   rv   rz   r   r   r   r   r  r  r  r   r  r  r  RawConfigParserr  r   r   rs  r  r  rr  r   r5   r(   <module>r1     s   * * 



     				 				 				                                                                              + + + + + +       " " " " " " * * * * * * Q Q Q Q Q Q Q Q rz677rz3RT::2:J  RZ,bd339
.4466
   F\\W^S-.:   

    0  	 	 	 	       F    .2kTX   D
 
 
 bjKRTRR
 L L L$       2    .   BC
 C
 C
 C
 C
; C
 C
 C
P RZ<==A
  
	+ 	+ 	+   % % %*8 8 8 8 8 8 8 8"% % % % %- % % %P  &~5 + + + +^+ + + 100@@  N N N N Nr5   