§
   •Dà¡aYã                   óV  — d Z ddlZddlZddlZddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZddlmZmZ dZej        Zej        ZdZdZdZdZd	Zd
Zedz   Zej                             dd¦  «        ZdZej                             dd¦  «        Z ej                             ddd¦  «        ej                             ddd¦  «        fZ!ej                             ddd¦  «        Z"ej                             dd¦  «        e ej                             ddd¦  «        fe!z   Z#e	j$        fd„Z%d:d„Z&efd„Z'efd„Z(d„ Z)efd„Z*d „ Z+dd!efd"„Z,d!efd#„Z-d$„ Z.efd%„Z/ G d&„ d'e0¦  «        Z1d(„ Z2d)„ Z3d*„ Z4d+„ Z5efd,„Z6ddefd-„Z7efd.„Z8efd/„Z9defd0„Z:d1„ Z;d2„ Z<d3„ Z=d;d4„Z>d:d5„Z?d:d6„Z@d7„ ZAd8„ ZBd:d9„ZCdS )<u/  Install / update the bundled MilionÃ¡Å™ skins and offer to switch to one (docs/plan/skin-milionar/040, 240).

skin.milionar ships in resources/skin.milionar; skin.milionar.modern is composed at install time from it and the
overlay resources/skin.milionar.modern (wcs/skin/compose.py). The service copies each to
special://home/addons/<id>, enables it (silently, over JSON-RPC) and asks once per addon version whether to switch
to the look chosen in the addon settings (`skin_variant`). A symlink at a target is development mode: never touched,
never offered.
é    N)ÚcomposeÚfamilyzplugin.video.milionaru   [MilionÃ¡Å™ Skin]iè}  ié}  é<   é   z#special://xbmc/addons/skin.estuary/zmedia/Textures.xbtÚmediazTextures.xbt)ÚfontsÚextrasr   zNotoSans-MilionarBrand.ttfÚmilionarzlogo.pngzlogo-mark-v1-final.pngÚbrandúmilionar-mark.pngúNotoSans-Regular.ttfr	   Úbackgroundszprimary.jpgc                 ód   — t          j        d                     t          | ¦  «        |¬¦  «         d S )Nz{} {})Úlevel)ÚxbmcÚlogÚformatÚ
LOG_PREFIX)Úmsgr   s     ú`/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/skin/installer.pyÚ_logr   ,   s+   € Ý„HˆW�^Š^�J¨Ñ,Ô,°EÐ:Ñ:Ô:Ð:Ð:Ð:ó    c                 óŒ   — dd| dœ}|�||d<   t          j        t          j        t          j        |¦  «        ¦  «        ¦  «        S )Nz2.0é   )ÚjsonrpcÚidÚmethodÚparams)ÚjsonÚloadsr   ÚexecuteJSONRPCÚdumps)r   r   Úrequests      r   Ú_rpcr$   0   sF   € Ø q°FÐ;Ð;€GØÐØ"ˆ�ÑÝŒ:•dÔ)­$¬*°WÑ*=Ô*=Ñ>Ô>Ñ?Ô?Ð?r   c                 óŽ   — t           j                             t          j        |                      d¦  «        ¦  «        d|¦  «        S )z[The skin's source: the classic tree, or the modern overlay (composed with the classic one).ÚpathÚ	resources)Úosr&   ÚjoinÚxbmcvfsÚtranslatePathÚgetAddonInfo)ÚaddonÚskin_ids     r   Úbundled_dirr/   7   s4   € åŒ7�<Š<�Ô-¨e×.@Ò.@ÀÑ.HÔ.HÑIÔIÈ;ÐX_Ñ`Ô`Ð`r   c                 óP   — t          j        d                     | ¦  «        ¦  «        S )Nzspecial://home/addons/{}©r*   r+   r   ©r.   s    r   Ú
target_dirr3   <   s"   € ÝÔ Ð!;×!BÒ!BÀ7Ñ!KÔ!KÑLÔLÐLr   c                 óì   — 	 t          j        t          j                             | d¦  «        ¦  «                             ¦   «                              d¦  «        S # t          t           j        f$ r Y dS w xY w)z1version attribute of <folder>/addon.xml, or None.ú	addon.xmlÚversionN)	ÚETÚparser(   r&   r)   ÚgetrootÚgetÚOSErrorÚ
ParseError©Úfolders    r   Úread_versionr?   @   sj   € ðÝŒx�œŸš V¨[Ñ9Ô9Ñ:Ô:×BÒBÑDÔD×HÒHÈÑSÔSÐSøÝ•R”]Ð#ð ð ð Øˆtˆtðøøøs   ‚AA ÁA3Á2A3c                 óâ   — t          j        d¦  «        }t          j        |d¬¦  «         t          j                             || dz   ¦  «        t          j                             || dz   ¦  «        fS )Nzspecial://home/temp/T©Úexist_okz.newz.old)r*   r+   r(   Úmakedirsr&   r)   )r.   Ú	temp_roots     r   Ú_staging_pathsrE   H   sb   € ÝÔ%Ð&<Ñ=Ô=€IÝ„K�	 DÐ)Ñ)Ô)Ð)ÝŒG�LŠL˜ G¨fÑ$4Ñ5Ô5ÝŒG�LŠL˜ G¨fÑ$4Ñ5Ô5ð7ð 7r   c           
      ó”  ‡‡— t          | d¦  «        5 Št          j        ‰                     ¦   «         ¦  «        j        }ˆfd„} |d¦  «        dk    rt          d¦  «        ‚t          j        d |d¦  «        ¦  «        \  }|r|t          d|d	z
  ¦  «        d
z  k    rt          d¦  «        ‚t          ¦   «         g }}t          |¦  «        D �]#} |d¦  «                             dd¦  «        d                              ¦   «         }|r||v rt          d¦  «        ‚|                     |¦  «         t          j        d |d¦  «        ¦  «        \  }}|r||‰                     ¦   «         z
  dz  k    rt          d¦  «        ‚t          |¦  «        D ]_}t          j        d |d¦  «        ¦  «        \  }	}
}}}}}|	r|
r|r|r	|||z
  k    rt          d¦  «        ‚|                     ||f¦  «         Œ`�Œ%‰                     ¦   «         Št!          ˆfd„|D ¦   «         ¦  «        rt          d¦  «        ‚	 ddd¦  «         dS # 1 swxY w Y   dS )zåValidate XBTF2 directory/frame bounds without unpacking image payloads.

    Layout follows Kodi 21 XBTFReader: 256-byte names and 40-byte frames.
    Reject truncation and payload offsets into the header or beyond the file.
    Úrbc                 óv   •— ‰                      | ¦  «        }t          |¦  «        | k    rt          d¦  «        ‚|S )Nz truncated native texture archive)ÚreadÚlenÚ
ValueError)ÚlengthÚvalueÚhandles     €r   rI   z_validate_xbt.<locals>.readX   s9   ø€ Ø—K’K Ñ'Ô'ˆEÝ�5‰zŒz˜VÒ#Ð#Ý Ð!CÑDÔDÐDØˆLr   é   s   XBTF2z(invalid native texture archive signaturez<Ié   r   é	   i0  z!invalid native texture file counté   ó    r   z&empty or duplicate native texture namez<IIé   é(   z"invalid native texture frame countz<IIIQQIQzinvalid native texture framec              3   ó*   •K  — | ]\  }}|‰k     V — Œd S ©N© )Ú.0ÚoffsetÚ_Ú
header_ends      €r   ú	<genexpr>z _validate_xbt.<locals>.<genexpr>r   s,   øè è € Ð=Ð=¡y v¨qˆv˜
Ò"Ð=Ð=Ð=Ð=Ð=Ð=r   z&native texture payload overlaps headerN)Úopenr(   ÚfstatÚfilenoÚst_sizerK   ÚstructÚunpackÚmaxÚsetÚrangeÚsplitÚlowerÚaddÚtellÚappendÚany)r&   ÚsizerI   ÚcountÚnamesÚpayloadsr[   ÚnameÚframesÚwidthÚheightÚpackedÚunpackedrZ   rN   r\   s                 @@r   Ú_validate_xbtrw   O   së  øø€ õ 
ˆd�DÑ	Ô	ð G˜VÝŒx˜Ÿš™œÑ(Ô(Ô0ˆð	ð 	ð 	ð 	ð 	ð ˆ4�‰7Œ7�hÒÐÝÐGÑHÔHÐHÝ”˜t T T¨!¡W¤WÑ-Ô-‰ˆØð 	B˜¥ A t¨a¡xÑ 0Ô 0°CÑ 7Ò7Ð7ÝÐ@ÑAÔAÐAÝ™%œ% ˆxˆÝ�u‘”ð 	2ñ 	2ˆAØ�4˜‘9”9—?’? 5¨!Ñ,Ô,¨QÔ/×5Ò5Ñ7Ô7ˆDØð K˜4 5˜=˜=Ý Ð!IÑJÔJÐJØ�IŠI�d‰OŒOˆOÝœ e¨T¨T°!©W¬WÑ5Ô5‰IˆAˆvØð G˜V t¨f¯kªk©m¬mÑ';ÀÑ&BÒBÐBÝ Ð!EÑFÔFÐFÝ˜6‘]”]ð 2ð 2�Ý@FÄÈjÐZ^ÐZ^Ð_aÑZbÔZbÑ@cÔ@cÑ=��v˜q &¨(°A°vØð E Fð E°&ð EÀð EÈFÐUYÐ\bÑUbÒLbÐLbÝ$Ð%CÑDÔDÐDØ—’ ¨Ð 0Ñ1Ô1Ð1Ð1ñ	2ð
 —[’[‘]”]ˆ
ÝÐ=Ð=Ð=Ð=°HÐ=Ñ=Ô=Ñ=Ô=ð 	GÝÐEÑFÔFÐFð	Gð;Gð Gð Gñ Gô Gð Gð Gð Gð Gð Gð Gð Gøøøð Gð Gð Gð Gð Gð Gs   “HH=È=IÉIFc                 ó  — t          j        t          j                             | d¦  «        ¦  «                             ¦   «         }|                     d¦  «        }|                     d¦  «        }|j        dk    s%|                     d¦  «        |k    s|r
|�|�(||k    r"t          d 
                    | ¦  «        ¦  «        ‚|                     d¦  «        }|st          d	¦  «        ‚d
„ |D ¦   «         }|                     d„ |                     d¦  «        D ¦   «         ¦  «         t          |¦  «        D �]:}	|	d 
                    t          ¦  «        k    rnd 
                    t          ¦  «        }
t          j                             t!          j        |
¦  «        ¦  «        s"t          d 
                    |	¦  «        ¦  «        ‚Œ�|	r‡t          j                             |	¦  «        shd|	                     dd¦  «                             d¦  «        v s=t          j                             t          j                             | |	¦  «        ¦  «        s"t          d 
                    |	¦  «        ¦  «        ‚�Œ<|r›t+          t          j                             | t,          ¦  «        ¦  «         t.          D ]a}t          j                             t          j                             | |¦  «        ¦  «        s"t          d 
                    |¦  «        ¦  «        ‚Œb|S )zICheck the manifest and essential declared runtime assets before a rename.r5   r6   z!extension[@point='xbmc.gui.skin']r-   r   Nzinvalid skin manifest at {}Úresz skin manifest has no resolutionsc           	      ó€   — g | ];}d D ]6}t           j                             |                     dd¦  «        |¦  «        ‘Œ7Œ<S ))zHome.xmlzFont.xmlzIncludes.xmlr>   Ú )r(   r&   r)   r:   )rY   ry   Úfilenames      r   ú
<listcomp>z"_validate_skin.<locals>.<listcomp>�   sd   € ð ^ð ^ð ^ØÐ4\ð^ð ^Ø(0õ ŒW�\Š\˜#Ÿ'š' (¨BÑ/Ô/°Ñ:Ô:ð ^ð ^ð ^ð ^r   c              3   ó:   K  — | ]}|j         d v ¯|j        pdV — ŒdS ))ÚiconÚfanartr{   N)ÚtagÚtext)rY   Úassets     r   r]   z!_validate_skin.<locals>.<genexpr>ƒ   sF   è è € ð `ð ` eØ?D¼yÐL^Ð?^Ð?^ð ”Ð!˜rØ?^Ð?^Ð?^Ð?^ð`ð `r   z0extension[@point='xbmc.addon.metadata']/assets/*z-../{}/resources/media/brand/milionar-mark.pngz@special://home/addons/{}/resources/media/brand/milionar-mark.pngzmissing shared skin logo: {}z..ú\ú/z!missing or invalid skin asset: {}zmissing skin runtime file: {})r7   r8   r(   r&   r)   r9   r:   Úfindr�   rK   r   ÚfindallÚextendre   ÚADDON_IDÚisfiler*   r+   ÚisabsÚreplacerg   rw   ÚTEXTURE_ARCHIVEÚRUNTIME_FILES)r>   Úexpected_versionÚrequire_archiver.   Úrootr6   ÚskinÚresolutionsÚpathsr&   ÚsharedÚrelatives               r   Ú_validate_skinr—   v   sÞ  € åŒ8•B”G—L’L ¨Ñ5Ô5Ñ6Ô6×>Ò>Ñ@Ô@€DØ�hŠh�yÑ!Ô!€GØ�9Š9Ð8Ñ9Ô9€DØŒ�GÒÐ˜tŸxšx¨™~œ~°Ò8Ð8ÀÐ8ØˆLÐ-Ð9¸gÐIYÒ>YÐ>YÝÐ6×=Ò=¸fÑEÔEÑFÔFÐFØ—,’,˜uÑ%Ô%€KØð =ÝÐ;Ñ<Ô<Ð<ð^ð ^Ø#ð^ñ ^ô ^€Eà	‡L‚Lð `ð `¨t¯|ª|Ø:ñ0<ô 0<ð `ñ `ô `ñ `ô `ð `å�E‘
”
ð Oñ OˆØÐB×IÒIÍ(ÑSÔSÒSÐSØW×^Ò^Õ_gÑhÔhˆFÝ”7—>’>¥'Ô"7¸Ñ"?Ô"?Ñ@Ô@ð NÝ Ð!?×!FÒ!FÀtÑ!LÔ!LÑMÔMÐMØØð 	O�œŸš dÑ+Ô+ð 	O¨t°t·|²|ÀDÈ#Ñ7NÔ7N×7TÒ7TÐUXÑ7YÔ7YÐ/YÐ/YÝ”G—N’N¥2¤7§<¢<°¸Ñ#=Ô#=Ñ>Ô>ð 0ZåÐ@×GÒGÈÑMÔMÑNÔNÐNñ 0Zð ð SÝ•b”g—l’l 6­?Ñ;Ô;Ñ<Ô<Ð<Ý%ð 	Sð 	SˆHÝ”7—>’>¥"¤'§,¢,¨v°xÑ"@Ô"@ÑAÔAð SÝ Ð!@×!GÒ!GÈÑ!QÔ!QÑRÔRÐRðSà€Nr   c                 ón   — 	 t          | ||¬¦  «        S # t          t          j        t          f$ r Y d S w xY w)N©r�   r.   )r—   r;   r7   r<   rK   )r>   r�   r.   s      r   Ú_valid_skinrš   –   sG   € ðÝ˜f°oÈwÐWÑWÔWÐWøÝ•R”]¥JÐ/ð ð ð Øˆtˆtðøøøs   ‚ ”4³4c                 óV  — t           j                             | ¦  «        s>t           j                             | ¦  «        r5t           j                             | ¦  «        st          j        | ¦  «         d S t           j                             | ¦  «        rt          j        | ¦  «         d S d S rW   )r(   r&   ÚislinkÚlexistsÚisdirÚunlinkÚshutilÚrmtreer=   s    r   Ú_remove_treer¢   �   s�   € Ý	„w‡~‚~�fÑÔð ¥"¤'§/¢/°&Ñ"9Ô"9ð Å"Ä'Ç-Â-ÐPVÑBWÔBWð Ý
Œ	�&ÑÔÐÐÐÝ	Œ�Š�vÑ	Ô	ð ÝŒ�fÑÔÐÐÐðð r   c                 ó$  — t          |¦  «        \  }}t          | |¬¦  «        rdS |df|dffD ]a\  }}t          |||¬¦  «        rJt          | ¦  «         t          j        || ¦  «         t          d                     ||¦  «        ¦  «          dS ŒbdS )zKLegacy targets/backups remain recoverable; fresh stages require native XBT.r2   FTr™   zrecovered {} from {})rE   rš   r¢   r(   Úrenamer   r   )Útargetr.   ÚstagedÚretiredÚ	candidater�   s         r   Ú_recover_swapr©   ¤   s¸   € å$ WÑ-Ô-�O€FˆGÝ�6 7Ð+Ñ+Ô+ð ØˆuØ(/°Ð'7¸&À$¸Ð&Hð ð Ñ"ˆ	�?Ý�y°/È7ÐSÑSÔSð 	Ý˜Ñ Ô Ð ÝŒI�i Ñ(Ô(Ð(ÝÐ'×.Ò.¨w¸	ÑBÔBÑCÔCÐCØ�4�4ð		ð
 ˆ5r   c                   ó   — e Zd ZdS )Ú_InstallAbortedN)Ú__name__Ú
__module__Ú__qualname__rX   r   r   r«   r«   ²   s   € € € € € Ø€Dr   r«   c                 óR   — | �"|                       ¦   «         rt          ¦   «         ‚d S d S rW   )ÚabortRequestedr«   )Úmonitors    r   Ú_check_abortr²   ¶   s3   € ØÐ˜w×5Ò5Ñ7Ô7ÐÝÑÔÐð ÐÐÐr   c                  óD   ‡‡— g Šˆˆfd„Št           D ]}  ‰| ¦  «         Œ‰S )zNRelative paths of every file in the system Estuary fonts/ and extras/ folders.c                 ó(  •‡ — t          j        t          ‰                      t          j        d¦  «        z   dz   ¦  «        \  }}‰                     ˆ fd„|D ¦   «         ¦  «         |D ]+} ‰t          j                             ‰ |¦  «        ¦  «         Œ,d S )Nr…   c              3   óX   •K  — | ]$}t           j                             ‰|¦  «        V — Œ%d S rW   )r(   r&   r)   )rY   rq   r–   s     €r   r]   z/_estuary_files.<locals>.walk.<locals>.<genexpr>Á   s3   øè è € ÐDÐD°d•R”W—\’\ (¨DÑ1Ô1ÐDÐDÐDÐDÐDÐDr   )	r*   ÚlistdirÚESTUARY_DIRrŒ   r(   Úseprˆ   r&   r)   )r–   Údirectoriesro   rq   ÚfoundÚwalks   `   €€r   r»   z_estuary_files.<locals>.walk¿   s™   øø€ Ý$œ_­[¸8×;KÒ;KÍBÌFÐTWÑ;XÔ;XÑ-XÐ[^Ñ-^Ñ_Ô_Ñˆ�UØ�ŠÐDÐDÐDÐD¸eÐDÑDÔDÑDÔDÐDØð 	/ð 	/ˆDØˆD•”—’˜h¨Ñ-Ô-Ñ.Ô.Ð.Ð.ð	/ð 	/r   )ÚESTUARY_TREES)Útreerº   r»   s    @@r   Ú_estuary_filesr¾   »   sL   øø€ à€Eð/ð /ð /ð /ð /ð /õ ð ð ˆØˆˆT‰
Œ
ˆ
ˆ
Ø€Lr   c                 óþ   — |t           j        k    rZt          j        t          j                             t          j                             | ¦  «        t           j        ¦  «        | ¦  «        S t          j        | ¦  «        S )zl{relative path: (source path, transform)} of the skin to stage; the modern one is composed over the classic.)	r   ÚMODERNr   Úplanr(   r&   r)   ÚdirnameÚCLASSIC)Úsourcer.   s     r   Ú_planrÅ   Ê   sR   € à•&”-ÒÐÝŒ|�BœGŸLšL­¬¯ª¸Ñ)@Ô)@Å&Ä.ÑQÔQÐSYÑZÔZÐZÝŒ<˜ÑÔÐr   c                 óœ  — | \  }}|dk    �rt           j                             ||¦  «        }t          j        t           j                             |¦  «        d¬¦  «         t          j        t          |                     t           j	        d¦  «        z   |¦  «        s"t          d                     |¦  «        ¦  «        ‚|t           j                             dd¦  «        k    r8t          j        |t           j                             |t          ¦  «        ¦  «         dS t           j                             t           j                             |¦  «        d	d
d¦  «        }t          D ]j}t           j                             ||¦  «        }t          j        t           j                             |¦  «        d¬¦  «         t          j        ||¦  «         ŒkdS )z]Copy one runtime file that is not part of the ZIP: from system Estuary, or the plugin's logo.ÚestuaryTrA   r…   z&could not copy system Estuary file: {}r   r   Nr   r   r   )r(   r&   r)   rC   rÂ   r*   Úcopyr·   rŒ   r¸   r;   r   r    ÚcopyfileÚ
BRAND_FONTÚLOGO_COPIES)Úentryr¦   rÄ   Úkindr–   ÚdestinationÚlogorÈ   s           r   Ú_copy_runtimerÐ   Ñ   sh  € à�N€Dˆ(ØˆyÒÑÝ”g—l’l 6¨8Ñ4Ô4ˆÝ
Œ•B”G—O’O KÑ0Ô0¸4Ð@Ñ@Ô@Ð@ÝŒ|�K¨(×*:Ò*:½2¼6À3Ñ*GÔ*GÑGÈÑUÔUð 	UÝÐB×IÒIÈ(ÑSÔSÑTÔTÐTØ•r”w—|’| GÐ-CÑDÔDÒDÐDÝŒO˜K­¬¯ª°f½jÑ)IÔ)IÑJÔJÐJØˆÝŒ7�<Š<�œŸš¨Ñ/Ô/°¸'ÐCVÑWÔW€DÝð +ð +ˆÝ”g—l’l 6¨4Ñ0Ô0ˆÝ
Œ•B”G—O’O KÑ0Ô0¸4Ð@Ñ@Ô@Ð@ÝŒ˜˜kÑ*Ô*Ð*Ð*ð+ð +r   c                 ó2  — t          |¦  «         t          | |¦  «        }d„ |D ¦   «         }t          ¦   «         }|                     t          ¦  «         |                     d„ |D ¦   «         ¦  «         |                     d¦  «         |                     d¦  «         d„ |D ¦   «         D ]6}t          j        t          j         	                    ||¦  «        d¬¦  «         Œ7|t          j        k    rGt          j         	                    t          j                             | ¦  «        t          j        ¦  «        n| }	d}
t          |d	¦  «        D �]Ê\  }}t          |¦  «         t          |t           ¦  «        rt#          |||	¦  «         �nY|t          k    r�t          j        t          j         	                    |d
¦  «        d¬¦  «         t          j         	                    ||¦  «        }t%          j        t(          |¦  «        st+          d¦  «        ‚t-          |¦  «         nÁ||         d	         €@t/          j        ||         d         t          j         	                    ||¦  «        ¦  «         nst3          t          j         	                    ||¦  «        d¦  «        5 }|                     t7          j        ||         ¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   |dz  t;          |¦  «        z  }|�||
k    r|                     |¦  «         |}
�ŒÌdS )zñOne source walk; copy bytes without unnecessary file timestamp/mode writes.

    addon.xml is copied last: an interrupted stage cannot look installable.
    Percentages count files, not bytes, and leave room for validation/registration.
    c                 ó(   — g | ]}|d t           fv¯|‘ŒS )r5   )r�   ©rY   r–   s     r   r}   z_stage_skin.<locals>.<listcomp>ë   s'   € Ð`Ð`Ð`˜(°À+ÍÐA_Ð1_Ð1_ˆXÐ1_Ð1_Ð1_r   c              3   ó   K  — | ]}d |fV — Œ	dS )rÇ   NrX   rÓ   s     r   r]   z_stage_skin.<locals>.<genexpr>î   s'   è è € Ð?Ð?¨8�)˜XÐ&Ð?Ð?Ð?Ð?Ð?Ð?r   )rÏ   Nr5   c                 óL   — h | ]!}t           j                             |¦  «        ’Œ"S rX   )r(   r&   rÂ   rÓ   s     r   ú	<setcomp>z_stage_skin.<locals>.<setcomp>ñ   s&   € ÐGÐGÐG°8•R”W—_’_ XÑ.Ô.ÐGÐGÐGr   TrA   r   r   r   z-could not copy system Estuary texture archiveNÚwbéZ   )r²   rÅ   r¾   rk   r�   rˆ   r(   rC   r&   r)   r   rÀ   rÂ   rÃ   Ú	enumerateÚ
isinstanceÚtuplerÐ   r*   rÈ   ÚESTUARY_ARCHIVEr;   rw   r    rÉ   r^   Úwriter   rI   rJ   Úupdate)rÄ   r¦   r±   Úprogressr.   ÚplannedÚfilesrÇ   r–   ÚclassicÚpreviousÚindexrÎ   rN   Úpercents                  r   Ú_stage_skinræ   ã   sÿ  € õ �ÑÔÐÝ�F˜GÑ$Ô$€GØ`Ð` gÐ`Ñ`Ô`€EÝÑÔ€GØ	‡L‚L•Ñ!Ô!Ð!Ø	‡L‚LÐ?Ð?°wÐ?Ñ?Ô?Ñ?Ô?Ð?Ø	‡L‚L�Ñ Ô Ð Ø	‡L‚L�ÑÔÐØGÐG¸wÐGÑGÔGð Cð CˆÝ
Œ•B”G—L’L ¨Ñ2Ô2¸TÐBÑBÔBÐBÐBØGNÕRXÔR_ÒG_ÐG_�bŒg�lŠl�2œ7Ÿ?š?¨6Ñ2Ô2µF´NÑCÔCÐCÐek€GØ€HÝ$ U¨AÑ.Ô.ð ñ ‰ˆˆxÝ�WÑÔÐÝ�h¥Ñ&Ô&ð 	>Ý˜( F¨GÑ4Ô4Ð4Ñ4Ø�Ò(Ð(ÝŒK�œŸš V¨WÑ5Ô5ÀÐEÑEÔEÐEÝœ'Ÿ,š, v¨xÑ8Ô8ˆKÝ”<¥°Ñ=Ô=ð OÝÐMÑNÔNÐNÝ˜+Ñ&Ô&Ð&Ð&Ø�XÔ˜qÔ!Ð)ÝŒO˜G HÔ-¨aÔ0µ"´'·,²,¸vÀxÑ2PÔ2PÑQÔQÐQÐQå•b”g—l’l 6¨8Ñ4Ô4°dÑ;Ô;ð >¸vØ—’�Wœ\¨'°(Ô*;Ñ<Ô<Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >à˜"‘*¥ E¡
¤
Ñ*ˆØÐ G¨xÒ$7Ð$7Ø�OŠO˜GÑ$Ô$Ð$ØˆHùð%ð s   Ê.KËK	ËK	c                 ó²  — t          |¦  «        \  }}t          |¦  «         t          ||¦  «         t          |¦  «         t	          | ||||¦  «         |�)|                     dt          j        d¦  «        ¬¦  «         t          |t          | ¦  «        d|¬¦  «         t          |¦  «         t          j                             |¦  «        r@t          ||¬¦  «        r t          ||¬¦  «        st          d¦  «        ‚t          |¦  «         t          |¦  «         t          j                             |¦  «        rt          j        ||¦  «         	 t          j        ||¦  «         nC# t           $ r6 t          j                             |¦  «        rt          j        ||¦  «         ‚ w xY w|�+|                     d	t          j        d
¦  «        ¬¦  «         dS dS )zTStage outside addons/, validate, then rename; retain rollback until the next update.Né\   i^  ©ÚmessageTr™   r2   z4cannot discard backup without a valid installed skiné_   i^  )rE   r²   r©   r¢   ræ   rÞ   r   ÚgetLocalizedStringr—   r?   r(   r&   r�   rš   rK   r¤   r;   )rÄ   r¥   r±   rß   r.   r¦   r§   s          r   Ú_swap_inrí   
  sÕ  € å$ WÑ-Ô-�O€FˆGÝ�ÑÔÐÝ�&˜'Ñ"Ô"Ð"Ý�ÑÔÐÝ�˜ ¨°7Ñ;Ô;Ð;ØÐØ�Š˜¥DÔ$;¸EÑ$BÔ$BˆÑCÔCÐCÝ�6�<¨Ñ/Ô/ÀÈwÐWÑWÔWÐWÝ�ÑÔÐå	„w‡‚�wÑÔð Ý�w¨Ð0Ñ0Ô0ð 	U½ÀVÐU\Ð9]Ñ9]Ô9]ð 	UÝÐSÑTÔTÐTÝ�WÑÔÐÝ�ÑÔÐÝ	„w‡‚�vÑÔð #Ý
Œ	�&˜'Ñ"Ô"Ð"ðÝ
Œ	�&˜&Ñ!Ô!Ð!Ð!øÝð ð ð ÝŒ7�?Š?˜7Ñ#Ô#ð 	'ÝŒI�g˜vÑ&Ô&Ð&Øðøøøð
 ÐØ�Š˜¥DÔ$;¸EÑ$BÔ$BˆÑCÔCÐCÐCÐCð Ðs   ÅE' Å'A F'c                 ó|   — t          d| dgdœ¦  «        }|                     di ¦  «                             d¦  «        S )NzAddons.GetAddonDetailsÚenabled)ÚaddonidÚ
propertiesÚresultr-   )r$   r:   )r.   Úresponses     r   Ú_skin_knownrô   (  s@   € ÝÐ,¸'ÐR[ÐQ\Ð.]Ð.]Ñ^Ô^€HØ�<Š<˜ "Ñ%Ô%×)Ò)¨'Ñ2Ô2Ð2r   c                 ó€   — d}||k     r5t          |¦  «        }|�|S |                      d¦  «        rd S |dz  }||k     °5d S )Nç        g      à?)rô   ÚwaitForAbort)r±   Ú	timeout_sr.   ÚwaitedÚdetailss        r   Ú_wait_knownrû   -  sb   € Ø€FØ
�9Ò
Ð
Ý˜gÑ&Ô&ˆØÐØˆNØ×Ò Ñ$Ô$ð 	Ø�4Ø�#‰ˆð �9Ò
Ð
ð ˆ4r   c           	      óð  — |pt          j        ¦   «         }t          | ¦  «         t          | |¦  «        t	          |¦  «        }}t          |¦  «        }ddd|dœ}d}t          j                             |¦  «        r(d|d<   t          d 
                    |¦  «        ¦  «         nGt          |d|¬¦  «        }|�||k    r-t          ||¦  «        |d<   |d         rt          |d|¬¦  «        }|€/t          d	 
                    |¦  «        t           j        ¦  «         |S d}	 |d         sÍ||k    rÇt          |¦  «         t          d
 
                    ||t          |¦  «        ¦  «        ¦  «         t          j        ¦   «         }|                     d 
                    |¦  «        t          j        d¦  «        ¦  «         t'          |||||¦  «         d|d<   |t(          k    r|                      d|¦  «         |d         st-          |¦  «        €t          j        d¦  «         t1          |t2          |¦  «        }	|	�€-t          d 
                    |t2          ¦  «        t           j        ¦  «         ||�õ	 |d         r)|                     dt          j        d¦  «        ¬¦  «         |                     ¦   «          n# |                     ¦   «          w xY w|                     ¦   «         s‚|d         rt          j        d¦  «        n|                      t<          ¦  «        }
|d         rt          j        nt          j         }t          j!        ¦   «          "                    ||
|dd¦  «         S S S |	 #                    d¦  «        �shtI          d|ddœ¦  «        }d|v �r.t          d 
                    ||d         ¦  «        t           j        ¦  «         ||�õ	 |d         r)|                     dt          j        d¦  «        ¬¦  «         |                     ¦   «          n# |                     ¦   «          w xY w|                     ¦   «         s‚|d         rt          j        d¦  «        n|                      t<          ¦  «        }
|d         rt          j        nt          j         }t          j!        ¦   «          "                    ||
|dd¦  «         S S S t          d 
                    |¦  «        ¦  «         d|d<   ||�õ	 |d         r)|                     dt          j        d¦  «        ¬¦  «         |                     ¦   «          n# |                     ¦   «          w xY w|                     ¦   «         s‚|d         rt          j        d¦  «        n|                      t<          ¦  «        }
|d         rt          j        nt          j         }t          j!        ¦   «          "                    ||
|dd¦  «         S S S # tJ          $ �r t          d¦  «         |cY |�õ	 |d         r)|                     dt          j        d¦  «        ¬¦  «         |                     ¦   «          n# |                     ¦   «          w xY w|                     ¦   «         s‚|d         rt          j        d¦  «        n|                      t<          ¦  «        }
|d         rt          j        nt          j         }t          j!        ¦   «          "                    ||
|dd¦  «         S S S w xY w# |�õ	 |d         r)|                     dt          j        d¦  «        ¬¦  «         |                     ¦   «          n# |                     ¦   «          w xY w|                     ¦   «         s‚|d         rt          j        d¦  «        n|                      t<          ¦  «        }
|d         rt          j        nt          j         }t          j!        ¦   «          "                    ||
|dd¦  «         w w w xY w)z•Bring the installed skin `skin_id` in line with the bundled one.

    Returns {'dev': bool, 'copied': bool, 'ready': bool, 'version': str|None}.
    F©ÚdevÚcopiedÚreadyr6   NTrþ   z&dev mode: {} is a symlink, not copyingr™   rÿ   zbundled skin missing at {}z installing {} {} (installed: {})u   MilionÃ¡Å™ Â· {}iñ€  Úskin_installed_versionÚUpdateLocalAddonsz$Kodi did not register {} within {} sr   éd   i^  ré   éˆ  rï   zAddons.SetAddonEnabled)rð   rï   Úerrorzcould not enable {}: {}z
enabled {}z-skin staging aborted; installed skin retained)&r   ÚMonitorÚinstall_keymapr/   r3   r?   r(   r&   rœ   r   r   rš   r©   ÚLOGERRORr²   ÚxbmcguiÚDialogProgressBGÚcreaterì   rí   ÚSKIN_IDÚ
setSettingrô   Úexecutebuiltinrû   ÚADDON_WAIT_SÚ
LOGWARNINGrÞ   Úcloser°   ÚS_MESSAGE_FAILEDÚNOTIFICATION_INFOÚNOTIFICATION_ERRORÚDialogÚnotificationr:   r$   r«   )r-   r±   r.   rÄ   r¥   Úbundledrò   Ú	installedrß   rú   rê   r   ró   s                r   Úinstallr  9  s  € ð
 Ð'�œ™œ€GÝ�5ÑÔÐÝ  ¨Ñ0Ô0µ*¸WÑ2EÔ2EˆF€FÝ˜6Ñ"Ô"€GØ e°eÈÐPÐP€FØ€IÝ	„w‡~‚~�fÑÔð WØˆˆu‰ÝÐ5×<Ò<¸VÑDÔDÑEÔEÐEÐEå ¸ÀgÐNÑNÔNˆ	ØÐ 	¨WÒ 4Ð 4Ý,¨V°WÑ=Ô=ˆF�8ÑØ�hÔð WÝ'¨ÀÈgÐVÑVÔV�	Ø€ÝÐ)×0Ò0°Ñ8Ô8½$¼-ÑHÔHÐHØˆØ€Hð)SØ�eŒ}ð 	D ¨gÒ!5Ð!5Ý˜Ñ!Ô!Ð!ÝÐ3×:Ò:¸7ÀGÍ\ÐZ`ÑMaÔMaÑbÔbÑcÔcÐcõ Ô/Ñ1Ô1ˆHØ�OŠOÐ.×5Ò5°gÑ>Ô>ÅÔ@WÐX]Ñ@^Ô@^Ñ_Ô_Ð_Ý�V˜V W¨h¸Ñ@Ô@Ð@Ø#ˆF�8ÑØ�'Ò!Ð!Ø× Ò Ð!9¸7ÑCÔCÐCØ�(Ôð 	5�{¨7Ñ3Ô3Ð;ÝÔÐ 3Ñ4Ô4Ð4Ý˜g¥|°WÑ=Ô=ˆØ‰?ÝÐ7×>Ò>¸wÍÑUÔUÕW[ÔWfÑgÔgÐgØð Ðð!Ø˜'”?ð QØ—O’O CµÔ1HÈÑ1OÔ1O�OÑPÔPÐPà—’Ñ Ô Ð Ð ø�—’Ñ Ô Ð Ð øøøØ×)Ò)Ñ+Ô+ð SØ=CÀG¼_ð F�4Ô2°5Ñ9Ô9Ð9Ø ×3Ò3Õ4DÑEÔEð à4:¸7´OÐc•wÔ0Ð0ÍÔIc�Ý”Ñ Ô ×-Ò-¨g°wÀÀdÈEÑRÔRÐRÐRð  ðSð% �{Š{˜9Ñ%Ô%ñ 	/ÝÐ4À'ÐVZÐ6[Ð6[Ñ\Ô\ˆHØ˜(Ð"Ñ"ÝÐ.×5Ò5°g¸xÈÔ?PÑQÔQÕSWÔS`ÑaÔaÐaØð Ðð!Ø˜'”?ð QØ—O’O CµÔ1HÈÑ1OÔ1O�OÑPÔPÐPà—’Ñ Ô Ð Ð ø�—’Ñ Ô Ð Ð øøøØ×)Ò)Ñ+Ô+ð SØ=CÀG¼_ð F�4Ô2°5Ñ9Ô9Ð9Ø ×3Ò3Õ4DÑEÔEð à4:¸7´OÐc•wÔ0Ð0ÍÔIc�Ý”Ñ Ô ×-Ò-¨g°wÀÀdÈEÑRÔRÐRÐRð  ðSõ �×$Ò$ WÑ-Ô-Ñ.Ô.Ð.Øˆˆw‰Øð
 Ðð!Ø˜'”?ð QØ—O’O CµÔ1HÈÑ1OÔ1O�OÑPÔPÐPà—’Ñ Ô Ð Ð ø�—’Ñ Ô Ð Ð øøøØ×)Ò)Ñ+Ô+ð SØ=CÀG¼_ð F�4Ô2°5Ñ9Ô9Ð9Ø ×3Ò3Õ4DÑEÔEð à4:¸7´OÐc•wÔ0Ð0ÍÔIc�Ý”Ñ Ô ×-Ò-¨g°wÀÀdÈEÑRÔRÐRÐRð  ðSøõ ð ñ ð ÝÐ<Ñ=Ô=Ð=ØˆˆàÐð!Ø˜'”?ð QØ—O’O CµÔ1HÈÑ1OÔ1O�OÑPÔPÐPà—’Ñ Ô Ð Ð ø�—’Ñ Ô Ð Ð øøøØ×)Ò)Ñ+Ô+ð SØ=CÀG¼_ð F�4Ô2°5Ñ9Ô9Ð9Ø ×3Ò3Õ4DÑEÔEð à4:¸7´OÐc•wÔ0Ð0ÍÔIc�Ý”Ñ Ô ×-Ò-¨g°wÀÀdÈEÑRÔRÐRÐRð  ðSðøøøøð Ðð!Ø˜'”?ð QØ—O’O CµÔ1HÈÑ1OÔ1O�OÑPÔPÐPà—’Ñ Ô Ð Ð ø�—’Ñ Ô Ð Ð øøøØ×)Ò)Ñ+Ô+ð SØ=CÀG¼_ð F�4Ô2°5Ñ9Ô9Ð9Ø ×3Ò3Õ4DÑEÔEð à4:¸7´OÐc•wÔ0Ð0ÍÔIc�Ý”Ñ Ô ×-Ò-¨g°wÀÀdÈEÑRÔRÐRÐRð  ðSøøøs{   ÄEW! É.1J4Ê4K
Í$A#W! Ï
1PÐP&Ó (W! Ó+1T1Ô1U×![8×=[; Ø1YÙYÛ7[8Û8[; Û;_5Û?1]Ü0_5Ý]ÝB_5c                 óþ  — t           j                             t          j        |                      d¦  «        ¦  «        ddd¦  «        }t          j        d¦  «        }t          |d¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   	 t          |d¦  «        5 }|                     ¦   «         |k    r	 d d d ¦  «         d S 	 d d d ¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wt          j	        t           j         
                    |¦  «        d¬¦  «         t          |d	¦  «        5 }|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        d
¦  «         d S )Nr&   r'   Úkeymapszmilionar-home.xmlz+special://profile/keymaps/milionar-home.xmlrG   TrA   r×   zAction(reloadkeymaps))r(   r&   r)   r*   r+   r,   r^   rI   ÚFileNotFoundErrorrC   rÂ   rÝ   r   r  )r-   rÄ   r¥   rN   Úcontents        r   r  r  }  s0  € ÝŒW�\Š\�'Ô/°×0BÒ0BÀ6Ñ0JÔ0JÑKÔKÈ[ÐZcÐexÑyÔy€FÝÔ"Ð#PÑQÔQ€FÝ	ˆf�dÑ	Ô	ð  ˜vØ—+’+‘-”-ˆð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ðÝ�&˜$ÑÔð 	 6Ø�{Š{‰}Œ} Ò'Ð'Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	Ø'ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð ð ð Øˆðøøøå„K•”—’ Ñ'Ô'°$Ð7Ñ7Ô7Ð7Ý	ˆf�dÑ	Ô	ð ˜vØ�Š�WÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð åÔÐ/Ñ0Ô0Ð0Ð0Ð0s`   Á,BÂBÂBÂC) Â)CÃC) ÃC) ÃC!Ã!C) Ã$C!Ã%C) Ã)
C6Ã5C6Ä<EÅE"Å%E"c                 óª   — 	 t           t          |                      d¦  «        pd¦  «                 S # t          t          t
          f$ r
 t          cY S w xY w)uU   The MilionÃ¡Å™ skin chosen in the addon settings (skin_variant: 0 classic, 1 modern).Úskin_variantr   )ÚVARIANTSÚintÚ
getSettingrK   Ú	TypeErrorÚ
IndexErrorr  )r-   s    r   Úchosenr%  Ž  sX   € ðÝ�˜E×,Ò,¨^Ñ<Ô<ÐAÀÑBÔBÔCÐCøÝ�	¥:Ð.ð ð ð Ýˆˆˆðøøøs   ‚.1 ±AÁAc                 óP   — t          j        d                     | ¦  «        ¦  «        S )Nz,special://profile/addon_data/{}/settings.xmlr1   r2   s    r   Ú_settings_filer'  –  s#   € ÝÔ Ð!O×!VÒ!VÐW^Ñ!_Ô!_Ñ`Ô`Ð`r   c                 óœ  — t          | ¦  «        t          |¦  «        }}t          j                             |¦  «        r!|r!t          j                             |¦  «        rdS t          j        t          j                             |¦  «        d¬¦  «         t          j        ||¦  «         t          d 	                    | |¦  «        ¦  «         dS )uœ   Kodi keeps skin settings per skin: the Home layout and switches of one MilionÃ¡Å™ look go along to the other.
    `keep`: only when the target has none yet.NTrA   z#skin settings carried from {} to {})
r'  r(   r&   rŠ   rC   rÂ   r    rÉ   r   r   )Ú	source_idÚ	target_idÚkeeprÄ   r¥   s        r   Ú_carry_settingsr,  š  s®   € õ $ IÑ.Ô.µ¸yÑ0IÔ0IˆF€FÝŒ7�>Š>˜&Ñ!Ô!ð  dð ­r¬w¯~ª~¸fÑ/EÔ/Eð ØˆÝ„K•”—’ Ñ'Ô'°$Ð7Ñ7Ô7Ð7Ý
„O�F˜FÑ#Ô#Ð#ÝÐ	.×	5Ò	5°iÀÑ	KÔ	KÑLÔLÐLÐLÐLr   c                 ó  — |pt          | ¦  «        }t          | |¬¦  «        }|d         sMt          j        ¦   «                              d|                      t          ¦  «        t          j        d¦  «         dS t          j	        ¦   «         }||k    rdS |t          v rt          ||¦  «         t          dd|d	œ¦  «        }t          d
                     ||                     d|                     d¦  «        ¦  «        ¦  «        ¦  «         d|vS )ul   Make a MilionÃ¡Å™ skin (the chosen one by default) the active skin; Kodi then asks "Keep this skin?" itself.r2   r   õ
   MilionÃ¡Å™r  FTzSettings.SetSettingValuezlookandfeel.skin)ÚsettingrM   zswitch to {} requested: {}rò   r  )r%  r  r	  r  r  rì   r  r  r   Ú
getSkinDirr   r,  r$   r   r   r:   )r-   r.   ÚinfoÚactiveró   s        r   Úswitchr3  ¥  s
  € àÐ&� ™œ€GÝ�5 'Ð*Ñ*Ô*€DØ�Œ=ð ÝŒÑÔ×%Ò% l°E×4LÒ4LÕM]Ñ4^Ô4^Ý&-Ô&@À$ñ	Hô 	Hð 	HàˆuÝŒ_ÑÔ€FØ�ÒÐØˆtØ•ÐÐÝ˜ Ñ(Ô(Ð(ÝÐ.Ð<NÐY`Ð0aÐ0aÑbÔb€HÝÐ	%×	,Ò	,¨W°h·l²lÀ8ÈXÏ\Ê\ÐZaÑMbÔMbÑ6cÔ6cÑ	dÔ	dÑeÔeÐeØ˜(Ð"Ð"r   c                 ó8  — | pt          j        t          ¦  «        } t          | ¦  «        }|                      d¦  «        |k    rdS |                      d|¦  «         t          j        ¦   «         r)t          j	        ¦   «         |k    rt          | |¦  «         dS dS dS )uZ   The addon settings changed: a new choice of look switches a running MilionÃ¡Å™ skin to it.Úskin_variant_appliedN)Ú	xbmcaddonÚAddonr‰   r%  r"  r  r   r2  r   r0  r3  )r-   Úwanteds     r   Úapply_variantr9  ·  s�   € àÐ.•Y”_¥XÑ.Ô.€EÝ�E‰]Œ]€FØ×ÒÐ.Ñ/Ô/°6Ò9Ð9ØˆØ	×ÒÐ+¨VÑ4Ô4Ð4Ý„}�„ð �4œ?Ñ,Ô,°Ò6Ð6Ýˆu�fÑÔÐÐÐðð Ð6Ð6r   c                 ó”  — d}|                       ¦   «         s±t          j        d¦  «        rSt          j        d¦  «        s?t          j        d¦  «        s+t          j        d¦  «                             d¦  «        dvrdS |                      d	¦  «        rd
S |d	z  }|t          k    rt          d¦  «         |                       ¦   «         ¯±d
S )zJOffer only on quiet Home; migration has priority over the optional switch.rö   zWindow.IsActive(home)zPlayer.HasVideozSystem.HasActiveModalDialogé'  zmilionar.migration.pending)Ú1ÚtrueTé   Fz(still waiting for Home / end of playback)	r°   r   ÚgetCondVisibilityr	  ÚWindowÚgetPropertyr÷   Ú
GUI_WAIT_Sr   )r±   rù   s     r   Ú_wait_for_quiet_guirC  Â  sÞ   € à€FØ×$Ò$Ñ&Ô&ð 
=ÝÔ"Ð#:Ñ;Ô;ð 	ÝÔ*Ð+<Ñ=Ô=ð	åÔ*Ð+HÑIÔIð	õ ”˜uÑ%Ô%×1Ò1Ð2NÑOÔOÐWdÐdÐdØ�4Ø×Ò Ñ"Ô"ð 	Ø�5Ø�!‰ˆØ•ZÒÐÝÐ;Ñ<Ô<Ð<ð ×$Ò$Ñ&Ô&ð 
=ð ˆ5r   c           
      óˆ  — i }t           D ]y}	 t          | ||¦  «        ||<   Œ# t          $ rU}t          d                     |t          |¦  «        j        |¦  «        t          j        ¦  «         dddddœ||<   Y d}~Œrd}~ww xY w|t          j
                 d         r&t          t          j        t          j
        d¬¦  «         |S )uH   Install every MilionÃ¡Å™ skin; one that fails leaves the others working.z{} failed: {}: {}FNrý   rÿ   T)r+  )r   r  Ú	Exceptionr   r   Útyper¬   r   r  r   rÀ   r,  rÃ   )r-   r±   Úresultsr.   Úexcs        r   Ú_install_eachrI  Ó  sã   € à€GÝð `ð `ˆð	`Ý& u¨g°wÑ?Ô?ˆG�GÑÐøÝð 	`ð 	`ð 	`ÝÐ$×+Ò+¨GµT¸#±Y´YÔ5GÈÑMÔMÍtÌ}Ñ]Ô]Ð]Ø',¸ÈÐZ^Ð_Ð_ˆG�GÑÐÐÐÐÐøøøøð	`øøøð �vŒ}Ô˜hÔ'ð BÝ�œ­¬¸DÐAÑAÔAÐAØ€Ns   �"¢
B¬AA<Á<Bc                 ó  — 	 | pt          j        t          ¦  «        } t          j        ¦   «         }t          | |¦  «        }|                      d¦  «        t          | ¦  «        k    r#|                      dt          | ¦  «        ¦  «         t          j	        ¦   «         }||v rZ||         d         r#t          d¦  «         t          j        d¦  «         t          j        d¦  «                             d¦  «         dS t          j        d¦  «                             d¦  «         |t          | ¦  «                 }|d         r|d	         rdS |                      d
¦  «        }|                      d¦  «        |k    rdS t!          |¦  «        sdS t          j        ¦   «                              d|                      t(          ¦  «        ¦  «        r'|                      d|¦  «         t+          | ¦  «         dS |                      d|¦  «         t          d                     |¦  «        ¦  «         dS # t.          $ rK}t          d                     t1          |¦  «        j        |¦  «        t          j        ¦  «         Y d}~dS d}~ww xY w)zNService entry point: install/update, refresh a running skin, offer the switch.r5  rÿ   z'skin updated while active: ReloadSkin()zReloadSkin()r;  zmilionar.skin.installingNr   rþ   r6   Úskin_offer_versionr.  z$switch declined for addon version {}zinstaller failed: {}: {})r6  r7  r‰   r   r  rI  r"  r%  r  r0  r   r  r	  r@  ÚclearPropertyr,   rC  r  Úyesnorì   ÚS_MESSAGE_SWITCHr3  r   rE  rF  r¬   r  )r-   r±   rG  r2  r1  Úaddon_versionrH  s          r   ÚrunrP  á  se  € ðXØÐ2�œ­Ñ2Ô2ˆÝ”,‘.”.ˆÝ  wÑ/Ô/ˆØ×ÒÐ2Ñ3Ô3µv¸e±}´}ÒDÐDØ×ÒÐ3µV¸E±]´]ÑCÔCÐCÝ”Ñ"Ô"ˆØ�WÐÐØ�vŒ˜xÔ(ð 4ÝÐ>Ñ?Ô?Ð?ÝÔ# NÑ3Ô3Ð3ÝŒN˜5Ñ!Ô!×/Ò/Ð0JÑKÔKÐKØˆFõ 	Œ�uÑÔ×+Ò+Ð,FÑGÔGÐGØ•v˜e‘}”}Ô%ˆØ�GŒ}ð 	  U¤ð 	ØˆFØ×*Ò*¨9Ñ5Ô5ˆØ×ÒÐ0Ñ1Ô1°]ÒBÐBØˆFÝ" 7Ñ+Ô+ð 	ØˆFÝŒ>ÑÔ×!Ò! ,°×0HÒ0HÕIYÑ0ZÔ0ZÑ[Ô[ð 	OØ×ÒÐ1°=ÑAÔAÐAÝ�5‰MŒMˆMˆMˆMà×ÒÐ1°=ÑAÔAÐAÝÐ7×>Ò>¸}ÑMÔMÑNÔNÐNÐNÐNøÝð Xð Xð XÝÐ'×.Ò.­t°C©y¬yÔ/AÀ3ÑGÔGÍÌÑWÔWÐWÐWÐWÐWÐWÐWÐWøøøøðXøøøs9   ‚C6H) Ã:AH) Å.H) Å8H) Æ	A$H) Ç/8H) È)
I>È3A I9É9I>rW   )F)DÚ__doc__r   r(   r    rb   Úxml.etree.ElementTreeÚetreeÚElementTreer7   r   r6  r	  r*   Úwcs.skinr   r   r‰   rÃ   r  ÚSKINSr   r   rN  r  rB  r  r·   rÜ   r&   r)   r�   r¼   rÊ   rË   ÚLOGO_SOURCErŽ   ÚLOGINFOr   r$   r/   r3   r?   rE   rw   r—   rš   r¢   r©   rE  r«   r²   r¾   rÅ   rÐ   ræ   rí   rô   rû   r  r  r%  r'  r,  r3  r9  rC  rI  rP  rX   r   r   ú<module>rY     s8  ððð ð €€€Ø 	€	€	€	Ø €€€Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $à"€Ø
Œ.€ØŒ<€Ø €
àÐ ØÐ Ø€
Ø€Ø3€ØÐ 4Ñ4€Ø”'—,’,˜w¨Ñ7Ô7€à#€ØŒW�\Š\˜'Ð#?Ñ@Ô@€
ØŒw�|Š|˜G Z°Ñ<Ô<ØŒw�|Š|˜G ZÐ1IÑJÔJðL€àŒg�lŠl˜7 GÐ-@ÑAÔA€Ø”—’˜gÐ'=Ñ>Ô>À
Ø”—’˜h¨°}ÑEÔEðGØITñU€ð ”Lð ;ð ;ð ;ð ;ð@ð @ð @ð @ð  'ð að að að að
 ð Mð Mð Mð Mðð ð ð #ð 7ð 7ð 7ð 7ð$Gð $Gð $GðN -1À%ÐQXð ð ð ð ð@ ).°wð ð ð ð ðð ð ð #*ð ð ð ð ð	ð 	ð 	ð 	ð 	�iñ 	ô 	ð 	ð ð  ð  ð
ð ð ð ð  ð  ð+ð +ð +ð$ <Cð $ð $ð $ð $ðN &*°DÀ'ð Dð Dð Dð Dð<  ð 3ð 3ð 3ð 3ð
 -4ð 	ð 	ð 	ð 	ð  ¨ð ASð ASð ASð ASðH1ð 1ð 1ð"ð ð ðað að aðMð Mð Mð Mð#ð #ð #ð #ð$ð ð ð ðð ð ð"ð ð ð!Xð !Xð !Xð !Xð !Xð !Xr   