ó
    6°h:v  ã                  óF  • S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	J
r
Jr  SSKJr  SSKJr  \R                   (       a  S SKrSSKJrJrJr  \R*                  " S5      r\ V s0 s H  n \" U 5      S	U -   R1                  S
5      _M      sn r\ V s0 s H  o S	U -   _M
     sn r\S0S j5       r\S1S j5       rS rS2S3S jjr S2       S4S jjrS5S jrS5S jrS6S jr S7S jr!S8S9S jjr"S:S;S jjr#S<S jr$S<S jr%S=S jr&S=S jr'\RP                  " SS9 " S S5      5       r)S r*S  r+S=S! jr,\RZ                  " S"5      r.S>S# jr/S?S$ jr0S@SAS% jjr1SBS& jr2SBS' jr3S( r4SBS) jr5S* q6 SC         SDS+ jjr7SSSSSSSSSSS,.
r8SES- jr9SFS. jr:SGS/ jr;gs  sn f s  sn f )Hé    )ÚannotationsN)ÚIteratorÚOptionalÚoverloadé   )Ú_)Úattr)ÚencodingÚerrorÚpycompats   ()[]{}?*+-|^$\.&~# 	
ó   \Úlatin1c                ó   • g ©N© ©Úpats    Ú</usr/lib/python3/dist-packages/mercurial/utils/stringutil.pyÚreescaper   .   ó   € àó    c                ó   • g r   r   r   s    r   r   r   3   r   r   c                ó´   • Sn[        U [        5      (       a  SnU R                  S5      n U R                  [        5      n U(       a  U $ U R                  S5      $ )z"Drop-in replacement for re.escape.TFr   )Ú
isinstanceÚbytesÚdecodeÚ	translateÚ_regexescapemapÚencode)r   Úwantunis     r   r   r   8   sN   € ð
 €GÜ�#”u×ÑØˆØ�j‰j˜Ó"ˆØ
�-‰-œÓ
(€CÞØˆ
Ø�:‰:�hÓÐr   Fc           	     ó4   • SR                  [        XX#S95      $ )zPretty print an object.r   ©ÚbprefixÚindentÚlevel)ÚjoinÚ	pprintgen)Úor#   r$   r%   s       r   Úpprintr)   G   s   € à�8‰8”I˜a¸ÑMÓNÐNr   c              #  óæ  #   • [        U [        5      (       a)  U(       a  S[        U 5      -  v •  gS[        U 5      -  v •  g[        U [        5      (       a  S[        [        U 5      5      -  v •  g[        U [        5      (       a›  U (       d  Sv •  gSv •  U(       a  US-  nSv •  S	X2-  -  v •  [        U 5       HE  u  pE[        XQX#S
9 Sh  v•N   US-   [        U 5      :  d  M+  U(       a  Sv •  S	X2-  -  v •  MA  Sv •  MG     U(       a  US-  nSv •  S	X2-  -  v •  Sv •  g[        U [        5      (       aË  U (       d  Sv •  gSv •  U(       a  US-  nSv •  S	X2-  -  v •  [        [        U R                  5       5      5       H^  u  nu  pg[        XaX#S
9 Sh  v•N   Sv •  [        XqX#S
9 Sh  v•N   US-   [        U 5      :  d  MD  U(       a  Sv •  S	X2-  -  v •  MZ  Sv •  M`     U(       a  US-  nSv •  S	X2-  -  v •  Sv •  g[        U [        5      (       a¤  U (       d  Sv •  gSv •  U(       a  US-  nSv •  S	X2-  -  v •  [        [        U 5      5       HE  u  pF[        XaX#S
9 Sh  v•N   US-   [        U 5      :  d  M+  U(       a  Sv •  S	X2-  -  v •  MA  Sv •  MG     U(       a  US-  nSv •  S	X2-  -  v •  Sv •  g[        U [        5      (       a›  U (       d  Sv •  gSv •  U(       a  US-  nSv •  S	X2-  -  v •  [        U 5       HE  u  pE[        XQX#S
9 Sh  v•N   US-   [        U 5      :  d  M+  U(       a  Sv •  S	X2-  -  v •  MA  Sv •  MG     U(       a  US-  nSv •  S	X2-  -  v •  Sv •  g[        U [        R                  5      (       a™   [        U 5      nSv •  U(       a  US-  nSv •  S	X2-  -  v •  Sn	U	(       dI  Un
 [        U 5      n[        X¡X#S
9 Sh  v•N   U	(       d  U(       a  Sv •  S	X2-  -  v •  OSv •  U	(       d  MI  U(       a  US-  nSv •  S	X2-  -  v •  Sv •  g["        R$                  " U 5      v •  g GNo GN¨ GN• GNß GN2! [          a    Sv •   gf = f! [          a    Sn	 N£f = f N™7f)av  Pretty print an object to a generator of atoms.

``bprefix`` is a flag influencing whether bytestrings are preferred with
a ``b''`` prefix.

``indent`` controls whether collections and nested data structures
span multiple lines via the indentation amount in spaces. By default,
no newlines are emitted.

``level`` specifies the initial indent level. Used if ``indent > 0``.
s   b'%s's   '%s's   bytearray['%s']s   []Nó   [é   ó   
ó    r"   s   ,
s   , ó   ]s   {}ó   {s   : ó   }s   set([])s   set([s   ])s   ()ó   (ó   )s   gen[]s   gen[FT)r   r   Ú	escapestrÚ	bytearrayÚlistÚ	enumerater'   ÚlenÚdictÚsortedÚitemsÚsetÚtupleÚtypesÚGeneratorTypeÚnextÚStopIterationr   Úbyterepr)r(   r#   r$   r%   ÚiÚaÚkÚvÚnextitemÚlastÚcurrents              r   r'   r'   L   sO  é € ô �!”U×ÑÞØœY q›\Ñ)Ó)àœI a›LÑ(Ó(Ü	�A”y×	!Ñ	!ð !¤9¬U°1«XÓ#6Ñ6Ó6Ü	�A”t×	Ñ	ÞØŠKØàŠ
æØ�Q‰JˆEØŠKØ˜%™.Ñ)Ò)ä˜a–L‰DˆAÜ  ¸FÑP×PÐPà�1‰u”s˜1“v�~ÞØ ’LØ %¡.Ñ1Ô1à”Kñ !ö Ø�Q‰JˆEØŠKØ˜%™.Ñ)Ò)à‹
Ü	�A”t×	Ñ	ÞØŠKØàŠ
æØ�Q‰JˆEØŠKØ˜%™.Ñ)Ò)ä"¤6¨!¯'©'«)Ó#4Ö5‰IˆA‰v�Ü  ¸FÑP×PÐPàŠKä  ¸FÑP×PÐPà�1‰u”s˜1“v�~ÞØ ’LØ %¡.Ñ1Ô1à”Kñ 6ö Ø�Q‰JˆEØŠKØ˜%™.Ñ)Ò)à‹
Ü	�A”s×	Ñ	ÞØÒØàŠæØ�Q‰JˆEØŠKØ˜%™.Ñ)Ò)äœf Q›iÖ(‰DˆAÜ  ¸FÑP×PÐPà�1‰u”s˜1“v�~ÞØ ’LØ %¡.Ñ1Ô1à”Kñ )ö Ø�Q‰JˆEØŠKØ˜%™.Ñ)Ò)à‹Ü	�A”u×	Ñ	ÞØŠKØàŠ
æØ�Q‰JˆEØŠKØ˜%™.Ñ)Ò)ä˜a–L‰DˆAÜ  ¸FÑP×PÐPà�1‰u”s˜1“v�~ÞØ ’LØ %¡.Ñ1Ô1à”Kñ !ö Ø�Q‰JˆEØŠKØ˜%™.Ñ)Ò)à‹
Ü	�A”u×*Ñ*×	+Ñ	+ð	Ü˜A“wˆHð
 ŠæØ�Q‰JˆEØŠKØ˜%™.Ñ)Ò)àˆæØˆGðÜ ›7�ô !Ø°ñ÷ ð ö ÞØ ’LØ %¡.Ñ1Ó1à’K÷# �$ö& Ø�Q‰JˆEØŠKØ˜%™.Ñ)Ò)à‹
ä×Ò Ó"Ó"òe Qò8 Qò Qò8 Qò8 Qøô& ó 	ØŠNÙð	ûô$ !ó Ø’ðúñùsÐ   ‚C	Q1ÃP:ÃQ1Ã$B1Q1ÆP=ÆQ1Æ+Q Æ,Q1ÇB Q1É$QÉ%Q1É=BQ1ÌQÌQ1Ì-AQ1Î	Q	 Î(Q1Î=Q ÏQ1ÏQ/Ï+Q1Ð8Q1Ð=Q1Ñ Q1ÑQ1ÑQ1Ñ	QÑQ1ÑQÑQ1ÑQ,Ñ)Q1Ñ+Q,Ñ,Q1c                ó2  • / n[         R                  " U 5      nS=p4U[        U5      :  aÖ  SnUR                  SUS-   5      nUS:  a  [        U5      nO;XdS-   :”  a3  UR	                  SUS-
  5      (       a  UR                  SUS-   US-
  5      nUS:  a  UnOUS-  nUR                  SSU5      UR                  SSU5      -
  nUS:¼  d   eUR                  XrX5 R                  5       45        XVpCU[        U5      :  a  MÖ  SR                  S	 U 5       5      $ )
z9Pretty print a representation of a possibly-nested objectr   éÿÿÿÿó   <r,   ó   =r.   ó   >r-   c              3  ó6   #   • U  H  u  pS U-  U-   v •  M     g7f)s     Nr   )Ú.0ÚlÚss      r   Ú	<genexpr>Úprettyrepr.<locals>.<genexpr>"  s   é € Ð6²©¨�e˜a‘i !–m²ùs   ‚)
r   rB   r8   ÚfindÚ
startswithÚrfindÚcountÚappendÚrstripr&   )r(   ÚlinesÚrsÚp0Úp1Úq0Úq1rQ   s           r   Ú
prettyreprra     s  € à€EÜ	×	Ò	˜1Ó	€BØ€K€BØ
Œs�2‹w‹,ð ˆØ�W‰W�T˜2 ™6Ó"ˆØ�‹6Ü�R“‰Bð �q‘&‹[˜RŸ]™]¨4°°a±×8Ñ8ð —‘˜$  Q¡¨¨Q©Ó/ˆBØ�‹6Ø‰Bà�!‰GˆBØ�H‰H�T˜1˜bÓ! B§H¡H¨T°1°bÓ$9Ñ9ˆØ�A‹vˆˆvØ�‰�a˜B˜×)Ñ)Ó+Ð,Ô-ØˆBð- Œs�2‹w�,ð. �:‰:Ñ6±Ó6Ó6Ð6r   c                ó  • U c  g[        U [        5      (       a.  U S   [        R                  " [        R                  U SS 5      -  $ [        U [
        5      (       a  U $ [        U 5      (       a  U " 5       $ [        U 5      $ )aN  Format an optional printable representation from unexpanded bits

========  =================================
type(r)   example
========  =================================
tuple     ('<not %r>', other)
bytes     '<branch closed>'
callable  lambda: '<branch %r>' % sorted(b)
object    other
========  =================================
Nr   r   r,   )r   r=   r   ÚrapplyÚmaybebytestrr   Úcallabler)   )Úrs    r   Ú	buildreprrg   %  sk   € ð 	�yØÜ	�A”u×	Ñ	Ø�‰t”h—o’o¤h×&;Ñ&;¸Q¸q¸r¸UÓCÑCÐCÜ	�A”u×	Ñ	ØˆÜ	�!�‰Ù‹sˆ
ä�a‹yÐr   c                ó0   • [        U =(       a    SU ;   5      $ )z&return true if a string is binary dataó    )Úbool©rR   s    r   Úbinaryrl   =  s   € ä�× �e˜q‘jÓ!Ð!r   c                ó~   • U R                  S5      (       a  SU SS  4$ U R                  S5      (       a  SU SS  4$ SU 4$ )Ns   re:ó   reé   s   literal:ó   literalé   )rV   )Úpatterns    r   Ú_splitpatternrs   B  sQ   € Ø×Ñ˜&×!Ñ!Ø�g˜a˜b�kÐ!Ð!Ø	×	Ñ	˜K×	(Ñ	(Ø˜7 1 2˜;Ð&Ð&Ø�wÐÐr   Tc                óÚ  ^• [        U 5      u  p US:X  a>   SnU(       d  [        R                  n[        R                  " X5      nX UR                  4$ US:X  a4  U(       a  U R                  nO[        R                  " U 5      mU4S jnX U4$ [        R                  " SU-  5      e! [        R                   a0  n[        R
                  " [        S5      [        U5      -  5      eSnAff = f)a1  
accepts a string, possibly starting with 're:' or 'literal:' prefix.
returns the matcher name, pattern, and matcher function.
missing or unknown prefixes are treated as literal matches.

helper for tests:
>>> def test(pattern, *tests):
...     kind, pattern, matcher = stringmatcher(pattern)
...     return (kind, pattern, [bool(matcher(t)) for t in tests])
>>> def itest(pattern, *tests):
...     kind, pattern, matcher = stringmatcher(pattern, casesensitive=False)
...     return (kind, pattern, [bool(matcher(t)) for t in tests])

exact matching (no prefix):
>>> test(b'abcdefg', b'abc', b'def', b'abcdefg')
('literal', 'abcdefg', [False, False, True])

regex matching ('re:' prefix)
>>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar')
('re', 'a.+b', [False, False, True])

force exact matches ('literal:' prefix)
>>> test(b'literal:re:foobar', b'foobar', b're:foobar')
('literal', 're:foobar', [False, True])

unknown prefixes are ignored and treated as literals
>>> test(b'foo:bar', b'foo', b'bar', b'foo:bar')
('literal', 'foo:bar', [False, False, True])

case insensitive regex matches
>>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar')
('re', 'A.+b', [False, False, True])

case insensitive literal matches
>>> itest(b'ABCDEFG', b'abc', b'def', b'abcdefg')
('literal', 'ABCDEFG', [False, False, True])
rn   r   ó   invalid regular expression: %sNrp   c                ó6   >• T[         R                  " U 5      :H  $ r   )r
   Úlower)rR   Úipats    €r   Ú<lambda>Ústringmatcher.<locals>.<lambda>�  s   ø€ ˜d¤h§n¢n°QÓ&7Ò7r   ó   unhandled pattern kind: %s)rs   ÚremodÚIÚcompiler   Ú
ParseErrorr   ÚforcebytestrÚsearchÚ__eq__r
   rw   ÚProgrammingError)rr   ÚcasesensitiveÚkindÚflagsÚregexÚeÚmatchrx   s          @r   ÚstringmatcherrŠ   J  sÒ   ø€ ôL " 'Ó*�M€DØˆuƒ}ð	ØˆEÞ ÜŸ™�Ü—M’M 'Ó1ˆEð
 ˜eŸl™lÐ*Ð*Ø	�Ó	ÞØ—N‘N‰Eä—>’> 'Ó*ˆDÜ7ˆEØ˜eÐ#Ð#ä
×
 Ò
 Ð!>ÀÑ!EÓ
FÐFøô �{‰{ó 	Ü×"Ò"ÜÐ3Ó4´|ÀA³ÑFóð ûð	ús   –/B& Â&C*Â:+C%Ã%C*c                óx  • [        U 5      u  p US:X  a   [        R                  " X5      $ US:X  a+  [        R                  " [        R                  " U 5      U5      $ [        R                  " SU-  5      e! [        R                   a0  n[        R                  " [        S5      [        U5      -  5      eSnAff = f)a0  Build a regexp object from a string pattern possibly starting with
're:' or 'literal:' prefix.

helper for tests:
>>> def test(pattern, *tests):
...     regexp = substringregexp(pattern)
...     return [bool(regexp.search(t)) for t in tests]
>>> def itest(pattern, *tests):
...     regexp = substringregexp(pattern, remod.I)
...     return [bool(regexp.search(t)) for t in tests]

substring matching (no prefix):
>>> test(b'bcde', b'abc', b'def', b'abcdefg')
[False, False, True]

substring pattern should be escaped:
>>> substringregexp(b'.bc').pattern
'\\.bc'
>>> test(b'.bc', b'abc', b'def', b'abcdefg')
[False, False, False]

regex matching ('re:' prefix)
>>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar')
[False, False, True]

force substring matches ('literal:' prefix)
>>> test(b'literal:re:foobar', b'foobar', b're:foobar')
[False, True]

case insensitive literal matches
>>> itest(b'BCDE', b'abc', b'def', b'abcdefg')
[False, False, True]

case insensitive regex matches
>>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar')
[False, False, True]
rn   ru   Nrp   r{   )	rs   r|   r~   r   r   r   r€   Úescaperƒ   )rr   r†   r…   rˆ   s       r   Úsubstringregexpr�   ‡  s¢   € ôL " 'Ó*�M€DØˆuƒ}ð	Ü—=’= Ó0Ð0ð
 
�Ó	Ü�}Š}œUŸ\š\¨'Ó2°EÓ:Ð:ä
×
 Ò
 Ð!>ÀÑ!EÓ
FÐFøô �{‰{ó 	Ü×"Ò"ÜÐ3Ó4´|ÀA³ÑFóð ûð	ús   •A5 Á5B9Â	+B4Â4B9c                óê   • U R                  S5      nUS:¼  a  U SU n U R                  S5      nUS:¼  a  XS-   S n U R                  S5      nUS:¼  a  U SU n U R                  S5      nUS:¼  a  U SU n U $ )z>Return a short representation of a user name or email address.ó   @r   NrL   r,   r.   ó   .©rU   ©ÚuserÚfs     r   Ú	shortuserr•   »  s…   € à�	‰	�$‹€AØˆAƒvØ�B�QˆxˆØ�	‰	�$‹€AØˆAƒvØ˜‘E�Gˆ}ˆØ�	‰	�$‹€AØˆAƒvØ�B�QˆxˆØ�	‰	�$‹€AØˆAƒvØ�B�QˆxˆØ€Kr   c                óz   • U R                  S5      nUS:¼  a  U SU n U R                  S5      nUS:¼  a  XS-   S n U $ )z,Return the user portion of an email address.r�   r   NrL   r,   r‘   r’   s     r   Ú	emailuserr—   Ì  sG   € à�	‰	�$‹€AØˆAƒvØ�B�QˆxˆØ�	‰	�$‹€AØˆAƒvØ˜‘E�Gˆ}ˆØ€Kr   c                ó`   • U R                  S5      nUS:X  a  SnX R                  S5      S-   U $ )zget email of author.rN   rK   NrL   r,   r‘   )Úauthorrf   s     r   Úemailrš   ×  s5   € à�‰�DÓ€AØˆBƒwØˆØ—+‘+˜dÓ# aÑ'¨!Ð,Ð,r   c                óÔ   • SU ;  a  U $ U R                  S5      nUS:w  a$  U SU R                  S5      R                  SS5      $ U R                  S5      nU SU R                  SS	5      $ )
a›  Returns the name before an email address,
interpreting it as per RFC 5322

>>> person(b'foo@bar')
'foo'
>>> person(b'Foo Bar <foo@bar>')
'Foo Bar'
>>> person(b'"Foo Bar" <foo@bar>')
'Foo Bar'
>>> person(b'"Foo "buz" Bar" <foo@bar>')
'Foo "buz" Bar'
>>> # The following are invalid, but do exist in real-life
...
>>> person(b'Foo "buz" Bar <foo@bar>')
'Foo "buz" Bar'
>>> person(b'"Foo Bar <foo@bar>')
'Foo Bar'
r�   rL   rK   Ns    "s   \"ó   "r�   r.   )rU   ÚstripÚreplace)r™   r”   s     r   ÚpersonrŸ   ß  sq   € ð& �6ÓØˆØ�‰�DÓ€AØˆBƒwØ�b�qˆz×Ñ Ó&×.Ñ.¨v°tÓ<Ð<Ø�‰�DÓ€AØ�"�1ˆ:×Ñ˜d DÓ)Ð)r   )Úhashc                  óZ   • \ rS rSrSr\R                  " 5       r\R                  " SS9rSr	g)Úmailmappingiû  z:Represents a username/email key or value in
a mailmap fileN)Údefaultr   )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r	   Úibrš   ÚnameÚ__static_attributes__r   r   r   r¢   r¢   û  s"   † ñð �GŠG‹I€EØ�7Š7˜4Ñ ƒDr   r¢   c                óV   • U(       + =(       d    U (       + =(       a    [        U5      S:  $ )a)  Returns True if the parsed names and emails
in a mailmap entry are invalid.

>>> # No names or emails fails
>>> names, emails = [], []
>>> _ismailmaplineinvalid(names, emails)
True
>>> # Only one email fails
>>> emails = [b'email@email.com']
>>> _ismailmaplineinvalid(names, emails)
True
>>> # One email and one name passes
>>> names = [b'Test Name']
>>> _ismailmaplineinvalid(names, emails)
False
>>> # No names but two emails passes
>>> names = []
>>> emails = [b'proper@email.com', b'commit@email.com']
>>> _ismailmaplineinvalid(names, emails)
False
r   )r8   )ÚnamesÚemailss     r   Ú_ismailmaplineinvalidr¯     s    € ð, Œ:×6˜Uœ×6¤s¨6£{°Q¡Ð6r   c                ó°  • 0 nU c  U$ U R                  5        GH9  nUR                  5       R                  S5      (       a  M*  / / pC/ nUR                  5        H¨  nUR                  S5      (       a    O‘UR                  S5      (       af  UR	                  S5      (       aP  UR                  USS 5        U(       a"  UR                  SR                  U5      5        / n[        U5      S:”  a    OM—  UR                  U5        Mª     [        X45      (       a  Mý  [        US   [        U5      S:X  a  US   OSS	9n[        US
   U(       a  US
   OSS	9X'   GM<     U$ )a$  Parses data in the .mailmap format

>>> mmdata = b"\n".join([
... b'# Comment',
... b'Name <commit1@email.xx>',
... b'<name@email.xx> <commit2@email.xx>',
... b'Name <proper@email.xx> <commit3@email.xx>',
... b'Name <proper@email.xx> Commit <commit4@email.xx>',
... ])
>>> mm = parsemailmap(mmdata)
>>> for key in sorted(mm.keys()):
...     print(key)
mailmapping(email='commit1@email.xx', name=None)
mailmapping(email='commit2@email.xx', name=None)
mailmapping(email='commit3@email.xx', name=None)
mailmapping(email='commit4@email.xx', name='Commit')
>>> for val in sorted(mm.values()):
...     print(val)
mailmapping(email='commit1@email.xx', name='Name')
mailmapping(email='name@email.xx', name=None)
mailmapping(email='proper@email.xx', name='Name')
mailmapping(email='proper@email.xx', name='Name')
Nó   #rL   rN   r,   rK   r.   r   )rš   rª   r   )
Ú
splitlinesÚlstriprV   ÚsplitÚendswithrY   r&   r8   r¯   r¢   )ÚmailmapcontentÚmailmapÚliner­   r®   ÚnamebuilderÚelementÚ
mailmapkeys           r   Úparsemailmapr¼     sJ  € ð0 €GàÑØˆà×)Ñ)×+ˆð �;‰;‹=×#Ñ# D×)Ñ)Ùð ˜BˆvØˆà—z‘z–|ˆGØ×!Ñ! $×'Ñ'áà×#Ñ# D×)Ñ)¨g×.>Ñ.>¸t×.DÑ.Dð —‘˜g a¨˜mÔ,æØ—L‘L §¡¨;Ó!7Ô8Ø"$�Kô �v“; “?Ùñ #ð
 ×"Ñ" 7Ö+ñ+ $ô4 ! ×/Ñ/Ùä Ø˜‘*Ü! %›j¨A›o��r’°4ñ
ˆ
ô
 *Ø˜‘)Þ"��q’¨ñ
ˆÔñ[ ,ðd €Nr   c                ó¤  • [        U5      (       a  U (       d  U$ [        [        U5      [        U5      S9n X   nSUR                  (       a  UR                  OUR                  UR                  (       a  UR                  4-  $ UR                  4-  $ ! [         a2    [        UR                  S9nU R                  U[        SS5      5      n N“f = f)aÞ  Returns the author field according to the mailmap cache, or
the original author field.

>>> mmdata = b"\n".join([
...     b'# Comment',
...     b'Name <commit1@email.xx>',
...     b'<name@email.xx> <commit2@email.xx>',
...     b'Name <proper@email.xx> <commit3@email.xx>',
...     b'Name <proper@email.xx> Commit <commit4@email.xx>',
... ])
>>> m = parsemailmap(mmdata)
>>> mapname(m, b'Commit <commit1@email.xx>')
'Name <commit1@email.xx>'
>>> mapname(m, b'Name <commit2@email.xx>')
'Name <name@email.xx>'
>>> mapname(m, b'Commit <commit3@email.xx>')
'Name <proper@email.xx>'
>>> mapname(m, b'Commit <commit4@email.xx>')
'Name <proper@email.xx>'
>>> mapname(m, b'Unknown Name <unknown@email.com>')
'Unknown Name <unknown@email.com>'
)rª   rš   )rš   Ns   %s <%s>)Úisauthorwellformedr¢   rŸ   rš   ÚKeyErrorÚgetrª   )r·   r™   ÚcommitÚproperÚcommit2s        r   ÚmapnamerÄ   o  sº   € ô2 ˜f×%Ñ%®WØˆô œf V›n´E¸&³MÑB€Fð?à‘ˆð Ø—{—{ˆ�Š¨¯©ØŸŸˆ�‰ðñ ð à*0¯,©,ðñ ð øô ó ?ô  F§L¡LÑ1ˆØ—‘˜W¤k°$¸Ó&=Ó>Šð	?ús   ·B Â9CÃCs   ^[^<]+\s<[^<>]+@[^<>]+>$c                ó0   • [         R                  U 5      SL$ )aæ  Return True if the author field is well formed
(ie "Contributor Name <contrib@email.dom>")

>>> isauthorwellformed(b'Good Author <good@author.com>')
True
>>> isauthorwellformed(b'Author <good@author.com>')
True
>>> isauthorwellformed(b'Bad Author')
False
>>> isauthorwellformed(b'Bad Author <author@author.com')
False
>>> isauthorwellformed(b'Bad Author author@author.com')
False
>>> isauthorwellformed(b'<author@author.com>')
False
>>> isauthorwellformed(b'Bad Author <author>')
False
N)Ú_correctauthorformatr‰   )r™   s    r   r¾   r¾   ¢  s   € ô&  ×%Ñ% fÓ-°TÐ9Ð9r   c                ó‚   • U R                  S5      nUS:w  a  U SU n  U R                  5       S   $ ! [         a     gf = f)z"Return the first line of the inputr-   rK   Nr   r   )rU   r²   Ú
IndexError)ÚtextrC   s     r   Ú	firstlinerÊ   ¸  sM   € ð 	�	‰	�%Ó€AØˆBƒwØ�B�QˆxˆðØ�‰Ó  Ñ#Ð#øÜó Ùðús   ž1 ±
>½>c                ó,   • [         R                  " XSS9$ )zCTrim string to at most maxlength (default: 400) columns in display.s   ...)Úellipsis)r
   Útrim)rÉ   Ú	maxlengths     r   rÌ   rÌ   Ä  s   € ä�=Š=˜°6Ñ:Ð:r   c                ó€   • [        U [        [        45      (       a  [        U 5      n [        R
                  " U 5      S   $ ©Nr   )r   Ú
memoryviewr5   r   ÚcodecsÚescape_encoderk   s    r   r4   r4   É  s5   € ä�!”j¤)Ð,×-Ñ-Ü�!‹Hˆô ×Ò Ó" 1Ñ%Ð%r   c                ó4   • [         R                  " U 5      S   $ rÐ   )rÒ   Úescape_decoderk   s    r   ÚunescapestrrÖ   Ô  s   € ä×Ò Ó" 1Ñ%Ð%r   c                ó¶   •  [         R                  " U 5      $ ! [         a6    [         R                  " [        R                  " [        U 5      5      5      s $ f = f)zHPortably format an arbitrary object (e.g. exception) into a byte
string.)r   ÚbytestrÚUnicodeEncodeErrorr
   Ú
strtolocalÚstr)Úobjs    r   r€   r€   Ú  sG   € ð?Ü×Ò Ó$Ð$øÜó ?ä×Ò¤× 3Ò 3´C¸³HÓ =Ó>Ò>ð?ús   ‚ ˜=AÁAc                óv   • [         R                  " [         R                  " U 5      5      R                  SS5      $ )Ns   \\r   )r   rB   rØ   rž   rk   s    r   ÚuireprrÞ   ä  s+   € ä×ÒœX×-Ò-¨aÓ0Ó1×9Ñ9¸'À5ÓIÐIr   c                 óH   •  " S S[         R                  5      nUqU" S0 U D6$ )Nc                  ó*   • \ rS rSrSrS rS rS rSrg)Ú_MBTextWrapper.<locals>.twië  að  
Extend TextWrapper for width-awareness.

Neither number of 'bytes' in any encoding nor 'characters' is
appropriate to calculate terminal columns for specified string.

Original TextWrapper implementation uses built-in 'len()' directly,
so overriding is needed to use width information of each characters.

In addition, characters classified into 'ambiguous' width are
treated as wide in East Asian area, but as narrow in other.

This requires use decision to determine width of such characters.
c                óœ   • Sn[         R                  n[        [        U5      5       H  nX4" X   5      -  nX#:  d  M  US U XS  4s  $    US4$ )Nr   r   )r
   Ú	ucolwidthÚranger8   )ÚselfÚucstrÚ
space_leftrQ   ÚcolwidthrC   s         r   Ú_cutdownÚ#_MBTextWrapper.<locals>.tw._cutdownû  s\   € ØˆAÜ×)Ñ)ˆHÜœ3˜u›:Ö&�Ø�X˜e™hÓ'Ñ'�Ø•>Ø! " 1˜I u¨R yÐ1Ò1ñ 'ð ˜#�:Ðr   c                óê   • [        XC-
  S5      nU R                  (       a-  U R                  US   U5      u  pgUR                  U5        XqS'   g U(       d   UR                  UR	                  5       5        g g )Nr,   rK   )ÚmaxÚbreak_long_wordsré   rY   Úpop)rå   Úreversed_chunksÚcur_lineÚcur_lenÚwidthrç   ÚcutÚress           r   Ú_handle_long_wordÚ,_MBTextWrapper.<locals>.tw._handle_long_word  sa   € Ü˜U™_¨aÓ0ˆJà×$×$ØŸ=™=¨¸Ñ)<¸jÓI‘�Ø—‘ Ô$Ø&) Ò#ÞØ—‘ × 3Ñ 3Ó 5Õ6ð r   c                ó2  • [         R                  n/ nU R                  S::  a  [        SU R                  -  5      eUR	                  5         U(       GaD  / nSnU(       a  U R
                  nOU R                  nU R                  [        U5      -
  nU R                  (       a!  US   R                  5       S:X  a
  U(       a  US	 U(       aA  U" US   5      nXX-   U::  a$  UR                  UR                  5       5        XX-  nOO	U(       a  MA  U(       a!  U" US   5      U:”  a  U R                  XXW5        U R                  (       a!  U(       a  US   R                  5       S:X  a  US	 U(       a#  UR                  USR                  U5      -   5        U(       a  GMD  U$ )Nr   s   invalid width %r (must be > 0)rK   Ú )r
   rã   rò   Ú
ValueErrorÚreverseÚsubsequent_indentÚinitial_indentr8   Údrop_whitespacer�   rY   rî   rõ   r&   )	rå   Úchunksrè   r[   rð   rñ   r$   rò   rQ   s	            r   Ú_wrap_chunksÚ'_MBTextWrapper.<locals>.tw._wrap_chunks  sd  € Ü×)Ñ)ˆHàˆEØ�z‰z˜Q‹Ü Ð!BÀTÇZÁZÑ!OÓPÐPð �N‰NÔçð �Ø�ö Ø!×3Ñ3‘Fà!×0Ñ0�Fð Ÿ
™
¤S¨£[Ñ0�ð ×'×'¨F°2©J×,<Ñ,<Ó,>À"Ó,DÎØ˜r˜
æÙ  ¨¡Ó,�Að ‘{ eÓ+Ø Ÿ™¨¯
©
«Ô5Ø™™ð ÷ �fö ™h v¨b¡zÓ2°UÓ:Ø×*Ñ*¨6¸WÔLð ×(×(Þ Ø  ™×*Ñ*Ó,°Ó3à  ˜ö Ø—L‘L ¨"¯'©'°(Ó*;Ñ!;Ô<÷a ‘&ðd ˆLr   r   N)	r¤   r¥   r¦   r§   r¨   ré   rõ   rÿ   r«   r   r   r   Útwrá   ë  s   † ñ	ò	ò	7õ=	r   r  r   )ÚtextwrapÚTextWrapperÚ_MBTextWrapper)Úkwargsr  s     r   r  r  ê  s*   € ôcŒX×!Ñ!ô cðL €NÙ‰<�‰<Ðr   c                ó  • [        [        U5      [        U5      5      nX::  a  [        SUS-   5      nU R                  [        R                  " [
        R
                  5      [        R                  " [
        R                  5      5      n UR                  [        R                  " [
        R
                  5      [        R                  " [
        R                  5      5      nUR                  [        R                  " [
        R
                  5      [        R                  " [
        R                  5      5      n[        XUS9nUR                  U 5      R                  [        R                  " [
        R
                  5      5      $ )NéN   r,   )rò   rü   rû   )
rì   r8   r   r   Úsysstrr
   Úencodingmoder  Úfillr   )r¸   rò   Ú
initindentÚ
hangindentÚ	maxindentÚwrappers         r   Úwrapr  U  s  € ô ”C˜
“O¤S¨£_Ó5€IØÓä�B˜	 A™Ó&ˆØ�;‰;Ü�Šœ×)Ñ)Ó*Ü�Šœ×-Ñ-Ó.ó€Dð ×"Ñ"Ü�Šœ×)Ñ)Ó*Ü�Šœ×-Ñ-Ó.ó€Jð ×"Ñ"Ü�Šœ×)Ñ)Ó*Ü�Šœ×-Ñ-Ó.ó€Jô ØÀ*ñ€Gð �<‰<˜Ó×$Ñ$¤X§_¢_´X×5FÑ5FÓ%GÓHÐHr   )
ó   1s   yess   trues   ons   alwaysó   0s   nos   falses   offs   neverc                óJ   • [         R                  U R                  5       S5      $ )zDParse s into a boolean.

If s is not a valid boolean, returns None.
N)Ú	_booleansrÀ   rw   rk   s    r   Ú	parseboolr  |  s   € ô
 �=‰=˜Ÿ™› DÓ)Ð)r   c                óª   ^^^• UU4S jmUU4S jmU4S jmU b-  [        U [        5      (       a  T" U R                  S5      5      nOU nU=(       d    / $ )z”parse a configuration value as a list of comma/space separated strings

>>> parselist(b'this,is "a small" ,test')
['this', 'is', 'a small', 'test']
c                ó  >• SnU[        U5      :  ad  XUS-    R                  5       (       d  XUS-    S:X  a?  SnUS-  nU[        U5      :  a)  XUS-    R                  5       (       a  M2  XUS-    S:X  a  M?  U[        U5      :¼  a  S X4$ U(       a  U R                  S5        XUS-    S:X  a  U S   (       d  TXS-   4$ XUS-    S:X  a&  U S   SS  S:X  a  U S   S S XUS-    -   U S'   TXS-   4$ U S==   XUS-    -  ss'   TXS-   4$ )	NFr,   ó   ,Tr   rœ   rK   r   )r8   ÚisspacerY   )ÚpartsrR   ÚoffsetÚ
whitespaceÚ_parse_plainÚ_parse_quotes       €€r   r  Úparselist.<locals>._parse_plainŒ  sD  ø€ Øˆ
Ø”s˜1“v‹oØ�v ‘zÐ"×*Ñ*×,Ñ,°¸6ÀA¹:Ð0FÈ$Ó0NàˆJØ�a‰KˆFð	 ”s˜1“v‹oØ�v ‘zÐ"×*Ñ*×,Ó,°¸6ÀA¹:Ð0FÈ$Õ0Nð ”S˜“VÓØ˜Ð&Ð&ÞØ�L‰L˜ÔØ�f˜q‘jÐ! TÓ)°%¸·)Ø °©
Ð2Ð2Ø˜ ™
Ð# tÓ+°°b±	¸"¸#°À%Ó0GØ˜b™	 # 2˜¨°F¸Q±JÐ)?Ñ?ˆE�"‰IØ °©
Ð2Ð2Øˆb‹	�Q ¨¡
Ð+Ñ+‹	Ø˜U¨Q¡JÐ.Ð.r   c                ó.  >• U[        U5      :  a–  XUS-    S:X  a‹  U R                  S5        US-  nU[        U5      :  ab  XUS-    R                  5       (       d  XUS-    S:X  a=  US-  nU[        U5      :  a)  XUS-    R                  5       (       a  M0  XUS-    S:X  a  M=  TX4$ U[        U5      :  a|  XUS-    S:w  aq  XUS-    S:X  a3  US-   [        U5      :  a!  XS-   US-    S:X  a  US-  nU S==   S-  ss'   OU S==   XUS-    -  ss'   US-  nU[        U5      :  a  XUS-    S:w  a  Mq  U[        U5      :¼  a=  T" U S   5      nU(       d  SU S'   O!SUS   -   US'   U S S n U R                  U5        S X4$ US-  nU[        U5      :  a,  XUS-    S	;   a!  US-  nU[        U5      :  a  XUS-    S	;   a  M!  U[        U5      :  aB  US-   [        U5      :X  a  XUS-    S:X  a  U S==   S-  ss'   US-  nOU R                  S5        OS X4$ TX4$ )
Nr,   rœ   r   r  r   r   rK   r   )r.   r  )r8   rY   r  Úextend)r  rR   r  Ú
real_partsÚ_configlistr  s       €€r   r  Úparselist.<locals>._parse_quoteŸ  sd  ø€ Ø”C˜“F‹?˜q¨&°1©*Ð5¸Ó=Ø�L‰L˜ÔØ�a‰KˆFØœ3˜q›6“/Ø˜6 A™:Ð&×.Ñ.×0Ñ0Ø˜f q™jÐ)¨TÓ1à˜!‘�ð	 œ3˜q›6“/Ø˜6 A™:Ð&×.Ñ.×0Ó0Ø˜f q™jÐ)¨TÕ1ð   Ð.Ð.à”s˜1“v‹o !¨V°a©ZÐ"8¸DÓ"@à˜6 A™:Ð&¨%Ó/Ø˜Q‘J¤ Q£Ó'Ø˜q‘j 6¨A¡:Ð.°$Ó6à˜!‘�Ø�b“	˜TÑ!”	à�b“	˜Q¨°©
Ð3Ñ3“	Ø�a‰KˆFð ”s˜1“v‹o !¨V°a©ZÐ"8¸DÕ"@ð ”S˜“VÓÙ$ U¨2¡YÓ/ˆJÞØ ��b’	à $ z°!¡}Ñ 4�
˜1‘Ø˜c˜r˜
�Ø—‘˜ZÔ(Ø˜Ð&Ð&à�!‰ˆØ”s˜1“v‹o !¨V°a©ZÐ"8¸LÓ"HØ�a‰KˆFð ”s˜1“v‹o !¨V°a©ZÐ"8¸LÕ"Hð ”C˜“F‹?Ø˜‰zœS ›VÓ#¨°6¸A±:Ð(>À$Ó(FØ�b“	˜TÑ!“	Ø˜!‘‘à—‘˜SÕ!à˜Ð&Ð&à˜UÐ*Ð*r   c                ó€   >• U R                  S5      n U (       d  / $ TS/Sp2nU(       a  U" X U5      u  pnU(       a  M  U$ )Ns    ,r   r   )rZ   )rR   Úparserr  r  r  s       €r   r"  Úparselist.<locals>._configlistÏ  sE   ø€ Ø�H‰H�U‹OˆÞØˆIØ ,¨s¨e°Q�vˆÞÙ$*¨5°VÓ$<Ñ!ˆF˜6÷ ˆfàˆr   s    ,
)r   r   r³   )ÚvalueÚresultr"  r  r  s     @@@r   Ú	parselistr)  …  sI   ú€ ö/ö&.+õ`ð ÑœZ¨¬u×5Ñ5Ù˜UŸ\™\¨'Ó2Ó3‰àˆØ�<�RÐr   c                óL   • [         R                  " U R                  S5      5      $ )z8Evaluate a string containing a Python literal expressionr   )ÚastÚliteral_evalr   rk   s    r   Úevalpythonliteralr-  ß  s   € ô ×Ò˜AŸH™H XÓ.Ó/Ð/r   )r   r   Úreturnr   )r   rÛ   r.  rÛ   )Fr   r   )r#   rj   r$   Úintr%   r/  r.  r   )r#   rj   r$   r/  r%   r/  r.  zIterator[bytes])r.  r   )rR   r   r.  rj   )rr   r   )T)rr   r   r„   rj   )r   )rr   r   r†   r/  )r“   r   r.  r   )r™   r   r.  r   )r™   r   r.  rj   )rÉ   r   r.  r   )i�  )rÉ   r   rÎ   r/  r.  r   )rR   r   r.  r   )r   r   )
r¸   r   rò   r/  r  r   r  r   r.  r   )rR   r   r.  zOptional[bool])r'  zOptional[bytes])rR   r   )<Ú
__future__r   r+  rÒ   Úrer|   r  r>   Útypingr   r   r   Úi18nr   Ú
thirdpartyr	   ÚTYPE_CHECKINGrø   r
   r   r   rØ   Ú
_respecialÚordr   r   Úregexbytesescapemapr   r)   r'   ra   rg   rl   rs   rŠ   r�   r•   r—   rš   rŸ   rR   r¢   r¯   r¼   rÄ   r~   rÆ   r¾   rÊ   rÌ   r4   rÖ   r€   rÞ   r  r  r  r  r)  r-  )rC   s   0r   Ú<module>r9     s&  ðõ #ã 
Û Û Û Û Û ÷ñ õ Ý ð 
××ã÷ñ ð ×ÒÐ?Ó@€
ÙAKÓLÂ¸A‘3�q“6˜E A™I×-Ñ-¨hÓ7Ò7ÁÑL€Ù/9Ó:ªz¨!˜5 1™9’}©zÑ:Ð ð 
óó 
ðð 
óó 
ðò öOð =>ðw#Øðw#Ø&)ðw#Ø69ðw#àõw#ôt7ô>ô0"ô
ö:Göz1Gôhô"ô-ô*ð8 ‡‚ˆTÑ÷!ð !ó ð!ò7ò2Oôd-ð` —}’}Ð%AÓBÐ ô:ô,	ö;ô
&ô&ò?ôJòhðX KNðIØ
ðIØðIØ).ðIØBGðIà
õIð4 ØØØØØ
ØØØØñ€	ô*ôWõt0ùòk MùÚ:s   Á*%FÂF