Ë ´àÕG…`Uãó&—dZddlZddlZddlZddlZddlZddlZddlZddlZddl 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 ejb«Z2ej^d «Z3ej^d ejb«jhZ5djm«Z7gd¢Z8dZ9dZ:e:jwdjvejxŽe¬«Z=d„Z>d„Z?d„Z@d1d„ZAd1d„ZBd1d„ZCdedfd„ZDd„ZEej^dejb«ZF eEd„«ZGGd„d«ZHGd „d!eH«ZIGd"„d#e«ZJej^d$«j–ZLd%„ZMd&„ZNd2d'„ZOd(„ZPGd)„d*«ZQGd+„d,e j¤«ZSej¨jªfd-„ZVd.„ZWeOe9«eV«ZVd/„ZXd0„ZYy)3z$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_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)Ú PackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameéz€ðÜ× Ñ  Ó&Ð&øÜ òÝÙCGÐ Ió àð ûðús‚— 4 /¯4có8—|j«}d\}}}|jd«ro|jd«r|dd}d}nV|jdd«r |d d }|dd}d}n7|jd «r|dd }d }n|jdd«r |d d }|dd}d }|||fS)z=Return (base,pyversion) or (None,None) for possible .exe name)NNNú.exez .win32.exeNiöÿÿÿÚwin32z .win32-pyiðÿÿÿiùÿÿÿéüÿÿÿz.win-amd64.exeiòÿÿÿz win-amd64z .win-amd64-pyiìÿÿÿ)ÚlowerÚendswithÚ startswith)Únamer+ÚbaseÚpy_verÚplats r%rrNsÀð �J‰J‹L€EØ)Ñ€Dˆ&�$à ‡~�~�fÔØ �>‰>˜,Ô 'ؘ˜�:ˆD؉DØ × Ñ ˜k¨3Ô /ؘ"˜R�[ˆFؘ˜�:ˆD؉DØ �^‰^Ð,Ô -ؘ˜�:ˆD؉DØ × Ñ ˜o¨sÔ 3ؘ"˜R�[ˆFؘ˜�:ˆD؈DØ �˜Ð Ðócód—tjj|«}|\}}}}}}tjj|j d«d«}|dk(r6|dk(r1tjj|j d«d«}d|vr|j dd«\}}||fS)NÚ/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿÚ#é)Úurllibr!ÚurlparseÚunquoteÚsplit) ÚurlÚpartsÚschemeÚserverÚpathÚ parametersÚqueryÚfragmentr/s r%Úegg_info_for_urlrFfsŸ€Ü �L‰L× !Ñ ! #Ó &€EØ8=Ñ5€FˆF�D˜* e¨XÜ �<‰<× Ñ  § ¡ ¨3£°Ñ 3Ó 4€DØ Ð"Ò" t¨zÒ'9Ü�|‰|×#Ñ# D§J¡J¨s£O°BÑ$7Ó8ˆØ ˆd�{ØŸ™ C¨Ó+‰ˆˆhØ �ˆ>Ðr2c#óäK—t|«\}}t|||«Ed{–—†|rCtj|«}|r+t ||j d«|t ¬«Ed{–—†yyy7ŒJ7Œ ­w)zEYield egg or source distribution objects that might be found at a URLNr9)Ú precedence)rFÚdistros_for_locationÚ EGG_FRAGMENTÚmatchrÚgroupr)r>Úmetadatar/rErKs r%rrqstèø€ä% cÓ*�N€Dˆ(Ü# C¨¨xÓ8×8Ð8ÙÜ×"Ñ" 8Ó,ˆÙ Ü,Ø�U—[‘[ “^ X¼-ô÷ ñ ð ðð9øð ús"‚A0¡A,¢AA0Á$A.Á%A0Á.A0có&—|jd«r|dd}|jd«rd|vrtj|||«gS|jd«rLd|vrHt|«}|j «sgSt||j |j tdz¬«gS|jd «r%t|«\}}}|�t||||t|«StD]1}|j|«sŒ|dt|« }t|||«cSgS) z:Yield egg or source distribution objects based on basenameú.egg.zipNr*z.eggÚ-z.whlr9)ÚlocationÚ project_nameÚversionrHr() r,rÚ from_locationrÚ is_compatiblerRrSrrrrÚ EXTENSIONSÚlen)rQÚbasenamerMÚwheelÚwin_baser0ÚplatformÚexts r%rIrI}s$€à×јÔ$ؘC˜R�=ˆØ×Ñ˜Ô  S¨H¡_ä×*Ñ*¨8°X¸xÓHÐIÐIØ×Ñ˜Ô  S¨H¡_Ü�h“ˆØ×"Ñ"Ô$؈Iä Ø!Ø"×/Ñ/ØŸ ™ ä# a™<ô  ð ð ð×Ñ˜Ô Ü%8¸Ó%BÑ"ˆ�&˜(Ø Ð Ü(ؘ( H¨f´kÀ8óð ÷ ˆØ × Ñ ˜SÕ !Ø  ¤3 s£8 )Ð,ˆHÜ(¨°8¸XÓFÒ Fðð €Ir2cóh—tt|«tjj |«|«S)zEYield possible egg or source distribution objects based on a filename)rIrÚosrBrX)ÚfilenamerMs r%Údistros_for_filenamer` s*€ä Ü�xÓ ¤"§'¡'×"2Ñ"2°8Ó"<¸hó ðr2c #óFK—|jd«}|std„|ddD««rytt|««D]}||ddj «sŒn t|«}t ||dj |d|«dj ||d«|||¬«–—y­w)zÏGenerate 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! rPc3óHK—|]}tjd|«–—Œy­w)z py\d\.\d$N)ÚrerK)Ú.0Úps r%Ú z(interpret_distro_name..²sèø€ÐKÁ¸AœbŸh™h |°Q×7Áùs‚ "éNr9)Ú py_versionrHr[)r=ÚanyÚrangerWÚisdigitrÚjoin)rQrXrMrhrHr[r?res r%rr§s¨èø€ð �N‰N˜3Ó €EÙ œ#ÑKÀÀqÀrÁÓKÔKàô”3�u“:Ö ˆØ �‰8�B�Qˆ<× Ñ Õ !Ù ðô �‹Jˆä ØØØ �‰��r˜�ÓØ �‰��q�r�ÓØØØô óùs ‚AB!ÁAB!có.‡—t‰«ˆfd„«}|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%Úwrapperzunique_values..wrapperÏsø€ä™t TÐ4¨VÑ4Ó5Ð5r2r)rrrss` r%Ú unique_valuesrtÉs"ø€ô  ˆ4ƒ[ó6óð6ð €Nr2z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c #ó‚K—tj|«D]²}|j«\}}tt t j |j«jd«««}d|vsd|vsŒ_tj|«D]<}tjj|t|jd«««–—Œ>Œ´dD]l}|j|«}|dk7sŒtj!||«}|sŒ3tjj|t|jd«««–—Œny­w)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsÚ,Úhomepager6r9)z Home PagezDownload URLr5N)ÚRELÚfinditerÚgroupsÚsetÚmapÚstrÚstripr+r=ÚHREFr:r!ÚurljoinÚ htmldecoderLÚfindÚsearch)r>ÚpagerKÚtagÚrelÚrelsÚposs r%Úfind_external_linksr‰Üsíèø€ô—‘˜dÖ#ˆØ—<‘<“>‰ˆˆSÜ”3”s—y‘y #§)¡)£+×"3Ñ"3°CÓ"8Ó9Ó:ˆØ ˜Ñ  ¨tÒ!3ÜŸ™ sÖ+�Ü—l‘l×*Ñ*¨3´ ¸5¿;¹;Àq»>Ó0JÓKÓKñ,ð $ó5ˆØ�i‰i˜‹nˆØ �"‹9Ü—K‘K  cÓ*ˆEÚÜ—l‘l×*Ñ*¨3´ ¸5¿;¹;Àq»>Ó0JÓKÓKñ 5ùs‚A4D?Á7A1D?Ã)D?Ä=D?có"—eZdZdZd„Zd„Zd„Zy)ÚContentCheckerzP A null content checker that defines the interface for checking content có—y)z3 Feed a block of data to the hash. N©©ÚselfÚblocks r%ÚfeedzContentChecker.feedôs€ð r2có—y)zC Check the hash. Return False if validation fails. Tr�©r�s r%Úis_validzContentChecker.is_validús€ðr2có—y)zu Call reporter with information about the checker (hash name) substituted into the template. Nr�)r�ÚreporterÚtemplates r%ÚreportzContentChecker.reports€ð r2N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r‘r”r˜r�r2r%r‹r‹ïs„ñòò ó r2r‹cóX—eZdZejd«Zd„Zed„«Zd„Z d„Z d„Z y)Ú HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cóT—||_tj|«|_||_yro)Ú hash_nameÚhashlibÚnewÚhashÚexpected)r�r r¤s r%Ú__init__zHashChecker.__init__s €Ø"ˆŒÜ—K‘K  Ó*ˆŒ Ø ˆ� r2cóØ—tjj|«d}|s t«S|jj |«}|s t«S|di|j «¤ŽS)z5Construct a (possibly null) ContentChecker from a URLr5r�)r:r!r;r‹ÚpatternrƒÚ groupdict)Úclsr>rErKs r%Úfrom_urlzHashChecker.from_urls^€ô—<‘<×(Ñ(¨Ó-¨bÑ1ˆÙÜ!Ó#Ð #Ø— ‘ ×"Ñ" 8Ó,ˆÙÜ!Ó#Ð #ÙÑ'�U—_‘_Ó&Ñ'Ð'r2có:—|jj|«yro)r£ÚupdaterŽs r%r‘zHashChecker.feeds€Ø � ‰ ×јÕr2cóP—|jj«|jk(Sro)r£Ú hexdigestr¤r“s r%r”zHashChecker.is_valid!s€Ø�y‰y×"Ñ"Ó$¨¯ © Ñ5Ð5r2có0—||jz}||«Sro)r )r�r–r—Úmsgs r%r˜zHashChecker.report$s€Ø˜Ÿ™Ñ'ˆÙ˜‹}Ðr2N) r™ršr›rcÚcompiler§r¥Ú classmethodrªr‘r”r˜r�r2r%ržržs?„؈b�j‰jð #ó€Gò !ð ñ(óð(ò ò6ór2ržcó@‡—eZdZdZ d'ˆfd„ Zˆfd„Zd(d„Zd(d„Zd(d„Zd„Z d„Z d „Z d „Z d „Z d)d „Zd „Zd)ˆfd„ Zd„Zd„Zd„Zd„Zd„Z d*d„Zd+d„Zd„ZdZd„Zd„Zd)d„Zed„«Zd„Zed„«Z d„Z!d„Z"d „Z#d!„Z$d"„Z%ed#„«Z&d$„Z'd%„Z(d&„Z)ˆxZ*S),rz;A distribution index that scans web pages for download URLscóV•—t‰|�|i|¤Ž|dd|jd« z|_i|_i|_i|_tjdjtt|«««j|_ g|_tj j"|_y)Nr4Ú|)Úsuperr¥r,Ú index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesrcr±rlr|rrKÚallowsÚto_scanr:ÚrequestÚurlopenÚopener)r�r·ÚhostsÚ ca_bundleÚ verify_sslrpÚkwÚ __class__s €r%r¥zPackageIndex.__init__,s�ø€ô ‰Ñ˜$Ð% "Ò%Ø" SÐ)F¨y×/AÑ/AÀ#Ó/FÐ+FÐ%GÑGˆŒØˆÔØˆÔØˆÔÜ—j‘j §¡¬#¬i¸Ó*?Ó!@ÓA×GÑGˆŒ ؈Œ Ü—n‘n×,Ñ,ˆ� r2cól•— t|j«t‰|�|«S#t$rYywxYwro)rrSÚ Exceptionr¶Úadd)r�ÚdistrÄs €r%rÇzPackageIndex.add>s9ø€ð Ü ˜$Ÿ,™,Ô 'ô‰w‰{˜4Ó Ð øôò Ùð ús ƒ'§ 3²3c óÈ—||jvr|syd|j|<t|«s|j|«ytt |««}|r$|j |«sy|j d|«|s|r||jvr tt|j|««y|j |«sd|j|<y|jd|«d|j|<d}|j|||z«}|€yt|tjj«r-|j dk(r|jd|j"z«d|j|j$<d|j&j)d d «j+«vr|j-«y|j$}|j/«}t|t0«sXt|tjj«rd }n|j&j3d «xsd }|j5|d «}|j-«t6j9|«D]K} tj:j=|t?| jAd«««} |jC| «ŒM|jE|jF«r$tI|dd«dk7r|jK||«}yyy)zÚheadersÚgetr+ÚcloseÚreadr}Ú get_paramÚdecoderryr!r€r�rLÚ process_urlr-r·ÚgetattrÚ process_index) r�r>ÚretrieveÚdistsÚtmplÚfr/r„rÍrKÚlinks r%rázPackageIndex.process_urlGsQ€à �$×#Ñ#Ñ #©HØ Ø!%ˆ×ј#Ñܘ#ŒØ × !Ñ ! #Ô &Ø äœ¨Ó-Ó.ˆEÙØ—{‘{ 3Ô'ØØ— ‘ Ð+¨SÔ1á ™ C¨4×+<Ñ+<Ñ$<Ü ”�T—X‘X˜uÓ%Ô &Ø à�{‰{˜3ÔØ%)ˆD× Ñ ˜cÑ "Ø à � ‰ �, Ô$Ø!%ˆ×ј#ÑØMˆØ �M‰M˜#˜t c™zÓ *ˆØ ˆ9Ø Ü �aœŸ™×/Ñ/Ô 0°Q·V±V¸s²]Ø �I‰IÐ0°1·5±5Ñ8Ô 9Ø#'ˆ×ј!Ÿ%™%Ñ Ø ˜Ÿ™Ÿ™ ~°rÓ:×@Ñ@ÓBÑ BØ �G‰GŒIØ à�u‰uˆØ�v‰v‹xˆÜ˜$¤Ô$ä˜!œVŸ\™\×3Ñ3Ô4à#‘àŸ)™)×-Ñ-¨iÓ8ÒE¸I�Ø—;‘;˜w¨Ó1ˆDØ �‰Œ Ü—]‘] 4Ö(ˆEÜ—<‘<×'Ñ'¨¬j¸¿¹ÀQ»Ó.HÓIˆDØ × Ñ ˜TÕ "ð)ð �>‰>˜$Ÿ.™.Ô )¬g°a¸ÀÓ.FÈ#Ò.MØ×%Ñ% c¨4Ó0‰Dð/NÐ )r2cóú—tjj|«s|jd|«ytjj |«rk|sitjj |«}tj |«D]2}|jtjj||«d«Œ4t|«}|r2|jd|«tt|j|««yy)Nz Not found: %sTz Found: %s)r^rBÚexistsÚwarnÚisdirÚrealpathÚlistdirrÒrlr`rÕrÓr|rÇ)r�ÚfnÚnestedrBÚitemrås r%rÒzPackageIndex.process_filename|s°€ä�w‰w�~‰~˜bÔ!Ø �I‰I�o rÔ *Ø ä �7‰7�=‰=˜Ô ¡VÜ—7‘7×#Ñ# BÓ'ˆDÜŸ ™  4Ö(�Ø×%Ñ%¤b§g¡g§l¡l°4¸Ó&>ÀÕEð)ô% RÓ(ˆÙ Ø �J‰J�{ BÔ 'Ü ”�T—X‘X˜uÓ%Õ &ð r2có—t|«}|xr"|jd«j«dk(}|s1|jtj j |«d«ryd}|rt||z«‚|j||«y)Nr9Ú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ÑrLr+r»r:r!r;rrë)r�r>ÚfatalÚsÚis_filer°s r%rÔzPackageIndex.url_okŒs€€Ü �s‹OˆØÒ4˜Ÿ™ › ×(Ñ(Ó*¨fÑ4ˆÙ �d—k‘k¤&§,¡,×"7Ñ"7¸Ó"<¸QÑ"?Ô@Øð Wð ñ Ü   s¡Ó+Ð +à �I‰I�c˜3Ô Ør2có°—ttjj|«}d„|D«}t t j |j|««y)Nc3ózK—|]3}tj|«D]}|jd«r||f–—ŒŒ5y­w)z .egg-linkN)r^rîr,)rdrBÚentrys r%rfz.PackageIndex.scan_egg_links..žs>èø€ð á�ÜŸ™ DÖ)�Ø�~‰~˜kÔ*ð�5ŒMà)ð Ùùs‚9;)Úfilterr^rBrìrÓÚ itertoolsÚstarmapÚ scan_egg_link)r�Ú search_pathÚdirsÚ egg_linkss r%Úscan_egg_linkszPackageIndex.scan_egg_linksœsB€Ü”b—g‘g—m‘m [Ó1ˆñ áó ˆ ô ŒY× Ñ ˜t×1Ñ1°9Ó =Õ>r2c óà—ttjj||««5}t t dt tj|«««}ddd«t«dk7ry|\}}ttjj||««D]C}tjj|g|¢­Ž|_ t|_ |j|«ŒEy#1swYŒ�xYw)Nrg)Úopenr^rBrlrÓrúr|r}r~rWr rQr rHrÇ)r�rBrùÚ raw_linesÚlinesÚegg_pathÚ setup_pathrÈs r%rýzPackageIndex.scan_egg_link¦s©€Ü ”"—'‘'—,‘,˜t UÓ+Ô ,° 䜠¤c¬#¯)©)°YÓ&?Ó@ÓAˆE÷-ô ˆu‹:˜Š?à à$ш�*ä&¤r§w¡w§|¡|°D¸(Ó'CÖDˆDÜŸG™GŸL™L¨Ð6°Ò6ˆDŒMÜ)ˆDŒOØ �H‰H�T�NñE÷-Ð ,ús ª.C$Ã$C-c óЗd}|j|j«s|Stttj j |t|j«djd«««}t|«dk7sd|dvr|St|d«}t|d«}d|jj|j«i«|<t|«t|«fS)N)NNr4rgr8r9rT)r-r·rÓr|r:r!r<rWr=r r rºÚ setdefaultr+r)r�rèÚNO_MATCH_SENTINELr?ÚpkgÚvers r%Ú_scanzPackageIndex._scan¶sÇ€à&ÐØ�‰˜tŸ~™~Ô.Ø$Ð $ä”SœŸ™×-Ñ-¨t´C¸¿¹Ó4GÐ4IÐ/J×/PÑ/PÐQTÓ/UÓVÓWˆÜ ˆu‹:˜Š?˜c U¨1¡X™oØ$Ð $ô˜˜a™Ó!ˆÜ˜5 ™8Ó$ˆØ?Cˆ×Ñ×%Ñ% c§i¡i£k°2Ó6°tÑ<ܘ3Ó¤¨SÓ!1Ð1Ð1r2c ó—tj|«D]J} |jtjj |t |jd««««ŒL|j|«\}}|syt||«D]S}t|«\}}|jd«r!|s|r |d|›d|›�z }n|j|«|j|«ŒUtjd„|«S#t$rYŒèwxYw)z#Process the contents of a PyPI pager9rÌú.pyz#egg=rPcó.—d|jddd«zS)Nz%sr9érg)rL)Úms r%Úz,PackageIndex.process_index..às€Ð2°Q·W±W¸QÀÀ1Ó5EÒEr2)rryr r:r!r€r�rLr"r‰rFr,Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub) r�r>r„rKr r Únew_urlr/Úfrags r%rãzPackageIndex.process_indexÆsæ€ô—]‘] 4Ö(ˆEð Ø— ‘ œ6Ÿ<™<×/Ñ/°´ZÀÇ Á ÈAÃÓ5OÓPÕQð)ð —:‘:˜c“?‰ˆˆSÙØô+¨3°Ö5ˆGä)¨'Ó2‰JˆD�$Ø�}‰}˜UÔ#©DÙÙªs±CÐ8Ñ8‘Gà×*Ñ*¨3Ô/Ø �M‰M˜'Õ "ð6ô�|‰|Ù EÀtó ð øô%ò Ùð úsšAC3Ã3 C?Ã>C?có(—|jd|«y)NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©r�r>s r%rzPackageIndex.need_version_infoãs€Ø � ‰ ð à õ r2có¶—|j|jvr&|r|j|g|¢­Ž|jd«|j |j«y)Nz6Scanning index of all packages (this may take a while))r·r¹rërÖr©r�r°rps r%rzPackageIndex.scan_allêsG€Ø �>‰> ×!2Ñ!2Ñ 2ÙØ�— ‘ ˜#Ð% Ó%Ø �I‰IÐNÔ OØ � ‰ �d—n‘nÕ%r2cóð—|j|j|jzdz«|jj |j «s+|j|j|j zdz«|jj |j «s|j|«t|jj |j d««D]}|j|«Œy)Nr4r�) rr·Ú unsafe_namerºrÜÚkeyrRÚnot_found_in_indexrÓ)r�Ú requirementr>s r%Ú find_packageszPackageIndex.find_packagesñs³€Ø � ‰ �d—n‘n {×'>Ñ'>Ñ>ÀÑDÔEà×!Ñ!×%Ñ% k§o¡oÔ6à �M‰M˜$Ÿ.™.¨;×+CÑ+CÑCÀcÑIÔ Jà×!Ñ!×%Ñ% k§o¡oÔ6à × #Ñ # KÔ 0ä˜×*Ñ*×.Ñ.¨{¯©ÀÓCÖDˆCà �M‰M˜#Õ ñEr2cóÄ•—|j«|j|«||jD]}||vr|cS|jd||«Œt‰|�||«S)Nz%s does not match %s)Úprescanr$r!rÕr¶Úobtain)r�r#Ú installerrÈrÄs €r%r'zPackageIndex.obtains^ø€Ø � ‰ ŒØ ×ј;Ô'ؘŸ™Ô)ˆDØ�{Ñ"Ø’ Ø �J‰JÐ-¨{¸DÕ Að*ô‰w‰~˜k¨9Ó5Ð5r2có0—|j|jd|z«|j«sg|j«t j |«t |jj›dtjj|«›d�«‚y)z- checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) r˜rÕr”rÝr^Úunlinkrr£r.rBrX)r�Úcheckerr_Útfps r%Ú check_hashzPackageIndex.check_hash su€ð �‰�t—z‘zÐ#CÀhÑ#NÔOØ×ÑÔ!Ø �I‰IŒKÜ �I‰I�hÔ Ü ð—<‘<×$Ó$¤b§g¡g×&6Ñ&6°xÕ&@ðBóð ð"r2cóä—|D]k}|j�0t|«r%|jd«stt |««r|j |«ŒQ|jj |«Œmy)z;Add `urls` to the list that will be prescanned for searchesNúfile:)r¼rÑr-rÓrrÚappend)r�Úurlsr>s r%Úadd_find_linkszPackageIndex.add_find_linkssX€ãˆCà— ‘ Ð$Ü! #”Ø—>‘> 'Ô*Üœ¨Ó,Ô-ð— ‘ ˜cÕ"ð— ‘ ×#Ñ# CÕ(ñr2có|—|jr)tt|j|j««d|_y)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r¼rÓr|rr“s r%r&zPackageIndex.prescan&s'€à �<Š<Ü ”�T—]‘] D§L¡LÓ1Ô 2؈� r2có¢—||jr|jd}}n|jd}}|||j«|j «y)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"zPackageIndex.not_found_in_index,sJ€Ø � —‘Ò ØŸ ™ Ð#H�#‰Dð— ‘ ØEðˆDñ ˆS�+×)Ñ)Ô*Ø � ‰ �r2cóZ—t|t«st|«}|rF|j||«}t |«\}}|j d«r|j |||«}|Stjj|«r|St|«}t|j||«dd«S)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. rrQN) rØrrÑÚ _download_urlrFr,Ú gen_setupr^rBrêr&râÚfetch_distribution)r�r#Útmpdirr@Úfoundr/rEs r%r6zPackageIndex.download7s™€ô$˜$¤ Ô,Ü Ó%ˆFÙà×*Ñ*¨4°Ó8�Ü!1°$Ó!7‘��hØ—=‘= Ô'Ø ŸN™N¨5°(¸FÓC�EØ� Ü—‘—‘ Ô%à� ä,¨TÓ2�Ü�t×.Ñ.¨t°VÓ<¸jÈ$ÓOÐOr2cóÚ‡‡‡‡‡ —‰jd|«iŠ d}d ˆˆˆ ˆˆfd„ }|r)‰j«‰j|«||«}|s |� |||«}|€$‰j�‰j«||«}|€|s‰j|«||«}|€‰j d‰xrdxsd|«y‰jd|«|j |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. zSearching for %sNcóz•—|€‰}||jD]¤}|jtk(r‰s|‰vr‰jd|«d‰|<Œ4||vxr|jtkxs‰ }|sŒU‰j |j ‰ «}||_tjj|j«sŒ¢|cSy)Nz&Skipping development or system egg: %sr9) r!rHrrër r6rQÚdownload_locationr^rBrê) ÚreqÚenvrÈÚtestÚlocÚ develop_okr�ÚskippedÚsourcer:s €€€€€r%r‚z-PackageIndex.fetch_distribution..findws´ø€Øˆ{Ø�ð˜CŸG™Gœ �Ø—?‘?¤lÒ2¹:Ø 7Ñ*ØŸ ™ ØDØ ôð)*˜ ™ Øà˜s�{ÒU¨¯©¼;Ñ(FÒ(TÈfÈ*�ÚØŸ-™-¨¯ © °vÓ>�CØ-0�DÔ*Ü—w‘w—~‘~ d×&<Ñ&<Õ=Ø#š ð%ð"r2z:No local packages or working download links found for %s%sza source distribution of rÌzBest match: %s)rQro)rÖr&r$r¼rëÚcloner>) r�r#r:Ú force_scanrErCÚ local_indexrÈr‚rDs ` ` `` @r%r9zPackageIndex.fetch_distributionYsóü€ð4 � ‰ Ð$ kÔ2؈؈÷ ñ ñ0 Ø �L‰LŒNØ × Ñ ˜{Ô +Ù˜ Ó$ˆDᘠÐ/Ù˜  [Ó1ˆDà ˆ<Ø�|‰|Ð'Ø— ‘ ”Ù˜ Ó$ˆDà ˆ<¡ Ø × Ñ ˜{Ô +Ù˜ Ó$ˆDà ˆ<Ø �I‰IØLØÒ7Ð7Ò=¸2Øô ð à �I‰IÐ&¨Ô -Ø—:‘: t×'=Ñ'=�:Ó>Ð >r2cóH—|j||||«}|� |jSy)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)r9rQ)r�r#r:rGrErÈs r%ÚfetchzPackageIndex.fetch«s-€ð×&Ñ& {°F¸JÈÓOˆØ Ð Ø—=‘=Ð Ør2c óª—tj|«}|xr6t||jd«d«D�cgc]}|jr|‘Œc}xsg}t |«dk(�rBt jj|«}t jj|«|k7rwt jj||«}t jj|«r t jj||«stj||«|}tt jj|d«d«5} | j!d|dj"›d|dj›dt jj%|«d›d�«ddd«|S|rt'd |›d |›�«‚t'd «‚cc}w#1swY|SxYw) Nr9zsetup.pyÚwz(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.)rJrKrrLrSrWr^rBrXÚdirnamerlrêÚsamefileÚshutilÚcopy2rÚwriterRÚsplitextr) r�r_rEr:rKÚdrårXÚdstrós r%r8zPackageIndex.gen_setup¸s�€Ü×"Ñ" 8Ó,ˆà ò ô/¨x¸¿¹ÀQ»ÈÔNóáN�AØ—9’9òØNñò ð ð ô ˆu‹:˜‹?Ü—w‘w×'Ñ'¨Ó1ˆHô�w‰w�‰˜xÓ(¨FÒ2Ü—g‘g—l‘l 6¨8Ó4�ÜŸ™Ÿ™ sÔ+´·±×0@Ñ0@ÀÈ3Ô0OÜ—L‘L ¨3Ô/Ø"�Hä”b—g‘g—l‘l 6¨:Ó6¸Ô<ÀØ— ’ ð˜a™×-Ó-ؘa™×(Ó(ÜŸ™×(Ñ(¨Ó2°1Ó5ð ô÷=ðˆOá Ý ò&.©uð6óð ô !ðGóð ùòK÷$=ðˆOús¸GÅAGÇGi có>—|jd|«d} tj|«}|j|«}t |t j j«r(td|›d|j›d|j›�«‚|j«}d}|j}d}d|vr?|jd«} ttt| ««}|j!|||||«t#|d «5} |j%|«} | r=|j'| «| j)| «|d z }|j!|||||«nnŒR|j+||| «ddd«||r|j-«SS#1swYŒxYw#|r|j-«wwxYw) NzDownloading %szCan't download ú: Ú rr5zcontent-lengthzContent-LengthÚwbr9)rÖržrªr×rØr:rÙrÚrrÏr°Ú dl_blocksizeÚget_allÚmaxr|ÚintÚ reporthookrrÞr‘rQr-rÝ) r�r>r_Úfpr+rÛÚblocknumÚbsÚsizeÚsizesr,r�s r%Ú _download_tozPackageIndex._download_toèso€Ø � ‰ Ð" CÔ(à ˆð Ü!×*Ñ*¨3Ó/ˆGØ—‘˜sÓ#ˆBܘ"œfŸl™l×4Ñ4Ô5Ý$Ú25°r·w³wÀÇÂÐGóðð—g‘g“iˆG؈HØ×"Ñ"ˆB؈DØ 7Ñ*àŸ™Ð(8Ó9�Üœ3œs E›?Ó+�Ø—‘  X¨x¸¸TÔBÜ�h Ô%¨ØØŸG™G B›K�EÙØŸ ™  UÔ+ØŸ ™  %Ô(Ø  A™ ˜ØŸ™¨¨X°xÀÀTÕJàðð—‘ ¨°3Ô7÷&ðáØ—‘• ð÷&Ð%ûñØ—‘• ðús%–C!FÃ7A'E;Å FÅ;FÆFÆFcó—yror�)r�r>r_r_Úblksizeras r%r]zPackageIndex.reporthook s€Ø r2c óô—|jd«r t|«S t||j«S#tt j jf$rh}dj|jD�cgc] }t|«‘Œncc}wc}«}|r|j||«nt|›d|›�«|‚Yd}~yd}~wtjj$r }|cYd}~Sd}~wtjj $rE}|r|j||j"«ntd|›d|j"›�«|‚Yd}~yd}~wt j j$$rD}|r|j||j&«nt|›d|j&›�«|‚Yd}~yd}~wt j j(t*f$r1}|r|j||«ntd|›d|›�«|‚Yd}~yd}~wwxYw)Nr/rWzDownload error for rVz7 returned a bad status line. The server might be down, )r-Ú local_openÚopen_with_authr¿r"ÚhttpÚclientÚ InvalidURLrlrpr}rërr:rÙrÚÚURLErrorÚreasonÚ BadStatusLineÚlineÚ HTTPExceptionÚOSError)r�r>ÚwarningÚvÚargr°s r%r×zPackageIndex.open_urls“€Ø �>‰>˜'Ô "ܘc“?Ð "ð TÜ! # t§{¡{Ó3Ð 3øÜœDŸK™K×2Ñ2Ð3ò BØ—(‘(°·²Ó7±¨œC �H±ùÔ7Ó8ˆCÙØ— ‘ ˜' 3Õ'ä$²±SÐ%9Ó:ÀÐAô(ûô�|‰|×%Ñ%ò Ø�HûÜ�|‰|×$Ñ$ò ÙØ— ‘ ˜' 1§8¡8Õ,å$Ú36¸¿ºÐAóàðô-ûô �{‰{×(Ñ(ò ÙØ— ‘ ˜' 1§6¡6Õ*ä$â"% q§v¢vð/óððô+ûô — ‘ ×)Ñ)¬7Ð3ò TÙØ— ‘ ˜' 1Õ%å$ÂCÉÐ%KÓLÐRSÐSô&ûð TúsWž4´#G7ÁB:Á0B Â3B:Â: G7ÃC!ÃG7Ã! G7Ä;EÅ G7Å!:F Æ &G7Ç'G2Ç2G7có>—t|«\}}|r,d|vr*|jdd«jdd«}d|vrŒ'nd}|jd«r|dd}tjj ||«}|j t|««std |›�«‚|S) aB >>> import pathlib >>> du = PackageIndex._resolve_download_filename >>> root = getfixture('tmp_path') >>> url = 'https://files.pythonhosted.org/packages/a9/5a/0db.../setuptools-78.1.0.tar.gz' >>> str(pathlib.Path(du(url, root)).relative_to(root)) 'setuptools-78.1.0.tar.gz' Ensures the target is always in tmpdir. >>> url = 'https://anyhost/%2fhome%2fuser%2f.ssh%2fauthorized_keys' >>> du(url, root) Traceback (most recent call last): ... ValueError: Invalid filename... z..Ú.Ú\Ú_Ú__downloaded__rONr*zInvalid filename ) rFÚreplacer,r^rBrlr-r}r")r>r:r.rEr_s r%Ú_resolve_download_filenamez'PackageIndex._resolve_download_filename2s €ô$*¨#Ó.‰ˆˆh٠ؘ$‘,Ø—|‘| D¨#Ó.×6Ñ6°t¸SÓA�ð˜$“,ð$ˆDà �=‰=˜Ô $ؘ˜�9ˆDä—7‘7—<‘< ¨Ó-ˆð×"Ñ"¤3 v£;Ô/ÜÐ0°° Ð;Ó<Ð <àˆr2cór—|j||«}|j||«xs|j||«S)z2 Determine the download filename. )r{Ú _download_vcsÚ_download_other)r�r>r:r_s r%r7zPackageIndex._download_urlVs;€ð×2Ñ2°3¸Ó?ˆØ×!Ñ! # xÓ0ÒW°D×4HÑ4HÈÈhÓ4WÐWr2cóê—tjj|«j}|j d«\}}}t ddgdgt |«zz«}tt|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!Úurlsplitr@Ú partitionr{ÚboolÚnextÚiter)r>r@ÚpreÚsepÚpostÚalloweds r%Ú _resolve_vcszPackageIndex._resolve_vcs]sj€ô—‘×&Ñ& sÓ+×2Ñ2ˆØ×)Ñ)¨#Ó.‰ˆˆS�$ä�u˜e�n¨ v´°S³ Ñ'9Ñ9Ó:ˆÜ”D˜#˜ ™Ó)¨4Ó0Ð0r2c ó —|j|«}|sy|dk(rtd|›�«‚|jd«\}}}|j|«\}}|j d|›d|›d|›�«t j |dd||g«t|d |d d|g|d |d d d |dg¬«}|�,|j d|›�«t j ||«|S)Nr�z/Invalid config, SVN download is not supported: r8zDoing z clone from z to rFz--quietz-CÚcheckoutz--cwdÚupz-rz-q)r‚rƒz Checking out )r�rr…Ú_vcs_split_rev_from_urlrÖÚ subprocessÚ check_callÚdict)r�r>Ú spec_filenameÚvcsr_rxÚrevÚ co_commandss r%r}zPackageIndex._download_vcspsú€Ø×Ñ Ó$ˆÙØ Ø �%Š<Ü ØAÀ#ÀÐGóð ð'×0Ñ0°Ó5‰ˆ�!�QØ×/Ñ/°Ó4‰ˆˆSà � ‰ �F˜3˜%˜|¨C¨5°°X°JÐ?Ô@Ü×јs G¨Y¸¸XÐFÔGäØ�d˜H j°)¸SÐAØ�W˜h¨¨d°D¸#¸tÐDô ˆ ð ˆ?Ø �I‰I˜  c UÐ+Ô ,Ü × !Ñ ! +¨cÑ"2Ô 3àˆr2có2—tjj|«j}|dk(rFtjj tjj |«j«S|j|d«|j||«S)NróT) r:r!r„r@r½Ú url2pathnamer;rBrÔÚ_attempt_download)r�r>r_r@s r%r~zPackageIndex._download_other‰so€Ü—‘×&Ñ& sÓ+×2Ñ2ˆØ �VÒ Ü—>‘>×.Ñ.¬v¯|©|×/DÑ/DÀSÓ/I×/NÑ/NÓOÐ Oà � ‰ �C˜ÔØ×%Ñ% c¨8Ó4Ð4r2có(—|j|d«y)NT)rárs r%rzPackageIndex.scan_url‘s€Ø ×ј˜dÕ#r2có”—|j||«}d|jdd«j«vr|j|||«S|S)NrÊrËrÌ)rcrÜr+Ú_invalid_download_html)r�r>r_rÛs r%r›zPackageIndex._attempt_download”sJ€Ø×#Ñ# C¨Ó2ˆØ �W—[‘[ °Ó4×:Ñ:Ó<Ñ <Ø×.Ñ.¨s°G¸XÓFÐ FàˆOr2cóH—tj|«td|›�«‚)NzUnexpected HTML page found at )r^r*r)r�r>rÛr_s r%ržz#PackageIndex._invalid_download_html›s!€Ü � ‰ �(ÔÜÐ=¸c¸UÐCÓDÐDr2cóL—tjj|«}|jj dd«d}|j j d«\}}}|jd«\}}}|r||fn|df\}} |j||d¬«j«} | | fS) 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€r9r5r8Ú@NrÌ)r@rBrE) r:r!r„r@r=rBr…Ú rpartitionÚ_replaceÚgeturl) r>r?Ú clean_schemeÚno_fragment_pathrxr‰rŠr‹Ú clean_pathr—Úresolveds r%r‘z$PackageIndex._vcs_split_rev_from_urlŸs°€ô— ‘ ×%Ñ% cÓ*ˆà—|‘|×)Ñ)¨#¨qÓ1°"Ñ5ˆ ð"'§¡×!5Ñ!5°cÓ!:ÑИ!˜Qà)×4Ñ4°SÓ9‰ˆˆS�$Ù),˜3 ™+°4¸°,‰ˆ �Cà—>‘>ØØàð "ó ÷ ‰&‹(ð ð˜ˆ}Ðr2có0—tj|g|¢­Žyro)rrÕrs r%rÕzPackageIndex.debug¾s€Ü � ‰ �#ИÔr2có0—tj|g|¢­Žyro)rrÖrs r%rÖzPackageIndex.infoÁó€Ü �‰�Ð�tÔr2có0—tj|g|¢­Žyro)rrërs r%rëzPackageIndex.warnÄr«r2)zhttps://pypi.org/simple/)Ú*NT)Fro)FFFN)FF)+r™ršr›rœr¥rÇrárÒrÔrrýr rãrrr$r'r-r2r&r"r6r9rJr8rYrcr]r×Ú staticmethodr{r7r�r}r~rr›ržr‘rÕrÖrëÚ __classcell__©rÄs@r%rr)sø„ÙEð-ØØØõ -ô$!ó31ój'ó ò ?òò 2ò  ò: ó&ò õ6ò ò )òò ò PðLØØØóP?ód ò,ð\€Lò"òH ó TðDñ!óð!òFXðñ1óð1ò$ò25ò$òòEðñóðò<òör2rz!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cóN—|jd«}tj|«S)Nr)rLrÊÚunescape)rKÚwhats r%Ú decode_entityr´Ís€Ø �;‰;�q‹>€DÜ �=‰=˜Ó Ðr2có"—tt|«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€ô ”m TÓ *Ð*r2có‡—ˆfd„}|S)Nc󕇗ˆˆfd„}|S)NcóÆ•—tj«}tj‰« ‰|i|¤Žtj|«S#tj|«wxYwro)ÚsocketÚgetdefaulttimeoutÚsetdefaulttimeout)rprqÚ old_timeoutrrÚtimeouts €€r%Ú_socket_timeoutz@socket_timeout.._socket_timeout.._socket_timeoutàsNø€Ü ×2Ñ2Ó4ˆKÜ × $Ñ $ WÔ -ð 6Ù˜TÐ, VÑ,ä×(Ñ(¨Õ5ø”×(Ñ(¨Õ5ús ¬A Á A r�)rrrÀr¿s` €r%rÀz'socket_timeout.._socket_timeoutßsù€õ 6ðÐr2r�)r¿rÀs` r%Úsocket_timeoutrÁÞsø€ô ð Ðr2cóΗtjj|«}|j«}t j |«}|j «}|jdd«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àrz)ÚauthÚauth_sÚ auth_bytesÚ encoded_bytesÚencodeds r%Ú _encode_authrÌísR€ô�\‰\× !Ñ ! $Ó '€Fà—‘“€JÜ×$Ñ$ ZÓ0€Mà×"Ñ"Ó$€Gà �?‰?˜4 Ó $Ð$r2có"—eZdZdZd„Zd„Zd„Zy)Ú Credentialz: A username/password pair. Use like a namedtuple. có —||_||_yro©ÚusernameÚpassword)r�rÑrÒs r%r¥zCredential.__init__s€Ø ˆŒ Ø ˆ� r2c#óDK—|j–—|j–—y­wrorÐr“s r%Ú__iter__zCredential.__iter__ sèø€Ø�m‰mÒØ�m‰mÓùs‚ có—dt|«zS)Nz%(username)s:%(password)s)Úvarsr“s r%Ú__str__zCredential.__str__s€Ø*¬T°$«ZÑ7Ð7r2N)r™ršr›rœr¥rÔr×r�r2r%rÎrÎs„ñò!òó8r2rÎcó:‡—eZdZˆfd„Zed„«Zd„Zd„ZˆxZS)Ú PyPIConfigcó0•—tjgd¢d«}t‰|� |«tj j tj jd«d«}tj j|«r|j|«yy)z% Load from ~/.pypirc )rÑrÒÚ repositoryrÌÚ~z.pypircN) r”Úfromkeysr¶r¥r^rBrlÚ expanduserrêrÞ)r�ÚdefaultsÚrcrÄs €r%r¥zPyPIConfig.__init__sfø€ô—=‘=Ò!GÈÓLˆÜ ‰Ñ˜Ô"ä �W‰W�\‰\œ"Ÿ'™'×,Ñ,¨SÓ1°9Ó =ˆÜ �7‰7�>‰>˜"Ô Ø �I‰I�b�Mð r2cóÄ—|j«D�cgc]$}|j|d«j«r|‘Œ&}}tt |j |««Scc}w)NrÛ)ÚsectionsrÜr~r”r|Ú_get_repo_cred)r�ÚsectionÚsections_with_repositoriess r%Úcreds_by_repositoryzPyPIConfig.creds_by_repositorysa€ð Ÿ=™=œ?ó& á*�Ø�x‰x˜ Ó.×4Ñ4Ô6ò Ø*ð #ð& ô ”C˜×+Ñ+Ð-GÓHÓIÐIùò & s“)AcóÖ—|j|d«j«}|t|j|d«j«|j|d«j««fS)NrÛrÑrÒ)rÜr~rÎ)r�räÚrepos r%rãzPyPIConfig._get_repo_cred)s]€Ø�x‰x˜ Ó.×4Ñ4Ó6ˆØ”ZØ �H‰H�W˜jÓ )× /Ñ /Ó 1Ø �H‰H�W˜jÓ )× /Ñ /Ó 1ó ð ð r2cór—|jj«D]\}}|j|«sŒ|cSy)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_credential0s9€ð !%× 8Ñ 8× >Ñ >Ö @Ñ ˆJ˜Ø�~‰~˜jÕ)Ø’ ð!Aðr2) r™ršr›r¥Úpropertyrærãrìr¯r°s@r%rÙrÙs(ø„ô ðñJóðJò ör2rÙcó”—tjj|«}|\}}}}}}|jd«rtj j d«‚|dvrt|«\} } nd} | sJt«j|«} | r/t| «} | j|f} tjdg| ¢­Ž| rgdt| «z} | ||||f} tjj| «}tj j#|«}|j%d| «ntj j#|«}|j%dt&«||«}| rftjj|j(«\}}}}}}||k(r1| k(r,||||||f} tjj| «|_|S) z4Open a urllib2 request, handling HTTP authenticationÚ:znonnumeric port: '')riÚhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic Ú Authorizationz User-Agent)r:r!r;r,rirjrkÚ _splituserrÙrìr}rÑrrÖrÌÚ urlunparser½ÚRequestÚ add_headerÚ user_agentr>)r>r¿Úparsedr@ÚnetlocrBÚparamsrDrrÇÚaddressrërÖr?rr½r^Ús2Úh2Úpath2Úparam2Úquery2Úfrag2s r%rhrh;s˜€ô�\‰\× "Ñ " 3Ó '€FØ06Ñ-€FˆF�D˜& %¨ð‡��sÔÜ�k‰k×$Ñ$Ð%:Ó;Ð;à Ð"Ñ"Ü" 6Ó*‰ ˆ‰gàˆá Ü‹|×+Ñ+¨CÓ0ˆÙ Ü�t“9ˆDØ—=‘= #Ð%ˆDÜ �H‰HÐAÐ IÀDÓ Iá Øœ, tÓ,Ñ,ˆØ˜  v¨u°dÐ:ˆÜ—,‘,×)Ñ)¨%Ó0ˆÜ—.‘.×(Ñ(¨Ó1ˆØ×ј?¨DÕ1ä—.‘.×(Ñ(¨Ó-ˆà ×Ñ�|¤ZÔ0Ù �‹€Bá ô06¯|©|×/DÑ/DÀRÇVÁVÓ/LÑ,ˆˆB��v˜v uØ �Š<˜B 'šMؘ  v¨v°uÐ<ˆEÜ—\‘\×,Ñ,¨UÓ3ˆBŒFà €Ir2có@—|jd«\}}}|r||fSd|fS)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r¡N)r¢)ÚhostÚuserÚdelims r%ròròjs0€ðŸ™¨Ó,Ñ€Dˆ%�ÙˆD dÐ *Ð*˜t dÐ *Ð*r2có—|Sror�)r>s r%Ú fix_sf_urlrus€Ø €Jr2có²—tjj|«\}}}}}}tjj |«}t j j|«rtjj|«S|jd«röt j j|«r×g}t j|«D]“} t j j|| «} | dk(r't| d«5} | j«} ddd«nkt j j| «r| dz } |jdj!| ¬««Œ•d} | j!|dj|«¬ «} d \}}nd \}}} d d i}t#j$ «}tj&j)|||||«S#1swYŒ¾xYw)z7Read a local path, with special support for directoriesr4z index.htmlÚrNz{name})r.zB{url}{files}rÃ)r>Úfiles)éÈÚOK)rÐzPath not foundz Not foundrËz text/html)r:r!r;r½ršr^rBÚisfiler¾r,rìrîrlrrÞr0ÚformatÚioÚStringIOrÙrÚ)r>r@rArBÚparamrDrr_r rçÚfilepathr^ÚbodyræÚstatusÚmessagerÛÚ body_streams r%rgrgysy€ä/5¯|©|×/DÑ/DÀSÓ/IÑ,€FˆF�D˜% ¨Ü�~‰~×*Ñ*¨4Ó0€HÜ ‡w�w‡~�~�hÔÜ�~‰~×%Ñ% cÓ*Ð*Ø �‰�sÔ ¤§¡§ ¡ ¨hÔ 7؈ܗ‘˜HÖ%ˆAÜ—w‘w—|‘| H¨aÓ0ˆHØ�LÒ Ü˜( CÔ(¨BØŸ7™7›9�D÷)áÜ—‘—‘˜xÔ(Ø�S‘�Ø �L‰LÐ6×=Ñ=À1Ð=ÓEÕ Fð&ðXð ð—;‘; 3¨d¯i©i¸Ó.>�;Ó?ˆDØ#‰ˆ‘à Bш�˜à˜{Ð+€GÜ—+‘+˜dÓ#€KÜ �<‰<× !Ñ ! # v¨w¸ÀÓ MÐM÷#)Ð(ús Ã?G Ç G ro)r)ZrœÚsysr’r^rcrrOr»rÅr¡rûÚ configparserrÊÚ http.clientriÚ urllib.parser:Úurllib.requestÚ urllib.errorÚ functoolsrrÚ pkg_resourcesrrrrr r r r r rrrrrÚ distutilsrÚdistutils.errorsrÚfnmatchrÚsetuptools.wheelrÚ setuptools.extern.more_itertoolsrr±rJÚIrrrKrÑr=rVÚ__all__Ú_SOCKET_TIMEOUTÚ_tmplr Ú version_inforör&rrFrrIr`rrtrxr‰r‹ržrrr¶r´r�rÁrÌrÎÚRawConfigParserrÙr½r¾rhròrrgr�r2r%Úr)sðÙ*ã ÛÛ Û Û Û Û Û ÛÛÛÛ ÛÛÛÛÝã÷÷÷÷õ Ý+ÝÝ"Ý<ðˆr�z‰zÐ6Ó7€ Ø€r‡z�zÐ3°R·T±TÓ:€Ø ˆ2�:‰:ðJó €ðˆR�Z‰ZÐ,¨b¯d©dÓ 3× 9Ñ 9€ Ø .× 4Ñ 4Ó 6€ ò €ð€àF€Ø �\‰\Ø ˆW�^‰^˜S×-Ñ-Ð .¸:ðó€ ò òò0ó ó óFð.2¸kÐTXóòD ð€b‡j�jÐKÈRÏTÉTÓR€ðð ñLóðL÷$ñô2�.ôôB\ �;ô\ ðBˆR�Z‰ZÐ<Ó =× AÑ A€ òò +ó ò%÷*8ñ8ô"%�×-Ñ-ô%ðP &Ÿ~™~×5Ñ5ó+ò^+ð1‘ Ó0°Ó@€òóNr2