+
     h  c                   s   R t ^ RIt^ RIHt ^ RIt]P
                  ! R]P                  4      t]P
                  ! R]P                  4      t]P
                  ! R]P                  4      t	]P
                  ! R]P                  4      t
R R ltR	 R
 ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R lt ^ RIHt R#   ] d    ]'       g   ]t R#  R# i ; i)zZ
Helpers for normalization as expected in wheel/sdist/module file names
and core metadata
N)TYPE_CHECKINGz)^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$z[^A-Z0-9._-]+z
[^A-Z0-9]+z,^v?(?P<safe>(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)c                0    V ^8  d   QhR\         R\         /# )   namereturnstrZformat   ">/usr/lib/python3.14/site-packages/setuptools/_normalization.py__annotate__r
      s     	 	# 	# 	    c                sf    \         P                  ! RRV 4      pVP                  4       '       g   Q hV# )zMake a string safe to be used as Python identifier.
>>> safe_identifier("12abc")
'_12abc'
>>> safe_identifier("__editable__.myns.pkg-78.9.3_local")
'__editable___myns_pkg_78_9_3_local'
z
\W|^(?=\d)_)resubZisidentifier)r   safes   & r	   safe_identifierr      s0     66-d+DKr   c                r   )r   	componentr   r   r   r   r	   r
   r
      s     
2 
2 
2 
2r   c                s.    \         P                  RV 4      # )zEscape a component used as a project name according to Core Metadata.
>>> safe_name("hello world")
'hello-world'
>>> safe_name("hello?world")
'hello-world'
>>> safe_name("hello_world")
'hello_world'
-)_UNSAFE_NAME_CHARSr   )r      &r	   	safe_namer      s     !!#y11r   c                r   r   versionr   r   r   r   r	   r
   r
   +   s     7 7# 7# 7r   c                s>   V P                  RR4      p \        \        P                  P	                  V4      4      #   \        P                  P
                   dB    \        P                  RT4      p\        \        P                  P	                  T4      4      u # i ; i)a  Convert an arbitrary string into a valid version string.
Can still raise an ``InvalidVersion`` exception.
To avoid exceptions use ``best_effort_version``.
>>> safe_version("1988 12 25")
'1988.12.25'
>>> safe_version("v0.2.1")
'0.2.1'
>>> safe_version("v0.2?beta")
'0.2b0'
>>> safe_version("v0.2 beta")
'0.2b0'
>>> safe_version("ubuntu lts")
Traceback (most recent call last):
...
packaging.version.InvalidVersion: Invalid version: 'ubuntu.lts'
 .r   )replacer   	packagingr   ZVersionInvalidVersionr   r   )r   vZattempts   &  r	   safe_versionr   +   s~    " 	S!A79$$,,Q/00++ 7$((a09$$,,W5667s   '< ABBc                r   r   r   r   r   r	   r
   r
   D   s     4 4 4 4r   c                s    \        V 4      #   \        P                  P                   d    T P	                  RR4      p\
        P                  T4      pT'       d   TR,          pT\        T4      R pMRpT p\        P                  RT4      P                  R4      pRT 2P                  R4      p\        T RT 24      u # i ; i)a  Convert an arbitrary string into a version-like string.
Fallback when ``safe_version`` is not safe enough.
>>> best_effort_version("v0.2 beta")
'0.2b0'
>>> best_effort_version("ubuntu lts")
'0.dev0+sanitized.ubuntu.lts'
>>> best_effort_version("0.23ubuntu1")
'0.23.dev0+sanitized.ubuntu1'
>>> best_effort_version("0.23-")
'0.23.dev0+sanitized'
>>> best_effort_version("0.-_")
'0.dev0+sanitized'
>>> best_effort_version("42.+?1")
'42.dev0+sanitized.1'
r   r   r   NZ0z
sanitized.z.dev0+)r   r   r   r   r   _PEP440_FALLBACKZsearchZlen_NON_ALPHANUMERICr   strip)r   r   Zmatchr   ZrestZ	safe_restZlocals   &      r	   best_effort_versionr"   D   s    "4G$$++ 4OOC% ''*=DSY[>DDD%))#t4::3?	YK(..s3tfF5'2334s   
 ACA%CCc                r   )r   extrar   r   r   r   r	   r
   r
   e   s     @ @c @c @r   c                sh    \         P                  RV 4      P                  R4      P                  4       # )zNormalize extra name according to PEP 685
>>> safe_extra("_FrIeNdLy-._.-bArD")
'friendly-bard'
>>> safe_extra("FrIeNdLy-._.-bArD__._-")
'friendly-bard'
r   )r    r   r!   lower)r#   r   r	   
safe_extrar%   e   s+       e,2237==??r   c                r   r   valuer   r   r   r   r	   r
   r
   o   s     . .c .c .r   c                sD    V P                  RR4      P                  R4      # )zNormalize each component of a filename (e.g. distribution/version part of wheel)
Note: ``value`` needs to be already normalized.
>>> filename_component("my-pkg")
'my_pkg'
r   r   )r   r!   r'   r   r	   filename_componentr)   o   s      ==c"((--r   c                r   r&   r   r   r   r	   r
   r
   x   s     # #S #S #r   c                s&    V P                  RR4      # )z
Produce the incorrect filename component for compatibility.

See pypa/setuptools#4167 for detailed analysis.

TODO: replace this with filename_component after pip 24 is
nearly-ubiquitous.

>>> filename_component_broken('foo_bar-baz')
'foo-bar-baz'
r   r   )r   r(   r   r	   filename_component_brokenr*   x   s     ==c""r   c                r   r&   r   r   r   r	   r
   r
      s     	 	c 	c 	r   c                s    \         P                  ! RR\        V 4      4      P                  4       P	                  RR4      # )zBLike ``safe_name`` but can be used as filename component for wheelz[-_.]+r   r   )r   r   r   r$   r   r(   r   r	   
safer_namer+      s1    
 	y#y/0		c	r   c                r   r&   r   r   r   r	   r
   r
      s     : :S :S :r   c                s*    \        \        V 4      4      # )zLLike ``best_effort_version`` but can be used as filename component for wheel)r)   r"   r(   r   r	   safer_best_effort_versionr,      s     1%899r   c                r   )r   
expressionr   r   r   r   r	   r
   r
      s        r   c                s    \        R4      h)a  
Defer import error to affect only users that actually use it
https://github.com/pypa/setuptools/issues/4894
>>> _missing_canonicalize_license_expression("a OR b")
Traceback (most recent call last):
...
ImportError: ...Cannot import `packaging.licenses`...
zCannot import `packaging.licenses`.
        Setuptools>=77.0.0 requires "packaging>=24.2" to work properly.
        Please make sure you have a suitable version installed.
        )ImportError)r-   r   r	   (_missing_canonicalize_license_expressionr/      s     	 r   )canonicalize_license_expression)Z__doc__r   Ztypingr    r   ZcompileZIZ_VALID_NAMEr   r    r   r   r   r   r"   r%   r)   r*   r+   r,   r/   Zpackaging.licensesr0   Z _canonicalize_license_expressionr.   ) r   r	   <module>r1      s   
 
    jjErttLZZ 0"$$7 JJ}bdd3 ::MrttT 	
2724B@.#	:$T  T+S( Ts   C
 
C"C"!C"