509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
 Ú`f  ã            E   @   s\  d Z ddlmZmZmZmZ ddlZddlZddlZddlZddl	m
Z
 ddl	mZ ddlmZ ye W n ek
r€   eZY nX yddlZdZW n ek
rª   dZY nX yddlZddlZdZW n ek
rÜ   dZY nX yddlZdZW n ek
�r   dZY nX ddlZejd	dd
�Zeedƒ�s4eje_ejZddlZddl	m Z  yddl!m"Z"m#Z# dZ$W n^ ek
�rÄ   yddl%m"Z"m#Z# dZ$W n. ek
�r¾   ddl&m'Z'm(Z(m)Z) dZ$Y nX Y nX yddl*Z*W n ek
�rì   dZ*Y nX ej+j,dƒ yddl-m.Z/ dZ0W n ek
�r(   dZ0Y nX da1e�r8dnda2dd„ Z3t2�rNdne3ƒ Z4e4�rxej5ƒ  e j6ƒ Z7e7j8de4 ƒ dd„ Z9dd„ Z:dd„ Z;dd„ Z<dd„ Z=dd „ Z>d!d"„ Z?d#d$„ Z@d%d&„ ZAd'd(„ ZBd)d*„ ZCd+d,„ ZDd-d.„ ZEd/d0„ ZFd1d2„ ZGd3d4„ ZHd5d6„ ZId7d8„ ZJd9d:„ Z.eKd;k�rXx<e.ƒ D ]2ZLx&eLjMƒ D ]ZNeOd<eNeLeN f ƒ �q0W eO �q"W dS )=z1Used to read hardware info from kudzu, /proc, etcé    )ÚgethostnameÚgetaddrinfoÚAF_INETÚAF_INET6N)Úconfig)Ú	rhnserver)ÚustrTFzrhn-client-tools)ZfallbackÚugettext)Ú
up2dateLog)Úget_devicesÚget_computer_infoé   )Úcheck_hal_dbus_statusÚget_hal_computerÚread_halz/usr/share/rhsm)ÚHardwarec               C   s   t tdƒsd S tjƒ S )NÚget_warnings)ÚhasattrÚ	dmidecoder   © r   r   ú/usr/lib/python3.6/hardware.pyÚdmi_warnings]   s    
r   z.Warnings collected during dmidecode import: %sc           	   C   sˆ   t dkr„trdS tjƒ } | jtjƒ y6| jdƒ}tƒ }|rXtjƒ  t	j
ƒ }|jd| ƒ W n    datƒ }|rxtjƒ  dS |jƒ a t S )z= Initialize _dmi_data unless it already exist and returns it NÚallzdmidecode warnings: %sr   )Ú	_dmi_dataÚ_dmi_not_availabler   ZdmidecodeXMLZSetResultTypeZ
DMIXML_DOCZQuerySectionr   Úclear_warningsr
   ÚinitLogÚ	log_debugZxpathNewContext)ZdmixmlÚdataÚdmi_warnÚlogr   r   r   Ú_initialize_dmi_datai   s(    
r!   c             C   s6   t ƒ }|dkrdS |j| ƒ}|g kr.|d jS dS dS )z½ Fetch DMI data from given section using given path.
        If data could not be retrieved, returns empty string.
        General method and should not be used outside of this module.
    NÚ r   )r!   Z	xpathEvalZcontent)ÚpathZdmi_datar   r   r   r   Úget_dmi_data…   s    

r$   c               C   s   t dƒS )zt Return Vendor from dmidecode bios information.
        If this value could not be fetch, returns empty string.
    z/dmidecode/BIOSinfo/Vendor)r$   r   r   r   r   Ú
dmi_vendor”   s    r%   c              C   s   t dƒ} | sd} | S )zt Return UUID from dmidecode system information.
        If this value could not be fetch, returns empty string.
    z7/dmidecode/SystemInfo/SystemUUID[not(@unavailable='1')]r"   )r$   )Zuuidr   r   r   Údmi_system_uuidš   s    r&   c              C   s’   t jdt jƒsi S tddƒjƒ } i }d|d< x`| D ]X}t|ƒs@q2|jdƒ}t|ƒdkrXq2|d jƒ }||d< dj|dd … ƒjƒ ||d < q2W |S )	Nz/etc/sysconfig/installinfoÚrZINSTALLINFOÚclassú=r   r   r"   )	ÚosÚaccessÚR_OKÚopenÚ	readlinesÚlenÚsplitÚstripÚjoin)ZinstallinfoZinstalldictÚinfoÚvalsÚstrippedstringr   r   r   Úread_installinfo¥   s    

"r6   c                 sH   yt jdƒ} W n tk
r&   g } Y nX tjdƒ‰ t‡ fdd„| D ƒƒS )z€ returns number of CPU in system

    Beware that it can be different from number of active CPU (e.g. on s390x architecture
    z/sys/devices/system/cpu/z^cpu[0-9]+$c                s   g | ]}ˆ j |ƒr|‘qS r   )Úmatch)Ú.0Úi)Úre_cpur   r   ú
<listcomp>Â   s    zcpu_count.<locals>.<listcomp>)r*   ÚlistdirÚOSErrorÚreÚcompiler/   )Zcpu_dirr   )r:   r   Ú	cpu_count·   s    

r@   c              C   sŒ  yt rtƒ jƒ d S W n   Y nX d} tjdtjƒr¢y^tjdƒjƒ }d}x6|D ].}|jdƒr`qPt	|j
dƒd ƒ}||krP|}qPW |dkr’d| S W n   Y nX tjd	tjƒ�r$ydtd	d
ƒjƒ }tƒ }x4|D ],}d|krÎt	|j
dƒd jƒ ƒ}|j|ƒ qÎW t|ƒdk�rt|ƒS W n   Y nX tjdtjƒ�rˆyFtjdƒjƒ }d}x |D ]}d|k�rN|d7 }�qNW |dk�rx|S W n   Y nX d S )Nzcpu.cpu_socket(s)r   z/usr/bin/lscpuz/usr/bin/lscpu -pr   ú#ú,é   z/proc/cpuinfor'   zphysical idú:z/usr/sbin/dmidecodez /usr/sbin/dmidecode -t processorzProcessor InformationéÿÿÿÿrE   )Úsubscription_manager_availableÚSubManHardwareZ
getCpuInfor*   r+   ÚX_OKÚpopenr.   Ú
startswithÚintr0   r,   r-   Úsetr1   Úaddr/   )Únumber_socketsÚlinesZmax_socket_indexÚlineZsocket_indexZ
socket_idsÚcountr   r   r   Ú__get_number_socketsÅ   sX    





rR   c              C   sx  dd„ } dd„ }t jdt jƒs"i S tr4tjtjdƒ tddƒjƒ }t jƒ d j	ƒ }t
ƒ }d	d
dœ}|d dkr~|dFd … dksˆ|dk�rz||ƒ}|dkr¢d|d< nd|d< ||d< | |dƒ|d< | |dƒ|d< | |dƒ|d< | |dƒ|d< | |dƒ|d< | |dƒ|d< | |dƒ|d< | |d ƒ|d!< | |d"ƒ}|d#k�r:d$}yttt|ƒƒd% ƒ|d&< W n tk
�rt   dG|d&< Y nX �n||dHk�rp||ƒ}d'|d< | |d)ƒ|d< | |d*ƒ|d< | |d+ƒ|d< | |d,ƒ|d< d-| |d.ƒ| |d/ƒf |d0< | |d1ƒ|d< d#|d< | |dƒ|d< | |d2ƒ|d!< | |d3ƒ}|jƒ }y ttt|d ƒƒƒd4 |d&< W n tk
�rj   dI|d&< Y nX �n†|dJk�r.||ƒ}||d< ||d< | |d6ƒ|d< | |d7ƒ|d< | |d8ƒ|d< | |d9ƒ|d< | |dƒ|d< |d" }yttt|ƒƒd% ƒ|d&< W n tk
�r   dK|d&< Y nX | |d:ƒ|d!< �nÈ|dLk�rÚ||ƒ}||d< ||d< | |d*ƒ|d< | |d9ƒ|d< | |dƒ|d< | |d<ƒ|d< | |d=ƒd dM… }yttt|ƒƒd% ƒ|d&< W n tk
�rÔ   dN|d&< Y nX �n|dOk�rži }xH|jdAƒD ]:}	|	jdBƒ}
t|
ƒdk�r�qô|
d% jƒ ||
d jƒ < �qôW ||d< | |dƒ|d< ||d< ||d< | |dCƒ|d< d#|d< d#|d< d#|d< d#|d< | |d:ƒ|d!< d|d&< nX||d< ||d< ||d< ||d< d#|d< d#|d< d#|d< d#|d< d#|d< d#|d!< d|d&< |d �s
d%|d< n@yt|d ƒ|d< W n   d%|d< Y nX |d dk�rJd%|d< tjƒ }|jjdDƒ�rttƒ }|�rt||dE< |S )PNc             S   s   |j ƒ }|| krdS | | S )Nr"   )Úlower)ÚaÚentryÚer   r   r   Ú	get_entryý   s    zread_cpuinfo.<locals>.get_entryc             S   s˜   d}i }xŠ| j dƒD ]|}t|ƒs"q|d }|dkr4P xZ|j dƒD ]L}t|ƒsNq@|j dƒ}t|ƒdkrfq@|d jƒ |d jƒ  }}|||jƒ < q@W qW |S )Nr   z

r   Ú
rD   rC   )r0   r/   r1   rS   )ÚcpulistrQ   ÚtmpdictÚcpuZcpu_attrr4   ÚnameÚvaluer   r   r   Úget_cpulist_as_dict  s"    
z)read_cpuinfo.<locals>.get_cpulist_as_dictz/proc/cpuinfoÚCr'   é   ZCPUZ	Processor)r(   Zdescr   r9   rC   Ú86Úx86_64ÚplatformZi386rQ   Z	vendor_idÚtypez
model nameZmodelz
cpu familyZmodel_numberZ	model_verZsteppingZ	model_revz
cache sizeÚcacheZbogomipsÚflagsÚotherzcpu mhzr"   z-1r   ZspeedÚalphaÚalphaev6zcpus detectedr[   z	cpu modelzcpu variationz%s/%szsystem typezsystem variationZmodel_versionzcpu revisionzplatform stringzcycle frequency [Hz]i@B Úia64ÚvendorÚfamilyZarchrevZrevisionZfeaturesÚppc64ÚmachineZclocké   Ús390Ús390xrX   z: zbogomips per cpuZcpu_socketsZsocket_countéþÿÿÿrE   )rh   ri   rE   )rj   rE   )rm   éýÿÿÿrE   )rp   rq   )r*   r+   r,   ÚlocaleÚ	setlocaleÚ
LC_NUMERICr-   ÚreadÚunamerS   r@   rK   ÚroundÚfloatÚ
ValueErrorr0   r/   r1   r   Z	RhnServerZcapabilitiesZhasCapabilityrR   )rW   r^   rY   rx   rQ   ZhwdictrZ   Z	mhz_speedZhz_speedr[   r4   ÚsrN   r   r   r   Úread_cpuinfoü   sô    	&





 






r}   c              C   s@   t jƒ } | d }|d d… dkr&tƒ S |d d… dkr<tƒ S d S )NrC   ro   z2.6z2.4)r*   rx   Úread_memory_2_6Úread_memory_2_4)ZunZkernelr   r   r   Úread_memory½  s    r€   c              C   sÄ   t jdt jƒsi S tddƒjƒ } | jdƒ}|d }|jƒ }i }d|d< tt|d ƒd ƒ}|dk rt|d	|d	   }n|d
|d
   }t|ƒ|d< |d }|jƒ }tt|d ƒd ƒ}t|ƒ|d< |S )Nz/proc/meminfor'   rX   r   ÚMEMORYr(   i   é    r`   é   ÚramrC   Úswapi   i   )	r*   r+   r,   r-   rw   r0   rK   ÚlongÚstr)ÚmeminforO   ZcurlineZmemlistÚmemdictÚmegsr   r   r   r   Å  s$    
r   c              C   sî   t jdt jƒsi S tddƒjƒ } | jdƒ}i }xB|D ]:}|jddƒ}|d }t|ƒdkrZq4|d jƒ }|||< q4W i }d|d< |d	 }|jd
ƒ}	t|	d ƒ}
t|
d ƒ}|d }|jd
ƒ}	t|	d ƒ}t|d ƒ}t	|ƒ|d< t	|ƒ|d< |S )Nz/proc/meminfor'   rX   rD   r   r   r�   r(   ZMemTotalú i   Z	SwapTotalr„   r…   )
r*   r+   r,   r-   rw   r0   r/   r1   r†   r‡   )rˆ   rO   Zmeminfo_dictrP   ZblobsÚkeyr]   r‰   Z	total_strZblipsZtotal_krŠ   Zswap_strZswap_kZ	swap_megsr   r   r   r~   Ü  s2    



r~   c              C   sP  t jƒ } t jƒ }dddœ}d}d}d}�x|D �]}|jdƒd }|jdƒd }|| }	xÜttfD ]Ð}
ytj|
ƒ}W n tjk
rŒ   wbY nX | d	 r´t jƒ }|jdƒ\}}	t	|	ƒ}	yR|j
d
ƒ |j||	fƒ |jƒ d }|
tkrè|}n|}tj|ƒ}||k�r|}W n" tjk
�r(   |jƒ  wbY nX |jƒ  qbW q.W tjjdƒ�rŽtjdtjƒ�rŽtddƒjƒ }xÆ|D ]}t|ƒ�s~�ql|jƒ }�qlW n tjjdƒ�r.tjdtjƒ�r.tddƒjƒ }xr|D ]j}t|ƒ�sÒ�qÀ|jdƒ}t|ƒdk�rî�qÀ|d jƒ }||d< |d dk�rÀdj|dd… ƒjƒ }P �qÀW |dk�sB|dk�rFd}|||fS )zŸ returns [hostname, intf, intf6]

        Where hostname is you FQDN of this machine.
        And intf is numeric IPv4 address. And intf6 is IPv6 address.
    i»  éP   )ZhttpsZhttpNú/rC   rD   r   ZenableProxyé   z/etc/hostnamer'   z/etc/sysconfig/networkr)   r   ZHOSTNAMEr"   zlocalhost.localdomainÚunknown)r   ÚinitUp2dateConfigZgetServerlURLr0   r   r   ÚsocketÚerrorZgetProxySettingrK   Z
settimeoutZconnectZgetsocknameÚgetfqdnÚcloser*   r#   Úisfiler+   r,   r-   r.   r/   r1   r2   )ÚcfgZslÚstÚhostnameZintfZintf6Z	serverUrlZserverZ
servertypeZportrl   r|   Zserver_portZintf_tmpZhostname_tmpZhostnameinfor3   Znetworkinfor4   r5   r   r   r   ÚfindHostByRouteý  sn    








rš   c          	   C   sŠ   d}yt d|  dƒ}W n
   |S d}xV|jƒ D ]J}|rT|jdƒdkrT|jƒ d }P |jdƒdkr0|jƒ d	 }||kr0d
}q0W |jƒ  |S )Nr"   z/proc/net/bonding/%sr'   FzPermanent HW addr: r   ro   zSlave Interface: rC   TrE   rE   )r-   r.   Úfindr0   r•   )ÚmasterZslaveÚhwaddrZbondingZslave_foundrP   Zifnamer   r   r   Úget_slave_hwaddrH  s     rž   c              C   s.  i } d| d< t ƒ \| d< | d< | d< | d dkrRtƒ | d< d| d krRtjƒ | d< | d d kr¨y4t| d d ƒ}tdd	„ |ƒ}|d
 d d
 | d< W n   d| d< Y nX | d d krþy4t| d d ƒ}tdd	„ |ƒ}|d
 d d
 | d< W n   d| d< Y nX | d d k�rd| d< | d d k�r*d| d< | S )NZNETINFOr(   r™   ÚipaddrZip6addrr�   Ú.c             S   s   | d t jkS )Nr   )r’   r   )Úxr   r   r   Ú<lambda>k  s    zread_network.<locals>.<lambda>r   r`   z	127.0.0.1c             S   s   | d t jkS )Nr   )r’   r   )r¡   r   r   r   r¢   t  s    z::1r"   )rš   r   r’   r”   r   Úfilter)ZnetdictZlist_of_addrsZ
ipv4_addrsZ
ipv6_addrsr   r   r   Úread_network]  s4    
r¤   c           4   C   sŒ  i } d| d< t  r(t r(tjjdƒ | S t rFtttjƒ tj	ƒ  ƒƒ}nt
jƒ }�x6|D �],}y,t rntj|ƒ}nt
j|ƒt
j d d }W n   d}Y nX ytjd| ƒ}W n   d }Y nX |rØtjj|ƒ}t||ƒ}y@t rêtj|ƒ}n,td| d	ƒ}|jƒ jd
ƒd jƒ }|jƒ  W n    |dk�r0d}nd}Y nX y.t �rNtj|ƒ}nt
j|ƒt
j d d }W n   d}Y nX y.t �rŽtj|ƒ}	nt
j|ƒt
j d d }	W n   d}	Y nX y.t �rÎtj|ƒ}
nt
j|ƒt
j d d }
W n   d}
Y nX g }t �r`tj|ƒ}xL|D ]D}x<|jƒ D ]0}|j }|dk�r:d}|j!||j"|j#dœƒ �q"W �qW �nyöxðt
j|ƒt
j$ D ]Ü}|d jdƒd }t%j&|ƒ}|j'�r¢d}n(|j(�r°d}n|j)�r¾d}n|j*�rÊd}|d }d}xd|jdƒD ]V}|�sðP nF|j+ƒ dk�r|d7 }n.|dt,t-|jdƒd dƒƒdd … j.dƒ 7 }�qâW |j!|||dœƒ �qtW W n t/k
�rl   Y nX |||	|
||dœ| |< qVW | S )NZNETINTERFACESr(   zWWarning: information about network interfaces could not be retrieved on this platform.
r   Úaddrr"   z/sys/class/net/%s/masterz/sys/class/net/%s/device/ueventr'   r)   r   ÚloZloopbackZUnknownÚnetmaskÚ	broadcastÚglobalZuniverse)Úscoper¥   r§   ú%ÚlinkÚhostZsiterD   Zffffrƒ   rŽ   rC   Ú1)r�   rŸ   r§   r¨   ÚmoduleZipv6)0Úethtool_presentÚnetifaces_presentÚsysÚstderrÚwriteÚlistrL   Úethtoolr   Zget_active_devicesÚ	netifacesÚ
interfacesZ
get_hwaddrZifaddressesZAF_LINKr*   Úreadlinkr#   Úbasenamerž   Z
get_moduler-   Úreadliner0   r1   r•   Z
get_ipaddrr   Zget_netmaskZget_broadcastZget_interfaces_infoZget_ipv6_addressesrª   ÚappendZaddressr§   r   Ú	ipaddressZIPv6AddressZ	is_globalZis_link_localZis_loopbackZis_site_localrS   ÚbinrK   ÚrindexÚKeyError)ZintDictr¸   Z	interfacer�   rœ   Zmaster_interfacer¯   Zdriver_filerŸ   r§   r¨   Zip6_listZdev_infor3   Zip6rª   Zip6_addrZ
scope_infoZip6_netmaskZnetmask_bitsZ
two_octetsr   r   r   Úread_network_interfaces€  s¾    












4rÁ   c           	   C   sB  i } d| d< t jƒ d jƒ }|d dko6|dd … dk rH|dk rH| S tƒ }|rZ|| d	< td
ƒ}|rn|| d< tdƒ}|rŽ|d | }|| d< tdƒ| d< tdƒ}|r®|| d< tdƒ}|rÂ|| d< tdƒ}|rÖ|| d< tdƒ}tdƒ}tdƒ}	tdƒ}
dd|d|d|	d|
f | d< x*t| jƒ ƒD ]}| | d k�r | |= �q W | S )NZDMIr(   r`   r   r9   rC   ra   rb   rk   z!/dmidecode/SystemInfo/ProductNameÚproductz/dmidecode/SystemInfo/Versionr‹   Úsystemz%/dmidecode/BaseBoardInfo/ManufacturerZboardz/dmidecode/BIOSinfo/VendorZbios_vendorz/dmidecode/BIOSinfo/VersionZbios_versionz/dmidecode/BIOSinfo/ReleaseDateZbios_releasez#/dmidecode/ChassisInfo/SerialNumberz/dmidecode/ChassisInfo/AssetTagz%/dmidecode/BaseBoardInfo/SerialNumberz"/dmidecode/SystemInfo/SerialNumberz#(%s: %s) (%s: %s) (%s: %s) (%s: %s)ZchassisZassetrr   )r*   rx   rS   r%   r$   rµ   Úkeys)Zdmidictrx   rk   rÂ   ÚversionrÃ   ÚreleaseZchassis_serialZchassis_tagZboard_serialZsystem_serialÚkr   r   r   Úread_dmi  sJ    (rÈ   c              C   s–   yt rtƒ } ntƒ }|jƒ } W n6 tk
rT   tjƒ }dtjƒ d  }|j	|ƒ i S X i }x*| D ]"}|j
dƒr`t| | ƒ|t|ƒ< q`W |jtƒ ƒ |S )Nz0Error reading system and smbios information: %s
r   rÃ   )Úusing_gudevr   r   ZGetAllPropertiesÚ	Exceptionr
   r   r²   Úexc_infor   rJ   r   ÚupdateÚ
get_smbios)ZpropsZcomputerr    ÚmsgZsystem_and_smbiosrŒ   r   r   r   Úget_hal_system_and_smbios=  s     


rÏ   c            	   C   sD   t ƒ  tri S tƒ tƒ tdƒtdƒtdƒtdƒtdƒtdƒdœS dS )	a   Returns dictionary with values we are interested for.
        For historical reason it is in format, which use HAL.
        Currently in dictionary are keys:
        smbios.system.uuid, smbios.bios.vendor, smbios.system.serial,
        smbios.system.manufacturer.
    z"/dmidecode/SystemInfo/SerialNumberz"/dmidecode/SystemInfo/Manufacturerz!/dmidecode/SystemInfo/ProductNamez/dmidecode/SystemInfo/SKUnumberz/dmidecode/SystemInfo/Familyz/dmidecode/SystemInfo/Version)zsmbios.system.uuidzsmbios.bios.vendorzsmbios.system.serialzsmbios.system.manufacturerzsmbios.system.productzsmbios.system.skunumberzsmbios.system.familyzsmbios.system.versionN)r!   r   r&   r%   r$   r   r   r   r   rÍ   R  s    rÍ   c           .   C   s"  t rtƒ } nztƒ \}}d}|s"|r<tjƒ }d}|j|ƒ d}g } |r†ytƒ }|rT|} W n.   tjƒ }dtjƒ d  }|j|ƒ Y nX yt	ƒ }|rœ| j
|ƒ W n"   ttdƒtjƒ d ƒ Y nX ytƒ }|rØ| j
|ƒ W n"   ttdƒtjƒ d ƒ Y nX tjƒ }|d �sNytƒ }|�r(| j
|ƒ W n"   ttdƒtjƒ d ƒ Y nX ytƒ }|�rf| j
|ƒ W n.   tjƒ }d	tjƒ d  }|j|ƒ Y nX ytƒ }|�r°| j
|ƒ W n"   ttd
ƒtjƒ d ƒ Y nX |d �sytƒ }|�rø| j
|ƒ W n"   ttdƒtjƒ d ƒ Y nX | S )Nr   zaWarning: haldaemon or messagebus service not running. Cannot probe hardware and DMI information.
r   z'Error reading hardware information: %s
zError reading cpu information:z(Error reading system memory information:ZskipNetworkz%Error reading networking information:z"Error reading DMI information: %s
z)Error reading install method information:z,Error reading network interface information:)rÉ   r   r   r
   r   Zlog_mer   r²   rË   r}   r¼   ÚprintÚ_r€   r   r‘   r¤   rÈ   r6   rÁ   )ZallhwZ
hal_statusZdbus_statusZhwdaemonr    rÎ   Úretr—   r   r   r   r   i  sz    

  

r   Ú__main__z'%s' : '%s')PÚ__doc__r’   r   r   r   r   r>   r*   r²   Zup2date_clientr   r   Zrhn.i18nr   r†   Ú	NameErrorrK   r¶   r°   ÚImportErrorr·   r½   r±   r   Zdmidecode_presentÚgettextZtranslationÚtr   r	   rÑ   Zdbusr
   Zup2date_client.hardware_udevr   r   rÉ   Zup2date_client.hardware_gudevZup2date_client.hardware_halr   r   r   rt   r#   r¼   Zsubscription_manager.hwprober   rG   rF   r   r   r   r   r   r   r    r   r!   r$   r%   r&   r6   r@   rR   r}   r€   r   r~   rš   rž   r¤   rÁ   rÈ   rÏ   rÍ   Ú__name__ZhwrÄ   rÇ   rÐ   r   r   r   r   Ú<module>   s²   





7 B!K# :]
