§ À•¿jwDãóΗddlmZddlmZddlmZddlZddlmZddlmZddl m Z dd l m Z dd l mZdd lmZdd lmZ dd lmZn #e$rdZYnwxYwGd„de e¦«ZdS)é)Úabsolute_import)Úprint_function)ÚdivisionN)Úclcagefsé)Ú ClExtSelect)Ú ClUserSelect)ÚClSelectExcept)Úclprint)Úapply_for_at_least_one_user)ÚWebsite)Úget_website_idcó—eZdZdZdd„Zdd„Zdd„Zd d„Zd„Zd „Z d!d „Z d „Z d!d e de de e dededzddf d„Zd d„Zd d e de de e dedzdee e e e e e ff d„Zd d e de de e dedzdee e e e e e ff d„Zd d„Zd d e de de e dedzddf d„Zd d„Zd„Zee¦«Zed„¦«Zd d e de dedzddfd„Zd d e de dedzde fd„ZdS)"ÚClUserExtSelectz alt_php.iniÚphpNcó\—tj|||¦«d|_g|_g|_dS©N)r Ú__init__Ú_alt_extensionsÚ_user_extensionsÚ _conflicts)ÚselfÚitemÚexclude_pid_lists úO/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/cluserextselect.pyrzClUserExtSelect.__init__s3€ÝÔ˜d DÐ*:Ñ;Ô;Ð;Ø#ˆÔØ "ˆÔ؈Œˆˆóc ó2—| |¦«|€&| ||r|jnd¬¦«d}|dkrtj|¦«‚t t d„t| |||¬¦«¦«¦«¦«S)zð Returns enabled user extensions for a version as a tuple @param user: string @param version: string @param website: Website or None - website info for per-domain configuration @return: tuple N©ÚdomainrÚnativecó —|dfS)NT©)Úis rúz9ClUserExtSelect.list_enabled_extensions..2s € Q¨ I€r©Úwebsite) Ú_check_user_in_cagefsÚ get_versionrr ÚUnableToGetExtensionsÚtupleÚmapÚsortedÚ_get_enabled_extensions©rÚuserÚversionr&s rÚlist_enabled_extensionsz'ClUserExtSelect.list_enabled_extensions%s¬€ð ×"Ò" 4Ñ(Ô(Ð(Ø ˆ?Ø×&Ò& tÀgÐ4W°G´N°NÐSWÐ&ÑXÔXÐYZÔ[ˆGØ �hÒ Ð Ý Ô6°wÑ?Ô?Ð ?Ý•SÐ-Ð-Ý �4×/Ò/°°gÀwÐ/ÑOÔOÑ PÔ PñRôRñSôSð Srcó—| |¦«|€&| ||r|jnd¬¦«d}|dkrtj|¦«‚t | |||¬¦«¦«}t | |¦«¦«}t | |¦«¦«}||z}g}t|¦«D](} d} | |vrd} n| |vrd} |  | | f¦«Œ)t|¦«S)a Returns as a tuple all user extensions for a version, marking enabled and disabled ones @param user: string @param version: string @param website: Website or None - website info for per-domain configuration @return: tuple Nrrr r%FT) r'r(rr r)Úsetr-Ú _get_builtinsÚ_get_all_extensionsr,Úappendr*) rr/r0r&Úuser_extensionsÚbuiltin_extensionsÚphp_d_all_extensionsÚall_extensionsÚ extensionsÚextÚenableds rÚlist_all_extensionsz#ClUserExtSelect.list_all_extensions5s6€ð ×"Ò" 4Ñ(Ô(Ð(Ø ˆ?Ø×&Ò& tÀgÐ4W°G´N°NÐSWÐ&ÑXÔXÐYZÔ[ˆGØ �hÒ Ð Ý Ô6°wÑ?Ô?Ð ?ݘd×:Ò:¸4ÀÐRYÐ:ÑZÔZÑ[Ô[ˆÝ  ×!3Ò!3°GÑ!<Ô!<Ñ=Ô=ÐÝ" 4×#;Ò#;¸GÑ#DÔ#DÑEÔEÐØ+Ð.BÑBˆØˆ ݘ.Ñ)Ô)ð .ð .ˆC؈GØÐ(Ð(Ð(Ø��ؘÐ'Ð'Ø�Ø × Ò ˜s G˜nÑ -Ô -Ð -Ð -Ý�ZÑ Ô Ð rcóp—t|j¦«dkr| |||¬¦«|jS)zÞ Returns list of enabled user extensions @param user: string @param version: string @param website: Website or None - website info for per-domain configuration @return: list rr%)ÚlenrÚ_load_user_extensionsr.s rr-z'ClUserExtSelect._get_enabled_extensionsQs>€õ ˆtÔ$Ñ %Ô %¨Ò *Ð *Ø × &Ò & t¨W¸gÐ &Ñ FÔ FÐ FØÔ$Ð$rcóR—|j€| |¦«|_|jS)z¯ Returns list of all extensions for a version except compiled-in ones @param user: string @param version: string @return: list )rÚ_load_extensions_list)rr0s rr5z#ClUserExtSelect._get_all_extensions]s,€ð Ô Ð 'Ø#'×#=Ò#=¸gÑ#FÔ#FˆDÔ ØÔ#Ð#rcó¾—| |¦«}t|¦« t|¦«¦«}|rtj||¬¦«‚dS)zi validation extensions name @param ext_list: list @param version: string )Úext_listr:N)r5r3Ú differencer ÚNoSuchExtension)rrEr0r:Úbad_extensionss rÚ_check_extensionsz!ClUserExtSelect._check_extensionsisd€ð ×1Ò1°'Ñ:Ô:ˆÝ˜X™œ×1Ò1µ#°nÑ2EÔ2EÑFÔFˆØ ð iÝ Ô0¸.ÐYgÐhÑhÔhÐ hð ið irFcóB—| ||j||||¬¦«S)N)Ú check_extr&)Úbulk_handle_extensionsÚenable_extensions)rr/r0rErKr&s rÚbulk_enable_extensionsz&ClUserExtSelect.bulk_enable_extensionsts6€Ø×*Ò*¨4°Ô1GÈÐRZÐfoðzAÐ*ñBôBð Brcóš—t||j |j |¦«¦«tjg|¢Ri|¤ŽSr)r Ú_clpwdÚ get_namesÚget_uidr ÚUnableToSaveData)rr/ÚfuncÚargsÚkwargss rrLz&ClUserExtSelect.bulk_handle_extensionsws^€Ý*Ø Ø ŒK× !Ò ! $¤+×"5Ò"5°dÑ";Ô";Ñ <Ô <Ý Ô +ð ðð  ð ð ðð  ð ð rr/r0rErKr&ÚreturncóD‡‡—| |¦«| ||¦«|r| ||¬¦«| |||¬¦«}| |¦«}| |¦«\}} } t |  ¦«¦«|z} | | ¦«Štj | ‰¦«} |  | ¦«ˆfd„| |zD¦«} gŠ| D]f} ˆfd„|  | g|| ¦«D¦«}tj | ||¦«}| |¦«‰ |¦«Œg‰D]0}| | | |¦«¦«Œ1| |¦«}| |d |¦«dz|¦«| ||r|jnd|r|jnd¬¦«| |¦«dS)z1 Adds extensions to user php.ini )rEr0r%có•—g|]}|‰v¯|‘Œ Sr"r"©Ú.0r<Úext_list_without_conflictss €rú z5ClUserExtSelect.enable_extensions..’s.ø€ð<ð<ð<˜cØÐ :Ð:Ð:ðØ:Ð:Ð:rcó•—g|]}|‰v¯|‘Œ Sr"r"©r[r<Úresolved_dependenciess €rr]z5ClUserExtSelect.enable_extensions..–ó2ø€ð=ð=ð= ðÐ&;Ð;Ð;ðð<Ð;Ð;rú N©Ú document_rootr)r'Ú_require_isolated_websiterIÚ_compose_user_ini_pathÚ_compose_alt_pathÚ_load_ini_contentsÚlistÚkeysÚ_filter_out_conflictsrÚget_conflicts_infoÚ_print_conflicts_infoÚ_include_dependenciesÚget_dependencies_listÚ_print_dependencies_infoÚextendÚ _smooth_dataÚ_move_ioncube_extÚ_write_to_fileÚjoinÚ_backup_settingsÚdocrootrÚ_reload_processes)rr/r0rErKr&Ú user_ini_pathÚalt_pathÚcontentsr;Úextensions_dataÚresulting_extensionsÚ_conflicts_infoÚ extensionÚresolvedÚdependence_infor<r\r`s @@rrMz!ClUserExtSelect.enable_extensionss§øø€ð ×"Ò" 4Ñ(Ô(Ð(Ø ×&Ò& t¨WÑ5Ô5Ð5Ø ð GØ × "Ò "¨H¸gÐ "Ñ FÔ FÐ FØ×3Ò3°D¸'È7Ð3ÑSÔSˆ Ø×)Ò)¨'Ñ2Ô2ˆà04×0GÒ0GÈ Ñ0VÔ0VÑ-ˆ�*˜oå# O×$8Ò$8Ñ$:Ô$:Ñ;Ô;¸hÑFÐØ%)×%?Ò%?Ð@TÑ%UÔ%UÐ"Ý%Ô8Ð9MØ9SñUôUˆà ×"Ò" ?Ñ3Ô3Ð3ð<ð<ð<ð< Z°(Ñ%:ð<ñ<ô<ˆ à "ÐØ#ð 3ð 3ˆIð=ð=ð=ð= t×'AÒ'AÀ9À+ØBJØBQñ(Sô(Sð=ñ=ô=ˆHõ*Ô?À Ø@HØ@HñJôJˆOð × )Ò )¨/Ñ :Ô :Ð :Ø !× (Ò (¨Ñ 2Ô 2Ð 2Ð 2à(ð 9ð 9ˆCØ �OŠOØ×!Ò! /°#Ô"6Ñ7Ô7ñ 9ô 9ð 9ð 9ð×)Ò)¨(Ñ3Ô3ˆØ ×ÒØ �$—)’)˜HÑ%Ô% dÑ*¨Mñ ;ô ;ð ;à ×ÒØ Ø-4Ð>˜'œ/˜/¸$Ø%,Ð6�7”>�>°$ð ñ ô ð ð ×Ò˜tÑ$Ô$Ð$Ð$Ð$rcó@—| ||j|||¬¦«S©Nr%)rLÚ#replace_extensions_with_dependenses©rr/r0rEr&s rÚbulk_replace_extensionsz'ClUserExtSelect.bulk_replace_extensions®s'€Ø×*Ò*¨4°Ô1YÐ[bÐdlÐv}Ð*Ñ~Ô~Ð~rcó”—| ||||¬¦«\}}}| |¦«| |¦«|S)z° (deprecated) Replaces extensions in user php.ini with supplied ones and print information about dependences and conflicts for old php selector r%)r†rprm)rr/r0rEr&Úextensions_listÚdependencies_listÚconflict_dependenciess rÚreplace_extensionsz"ClUserExtSelect.replace_extensions±s\€ð × (Ò (¨¨w¸È'Ð (Ñ RÔ Rñ DˆÐ+Ð-Bà ×%Ò%Ð&7Ñ8Ô8Ð8Ø ×"Ò"Ð#8Ñ9Ô9Ð9àÐrcóȇ‡—| |¦«| ||¦«gŠg}g}| |||¬¦«}| |¦«}| |¦«\} } } i} | |¦«Št j|‰¦«}ˆfd„|D¦«} | D]U} ˆfd„| | g|| ¦«D¦«} ||  | | |¦«z}‰  | ¦«ŒV‰D]0}|   |  | |¦«¦«Œ1|  | ¦«} |  |d | ¦«dz|¦«| ||r|jnd|r|jnd¬¦«| |¦«t'|  ¦«¦«||fS)zH Replaces extensions in user php.ini with supplied ones r%có•—g|]}|‰v¯|‘Œ Sr"r"rZs €rr]zGClUserExtSelect.replace_extensions_with_dependenses..Ñs$ø€ÐSÐSÐS˜c°Ð8RÐ1RÐ1R�cÐ1RÐ1RÐ1Rrcó•—g|]}|‰v¯|‘Œ Sr"r"r_s €rr]zGClUserExtSelect.replace_extensions_with_dependenses..ÓrarrbNrc)r'rerfrgrhrkrrlrnrorqrrrsrtrurvrwrrxrirj)rr/r0rEr&rŠr‰ryrzr{r;r|rr€r<r\r`s @@rr„z3ClUserExtSelect.replace_extensions_with_dependenses¾sgøø€ð ×"Ò" 4Ñ(Ô(Ð(Ø ×&Ò& t¨WÑ5Ô5Ð5Ø "ÐØ "ÐØÐØ×3Ò3°D¸'È7Ð3ÑSÔSˆ Ø×)Ò)¨'Ñ2Ô2ˆà04×0GÒ0GÈ Ñ0VÔ0VÑ-ˆ�*˜o؈à%)×%?Ò%?ÀÑ%IÔ%IÐ"Ý +Ô >¸xØ?Yñ![ô![ÐðTÐSÐSÐS XÐSÑSÔSˆ Ø#ð 3ð 3ˆIð=ð=ð=ð= t×'AÒ'AÀ9À+ØBJØBQñ(Sô(Sð=ñ=ô=ˆHð!2°D×4NÒ4NÈyØOWØOWñ5Yô5Yñ!YÐ ð "× (Ò (¨Ñ 2Ô 2Ð 2Ð 2à(ð 9ð 9ˆCØ �OŠOØ×!Ò! /°#Ô"6Ñ7Ô7ñ 9ô 9ð 9ð 9ð×)Ò)¨(Ñ3Ô3ˆØ ×ÒØ �$—)’)˜HÑ%Ô% dÑ*¨Mñ ;ô ;ð ;à ×ÒØ Ø-4Ð>˜'œ/˜/¸$Ø%,Ð6�7”>�>°$ð ñ ô ð ð ×Ò˜tÑ$Ô$Ð$Ý�O×(Ò(Ñ*Ô*Ñ+Ô+Ð->Ð@UÐUÐUrcó@—| ||j|||¬¦«Srƒ)rLÚdisable_extensionsr…s rÚbulk_disable_extensionsz'ClUserExtSelect.bulk_disable_extensionsës&€Ø×*Ò*¨4°Ô1HÈ'ÐS[ÐelÐ*ÑmÔmÐmrcóž—| |¦«| ||¦«| |||¬¦«}| |¦«}| |¦«\}}} t |¦«D]§} | | vrŒt |  ¦«¦« | g¦«} | | | |¦«r>|   t |¦«¦«stj dd| ›d�dœ¦«Œ‘|   | d¦«Œ¨|D]5} | | vrŒ|  | | | ¦«¦«Œ6| |d |¦«dz|¦«| ||r|jnd|r|jnd¬¦«| |¦«dS) z6 Removes extensions from user php.ini r%ÚtextÚWARNz left as dependency)ÚstatusÚmessageNrbrc)r'rerfrgrhr3rjrFÚ_is_dependencyÚissubsetr Ú print_diagÚpoprqrrrtrurvrwrrx) rr/r0rEr&ryrzr{r;r|rÚ rest_of_setr<s rr�z"ClUserExtSelect.disable_extensionsîs€ð ×"Ò" 4Ñ(Ô(Ð(Ø ×&Ò& t¨WÑ5Ô5Ð5Ø×3Ò3°D¸'È7Ð3ÑSÔSˆ Ø×)Ò)¨'Ñ2Ô2ˆà#×6Ò6°}ÑEÔEñ ˆ�:Ø Ý˜‘M”Mð ,ð ,ˆDؘ?Ð*Ð*ØÝ˜o×2Ò2Ñ4Ô4Ñ5Ô5×@Ò@À$ÀÑHÔHˆKØ×#Ò# D¨+°xÑ@Ô@ð Ø'×0Ò0µ°X±´Ñ?Ô?ð åÔ"ØØ%à˜˜ð!ð ð ñ!ô!ð!ð Ø × Ò   dÑ +Ô +Ð +Ð +Øð 9ð 9ˆCؘ/Ð)Ð)ØØ �OŠOØ×!Ò! /°#Ô"6Ñ7Ô7ñ 9ô 9ð 9ð 9à ×ÒØ �$—)’)˜HÑ%Ô% dÑ*¨Mñ ;ô ;ð ;à ×ÒØ Ø-4Ð>˜'œ/˜/¸$Ø%,Ð6�7”>�>°$ð ñ ô ð ð ×Ò˜tÑ$Ô$Ð$Ð$Ð$rcóŽ—|stjd¦«‚tj||¦«}| ||||¬¦«}|S)zì Replaces extensions in user php.ini with default ones @param user: string @param version: string @param website: Website or None - website info for per-domain configuration @return: list ÚVersionr%)r Ú EmptyParamrr-r‹)rr/r0r&rEÚdatas rÚreset_extensionsz ClUserExtSelect.reset_extensionssP€ðð 7Ý Ô+¨IÑ6Ô6Ð 6ÝÔ6°t¸WÑEÔEˆà×&Ò& t¨W°hÈÐ&ÑPÔPˆØˆ rcó*—d}g}g}|D]t}| d¦«rd}| |¦«Œ/|r.| d¦«rd}n| |¦«Œ_| |¦«Œu| |¦«|S)zˆ PHP ioncube extensions must be at the beginning of extensions list @param contents: list @return: list Fz ;---ioncubeTú;---)Ú startswithr6rq)r{ÚfoundÚfixed_contentsÚstripped_contentsrs rrsz!ClUserExtSelect._move_ioncube_ext"s¿€ð ˆØˆØÐØð +ð +ˆDØ�Š˜}Ñ-Ô-ð Ø�Ø×%Ò% dÑ+Ô+Ð+ØØð Ø—?’? 6Ñ*Ô*ðØ!�E�Eà"×)Ò)¨$Ñ/Ô/Ð/ØØ × $Ò $ TÑ *Ô *Ð *Ð *Ø×ÒÐ/Ñ0Ô0Ð0ØÐrcó—g}g}i}d}d}d} t|d¦«}|D�]9}| ¦«}| d¦«rd}d}| |¦«ŒF| d¦«r+| d¦«} | dkrŒw| }d}||vr|g||<Œ†|rX| d ¦«r| d ¦«sŒ³| |¦«| d ¦«rd}Œà|rW|rU| d ¦«s|dkr�Œ||vr| |¦«||vr|| |¦«�Œ;| ¦«n#t tf$rYnwxYw|||fS) zb Parses user ini file contents @param path: string @return: tuple FNÚrz;>===Tr¢z;- Úú;z;<===)ÚopenÚrstripr£r6ÚstripÚcloseÚOSErrorÚIOError) Úpathr{r;r|Ú is_contentÚ is_extensionÚext_nameÚiniÚlineÚ tmp_ext_names rrhz"ClUserExtSelect._load_ini_contents;sñ€ðˆØˆ ؈؈ ؈ ؈ð- Ý�t˜S‘/”/ˆCØð( ?ñ( ?�Ø—{’{‘}”}�ð—?’? 7Ñ+Ô+ð$?Ø#(�LØ!%�JØ—O’O DÑ)Ô)Ð)Ð)ð—_’_ VÑ,Ô,ð?Ø#'§:¢:¨eÑ#4Ô#4�LØ# rÒ)Ð)Ø Ø+�HØ#'�Là Ð6Ð6Ø59°F˜¨Ñ1øð ð?à—’ sÑ+Ô+ð!°D·O²OÀGÑ4LÔ4Lð!Ø à—O’O DÑ)Ô)Ð)Ø—’ wÑ/Ô/ð+Ø%*˜ øðð ? ,ð ?à—’ sÑ+Ô+ð!¨t°rªz¨zÙ à zÐ1Ð1Ø"×)Ò)¨(Ñ3Ô3Ð3à ?Ð2Ð2Ø'¨Ô1×8Ò8¸Ñ>Ô>Ð>ùØ �IŠI‰KŒKˆKˆKøÝ�Ð!ð ð ð Ø ˆDð øøøà˜ _Ð4Ð4sŽE!E0Å0FÆFcó”—| |||¬¦«}| |¦«}|j |¦«dS)zF Loads user alternative extensions list for a version r%N)rfÚ_skim_over_extensionsrrq)rr/r0r&ryr;s rrAz%ClUserExtSelect._load_user_extensionsxsN€ð×3Ò3°D¸'È7Ð3ÑSÔSˆ Ø×/Ò/° Ñ>Ô>ˆ Ø Ô×$Ò$ ZÑ0Ô0Ð0Ð0Ð0rc ó.—|jrS|rtj¦«‚|j |¦«}d| dd¦«z}|dz|zdzSt |j |¦«¦«}tj ¦«rdn-tj   |j |dd…|¦«}|rt€tj¦«‚t|j¦«}tj   |d d |j›d �|d |j›| dd¦«›�|j¦«} nOtj   |d d |j›d �d |j›| dd¦«›�|j¦«} | S) z- Composes user ini file path zphp%sú.r©z/.cl.selector/alt_z.iniú/éþÿÿÿNÚetczcl.z.dzalt-)Úwithout_cagefsr ÚMissingCagefsPackagerPÚ get_homedirÚreplaceÚstrrRrÚ in_cagefsÚosr±ruÚ CAGEFS_PATHrrwÚ_itemÚUSER_INI) rr/r0r&ÚhomedirÚphp_dirÚuidÚ user_prefixÚ website_hashr±s rrfz&ClUserExtSelect._compose_user_ini_path€s”€ð Ô ð Eàð <Ý$Ô9Ñ;Ô;Ð;Ø”k×-Ò-¨dÑ3Ô3ˆGØ §¢°°RÑ 8Ô 8Ñ8ˆGØÐ1Ñ1°GÑ;¸fÑDÐ Då�$”+×%Ò% dÑ+Ô+Ñ,Ô,ˆÝ%Ô/Ñ1Ô1Ðe�c�cµr´w·|²|ÀDÔDTÐVYÐZ\ÐZ]ÐZ]ÔV^Ð`dÑ7eÔ7eˆ à ð /åÐ%Ý$Ô9Ñ;Ô;Ð;å)¨'¬/Ñ:Ô:ˆLÝ”7—<’<  Ø % Ø-1¬Z¨Z¨ZÐ 9Ø ,  Ø.2¬j¨j¸'¿/º/È#ÈrÑ:RÔ:RÐ:RÐ SØ $¤ ñ /ô/ˆDˆDõ”7—<’<  Ø % Ø-1¬Z¨Z¨ZÐ 9Ð 9Ø.2¬j¨j¸'¿/º/È#ÈrÑ:RÔ:RÐ:RÐ SØ $¤ ñ /ô/ˆDð ˆ r)rN)NNr)FN)Ú__name__Ú __module__Ú __qualname__rÈrr1r>r-r5rIrNrLrÃriÚboolr rMr†r*r‹r„r‘r�r rsÚ staticmethodrhrArfr"rrrrs�€€€€€Ø€Hððððð SðSðSðSð !ð!ð!ð!ð8 %ð %ð %ð %ð $ð $ð $ð ið ið iðBðBðBðBð ð ð ð-%ð-% cð-%°Cð-%À4ÈÄ9ð-%ÐY]ð-%ÐpwÐz~Ñp~ð-%ðKOð-%ð-%ð-%ð-%ð^ðððð ð  sð °Sð ÀDÈÄIð ÐX_ÐbfÑXfð ÐrwÐx|ð~AôyBðDHðILôDMðOSðTWôOXðyXôsYð ð ð ð ð+Vð+V¸ð+VÀcð+VÐUYÐZ]ÔU^ð+VÐipÐswÑiwð+VðDIðJNðORôJSðUYðZ]ôU^ð`dðehô`iðJiôDjð+Vð+Vð+Vð+VðZnðnðnðnð#%ð#% sð#%°Sð#%ÀDÈÄIð#%ÐX_ÐbfÑXfð#%Ðrvð#%ð#%ð#%ð#%ðJ ð ð ð ðððð.%˜ Ð%6Ñ7Ô7Ðàð:5ð:5ñ„\ð:5ðx1ð1¨#ð1¸ð1ÀgÐPTÁnð1Ð`dð1ð1ð1ð1ð!ð!¨3ð!¸ð!ÀwÐQUÁ~ð!Ðadð!ð!ð!ð!ð!ð!rr)Ú __future__rrrrÅÚclcommonrÚ clextselectrÚ cluserselectr Úclselectexceptr Ú clselectprintr Úutilsr Úmodelsr Ú#clcagefslib.webisolation.jail_utilsrÚ ImportErrorrr"rrúrÝsBðð'Ð&Ð&Ð&Ð&Ð&Ø%Ð%Ð%Ð%Ð%Ð%ØÐÐÐÐÐØ € € € àÐÐÐÐÐà$Ð$Ð$Ð$Ð$Ð$Ø&Ð&Ð&Ð&Ð&Ð&Ø*Ð*Ð*Ð*Ð*Ð*Ø"Ð"Ð"Ð"Ð"Ð"Ø.Ð.Ð.Ð.Ð.Ð.ØÐÐÐÐÐðØBÐBÐBÐBÐBÐBÐBøØðððØ€N€N€NðøøøðEðEðEðEðE�l KñEôEðEðEðEsÁA Á AÁA