'QPdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,dd l-m.Z.ej/d Z0ej/d ej1Z2ej/d Z3ej/d ej1j4Z5d6Z7gdZ8dZ9dZ:e:;dj;ej<eZ=dZ>dZ?dZ@d1dZAd1dZBd1dZCdedfdZDdZEej/dej1ZF eEdZGGddZHGd d!eHZIGd"d#eZJej/d$jKZLd%ZMd&ZNd2d'ZOd(ZPGd)d*ZQGd+d,e jRZSejTjUfd-ZVd.ZWeOe9eVZVd/ZXd0ZYdS)3z$PyPI and direct package downloading.Nwraps) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST parse_version)log)DistutilsError) translate)Wheelunique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz) PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namez>, ' ' :DDD   k3 / / "R%[F:DDD ^^, - - :DDD   os 3 3 "R%[F:DD  ctj|}|\}}}}}}tj|dd}|dkr>|dkr8tj|dd}d|vr|dd\}}||fS)N/zsourceforge.netdownload#)urllibr!urlparseunquotesplit) urlpartsschemeserverpath parametersqueryfragmentr/s r%egg_info_for_urlrFfs L ! !# & &E8=5FFD*eX <   3 3 4 4D """tz'9'9|##DJJsOOB$788 d{{C++h >r2c#Kt|\}}t|||D]}|V|rNt|}|r4t ||d|t D] }|VdSdSdS)zEYield egg or source distribution objects that might be found at a URLr9) precedenceN)rFdistros_for_location EGG_FRAGMENTmatchrgroupr)r>metadatar/rEdistrKs r%rrqs%c**ND($S$99 ""8,,  -U[[^^X-       r2c|dr |dd}|drd|vrtj|||gS|drOd|vrKt|}|sgSt||j|jtdzgS|d r.t|\}}}|t||||t|StD]B}||r+|dt| }t|||cSCgS) z:Yield egg or source distribution objects based on basename.egg.zipNr*z.egg-z.whlr9)location project_nameversionrHr() r,r from_locationr is_compatiblerSrTrrrr EXTENSIONSlen)rRbasenamerMwheelwin_baser0platformexts r%rIrIs$$!CRC=  JSH__*8XxHHII   SH__h""$$ I !"/ #a<        %8%B%B"&(  ((Hfk8  GG   S ! ! G 3s88) ,H(8XFF F F F G Ir2cxtt|tj||S)zEYield possible egg or source distribution objects based on a filename)rIrosrBrY)filenamerMs r%distros_for_filenameras3 x  "'"2"28"<"z(interpret_distro_name..s.KKAbh|Q77KKKKKKr2Nr9) py_versionrHr\)r=anyrangerXrjoin)rRrYrMrirHr\r?rfs r%rrs* NN3  E #KKqrrKKKKK 1c%jj1n % %      HHU2A2Y   HHU122Y  !!          r2c<tfd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. c.t|i|SNr)argskwargsfuncs r%wrapperzunique_values..wrappers ttT4V44555r2r)rrrss` r% unique_valuesrts5  4[[6666[6 Nr2z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c #Kt|D]}|\}}tt t j|d}d|vsd|vr_t|D]D}tj |t|dVEdD]|}||}|dkr_t||}|rBtj |t|dV}dS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager6r9)z Home PagezDownload URLr5N)RELfinditergroupssetmapstrstripr+r=HREFr:r!urljoin htmldecoderLfindsearch)r>pagerKtagrelrelsposs r%find_external_linksrsMd##LL<<>>S3sy#))++"3"3C"8"899::   t!3!3s++ L Ll**3 5;;q>>0J0JKKKKKK4LLiinn "99KKc**E Ll**3 5;;q>>0J0JKKKKK LLr2c$eZdZdZdZdZdZdS)ContentCheckerzP A null content checker that defines the interface for checking content cdS)z3 Feed a block of data to the hash. Nselfblocks r%feedzContentChecker.feeds  r2cdS)zC Check the hash. Return False if validation fails. Trrs r%is_validzContentChecker.is_valids tr2cdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr)rreportertemplates r%reportzContentChecker.reports r2N)__name__ __module__ __qualname____doc__rrrrr2r%rrsK  r2rc\eZdZejdZdZedZdZ dZ dZ dS) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cT||_tj||_||_dSro) hash_namehashlibnewhashexpected)rrrs r%__init__zHashChecker.__init__s%"K **   r2ctj|d}|stS|j|}|stS|di|S)z5Construct a (possibly null) ContentChecker from a URLr5r)r:r!r;rpatternr groupdict)clsr>rErKs r%from_urlzHashChecker.from_urls{<((--b1 $!## # ""8,, $!## #s''U__&&'''r2c:|j|dSro)rupdaters r%rzHashChecker.feed$s r2cF|j|jkSro)r hexdigestrrs r%rzHashChecker.is_valid'sy""$$ 55r2c,||jz}||Sro)r)rrrmsgs r%rzHashChecker.report*s'x}}r2N) rrrrdcompilerr classmethodrrrrrr2r%rrsbj #G !!! (([(   666r2rc.eZdZdZ d+fd ZfdZd,d Zd,d Zd,d Zd Z d Z dZ dZ dZ d-dZdZd-fd ZdZdZdZdZdZ d.dZd/dZdZdZdZdZd-dZd Zd!Zd"Zd#Z d$Z!e"d,d%Z#d&Z$d'Z%d(Z&d)Z'd*Z(xZ)S)0rz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTcrtj|i||dd|d z|_i|_i|_i|_tjd tt|j |_ g|_tjj|_dS)Nr4|)superrr, index_url scanned_urls fetched_urls package_pagesrdrrlr|rrKallowsto_scanr:requesturlopenopener)rrhosts ca_bundle verify_sslrpkw __class__s r%rzPackageIndex.__init__2s $%"%%%"S)Fy/A/A#/F/F+F)F%GGj#i*?*?!@!@AAG  n, r2c t|jn#t$rYdSwxYwt|Sro)rrT Exceptionradd)rrNrs r%rzPackageIndex.addDsS  $, ' ' ' '    FF ww{{4   s  &&Fc ||jvr|sdSd|j|<t|s||dStt |}|r-||sdS|d||s |r ||jvr$tt|j |dS||s d|j|<dS| d|d|j|<d}| |||z}|dSt|tjjr(|jdkr| d|jzd|j|j<d|jd d vr|dS|j}|}t|t0sTt|tjjrd }n|jd pd }||d }|t6|D]W} tj|t?| d} |!| X|"|j#r-tI|dddkr|%||}dSdSdS)zheadersgetr+closereadr} get_paramdecoderryr!rrrL process_urlr-rgetattr process_index) rr>retrievediststmplfr/rrrKlinks r%rzPackageIndex.process_urlMs $# # #H # F!%## 2  ! !# & & & F--..E 2{{3''F +S111   C4+<$<$< TXu%% & & & F{{3 %)D c " F ,$$$!%#M MM#tcz * * 9 F a/ 0 0 :QVs]] II0158 9 9 9#'!% ~r::@@BB B B GGIII Fuvvxx$$$ 2!V\344 F#)--i88EI;;w11D  ]]4(( # #E<''jQ.H.HIID   T " " " " >>$. ) ) 1ga.F.F#.M.M%%c400DDD 1 1.M.Mr2c tj|s|d|dStj|rl|sjtj|}tj|D]6}|tj||d7t|}|r:| d|tt|j |dSdS)Nz Not found: %sTz Found: %s)r_rBexistswarnisdirrealpathlistdirrrlrarrr|r)rfnnestedrBitemrs r%rzPackageIndex.process_filenamesw~~b!!  IIor * * * F 7==   FV F7##B''D 4(( F F%%bgll4&>&>EEEE$R((  ' JJ{B ' ' ' TXu%% & & & & & ' 'r2cNt|}|o*|ddk}|s8|tj|drdSd}|rt||z|||dS)Nr9fileTzN Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details). ) rrLr+rr:r!r;rr)rr>fatalsis_filers r%rzPackageIndex.url_oks sOO4 ((**f4  dkk&,"7"7"<".sm  D))  ~~k**  5M       r2)filterr_rBrr itertoolsstarmap scan_egg_link)r search_pathdirs egg_linkss r%scan_egg_linkszPackageIndex.scan_egg_linkssYbgm[11     Y t19 = =>>>>>r2c ttj||5}t t dt tj|}dddn #1swxYwYt|dkrdS|\}}ttj||D]?}tjj|g|R|_ t|_ ||@dS)Nrh)openr_rBrlrrr|r}r~rXr rRr rHr)rrBr raw_lineslinesegg_path setup_pathrNs r%rzPackageIndex.scan_egg_links) "',,tU++ , , B c#)Y&?&?@@AAE B B B B B B B B B B B B B B B u::?? F$*&rw||D('C'CDD  DGL6666DM)DO HHTNNNN  s6A00A47A4c d}||js|Stttjj|t|jdd}t|dks d|dvr|St|d}t|d}d|j | i|<t|t|fS)N)NNr4rhr8r9rT)r-rrr|r:r!r<rXr=r r r setdefaultr+r)rrNO_MATCH_SENTINELr?pkgvers r%_scanzPackageIndex._scans&t~.. %$ $S-tC4G4G4I4I/J/P/PQT/U/UVVWW u::??cU1Xoo$ $a!!58$$?C%%ciikk266t<3S!1!111r2c \t|D]f} |tj|t |dW#t$rYcwxYw||\}}|sdSt||D]c}t|\}}| dr%|s#|r |d|d|z }n| || |dtd|S)z#Process the contents of a PyPI pager9r.pyz#egg=rQc6d|dddzS)Nz%sr9rh)rL)ms r%z,PackageIndex.process_index..s2QWWQ15E5EEr2)rryrr:r!rrrLr"rrFr,need_version_infoscan_urlPYPI_MD5sub) rr>rrKr rnew_urlr/frags r%rzPackageIndex.process_indexsN]]4((  E  6<//Z A5O5OPPQQQQ    ::c??S 2+355 # #G)'22JD$}}U## 0D 00GsssCC88GG**3/// MM' " " " "|| E Et   sAA22 A?>A?c2|d|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allrr>s r%rzPackageIndex.need_version_infos*       r2c|j|jvr%|r|j|g|R|d||jdS)Nz6Scanning index of all packages (this may take a while))rrrrrrrrps r%rzPackageIndex.scan_allsa >!2 2 2 & #%%%%% IIN O O O dn%%%%%r2c||j|jzdz|j|js%||j|jzdz|j|js||t|j|jdD]}||dS)Nr4r) rr unsafe_namerrkeyrSnot_found_in_indexr)r requirementr>s r% find_packageszPackageIndex.find_packagess dn{'>>DEEE!%%ko66 K MM$.;+CCcI J J J!%%ko66 1  # #K 0 0 0*..{CCDD  C MM#      r2c|||||jD]!}||vr|cS|d||"t t |||S)Nz%s does not match %s)prescanr&r#rrrobtain)rr% installerrNrs r%r)zPackageIndex.obtains  ;''') B BD{"" JJ-{D A A A A\4((// YGGGr2c2||jd|z|sd|t j|t |jjdtj |ddS)z- checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) rrrrr_unlinkrrr.rBrY)rcheckerr`tfps r% check_hashzPackageIndex.check_hash s tz#Ch#NOOO!!  IIKKK Ih    <$$$bg&6&6x&@&@&@&@B   r2c|D]y}|j@t|r1|dstt |r||_|j|zdS)z;Add `urls` to the list that will be prescanned for searchesNfile:)rrr-rrrappend)rurlsr>s r%add_find_linkszPackageIndex.add_find_linkss ) )C $!#%>>'**%,,--%  c"""" ##C(((( ) )r2cp|jr'tt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrr|rrs r%r(zPackageIndex.prescan*s3 < 3 T]DL11 2 2 2 r2c||jr |jd}}n |jd}}|||j|dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r#rrr"r)rr%methrs r%r$zPackageIndex.not_found_in_index0sX     #H#DD ED S+)*** r2ct|tst|}|rj||d||}t |\}}|dr||||}|Stj |r|St|}t| ||ddS)aLocate 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. r9rrRN)rrr _download_urlrLrFr, gen_setupr_rBrr&rfetch_distribution)rr#tmpdirr@foundr/rEs r%r6zPackageIndex.download;s$$ ,, 3%%F 3**6<<??D&II!1$!7!7h==''D NN5(FCCE %% 3 ,T22t..tV<.find{s{CG  $ $?l22:27** D )* s{U;(F(Tf*$-- v>>C-0D*w~~d&<==$# ! $ $r2z:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rRro)rr(r&rrcloner@) rr%r< force_scanrGrE local_indexrNrrFs ` ` `` @r%r;zPackageIndex.fetch_distribution]sn4 $k222 $ $ $ $ $ $ $ $ $ $.  % LLNNN   { + + +4 $$D 2 /4 [11D <|' 4 $$D < <   { + + +4 $$D < IIL77=2      II& - - -::t'=:>> >r2cH|||||}||jSdS)a3Obtain 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;rR)rr%r<rIrGrNs r%fetchzPackageIndex.fetchs0&&{FJOO  = tr2c t|}|r.dt||ddDpg}t |dkrXt j|}t j||krvt j ||}t j |r t j ||stj |||}tt j |dd5}|d|djd|djdt j|dd dddn #1swxYwY|S|rt'd |d |t'd ) Nc g|] }|j | Sr)rT)reds r% z*PackageIndex.gen_setup..s09r2r9zsetup.pywz(from setuptools import setup setup(name=rz , 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.)rJrKrrLrXr_rBrYdirnamerlrsamefileshutilcopy2rwriterSrTsplitextr) rr`rEr<rKrrYdstrs r%r:zPackageIndex.gen_setups""8,,  .xQNN    u::??w''11Hwx((F22gll6844s++#0@0@30O0O#L3///"Hbgll6:66<<  a---a(((((221555                O   .&.XXuu6  !G sAF,,F03F0i c|d|d} t|}||}t |t jjr"td|d|j d|j |}d}|j }d}d|vrP| d} ttt| }||||||t#|d 5} ||} | rI|| | | |d z }||||||nnb|||| dddn #1swxYwY||r|SS#|r|wwxYw) NzDownloading %szCan't download :  rr5zcontent-lengthzContent-LengthwbTr9)rrrrrr:rrrrr dl_blocksizeget_allmaxr|int reporthookrrrrVr/r) rr>r`fpr-rblocknumbssizesizesr.rs r% _download_tozPackageIndex._download_tos "C(((  !**3//Gs##B"fl455 $n25##rwwwGggiiGH"BD7**(8993sE??++XxTBBBh%% 8GGBKKE U+++ %((( A XxTJJJJ3777 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8   r   s1C3F8 A;F F8FF8FF88GcdSror)rr>r`rcblksizeres r%razPackageIndex.reporthooks r2c|drt|S t||jS#tt jjf$r]}dd|j D}|r| ||nt|d||Yd}~dSd}~wtj j$r }|cYd}~Sd}~wtj j$rD}|r| ||jntd|d|j|Yd}~dSd}~wt jj$rC}|r| ||jnt|d|j|Yd}~dSd}~wt jjt(j f$r:}|r| ||ntd|d||Yd}~dSd}~wwxYw)Nr1r[c,g|]}t|Sr)r})reargs r%rPz)PackageIndex.open_url..s777CHH777r2zDownload error for rZz7 returned a bad status line. The server might be down, )r- local_openopen_with_authrr"httpclient InvalidURLrlrprrr:rrURLErrorreason BadStatusLineline HTTPExceptionsocket)rr>warningvrs r%rzPackageIndex.open_urlso >>' " " #c?? " T!#t{33 3DK23 B B B((7777788C B '3''''$SS%9::A('''''|%   HHHHHH|$     '18,,,,$n3633A-,,,,, {(     '16****$"%##qvv/+*****  )6<8 T T T T '1%%%%$nCCC%KLLRSS&%%%%% TsL;GAB..GC G G#9D""G98E77#G/GGct|\}}|r3d|vr.|dddd}d|v.nd}|dr |dd}tj||}|dks|d r|||S|d ks|d r|||S|d r| ||S|d krBtj tj |dS||d|||S)Nz...\___downloaded__rPr*svnzsvn+gitzgit+zhg+rrhT)rFreplacer,r_rBrlr- _download_svn _download_git _download_hgr:r url2pathnamer!r;r_attempt_download)rr@r>r<r.rEr`s r%r9zPackageIndex._download_url4s*#..h  $$,,||D#..66tSAA$,,$D == $ $ 9D7<<-- U??f//77?%%c844 4 u__ 1 1& 9 9_%%c844 4   u % % 9$$S(33 3 v  >..v|/D/DS/I/I!/LMM M KKT " " "))#x88 8r2c2||ddS)NT)rrs r%rzPackageIndex.scan_urlQs d#####r2c|||}d|ddvr||||S|S)Nrrr)rgrr+_download_html)rr>r`rs r%rzPackageIndex._attempt_downloadTsY##C22 W[[44::<< < <&&sGX>> >Or2ctt|}|D]m}|rWtjd|r@|t j||||cSnn|t j|td|z)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r��r~���rd���r���r���r_���r,��r��r���)r���r>���r���r`���r���ru��s��� r%���r��zPackageIndex._download_html[��s����H~~� � Dzz||� 9@$GG�=JJLLLIh'''--c8<<<<< �  (=CDDDr2���c��������������������t����������j��������dt���������������������|��������������������dd����������d���������}d}|����������������������������������������������������d����������rd|v�rt ����������j����������������������������|����������\��}}}}}} |s|��������������������d����������rd |d d����������v�r|d d������������������������������d d����������\��}}t����������|����������\��} } | rTd | v�r"| ��������������������d d����������\��} } d | d | }nd | z���}| }|||||| f}t ����������j�������� ��������������������|����������}|� ��������������������d||�����������t����������j ��������d|d|d|�����������|S�)Nz"SVN download support is deprecatedr8���r9���r���r���zsvn:@z//r4���rh���:z --username=z --password=z'Doing subversion checkout from %s to %sz svn checkoutz -q r[��)warningsr��� UserWarningr=���r+���r-���r:���r!���r;��� _splituser urlunparser���r_���system)r���r>���r`���credsr@���netlocrB���rf���qr���authhostuserpwr?���s��� r%���r��zPackageIndex._download_svnj��s��� :KHHHiiQ" 99;; ! !& ) )� 9cSjj,2L,A,A#,F,F )FFD!Q� 9dood33� 9tABBx#ABBx~~c155 '// d�9d{{#'::c1#5#5bbBF$$ K . 5!F"FCAq8E ,11%88C ;S(KKK uuuccc88DEEEr2���c�����������������J���t�����������j����������������������������|�����������\��}}}}}|��������������������dd����������d���������}|��������������������dd����������d���������}d�}d|v�r|��������������������dd����������\��}}t�����������j����������������������������||||df����������}�|�|fS�)N+r9���r5���r8���r���r��r���)r:���r!���urlsplitr=���rsplit urlunsplit)r>��� pop_prefixr@���r��rB���rD���r��revs��� r%���_vcs_split_rev_from_urlz$PackageIndex._vcs_split_rev_from_url��s����,2L,A,A#,F,F)eTc1%%b)�zz#q!!!$ $;; C++ID#�l%%vvtUB&GHHCxr2���c�����������������8���|���������������������dd����������d���������}|���������������������|d����������\��}}|���������������������d||�����������t����������j��������d|d|�����������|0|���������������������d |�����������t����������j��������d |d |�����������|S�) Nr8���r9���r���Tr��zDoing git clone from %s to %szgit clone --quiet r[��zChecking out %szgit -C z checkout --quiet r=���r��r���r_���r��r���r>���r`���r��s��� r%���r��zPackageIndex._download_git��s����>>#q))!,///EES 13AAA sssHH=>>> ? II' - - - II�HHC � � �r2���c�����������������:���|���������������������dd����������d���������}|���������������������|d����������\��}}|���������������������d||�����������t����������j��������d|d|�����������|1|���������������������d |�����������t����������j��������d |d |d �����������|S�) Nr8���r9���r���Tr��zDoing hg clone from %s to %szhg clone --quiet r[��zUpdating to %sz hg --cwd z up -C -r z -qr��r��s��� r%���r��zPackageIndex._download_hg��s����>>#q))!,///EES 0#x@@@ ccc88<=== ? II& , , , II�HHCC � � �r2���c�����������������*����t����������j��������|g|R���d�S�ro���)r���r���r ��s��� r%���r���zPackageIndex.debug��s ���� #r2���c�����������������*����t����������j��������|g|R���d�S�ro���)r���r���r ��s��� r%���r���zPackageIndex.info�� ���� tr2���c�����������������*����t����������j��������|g|R���d�S�ro���)r���r���r ��s��� r%���r���zPackageIndex.warn��r��r2���)r���r���NT)Fro���)FFFN)FF)*r���r���r���r���r���r���r���r���r���r��r���r��r���r��r��r&��r)��r/��r4��r(��r$��r6���r;��rL��r:��r]��rg��ra��r���r9��r��r��r��r�� staticmethodr��r��r��r���r���r��� __classcell__r���s���@r%���r���r���/��s�������EE�- -�-�-�-�-�-$!�!�!�!�!31�31�31�31j'�'�'�'  �  �  �  ?�?�?�� 2�2�2  � � : � � &�&�&�& � � H�H�H�H�H�H � �  )� )� )�� � �  P� P� PL�N?�N?�N?�N?` � � � ,�,�,\�L"�"�"H � �  T� T� T� TD9�9�9:$�$�$�� E� E� E��,����\"��&��&����������r2���r���z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�����������������T����|����������������������d����������}t����������j��������|����������S�)Nr���)rL���r���unescape)rK���whats��� r%��� decode_entityr����s!���� ;;q>>D =  r2���c�����������������,����t����������t����������|�����������S�)a�� Decode HTML entities in the given text. >>> htmldecode( ... 'https://../package_name-0.1.2.tar.gz' ... '?tokena=A&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 * **r2���c�����������������������fd}|S�)Nc�����������������������fd}|S�)Nc����������������������t����������j��������������������}t����������j������������������� ��|�i�|t����������j��������|�����������S�#�t����������j��������|�����������w�xY�wro���)rw��getdefaulttimeoutsetdefaulttimeout)rp���rq��� old_timeoutrr���timeouts��� r%���_socket_timeoutz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeout��sd���� 244K  $W - - - 6tT,V,,(5555(5555s ���A�Ar���)rr���r��r��s���` r%���r��z'socket_timeout.<locals>._socket_timeout��s*���� 6� 6� 6� 6� 6� 6�r2���r���)r��r��s���` r%���socket_timeoutr����s$���� � � � � � r2���c���������������������t�����������j����������������������������|�����������}|��������������������������������}t ����������j��������|����������}|��������������������������������}|��������������������dd����������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<���encodebase64 b64encoder���r��)r��auth_s auth_bytes encoded_bytesencodeds��� r%��� _encode_authr����s[�����\ ! !$ ' 'FJ$Z00M""$$G ??4 $ $$r2���c�������������������$����e�Zd�ZdZd�Zd�Zd�ZdS�) Credentialz: A username/password pair. Use like a namedtuple. c�����������������"����||�_���������||�_��������d�S�ro���usernamepassword)r���r��r��s��� r%���r���zCredential.__init__��s����    r2���c��������������#���.���K���|�j���������V��|�j��������V��d�S�ro���r��r���s��� r%���__iter__zCredential.__iter__��s(������mmr2���c�����������������&����dt����������|�����������z��S�)Nz%(username)s:%(password)s)varsr���s��� r%���__str__zCredential.__str__ ��s����*T$ZZ77r2���N)r���r���r���r���r���r��r��r���r2���r%���r��r����sK���������!�!�!��8�8�8�8�8r2���r��c�������������������@�����e�Zd�Z�fdZed�������������Zd�Zd�Z�xZS�) PyPIConfigc�����������������j���t�������������������������������g�dd����������}t������������������������������������������|�����������t����������j����������������������������t����������j����������������������������d����������d����������}t����������j����������������������������|����������r|� ��������������������|�����������dS�dS�)z% Load from ~/.pypirc )r��r�� repositoryr���~z.pypircN) dictfromkeysr���r���r_���rB���rl��� expanduserr���r���)r���defaultsrcr���s��� r%���r���zPyPIConfig.__init__��s�����==!G!G!GLL """ W\\"',,S119 = = 7>>"  �  IIbMMMMM � r2���c�����������������������fd����������������������������������D�������������}t����������t�����������j��������|��������������������S�)Nc�����������������d����g�|�],}���������������������|d�������������������������������������������*|-S�)r��)r���r~���)re���sectionr���s��� r%���rP��z2PyPIConfig.creds_by_repository.<locals>.<listcomp>��sI�����& �& �& xx..4466& & �& �& r2���)sectionsr��r|���_get_repo_cred)r���sections_with_repositoriess���` r%���creds_by_repositoryzPyPIConfig.creds_by_repository��sR����& �& �& �& ==??& �& �& " �C+-GHHIIIr2���c��������������������|����������������������|d������������������������������������������}|t����������|����������������������|d������������������������������������������|����������������������|d����������������������������������������������������fS�)Nr��r��r��)r���r~���r��)r���r��repos��� r%���r��zPyPIConfig._get_repo_cred#��st����xx..4466Z HHWj ) ) / / 1 1 HHWj ) ) / / 1 1 � � � r2���c�����������������v����|�j�����������������������������������������D�]\��}}|��������������������|����������r|c�S�dS�)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)r��itemsr-���)r���r>���r��creds��� r%���find_credentialzPyPIConfig.find_credential*��sS���� �!% 8 > > @ @� �  J~~j))�    � r2���) r���r���r���r���propertyr��r��r��r��r��s���@r%���r��r�� ��st�������� � � � � �J�J�XJ � � ������r2���r��c��������������������t�����������j����������������������������|�����������}|\��}}}}}}|��������������������d����������rt����������j����������������������������d����������|dv�rt����������|����������\��} } nd} | sMt���������������������� ��������������������|�����������} | r*t����������| ����������} | j ��������|�f} t����������j ��������dg| R���| rodt����������| ����������z���} || ||||f} t�����������j����������������������������| ����������}t�����������j����������������������������|����������}|��������������������d| �����������nt�����������j����������������������������|�����������}|��������������������dt&����������������������||����������}| rct�����������j����������������������������|j������������������\��}}}}}}||k����r2|| k����r,||||||f} t�����������j����������������������������| ����������|_��������|S�) z4Open a urllib2 request, handling HTTP authenticationr��znonnumeric port: '')ro��httpsNz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz User-Agent)r:���r!���r;���r,���ro��rp��rq��r��r��r��r}���r��r���r���r��r��r���Request add_header user_agentr>���)r>���r���parsedr@���r��rB���paramsrD���r��r��addressr��r���r?���r��r���rb��s2h2path2param2query2frag2s��� r%���rn��rn��4��s����\ " "3 ' 'F06-FFD&%�s�<k$$%:;;; """"6** gg �J||++C00 � Jt99D=#%D HA ID I I I I �.,t,,,vud:,))%00.((11?D1111.((-- |Z000 B �4�06|/D/DRV/L/L,Bvvu <<B'MMvvu<E\,,U33BF Ir2���c�����������������D����|����������������������d����������\��}}}�|r|nd|�fS�)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r��N) rpartition)r��r��delims��� r%���r��r��c��s0�����,,D% #DDtd **r2���c���������������������|�S�ro���r���)r>���s��� r%��� fix_sf_urlr��n��s���� Jr2���c��������������������t�����������j����������������������������|�����������\��}}}}}}t�����������j����������������������������|����������}t ����������j����������������������������|����������rt�����������j����������������������������|�����������S�| ��������������������d����������rt ����������j�������� ��������������������|����������rg�}t ����������j ��������|����������D�]} t ����������j�������� ��������������������|| ����������} | dk����r>t����������| d����������5�} | ��������������������������������} ddd�����������n #�1�swxY�w�Y����nzt ����������j�������� ��������������������| ����������r| dz ��} |��������������������d��������������������| ���������������������d} | ��������������������|�d ��������������������|���������� ����������} d \��}}nd \��}}} d d i}t#����������j��������| ����������}t�����������j����������������������������|�||||����������S�)z7Read a local path, with special support for directoriesr4���z index.htmlrNz<a href="{name}">{name}</a>)r.���zB<html><head><title>{url}{files}r)r>files)OK)rzPath not foundz Not foundrz text/html)r:r!r;rrr_rBisfilerr,rrrlrrr2formatioStringIOrr)r>r@rArBparamrDrr`rrfilepathrbbodyrstatusmessager body_streams r%rmrmrs/5|/D/DS/I/I,FFD%~**400H w~~hC~%%c*** s  C h 7 7CH%% @ @Aw||Ha00HL  (C((%B7799D%%%%%%%%%%%%%%%x(( S LL6==1=EE F F F FX ;;3dii.>.>;??D# B{+G+d##K < ! !#vw M MMsD((D, /D, ro)r)Zrsysr_rdrrTrwrrrr configparserr http.clientro urllib.parser:urllib.request urllib.error functoolsrr pkg_resourcesrrrrr r r r r rrrrr distutilsrdistutils.errorsrfnmatchrsetuptools.wheelr setuptools.extern.more_itertoolsrrrJIrrrKrr=rW__all___SOCKET_TIMEOUT_tmplr version_inforr&rrFrrIrarrtrxrrrrrrrrrrrRawConfigParserrrrrnrrrmrr2r%r!s**   ++++++""""""<<<<<<rz677 rz3RT:: 2:J  RZ,bd 3 3 9 . 4 4 6 6    F \\ W^S- .: 0        F.2kTX# # # # L   bjKRTRR LLL$2.BP P P P P ;P P P jRZ< = = A  + + +    %%%*88888888"$$$$$-$$$N &~5++++^+++100@@NNNNNr2