+
     ii7                        ^ RI t ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIH	t	 Rt
]P                  ! ]
4      t]P                  ! R]P                  4      t] P                  ! ]4      t]P$                  ! R4      t]P$                  ! R	4      t]'       d	   ]'       gd   ]! 4       t]P-                  R
4       ]'       g   ]P%                  RR4      R,          t]'       g#   ]P%                  RR4      P/                  RR4      t ];QJ d#    . R ]P3                  R4       4       F  NK  	  5M! R ]P3                  R4       4       4      t ];QJ d#    . R ]P3                  R4       4       F  NK  	  5M! R ]P3                  R4       4       4      t ! R R4      tRR ltR t R t!R t"R t#R t$R R lt%R#   ] d    ]P9                  R4        Li ; i  ] d    ]P9                  R4        L]i ; i)!    N)environexists)ConfigParser)GeneratorTypez(-)?(\d\.\d+)(?:(-)(\d\.\d+)?)?z
    (?P<major>\d+)\.?
    (?P<minor>\d+)?\.?
    (?P<micro>\d+)?[.\s]?
    (?P<releaselevel>alpha|beta|candidate|final)?[.\s]?
    (?P<serial>\d+)?DEBPYTHON3_SUPPORTEDDEBPYTHON3_DEFAULTz"/usr/share/python3/debian_defaultsDEFAULTzdefault-version:   NNzsupported-versionspython c              #   8   "   T F  p\        V4      x  K  	  R # 5iNint.0is   & '/usr/share/python3/debpython/version.py	<genexpr>r   5   s     8$7qCFF$7   .zcannot read debian_defaultsc              #      "   T Fk  p\         ;QJ d1    . R  VP                  4       P                  R4       4       F  NK  	  5M*! R  VP                  4       P                  R4       4       4      x  Km  	  R# 5i)c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   )r   js   & r   r   <genexpr>.<genexpr>9   s     A,@qCFF,@r   r   N)tuplestripsplitr   s   & r   r   r   9   sQ      64! eAAGGIOOC,@AeeAAGGIOOC,@AAA4s   A5A#A5,c                   |   a  ] tR t^?t o RR ltR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tRR ltRtV tR# )VersionNc           	     r   \        V\        \        34      '       d   R P                  R V 4       4      p\        V\        4      '       d!   R F  p\        W\        W4      4       K  	  R# \        4       pVR VR V'       d]   \        P                  V4      p	V	'       d   V	P                  4       P                  4       M.  F  w  rqVf   K  W,          e   K  WV&   K  	  VP                  4        F'  w  rqVR8w  d   Ve   \        V4      p\        WV4       K)  	  V P                  '       g   \        R4      hR# )r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   strr   s   & r   r   #Version.__init__.<locals>.<genexpr>C   s     3USVVUr   releaselevelNselfvaluezmajor component is requiredmajorminormicror(   serial)
isinstancer   listjoinr"   setattrgetattrlocals
VERSION_REmatch	groupdictitemsr   r,   
ValueError)
r)   r*   r,   r-   r.   r(   r/   namecompr7   s
   &&&&&&&   r   __init__Version.__init__@   s   eeT]++HH3U33EeW%%MGE$89 NxLM$$U+E<Au0668rI$);!&J  J  ::<KD~%%*;E
D& ( zzz:;;     c                    \        V P                  4      pV P                  e#   VRP                  V P                  4      ,          pV# )zReturn major.minor or major string.

>>> str(Version(major=3, minor=2, micro=1, releaselevel='final', serial=4))
'3.2'
>>> str(Version(major=2))
'2'
.{})r&   r,   r-   format)r)   results   & r   __str__Version.__str__W   s7     TZZ::!ell4::..Fr?   c                *    \        \        V 4      4      # r   )hashrepr)r)   s   &r   __hash__Version.__hash__d   s    DJr?   c                    RP                  V 4      pR F8  p\        W4      pV'       g    VR,           # VRP                  V4      ,          pK:  	  VR,           # )zReturn full version string.

>>> repr(Version(major=3, minor=2, micro=1, releaselevel='final', serial=4))
"Version('3.2.1.final.4')"
>>> repr(Version(major=2))
"Version('2')"
zVersion('{}rA   z'))r.   r(   r/   )rB   r4   )r)   rC   r;   r*   s   &   r   __repr__Version.__repr__g   sY     %%d+7DD'E} ell5))F	 8
 }r?   c                    \        V 4      pV P                  f%   V;P                  \        V4      ,          un        V# V;P                  \        V4      ,          un        V# )z`Return next version.

>>> Version('3.1') + 1
Version('3.2')
>>> Version('2') + '1'
Version('3')
)r"   r-   r,   r   )r)   otherrC   s   && r   __add__Version.__add__w   sI     ::LLCJ&L  LLCJ&Lr?   c                   \        V 4      pV P                  f0   V;P                  \        V4      ,          un        VP                  pM.V;P                  \        V4      ,          un        VP                  pV^ 8  d   \	        R4      hV# )zdReturn previous version.

>>> Version('3.1') - 1
Version('3.0')
>>> Version('3') - '1'
Version('2')
zcannot decrease version further)r"   r-   r,   r   r:   )r)   rO   rC   news   &&  r   __sub__Version.__sub__   se     ::LLCJ&L,,CLLCJ&L,,C7>??r?   c                *    V P                  V4      ^ 8H  # r   _Version__cmpr)   rO   s   &&r   __eq__Version.__eq__       zz% A%%r?   c                *    V P                  V4      ^ 8  # rW   rX   rZ   s   &&r   __lt__Version.__lt__       zz% 1$$r?   c                *    V P                  V4      ^ 8*  # rW   rX   rZ   s   &&r   __le__Version.__le__   r]   r?   c                *    V P                  V4      ^ 8  # rW   rX   rZ   s   &&r   __gt__Version.__gt__   ra   r?   c                *    V P                  V4      ^ 8  # rW   rX   rZ   s   &&r   __ge__Version.__ge__   r]   r?   c                    \        V\        4      '       g   \        V4      pV P                  e   VP                  f   V P                  VRR7      ^ 8  # V P                  VRR7      ^ 8  # )a  Compare major.minor or major only (if minor is not set).

>>> Version('2.6') << Version('2.7')
True
>>> Version('2.6') << Version('2.6.6')
False
>>> Version('3') << Version('2')
False
>>> Version('3.1') << Version('2')
False
>>> Version('2') << Version('3.2.1.alpha.3')
True
r-   ignorer.   r0   r"   r-   rY   rZ   s   &&r   
__lshift__Version.__lshift__   ]     %))ENE::!4::eG:4q88::eG:4q88r?   c                    \        V\        4      '       g   \        V4      pV P                  e   VP                  f   V P                  VRR7      ^ 8  # V P                  VRR7      ^ 8  # )a  Compare major.minor or major only (if minor is not set).

>>> Version('2.6') >> Version('2.7')
False
>>> Version('2.6.7') >> Version('2.6.6')
False
>>> Version('3') >> Version('2')
True
>>> Version('3.1') >> Version('2')
True
>>> Version('2.1') >> Version('3.2.1.alpha.3')
False
r-   rl   r.   rn   rZ   s   &&r   
__rshift__Version.__rshift__   rq   r?   c           	     T   \        V\        4      '       g   \        V4      pR F  pW28X  d    ^ # \        W4      ;'       g    ^ p\        W4      ;'       g    ^ pVR8X  d/   RRRRRR	R^ /pVP                  V^ 4      pVP                  V^ 4      pWE8X  d   Ks  WE8  WE8  ,
          u # 	  ^ # )
r,   r(   alphabeta	candidatefinalr+   )r0   r"   r4   get)r)   rO   rm   r;   value1value2rmaps   &&&    r   __cmpVersion.__cmp   s    %))ENEID~  T(--AFU)..QF~%VRb'1M&!,&!,O88 J r?    )NNNNNNr   )__name__
__module____qualname____firstlineno__r=   rD   rI   rL   rP   rT   r[   r_   rc   rf   ri   ro   rs   rY   __static_attributes____classdictcell__)__classdict__s   @r   r"   r"   ?   sP     <.  &&%&%&9*9* r?   r"   c                  aa \        V \        4      '       d   \        V 4      p V '       d   \        V 4      RR.8X  d   \	        \
        4      pMoV ^ ,          f   RMV ^ ,          oV ^,          f   RMV ^,          oSS8X  d#   \	        S\
        9   d   S3M	\        4       4      pM\	        VV3R l\
         4       4      pV'       d   \	        R V 4       4      pV# VRJ d   \	        R V 4       4      pV# )a  Return a set of requested and supported Python versions.

:param available: if set to `True`, return installed versions only,
    if set to `False`, return requested versions that are not installed.
    By default returns all requested versions.
:type available: bool

>>> sorted(get_requested_versions([(3, 0), None]))
[(3, 2), (3, 3)]
>>> sorted(get_requested_versions('')) == sorted(SUPPORTED)
True
>>> sorted(get_requested_versions([None, None])) == sorted(SUPPORTED)
True
>>> get_requested_versions([(5, 0), None]) == set()
True
Nc              3   R   <"   T F  pSTu;8:  d
   S8  g   K  M K  Vx  K  	  R # 5ir   r   )r   vmaxvminvs   & r   r   )get_requested_versions.<locals>.<genexpr>   s"     Di413Ct3C13C1is   ''
'c              3   Z   "   T F!  p\        R V,          4      '       g   K  Vx  K#  	  R# 5iz/usr/bin/python%d.%dNr   r   r   s   & r   r   r     s%      >(Q !7!!;< q(   +
+Fc              3   Z   "   T F!  p\        R V,          4      '       d   K  Vx  K#  	  R# 5ir   r   r   s   & r   r   r     s&      B(Q$%;a%?@ q(r   )r   r   )c   r   )r0   r&   parse_vranger1   set	SUPPORTEDr   )vrange	availableversionsr   r   s   && @@r   get_requested_versionsr      s    " &#f%T&\dD\1y>*vq	!!9,x&)4<di&7D7UWEHDiDDH >( > > O	 
e	 B( B B Or?   c                   V R9   d   R# \         P                  V 4      pV'       g   \        RV ,          4      hVP                  4       p\	        V4      P                  R4      ^8X  d\   \        ;QJ d*    . R V^,          P                  R4       4       F  NK  	  5M#! R V^,          P                  R4       4       4      pW33# R;r4V^ ,          '       d   V^,          pMV^,          pV^,          pV'       dK   \        ;QJ d#    . R VP                  R4       4       F  NK  	  5M! R VP                  R4       4       4      MRpV'       dK   \        ;QJ d#    . R VP                  R4       4       F  NK  	  5M! R VP                  R4       4       4      MRpV'       d!   V'       d   W48  d   \        RV ,          4      hW43# )	aO  Return minimum and maximum Python version from given range.

>>> parse_vrange('3.0-')
((3, 0), None)
>>> parse_vrange('3.1-3.3')
((3, 1), (3, 3))
>>> parse_vrange('3.2-4.0')
((3, 2), (4, 0))
>>> parse_vrange('-3.7')
(None, (3, 7))
>>> parse_vrange('3.2')
((3, 2), (3, 2))
>>> parse_vrange('') == parse_vrange('-') == (None, None)
True
Nzversion range is invalid: %sc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   parse_vrange.<locals>.<genexpr>%  s     :%9SVV%9r   r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   r   /       1AQr   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   r   0  r   r   )r   -NN)RANGE_REr7   r:   groupsr1   countr   r   )r*   r7   r   r   r   s   &    r   r   r     sH     	NN5!E7%?@@\\^FF|$1$u:VAY__S%9:uu:VAY__S%9::zDayyayayay59551C1551C11tD59551C1551C11tD7%?@@:r?   c                   R;r\        4       pV P                  R4       F  pVP                  4       p\        P                  ! RV4      pV'       d   RVP                  ^4      ,          pKL  \        P                  ! RV4      pV'       d   RVP                  ^4      ,          pK  \        P                  ! RV4      pV'       g   K  VP                  RVP                  ^ 4      ,          4       K  	  \        V4      ^8X  d'   VP                  4       p\        V4      \        V4      3# V'       g   V'       d   \        V4      ^ ,          pV'       d   \        V4      MRV'       d   \        V4      3# R3# )zParse X-Python3-Version.

>>> parse_pycentral_vrange('>= 3.1')
((3, 1), None)
>>> parse_pycentral_vrange('<< 4.0')
(None, (4, 0))
>>> parse_pycentral_vrange('3.1')
((3, 1), (3, 1))
>>> parse_pycentral_vrange('3.1, 3.2')
((3, 1), None)
Nr    z>=\s*([\d\.]+)z%.3sz<<\s*([\d\.]+)z	^[\d\.]+$)r   r   r   rer7   groupaddlenpopgetversorted)r*   r   r   	hardcodeditemr7   vers   &      r   parse_pycentral_vranger   8  s    DIC zz|*D1EKKN*D*D1EKKN*Dt,5MM&5;;q>12 ! 9~mmoc{F3K''Ii #6$<T46$<IITIIr?   c                   V ^ ,          V ^,          u;J d   f    R#  V ^ ,          V ^,          8X  d    RP                  R V ^ ,           4       4      # V ^ ,          f'   RRP                  R V ^,           4       4      ,           # V ^,          f'   RP                  R V ^ ,           4       4      R,           # RP                  R V ^ ,           4       4      : RRP                  R V ^,           4       4      : 2# )a  Return version range string from given range.

>>> vrange_str(((3, 4), None))
'3.4-'
>>> vrange_str(((3, 4), (3, 6)))
'3.4-3.6'
>>> vrange_str(((3, 4), (4, 0)))
'3.4-4.0'
>>> vrange_str((None, (3, 7)))
'-3.7'
>>> vrange_str(((3, 5), (3, 5)))
'3.5'
>>> vrange_str((None, None))
'-'
r   r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   vrange_str.<locals>.<genexpr>v       2	1A	r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   r   x  s     8ic!ffir   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   r   z  r   r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   r   |       "=9a3q669r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   r   }  r   r   )r2   )r   s   &r   
vrange_strr   c  s      ayF1I%% &ayF1Ixx2q	222		SXX8fQi8888		xx2q	22S88(("=6!9"==(("=6!9"==? 	?r?   c                   \        V \        4      '       d   V # \        V \        \        34      '       g6   \        V ^ ,          \        4      '       d   RP                  R V  4       4      # . pV  FS  p\        V\        4      '       d   VP                  V4       K,  VP                  RP                  R V 4       4      4       KU  	  V# )z
>>> vrepr(([3, 4], [3, 2]))
['3.4', '3.2']
>>> vrepr(('2.6', '3.1'))
['2.6', '3.1']
>>> vrepr('3.2')
'3.2'
>>> vrepr((3, 2))
'3.2'
r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   vrepr.<locals>.<genexpr>  s     .1Ar   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r%   r   s   & r   r   r     s     ";7a3q667r   )r0   r&   r   r   r   r2   append)r*   rC   versions   &  r   vreprr     s     %s344E!Hc9R9Rxx....Fgs##MM'"MM#((";7";;<	 
 Mr?   c                   V '       g   R# \        V \        4      '       d
   V R,          # \        ;QJ d+    . R V P                  R^4       4       F  NK  	  5R,          # ! R V P                  R^4       4       4      R,          # )zReturn pair of integers that represent version.

>>> getver('3.2')
(3, 2)
>>> getver('3.1.4')
(3, 1)
>>> getver((3, 3, 1))
(3, 3)
>>> getver(None)
''
r   :N   Nc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   getver.<locals>.<genexpr>  s     5!4AQ!4r   r   )r0   r   r   )r*   s   &r   r   r     sc     %Ry55S!!455b9955S!!455b99r?   c                <   . p. p\        V 4       FS  p\        V\        4      '       d   \        V4      pV\        8  d   VP                  V4       KB  VP                  V4       KU  	  VP                  \        V4      4       V'       d   V'       d   \        V4      # V# )ak  Return sorted list of versions starting with default Python
version (if available) then list of suppored versions greater than default
one followed by reversed list of older versions.

List of versions sorted this way can be used in Depends field.

:param vrepr: return string represenatations of versions, by default the
    same format is used as in :param:`versions`

>>> debsorted([(2, 6), (3, 1), (3, 2), (3, 3), (2, 7)])[0] == DEFAULT
True
>>> debsorted(('2.4', '3.2', '2.6', '2.7'))[-1]
(2, 4)
>>> debsorted(set([(2, 1), (2, 2)]))
[(2, 2), (2, 1)]
>>> debsorted([(2, 1), (2, 2)], return_str=True)
['2.2', '2.1']
)	r   r0   r&   r   r
   r   extendreversedr   )r   
return_strrC   old_versionsr   s   &&   r   	debsortedr     s|    & FL(#gs##WoGW(MM'" $ MM(<()fV}Mr?   r   r   )&loggingr   osr   os.pathr   configparserr   typesr   RANGE_PATTERNcompiler   VERBOSEr6   	getLoggerr   logr}   
_supported_default_configreadreplacer   r   r
   	Exception	exceptionr   r"   r   r   r   r   r   r   r   r   r?   r   <module>r      s  ,  	   % 2::m$ZZ 
 %
 ! [[/0
;;+,nGLL56;;y*;<R@[[,@AWXr" 	1e8HNN3$78ee8HNN3$788G1 6)//46 6)//46 6Ib bJ%P)X(JV?:2:&m  1MM/01
  1MM/01s0   <F. ?F. G 
?G .G	G	G'&G'