+
    =l jyp  ã                   óÌ  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHt ^ RIHtHtHtHtHtHtHt ^ RIHtHtHt RtRtRtR	tR
t]P@                  ! ]PB                  ! ]"4      4      t#Rt$Rt%]! RR] PL                  3R] PL                  3R]'3R]'3R]'3.4      t(]! RR]'3R]'3R]] P                   ,          3R]]',          3R]]),          3R]]),          3R]]),          3R]]',          3R]]',          3.	4      t*]! RR]'3R]'3R]'3R]'3.4      t+]! R R!]]',          3R"]]',          3R#]]',          3R$]]',          3R%]]',          3R&]]',          3R']]',          3R(]]',          3R)]]',          3R*]]',          3R+]]',          3R,]]',          3R-]]',          3R.]]',          3.4      t,]! R/R0]]]',          ,          3R1]]]',          ,          3.4      t-R2t.R3 R4 lt/R5 R6 lt0]! RR77      R8 R9 l4       t1R: t2]! RR77      R; R< l4       t3]! RR77      R= R> l4       t4]! RR77      R? R@ l4       t5]! RR77      RA RB l4       t6]! RR77      RC RD l4       t7]! RR77      RE RF l4       t8]! RR77      RG RH l4       t9]! RR77      RI RJ l4       t:]! RR77      RK RL l4       t;]! RR77      RM RN l4       t<]! RR77      RsRO RP ll4       t=]! RR77      RQ RR l4       t>]! RR77      RS RT l4       t?]! RR77      RU RV l4       t@RW RX ltARtRY RZ lltBR[ R\ ltCR] R^ ltDRuR_ R` lltERvRa Rb lltFRc Rd ltGRwRe Rf lltHRxRg Rh lltIRi Rj ltJRk Rl ltKRm Rn ltLRo Rp ltMRq Rr ltNR# )yé    N)Ú	lru_cache)Úrmtree)ÚDictÚListÚ
NamedTupleÚOptionalÚSequenceÚSetÚTuple)ÚdefaultsÚ
exceptionsÚutilz/var/run/reboot-requiredz/var/run/reboot-required.pkgsz/etc/machine-idz/var/lib/dbus/machine-idz!/usr/share/distro-info/ubuntu.csvz5(?P<release>\d+\.\d+) (LTS\s*)?(\((?P<series>\w+))?.*zd^(?P<major>[\d]+)[.-](?P<minor>[\d]+)[.-](?P<patch>[\d]+)-(?P<abi>[\d]+)-(?P<flavor>[A-Za-z0-9_-]+)$Ú
DistroInfoÚeolÚeol_esmÚseriesÚreleaseÚseries_codenameÚ
KernelInfoÚuname_machine_archÚuname_releaseÚ
build_dateÚproc_version_signature_versionÚmajorÚminorÚpatchÚabiÚflavorÚReleaseInfoÚdistributionÚpretty_versionÚCpuInfoÚcpuinfo_cpuÚcpuinfo_cpu_architectureÚcpuinfo_cpu_familyÚcpuinfo_cpu_implementerÚcpuinfo_cpu_partÚcpuinfo_cpu_revisionÚcpuinfo_cpu_variantÚcpuinfo_modelÚcpuinfo_model_nameÚcpuinfo_steppingÚcpuinfo_vendor_idÚ"sys_firmware_devicetree_base_modelÚsysinfo_modelÚsysinfo_typeÚRebootRequiredPkgsÚstandard_packagesÚkernel_packagesz(Mon|Tue|Wed|Thu|Fri|Sat|Sun).*c                ón   € V ^8„  d   QhR\         P                  R\        \        P                  ,          /# ©é   ÚunameÚreturn©ÚosÚuname_resultr   Údatetime)Úformats   "Ú1/usr/lib/python3/dist-packages/uaclient/system.pyÚ__annotate__r?   q   s+   € ÷ ñ Ü�?‰?ðäŒh×ÑÕ ñó    c                 ó¬  € \        4       '       d   \        P                  R 4       R# \        P                  R4        \        P                  ! RP                  V P                  4      4      p\        P                  P                  VP                  \        P                  P                  4      #   \         d    \        P                  R4        R# i ; i)zPNot attempting to use timestamp of kernel changelog because we're in a containerNz3Falling back to using timestamp of kernel changelogz1/usr/share/doc/linux-image-{}/changelog.Debian.gzzUnable to stat kernel changelog)Úis_containerÚLOGÚwarningr:   Ústatr=   r   r<   ÚfromtimestampÚst_mtimeÚtimezoneÚutcÚ	Exception)r7   Ústat_results   & r>   Ú_get_kernel_changelog_timestamprL   q   s©   € ô ‡~‚~Ü�‰ð5ô	
ñ ä‡K�KÐEÔFðÜ—g’gØ?×FÑFØ—‘óó
ˆô
 × Ñ ×.Ñ.Ø× Ñ ¤(×"3Ñ"3×"7Ñ"7ó
ð 	
øô ô Ü�‰Ð5Ô6Úðús   ¾A0B/ Â/ CÃCc                ón   € V ^8„  d   QhR\         P                  R\        \        P                  ,          /# r5   r9   )r=   s   "r>   r?   r?   ‹   s+   € ÷ ñ Ü�?‰?ðäŒh×ÑÕ ñr@   c                 óÎ  € \         P                  ! \        V P                  4      pVf!   \        P                  R4       \        V 4      # VP                  ^ 4      p \        P                  P                  VR4      pTP                  f+   TP                  \        P                  P                  R7      pT#   \         d$    \        P                  R4       \        T 4      u # i ; i)Nz*Unable to find build date in uname versionz%a %b %d %H:%M:%S %Z %Yz-Unable to parse build date from uname version)Útzinfo)ÚreÚsearchÚRE_KERNEL_EXTRACT_BUILD_DATEÚversionrC   rD   rL   Úgroupr<   ÚstrptimeÚ
ValueErrorrO   ÚreplacerH   rI   )r7   Ú
date_matchÚdate_strÚdts   &   r>   Ú_get_kernel_build_dater[   ‹   s½   € ô —’Ô7¸¿¹ÓG€JØÒÜ�‰Ð@ÔAÜ.¨uÓ5Ð5Ø×Ñ Ó"€Hð6Ü×Ñ×'Ñ'¨Ð2KÓLˆð 
‡y�yÒð �Z‰Zœx×0Ñ0×4Ñ4ˆZÓ5ˆØ€Iøô ô 6Ü�‰ÐCÔDÜ.¨uÓ5Ò5ð6ús   Á B6 Â6+C$Ã#C$)Úmaxsizec                ó$   € V ^8„  d   QhR\         /# ©r6   r8   )r   )r=   s   "r>   r?   r?       s   € ÷ &
ñ &
œñ &
r@   c                  óÈ  € R p  \        R4      pVP                  4       ^,          p \
        P                  ! 4       pVP                  P                  4       p\        V4      pVP                  P                  4       p\        P                  ! \        V4      pVf+   \        P	                  RV4       \        VVVV R R R R R R7	      # \        VVVV \        VP!                  R4      4      \        VP!                  R4      4      \        VP!                  R4      4      VP!                  R4      VP!                  R	4      R7	      #   \         d    \        P	                  R4        EL:i ; i)
Nz/proc/version_signaturez*failed to process /proc/version_signature.zFailed to parse kernel: %s)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Ú	load_fileÚsplitrJ   rC   rD   r:   r7   ÚmachineÚstripr[   r   rP   ÚmatchÚRE_KERNEL_UNAMEr   ÚintrT   )r   Úproc_version_signature_fullr7   r   r   r   Úuname_matchs          r>   Úget_kernel_infori   Ÿ   sG  € à%)Ð"ðBÜ&/Ð0IÓ&JÐ#Ø)D×)JÑ)JÓ)LÈQÕ)OÐ&ô �HŠH‹J€EØŸ™×,Ñ,Ó.ÐÜ'¨Ó.€Jà—M‘M×'Ñ'Ó)€MÜ—(’(œ?¨MÓ:€KØÒÜ�‰Ð0°-Ô@ÜØ1Ø'Ø!Ø+IØØØØØô

ð 
	
ô Ø1Ø'Ø!Ø+IÜ�k×'Ñ'¨Ó0Ó1Ü�k×'Ñ'¨Ó0Ó1Ü�k×'Ñ'¨Ó0Ó1Ø×!Ñ! %Ó(Ø×$Ñ$ XÓ.ô

ð 
	
øô/ ô BÜ�‰Ð@×AðBús   „"D= Ä= E!Å E!c                  óð  € ^ RI Hp  \        P                  ! 4       '       g   \	        R4      hV ! 4        Uu. uF  pRV9   g   K  VNK  	  pp\
        P
                  ! R4       Uu. uF   pR\        RV.4      ^ ,          9   g   K  VNK"  	  ppV Uu. uF  qU\        R4      R NK  	  ppV Uu. uF  pV\        R4      R NK  	  ppV U	u. uF  p	W–9   g   K  V	NK  	  up	# u upi u upi u upi u upi u up	i )	r   )Úget_installed_packages_namesz9get_installed_ubuntu_kernels needs to be executed as rootzlinux-image-z/boot/vmlinu[x|z]-*zLinux kernelÚfileNz/boot/vmlinu?-)Úuaclient.aptrk   r   Úwe_are_currently_rootÚRuntimeErrorÚglobÚsubpÚlen)
rk   ÚpackageÚlinux_imagerl   Úvmlinux_kernel_filesÚpackage_nameÚlinux_image_versionsÚ	file_nameÚvmlinuz_versionsrS   s
             r>   Úget_installed_ubuntu_kernelsrz   Ë   s5  € å9ä×%Ò%×'Ò'ÜØGó
ð 	
ñ 4Ô5óá5ˆGØ˜WÑ$÷ 	ˆÙ5ð ð ô —I’IÐ3Ô4óá4ˆDØœT 6¨4 .Ó1°!Õ4Ñ4÷ 	ˆÙ4ð ð ñ ALóÙ@K°”S˜Ó(Ð*Ó+Áð ð ñ
 .óá-ˆIð 	”#Ð&Ó'Ð)Ó*Ù-ð ð ñ (óá'ˆGØÑ*÷ 	ˆÙ'ñð ùò'ùò
ùòùòùò
s/   ¶	CÁCÁ$C$ÂC$ÂC)Â,C.Ã	C3ÃC3c                ó$   € V ^8„  d   QhR\         /# r^   ©Ústr)r=   s   "r>   r?   r?   ï   s   € ÷ ñ ”sñ r@   c                  ó@   € \        R R.4      w  rV P                  4       # )Údpkgz--print-architecture)rq   rc   )ÚoutÚ_errs     r>   Úget_dpkg_archr‚   î   s    € ä�fÐ4Ð5Ó6�I€CØ�9‰9‹;Ðr@   c                ó$   € V ^8„  d   QhR\         /# r^   r|   )r=   s   "r>   r?   r?   õ   s   € ÷ ñ ”sñ r@   c                  óì   €  \        R .4      w  rV P                  4       #   \        P                   d?     \	        R4      pRT9   g   RT9   d    R# RT9   d    R#  R#   \
         d      R# i ; ii ; i)úsystemd-detect-virtz/proc/1/cgroupÚdockerÚbuildkitÚbuildahÚpodmanÚ )rq   rc   r   ÚProcessExecutionErrorr`   rJ   )r€   Ú_Úproc_1_cgroups      r>   Úget_virt_typerŽ   ô   sz   € ðÜÐ,Ð-Ó.‰ˆØ�y‰y‹{ÐøÜ×+Ñ+ô ð		Ü%Ð&6Ó7ˆMØ˜=Ô(¨J¸-Ô,GÚØ˜mÔ+ÚâøÜô 	Ûð	úðús,   ‚   A3¶AÁAÁA/Á*A3Á.A/Á/A3c                ó$   € V ^8„  d   QhR\         /# r^   )r"   )r=   s   "r>   r?   r?   
  s   € ÷ 9ñ 9”gñ 9r@   c                  óú  € R p RpRp/ p/ pRp \        V 4      pVP                  R4      p\        R V 4       R4      pVP                  R4       F@  p	RV	9   g   K  V	P                  R^4      w  r«VP                  4       W:P                  4       &   KB  	   \        V4      pVP                  R4       F@  p	RV	9   g   K  V	P                  R^4      w  r«VP                  4       WJP                  4       &   KB  	   \        V4      p\        VP                  R
4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VVP                  R4      VP                  R4      R7      #   \         d)    \
        P                  R	P                  T 4      4        EL{i ; i  \         d)    \
        P                  R	P                  T4      4        ELPi ; i  \         d)    \
        P                  R	P                  T4      4        ELzi ; i)z/proc/cpuinfoz/proc/sysinfoz#/sys/firmware/devicetree/base/modelNz

c              3   óV   "  € T F  qP                  R 4      '       g   K  Vx € K!  	  R# 5i)Ú	processorN)Ú
startswith)Ú.0Úss   & r>   Ú	<genexpr>Úget_cpu_info.<locals>.<genexpr>  s   é € ÐFÑ(�1¯L©L¸×,E�QŠQÓ(ùs   ‚)Ÿ
)rŠ   Ú
Ú:zcould not open {}ÚcpuzCPU architecturez
cpu familyzCPU implementerzCPU partzCPU revisionzCPU variantÚmodelz
model nameÚsteppingÚ	vendor_idÚModelÚType)r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   )
r`   ra   Únextrc   ÚFileNotFoundErrorrC   Úinfor=   r"   Úget)ÚCPUINFO_FILEÚSYSINFO_FILEÚDEVICETREE_FILEÚcpuinfo_valuesÚsysinfo_valuesÚdevicetree_base_modelÚcpuinfo_contentÚcpuinfo_sectionsÚfirst_cpu_contentÚlineÚkeyÚvalueÚsysinfo_contents                r>   Úget_cpu_infor±   	  sC  € à"€LØ"€LØ;€Oà€NØ€NØ Ðð<Ü# LÓ1ˆð +×0Ñ0°Ó8ÐÜ ÙFÑ(ÓFÈó
Ðð &×+Ñ+¨DÖ1ˆDØ�dŽ{Ø!ŸZ™Z¨¨QÓ/‘
�Ø.3¯k©k«m�Ÿy™y›{Ó+ñ 2ð
<Ü# LÓ1ˆð $×)Ñ)¨$Ö/ˆDØ�dŽ{Ø!ŸZ™Z¨¨QÓ/‘
�Ø.3¯k©k«m�Ÿy™y›{Ó+ñ 0ð
>Ü )¨/Ó :Ðô Ø"×&Ñ& uÓ-Ø!/×!3Ñ!3Ð4FÓ!GØ)×-Ñ-¨lÓ;Ø .× 2Ñ 2Ð3DÓ EØ'×+Ñ+¨JÓ7Ø+×/Ñ/°Ó?Ø*×.Ñ.¨}Ó=Ø$×(Ñ(¨Ó1Ø)×-Ñ-¨lÓ;Ø'×+Ñ+¨JÓ7Ø(×,Ñ,¨[Ó9Ø+@Ø$×(Ñ(¨Ó1Ø#×'Ñ'¨Ó/ôð øô? ô ;Ü�‰Ð$×+Ñ+¨LÓ9×:ð;ûô$ ô ;Ü�‰Ð$×+Ñ+¨LÓ9×:ð;ûô ô >Ü�‰Ð$×+Ñ+¨OÓ<×=ð>ús5   ŽG ÂH Ã4I Ç/HÈHÈ/IÉIÉ/I:É9I:c                ó$   € V ^8„  d   QhR\         /# r^   r|   )r=   s   "r>   r?   r?   G  s   € ÷ ñ œ3ñ r@   c                ó  € ^ RI Hp ^ RIHp VP	                  4       pVP                  '       d6   VP                  P                  R/ 4      P                  R4      pV'       d   V# VP                  4       p\        \        3 FP  p\        P                  P                  V4      '       g   K*  \        V4      P                  R4      pV'       g   KN  Vu # 	  V'       d   V# \        \        P                   ! 4       4      pVP#                  V4       V# )zš
Get system's unique machine-id or create our own in data_dir.
We first check for the machine-id in machine-token.json before
looking at the system file.
)Úmachine_token)Úmachine_id_fileÚmachineTokenInfoÚ	machineIdr˜   )Úuaclient.filesr´   Úuaclient.files.state_filesrµ   Úget_machine_token_filer£   ÚreadÚETC_MACHINE_IDÚDBUS_MACHINE_IDr:   ÚpathÚexistsr`   Úrstripr}   ÚuuidÚuuid4Úwrite)Úcfgr´   rµ   Úmachine_token_fileÚ
machine_idÚfallback_machine_idr¾   Úcontents   &       r>   Úget_machine_idrÉ   F  sÖ   € õ -Ý:à&×=Ñ=Ó?ÐØ×'×'Ð'Ø'×5Ñ5×9Ñ9Ø ó
ç
‰#ˆkÓ
ð 	÷ ØÐà)×.Ñ.Ó0Ðä¤Ó1ˆÜ�7‰7�>‰>˜$×ÔÜ “o×,Ñ,¨TÓ2ˆGß‰wØ’ñ	 2÷ Ø"Ð"ä”T—Z’Z“\Ó"€JØ×Ñ˜*Ô%ØÐr@   c                ó$   € V ^8„  d   QhR\         /# r^   )r   )r=   s   "r>   r?   r?   i  s   € ÷ ñ œ+ñ r@   c                  ó�  € \        4       p V P                  R R4      p\        P                  ! RRV P                  RR4      4      pV P                  RR4      pV P                  RR4      pV'       d	   V'       g³   \        P                  ! \
        V4      pV'       g)   \        P                  ! V P                  RR4      VR7      hVP                  4       pT;'       g    VP                  R	R4      pV'       g   \        P                  ! VR
7      hT;'       g    VP                  RR4      p\        VVVP                  4       VR7      # )ÚNAMEÚUNKNOWNz\.\d LTSz LTSÚVERSIONrŠ   ÚVERSION_CODENAMEÚ
VERSION_ID)Úorig_verÚmod_verr   )rS   r   )r    r   r   r!   )Ú_parse_os_releaser£   rP   Úsubrd   ÚREGEX_OS_RELEASE_VERSIONr   ÚParsingErrorOnOSReleaseFileÚ	groupdictÚMissingSeriesOnOSReleaseFiler   Úlower)Ú
os_releaser    r!   r   r   rd   Ú
match_dicts          r>   Úget_release_inforÜ   h  s  € ä"Ó$€JØ—>‘> &¨)Ó4€LÜ—V’V˜K¨°·±À	È2Ó1NÓO€NØ�^‰^Ð.°Ó3€FØ�n‰n˜\¨2Ó.€GçŸÜ—’Ô1°>ÓBˆßÜ×8Ò8Ø#Ÿ™¨	°2Ó6Àôð ð —_‘_Ó&ˆ
Ø×7Ð7˜:Ÿ>™>¨(°BÓ7ˆßÜ×9Ò9Ø&ôð ð ×:Ð:˜ZŸ^™^¨I°rÓ:ˆäØ!ØØ�|‰|‹~Ø%ô	ð r@   c                ó0   € V ^8„  d   QhR\         R\        /# ©r6   r   r8   ©r}   Úbool)r=   s   "r>   r?   r?   ‰  s   € ÷ ñ ”3ð œ4ñ r@   c                 ó(   € \        R R.4      w  rW9   # )ú/usr/bin/ubuntu-distro-infoz--supported-esm©rq   ©r   r€   r�   s   &  r>   Úis_ltsrå   ˆ  s   € äÐ3Ð5FÐGÓH�I€CØ‰=Ðr@   c                ó$   € V ^8„  d   QhR\         /# r^   ©rà   )r=   s   "r>   r?   r?   �  s   € ÷ -ñ -œtñ -r@   c                  ó<   € \        \        4       P                  4      # ©N)rå   rÜ   r   © r@   r>   Úis_current_series_ltsrë   Ž  s   € äÔ"Ó$×+Ñ+Ó,Ð,r@   c                ó0   € V ^8„  d   QhR\         R\        /# rÞ   rß   )r=   s   "r>   r?   r?   ”  s   € ÷ ñ œð ¤ñ r@   c                 ó(   € \        R R.4      w  rW9   # )râ   z--supportedrã   rä   s   &  r>   Úis_supportedrî   “  s   € äÐ3°]ÐCÓD�I€CØ‰=Ðr@   c                ó0   € V ^8„  d   QhR\         R\        /# rÞ   rß   )r=   s   "r>   r?   r?   š  s   € ÷ ñ œ#ð ¤$ñ r@   c                óf   € \        V 4      '       g   R# \        RRV R.4      w  r\        V4      ^ 8*  # )zCReturn True when Ubuntu series supports ESM and is actively in ESM.Frâ   z--seriesz-yeol)rå   rq   rf   rä   s   &  r>   Úis_active_esmrñ   ™  s8   € ô �&�>Š>ÙÜØ	&¨
°F¸GÐDó�I€Cô ˆs‹8�q‰=Ðr@   c                ó$   € V ^8„  d   QhR\         /# r^   rç   )r=   s   "r>   r?   r?   ¥  s   € ÷ 4ñ 4¤dñ 4r@   c                  ó<   € \        \        4       P                  4      # ré   )rñ   rÜ   r   rê   r@   r>   Úis_current_series_active_esmrô   ¤  s   € äÔ)Ó+×2Ñ2Ó3Ð3r@   c                ó0   € V ^8„  d   QhR\         R\        /# )r6   Úrun_pathr8   rß   )r=   s   "r>   r?   r?   ª  s   € ÷ ñ œ3ð ¬Dñ r@   c                óH  €  \        R.4       R#   \        P                   d     Mi ; i \        . RO4       R#   \        \        3 d     Mi ; iR FJ  p\
        P                  P                  Y4      p\
        P                  P                  T4      '       g   KI   R# 	  R# )z>Checks to see if this code running in a container of some sortÚischrootFT)r…   ú--quietz--container)Úcontainer_typezsystemd/container)	rq   r   r‹   ÚIOErrorÚOSErrorr:   r¾   Újoinr¿   )rö   Úfilenamer¾   s   &  r>   rB   rB   ©  s�   € ðÜˆjˆ\ÔÙøÜ×+Ñ+ô ÙðúðÜÒ>Ô?ÙøÜ”WÐô Ùðúó <ˆÜ�w‰w�|‰|˜HÓ/ˆÜ�7‰7�>‰>˜$×ÔÚñ <ñ s   ‚ �(§(¬; »AÁAc                ó$   € V ^8„  d   QhR\         /# r^   rç   )r=   s   "r>   r?   r?   Å  s   € ÷ 
ñ 
”Dñ 
r@   c                 óh   € ^ RI Hp  V P                  4        F  pRVP                  9   g   K   R# 	  R# )z•Returns True if any package installed has "ubuntu-desktop" in the name.

This includes ubuntu-desktop, ubuntu-desktop-minimal, kubuntu-desktop, etc.
)Úaptzubuntu-desktopTF)Úuaclientr  Úget_installed_packagesÚname)r  rs   s     r>   Ú
is_desktopr  Ä  s.   € õ à×-Ñ-Ö/ˆØ˜wŸ|™|Ö+Úñ 0ñ r@   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r^   )r   r}   )r=   s   "r>   r?   r?   Ó  s   € ÷ 
ñ 
œ4¤¤S �>ñ 
r@   c                  ó  €  \        R 4      p / pV P                  4        FB  pVP                  R^4      w  r4V'       g   K!  VP	                  4       P	                  R4      W&   KD  	  V#   \         d    \        R4      p  Lri ; i)z/etc/os-releasez/usr/lib/os-releaseÚ=Ú")r`   r¡   Ú
splitlinesra   rc   )Úfile_contentsÚdatar­   r®   r¯   s        r>   rÓ   rÓ   Ò  s~   € ð9Ü!Ð"3Ó4ˆð €DØ×(Ñ(Ö*ˆØ—Z‘Z  QÓ'‰
ˆß‰5ØŸ™›×+Ñ+¨CÓ0ˆD‹Iñ +ð €Køô ô 9Ü!Ð"7Ó8Šð9ús   ‚A' Á'B Á?B c                ó0   € V ^8„  d   QhR\         R\        /# rÞ   )r}   r   )r=   s   "r>   r?   r?   á  s   € ÷ Bñ BœCð B¤Jñ Br@   c                 ód  €  \        \        4      P                  4       pT FÒ  pTP                  R 4      pT^,          T 8X  g   K$  T R8X  d   RpM RT^ ,          9   d
   T^,          MT^,          p\        T^ ,          T^,          T^,          \        P                  P                  T^,          R4      P                  4       \        P                  P                  TR4      P                  4       R7      u # 	  \        P                  ! T R7      h  \         d    \        P
                  ! 4       hi ; i)Ú,Úxenialz
2026-04-23ÚLTSz%Y-%m-%d)r   r   r   r   r   )r   )r`   ÚDISTRO_INFO_CSVr
  r¡   r   ÚMissingDistroInfoFilera   r   r<   rU   ÚdateÚMissingSeriesInDistroInfoFile)r   Úlinesr­   Úvaluesr   s   &    r>   Úget_distro_infor  à  sý   € ð1Üœ/Ó*×5Ñ5Ó7ˆó ˆØ—‘˜C“ˆØ�!�9˜ÖØ˜Ô!Ø&‘à',°°qµ	Ô'9˜& ž)¸vÀa½y�ÜØ˜q�	Ø & q¥	Ø˜a•yÜ×%Ñ%×.Ñ.¨v°a­y¸*ÓE×JÑJÓLÜ ×)Ñ)×2Ñ2°7¸JÓG×LÑLÓNôò ñ ô ×
2Ò
2¸&Ô
AÐAøô# ô 1Ü×.Ò.Ó0Ð0ð1ús   ‚D Ä!D/c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r6   Úprogramr8   ©r}   r   )r=   s   "r>   r?   r?   ø  s   € ÷ ñ ”3ð œ8¤C�=ñ r@   c                ó  € \         P                  P                  V 9   d   \        V 4      '       d   V # \         P                  P                  RR4      P                  \         P                  4       Uu. uF  qP                  R4      NK  	  ppV Uu. uF"  p\         P                  P                  V4      NK$  	  ppV F7  p\         P                  P                  W@4      p\        V4      '       g   K5  Vu # 	  R# u upi u upi )z;Find whether the provided program is executable in our PATHÚPATHrŠ   r	  N)r:   r¾   ÚsepÚis_exeÚenvironr£   ra   Úpathseprc   Úabspathrý   )r  ÚpÚpathsÚnormalized_pathsr¾   Úprogram_paths   &     r>   Úwhichr'  ø  sÁ   € ä	‡w�w‡{�{�gÔä�'�?Š?ØˆNä Ÿj™jŸn™n¨V°RÓ8×>Ñ>¼r¿z¹zÔJóÙJ˜�‰�ŽÑJð 
ð ñ 5:Ó:±E¨qœŸ™Ÿ™¨Ö*±EÐÐ:Û ˆÜ—w‘w—|‘| DÓ2ˆÜ�,×ÔØÒñ !ñ ùòùò ;s   Á2C:Â(C?c                ó”   € V ^8„  d   QhR\         \        \        ,          ,          R\         \        \        ,          ,          R\        /# )r6   Úinstalled_pkgsÚinstalled_pkgs_regexr8   )r   r
   r}   rà   )r=   s   "r>   r?   r?   	  s8   € ÷ 3ñ 3ÜœS¤�XÕ&ð3ä"¤3¤s¥8Õ,ð3ô 
ñ3r@   c                óš  € \         P                  P                  \        4      '       g   R# V f   Vf   R#  \	        \        \        4      P                  R4      4      pT e"   \        T P                  T4      4      ^ 8w  d   R# Te3   T F,  pT F#  p\        P                  ! YC4      '       g   K!    R# 	  K.  	  R#   \         d     R# i ; i)a‘  Check if the system needs to be rebooted.

:param installed_pkgs: If provided, verify if the any packages in
    the list are present on /var/run/reboot-required.pkgs. If that
    param is provided, we will only return true if we have the
    reboot-required marker file and any package in reboot-required.pkgs
    file. When both installed_pkgs and installed_pkgs_regex are
    provided, they act as an OR, so only one of the two lists must have
    a match to return True.
:param installed_pkgs_regex: If provided, verify if the any regex in
    the list matches any line in /var/run/reboot-required.pkgs. If that
    param is provided, we will only return true if we have the
    reboot-required marker file and any match in reboot-required.pkgs
    file. When both installed_pkgs and installed_pkgs_regex are
    provided, they act as an OR, so only one of the two lists must have
    a match to return True.
FTr˜   )r:   r¾   r¿   ÚREBOOT_FILE_CHECK_PATHÚsetr`   ÚREBOOT_PKGS_FILE_PATHra   r¡   rr   ÚintersectionrP   rQ   )r)  r*  Úreboot_required_pkgsÚpkg_nameÚ	pkg_regexs   &&   r>   Úshould_rebootr3  	  s»   € ô0 �7‰7�>‰>Ô0×1Ò1Ùð ÒÐ"6Ò">ÙðÜ"ÜÔ+Ó,×2Ñ2°4Ó8ó 
Ðð Ò!Üˆ~×*Ñ*Ð+?Ó@ÓAÀQÔFÙàÒ'Û,ˆHÛ1�	Ü—9’9˜Y×1Ô1Ûó 2ñ -ñ
 øô ô ò ðús   ·'B; Â;C
Ã	C
c                ó0   € V ^8„  d   QhR\         R\        /# )r6   r¾   r8   rß   )r=   s   "r>   r?   r?   ?  s   € ÷ =ñ =”ð =œñ =r@   c                 óš   € \         P                  P                  V 4      ;'       d&    \         P                  ! V \         P                  4      # ré   )r:   r¾   ÚisfileÚaccessÚX_OK)r¾   s   &r>   r  r  ?  s,   € ä�7‰7�>‰>˜$Ó×<Ð<¤B§I¢I¨d´B·G±GÓ$<Ð<r@   c                ó0   € V ^8„  d   QhR\         R\         /# )r6   rþ   r8   r|   )r=   s   "r>   r?   r?   D  s   € ÷ 

ñ 

œð 

¤ñ 

r@   c                ó   € \        V R4      ;_uu_ 4       p\        P                  RV 4       VP                  4       pRRR4        XP	                  R4      #   + '       g   i     L"; i  \
         d    \        P                  ! T RR7      hi ; i)z!Read filename and decode content.ÚrbzReading file: %sNúutf-8)rx   Úfile_encoding)ÚopenrC   Údebugr»   ÚdecodeÚUnicodeDecodeErrorr   ÚInvalidFileEncodingError)rþ   ÚstreamrÈ   s   &  r>   r`   r`   D  su   € ä	ˆh˜×	Ô	 Ü�	‰	Ð$ hÔ/Ø—+‘+“-ˆ÷ 
ð
Ø�~‰~˜gÓ&Ð&÷	 
×	ûô
 ô 
Ü×1Ò1Ø¨gô
ð 	
ð
ús   •'AÁA) ÁA&	Á)$Bc                ó4   € V ^8„  d   QhR\         R\        RR/# )r6   rþ   Úmoder8   N)r}   rf   )r=   s   "r>   r?   r?   Q  s!   € ÷ ñ œ#ð ¤Sð °Tñ r@   c                 ó  € \         P                  R V 4       \        P                  ! \        P                  P                  V 4      RR7       \        P                  ! V 4      P                  4        \        P                  ! W4       R# )zCreating file: %sT©Úexist_okN)
rC   r?  r:   Úmakedirsr¾   ÚdirnameÚpathlibÚPathÚtouchÚchmod)rþ   rE  s   &&r>   Úcreate_filerO  Q  sM   € Ü‡I�IÐ! 8Ô,Ü‡K‚K”—‘—‘ Ó)°DÕ9Ü‡L‚L�Ó× Ñ Ô"Ü‡H‚HˆXÖr@   c                óV   € V ^8„  d   QhR\         R\         R\        \        ,          RR/# )r6   rþ   rÈ   rE  r8   N)r}   r   rf   )r=   s   "r>   r?   r?   X  s0   € ÷ (ñ (Üð(Üð(Ü'/´¥}ð(à	ñ(r@   c                ó  € Rp\         P                  P                  V 4      pV'       dL   \        P                  ! V 4      P                  4       p\
        P                  ! VP                  4      pVf   TpMVf   Rp \         P                  ! \         P                  P                  V 4      RR7       \        P                  ! RR\         P                  P                  V 4      R7      p\        P                  RWP                  4       VP                  VP!                  R	4      4       VP#                  4        VP%                  4        \         P&                  ! VP                  V4       V'       d7   \         P(                  ! VP                  XP*                  VP,                  4       \         P.                  ! VP                  V 4       R#   \0         d,   pTe!   \         P2                  ! TP                  4       ThRp?ii ; i)
aG  Write content to the provided filename encoding it if necessary.

We preserve the file ownership and permissions if the file is present
and no mode argument is provided.

@param filename: The full path of the file to write.
@param content: The content to write to the file.
@param mode: The filesystem mode to set on the file.
Né¤  TrG  ÚwbF)rE  ÚdeleteÚdirz*Writing file %s atomically via tempfile %sr<  )r:   r¾   r6  rK  rL  rE   ÚS_IMODEÚst_moderI  rJ  ÚtempfileÚNamedTemporaryFilerC   r?  r  rÃ   ÚencodeÚflushÚcloserN  ÚchownÚst_uidÚst_gidÚrenamerJ   Úunlink)rþ   rÈ   rE  ÚtmpfÚis_file_presentÚ	file_statÚf_modeÚes   &&&     r>   Ú
write_filerg  X  sT  € ð €DÜ—g‘g—n‘n XÓ.€OßÜ—L’L Ó*×/Ñ/Ó1ˆ	Ü—’˜i×/Ñ/Ó0ˆØŠ<ØˆDøà	ŠØˆðÜ
�Š”B—G‘G—O‘O HÓ-¸Õ=Ü×*Ò*Ø˜e¬¯©¯©¸Ó)Bô
ˆô 	�	‰	Ø8¸(ÇIÁIô	
ð 	�
‰
�7—>‘> 'Ó*Ô+Ø�
‰
ŒØ�
‰
ŒÜ
�Š�—‘˜DÔ!ßÜ�HŠH�T—Y‘Y 	× 0Ñ 0°)×2BÑ2BÔCÜ
�	Š	�$—)‘)˜XÖ&øÜô ØÒÜ�IŠI�d—i‘iÔ Øˆûðús   Á<EG	 Ç	G?Ç&G:Ç:G?c                ó(   € V ^8„  d   QhR\         RR/# )r6   Ú	file_pathr8   Nr|   )r=   s   "r>   r?   r?   ƒ  s   € ÷ Kñ K¤#ð K¨$ñ Kr@   c                ó°   €  \         P                  ! V 4       \        P                  RV 4       R#   \         d    \        P                  RT 4        R# i ; i)z<Remove a file if it exists, logging a message about removal.zRemoved file: %sz*Tried to remove %s but file does not existN)r:   ra  rC   r?  r¡   )ri  s   &r>   Úensure_file_absentrk  ƒ  sC   € ðKÜ
�	Š	�)ÔÜ�	‰	Ð$ iÖ0øÜô KÜ�	‰	Ð>À	×JðKús   ‚,0 °!AÁAc                ó  € V ^8„  d   QhR\         \        ,          R\        \        \        ,          ,          R\
        R\        \        ,          R\        \        \        \        3,          ,          R\
        R\        \        \        3,          /# )r6   ÚargsÚrcsÚcaptureÚtimeoutÚoverride_env_varsÚpipe_stdouterrr8   ©	r	   r}   r   r   rf   rà   Úfloatr   r   )r=   s   "r>   r?   r?   Œ  s}   € ÷ U"ñ U"Ü
”3�-ðU"ä	”$”s•)Õ	ðU"ô ðU"ô ”e�_ð	U"ô
  ¤¤S¬# X¥Õ/ðU"ô ðU"ô Œ3”ˆ8…_ñU"r@   c                ó4  € V  Uu. uF,  p\        V\        4      '       d   TMVP                  R4      NK.  	  ppRpRp	/ p
V'       d'   \        P                  p\        P                  p	RRRR/p
Vf   / p/ \
        P                  CV
CVCpVf   ^ .p\        P                  ! RP                  V 4      4      p \        P                  ! VVV	VR7      pVP                  VR7      w  rïT'       d   TP                  RR	R
7      MRpT'       d   TP                  RR	R
7      MRpTP                   T9  d%   \        P                  ! TTP                   TTR7      hT'       d#   \$        P'                  RTTP                   T4       TT3# u upi   \         d‡     X'       d   TP                  RR	R
7      MRpX'       d   TP                  RR	R
7      MRp\        P                  ! TXP                   TTR7      h  \"         d    \        P                  ! TR7      hi ; ii ; i)a“  Run a command and return a tuple of decoded stdout, stderr.

@param args: A list of arguments to feed to subprocess.Popen
@param rcs: A list of allowed return_codes. If returncode not in rcs
    raise a ProcessExecutionError.
@param capture: Boolean set True to log the command and response.
@param timeout: Optional float indicating number of seconds to wait for
    subp to return.
@param override_env_vars: Optional dictionary of environment variables.
    If None, the current os.environ is used for the subprocess.
    If defined, these env vars get merged with the current process'
    os.environ for the subprocess, overriding any values that already
    existed in os.environ.

@return: Tuple of utf-8 decoded stdout, stderr
@raises ProcessExecutionError on invalid command or returncode not in rcs.
@raises subprocess.TimeoutError when timeout specified and the command
    exceeds that number of seconds.
r<  NÚLANGzC.UTF-8ÚLC_ALLÚ )ÚstdoutÚstderrÚenv)rp  Úignore)ÚerrorsrŠ   )ÚcmdÚ	exit_codery  rz  )r~  zRan cmd: %s, rc: %s stderr: %s)Ú
isinstanceÚbytesrZ  Ú
subprocessÚPIPEr:   r   r   Úredact_sensitive_logsrý   ÚPopenÚcommunicaterü   r@  r   r‹   Ú
returncodeÚUnboundLocalErrorrC   r?  )rm  rn  ro  rp  rq  rr  ÚxÚ
bytes_argsry  rz  Úset_langÚ
merged_envÚredacted_cmdÚprocr€   ÚerrÚ
out_resultÚ
err_results   &&&&&&            r>   Ú_subpr’  Œ  s  € ñ8 CGóÙBF¸QŒZ˜œ5×!Ò!‰ q§x¡x°Ó'8Ò8Á$ð ð ð €FØ€FØ€HçÜ—‘ˆÜ—‘ˆà˜I x°Ð;ˆàÒ ØÐØ@”B—J‘JÐ@ (Ð@Ð.?Ð@€Jà
‚{ØˆcˆÜ×-Ò-¨c¯h©h°t«nÓ=€LðEÜ×ÒØØØØô	
ˆð ×%Ñ%¨gÐ%Ó6‰
ˆ÷ :=�—‘˜G¨H�Ô5À"€Jß9<�—‘˜G¨H�Ô5À"€JØ‡�˜cÔ!Ü×.Ò.ØØ—o‘oØØô	
ð 	
÷ Ü�	‰	Ø,ØØ�O‰OØô		
ð �zÐ!Ð!ùòuøô: ô Eð
	EßAD˜Ÿ™ G°H˜Ô=È"ˆJßAD˜Ÿ™ G°H˜Ô=È"ˆJÜ×2Ò2Ø ØŸ/™/Ø!Ø!ô	ð øô !ô 	EÜ×2Ò2°|ÔDÐDð	EúðEús/   …2FÂ6.F ÆHÆG0ÆG0Æ79G0Ç0#HÈHc                óV  € V ^8„  d   QhR\         \        ,          R\        \        \        ,          ,          R\
        R\        \        ,          R\        \        \        ,          ,          R\        \        \        \        3,          ,          R\
        R\        \        \        3,          /# )	r6   rm  rn  ro  rp  Úretry_sleepsrq  rr  r8   rs  )r=   s   "r>   r?   r?   ä  s‡   € ÷ 5ñ 5Ü
”3�-ð5ä	”$”s•)Õ	ð5ô ð5ô ”e�_ð	5ô
 œ4¤�;Õ'ð5ô  ¤¤S¬# X¥Õ/ð5ô ð5ô Œ3”ˆ8…_ñ5r@   c           	     ó  € Ve   VP                  4       MRp  \        V VVVVVR7      w  rx Wx3#   \        P                   dÈ   p	T'       dJ   \        P                  \        T	4      4       \        P                  RT	P                  T	P                  4       T'       g   h \        P                  \        T	4      4       \        P                  R\        T4      4       \        P                  ! TP                  ^ 4      4        Rp	?	Kð  Rp	?	ii ; i)a–  Run a command and return a tuple of decoded stdout, stderr.

 @param subp: A list of arguments to feed to subprocess.Popen
 @param rcs: A list of allowed return_codes. If returncode not in rcs
     raise a ProcessExecutionError.
 @param capture: Boolean set True to log the command and response.
 @param timeout: Optional float indicating number of seconds to wait for a
     subp call to return.
 @param retry_sleeps: Optional list of sleep lengths to apply between
    retries. Specifying a list of [0.5, 1] instructs subp to retry twice
    on failure; sleeping half a second before the first retry and 1 second
    before the next retry.
 @param override_env_vars: Optional dictionary of environment variables.
    If None, the current os.environ is used for the subprocess.
    If defined, these env vars get merged with the current process'
    os.environ for the subprocess, overriding any values that already
    existed in os.environ.

@return: Tuple of utf-8 decoded stdout, stderr
@raises ProcessExecutionError on invalid command or returncode not in rcs.
@raises subprocess.TimeoutError when timeout specified and the command
    exceeds that number of seconds.
N)rq  rr  zStderr: %s
Stdout: %szRetrying %d more times.)Úcopyr’  r   r‹   rC   r?  r}   rD   rz  ry  rr   ÚtimeÚsleepÚpop)
rm  rn  ro  rp  r”  rq  rr  r€   r�  rf  s
   &&&&&&&   r>   rq   rq   ä  sÖ   € ð@ +7Ò*B�<×$Ñ$Ô&È€LØ
ð	,ÜØØØØØ"3Ø-ô‰HˆCð ð ˆ8€Oøô ×/Ñ/ô 	,ßÜ—	‘	œ#˜a›&Ô!Ü—‘Ð4°a·h±hÀÇÁÔIßØÜ�I‰I”c˜!“fÔÜ�I‰IÐ/´°\Ó1BÔCÜ�JŠJ�|×'Ñ'¨Ó*×+Ò+ûð	,ús   ™0 °DÁADÂA#DÄDc                ó(   € V ^8„  d   QhR\         RR/# )r6   Úfolder_pathr8   Nr|   )r=   s   "r>   r?   r?     s   € ÷ Oñ O¤cð O¨dñ Or@   c                 óš   €  \        V 4       \        P                  R V 4       R#   \         d    \        P                  RT 4        R# i ; i)zRemoved folder: %sz,Tried to remove %s but folder does not existN)r   rC   r?  r¡   )r›  s   &r>   Úensure_folder_absentr�    s?   € ðOÜˆ{ÔÜ�	‰	Ð&¨Ö4øÜô OÜ�	‰	Ð@À+×NðOús   ‚!% ¥!A
Á	A
c                ó0   € V ^8„  d   QhR\         R\        /# ©r6   Úservice_namer8   rß   )r=   s   "r>   r?   r?   $  s   € ÷ ñ ¬ð ´ñ r@   c                ó^   €  \        RRRV .4       R#   \        P                   d     R# i ; i)aB  
Get if the systemd job is active in the system. Note that any status
different from "active" will make this function return False.
Additionally, if the system doesn't exist we will also return False
here.

@param service_name: Name of the systemd job to look at

@return: A Boolean specifying if the job is active or not
Ú	systemctlz	is-activerù   FT)rq   r   r‹   )r   s   &r>   Úis_systemd_unit_activer£  $  s7   € ðÜˆk˜;¨	°<Ð@ÔAñ øô ×+Ñ+ô Úðús   ‚ “,«,c                óF   € V ^8„  d   QhR\         R\        \         ,          /# rŸ  r  )r=   s   "r>   r?   r?   6  s   € ÷ ñ ´ð ¼Ä½ñ r@   c                 óZ  €  \        R RRRV .4      w  rV'       d>   VP                  R4      '       d'   VP                  R4      ^,          P                  4       # \        P                  RV 4        R	#   \        P                   d$   p\        P                  RT TR7        R	p?R	# R	p?ii ; i)
r¢  Úshowz--property=ActiveStatez
--no-pagerzActiveState=r  z9Couldn't find ActiveState in systemctl show output for %sz-Failed to get ActiveState for systemd unit %s)Úexc_infoN)rq   r“   ra   rc   rC   rD   r   r‹   )r   r€   rŒ   rf  s   &   r>   Úget_systemd_unit_active_stater¨  6  s©   € ð
ÜàØØ(ØØðó
‰ˆ÷ �3—>‘> .×1Ò1Ø—9‘9˜S“> !Õ$×*Ñ*Ó,Ð,ä�K‰KØKØõñ øô ×+Ñ+ô 
Ü�‰Ø;ØØð 	÷ 	
ð 	
ñ
 ûð
ús"   ‚0A2 ³%A2 ÁA2 Á2B*ÂB%Â%B*c                ó$   € V ^8„  d   QhR\         /# r^   r|   )r=   s   "r>   r?   r?   Q  s   € ÷ 
ñ 
œCñ 
r@   c                  óš  € \         P                  ! 4       '       d   \        P                  # \        P
                  P                  R 4      p V '       d/   \        P                  P                  V \        P                  4      # \        P                  P                  \        P                  P                  R4      R\        P                  4      # )ÚXDG_CACHE_HOMEÚ~z.cache)r   rn   r   ÚUAC_RUN_PATHr:   r   r£   r¾   rý   ÚUSER_CACHE_SUBDIRÚ
expanduser)Úxdg_cache_homes    r>   Úget_user_cache_dirr±  Q  s   € Ü×!Ò!×#Ò#Ü×$Ñ$Ð$ä—Z‘Z—^‘^Ð$4Ó5€NßÜ�w‰w�|‰|˜N¬H×,FÑ,FÓGÐGä�7‰7�<‰<Ü
�‰×Ñ˜3Ó ¬8×+EÑ+Eóð r@   c                ó:   € V ^8„  d   QhR\         \        ,          /# r^   )r   r1   )r=   s   "r>   r?   r?   ^  s   € ÷ ñ ¤(Ô+=Õ">ñ r@   c                  ó>  €  \        \        4      p . p. pRpT P                  4        FC  p\        P
                  ! Y44      '       d   TP                  T4       K2  TP                  T4       KE  	  \        \        T4      \        T4      R7      #   \         d     R # i ; i)Nz^(linux-image|linux-base).*)r2   r3   )	r`   r.  r¡   ra   rP   rd   Úappendr1   Úsorted)Úpkg_list_strr2   r3   Úkernel_regexÚpkgs        r>   Úget_reboot_required_pkgsr¹  ^  s–   € ðÜ Ô!6Ó7ˆð ÐØ€OØ0€Là×!Ñ!Ö#ˆÜ�8Š8�L×&Ò&Ø×"Ñ" 3Ö'à×$Ñ$ SÖ)ñ	 $ô Ü Ð!2Ó3Ü˜Ó/ôð øô ô Úðús   ‚B ÂBÂB)z/run)NN)rR  ré   )NFNNT)NFNNNT)Or<   rp   Úloggingr:   rK  rP   rE   r‚  rX  r—  rÁ   Ú	functoolsr   Úshutilr   Útypingr   r   r   r   r	   r
   r   r  r   r   r   r,  r.  r¼   r½   r  Ú	getLoggerÚreplace_top_level_logger_nameÚ__name__rC   rÕ   re   r  r}   r   rf   r   r   r"   r1   rR   rL   r[   ri   rz   r‚   rŽ   r±   rÉ   rÜ   rå   rë   rî   rñ   rô   rB   r  rÓ   r  r'  r3  r  r`   rO  rg  rk  r’  rq   r�  r£  r¨  r±  r¹  rê   r@   r>   Ú<module>rÁ     sO  ðÛ Û Û Û 	Û Û 	Û Û Û Û Û Ý Ý ß I× IÑ Iç /Ñ /à3Ð Ø7Ð Ø"€Ø,€Ø5€à×Ò˜×:Ò:¸8ÓDÓE€ð =ð ð

	ð ñ Øà	�—‘ÐØ	�H—M‘MÐ"Ø	�3ˆØ	�CÐØ	˜CÐ ðó	€
ñ Øà	˜sÐ#Ø	˜#ÐØ	�x × 1Ñ 1Õ2Ð3Ø	)¨8°C­=Ð9Ø	�(˜3•-Ð Ø	�(˜3•-Ð Ø	�(˜3•-Ð Ø	�˜•ÐØ	�8˜C•=Ð!ð
ó€
ñ Øà	˜ÐØ	�CÐØ	�3ˆØ	˜3Ðð	ó€ñ Øà	˜ �Ð&Ø	# X¨c¥]Ð3Ø	˜x¨�}Ð-Ø	" H¨S¥MÐ2Ø	˜X c�]Ð+Ø	 ¨#¥Ð/Ø	 ¨¥Ð.Ø	˜( 3�-Ð(Ø	˜x¨�}Ð-Ø	˜X c�]Ð+Ø	˜h s�mÐ,Ø	-¨x¸­}Ð=Ø	˜( 3�-Ð(Ø	˜ #�Ð'ðó€ñ(  Øà	˜h t¨C¥yÕ1Ð2Ø	˜H T¨#¥YÕ/Ð0ðóÐ ð  BÐ õõ4ñ( �4Ôô&
ó ð&
òV ñF �4Ôôó ðñ
 �4Ôôó ðñ( �4Ôô9ó ð9ñx �4Ôôó ðñB �4Ôôó ðñ> �4Ôôó ðñ
 �4Ôô-ó ð-ñ �4Ôôó ðñ
 �4Ôôó ðñ �4Ôô4ó ð4ñ �4Ôöó ðñ4 �4Ôô
ó ð
ñ �4Ôô
ó ð
ñ �4ÔôBó ðBõ.÷"3õl=õ


÷÷(õVK÷U"÷p5õpOõõ$õ6
÷r@   