ó
    Öu•c´š  ã                   ó¸  • S 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s  Jr  SSKJrJr  SSKJr  SSKJr  SSKJr  SSKrSSKrS rS rS	rS
rSrSrSrSr " S S5      r  " S S5      r! " S S5      r" " S S5      r# " S S5      r$ " S S5      r% " S S5      r&Su  r'r(S r)S r*S  r+S! r, " S" S#\-5      r. " S$ S%5      r/S'S& jr0g! \	 a    SSK
Js  Jr   N·f = f)(a¹  
Implementation of the XDG Menu Specification
http://standards.freedesktop.org/menu-spec/

Example code:

from xdg.Menu import parse, Menu, MenuEntry

def print_menu(menu, tab=0):
  for submenu in menu.Entries:
    if isinstance(submenu, Menu):
      print ("  " * tab) + unicode(submenu)
      print_menu(submenu, tab+1)
    elif isinstance(submenu, MenuEntry):
      print ("  " * tab) + unicode(submenu.DesktopEntry)

print_menu(parse())
é    N)Úxdg_data_dirsÚxdg_config_dirs)ÚDesktopEntry)ÚParsingError)ÚPY3c                 ó&  • [         R                  S:¼  aV  [        R                  " U 5      n [         R                  S:¼  a  [        R                  " U 5      $ [        R
                  " U 5      $ [        R                  " U [        R                  " 5       S9$ )N)é   é   )r	   é   ©ÚidÚctx)ÚsysÚversion_infoÚastÚliteral_evalÚConstantÚNameConstantÚNameÚLoad)Únames    Ú*/usr/lib/python3/dist-packages/xdg/Menu.pyÚ
_ast_constr   '   se   € Ü
×Ñ˜6Ó!Ü×Ò Ó%ˆÜ×Ñ˜vÓ%Ü—<’< Ó%Ð%ä×#Ò# DÓ)Ð)ä�xŠx˜4¤S§X¢X£ZÑ0Ð0ó    c                 ó�   • [         (       d&  [        U [        5      (       a  U R                  S5      n [        R
                  " U 5      $ )z_Wrapper around locale.strxfrm that accepts unicode strings on Python 2.

See Python bug #2481.
zutf-8)r   Ú
isinstanceÚunicodeÚencodeÚlocaleÚstrxfrm)Úss    r   Ú_strxfrmr"   2   s2   € ÷
 ŠC”Z ¤7×+Ñ+Ø�H‰H�WÓˆÜ�>Š>˜!ÓÐr   ÚDeletedÚ	NoDisplayÚHiddenÚEmptyÚ	NotShowInÚNoExecc                   ó”   • \ rS rSrSrS rS rS rS rS r	S r
S	 r SS
 jrSS jrS rSS jrS rS rS rS rS r S rS rSrg)ÚMenuéD   zVMenu containing sub menus under menu.Entries

Contains both Menu and MenuEntry items.
c                 ó*  • SU l         S U l        / U l        SU l        SU l        SU l        S U l        SU l        SU l        SU l	        / U l
        S U l        S U l        / U l        / U l        S U l        / U l        / U l        S U l        / U l        / U l        g )NÚ r   FT)r   Ú	DirectoryÚEntriesÚDocÚFilenameÚDepthÚParentÚNotInXmlÚShowÚVisibleÚAppDirsÚDefaultLayoutr#   ÚDirectoriesÚDirectoryDirsÚLayoutÚMenuEntriesÚMovesÚOnlyUnallocatedÚRulesÚSubmenus©Úselfs    r   Ú__init__ÚMenu.__init__I   sž   € àˆŒ	ØˆŒØˆŒØˆŒØˆŒØˆŒ
ØˆŒØˆŒð ˆŒ	ØˆŒð ˆŒØ!ˆÔØˆŒØˆÔØˆÔØˆŒØˆÔØˆŒ
Ø#ˆÔØˆŒ
Øˆ�r   c                 ó   • U R                   $ ©N©r   rA   s    r   Ú__str__ÚMenu.__str__e   ó   € Ø�y‰yÐr   c                 ó  • UR                    H  nU R                   R                  U5        M      UR                   H  nU R                  R                  U5        M      UR                   H  nU R                  R                  U5        M      UR                  b  UR                  U l        UR
                  b  UR
                  U l        UR                  (       a  UR                  U l        UR                  (       a  UR                  U l        UR                   H  nU R                  R                  U5        M      UR                   H  nU R                  R                  U5        M      UR                   H  nU R                  U5        M     U $ rF   )r7   Úappendr:   r9   r#   r>   r;   r8   r?   r=   r@   Ú
addSubmenu)rB   ÚotherÚdirÚ	directoryÚruleÚmoveÚsubmenus          r   Ú__add__ÚMenu.__add__h   s-  € Ø—=”=ˆCØ�L‰L×Ñ Ö$ñ !ð ×&Ô&ˆCØ×Ñ×%Ñ% cÖ*ñ 'ð ×*Ô*ˆIØ×Ñ×#Ñ# IÖ.ñ +ð �=‰=Ñ$Ø Ÿ=™=ˆDŒLà× Ñ Ñ,Ø#(×#8Ñ#8ˆDÔ à�<�<ØŸ,™,ˆDŒKà××Ø!&×!4Ñ!4ˆDÔà—K”KˆDØ�J‰J×Ñ˜dÖ#ñ  ð —K”KˆDØ�J‰J×Ñ˜dÖ#ñ  ð —~”~ˆGØ�O‰O˜GÖ$ñ &ð ˆr   c                 óh   • [         R                  " U R                  5       UR                  5       5      $ rF   )r   ÚstrcollÚgetName©rB   rN   s     r   Ú__cmp__ÚMenu.__cmp__Š   s   € Ü�~Š~˜dŸl™l›n¨e¯m©m«oÓ>Ð>r   c                 ó4   • [        U R                  5       5      $ ©z&Key function for locale-aware sorting.)r"   rX   rA   s    r   Ú_keyÚ	Menu._key�   s   € ä˜Ÿ™›Ó'Ð'r   c                 ój   •  UR                  5       nU R                  5       U:  $ ! [         a     Nf = frF   ©r^   ÚAttributeErrorrY   s     r   Ú__lt__ÚMenu.__lt__‘   ó9   € ð	Ø—J‘J“LˆEð �y‰y‹{˜UÑ"Ð"øô ó 	Ùð	úó   ‚% ¥
2±2c                 ó„   •  U R                   [        U5      :H  $ ! [         a    U R                   [        U5      :H  s $ f = frF   )r   r   Ú	NameErrorÚstrrY   s     r   Ú__eq__ÚMenu.__eq__˜   s<   € ð	+Ø—9‘9¤¨£Ñ.Ð.øÜó 	+Ø—9‘9¤ E£
Ñ*Ò*ð	+ús   ‚ š"?¾?c              #   óv   #   • U R                    H%  nU(       a  Uv •  M  UR                  SL d  M!  Uv •  M'     g7f)z4Interator for a list of Entries visible to the user.TN)r/   r5   )rB   Úshow_hiddenÚentrys      r   Ú
getEntriesÚMenu.getEntriesŸ   s,   é € à—\”\ˆEÞØ”Ø—‘˜tÔ#Ø”ò	 "ùs   ‚*9°	9c                 óª   • U R                    H  nUR                  U:X  d  M  Us  $    U(       a%  U R                   H  nUR                  X5        M     gg)z4Searches for a MenuEntry with a given DesktopFileID.N)r<   ÚDesktopFileIDr@   ÚgetMenuEntry)rB   ÚdesktopfileidÚdeepÚ	menuentryrS   s        r   rs   ÚMenu.getMenuEntry«   sL   € à×)Ô)ˆIØ×&Ñ&¨-Õ7Ø Ò ñ *ö ØŸ=œ=�Ø×$Ñ$ ]Ö9ò )ð r   c                 óÆ   • UR                  SS5      nU R                   H?  nUR                  US   :X  d  M  [        U5      S:”  a  UR	                  US   5      s  $ Us  $    g)z&Searches for a Menu with a given path.Ú/é   r   N)Úsplitr@   r   ÚlenÚgetMenu)rB   ÚpathÚarrayrS   s       r   r}   ÚMenu.getMenu´   sS   € à—
‘
˜3 Ó"ˆØ—}”}ˆGØ�|‰|˜u Q™xÕ'Ü�u“: “>Ø"Ÿ?™?¨5°©8Ó4Ò4à"’Nò %r   c                 óx  • U n/ n U(       a  UR                  UR                  5        OUR                  UR                  5       5        UR                  S:”  a  UR                  nOOMb  UR                  5         SnU(       d  UR                  S5        U H"  n[        R                  R                  XV5      nM$     U$ )z/Returns this menu's path in the menu structure.r   r-   )
rL   r   rX   r2   r3   ÚreverseÚpopÚosr~   Újoin)rB   ÚorgÚtoplevelÚparentÚnamesr~   r   s          r   ÚgetPathÚMenu.getPath¾   s‘   € àˆØˆØÞØ—‘˜VŸ[™[Õ)à—‘˜VŸ^™^Ó-Ô.Ø�|‰|˜aÓØŸ™‘àñ ð 	�‰ŒØˆÞØ�I‰I�aŒLÛˆDÜ—7‘7—<‘< Ó+ŠDñ àˆr   c                 ó„   •  U R                   R                  R                  5       $ ! [         a    U R                  s $ f = f)z"Returns the menu's localised name.)r.   r   rX   rb   r   rA   s    r   rX   ÚMenu.getNameÓ   s9   € ð	Ø—>‘>×.Ñ.×6Ñ6Ó8Ð8øÜó 	Ø—9‘9Òð	ús   ‚#& ¦?¾?c                 ól   •  U R                   R                  R                  5       $ ! [         a     gf = f)z Returns the menu's generic name.r-   )r.   r   ÚgetGenericNamerb   rA   s    r   r�   ÚMenu.getGenericNameÚ   s2   € ð	Ø—>‘>×.Ñ.×=Ñ=Ó?Ð?øÜó 	Ùð	úó   ‚#& ¦
3²3c                 ól   •  U R                   R                  R                  5       $ ! [         a     gf = f)z Returns the menu's comment text.r-   )r.   r   Ú
getCommentrb   rA   s    r   r“   ÚMenu.getCommentá   s2   € ð	Ø—>‘>×.Ñ.×9Ñ9Ó;Ð;øÜó 	Ùð	úr‘   c                 ól   •  U R                   R                  R                  5       $ ! [         a     gf = f)z0Returns the menu's icon, filename or simple namer-   )r.   r   ÚgetIconrb   rA   s    r   r–   ÚMenu.getIconè   s2   € ð	Ø—>‘>×.Ñ.×6Ñ6Ó8Ð8øÜó 	Ùð	úr‘   c                 óì  • / U l         SU l        U R                   H  nUR                  5         M     [	        5       n[	        5       nU R
                  R                   HA  nUS   S:X  a  UR                  US   5        M"  US   S:X  d  M-  UR                  US   5        MC     U R
                  R                   GHF  nUS   S:X  aj  [        U 5      n[        U R                   5      S:”  a)  [        U R                   S   [        5      (       a  SUl        U R                   R                  U5        Mw  US   S:X  a:  U R                  US   5      nU(       a  U R                   R                  U5        M¸  Mº  US   S:X  ak  U R                  US   5      nU(       aM  UR
                  R                  (       a  U R!                  U5        GM  U R                   R                  U5        GM+  GM.  US   S:X  d  GM:  US   S	:X  d	  US   S
:X  a]  U R"                  R                  5         U R"                   H0  nUR$                  U;  d  M  U R                   R                  U5        M2     GM©  US   S:X  d  US   S
:X  d  GM¾  U R                  R                  5         U R                   H^  nUR&                  U;  d  M  UR
                  R                  (       a  U R!                  U5        MC  U R                   R                  U5        M`     GMI     U R                    GH  nSUl        U =R                  S-  sl        [        U[(        5      (       aí  UR*                  SL a"  [,        Ul        U =R                  S-  sl        Mf  [        UR.                  [0        5      (       aš  UR.                  R2                  R5                  5       (       a"  [6        Ul        U =R                  S-  sl        MÐ  UR.                  R2                  R9                  5       (       a#  [:        Ul        U =R                  S-  sl        GM  GM  GM"  [        U[0        5      (       Ga·  UR2                  R5                  5       (       a#  [6        Ul        U =R                  S-  sl        GMz  UR2                  R9                  5       (       a#  [:        Ul        U =R                  S-  sl        GM¼  UR2                  R=                  5       (       aB  UR2                  R?                  5       (       d#  [@        Ul        U =R                  S-  sl        GM  [B        RD                  RF                  (       a°  UR2                  RI                  5       / :w  a6  [B        RD                  RF                  UR2                  RI                  5       ;  d6  [B        RD                  RF                  UR2                  RK                  5       ;   a#  [L        Ul        U =R                  S-  sl        GMé  GMì  GMï  [        U[        5      (       d  GM  U =R                  S-  sl        GM     [        U R                   5      S:”  a6  [        U R                   S   [        5      (       a  SU R                   S   l        [        U R                   5      S:”  a6  [        U R                   S   [        5      (       a  SU R                   S   l        U R                   S S   H•  n[        U[(        5      (       d  M  UR
                  RN                  (       a  M7  UR                  S:X  d  MI  [P        Ul        U =R                  S-  sl        URR                  SL d  Mz  U R                   RU                  U5        M—     g )Nr   r1   rz   ÚMenunameÚ	SeparatoréÿÿÿÿFÚMergeÚfilesÚallÚmenusT)+r/   r6   r@   ÚsortÚsetr;   ÚorderÚaddrš   r|   r   r5   rL   rs   r}   ÚinlineÚmerge_inliner<   rr   r   r*   r#   ÚDELETEDr.   Ú	MenuEntryr   ÚgetNoDisplayÚ
NO_DISPLAYÚ	getHiddenÚHIDDENÚ
getTryExecÚfindTryExecÚNO_EXECÚxdgÚConfigÚwindowmanagerÚgetOnlyShowInÚgetNotShowInÚNOT_SHOW_INÚ
show_emptyÚEMPTYr4   Úremove)rB   rS   Ú	_submenusÚ_entriesr¢   Ú	separatorrv   rn   s           r   r    Ú	Menu.sortï   sP  € ØˆŒØˆŒà—}”}ˆGØ�L‰LŽNñ %ô “Eˆ	Ü“5ˆà—[‘[×&Ô&ˆEØ�Q‰x˜:Ó%Ø—‘˜U 1™XÖ&Ø�q‘˜ZÕ'Ø—‘˜e A™hÖ'ñ	 'ð —[‘[×&Õ&ˆEØ�Q‰x˜;Ó&Ü% d›O�	Ü�t—|‘|Ó$ qÓ(¬Z¸¿¹ÀRÑ8HÌ)×-TÑ-TØ%*�I”NØ—‘×#Ñ# IÖ.Ø�q‘˜ZÓ'Ø ×-Ñ-¨e°A©hÓ7�	ÞØ—L‘L×'Ñ'¨	Ö2ñ à�q‘˜ZÓ'ØŸ,™, u¨Q¡xÓ0�ÞØ—~‘~×,×,Ø×)Ñ)¨'×2àŸ™×+Ñ+¨G×4ò	 ð
 �q‘˜WÖ$Ø˜‘8˜wÓ&¨%°©(°eÓ*;Ø×$Ñ$×)Ñ)Ô+Ø%)×%5Ô%5˜	Ø$×2Ñ2¸(ÕBØ ŸL™L×/Ñ/°	Ö:ô &6ð ˜1‘X Ó(¨E°!©H¸Ö,=Ø—M‘M×&Ñ&Ô(Ø#'§=¤=˜Ø"Ÿ<™<¨yÕ8Ø&Ÿ~™~×4×4Ø $× 1Ñ 1°'Ö :à $§¡× 3Ñ 3°GÖ <ô $1ñ3 'ðB —\•\ˆEØˆEŒJØ�LŠL˜AÑ�LÜ˜%¤×&Ñ&Ø—=‘= DÒ(Ü!(�E”JØ—L’L AÑ%—LÜ §¡´×;Ñ;Ø—‘×3Ñ3×@Ñ@×BÑBÜ%/˜œ
ØŸš¨Ñ)ŸØŸ™×5Ñ5×?Ñ?×AÑAÜ%+˜œ
ØŸš¨Ñ)Ÿ˜ò Bò	 <ô ˜E¤9×-Ò-Ø×%Ñ%×2Ñ2×4Ñ4Ü!+�E”JØ—L’L AÑ%—L�LØ×'Ñ'×1Ñ1×3Ñ3Ü!'�E”JØ—L’L AÑ%—L�LØ×'Ñ'×2Ñ2×4Ñ4¸U×=OÑ=O×=[Ñ=[×=]Ñ=]Ü!(�E”JØ—L’L AÑ%—L�LÜ—Z‘Z×-×-Ø×*Ñ*×8Ñ8Ó:¸bÓ@ÜŸJ™J×4Ñ4¸E×<NÑ<N×<\Ñ<\Ó<^Ó^ô Ÿ
™
×0Ñ0°E×4FÑ4F×4SÑ4SÓ4UÓUä%0˜œ
ØŸš¨Ñ)Ÿ˜ò Vò .ô ˜E¤9×-Ô-Ø—’ Ñ!—�ñE "ôH ˆt�|‰|Ó˜qÓ Ü˜$Ÿ,™, q™/¬9×5Ñ5Ø',�—‘˜Q‘Ô$Üˆt�|‰|Ó˜qÓ Ü˜$Ÿ,™, rÑ*¬I×6Ñ6Ø(-�—‘˜RÑ Ô%ð —\‘\¡!“_ˆEÜ˜%¤×&Ó&¨u¯|©|×/F×/FÑ/FÈ5Ï=É=Ð\]ÕK]Ü"�”
Ø—’ Ñ!•Ø—>‘> TÔ)Ø—L‘L×'Ñ'¨Ö.ò %r   c                 óª   • U R                    H  nX!:X  d  M
  X!-  n  g    U R                   R                  U5        Xl        U R                  S-   Ul        g )Nrz   )r@   rL   r3   r2   )rB   ÚnewmenurS   s      r   rM   ÚMenu.addSubmenuT  sI   € Ø—}”}ˆGØÕ!ØÑ"�Ùñ %ð
 �M‰M× Ñ  Ô)Ø!ŒNØ ŸJ™J¨™NˆG�Mr   c                 ó´  • [        UR                  5      S:X  aÁ  UR                  R                  (       a¦  UR                  S   nUR                  R                  SUR                  5       SS9  UR                  R                  SUR                  5       SS9  UR                  R                  SUR                  5       SS9  U R                  R                  U5        g[        UR                  5      UR                  R                  ::  d  UR                  R                  S:X  aœ  UR                  R                  (       aR  [        UR                  5       UR                  5       UR                  5       5      nU R                  R                  U5        UR                   H  nU R                  R                  U5        M      gU R                  R                  U5        g)	zmAppends a submenu's entries to this menu
See the <Menuname> section of the spec about the "inline" attribute
rz   r   r   T)r   ÚGenericNameÚCommentN)r|   r/   r;   Úinline_aliasr   r¡   rX   r�   r“   rL   Úinline_limitÚinline_headerÚHeader)rB   rS   rv   Úheaderrn   s        r   r¥   ÚMenu.merge_inline_  sS  € ô ˆw�‰Ó 1Ó$¨¯©×)D×)DØŸ™¨Ñ*ˆIØ×"Ñ"×&Ñ& v¨w¯©Ó/@ÈÐ&ÑNØ×"Ñ"×&Ñ& }°g×6LÑ6LÓ6NÐW[Ð&Ñ\Ø×"Ñ"×&Ñ& y°'×2DÑ2DÓ2FÈtÐ&ÑTØ�L‰L×Ñ 	Õ*Ü�—‘Ó! W§^¡^×%@Ñ%@Ó@ÀGÇNÁN×D_ÑD_ÐcdÓDdØ�~‰~×+×+Ü §¡Ó 1°7×3IÑ3IÓ3KÈW×M_ÑM_ÓMaÓb�Ø—‘×#Ñ# FÔ+Ø Ÿœ�Ø—‘×#Ñ# EÖ*ò )ð �L‰L×Ñ Õ(r   )r7   r8   r#   r2   r9   r.   r:   r0   r/   r1   r;   r<   r=   r   r4   r>   r3   r?   r5   r@   r6   N©F)FF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rC   rH   rT   rZ   r^   rc   rj   ro   rs   r}   rŠ   rX   r�   r“   r–   r    rM   r¥   Ú__static_attributes__© r   r   r*   r*   D   sn   † ñòò8òòD?ò(ò#ò+ð ôô:ò#ôò*òòòòb/ðH ò+õ)r   r*   c                   ó(   • \ rS rSrSrSS jrS rSrg)ÚMoveis  zA move operationc                 ó   • Xl         X l        g rF   )ÚOldÚNew)rB   ÚoldÚnews      r   rC   ÚMove.__init__u  s   € ØŒØ�r   c                 óB   • [        U R                  UR                  5      $ rF   )ÚcmprÓ   rY   s     r   rZ   ÚMove.__cmp__y  s   € Ü�4—8‘8˜UŸY™YÓ'Ð'r   )rÔ   rÓ   N©r-   r-   )rÉ   rÊ   rË   rÌ   rÍ   rC   rZ   rÎ   rÏ   r   r   rÑ   rÑ   s  s   † Ùôõ(r   rÑ   c                   óZ   • \ rS rSrSr  SS jr\S 5       r\R                  S 5       rSr	g)	r;   i}  zMenu Layout classc                 óh   • Xl         X l        X0l        X@l        XPl        / U l        SS/SS//U l        g )Nrœ   rŸ   r�   )rµ   r¤   rÃ   rÄ   rÂ   Ú_orderÚ_default_order)rB   rµ   r¤   rÃ   rÄ   rÂ   s         r   rC   ÚLayout.__init__  s?   € à$ŒØŒØ(ÔØ*ÔØ(ÔØˆŒà�gÐØ�gÐð
ˆÕr   c                 óT   • U R                   (       a  U R                   $ U R                  $ rF   )rÞ   rß   rA   s    r   r¢   ÚLayout.orderŒ  s   € à"ŸkŸkˆt�{‰{ÐB¨t×/BÑ/BÐBr   c                 ó   • Xl         g rF   )rÞ   )rB   r¢   s     r   r¢   râ   �  s   € à�r   )rß   rÞ   r¤   rÂ   rÄ   rÃ   rµ   N)FFr
   TF)
rÉ   rÊ   rË   rÌ   rÍ   rC   Úpropertyr¢   ÚsetterrÎ   rÏ   r   r   r;   r;   }  s>   † ÙØDEØ27ô
ð ñCó ðCð ‡\�\ñó ór   r;   c                   óD   • \ rS rSrSrSu  rr\S 5       rS r	S r
S rSrg	)
ÚRulei•  zInclude / Exclude Rules Class©r   rz   c                 óˆ  • [         R                  " [         R                  " [         R                  " U5      [         R                  " 5       /[         R
                  " [         R                  " S[         R                  " 5       S9S[         R                  " 5       S9/S9SSS9n[         R                  " U5        [        X5      nU$ )	Nrv   r   rr   ©ÚvalueÚattrr   ©ÚleftÚopsÚcomparatorsrz   r   )ÚbodyÚlinenoÚ
col_offset)
r   Ú
ExpressionÚCompareÚStrÚEqÚ	Attributer   r   Úfix_missing_locationsrç   )ÚclsÚtypeÚfilenameÚtreerQ   s        r   ÚfromFilenameÚRule.fromFilenameš  sŠ   € ä�~Š~Ü—’Ü—W’W˜XÓ&Ü—V’V“X�JÜ Ÿ]š]ÜŸ(š( k´s·x²x³zÑBØ(ÜŸš›
ñð ñð  ñ
ˆô 	×!Ò! $Ô'Ü�DÓˆØˆr   c                 óT   • Xl         X l        [        U R                  SS5      U l        g )Nz<compiled-menu-rule>Úeval)ÚTypeÚ
expressionÚcompileÚcode)rB   rû   r  s      r   rC   ÚRule.__init__¬  s!   € àŒ	à$ŒÜ˜DŸO™OÐ-CÀVÓLˆ�	r   c                 óB   • [         R                  " U R                  5      $ rF   )r   Údumpr  rA   s    r   rH   ÚRule.__str__³  s   € Ü�xŠx˜Ÿ™Ó(Ð(r   c                 ó  • U Hy  nUS:X  a   UR                   SL d  UR                  SL a  M)  [        U R                  5      (       d  ME  U R                  [
        R                  L a  SUl        SUl         Mr  SUl        M{     U$ )Né   TF)ÚMatchedIncludeÚ	Allocatedr  r  r  rç   ÚTYPE_INCLUDEÚAdd)rB   ÚmenuentriesÚrunrv   s       r   ÚapplyÚ
Rule.apply¶  sn   € Û$ˆIØ�a‹x˜Y×5Ñ5¸Ò=Ø&×0Ñ0°DÒ8ÙÜ�D—I‘I�‹Ø—9‘9¤× 1Ñ 1Ò1Ø$(�I”MØ/3�IÖ,à$)�I–Mñ %ð Ðr   )r  r  r  N)rÉ   rÊ   rË   rÌ   rÍ   r  ÚTYPE_EXCLUDEÚclassmethodrþ   rC   rH   r  rÎ   rÏ   r   r   rç   rç   •  s1   † Ù'à!%Ñ€L�,àñó ðò"Mò)õr   rç   c                   ót   • \ rS rSrSrSrSrSrSS jrS r	S r
S	 rSS
 jrS rS rS rS rS rS rS rSrg)r§   iÄ  z(Wrapper for 'Menu Style' Desktop EntriesÚUserÚSystemÚBothc                 ó  • [        [        R                  R                  X!5      5      U l         U R	                  XU5        SU l        S U l        / U l        SU l        SU l	        SU l
        U R                   R                  5       U l        g ©NTF)r   r„   r~   r…   ÚsetAttributesr5   ÚOriginalÚParentsr  r  r  ÚgetCategoriesÚ
Categories©rB   rü   rO   Úprefixs       r   rC   ÚMenuEntry.__init__Ë  su   € ä(¬¯©¯©°cÓ)DÓEˆÔØ×Ñ˜8¨&Ô1ð ˆŒ	ð ˆŒØˆŒð ˆŒØˆŒØ#ˆÔð ×+Ñ+×9Ñ9Ó;ˆ�r   c                 óp   • U R                   R                  (       a  U R                   R                  5         gg)z&Save any changes to the desktop entry.N)r   ÚtaintedÚwriterA   s    r   ÚsaveÚMenuEntry.saveß  s(   € à×Ñ×$×$Ø×Ñ×#Ñ#Õ%ð %r   c                 ób   • U R                   R                  R                  U R                  S5      $ )z7Return the directory containing the desktop entry file.r-   )r   rü   Úreplacer1   rA   s    r   ÚgetDirÚMenuEntry.getDirä  s%   € à× Ñ ×)Ñ)×1Ñ1°$·-±-ÀÓDÐDr   c                 ó  • [         R                  R                  (       dV  U R                  (       a  U R                  $ [
        S   U R                  R                  ;   a  U R                  $ U R                  $ U R                  $ )z.Return the type of MenuEntry, System/User/Bothr   )
r¯   r°   Ú	root_moder  Ú	TYPE_BOTHr   r   rü   Ú	TYPE_USERÚTYPE_SYSTEMrA   s    r   ÚgetTypeÚMenuEntry.getTypeè  sY   € ä�z‰z×#×#Ø�}�}Ø—~‘~Ð%Ü˜qÑ! T×%6Ñ%6×%?Ñ%?Ó?Ø—~‘~Ð%à×'Ñ'Ð'à—>‘>Ð!r   c                 ó  • Xl         X0l        [        R                  R	                  X15      R                  SS5      U l        [        R                  R                  U R                  R                  5      (       d  U R                  5         g g )Nry   Ú-)r1   ÚPrefixr„   r~   r…   r*  rr   Úisabsr   rü   Ú_MenuEntry__setFilenamer!  s       r   r  ÚMenuEntry.setAttributesô  s^   € Ø ŒØŒÜŸW™WŸ\™\¨&Ó;×CÑCÀCÈÓMˆÔä�w‰w�}‰}˜T×.Ñ.×7Ñ7×8Ñ8Ø×ÑÕ ð 9r   c                 óÊ   • U R                  5       U R                  :X  aE  [        U R                  U R	                  5       U R
                  5      U l        U R                  5         g g rF   )r2  r1  r§   r1   r+  r6  r  r8  rA   s    r   ÚupdateAttributesÚMenuEntry.updateAttributesü  sE   € Ø�<‰<‹>˜T×-Ñ-Ó-Ü% d§m¡m°T·[±[³]ÀDÇKÁKÓPˆDŒMØ×ÑÕ ð .r   c                 ó–  • [         R                  R                  (       d
  [        S   nO	[        S   nU R                  R                  5       S:X  a!  [        R                  R                  US5      nO [        R                  R                  US5      n[        R                  R                  X R                  5      U R                  l
        g )Nr   rz   ÚApplicationÚapplicationsúdesktop-directories)r¯   r°   r.  r   r   r2  r„   r~   r…   r1   rü   )rB   r~   Údir_s      r   Ú__setFilenameÚMenuEntry.__setFilename  s‚   € Ü�z‰z×#×#Ü  Ñ#‰Dä  Ñ#ˆDà×Ñ×$Ñ$Ó&¨-Ó7Ü—7‘7—<‘<  nÓ5‰Dä—7‘7—<‘< Ð&;Ó<ˆDä%'§W¡W§\¡\°$¿¹Ó%Fˆ×ÑÕ"r   c                 ó�   • [         R                  " U R                  R                  5       UR                  R                  5       5      $ rF   )r   rW   r   rX   rY   s     r   rZ   ÚMenuEntry.__cmp__  s1   € Ü�~Š~˜d×/Ñ/×7Ñ7Ó9¸5×;MÑ;M×;UÑ;UÓ;WÓXÐXr   c                 óH   • [        U R                  R                  5       5      $ r]   )r"   r   rX   rA   s    r   r^   ÚMenuEntry._key  s   € ä˜×)Ñ)×1Ñ1Ó3Ó4Ð4r   c                 ój   •  UR                  5       nU R                  5       U:  $ ! [         a     Nf = frF   ra   rY   s     r   rc   ÚMenuEntry.__lt__  re   rf   c                 ó8   • U R                   [        U5      :X  a  ggr  )rr   ri   rY   s     r   rj   ÚMenuEntry.__eq__  s   € Ø×Ñ¤ U£Ó+Øàr   c                 ó   • U R                   $ rF   )rr   rA   s    r   Ú__repr__ÚMenuEntry.__repr__"  s   € Ø×!Ñ!Ð!r   )r  r  r   r   rr   r1   r  r  r  r6  r5   NrÛ   )rÉ   rÊ   rË   rÌ   rÍ   r0  r1  r/  rC   r'  r+  r2  r  r;  r8  rZ   r^   rc   rj   rM  rÎ   rÏ   r   r   r§   r§   Ä  sS   † Ù.à€IØ€KØ€Iô<ò(&ò
Eò
"ô!ò!ò
GòYò5ò#òõ"r   r§   c                   ó   • \ rS rSrSrS rSrg)rš   i&  z!Just a dummy class for Separatorsc                 ó   • Xl         SU l        g )NT©r3   r5   )rB   rˆ   s     r   rC   ÚSeparator.__init__(  s   € ØŒØˆ�	r   rQ  N)rÉ   rÊ   rË   rÌ   rÍ   rC   rÎ   rÏ   r   r   rš   rš   &  s
   † Ù'õr   rš   c                   ó$   • \ rS rSrSrS rS rSrg)rÅ   i-  zClass for Inline Headersc                 ó(   • Xl         X l        X0l        g rF   )r   rÀ   rÁ   )rB   r   Úgeneric_nameÚcomments       r   rC   ÚHeader.__init__/  s   € ØŒ	Ø'ÔØ�r   c                 ó   • U R                   $ rF   rG   rA   s    r   rH   ÚHeader.__str__4  rJ   r   )rÁ   rÀ   r   N)rÉ   rÊ   rË   rÌ   rÍ   rC   rH   rÎ   rÏ   r   r   rÅ   rÅ   -  s   † Ùòõ
r   rÅ   rè   c                 ó  • [         R                  R                  U5      n[         R                  R                  U 5      (       d  [         R                  R	                  X05      n [         R                  R                  U 5      n [         R                  R                  U 5      (       d  gU[        :X  a&  [         R                  R                  U 5      (       a  U $ U[        :X  a&  [         R                  R                  U 5      (       a  U $ g©NF)r„   r~   Údirnamer7  r…   ÚabspathÚexistsÚTYPE_DIRÚisdirÚ	TYPE_FILEÚisfile)rë   rü   rû   r~   s       r   Ú_check_file_pathrc  ;  s¢   € Ü�7‰7�?‰?˜8Ó$€DÜ�7‰7�=‰=˜×ÑÜ—‘—‘˜TÓ)ˆÜ�G‰G�O‰O˜EÓ"€EÜ�7‰7�>‰>˜%× Ñ ØØŒxÓœBŸG™GŸM™M¨%×0Ñ0ØˆØŒyÓœRŸW™WŸ^™^¨E×2Ñ2ØˆØr   c                 ó"  • [        [        5      n[        R                  R                  SL a  UR                  S5        U HL  n[        R                  R                  USU 5      n[        R                  R                  U5      (       d  MJ  Us  $    g )NTr   rŸ   )
Úlistr   r¯   r°   r.  rƒ   r„   r~   r…   rb  )rü   ÚdirsÚdÚmenunames       r   Ú_get_menu_file_pathri  I  sa   € Ü”Ó €DÜ
‡z�z×Ñ˜tÒ#Ø�‰�ŒÛˆÜ—7‘7—<‘<  7¨HÓ5ˆÜ�7‰7�>‰>˜(×#Ó#ØŠOò r   c                 óV   • [        U [        5      (       a  U $ U R                  5       S:H  $ )NÚtrue)r   ÚboolÚlower)rë   s    r   Ú_to_boolrn  S  s%   € Ü�%œ×ÑØˆØ�;‰;‹=˜FÑ"Ð"r   c                 ó¤   • 0 nU R                  5         U  Vs/ s H  o"U;  d  M
  UR                  X"5      PM     n nU R                  5         U $ s  snf rF   )r‚   Ú
setdefault)Ú_listÚ_setÚes      r   Ú_dedupert  Z  sH   € Ø€DØ	‡M�M„OÙ,1ÓCªE q¸d±]Ó"ˆT�_‰_˜QÖ"©E€EÐCØ	‡M�M„OØ€Lùò Ds
   —	A¤Ac                   ó°   • \ rS rSrSS jrSS jrS rSS jrS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ÚXMLMenuBuilderib  c                 ó   • Xl         g rF   )Údebug)rB   rx  s     r   rC   ÚXMLMenuBuilder.__init__d  s   € Ø�
r   Nc                 ó`  • U(       a/  [         R                  R                  U5      (       d  [        U5      nU(       dc  [         R                  R                  SS5      S-   n[        U5      nU(       d.  [         R                  R                  SS5      S-   n[        U5      nU(       d  [        SSW-  5      eUR                  S5      (       d  [        SU5      e [        R                  " U5      n[        5       U l        [        5       U l        [        5       U l        U R                  UR!                  5       U5      nX4l        Xl        U R'                  U5        U R)                  U5        U R+                  U5        U R-                  U5        UR/                  5         U$ !   [        S	U5      e= f)
z‹Load an applications.menu file.

filename : str, optional
  The default is ``$XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu``.
ÚXDG_MENU_PREFIXr-   úapplications.menuzdebian-menu.menuúFile not foundz/etc/xdg/menus/%sú.menuzNot a .menu fileúNot a valid .menu file)r„   r~   r7  ri  ÚenvironÚgetr   ÚendswithÚetreeÚparser¡   Ú_merged_filesÚ_directory_dirsÚMenuEntryCacheÚcacheÚ
parse_menuÚgetrootrý   rü   Úhandle_movesÚ
post_parseÚgenerate_not_only_allocatedÚgenerate_only_allocatedr    )rB   rü   Ú	candidaterý   Úmenus        r   r„  ÚXMLMenuBuilder.parseg  sa  € ö œBŸG™GŸM™M¨(×3Ñ3Ü*¨8Ó4ˆHæô Ÿ
™
Ÿ™Ð'8¸"Ó=Ð@SÑSˆIÜ*¨9Ó5ˆHö ÜŸJ™JŸN™NÐ+<¸bÓAØ+=ñ>�	ä.¨yÓ9�ÞÜÐ/Ð1DÀyÑ1PÓQÐQà× Ñ  ×)Ñ)ÜÐ1°8Ó<Ð<ð	CÜ—;’;˜xÓ(ˆDô
 !›UˆÔÜ"›uˆÔÜ#Ó%ˆŒ
à�‰˜tŸ|™|›~¨xÓ8ˆØŒ	Ø Œà×Ñ˜$ÔØ�‰˜Ôð 	×(Ñ(¨Ô.Ø×$Ñ$ TÔ*ð 	�	‰	Œàˆøð-	CÜÐ7¸ÓBÐBús   ÃF ÆF-c                 ó>   • [        5       nU R                  XU5        U$ rF   )r*   Ú
parse_node)rB   Únoderü   r�  s       r   r‰  ÚXMLMenuBuilder.parse_menu�  s   € Ü‹vˆØ�‰˜¨Ô-Øˆr   c                 ó   • [        U5      nU GHü  nUR                  UR                  pvU(       a  UR                  5       OS nUS:X  a$  U R	                  XR5      nUR                  U5        M^  US:X  a  U(       a  U R                  XrU5        M  US:X  a  U R                  X#5        M˜  US:X  a  U(       a  U R                  XrU5        M¹  US:X  a  U R                  X#5        MÒ  US:X  a  U(       a  Xsl
        Mç  US:X  a%  U(       a  UR                  R                  U5        GM  US:X  a
  S	Ul        GM"  US
:X  a
  SUl        GM2  US:X  a
  S	Ul        GMB  US:X  a
  SUl        GMR  US:X  d  US:X  a-  UR                  R                  U R!                  U5      5        GM‹  US:X  aU  UR"                  R%                  SS 5      S:X  a  U R'                  SXRU5        GMÇ  U(       a  U R'                  XuX#5        GMã  GMæ  US:X  a  U(       a  U R)                  XuX#5        GM  US:X  a  U R+                  XRU5        GM#  US:X  a-  UR,                  R                  U R/                  U5      5        GMV  US:X  a"  US:”  a  U R1                  U5      Ul        GM{  GM~  US:X  a"  US:”  a  U R1                  U5      Ul        GM£  GM¦  US:X  a6  U(       a/  U R7                  XuR"                  R%                  SS5      X#5        GMâ  US:X  d  GMë  U R9                  X#5        GMÿ     g )Nr*   ÚAppDirÚDefaultAppDirsÚDirectoryDirÚDefaultDirectoryDirsr   r.   r>   TÚNotOnlyUnallocatedFr#   Ú
NotDeletedÚIncludeÚExcludeÚ	MergeFilerû   rˆ   r|  ÚMergeDirÚDefaultMergeDirsrÑ   r;   rz   r8   Ú	LegacyDirr"  r-   ÚKDELegacyDirs)r|   ÚtagÚtextÚstripr‰  rM   Úparse_app_dirÚparse_default_app_dirÚparse_directory_dirÚparse_default_directory_dirr   r9   rL   r>   r#   r?   Ú
parse_ruleÚattribr�  Úparse_merge_fileÚparse_merge_dirÚparse_default_merge_dirsr=   Ú
parse_moveÚparse_layoutr;   r8   Úparse_legacy_dirÚparse_kde_legacy_dirs)	rB   r”  rü   rˆ   Únum_childrenÚchildr¤  r¥  r�  s	            r   r“  ÚXMLMenuBuilder.parse_node¢  s  € Ü˜4“yˆÜˆEØŸ	™	 5§:¡:�Þ#'�4—:‘:”<¨TˆDØ�f‹}Ø—‘ uÓ7�Ø×!Ñ! $Ö'Ø˜“¦TØ×"Ñ" 4°6Ö:ØÐ(Ó(Ø×*Ñ*¨8Ö<Ø˜Ó&®4Ø×(Ñ(¨¸Ö@ØÐ.Ó.Ø×0Ñ0°ÖBØ˜“¦4Ø"–Ø˜Ó#®Ø×"Ñ"×)Ñ)¨$×/ØÐ)Ó)Ø)-�×&ØÐ,Ó,Ø).�×&Ø˜	Ó!Ø!%�—Ø˜Ó$Ø!&�—Ø˜	Ó! S¨IÓ%5Ø—‘×#Ñ# D§O¡O°EÓ$:×;Ø˜Ó#Ø—<‘<×#Ñ# F¨DÓ1°XÓ=Ø×)Ñ)Ð*=¸uÐPV×WÞØ×)Ñ)¨$°x×Hò à˜
Ó"¦tØ×$Ñ$ T°(×CØÐ*Ó*Ø×-Ñ-¨e¸v×FØ˜“Ø—‘×#Ñ# D§O¡O°EÓ$:×;Ø˜“Ø !Ó#Ø$(×$5Ñ$5°eÓ$<�F—Mò $à˜Ó'Ø !Ó#Ø+/×+<Ñ+<¸UÓ+C�F×(ò $à˜Ó#®Ø×%Ñ% d¯L©L×,<Ñ,<¸XÀrÓ,JÈH×]Ø˜Ö'Ø×*Ñ*¨8×<òa r   c                 óš  • [        [        UR                  R                  SS5      5      [        UR                  R                  SS5      5      [	        UR                  R                  SS5      5      [        UR                  R                  SS5      5      [        UR                  R                  SS5      5      S	9n/ nU GH  nUR
                  UR                  peU(       a  UR                  5       OS nUS
:X  aÑ  U(       aÊ  UR                  S
U[        UR                  R                  SS5      5      [        UR                  R                  SS5      5      [	        UR                  R                  SS5      5      [        UR                  R                  SS5      5      [        UR                  R                  SS5      5      /5        GM  US:X  a  UR                  S/5        GM&  US:X  a  U(       a  UR                  SU/5        GMI  US:X  d  GMR  UR                  SUR                  R                  SS5      /5        GM‚     X2l	        U$ )Nrµ   Fr¤   rÃ   r
   rÄ   TrÂ   )rµ   r¤   rÃ   rÄ   rÂ   r™   rš   r1   rœ   rû   rž   )
r;   rn  r¬  r�  Úintr¤  r¥  r¦  rL   r¢   )rB   r”  Úlayoutr¢   rµ  r¤  r¥  s          r   r±  ÚXMLMenuBuilder.parse_layoutÖ  sº  € ÜÜ §¡§¡°¸eÓ DÓEÜ˜DŸK™KŸO™O¨H°eÓ<Ó=Ü˜TŸ[™[Ÿ_™_¨^¸QÓ?Ó@Ü" 4§;¡;§?¡?°?ÀDÓ#IÓJÜ! $§+¡+§/¡/°.À%Ó"HÓIñ
ˆð ˆÜˆEØŸ	™	 5§:¡:�Þ#'�4—:‘:”<¨TˆDØ�jÓ ¦TØ—‘ØØÜ˜UŸ\™\×-Ñ-¨l¸EÓBÓCÜ˜UŸ\™\×-Ñ-¨h¸Ó>Ó?Ü˜Ÿ™×(Ñ(¨¸Ó;Ó<Ü˜UŸ\™\×-Ñ-¨o¸tÓDÓEÜ˜UŸ\™\×-Ñ-¨n¸eÓDÓEð÷ ð ˜Ó#Ø—‘˜k˜]×+Ø˜
Ó"¦tØ—‘˜j¨$Ð/×0Ø˜–Ø—‘ØØ—L‘L×$Ñ$ V¨UÓ3ð÷ ñ% ð, ŒØˆr   c                 óÚ   • Su  p#U HW  nUR                   UR                  peU(       a  UR                  5       OS nUS:X  a  U(       a  UnMD  US:X  d  ML  U(       d  MU  UnMY     [        X#5      $ )NrÛ   rÓ   rÔ   )r¤  r¥  r¦  rÑ   )rB   r”  rÕ   rÖ   rµ  r¤  r¥  s          r   r°  ÚXMLMenuBuilder.parse_moveø  s[   € Ø‰ˆÛˆEØŸ	™	 5§:¡:�Þ#'�4—:‘:”<¨TˆDØ�e‹|¦Ø’Ø˜•§$ $Ø’ñ ô �C‹~Ðr   c                 óT  • UR                   S:X  a  [        R                  O[        R                  n[        R
                  " SSS9nU R                  U[        R                  " 5       5      nU(       a  XCl        O[        S5      Ul        [        R                  " U5        [        X#5      $ )Nr�  rz   r   )rò   ró   ÚFalse)r¤  rç   r  r  r   rô   Úparse_bool_opÚOrrñ   r   rù   )rB   r”  rû   rý   Úexprs        r   r«  ÚXMLMenuBuilder.parse_rule  su   € Ø$(§H¡H°	Ó$9Œt× Ò ¼t×?PÑ?PˆÜ�~Š~ Q°1Ñ5ˆØ×!Ñ! $¬¯ª«Ó1ˆÞØ�Iä" 7Ó+ˆDŒIÜ×!Ò! $Ô'Ü�DÓÐr   c                 óÔ   • / nU H.  nU R                  U5      nU(       d  M  UR                  U5        M0     [        U5      nUS:”  a  [        R                  " X#5      $ US:X  a  US   $ g )Nrz   r   )Úparse_rule_noderL   r|   r   ÚBoolOp)rB   r”  ÚoperatorÚvaluesrµ  rQ   Ú
num_valuess          r   r¿  ÚXMLMenuBuilder.parse_bool_op  sg   € ØˆÛˆEØ×'Ñ'¨Ó.ˆDßˆtØ—‘˜dÖ#ñ ô ˜“[ˆ
Ø˜‹>Ü—:’:˜hÓ/Ð/Ø˜1‹_Ø˜!‘9ÐØr   c                 ó  • UR                   nUS:X  a%  U R                  U[        R                  " 5       5      $ US:X  a%  U R                  U[        R                  " 5       5      $ US:X  aX  U R                  U[        R                  " 5       5      nU(       a*  [        R
                  " [        R                  " 5       U5      $ S $ US:X  a  [        S5      $ US:X  a˜  UR                  n[        R                  " [        R                  " U5      [        R                  " 5       /[        R                  " [        R                  " S[        R                  " 5       S9S	[        R                  " 5       S
9/S9$ US:X  a˜  UR                  n[        R                  " [        R                  " U5      [        R                  " 5       /[        R                  " [        R                  " S[        R                  " 5       S9S[        R                  " 5       S
9/S9$ g )NrÀ  ÚAndÚNotÚAllÚTrueÚCategoryrv   r   r   rê   rí   r1   rr   )r¤  r¿  r   rÀ  rË  ÚUnaryOprÌ  r   r¥  rõ   rö   ÚInrø   r   r   r÷   )rB   r”  r¤  rÁ  Úcategoryrü   s         r   rÄ  ÚXMLMenuBuilder.parse_rule_node  su  € Ø�h‰hˆØ�$‹;Ø×%Ñ% d¬C¯FªF«HÓ5Ð5Ø�E‹\Ø×%Ñ% d¬C¯GªG«IÓ6Ð6Ø�E‹\Ø×%Ñ% d¬C¯FªF«HÓ5ˆDÞ37”3—;’;œsŸwšw›y¨$Ó/ÐA¸TÐAØ�E‹\Ü˜fÓ%Ð%Ø�JÓØ—y‘yˆHÜ—;’;Ü—W’W˜XÓ&Ü—V’V“X�JÜ Ÿ]š]ÜŸ(š( k´s·x²x³zÑBØ%ÜŸš›
ñð ñð ð �JÓØ—y‘yˆHÜ—;’;Ü—W’W˜XÓ&Ü—V’V“X�JÜ Ÿ]š]ÜŸ(š( k´s·x²x³zÑBØ(ÜŸš›
ñð ñð ð r   c                 ój   • [        X[        5      nU(       a  UR                  R                  U5        g g rF   )rc  r_  r7   rL   ©rB   rë   rü   rˆ   s       r   r§  ÚXMLMenuBuilder.parse_app_dirA  s(   € Ü  ´(Ó;ˆÞØ�N‰N×!Ñ! %Õ(ð r   c                 ó�   • [        [        5       H3  nU R                  [        R                  R                  US5      X5        M5     g )Nr?  )Úreversedr   r§  r„   r~   r…   ©rB   rü   rˆ   rg  s       r   r¨  Ú$XMLMenuBuilder.parse_default_app_dirF  s0   € Üœ-Ö(ˆAØ×ÑœrŸw™wŸ|™|¨A¨~Ó>ÀÖQò )r   c                 ój   • [        X[        5      nU(       a  UR                  R                  U5        g g rF   )rc  r_  r:   rL   rÕ  s       r   r©  Ú"XMLMenuBuilder.parse_directory_dirJ  s*   € Ü  ´(Ó;ˆÞØ× Ñ ×'Ñ'¨Õ.ð r   c                 ó�   • [        [        5       H3  nU R                  [        R                  R                  US5      X5        M5     g )Nr@  )rØ  r   r©  r„   r~   r…   rÙ  s       r   rª  Ú*XMLMenuBuilder.parse_default_directory_dirO  s1   € Üœ-Ö(ˆAØ×$Ñ$¤R§W¡W§\¡\°!Ð5JÓ%KÈXÖ^ò )r   c                 ó  • UR                   R                  SS 5      S:X  a½  [         H²  nUR                  US5      R	                  S5      nXc:w  d  M+  [         H}  nXW:X  a  M
  [
        R                  R                  [
        R                  R                  Xv5      5      (       d  MM  U R                  [
        R                  R                  Xv5      X$5          M°     M´     g [        X[        5      nU(       a  U R                  XU5        g g )Nrû   rˆ   r-   ry   )r¬  r�  r   r*  r¦  r„   r~   rb  r…   Ú
merge_filerc  ra  )rB   rë   rµ  rü   rˆ   rg  Úrel_fileÚps           r   r­  ÚXMLMenuBuilder.parse_merge_fileU  s¼   € Ø�<‰<×Ñ˜F DÓ)¨XÓ5ß$�Ø#×+Ñ+¨A¨rÓ2×8Ñ8¸Ó=�ØÕ'ß,˜Ø›6Ù$ÜŸ7™7Ÿ>™>¬"¯'©'¯,©,°qÓ*C×DÓDØ ŸO™O¬B¯G©G¯L©L¸Ó,EÀuÔUÚ!ó -ò %ô % U´iÓ@ˆEÞØ—‘ ¨fÕ5ð r   c                 ó   • [        X[        5      nU(       af  [        R                  " U5       HK  n UR	                  S5      (       a1  U R                  [        R                  R                  X5      X$5        MK  MM     g g ! [         a     M^  f = f)Nr~  )	rc  r_  r„   Úlistdirr‚  rà  r~   r…   ÚUnicodeDecodeError)rB   rë   rµ  rü   rˆ   Úitems         r   r®  ÚXMLMenuBuilder.parse_merge_dire  sq   € Ü  ´(Ó;ˆÞÜŸ
š
 5Ö)�ðØ—}‘} W×-Ñ-ØŸ™¬¯©¯©°UÓ(AÀ5ÖQñ .ò *ð øô
 *ó Úðús   ²AA?Á?
BÂBc           	      ó  • [         R                  R                  [         R                  R                  U5      5      S   n[	        [
        5       H8  nU R                  [         R                  R                  USUS-   5      XU5        M:     g )Nr   rŸ   z-merged)r„   r~   ÚsplitextÚbasenamerØ  r   r®  r…   )rB   rµ  rü   rˆ   rë  rg  s         r   r¯  Ú'XMLMenuBuilder.parse_default_merge_dirso  sc   € Ü—7‘7×#Ñ#¤B§G¡G×$4Ñ$4°XÓ$>Ó?ÀÑBˆÜœ/Ö*ˆAØ× Ñ ¤§¡§¡¨a°¸(ÀYÑ:NÓ!OÐQVÐbhÖiò +r   c                 óž  • XR                   ;   a  U R                  (       a  [        SU5      eg U R                   R                  U5         [        R
                  " U5      nUR                  5       nU R                  XQU5        g ! [         a     U R                  (       a  [        SU5      e g   U R                  (       a  [        SU5      e g = f)Nz Infinite MergeFile loop detectedr}  r  )	r…  rx  r   r£   rƒ  r„  ÚIOErrorrŠ  r“  )rB   rü   rµ  rˆ   rý   Úroots         r   rà  ÚXMLMenuBuilder.merge_filet  s©   € à×)Ñ)Ó)Ø�z�zÜ"Ð#EÀxÓPÐPàØ×Ñ×Ñ˜xÔ(ð	Ü—;’;˜xÓ(ˆDð �|‰|‹~ˆØ�‰˜¨Õ/øô ó 	Ø�z�zÜ"Ð#3°XÓ>Ð>áð	Ø�z�zÜ"Ð#;¸XÓFÐFáús   Á
B Â'CÂ,Cc                 ó@   • U R                  XX45      nU(       a  XE-  ng g rF   )Úmerge_legacy_dir)rB   rA  r"  rü   rˆ   Úms         r   r²  ÚXMLMenuBuilder.parse_legacy_dirŽ  s#   € Ø×!Ñ! $°ÓAˆÞØ‰K‰Fð r   c           	      ó²  • [        X[        5      nU(       Ga-  XR                  ;  Ga  U R                  R                  U5        [	        5       nUR
                  R                  U5        UR                  R                  U5        [        R                  R                  U5      Ul        SUl        [        R                  " U5       Hª  n US:X  a  UR                  R                  U5        M'  [        R                  R                  [        R                  R!                  X5      5      (       aB  UR#                  U R%                  [        R                  R!                  X5      UUU5      5        Mª  M¬     U R(                  R+                  U/US5        U R(                  R-                  U/S5      nU H�  nUR.                  n	[1        U	5      S:X  aI  [2        R5                  [2        R6                  UR8                  5      n
UR:                  R                  U
5        XR
                  ;  d  Mx  U	R                  S5        X˜l        M‘     U$ g g ! [&         a     GM�  f = f)NTz
.directoryFr   ÚLegacy)rc  r_  r†  r£   r*   r7   rL   r:   r„   r~   rë  r   r4   rå  r9   r`  r…   rM   rò  ræ  rˆ  Úadd_menu_entriesÚget_menu_entriesr   r|   rç   rþ   r  rr   r?   )rB   rA  r"  rü   rˆ   ró  rç  r  rv   Ú
categoriesÚrs              r   rò  ÚXMLMenuBuilder.merge_legacy_dir“  sÄ  € Ü ´Ó9ˆß�D× 4Ñ 4Ô4Ø× Ñ ×$Ñ$ TÔ*Ü“ˆAØ�I‰I×Ñ˜TÔ"Ø�O‰O×"Ñ" 4Ô(Ü—W‘W×%Ñ% dÓ+ˆAŒFØˆAŒJäŸ
š
 4Ö(�ðØ˜|Ó+ØŸ™×,Ñ,¨TÖ2ÜŸ™Ÿ™¤r§w¡w§|¡|°DÓ'?×@Ñ@ØŸ™ T×%:Ñ%:ÜŸG™GŸL™L¨Ó4Ø"Ø$Ø"ó	&ö ñ Añ	 )ð �J‰J×'Ñ'¨¨°¸Ô=ØŸ*™*×5Ñ5°t°f¸eÓDˆKã(�	Ø&×1Ñ1�
Ü�z“? aÓ'Ü×)Ñ)¬$×*;Ñ*;¸Y×=TÑ=TÓU�AØ—G‘G—N‘N 1Ô%ØŸ~™~Õ-Ø×%Ñ% hÔ/Ø+5Ö(ñ )ð ˆHðE 5ˆ4øô& *ó Ûðús   Ã	!IÃ,BIÉ
IÉIc                 ó2  •  [         R                  " / SQ[         R                  SS9nUR                  5       S   R	                  5       n US   R                  S5       H  nU R                  USX5        M     g ! [
         a     g f = f! [         a     g f = f)N)z
kde-configz--pathÚappsT)ÚstdoutÚuniversal_newlinesr   Ú:Úkde)	Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
splitlinesÚOSErrorr{   r²  Ú
IndexError)rB   rü   rˆ   ÚprocÚoutputrA  s         r   r³  Ú$XMLMenuBuilder.parse_kde_legacy_dirs¹  s—   € ð		Ü×#Ò#Ú0Ü!—‘Ø#'ñˆDð
 ×%Ñ%Ó'¨Ñ*×5Ñ5Ó7ˆFð	Ø˜q™	Ÿ™¨Ö,�Ø×%Ñ% d¨E°8ÖDò -øô	 ó 	áð	ûô ó 	Ùð	ús$   ‚AA9 Á
.B	 Á9
BÂBÂ	
BÂBc                 ó†  • UR                   c  SUl         UR                  c  SUl        UR                  (       a  UR                  (       dÕ  UR                  (       a  UR                  Ul        O²UR                  (       a<  UR                  S:”  a  UR
                  R                  Ul        Ou[        5       Ul        OeUR                  S:”  a7  UR
                  R                  Ul        UR
                  R                  Ul        O[        5       Ul        [        5       Ul        UR                  S:”  aP  UR
                  R                  UR                  -   Ul        UR
                  R                  UR                  -   Ul        [        UR                  5      Ul	        [        UR                  5      Ul        [        UR                  5      Ul        UR                   H  nU R                  U5        M     UR                  R                  5         UR                  R                  5         UR                  R                  5         UR                   Hò  nUR                   HÌ  n[        R                  R                  [        R                  R!                  XC5      5      (       d  MF  [#        X45      nUR$                  (       d  XQl        Mj  UR'                  5       ["        R(                  :X  d  MŽ  UR$                  R'                  5       ["        R*                  :X  d  M¼  XQR$                  l        MÎ     UR$                  (       d  Mò    g    g )NFr   )r#   r>   r;   r8   r2   r3   r7   r:   rt  r9   r@   rŒ  r‚   r„   r~   rb  r…   r§   r.   r2  r1  r0  r  )rB   r�  rS   rP   rO   rv   s         r   rŒ  ÚXMLMenuBuilder.post_parseÊ  s-  € à�<‰<ÑØ ˆDŒLØ×ÑÑ'Ø#(ˆDÔ ð �{�{ $×"4×"4Ø×!×!Ø"×0Ñ0�•Ø——Ø—:‘: “>Ø)-¯©×)BÑ)B�DÕ&ä)/«�DÕ&à—:‘: “>Ø"&§+¡+×";Ñ";�D”KØ)-¯©×)BÑ)B�DÕ&ä"(£(�D”KÜ)/«�DÔ&ð �:‰:˜‹>ØŸ;™;×.Ñ.°·±Ñ=ˆDŒLØ!%§¡×!:Ñ!:¸T×=OÑ=OÑ!OˆDÔô # 4×#3Ñ#3Ó4ˆÔÜ$ T×%7Ñ%7Ó8ˆÔÜ˜tŸ|™|Ó,ˆŒð —}”}ˆGØ�O‰O˜GÖ$ñ %ð 	×Ñ× Ñ Ô"Ø×Ñ×"Ñ"Ô$Ø�‰×ÑÔð ×)Ô)ˆIØ×)Ô)�Ü—7‘7—>‘>¤"§'¡'§,¡,¨sÓ">×?Ó?Ü )¨)Ó 9�IØŸ>Ÿ>Ø)2žØ"×*Ñ*Ó,´	×0EÑ0EÕEØŸ>™>×1Ñ1Ó3´y×7JÑ7JÕJØ6?ŸN™NÖ3ñ *ð �~�~‰~Ùò *r   c                 ó  • UR                    H  nU R                  U5        M     UR                  SL aÎ  U R                  R	                  UR
                  5        / nUR                   H8  nUR                  U R                  R                  UR
                  5      S5      nM:     U HX  nUR                  SL d  M  UR                  R                  U5        SUl	        SUl        UR                  R                  U5        MZ     g g )NFrz   T)r@   r�  r>   rˆ  r÷  r7   r?   r  rø  r  r  rL   r  r<   ©rB   r�  rS   r  rQ   rv   s         r   r�  Ú*XMLMenuBuilder.generate_not_only_allocated  sÏ   € Ø—}”}ˆGØ×,Ñ,¨WÖ5ñ %ð ×Ñ 5Ò(Ø�J‰J×'Ñ'¨¯©Ô5ØˆKØŸ
œ
�Ø"Ÿj™j¨¯©×)DÑ)DÀTÇ\Á\Ó)RÐTUÓV’ñ #ó )�	Ø—=‘= DÔ(Ø×%Ñ%×,Ñ,¨TÔ2Ø$)�I”MØ*.�IÔ'Ø×$Ñ$×+Ñ+¨IÖ6ò )ð )r   c                 óê  • UR                    H  nU R                  U5        M     UR                  SL aÀ  U R                  R	                  UR
                  5        / nUR                   H8  nUR                  U R                  R                  UR
                  5      S5      nM:     U HJ  nUR                  SL d  M  UR                  R                  U5        UR                  R                  U5        ML     g g )NTr  )r@   rŽ  r>   rˆ  r÷  r7   r?   r  rø  r  r  rL   r<   r  s         r   rŽ  Ú&XMLMenuBuilder.generate_only_allocated  sÀ   € Ø—}”}ˆGØ×(Ñ(¨Ö1ñ %ð ×Ñ 4Ò'Ø�J‰J×'Ñ'¨¯©Ô5ØˆKØŸ
œ
�Ø"Ÿj™j¨¯©×)DÑ)DÀTÇ\Á\Ó)RÐTUÓV’ñ #ã(�	Ø—=‘= DÔ(Ø×%Ñ%×,Ñ,¨TÔ2ð ×$Ñ$×+Ñ+¨IÖ6ò )ð (r   c                 ó¦  • UR                    H  nU R                  U5        M     UR                   GH  nUR                  UR                  5      nU(       d  M(  UR                  UR
                  5      nUR
                  R                  S5      nS n[        U5      S:”  aƒ  U(       d  UnUR                  US   5      nU(       d;  [        5       nUS   Ul	        [        U5      S:”  a  SUl
        UR                  U5        UnUR                  S5        [        U5      S:”  a  Mƒ  WU-  nUR                  R                   R                  U5        GM     g )Nry   r   rz   T)r@   r‹  r=   r}   rÓ   rÔ   r{   r|   r*   r   r4   rM   rƒ   r3   r·   )	rB   r�  rS   rR   Úmove_from_menuÚmove_to_menurŸ   Ú	oldparentr½   s	            r   r‹  ÚXMLMenuBuilder.handle_moves$  s  € Ø—}”}ˆGØ×Ñ˜gÖ&ñ %ð —J•JˆDØ!Ÿ\™\¨$¯(©(Ó3ˆNßˆ~à#Ÿ|™|¨D¯H©HÓ5�àŸ™Ÿ™ sÓ+�Ø �	Ü˜%“j 1“nÞ$Ø$(˜	Ø'×/Ñ/°°a±Ó9�GÞ"Ü"&£&˜Ø',¨Q¡x˜œÜ˜u›:¨›>Ø/3˜GÔ,Ø!×,Ñ,¨WÔ5Ø '�IØ—I‘I˜a”Lô ˜%“j 1•nð ˜>Ñ)�Ø×%Ñ%×.Ñ.×5Ñ5°n×Eò- r   )r†  r…  rˆ  rx  rÈ   rF   )rÉ   rÊ   rË   rÌ   rC   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   rv  rv  b  s„   † ôô4òlô
2=òh òD	ò	 òò òH)ò
Rò/ò
_ò6ò òjò
0ò4ò
$òLò"6òr7ò"7õ Fr   rv  c                   ó8   • \ rS rSrSrS rS	S jrS rS
S jrSr	g)r‡  iA  zClass to cache Desktop Entriesc                 ó>   • 0 U l         / U R                   S'   0 U l        g )NÚlegacy)ÚcacheEntriesrˆ  rA   s    r   rC   ÚMenuEntryCache.__init__C  s!   € ØˆÔØ&(ˆ×Ñ˜(Ñ#Øˆ�
r   c                 ó|   • U H6  nX@R                   ;  d  M  / U R                   U'   U R                  USX#5        M8     g )Nr-   )r  Ú_MenuEntryCache__addFiles)rB   rf  r"  r  rA  s        r   r÷  ÚMenuEntryCache.add_menu_entriesH  s8   € ÛˆDØ×,Ñ,Õ,Ø*,�×!Ñ! $Ñ'Ø—‘  b¨&Ö9ò r   c                 ó¨  • [         R                  " [         R                  R                  X5      5       GH  nUR	                  S5      (       aq   [        [         R                  R                  X%5      X5      nU R                  U   R                  U5        U(       a   U R                  S   R                  U5        M‰  M‹  [         R                  R                  [         R                  R                  XU5      5      (       d  MÏ  U(       a  MØ  U R                  U[         R                  R                  X%5      X45        GM     g ! [         a     GM  f = f)Nz.desktopr  )r„   rå  r~   r…   r‚  r§   r   r  rL   r`  r  )rB   rA  Úsubdirr"  r  rç  rv   s          r   Ú
__addFilesÚMenuEntryCache.__addFilesN  sâ   € Ü—J’JœrŸw™wŸ|™|¨DÓ9×:ˆDØ�}‰}˜Z×(Ñ(ðÜ )¬"¯'©'¯,©,°vÓ*DÀdÓ S�Ið ×!Ñ! $Ñ'×.Ñ.¨yÔ9ÞØ×%Ñ% hÑ/×6Ñ6°yÖAñ ä—‘—‘œrŸw™wŸ|™|¨D¸$Ó?×@Ó@ÏÈØ—‘ ¤b§g¡g§l¡l°6Ó&@À&×Qò ;øô $ó Ûðús   Á)EÅ
EÅEc                 óz  • / n[        5       nUS S  nU(       a  UR                  S5        SR                  U5      n U R                  U   $ ! [         a     Of = fU HÌ  nU R
                  U    H¶  n UR                  U;  a.  UR                  UR                  5        UR                  U5        MB  UR                  5       [        R                  :X  aA  UR                  U5      n	X9   n
U
R                  5       [        R                  :X  a  XŠl        M£  M¥  M§  ! [         a     M´  f = f   MÎ     X0R                  U'   U$ )Nr  r-   )r¡   rL   r…   rˆ  ÚKeyErrorr  rr   r£   r2  r§   r1  Úindexr0  r  ræ  )rB   rf  r  ÚentriesÚidsÚappdirsÚkeyrA  rv   Úidxrn   s              r   rø  ÚMenuEntryCache.get_menu_entries\  s   € ØˆÜ‹eˆà‘q�'ˆÞØ�N‰N˜8Ô$à�g‰g�gÓˆð	Ø—:‘:˜c‘?Ð"øÜó 	Ùð	úãˆDØ!×.Ñ.¨tÔ4�	ðØ ×.Ñ.°cÓ9ØŸ™ 	× 7Ñ 7Ô8ØŸ™ yÖ1Ø"×*Ñ*Ó,´	×0EÑ0EÓEà%Ÿm™m¨IÓ6˜Ø '¡˜Ø Ÿ=™=›?¬i×.AÑ.AÓAØ-6žNñ Bñ	 Føô *ó Úðúó 5ñ ð "�
‰
�3‰Øˆs*   ¼A Á
AÁAÁ3<DÂ1ADÄ
D$Ä#D$)rˆ  r  N)r-   F)T)
rÉ   rÊ   rË   rÌ   rÍ   rC   r÷  r  rø  rÎ   rÏ   r   r   r‡  r‡  A  s   † Ù$òô
:òR÷r   r‡  c                 ó6   • [        U5      R                  U 5      $ )zQHelper function.
Equivalent to calling xdg.Menu.XMLMenuBuilder().parse(filename)
)rv  r„  )rü   rx  s     r   r„  r„  {  s   € ô ˜%Ó ×&Ñ& xÓ0Ð0r   r[  )1rÍ   r„   r   r  r   r   Úxml.etree.cElementTreerƒ  ÚcElementTreeÚImportErrorÚxml.etree.ElementTreeÚElementTreeÚxdg.BaseDirectoryr   r   Úxdg.DesktopEntryr   Úxdg.Exceptionsr   Úxdg.utilr   Ú
xdg.Localer¯   Ú
xdg.Configr   r"   r¦   r©   r«   r¶   r´   r®   r*   rÑ   r;   rç   r§   rš   rÅ   r_  ra  rc  ri  rn  rt  Úobjectrv  r‡  r„  rÏ   r   r   Ú<module>r:     s
  ðñó& 
Û Û Û 
Û 
ð*ß*Ð*÷ =Ý )Ý 'Ý ã Û ò1òð €Ø€
Ø	€Ø€Ø€Ø
€÷l)ñ l)÷^	(ñ (÷ñ ÷0,ñ ,÷^_"ñ _"÷Dñ ÷ñ ð Ñ €ˆ)òòò#òô\F�Vô \F÷~7ñ 7õt1øðA# ó *ß)Ò)ð*ús   ˜	C ÃCÃC