+
    *:žgª“  ã                  óú  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIHtHt ^ RI	H	t	 ^ RI
Ht ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHtH t H!t!H"t" ]'       d,   ^ RI#H$t$ ]%]&]%R3,          ,          ]']%,          ,          t(R])R&   . R$Ot*R%R lt+]PX                  ! R]PZ                  4      t.R R lt/R R lt0 ! R R4      t1 ! R R]24      t3Rt4R R  lt5R&R! R" llt6 ! R# R4      t7R# )'z±
babel.messages.catalog
~~~~~~~~~~~~~~~~~~~~~~

Data structures for message catalogs.

:copyright: (c) 2013-2025 by the Babel Team.
:license: BSD, see LICENSE for more details.
)ÚannotationsN)ÚIterableÚIterator)Úcopy)ÚSequenceMatcher)Úmessage_from_string)Únlargest)Ú	Formatter)ÚTYPE_CHECKING)Ú__version__)ÚLocaleÚUnknownLocaleError)Úformat_datetime)Ú
get_plural)ÚLOCALTZÚFixedOffsetTimezoneÚ_cmpÚdistinct)Ú	TypeAlias.r   Ú
_MessageIDÚCatalogÚMessageÚTranslationErrorc                óú  € V^ 8”  g   \        RV: 24      hRTu;8:  d   R8:  g   M \        RV: 24      h. p\        RR7      pVP                  V 4       V Fz  pVP                  V4       VP	                  4       V8¼  g   K+  VP                  4       V8¼  g   KB  VP                  4       V8¼  g   KY  VP                  VP                  4       V34       K|  	  \        W$4      pV UUu. uF  w  rvVNK	  	  upp# u uppi )z³A modified version of ``difflib.get_close_matches``.

It just passes ``autojunk=False`` to the ``SequenceMatcher``, to work
around https://github.com/python/cpython/issues/90825.
zn must be > 0: g        g      ð?zcutoff must be in [0.0, 1.0]: F)Úautojunk)	Ú
ValueErrorr   Úset_seq2Úset_seq1Úreal_quick_ratioÚquick_ratioÚratioÚappendr   )ÚwordÚpossibilitiesÚnÚcutoffÚresultÚsÚxÚscores   &&&&    Ú8/usr/lib/python3/dist-packages/babel/messages/catalog.pyÚget_close_matchesr+   *   sÖ   € ð ˆqŒ5Ü˜?¨1©%Ð0Ó1Ð1Ø�&Ö˜CÖÜÐ9¸&¹ÐDÓEÐEØ€FÜ Ô'€AØ‡J�JˆtÔÛˆØ	�
‰
�1ŒØ×ÑÓ 6Ö)Ø�=‰=‹?˜fÖ$Ø�7‰7‹9˜ÖØ�M‰M˜1Ÿ7™7›9 a˜.Ö)ñ ô �aÓ €Fá$Ô%™f‘(�%‹A™fÒ%Ð%ùÓ%s   Ã&C7z¨
    \%
        (?:\(([\w]*)\))?
        (
            [-#0\ +]?(?:\*|[\d]+)?
            (?:\.(?:\*|[\d]+))?
            [hlL]?
        )
        ([diouxXeEfFgGcrs%])
c               ó    € V ^8„  d   QhRRRR/# )é   ÚstringÚstrÚreturnÚbool© )Úformats   "r*   Ú__annotate__r4   P   s   € ÷ ñ  Sð ¨Tñ ó    c                ó¤   € R V 9  d   R# \        4       p RpVP                  V 4       F  pV^,          f   K  RpK  	  V#   \         d     R# i ; i)Ú{FT)r	   Úparser   )r.   ÚfmtÚfield_name_seenÚts   &   r*   Ú_has_python_brace_formatr<   P   s^   € Ø
�&ÔÙÜ
‹+€Cðð  ˆØ—‘˜6Ö"ˆAØ��tÔØ"&’ñ #ð Ðøô ô Úðús   •A  ¸A  Á AÁAc               ó    € V ^8„  d   QhRRRR/# )r-   Úvaluer/   r0   zdatetime.datetimer2   )r3   s   "r*   r4   r4   c   s   € ÷ ñ  #ð Ð*;ñ r5   c                ó´  € \         P                  ! R V 4      p\        P                  P                  VP	                  R4      R4      pVP	                  R4      pVe}   V^ ,          VR,          rTVR,          VR,          rv\        V R24      p\        V4      p	\        V4      p
V	^<,          pWº,          pW¸,          p\        V4      pVP                  VR7      pV# )	z+^(?P<datetime>.*?)(?P<tzoffset>[+-]\d{4})?$Údatetimez%Y-%m-%d %H:%MÚtzoffset:é   NN:Nr-   N:r-   NNÚ1©Útzinfo)ÚreÚmatchr@   ÚstrptimeÚgroupÚintr   Úreplace)r>   rG   ÚdtrA   Úplus_minus_sÚrestÚhours_offset_sÚmins_offset_sÚ
plus_minusÚhours_offsetÚmins_offsetÚnet_mins_offsets   &           r*   Ú_parse_datetime_headerrU   c   sÏ   € Ü�HŠHÐCÀUÓK€Eä	×	Ñ	×	#Ñ	# E§K¡K°
Ó$;Ð=MÓ	N€Bð �{‰{˜:Ó&€HØÒØ% a�[¨(°2­,�dØ(,¨R­°$°rµ(˜ô ˜L˜>¨Ð+Ó,ˆ
Ü˜>Ó*ˆÜ˜-Ó(ˆð '¨Õ+ˆØÕ&ˆØÕ%ˆô ' Ó7ˆð �Z‰Z˜xˆZÓ(ˆà€Ir5   c                  ó
  € ] tR t^�tRtR$R R l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 R ltR%R R llt]R R l4       t]R R l4       t]R R  l4       t]R! R" l4       tR#tR# )&r   z0Representation of a single message in a catalog.Nc               ó@   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRR/
# )r-   Úidr   r.   ú_MessageID | NoneÚ	locationsúIterable[tuple[str, int]]ÚflagsúIterable[str]Úauto_commentsÚuser_commentsÚprevious_idÚlinenoú
int | NoneÚcontextú
str | Noner0   ÚNoner2   )r3   s   "r*   r4   ÚMessage.__annotate__„   sn   € ÷ 1ñ 1àð1ð "ð1ð -ð	1ð
 ð1ð %ð1ð %ð1ð  ð1ð ð1ð ð1ð 
ñ1r5   c
                óÆ  € Wn         V'       g   V P                  '       d   RpW n        \        \	        V4      4      V n        \        V4      V n        V'       d/   V P                  '       d   V P                  P                  R4       MV P                  P                  R4       V'       d/   V P                  '       d   V P                  P                  R4       MV P                  P                  R4       \        \	        V4      4      V n        \        \	        V4      4      V n        \        V\        4      '       d
   V.V n        M\        V4      V n        W€n        W�n        R# )aï  Create the message object.

:param id: the message ID, or a ``(singular, plural)`` tuple for
           pluralizable messages
:param string: the translated message string, or a
               ``(singular, plural)`` tuple for pluralizable messages
:param locations: a sequence of ``(filename, lineno)`` tuples
:param flags: a set or sequence of flags
:param auto_comments: a sequence of automatic comments for the message
:param user_comments: a sequence of user comments for the message
:param previous_id: the previous message ID, or a ``(singular, plural)``
                    tuple for pluralizable messages
:param lineno: the line number on which the msgid line was found in the
               PO file, if any
:param context: the message context
zpython-formatzpython-brace-formatN)Ú rh   )rX   Úpluralizabler.   Úlistr   rZ   Úsetr\   Úpython_formatÚaddÚdiscardÚpython_brace_formatr^   r_   Ú
isinstancer/   r`   ra   rc   )
ÚselfrX   r.   rZ   r\   r^   r_   r`   ra   rc   s
   &&&&&&&&&&r*   Ú__init__ÚMessage.__init__„   sñ   € ð8 Œß˜$×+×+Ð+ØˆFØŒÜœh yÓ1Ó2ˆŒÜ˜“ZˆŒ
ß�$×$×$Ð$Ø�J‰J�N‰N˜?Õ+à�J‰J×Ñ˜Ô/ß�$×*×*Ð*Ø�J‰J�N‰NÐ0Õ1à�J‰J×ÑÐ4Ô5Ü!¤(¨=Ó"9Ó:ˆÔÜ!¤(¨=Ó"9Ó:ˆÔÜ�k¤3×'Ò'Ø +˜}ˆDÕä# KÓ0ˆDÔØŒØŽr5   c               ó   € V ^8„  d   QhRR/# ©r-   r0   r/   r2   )r3   s   "r*   r4   rf   ·   s   € ÷ Tñ T˜#ñ Tr5   c                	ó~   € R \        V 4      P                   RV P                  : R\        V P                  4      : R2# )Ú<Ú z	 (flags: z)>)ÚtypeÚ__name__rX   rj   r\   ©rq   s   &r*   Ú__repr__ÚMessage.__repr__·   s7   € Ø”4˜“:×&Ñ&Ð' q¨¯©©°9¼TÀ$Ç*Á*Ó=MÑ<PÐPRÐSÐSr5   c               ó    € V ^8„  d   QhRRRR/# )r-   ÚotherÚobjectr0   rJ   r2   )r3   s   "r*   r4   rf   º   s   € ÷ Gñ G˜Vð G¨ñ Gr5   c                ó8   € R p\        V! V 4      V! V4      4      # )z0Compare Messages, taking into account plural idsc                óè   € \        V \        4      '       d<   V P                  '       d*   V P                  ^ ,          V P                  ;'       g    R3# V P                  V P                  ;'       g    R3# )é    rh   )rp   r   ri   rX   rc   )Úobjs   &r*   Úvalues_to_compareÚ*Message.__cmp__.<locals>.values_to_compare¼   sT   € Ü˜#œw×'Ò'¨C×,<×,<Ð,<Ø—v‘v˜a•y #§+¡+×"3Ð"3°Ð3Ð3Ø—6‘6˜3Ÿ;™;×,Ð,¨"Ð,Ð,r5   )r   )rq   r   r…   s   && r*   Ú__cmp__ÚMessage.__cmp__º   s"   € ò	-ô Ñ% dÓ+Ñ->¸uÓ-EÓFÐFr5   c               ó    € V ^8„  d   QhRRRR/# ©r-   r   r€   r0   r1   r2   )r3   s   "r*   r4   rf   Â   ó   € ÷ 'ñ '˜Fð ' tñ 'r5   c                	ó*   € V P                  V4      ^ 8„  # ©rƒ   ©r‡   ©rq   r   s   &&r*   Ú__gt__ÚMessage.__gt__Â   ó   € Ø�|‰|˜EÓ" QÑ&Ð&r5   c               ó    € V ^8„  d   QhRRRR/# rŠ   r2   )r3   s   "r*   r4   rf   Å   r‹   r5   c                	ó*   € V P                  V4      ^ 8  # r�   rŽ   r�   s   &&r*   Ú__lt__ÚMessage.__lt__Å   r’   r5   c               ó    € V ^8„  d   QhRRRR/# rŠ   r2   )r3   s   "r*   r4   rf   È   ó   € ÷ (ñ (˜Fð ( tñ (r5   c                	ó*   € V P                  V4      ^ 8¬  # r�   rŽ   r�   s   &&r*   Ú__ge__ÚMessage.__ge__È   ó   € Ø�|‰|˜EÓ" aÑ'Ð'r5   c               ó    € V ^8„  d   QhRRRR/# rŠ   r2   )r3   s   "r*   r4   rf   Ë   r˜   r5   c                	ó*   € V P                  V4      ^ 8*  # r�   rŽ   r�   s   &&r*   Ú__le__ÚMessage.__le__Ë   rœ   r5   c               ó    € V ^8„  d   QhRRRR/# rŠ   r2   )r3   s   "r*   r4   rf   Î   r˜   r5   c                	ó*   € V P                  V4      ^ 8H  # r�   rŽ   r�   s   &&r*   Ú__eq__ÚMessage.__eq__Î   rœ   r5   c               ó    € V ^8„  d   QhRRRR/# rŠ   r2   )r3   s   "r*   r4   rf   Ñ   r˜   r5   c                	ó*   € V P                  V4      ^ 8g  # r�   rŽ   r�   s   &&r*   Ú__ne__ÚMessage.__ne__Ñ   rœ   r5   c               ó    € V ^8„  d   QhRRRR/# )r-   r   r   r0   r1   r2   )r3   s   "r*   r4   rf   Ô   s   € ÷ /ñ / 'ð /¨dñ /r5   c                ód   € \        V\        4      '       g   Q hV P                  VP                  8H  # )zKChecks whether messages are identical, taking into account all
properties.
)rp   r   Ú__dict__r�   s   &&r*   Úis_identicalÚMessage.is_identicalÔ   s*   € ô ˜%¤×)Ò)Ð)Ð)Ø�}‰} §¡Ñ.Ð.r5   c               ó   € V ^8„  d   QhRR/# )r-   r0   r   r2   )r3   s   "r*   r4   rf   Û   s   € ÷ @ñ @�wñ @r5   c                	óö   € \        \        \        V P                  V P                  V P
                  V P                  V P                  V P                  V P                  V P                  V P                  3	4      !  # ©N)r   Úmapr   rX   r.   rZ   r\   r^   r_   r`   ra   rc   r{   s   &r*   ÚcloneÚMessage.cloneÛ   s^   € ÜœœD 4§7¡7¨D¯K©K¸¿¹Ø#'§:¡:¨t×/AÑ/AØ#'×#5Ñ#5°t×7GÑ7GØ#'§;¡;°·±ð#>ó ?ñ @ð 	@r5   c               ó    € V ^8„  d   QhRRRR/# )r-   ÚcatalogzCatalog | Noner0   zlist[TranslationError]r2   )r3   s   "r*   r4   rf   á   s   € ÷ ñ ˜^ð Ð7Mñ r5   c                óŽ   € ^ RI Hp . pV F  p V! W4       K  	  V#   \         d   pTP                  T4        Rp?K4  Rp?ii ; i)a]  Run various validation checks on the message.  Some validations
are only performed if the catalog is provided.  This method returns
a sequence of `TranslationError` objects.

:rtype: ``iterator``
:param catalog: A catalog instance that is passed to the checkers
:see: `Catalog.check` for a way to perform checks for all messages
      in a catalog.
)ÚcheckersN)Úbabel.messages.checkersr·   r   r!   )rq   rµ   r·   ÚerrorsÚcheckerÚes   &&    r*   ÚcheckÚMessage.checká   sK   € õ 	5Ø)+ˆÛˆGð!Ù˜Ö&ñ  ð
 ˆøô $ô !Ø—‘˜a× Ò ûð!ús   ��A¨?¿Ac               ó   € V ^8„  d   QhRR/# ©r-   r0   r1   r2   )r3   s   "r*   r4   rf   õ   s   € ÷ %ñ %�tñ %r5   c                ó    € RV P                   9   # )zÀWhether the translation is fuzzy.

>>> Message('foo').fuzzy
False
>>> msg = Message('foo', 'foo', flags=['fuzzy'])
>>> msg.fuzzy
True
>>> msg
<Message 'foo' (flags: ['fuzzy'])>

:type:  `bool`Úfuzzy©r\   r{   s   &r*   rÁ   ÚMessage.fuzzyô   s   € ð ˜$Ÿ*™*Ñ$Ð$r5   c               ó   € V ^8„  d   QhRR/# r¿   r2   )r3   s   "r*   r4   rf     s   € ÷ 	2ñ 	2˜dñ 	2r5   c                óB   € \        V P                  \        \        34      # )z‡Whether the message is plurizable.

>>> Message('foo').pluralizable
False
>>> Message(('foo', 'bar')).pluralizable
True

:type:  `bool`)rp   rX   rj   Útupler{   s   &r*   ri   ÚMessage.pluralizable  s   € ô ˜$Ÿ'™'¤D¬% =Ó1Ð1r5   c               ó   € V ^8„  d   QhRR/# r¿   r2   )r3   s   "r*   r4   rf     s   € ÷ ;ñ ;˜tñ ;r5   c                óÀ   € V P                   p\        V\        \        34      '       g   V.p\        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # )zºWhether the message contains Python-style parameters.

>>> Message('foo %(name)s bar').python_format
True
>>> Message(('foo %(name)s', 'foo %(name)s')).python_format
True

:type:  `bool`c              3  óL   "  € T F  p\         P                  V4      x € K  	  R # 5ir°   )ÚPYTHON_FORMATÚsearch©Ú.0rX   s   & r*   Ú	<genexpr>Ú(Message.python_format.<locals>.<genexpr>  s   é € Ð:±c°”=×'Ñ'¨×+Ð+³cùs   ‚"$TF©rX   rp   rj   rÆ   Úany©rq   Úidss   & r*   rl   ÚMessage.python_format  sN   € ð �g‰gˆÜ˜#¤¤e˜}×-Ò-Ø�%ˆCß‹sÑ:±cÓ:�sŒsÐ:ŠsÐ:ˆsÑ:±cÓ:Ó:Ð:r5   c               ó   € V ^8„  d   QhRR/# r¿   r2   )r3   s   "r*   r4   rf     s   € ÷ ?ñ ? Tñ ?r5   c                óÀ   € V P                   p\        V\        \        34      '       g   V.p\        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # )zÆWhether the message contains Python f-string parameters.

>>> Message('Hello, {name}!').python_brace_format
True
>>> Message(('One apple', '{count} apples')).python_brace_format
True

:type:  `bool`c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir°   )r<   rÍ   s   & r*   rÏ   Ú.Message.python_brace_format.<locals>.<genexpr>+  s   é € Ð>¹#°BÔ+¨B×/Ð/»#ùs   ‚TFrÑ   rÓ   s   & r*   ro   ÚMessage.python_brace_format  sN   € ð �g‰gˆÜ˜#¤¤e˜}×-Ò-Ø�%ˆCß‹sÑ>¹#Ó>�sŒsÐ>ŠsÐ>ˆsÑ>¹#Ó>Ó>Ð>r5   )	r^   rc   r\   rX   ra   rZ   r`   r.   r_   )rh   r2   r2   r2   r2   r2   NNr°   )rz   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rr   r|   r‡   r�   r•   rš   rŸ   r£   r§   r¬   r²   r¼   ÚpropertyrÁ   ri   rl   ro   Ú__static_attributes__r2   r5   r*   r   r   �   s•   † Ù:÷1õfTõGõ'õ'õ(õ(õ(õ(õ/õ@÷ð& ô%ó ð%ð ô	2ó ð	2ð ô;ó ð;ð ô?ó ô?r5   c                  ó   € ] tR tRtRtRtR# )r   i.  z[Exception thrown by translation checkers when invalid message
translations are encountered.r2   N)rz   rÛ   rÜ   rÝ   rÞ   rà   r2   r5   r*   r   r   .  s   † õ%r5   z¸# Translations template for PROJECT.
# Copyright (C) YEAR ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#c               ó    € V ^8„  d   QhRRRR/# )r-   r>   r/   r0   zdict[str, str]r2   )r3   s   "r*   r4   r4   ;  s   € ÷  ñ   #ð  ¨.ñ  r5   c                óV   € ^ RI Hp V! 4       pWR&   \        VP                  4       4      # )rƒ   )r   úcontent-type)Úemail.messager   ÚdictÚ
get_params)r>   r   Úms   &  r*   Úparse_separated_headerré   ;  s%   € å%Ù‹	€AØ€nÑÜ�—‘“ÓÐr5   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   r'   zstr | bytesÚencodingr/   r¹   r0   r2   )r3   s   "r*   r4   r4   C  s)   € ÷ ñ �;ð ¨#ð Àð ÐTWñ r5   c                ó–   € \        V \        4      '       d   V # \        V \        4      '       d   V P                  W4      # \        V 4      # r°   )rp   r/   ÚbytesÚdecode)r'   rë   r¹   s   &&&r*   Ú_force_textrï   C  s9   € Ü�!”S×ÒØˆÜ�!”U×ÒØ�x‰x˜Ó)Ð)Üˆq‹6€Mr5   c                  óð  € ] tR tRtRtRR]RRRRRRRRRR3R R lltR R ltR	 R
 ltR R lt	]
! ]]4      t]
! ]	4      tR R ltR R lt]
! ]]RR7      tR R ltR R lt]
! ]]RR7      t]
R R l4       t]
R R l4       t]
R R l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, R- lltR. R/ ltR>R0 R1 lltR>R2 R3 llt R?R4 R5 llt!R6 R7 lt"R>R8 R9 llt#R: R; lt$R<t%R# )@r   iK  z$Representation of a message catalog.NTc               óP   € V ^8„  d   QhRRRRRRRRRRRRR	RR
RRRRRRRRRRRRR/# )r-   ÚlocaleúLocale | str | NoneÚdomainrd   Úheader_commentÚprojectÚversionÚcopyright_holderÚmsgid_bugs_addressÚcreation_datezdatetime.datetime | str | NoneÚrevision_datez6datetime.datetime | datetime.time | float | str | NoneÚlast_translatorÚlanguage_teamÚcharsetrÁ   r1   r0   re   r2   )r3   s   "r*   r4   ÚCatalog.__annotate__N  s§   € ÷ D!ñ D!à#ðD!ð ðD!ð #ð	D!ð
 ðD!ð ðD!ð %ðD!ð 'ðD!ð 6ðD!ð NðD!ð $ðD!ð "ðD!ð ðD!ð ðD!ð 
ñD!r5   c                óö  € W n         Wn        W0n        / V n        T;'       g    RV n        T;'       g    RV n        T;'       g    RV n        T;'       g    RV n        T
;'       g    RV n         T;'       g    RV n	         T;'       g    RV n
        Vf%   \        P                  P                  \        4      pMH\        V\        P                  4      '       d)   VP                  '       g   VP!                  \        R	7      pW€n        V	f   R
p	MH\        V	\        P                  4      '       d)   V	P                  '       g   V	P!                  \        R	7      p	W�n        WÐn        / V n        RV n        RV n        R# )a´  Initialize the catalog object.

:param locale: the locale identifier or `Locale` object, or `None`
               if the catalog is not bound to a locale (which basically
               means it's a template)
:param domain: the message domain
:param header_comment: the header comment as string, or `None` for the
                       default header
:param project: the project's name
:param version: the project's version
:param copyright_holder: the copyright holder of the catalog
:param msgid_bugs_address: the email address or URL to submit bug
                           reports to
:param creation_date: the date the catalog was created
:param revision_date: the date the catalog was revised
:param last_translator: the name and email of the last translator
:param language_team: the name and email of the language team
:param charset: the encoding to use in the output (defaults to utf-8)
:param fuzzy: the fuzzy bit on the catalog header
ÚPROJECTÚVERSIONÚORGANIZATIONzEMAIL@ADDRESSzFULL NAME <EMAIL@ADDRESS>zLANGUAGE <LL@li.org>úutf-8NrD   zYEAR-MO-DA HO:MI+ZONE)rô   rò   Ú_header_commentÚ	_messagesrö   r÷   rø   rù   rü   rý   rþ   r@   Únowr   rp   rE   rK   rú   rû   rÁ   ÚobsoleteÚ_num_pluralsÚ_plural_expr)rq   rò   rô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   rþ   rÁ   s   &&&&&&&&&&&&&&r*   rr   ÚCatalog.__init__N  sE  € ðH ŒØŒØ-ÔØ?AˆŒà×+Ð+ )ˆŒØ×+Ð+ )ˆŒØ 0× BÐ B°NˆÔØ"4×"GÐ"G¸ˆÔà.×MÐMÐ2MˆÔØ<Ø*×DÐDÐ.DˆÔØ:à×)Ð) 'ˆŒàÒ Ü$×-Ñ-×1Ñ1´'Ó:‰MÜ˜¤x×'8Ñ'8×9Ò9À-×BV×BVÐBVØ)×1Ñ1¼Ð1ÓAˆMØ*ÔØÒ Ø3‰MÜ˜¤x×'8Ñ'8×9Ò9À-×BV×BVÐBVØ)×1Ñ1¼Ð1ÓAˆMØ*ÔØŒ
ð ?AˆŒØ ˆÔØ ˆÖr5   c               ó    € V ^8„  d   QhRRRR/# )r-   rò   ró   r0   re   r2   )r3   s   "r*   r4   rÿ   ”  s   € ÷ kñ kÐ"5ð k¸$ñ kr5   c                	ó^  € Vf   R V n         R V n        R # \        V\        4      '       d   \	        V4      V n         Wn        R # \        V\        4      '       d/   \	        V4      V n          \        P
                  ! V4      V n        R # \        RV: 24      h  \         d    R T n         R # i ; i)NzD`locale` must be a Locale, a locale identifier string, or None; got )Ú_locale_identifierÚ_localerp   r   r/   r8   r   Ú	TypeError©rq   rò   s   &&r*   Ú_set_localeÚCatalog._set_locale”  s�   € ØŠ>Ø&*ˆDÔ#ØˆDŒLÙä�fœf×%Ò%Ü&)¨&£kˆDÔ#Ø!ŒLÙä�fœc×"Ò"Ü&)¨&£kˆDÔ#ð$Ü%Ÿ|š|¨FÓ3�”ñ äÐ^Ð_eÑ^hÐiÓjÐjøô	 &ô $Ø#�•Ùð$ús   Á*B ÂB,Â+B,c               ó   € V ^8„  d   QhRR/# )r-   r0   zLocale | Noner2   )r3   s   "r*   r4   rÿ   ©  s   € ÷ ñ ˜]ñ r5   c                	ó   € V P                   # r°   )r  r{   s   &r*   Ú_get_localeÚCatalog._get_locale©  s   € Ø�|‰|Ðr5   c               ó   € V ^8„  d   QhRR/# )r-   r0   rd   r2   )r3   s   "r*   r4   rÿ   ¬  s   € ÷ 'ñ '¨
ñ 'r5   c                	ó   € V P                   # r°   )r  r{   s   &r*   Ú_get_locale_identifierÚCatalog._get_locale_identifier¬  s   € Ø×&Ñ&Ð&r5   c               ó   € V ^8„  d   QhRR/# ru   r2   )r3   s   "r*   r4   rÿ   ²  s   € ÷ ñ  Sñ r5   c                	óR  € V P                   p\        P                  P                  \        4      P	                  R 4      p\        V P                  R4      '       d   V P                  P	                  R 4      pVP                  RV P                  4      P                  RV P                  4      P                  RV4      P                  RV P                  4      pV P                  '       d   V P                  P                  MV P                  pV'       d   VP                  RV R24      pV# )z%YÚstrftimer  r  ÚYEARr  zTranslations templatez translations)r  r@   r  r   r  Úhasattrrû   rK   rö   r÷   rø   rò   Úenglish_nameÚlocale_identifier)rq   ÚcommentÚyearÚlocale_names   &   r*   Ú_get_header_commentÚCatalog._get_header_comment²  sÝ   € Ø×&Ñ&ˆÜ× Ñ ×$Ñ$¤WÓ-×6Ñ6°tÓ<ˆÜ�4×%Ñ% z×2Ò2Ø×%Ñ%×.Ñ.¨tÓ4ˆDØ—/‘/ )¨T¯\©\Ó:ß!™' )¨T¯\©\Ó:ß!™' &¨$Ó/ß!™' .°$×2GÑ2GÓHð 	ð 48·;·;°;�t—{‘{×/Ò/ÀD×DZÑDZˆßØ—o‘oÐ&=À+ÀÈmÐ?\Ó]ˆGØˆr5   c               ó    € V ^8„  d   QhRRRR/# )r-   r.   rd   r0   re   r2   )r3   s   "r*   r4   rÿ   À  s   € ÷ &ñ &¨*ð &¸ñ &r5   c                	ó   € Wn         R # r°   )r  )rq   r.   s   &&r*   Ú_set_header_commentÚCatalog._set_header_commentÀ  s   € Ø%Ör5   a…      The header comment for the catalog.

    >>> catalog = Catalog(project='Foobar', version='1.0',
    ...                   copyright_holder='Foo Company')
    >>> print(catalog.header_comment) #doctest: +ELLIPSIS
    # Translations template for Foobar.
    # Copyright (C) ... Foo Company
    # This file is distributed under the same license as the Foobar project.
    # FIRST AUTHOR <EMAIL@ADDRESS>, ....
    #

    The header can also be set from a string. Any known upper-case variables
    will be replaced when the header is retrieved again:

    >>> catalog = Catalog(project='Foobar', version='1.0',
    ...                   copyright_holder='Foo Company')
    >>> catalog.header_comment = '''\
    ... # The POT for my really cool PROJECT project.
    ... # Copyright (C) 1990-2003 ORGANIZATION
    ... # This file is distributed under the same license as the PROJECT
    ... # project.
    ... #'''
    >>> print(catalog.header_comment)
    # The POT for my really cool Foobar project.
    # Copyright (C) 1990-2003 Foo Company
    # This file is distributed under the same license as the Foobar
    # project.
    #

    :type: `unicode`
    )Údocc               ó   € V ^8„  d   QhRR/# )r-   r0   zlist[tuple[str, str]]r2   )r3   s   "r*   r4   rÿ   ä  s   € ÷ ñ Ð#8ñ r5   c           	     	óL  € \        V P                  \        P                  \        P                  \        \
        34      '       d   \        V P                  R RR7      pMV P                  pV P                  pV P                  '       d-   RV9   d&   VP                  R\        V P                  4      4      pRV P                   RV P                   23RV P                  3R\        V P                  R RR7      3RV3R	V P                  3.pV P                  '       d'   VP!                  R
\        V P                  4      34       VP!                  RV34       V P"                  e   VP!                  RV P$                  34       VRRRV P&                   23RRR\(         R23.,          pV# )zyyyy-MM-dd HH:mmZÚen)rò   ÚLANGUAGEzProject-Id-Versionrx   zReport-Msgid-Bugs-TozPOT-Creation-DatezPO-Revision-DatezLast-TranslatorÚLanguagezLanguage-TeamzPlural-FormszContent-Typeztext/plain; charset=zGenerated-ByzBabel Ú
)zMIME-Versionz1.0)zContent-Transfer-EncodingÚ8bit)rp   rû   r@   ÚtimerJ   Úfloatr   rý   r"  rK   r/   rö   r÷   rù   rú   rü   r!   rò   Úplural_formsrþ   r  )rq   rû   rý   Úheaderss   &   r*   Ú_get_mime_headersÚCatalog._get_mime_headersä  sƒ  € Ü�d×(Ñ(¬8×+<Ñ+<¼h¿m¹mÌSÔRWÐ*X×YÒYÜ+¨D×,>Ñ,>Ð@SÐ\`Ôa‰Mà ×.Ñ.ˆMà×*Ñ*ˆØ×!×!Ð! j°MÔ&AØ)×1Ñ1°*¼cÀ$×BXÑBXÓ>YÓZˆMð " d§l¡l ^°1°T·\±\°NÐ#CÐDØ# T×%<Ñ%<Ð=Ø ¤/°$×2DÑ2DÐFYÐbfÔ"gÐhØ Ð/Ø × 4Ñ 4Ð5ð*
ˆð ×!×!Ð!Ø�N‰N˜J¬¨D×,BÑ,BÓ(CÐDÔEØ�‰˜¨Ð7Ô8Ø�;‰;Ò"Ø�N‰N˜N¨D×,=Ñ,=Ð>Ô?ØØ#ØÐ3°D·L±L°>ÐBÐCØ1Ø˜v¤g Y¨bÐ1Ð2ð	
õ 	
ˆð ˆr5   c               ó    € V ^8„  d   QhRRRR/# )r-   r7  zIterable[tuple[str, str]]r0   re   r2   )r3   s   "r*   r4   rÿ     s   € ÷ "Gñ "GÐ)Bð "GÀtñ "Gr5   c                	ón  € V EF­  w  r#\        VP                  4       V P                  R 7      p\        W0P                  R 7      pVR8X  d;   VP                  R4      pRP	                  VRR 4      V n        VR,          V n        K‚  VR8X  d	   W0n        K‘  VR8X  d	   W0n        K   VR8X  d0   VP                  RR4      pT P                  T;'       g    R4       KÖ  VR	8X  d	   W0n        Kå  VR
8X  d5   \        V4      pRV9   d    VR,          P                  4       V n        EK  EK   VR8X  dI   \        RV 24      p\        VP                  R^4      4      V n        VP                  RR4      V n        EKo  VR8X  d   \#        V4      V n        EK‰  VR8X  g   EK“  RV9  g   EK�  \#        V4      V n        EK°  	  R# ))rë   zproject-id-versionrx   Nzreport-msgid-bugs-tozlast-translatorÚlanguageÚ-Ú_zlanguage-teamrä   rþ   zplural-formsz ;ÚnpluralsÚpluralú(n != 1)zpot-creation-datezpo-revision-dater  éÿÿÿÿ)rï   Úlowerrþ   ÚsplitÚjoinrö   r÷   rù   rü   rK   r  rý   ré   rJ   Úgetr	  r
  rU   rú   rû   )rq   r7  Únamer>   ÚpartsÚparamss   &&    r*   Ú_set_mime_headersÚCatalog._set_mime_headers  sp  € Ü"‰KˆDÜ˜tŸz™z›|°d·l±lÔCˆDÜ ·±Ô=ˆEØÐ+Ô+ØŸ™ CÓ(�Ø"Ÿx™x¨¨c¨r¨
Ó3�”Ø$ R�y�–ØÐ/Ô/Ø*/Ö'ØÐ*Ô*Ø',Ö$Ø˜Ô#ØŸ™ c¨3Ó/�ð
 × Ñ  § ¨$Ö/Ø˜Ô(Ø%*Ö"Ø˜Ô'Ü/°Ó6�Ø Ô&Ø#)¨)Õ#4×#:Ñ#:Ó#<�D—Lò 'à˜Ô'Ü/°"°U°G°Ó=�Ü$'¨¯
©
°:¸qÓ(AÓ$B�Ô!Ø$*§J¡J¨x¸Ó$D�×!ØÐ,Ô,Ü%;¸EÓ%B�×"ØÐ+×+à ×&Ü)?ÀÓ)F�D×&óC #r5   aê      The MIME headers of the catalog, used for the special ``msgid ""`` entry.

    The behavior of this property changes slightly depending on whether a locale
    is set or not, the latter indicating that the catalog is actually a template
    for actual translations.

    Here's an example of the output for such a catalog template:

    >>> from babel.dates import UTC
    >>> from datetime import datetime
    >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC)
    >>> catalog = Catalog(project='Foobar', version='1.0',
    ...                   creation_date=created)
    >>> for name, value in catalog.mime_headers:
    ...     print('%s: %s' % (name, value))
    Project-Id-Version: Foobar 1.0
    Report-Msgid-Bugs-To: EMAIL@ADDRESS
    POT-Creation-Date: 1990-04-01 15:30+0000
    PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
    Last-Translator: FULL NAME <EMAIL@ADDRESS>
    Language-Team: LANGUAGE <LL@li.org>
    MIME-Version: 1.0
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: 8bit
    Generated-By: Babel ...

    And here's an example of the output when the locale is set:

    >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC)
    >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0',
    ...                   creation_date=created, revision_date=revised,
    ...                   last_translator='John Doe <jd@example.com>',
    ...                   language_team='de_DE <de@example.com>')
    >>> for name, value in catalog.mime_headers:
    ...     print('%s: %s' % (name, value))
    Project-Id-Version: Foobar 1.0
    Report-Msgid-Bugs-To: EMAIL@ADDRESS
    POT-Creation-Date: 1990-04-01 15:30+0000
    PO-Revision-Date: 1990-08-03 12:00+0000
    Last-Translator: John Doe <jd@example.com>
    Language: de_DE
    Language-Team: de_DE <de@example.com>
    Plural-Forms: nplurals=2; plural=(n != 1);
    MIME-Version: 1.0
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: 8bit
    Generated-By: Babel ...

    :type: `list`
    c               ó   € V ^8„  d   QhRR/# ©r-   r0   rJ   r2   )r3   s   "r*   r4   rÿ   [  s   € ÷ !ñ !˜Sñ !r5   c                ó¢   € V P                   f7   ^pV P                  '       d   \        V P                  4      ^ ,          pWn         V P                   # )z‘The number of plurals used by the catalog or locale.

>>> Catalog(locale='en').num_plurals
2
>>> Catalog(locale='ga').num_plurals
5

:type: `int`)r	  rò   r   )rq   Únums   & r*   Únum_pluralsÚCatalog.num_pluralsZ  sC   € ð ×ÑÒ$ØˆCØ�{�{ˆ{Ü  §¡Ó-¨aÕ0�Ø #ÔØ× Ñ Ð r5   c               ó   € V ^8„  d   QhRR/# ru   r2   )r3   s   "r*   r4   rÿ   l  s   € ÷ !ñ !˜Sñ !r5   c                ó¢   € V P                   f7   RpV P                  '       d   \        V P                  4      ^,          pWn         V P                   # )a  The plural expression used by the catalog or locale.

>>> Catalog(locale='en').plural_expr
'(n != 1)'
>>> Catalog(locale='ga').plural_expr
'(n==1 ? 0 : n==2 ? 1 : n>=3 && n<=6 ? 2 : n>=7 && n<=10 ? 3 : 4)'
>>> Catalog(locale='ding').plural_expr  # unknown locale
'(n != 1)'

:type: `str`rA  )r
  rò   r   )rq   Úexprs   & r*   Úplural_exprÚCatalog.plural_exprk  sC   € ð ×ÑÒ$ØˆDØ�{�{ˆ{Ü! $§+¡+Ó.¨qÕ1�Ø $ÔØ× Ñ Ð r5   c               ó   € V ^8„  d   QhRR/# ru   r2   )r3   s   "r*   r4   rÿ     s   € ÷ 	Jñ 	J˜cñ 	Jr5   c                ó<   € RV P                    RV P                   R2# )zÎReturn the plural forms declaration for the locale.

>>> Catalog(locale='en').plural_forms
'nplurals=2; plural=(n != 1);'
>>> Catalog(locale='pt_BR').plural_forms
'nplurals=2; plural=(n > 1);'

:type: `str`z	nplurals=z	; plural=Ú;)rP  rU  r{   s   &r*   r6  ÚCatalog.plural_forms~  s'   € ð ˜4×+Ñ+Ð,¨I°d×6FÑ6FÐ5GÀqÐIÐIr5   c               ó    € V ^8„  d   QhRRRR/# )r-   rX   r   r0   r1   r2   )r3   s   "r*   r4   rÿ   Š  s   € ÷ 3ñ 3˜zð 3¨dñ 3r5   c                ó>   € V P                  V4      V P                  9   # )z?Return whether the catalog has a message with the specified ID.©Ú_key_forr  ©rq   rX   s   &&r*   Ú__contains__ÚCatalog.__contains__Š  s   € à�}‰}˜RÓ  D§N¡NÑ2Ð2r5   c               ó   € V ^8„  d   QhRR/# rM  r2   )r3   s   "r*   r4   rÿ   Ž  s   € ÷ #ñ #˜ñ #r5   c                ó,   € \        V P                  4      # )z]The number of messages in the catalog.

This does not include the special ``msgid ""`` entry.)Úlenr  r{   s   &r*   Ú__len__ÚCatalog.__len__Ž  s   € ô �4—>‘>Ó"Ð"r5   c               ó   € V ^8„  d   QhRR/# )r-   r0   zIterator[Message]r2   )r3   s   "r*   r4   rÿ   ”  s   € ÷ &ñ &Ð+ñ &r5   c              #  óB  "  € . pV P                    F  w  r#VP                  V RV 24       K  	  \        4       pV P                  '       d   VR0,          p\	        RRP                  V4      VR7      x € V P                   F  pV P                  V,          x € K  	  R# 5i)z‘Iterates through all the entries in the catalog, in the order they
were added, yielding a `Message` object for every entry.

:rtype: ``iterator``z: rÁ   rh   r2  rÂ   N)Úmime_headersr!   rk   rÁ   r   rE  r  )rq   ÚbufrG  r>   r\   Úkeys   &     r*   Ú__iter__ÚCatalog.__iter__”  s…   é € ð
 ˆØ×,Ô,‰KˆDØ�J‰J˜$˜˜r % Ð)Ö*ñ -ä“ˆØ�:�:ˆ:Ø�g�YÕˆEÜ�b˜$Ÿ)™) C›.°Ô6Ò6Ø—>”>ˆCØ—.‘. Õ%Ô%ó "ùs   ‚BBc               ó   € V ^8„  d   QhRR/# ru   r2   )r3   s   "r*   r4   rÿ   £  s   € ÷ Bñ B˜#ñ Br5   c                	óš   € R pV P                   '       d   RV P                    2pR\        V 4      P                   RV P                  : V R2# )rh   rx   rw   Ú>)rò   ry   rz   rô   r  s   & r*   r|   ÚCatalog.__repr__£  sH   € ØˆØ�;�;ˆ;Ø˜Ÿ™˜Ð&ˆFØ”4˜“:×&Ñ&Ð' q¨¯©©¸°x¸qÐAÐAr5   c               ó    € V ^8„  d   QhRRRR/# )r-   rX   r   r0   re   r2   )r3   s   "r*   r4   rÿ   ©  s   € ÷ ñ ˜jð ¨Tñ r5   c                ó(   € V P                  V4       R# )z)Delete the message with the specified ID.N)Údeleter_  s   &&r*   Ú__delitem__ÚCatalog.__delitem__©  s   € à�‰�BŽr5   c               ó    € V ^8„  d   QhRRRR/# )r-   rX   r   r0   r   r2   )r3   s   "r*   r4   rÿ   ­  s   € ÷ ñ ˜jð ¨Wñ r5   c                ó$   € V P                  V4      # )zEReturn the message with the specified ID.

:param id: the message ID
)rF  r_  s   &&r*   Ú__getitem__ÚCatalog.__getitem__­  s   € ð
 �x‰x˜‹|Ðr5   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rX   r   Úmessager   r0   re   r2   )r3   s   "r*   r4   rÿ   ´  s!   € ÷ .*ñ .*˜jð .*°7ð .*¸tñ .*r5   c                ó¶  € \        V\        4      '       g   Q R4       hV P                  WP                  4      pV P                  P                  V4      pV'       Ed   VP                  '       d5   VP                  '       g#   VP                  Vn        VP                  Vn        \        \        VP                  VP                  ,           4      4      Vn        \        \        VP                  VP                  ,           4      4      Vn        \        \        VP                  VP                  ,           4      4      Vn        V;P                  VP                  ,          un        R# VR8X  d}   \        VP                  4      P!                  4       V n        RP%                  VP                   Uu. uF  pRV 2P'                  4       NK  	  up4      V n        VP*                  V n        R# \        V\        \,        34      '       dD   \        VP                  \        \,        34      '       g   Q R\/        VP                  4       24       hW P                  V&   R# u upi )ai  Add or update the message with the specified ID.

>>> catalog = Catalog()
>>> catalog[u'foo'] = Message(u'foo')
>>> catalog[u'foo']
<Message u'foo' (flags: [])>

If a message with that ID is already in the catalog, it is updated
to include the locations and flags of the new message.

>>> catalog = Catalog()
>>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)])
>>> catalog[u'foo'].locations
[('main.py', 1)]
>>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)])
>>> catalog[u'foo'].locations
[('main.py', 1), ('utils.py', 5)]

:param id: the message ID
:param message: the `Message` object
zexpected a Message objectrh   r2  z# zExpected sequence but got N)rp   r   r^  rc   r  rF  ri   rX   r.   rj   r   rZ   r^   r_   r\   r   Úitemsri  rE  Úrstriprõ   rÁ   rÆ   ry   )rq   rX   r|  rk  ÚcurrentÚcs   &&&   r*   Ú__setitem__ÚCatalog.__setitem__´  sÊ  € ô, ˜'¤7×+Ò+ÐHÐ-HÓHÐ+Ø�m‰m˜B§¡Ó0ˆØ—.‘.×$Ñ$ SÓ)ˆßˆ7Ø×#×#Ð#¨G×,@×,@Ð,@à$ŸZ™Z�”
Ø!(§¡�”Ü $¤X¨g×.?Ñ.?Ø.5×.?Ñ.?õ/@ó &Aó !BˆGÔä$(¬°'×2GÑ2GØ29×2GÑ2Gõ3Hó *Ió %JˆGÔ!ä$(¬°'×2GÑ2GØ29×2GÑ2Gõ3Hó *Ió %JˆGÔ!à�MŠM˜WŸ]™]Õ*�MØ�2ŒXä 3°G·N±NÓ C× IÑ IÓ KˆDÔØ"&§)¡)È×H]ÒH]Ó,^ÑH]À1¨r°!°¨X¯_©_Ö->ÑH]Ñ,^Ó"_ˆDÔØ Ÿ™ˆDŽJä˜"œt¤U˜m×,Ò,Ü! '§.¡.´4¼°-×@Ò@ð HØ0´°g·n±nÓ1EÐ0FÐGóHÐ@à")�N‰N˜3Óùò -_s   Æ,Ic               ó@   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRR/
# )r-   rX   r   r.   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   r0   r   r2   )r3   s   "r*   r4   rÿ   ä  sn   € ÷ )ñ )àð)ð "ð)ð -ð	)ð
 ð)ð %ð)ð %ð)ð  ð)ð ð)ð ð)ð 
ñ)r5   c
                óB   € \        W\        V4      WEWgVV	R7	      p
W V&   V
# )aÌ  Add or update the message with the specified ID.

>>> catalog = Catalog()
>>> catalog.add(u'foo')
<Message ...>
>>> catalog[u'foo']
<Message u'foo' (flags: [])>

This method simply constructs a `Message` object with the given
arguments and invokes `__setitem__` with that object.

:param id: the message ID, or a ``(singular, plural)`` tuple for
           pluralizable messages
:param string: the translated message string, or a
               ``(singular, plural)`` tuple for pluralizable messages
:param locations: a sequence of ``(filename, lineno)`` tuples
:param flags: a set or sequence of flags
:param auto_comments: a sequence of automatic comments
:param user_comments: a sequence of user comments
:param previous_id: the previous message ID, or a ``(singular, plural)``
                    tuple for pluralizable messages
:param lineno: the line number on which the msgid line was found in the
               PO file, if any
:param context: the message context
)ra   rc   )r   rj   )rq   rX   r.   rZ   r\   r^   r_   r`   ra   rc   r|  s   &&&&&&&&&& r*   rm   ÚCatalog.addä  s/   € ôJ ˜"¤d¨9£o°uØ'¸VØ")ô+ˆð ˆR‰Øˆr5   c               ó   € V ^8„  d   QhRR/# )r-   r0   z0Iterable[tuple[Message, list[TranslationError]]]r2   )r3   s   "r*   r4   rÿ     s   € ÷ &ñ &ÐGñ &r5   c              #  ó’   "  € V P                   P                  4        F$  pVP                  V R7      pV'       g   K  W3x € K&  	  R# 5i)a4  Run various validation checks on the translations in the catalog.

For every message which fails validation, this method yield a
``(message, errors)`` tuple, where ``message`` is the `Message` object
and ``errors`` is a sequence of `TranslationError` objects.

:rtype: ``generator`` of ``(message, errors)``
)rµ   N)r  Úvaluesr¼   )rq   r|  r¹   s   &  r*   r¼   ÚCatalog.check  s;   é € ð —~‘~×,Ñ,Ö.ˆGØ—]‘]¨4�]Ó0ˆFß‰vØ�oÔ%ó /ùs
   ‚5A¼Ac               ó$   € V ^8„  d   QhRRRRRR/# )r-   rX   r   rc   rd   r0   zMessage | Noner2   )r3   s   "r*   r4   rÿ     s!   € ÷ >ñ >�jð >¨:ð >Àñ >r5   c                óV   € V P                   P                  V P                  W4      4      # )z‘Return the message with the specified ID and context.

:param id: the message ID
:param context: the message context, or ``None`` for no context
)r  rF  r^  )rq   rX   rc   s   &&&r*   rF  ÚCatalog.get  s"   € ð �~‰~×!Ñ! $§-¡-°Ó"<Ó=Ð=r5   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rX   r   rc   rd   r0   re   r2   )r3   s   "r*   r4   rÿ   %  s!   € ÷ $ñ $˜ð $¨jð $ÀDñ $r5   c                óf   € V P                  W4      pW0P                  9   d   V P                  V R# R# )z‘Delete the message with the specified ID and context.

:param id: the message ID
:param context: the message context, or ``None`` for no context
Nr]  ©rq   rX   rc   rk  s   &&& r*   rt  ÚCatalog.delete%  s-   € ð �m‰m˜BÓ(ˆØ—.‘.Ô Ø—‘˜sÒ#ñ !r5   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r-   Útemplater   Úno_fuzzy_matchingr1   Úupdate_header_commentÚkeep_user_commentsÚupdate_creation_dater0   re   r2   )r3   s   "r*   r4   rÿ   /  sN   € ÷ U8ñ U8àðU8ð  ðU8ð  $ð	U8ð
 !ðU8ð #ðU8ð 
ñU8r5   c                ó´  a aaaa€ S P                   oSP                  4       o/ S n         / pV'       gh   S Fa  pV'       g   K  SV,          P                  '       g   K(  S P                  V4      pSV,          P                  p	W‰3VS P                  V4      &   Kc  	  \        4       oR VVVVV 3R llp
V F½  pVP                  '       g   K  S P                  VP                  VP                  4      pVS9   d   V
! W¸V4       KO  V'       gX   \        S P                  V4      VP                  4       ^4      pV'       d&   V^ ,          pWm,          w  rïVe   Wï3pV
! W¾V4       K®  VS VP                  &   K¿  	  S F*  pV'       g
   VS9  g   K  SV,          S P                  V&   K,  	  V'       d   VP                  S n        V'       d   VP                  S n        R# R# )aB  Update the catalog based on the given template catalog.

>>> from babel.messages import Catalog
>>> template = Catalog()
>>> template.add('green', locations=[('main.py', 99)])
<Message ...>
>>> template.add('blue', locations=[('main.py', 100)])
<Message ...>
>>> template.add(('salad', 'salads'), locations=[('util.py', 42)])
<Message ...>
>>> catalog = Catalog(locale='de_DE')
>>> catalog.add('blue', u'blau', locations=[('main.py', 98)])
<Message ...>
>>> catalog.add('head', u'Kopf', locations=[('util.py', 33)])
<Message ...>
>>> catalog.add(('salad', 'salads'), (u'Salat', u'Salate'),
...             locations=[('util.py', 38)])
<Message ...>

>>> catalog.update(template)
>>> len(catalog)
3

>>> msg1 = catalog['green']
>>> msg1.string
>>> msg1.locations
[('main.py', 99)]

>>> msg2 = catalog['blue']
>>> msg2.string
u'blau'
>>> msg2.locations
[('main.py', 100)]

>>> msg3 = catalog['salad']
>>> msg3.string
(u'Salat', u'Salate')
>>> msg3.locations
[('util.py', 42)]

Messages that are in the catalog but not in the template are removed
from the main collection, but can still be accessed via the `obsolete`
member:

>>> 'head' in catalog
False
>>> list(catalog.obsolete.values())
[<Message 'head' (flags: [])>]

:param template: the reference catalog, usually read from a POT file
:param no_fuzzy_matching: whether to use fuzzy matching of message IDs
:param update_header_comment: whether to copy the header comment from the template
:param keep_user_comments: whether to keep user comments from the old catalog
:param update_creation_date: whether to copy the creation date from the template
c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   r|  r   Úoldkeyútuple[str, str] | strÚnewkeyr0   re   r2   )r3   s   "r*   r4   Ú$Catalog.update.<locals>.__annotate__|  s+   € ÷ #	'ñ #	'˜Gð #	'Ð-Bð #	'ÐLað #	'Ðfjñ #	'r5   c                óÌ  <€ V P                  4       p R pW8w  dy   RpSP                  V4       SP                  V4      pVf   Q h\        VP                  \
        4      '       d   VP                  .V n        M3\        VP                  4      V n        MSP                  VR4      pVf   Q hVP                  V n	        S'       d$   \        \        VP                  4      4      V n        \        V P                  \        \        34      '       dÅ   \        V P                  \        \        34      '       gH   Rp\        V P                  .R.\        V P                  4      ^,
          ,          ,           4      V n	        M—\        V P                  4      S	P                  8w  d3   Rp\        V P                  R\        VP                  4       4      V n	        M@\        V P                  \        \        34      '       d   RpV P                  ^ ,          V n	        V ;P                  VP                  ,          un        V'       d   V ;P                  R0,          un        V S	V P                  &   R# )FTNrh   rÁ   )r²   rm   rF  rp   rX   r/   r`   rj   Úpopr.   r   r_   rÆ   rd  rP  r\   )
r|  rš  rœ  rÁ   ÚoldmsgÚfuzzy_matchesr–  ÚmessagesÚ	remainingrq   s
   &&&  €€€€€r*   Ú_mergeÚCatalog.update.<locals>._merge|  s²  ø€ Ø—m‘m“oˆGØˆEØÔØ�Ø×!Ñ! &Ô)Ø!Ÿ™ fÓ-�ØÒ)Ð)Ð)Ü˜fŸi™i¬×-Ò-Ø+1¯9©9¨+�GÕ'ä*.¨v¯y©y«/�GÕ'à"Ÿ™ v¨tÓ4�ØÒ)Ð)Ð)Ø#Ÿ]™]ˆGŒNç!Ü(,¬X°f×6JÑ6JÓ-KÓ(L�Ô%ä˜'Ÿ*™*¤t¬U m×4Ò4Ü! '§.¡.´4¼°-×@Ò@Ø �EÜ%*Ø Ÿ™Ð(¨R¨D´C¸¿
¹
³OÀaÕ4GÕ,HÕIó&�G•Nô ˜Ÿ™Ó(¨D×,<Ñ,<Ô<Ø �EÜ%*¨7¯>©>Ð:M¼3¸v¿}¹}Ó;MÐ+NÓ%O�G”NøÜ˜GŸN™N¬T´5¨M×:Ò:Ø�Ø!(§¡°Õ!2�”Ø�MŠM˜VŸ\™\Õ)�MßØ—’ ' Õ*•Ø&ˆD�—‘Ór5   N)r  r   r.   r^  rc   Ú_to_fuzzy_match_keyrk   rX   r+   Úkeysr  rõ   rú   )rq   r“  r”  r•  r–  r—  Úfuzzy_candidatesÚmsgidrk  Úctxtr¤  r|  ÚmatchesÚmodified_keyrœ  Únewctxtr¡  r¢  r£  s   f&&&f&          @@@r*   ÚupdateÚCatalog.update/  s‘  ü€ ð~ —>‘>ˆØ—M‘M“Oˆ	ØˆŒð Ðß Û!�ß‘5˜X e�_×3×3Ò3ØŸ-™-¨Ó.�CØ# E�?×2Ñ2�DØGJÀkÐ$ T×%=Ñ%=¸cÓ%BÓCñ	 "ô
 ›ˆ÷#	'ô #	'óJ  ˆGØ�z�zŠzØ—m‘m G§J¡J°·±Ó@�Ø˜(”?Ù˜7¨Ö-ç,ä"3Ø ×4Ñ4°SÓ9Ø,×1Ñ1Ó3Øó#˜÷
 #Ø+2°1­:˜LØ.>Õ.L™O˜FØ&Ò2Ø)/¨ Ù" 7°CÔ8Ù$à'.�D˜Ÿ™Ó$ñ+  ó. ˆEß  E°Ö$>Ø'0°Õ'7�—‘˜eÓ$ñ ÷ !ð #+×"9Ñ"9ˆDÔ÷  Ø!)×!7Ñ!7ˆDÖñ  r5   c               ó    € V ^8„  d   QhRRRR/# )r-   rk  r›  r0   r/   r2   )r3   s   "r*   r4   rÿ   Æ  s   € ÷ (ñ (Ð'<ð (Àñ (r5   c                ó‚   € \        V\        4      '       d   V^ ,          pMTpVP                  4       P                  4       # )z?Converts a message key to a string suitable for fuzzy matching.)rp   rÆ   rC  Ústrip)rq   rk  Úmatchkeys   && r*   r¦  ÚCatalog._to_fuzzy_match_keyÆ  s3   € ä�cœ5×!Ò!Ø˜1•v‰HàˆHØ�~‰~Ó×%Ñ%Ó'Ð'r5   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rX   r   rc   rd   r0   r›  r2   )r3   s   "r*   r4   rÿ   Î  s"   € ÷ 
ñ 
˜:ð 
°
ð 
ÐF[ñ 
r5   c                ób   € Tp\        V\        \        34      '       d
   V^ ,          pVe   W23pV# )z‘The key for a message is just the singular ID even for pluralizable
messages, but is a ``(msgid, msgctxt)`` tuple for context-specific
messages.
)rp   rj   rÆ   r�  s   &&& r*   r^  ÚCatalog._key_forÎ  s5   € ð
 ˆÜ�cœD¤%˜=×)Ò)Ø�Q•%ˆCØÒØ�.ˆCØˆ
r5   c               ó    € V ^8„  d   QhRRRR/# )r-   r   r   r0   r1   r2   )r3   s   "r*   r4   rÿ   Ú  s   € ÷ Cñ C 'ð C¨dñ Cr5   c                ó�  € \        V\        4      '       g   Q hV P                  P                  4       VP                  P                  4       ,           FG  pV P	                  V4      pVP	                  V4      pVe   Ve   VP                  V4      '       d   KF   R# 	  \        V P                  4      \        VP                  4      8H  # )zLChecks if catalogs are identical, taking into account messages and
headers.
F)rp   r   r  r§  rF  r¬   ræ   ri  )rq   r   rk  Ú	message_1Ú	message_2s   &&   r*   r¬   ÚCatalog.is_identicalÚ  s¡   € ô ˜%¤×)Ò)Ð)Ð)Ø—>‘>×&Ñ&Ó(¨5¯?©?×+?Ñ+?Ó+A×AÐAˆCØŸ™ ›ˆIØŸ	™	 #›ˆIàÒ!ØÒ$Ø ×-Ñ-¨i×8Ô8âñ Bô �D×%Ñ%Ó&¬$¨u×/AÑ/AÓ*BÑBÐBr5   )r  r  r  r  r	  r
  rþ   rø   rú   rô   rÁ   rõ   rý   rü   rò   ri  rù   r  rö   rû   r÷   )Nr2   r2   r2   r2   r2   NNr°   )FFTT)&rz   rÛ   rÜ   rÝ   rÞ   ÚDEFAULT_HEADERrr   r  r  r  rß   rò   r"  r&  r*  rõ   r8  rJ  ri  rP  rU  r6  r`  re  rl  r|   ru  ry  r‚  rm   r¼   rF  rt  r®  r¦  r^  r¬   rà   r2   r5   r*   r   r   K  s<  † Ù.ð '+Ø!Ø%3Ø"Ø"Ø'+Ø)-Ø8<ØPTØ&*Ø$(Ø"Ø÷D!õLkõ*õ'ñ �k ;Ó/€FÙ Ð!7Ó8Ðõõ&ñ Ð1Ð3Fð Mô 	€NõBõ<"GñH Ð-Ð/@ð 2Gô 2	€Lðh ô!ó ð!ð  ô!ó ð!ð$ ô	Jó ð	Jõ3õ#õ&õBõõõ.*÷`)õV&÷>÷$÷U8õn(÷
÷Cñ Cr5   )r½  rË   r   r   r   )é   g333333ã?)r  Ústrict)8Ú__conditional_annotations__rÞ   Ú
__future__r   r@   rF   Úcollections.abcr   r   r   Údifflibr   Úemailr   Úheapqr   r.   r	   Útypingr
   Úbabelr   r  Ú
babel.corer   r   Úbabel.datesr   Úbabel.messages.pluralsr   Ú
babel.utilr   r   r   r   Útyping_extensionsr   r/   rÆ   rj   r   Ú__annotations__Ú__all__r+   ÚcompileÚVERBOSErË   r<   rU   r   Ú	Exceptionr   r½  ré   rï   r   )rÀ  s   @r*   Ú<module>rÒ     sÏ   øðôõ #ã Û 	ß .Ý Ý #Ý %Ý Ý Ý  å (ß 1Ý 'Ý -ß CÓ CçÝ+à %¨¨S¨¥/Õ1°D¸µIÕ=€J�	Ó=ò€ô&ð4 —
’
ð 	ð ‡Z�Zó	€õõ&÷<j?ñ j?ôZ%�yô %ð
€õ ÷÷]
Có ]
Cr5   