Ë
    Êmxi9?  ã                  ó²  — d Z ddlm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mZmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddl 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-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6  e	jn                  e8«      Z9ee:e:f   Z;d2d„Z< G d„ de=«      Z>d3d„Z? G d„ de=«      Z@d4d„ZAd5d„ZBd6d„ZC G d„ d «      ZD G d!„ d"e«      ZEd7d#„ZFeFd8d%„«       ZG ed&¬'«       G d(„ d$«      «       ZH G d)„ d*e«      ZI	 d9	 	 	 	 	 	 	 d:d+„ZJ	 d;	 	 	 	 	 d<d,„ZKd=d-„ZL G d.„ d/e«      ZM G d0„ d1«      ZNy)>zO
The main purpose of this module is to expose LinkCollector.collect_sources().
é    )ÚannotationsN)ÚIterableÚMutableMappingÚSequence)Ú	dataclass)Ú
HTMLParser)ÚValues)ÚCallableÚ
NamedTupleÚProtocol)Úrequests)ÚResponse)Ú
RetryErrorÚSSLError)ÚNetworkConnectionError)ÚLink)ÚSearchScope)Ú
PipSession)Úraise_for_status)Úis_archive_file©Úredact_auth_from_url)Úvcsé   )ÚCandidatesFromPageÚ
LinkSourceÚbuild_sourcec                ó–   — t         j                  D ]6  }| j                  «       j                  |«      sŒ#| t	        |«         dv sŒ4|c S  y)zgLook for VCS schemes in the URL.

    Returns the matched VCS scheme, or None if there's no match.
    z+:N)r   ÚschemesÚlowerÚ
startswithÚlen)ÚurlÚschemes     úT/home/htdocs/ttos/venv/lib/python3.12/site-packages/pip/_internal/index/collector.pyÚ_match_vcs_schemer&   .   sE   € ô
 —+‘+ò ˆØ�9‰9‹;×!Ñ! &Õ)¨c´#°f³+Ñ.>À$Ò.FØŠMðð ó    c                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )Ú_NotAPIContentc                óB   •— t         ‰| �  ||«       || _        || _        y ©N)ÚsuperÚ__init__Úcontent_typeÚrequest_desc)Úselfr.   r/   Ú	__class__s      €r%   r-   z_NotAPIContent.__init__:   s"   ø€ Ü‰Ñ˜ |Ô4Ø(ˆÔØ(ˆÕr'   )r.   Ústrr/   r2   ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__r-   Ú__classcell__©r1   s   @r%   r)   r)   9   s   ø„ ÷)ñ )r'   r)   c                ó¾   — | j                   j                  dd«      }|j                  «       }|j                  d«      ryt	        || j
                  j                  «      ‚)z°
    Check the Content-Type header to ensure the response contains a Simple
    API Response.

    Raises `_NotAPIContent` if the content type is not a valid content-type.
    úContent-TypeÚUnknown)z	text/htmlz#application/vnd.pypi.simple.v1+htmlú#application/vnd.pypi.simple.v1+jsonN)ÚheadersÚgetr    r!   r)   ÚrequestÚmethod)Úresponser.   Úcontent_type_ls      r%   Ú_ensure_api_headerrD   @   s[   € ð ×#Ñ#×'Ñ'¨¸	ÓB€Là!×'Ñ'Ó)€NØ× Ñ ð	
ôð 	ä
˜ x×'7Ñ'7×'>Ñ'>Ó
?Ð?r'   c                  ó   — e Zd Zy)Ú_NotHTTPN)r5   r6   r7   © r'   r%   rF   rF   V   s   „ Ør'   rF   c                ó¼   — t         j                  j                  | «      \  }}}}}|dvr
t        «       ‚|j	                  | d¬«      }t        |«       t        |«       y)zõ
    Send a HEAD request to the URL, and ensure the response contains a simple
    API Response.

    Raises `_NotHTTP` if the URL is not available for a HEAD request, or
    `_NotAPIContent` if the content type is not a valid content type.
    >   ÚhttpÚhttpsT)Úallow_redirectsN)ÚurllibÚparseÚurlsplitrF   Úheadr   rD   )r#   Úsessionr$   ÚnetlocÚpathÚqueryÚfragmentÚresps           r%   Ú_ensure_api_responserV   Z   sV   € ô -3¯L©L×,AÑ,AÀ#Ó,FÑ)€FˆF�D˜% ØÐ&Ñ&Ü‹jÐà�<‰<˜¨Tˆ<Ó2€DÜ�TÔä�tÕr'   c                óˆ  — t        t        | «      j                  «      rt        | |¬«       t        j                  dt        | «      «       |j                  | dj                  g d¢«      ddœ¬«      }t        |«       t        |«       t        j                  dt        | «      |j                  j                  d	d
«      «       |S )aY  Access an Simple API response with GET, and return the response.

    This consists of three parts:

    1. If the URL looks suspiciously like an archive, send a HEAD first to
       check the Content-Type is HTML or Simple API, to avoid downloading a
       large file. Raise `_NotHTTP` if the content type cannot be determined, or
       `_NotAPIContent` if it is not HTML or a Simple API.
    2. Actually perform the request. Raise HTTP exceptions on network failures.
    3. Check the Content-Type header to make sure we got a Simple API response,
       and raise `_NotAPIContent` otherwise.
    ©rP   zGetting page %sz, )r=   z*application/vnd.pypi.simple.v1+html; q=0.1ztext/html; q=0.01z	max-age=0)ÚAcceptzCache-Control)r>   zFetched page %s as %sr;   r<   )r   r   ÚfilenamerV   ÚloggerÚdebugr   r?   Újoinr   rD   r>   )r#   rP   rU   s      r%   Ú_get_simple_responser^   l   s¬   € ô ”t˜C“y×)Ñ)Ô*Ü˜S¨'Õ2ä
‡L�LÐ"Ô$8¸Ó$=Ô>à�;‰;Øà—i‘iòóð( )ñ+
ð ó €Dô4 �TÔô �tÔä
‡L�LØÜ˜SÓ!Ø�‰×Ñ˜¨Ó3ôð €Kr'   c                ó˜   — | rHd| v rDt         j                  j                  «       }| d   |d<   |j                  d«      }|rt	        |«      S y)z=Determine if we have any encoding information in our headers.r;   zcontent-typeÚcharsetN)ÚemailÚmessageÚMessageÚ	get_paramr2   )r>   Úmr`   s      r%   Ú_get_encoding_from_headersrf   «   sK   € á�> WÑ,Ü�M‰M×!Ñ!Ó#ˆØ# NÑ3ˆˆ.ÑØ—+‘+˜iÓ(ˆÙÜ�w“<ÐØr'   c                  ó$   — e Zd Zdd„Zdd„Zdd„Zy)ÚCacheablePageContentc                ó.   — |j                   sJ ‚|| _        y r+   )Úcache_link_parsingÚpage©r0   rk   s     r%   r-   zCacheablePageContent.__init__·   s   € Ø×&Ò&Ð&Ð&Øˆ�	r'   c                óŠ   — t        |t        | «      «      xr- | j                  j                  |j                  j                  k(  S r+   )Ú
isinstanceÚtyperk   r#   )r0   Úothers     r%   Ú__eq__zCacheablePageContent.__eq__»   s-   € Ü˜%¤ d£Ó,ÒP°·±·±À%Ç*Á*Ç.Á.Ñ1PÐPr'   c                ó@   — t        | j                  j                  «      S r+   )Úhashrk   r#   ©r0   s    r%   Ú__hash__zCacheablePageContent.__hash__¾   s   € Ü�D—I‘I—M‘MÓ"Ð"r'   N)rk   ÚIndexContentr3   r4   )rp   Úobjectr3   Úbool)r3   Úint)r5   r6   r7   r-   rq   ru   rG   r'   r%   rh   rh   ¶   s   „ óóQô#r'   rh   c                  ó   — e Zd Zdd„Zy)Ú
ParseLinksc                 ó   — y r+   rG   rl   s     r%   Ú__call__zParseLinks.__call__Ã   s   � r'   N©rk   rv   r3   zIterable[Link])r5   r6   r7   r}   rG   r'   r%   r{   r{   Â   s   „ ÜAr'   r{   c                óz   ‡ ‡— t         j                  dˆ fd„«       Št        j                  ‰ «      dˆ ˆfd„«       }|S )zÚ
    Given a function that parses an Iterable[Link] from an IndexContent, cache the
    function's result (keyed by CacheablePageContent), unless the IndexContent
    `page` has `page.cache_link_parsing == False`.
    c                ó:   •— t         ‰| j                  «      «      S r+   )Úlistrk   )Úcacheable_pageÚfns    €r%   Úwrapperz*with_cached_index_content.<locals>.wrapperÍ   s   ø€ ä‘B�~×*Ñ*Ó+Ó,Ð,r'   c                ó`   •— | j                   r ‰t        | «      «      S t         ‰| «      «      S r+   )rj   rh   r�   )rk   rƒ   r„   s    €€r%   Úwrapper_wrapperz2with_cached_index_content.<locals>.wrapper_wrapperÑ   s+   ø€ à×"Ò"ÙÔ/°Ó5Ó6Ð6Ü‘B�t“H‹~Ðr'   )r‚   rh   r3   ú
list[Link])rk   rv   r3   r‡   )Ú	functoolsÚcacheÚwraps)rƒ   r†   r„   s   ` @r%   Úwith_cached_index_contentr‹   Æ   s@   ù€ ô ‡_�_ô-ó ð-ô ‡_�_�RÓõó ðð
 Ðr'   rv   c              #  óT  K  — | j                   j                  «       }|j                  d«      r^t        j                  | j
                  «      }|j                  dg «      D ])  }t        j                  || j                  «      }|€Œ&|–— Œ+ yt        | j                  «      }| j                  xs d}|j                  | j
                  j                  |«      «       | j                  }|j                  xs |}|j                  D ]!  }	t        j                   |	||¬«      }|€Œ|–— Œ# y­w)z\
    Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
    r=   ÚfilesNzutf-8)Úpage_urlÚbase_url)r.   r    r!   ÚjsonÚloadsÚcontentr?   r   Ú	from_jsonr#   ÚHTMLLinkParserÚencodingÚfeedÚdecoder�   ÚanchorsÚfrom_element)
rk   rC   ÚdataÚfileÚlinkÚparserr•   r#   r�   Úanchors
             r%   Úparse_linksrŸ   Ú   sÿ   è ø€ ð ×&Ñ&×,Ñ,Ó.€NØ× Ñ Ð!FÔGÜ�z‰z˜$Ÿ,™,Ó'ˆØ—H‘H˜W bÓ)ò 	ˆDÜ—>‘> $¨¯©Ó1ˆDØˆ|ØØ‹Jð		ð
 	ä˜DŸH™HÓ%€FØ�}‰}Ò' €HØ
‡K�K�—‘×#Ñ# HÓ-Ô.à
�(‰(€CØ�‰Ò% #€HØ—.‘.ò ˆÜ× Ñ  °#ÀÔIˆØˆ<ØØ‹
ñ	ùs   ‚D&D(T)Úfrozenc                  óP   — e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   dd„Zy)rv   aŒ  Represents one response (or page), along with its URL.

    :param encoding: the encoding to decode the given content.
    :param url: the URL from which the HTML was downloaded.
    :param cache_link_parsing: whether links parsed from this page's url
                               should be cached. PyPI index urls should
                               have this set to False, for example.
    Úbytesr’   r2   r.   ú
str | Noner•   r#   Trx   rj   c                ó,   — t        | j                  «      S r+   )r   r#   rt   s    r%   Ú__str__zIndexContent.__str__  s   € Ü# D§H¡HÓ-Ð-r'   N)r3   r2   )r5   r6   r7   Ú__doc__Ú__annotations__rj   r¥   rG   r'   r%   rv   rv   ÷   s/   … ñð ƒNØÓØÓØ	ƒHØ#Ð˜Ó#ô.r'   c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd„Zdd„Zˆ xZS )r”   zf
    HTMLParser that keeps the first base HREF and a list of all anchor
    elements' attributes.
    c                óP   •— t         ‰| �  d¬«       || _        d | _        g | _        y )NT)Úconvert_charrefs)r,   r-   r#   r�   r˜   )r0   r#   r1   s     €r%   r-   zHTMLLinkParser.__init__  s(   ø€ Ü‰Ñ¨$ÐÔ/àˆŒØ$(ˆŒØ46ˆ�r'   c                ó²   — |dk(  r(| j                   €| j                  |«      }|�|| _         y y |dk(  r%| j                  j                  t	        |«      «       y y )NÚbaseÚa)r�   Úget_hrefr˜   ÚappendÚdict)r0   ÚtagÚattrsÚhrefs       r%   Úhandle_starttagzHTMLLinkParser.handle_starttag  sT   € Ø�&Š=˜TŸ]™]Ð2Ø—=‘= Ó'ˆDØÐØ $�•ð  à�CŠZØ�L‰L×Ñ¤ U£Õ,ð r'   c                ó*   — |D ]  \  }}|dk(  sŒ|c S  y )Nr³   rG   )r0   r²   ÚnameÚvalues       r%   r®   zHTMLLinkParser.get_href!  s&   € Ø ò 	‰KˆD�%Ø�v‹~Ø’ð	ð r'   )r#   r2   r3   r4   )r±   r2   r²   úlist[tuple[str, str | None]]r3   r4   )r²   r¸   r3   r£   )r5   r6   r7   r¦   r-   r´   r®   r8   r9   s   @r%   r”   r”     s   ø„ ñõ
7ó-÷r'   r”   c                ó<   — |€t         j                  } |d| |«       y )Nz%Could not fetch URL %s: %s - skipping)r[   r\   )rœ   ÚreasonÚmeths      r%   Ú_handle_get_simple_failr¼   (  s   € ð
 €|Ü�|‰|ˆÙÐ	0°$¸Õ?r'   c                óŽ   — t        | j                  «      }t        | j                  | j                  d   || j                  |¬«      S )Nr;   )r•   r#   rj   )rf   r>   rv   r’   r#   )rB   rj   r•   s      r%   Ú_make_index_contentr¾   2  sE   € ô *¨(×*:Ñ*:Ó;€HÜØ×ÑØ×Ñ˜Ñ(ØØ�L‰LØ-ôð r'   c               ó€  — | j                   j                  dd«      d   }t        |«      }|rt        j	                  d|| «       y t
        j                  j                  |«      \  }}}}}}|dk(  rˆt        j                  j                  t
        j                  j                  |«      «      rL|j                  d«      s|dz  }t
        j                  j                  |d«      }t        j                  d|«       	 t!        ||¬	«      }t#        || j$                  ¬
«      S # t&        $ r t        j	                  d| «       Y y t(        $ r6}t        j	                  d| |j*                  |j,                  «       Y d }~y d }~wt.        $ r}t1        | |«       Y d }~y d }~wt2        $ r}t1        | |«       Y d }~y d }~wt4        $ r6}d}	|	t7        |«      z  }	t1        | |	t        j8                  ¬«       Y d }~y d }~wt:        j<                  $ r}t1        | d|› �«       Y d }~y d }~wt:        j>                  $ r t1        | d«       Y y w xY w)Nú#r   r   zICannot look at %s URL %s because it does not support lookup as web pages.r›   ú/z
index.htmlz# file: URL is directory, getting %srX   )rj   z`Skipping page %s because it looks like an archive, and cannot be checked by a HTTP HEAD request.zºSkipping page %s because the %s request got Content-Type: %s. The only supported Content-Types are application/vnd.pypi.simple.v1+json, application/vnd.pypi.simple.v1+html, and text/htmlz4There was a problem confirming the ssl certificate: )r»   zconnection error: z	timed out) r#   Úsplitr&   r[   ÚwarningrL   rM   ÚurlparseÚosrR   Úisdirr@   Úurl2pathnameÚendswithÚurljoinr\   r^   r¾   rj   rF   r)   r/   r.   r   r¼   r   r   r2   Úinfor   ÚConnectionErrorÚTimeout)
rœ   rP   r#   Ú
vcs_schemer$   Ú_rR   rU   Úexcrº   s
             r%   Ú_get_index_contentrÐ   ?  s  € Ø
�(‰(�.‰.˜˜aÓ
  Ñ
#€Cô # 3Ó'€JÙÜ�‰ØWØØô	
ð
 ô  &Ÿ|™|×4Ñ4°SÓ9Ñ€FˆAˆt�Q˜˜1Ø�ÒœBŸG™GŸM™M¬&¯.©.×*EÑ*EÀdÓ*KÔLð �|‰|˜CÔ Ø�3‰JˆCô
 �l‰l×"Ñ" 3¨Ó5ˆÜ�‰Ð:¸CÔ@ðUÜ# C°Ô9ˆô: # 4¸D×<SÑ<SÔTÐTøô9 ò 
Ü�‰ð1àõ	
ð8 ô/ ò 
Ü�‰ðAð Ø×ÑØ×Ñ÷	
ð 	
ð, ûô "ò +Ü  c×*Ð*ð ûô ò +Ü  c×*Ð*ð ûô ò @ØGˆØ”#�c“(ÑˆÜ  f´6·;±;×?Ñ?ð ûô ×#Ñ#ò BÜ Ð(:¸3¸%Ð&@×AÐAð
 ûô	 ×Ñò 3Ü  kÕ2ð ð	3úsT   Ã9D ÄH=Ä>H=Å,E7Å7H=ÆFÆH=Æ F1Æ1H=Æ=,G.Ç.H=ÈHÈ"H=È<H=c                  ó"   — e Zd ZU ded<   ded<   y)ÚCollectedSourceszSequence[LinkSource | None]Ú
find_linksÚ
index_urlsN)r5   r6   r7   r§   rG   r'   r%   rÒ   rÒ   |  s   … Ø+Ó+Ø+Ô+r'   rÒ   c                  óv   — e Zd ZdZ	 	 	 	 	 	 dd„Ze	 d		 	 	 	 	 	 	 d
d„«       Zedd„«       Zdd„Z		 	 	 	 	 	 dd„Z
y)ÚLinkCollectorzµ
    Responsible for collecting Link objects from all configured locations,
    making network requests as needed.

    The class's main method is its collect_sources() method.
    c                ó    — || _         || _        y r+   )Úsearch_scoperP   )r0   rP   rØ   s      r%   r-   zLinkCollector.__init__‰  s   € ð
 )ˆÔØˆ�r'   c                ó0  — |j                   g|j                  z   }|j                  r0|s.t        j	                  ddj                  d„ |D «       «      «       g }|j                  xs g }t        j                  |||j                  ¬«      }t        ||¬«      }|S )zÆ
        :param session: The Session to use to make requests.
        :param suppress_no_index: Whether to ignore the --no-index option
            when constructing the SearchScope object.
        zIgnoring indexes: %sú,c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr+   r   )Ú.0r#   s     r%   ú	<genexpr>z'LinkCollector.create.<locals>.<genexpr>¡  s   è ø€ ÒI°sÔ-¨c×2ÑIùs   ‚)rÓ   rÔ   Úno_index)rP   rØ   )
Ú	index_urlÚextra_index_urlsrÞ   r[   r\   r]   rÓ   r   ÚcreaterÖ   )ÚclsrP   ÚoptionsÚsuppress_no_indexrÔ   rÓ   rØ   Úlink_collectors           r%   rá   zLinkCollector.create‘  sœ   € ð ×'Ñ'Ð(¨7×+CÑ+CÑCˆ
Ø×ÒÑ$5Ü�L‰LØ&Ø—‘ÑI¸jÔIÓIôð ˆJð ×'Ñ'Ò-¨2ˆ
ä"×)Ñ)Ø!Ø!Ø×%Ñ%ô
ˆô
 'ØØ%ô
ˆð Ðr'   c                ó.   — | j                   j                  S r+   )rØ   rÓ   rt   s    r%   rÓ   zLinkCollector.find_links³  s   € à× Ñ ×+Ñ+Ð+r'   c                ó0   — t        || j                  ¬«      S )z>
        Fetch an HTML page containing package links.
        rX   )rÐ   rP   )r0   Úlocations     r%   Úfetch_responsezLinkCollector.fetch_response·  s   € ô " (°D·L±LÔAÐAr'   c                ó‚  ‡ ‡‡— t        j                  ˆˆˆ fd„‰ j                  j                  ‰«      D «       «      j	                  «       }t        j                  ˆˆˆ fd„‰ j
                  D «       «      j	                  «       }t        j                  t        j                  «      rwt        j                  ||«      D �cg c]  }|�|j                  �d|j                  › �‘Œ! }}t        |«      › d‰› d�g|z   }t        j                  dj                  |«      «       t!        t#        |«      t#        |«      ¬«      S c c}w )Nc           	   3  óh   •K  — | ])  }t        |‰‰j                  j                  d d ‰¬«      –— Œ+ y­w)F©Úcandidates_from_pageÚpage_validatorÚ
expand_dirrj   Úproject_nameN©r   rP   Úis_secure_origin©rÜ   Úlocrí   rð   r0   s     €€€r%   rÝ   z0LinkCollector.collect_sources.<locals>.<genexpr>Ã  sA   øè ø€ ò 
4
ð ô ØØ%9Ø#Ÿ|™|×<Ñ<Ø Ø#(Ø)÷ð ñ
4
ùó   ƒ/2c           	   3  óh   •K  — | ])  }t        |‰‰j                  j                  d d ‰¬«      –— Œ+ y­w)Trì   Nrñ   ró   s     €€€r%   rÝ   z0LinkCollector.collect_sources.<locals>.<genexpr>Î  sA   øè ø€ ò 
5
ð ô ØØ%9Ø#Ÿ|™|×<Ñ<ØØ#'Ø)÷ð ñ
5
ùrõ   z* z' location(s) to search for versions of ú:ú
)rÓ   rÔ   )ÚcollectionsÚOrderedDictrØ   Úget_index_urls_locationsÚvaluesrÓ   r[   ÚisEnabledForÚloggingÚDEBUGÚ	itertoolsÚchainrœ   r"   r\   r]   rÒ   r�   )r0   rð   rí   Úindex_url_sourcesÚfind_links_sourcesÚsÚliness   ```    r%   Úcollect_sourceszLinkCollector.collect_sources½  s2  ú€ ô (×3Ñ3õ 
4
ð ×(Ñ(×AÑAÀ,ÓOô
4
ó 

÷ ‰&‹(ð 	ô )×4Ñ4õ 
5
ð —‘ô
5
ó 

÷ ‰&‹(ð 	ô ×ÑœwŸ}™}Ô-ô #Ÿ™Ð);Ð=NÓOöàØ�= Q§V¡VÐ%7ð �Q—V‘V�H’ðˆEð ô �u“:�,ð #Ø#/ .°ð3ðð ñˆEô �L‰L˜Ÿ™ 5Ó)Ô*äÜÐ.Ó/ÜÐ-Ó.ô
ð 	
ùòs   Â>$D<N)rP   r   rØ   r   r3   r4   )F)rP   r   rã   r	   rä   rx   r3   rÖ   )r3   z	list[str])rè   r   r3   úIndexContent | None)rð   r2   rí   r   r3   rÒ   )r5   r6   r7   r¦   r-   Úclassmethodrá   ÚpropertyrÓ   ré   r  rG   r'   r%   rÖ   rÖ   �  s£   „ ñðàðð "ðð 
ó	ð ð
 #(ð	àðð ðð  ð	ð
 
òó ððB ò,ó ð,óBð,
àð,
ð 1ð,
ð 
ô	,
r'   rÖ   )r#   r2   r3   r£   )rB   r   r3   r4   )r#   r2   rP   r   r3   r4   )r#   r2   rP   r   r3   r   )r>   ÚResponseHeadersr3   r£   )rƒ   r{   r3   r{   r~   r+   )rœ   r   rº   zstr | Exceptionr»   zCallable[..., None] | Noner3   r4   )T)rB   r   rj   rx   r3   rv   )rœ   r   rP   r   r3   r  )Or¦   Ú
__future__r   rù   Úemail.messagera   rˆ   r   r�   rþ   rÅ   Úurllib.parserL   Úurllib.requestÚcollections.abcr   r   r   Údataclassesr   Úhtml.parserr   Úoptparser	   Útypingr
   r   r   Úpip._vendorr   Úpip._vendor.requestsr   Úpip._vendor.requests.exceptionsr   r   Úpip._internal.exceptionsr   Úpip._internal.models.linkr   Ú!pip._internal.models.search_scoper   Úpip._internal.network.sessionr   Úpip._internal.network.utilsr   Úpip._internal.utils.filetypesr   Úpip._internal.utils.miscr   Úpip._internal.vcsr   Úsourcesr   r   r   Ú	getLoggerr5   r[   r2   r
  r&   Ú	Exceptionr)   rD   rF   rV   r^   rf   rh   r{   r‹   rŸ   rv   r”   r¼   r¾   rÐ   rÒ   rÖ   rG   r'   r%   ú<module>r"     s�  ðñõ #ã Û Û Û Û Û Û 	Û Û ß >Ñ >Ý !Ý "Ý ÷ñ õ !Ý )ß @å ;Ý *Ý 9Ý 4Ý 8Ý 9Ý 9Ý !ç AÑ Aà	ˆ×	Ñ	˜8Ó	$€à   c Ñ*€óô)�Yô )ó@ô,	ˆyô 	óó$<ó~÷	#ñ 	#ôB�ô Bóð( òó ðñ8 �$Ô÷.ð .ó ð.ô(�Zô ð> (,ð@Ø
ð@àð@ð %ð@ð 
ó	@ð 48ð
Øð
Ø,0ð
àó
ó:ôz,�zô ,÷
h
ò h
r'   