§
    xÅjT ã                   óŠ  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	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 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' ddlm(Z( ddlm)Z) ddlm*Z* ddlm+Z+ g d¢Z,d Z-ej.         /                    d! ej0        ¦   «         › d"�¦  «        Z1ej.         /                    d! ej0        ¦   «         › d#�¦  «        Z2 e3ed$¦  «        Z4 e3ed%¦  «        Z5 ej6        d&¦  «        Z7 ej8        ¦   «         Z9ej:        d'k    Z; e<¦   «         Z=d(Z> ej?        d)d* e@e
jA        ¦  «        i¦  «        ZBeBjC        ZC G d+„ d,ej?        ¦  «        ZD eE¦   «          F                    eDjG        ¦  «         ejH        ejI        ejJ        ejK        ejL        ejM        ejN        ejN        ejO        ejP        ejQ        ejR        d-œZSejT        ejU        ejV        ejW        ejX        ejY        ejZ        ej[        ej\        ej]        ej^        d.œZ_d/„ Z`d0„ Zad1„ Zbe$d2„ ¦   «         Zc	  ecd3¦  «        e_d        n<# ee$ r4Zf e d4ef›�¦  «           ed5d6¦  «        d7d7d7¦  «        e_d        Y dZf[fndZf[fww xY wejd        Zdd8„ Zgd9„ Zhd:„ Zi e3ed;¦  «        rejj        Zjejk        Zkd<„ Zld=„ Zmd>„ Znd?„ Zod@„ ZpdA„ Zqej.         /                    dB¦  «        sej.         /                    dC¦  «        rdD„ ZrndE„ Zrejs        Zs G dF„ dGee¦  «        Zt G dH„ dI¦  «        Zu eu¦   «         Zvd^dK„ZwdL„ ZxdM„ Zyejz        Zzd_dO„Z{ G dP„ dQ¦  «        Z|d_dR„Z}dS„ Z~dT„ ZdU„ Z€dV„ Z�dW„ Z‚dX„ ZƒdY„ Z„dZ„ Z…d[„ Z† G d\„ d]¦  «        Z‡dS )`zLinux platform implementation.é    N)Údefaultdict)Ú
namedtupleé   )Ú_common)Ú_ntuples)Ú_psposix)Ú_psutil_linux)ÚENCODING)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Úisfile_strict)Úmemoize)Úmemoize_when_activated)Úopen_binary)Ú	open_text)Úparse_environ_block)Úpath_exists_strict)Úsupports_ipv6)Úusage_percent)ÚPROCFS_PATHÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚCONN_ESTABLISHEDÚCONN_SYN_SENTÚCONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_LAST_ACKÚCONN_LISTENÚCONN_CLOSINGz/sys/class/power_supplyú/proc/ú/smapsú/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittlei   ÚAddressFamilyÚAF_LINKc                   ó   — e Zd ZdZdZdZdZdS )Ú
IOPriorityr   r   é   é   N)Ú__name__Ú
__module__Ú__qualname__r    r!   r"   r#   © ó    ú@C:\Projects\Historical\venv\Lib\site-packages\psutil/_pslinux.pyr9   r9   d   s&   € € € € € ØÐØ€OØ€OØÐÐÐr@   r9   )ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP)Ú01Ú02Ú03Ú04Ú05Ú06Ú07Ú08Ú09Ú0AÚ0Bc                 óþ   — t          | t          ¦  «        s
J | ¦   «         ‚t          j        | ¦  «        } |                      d¦  «        d         } |                      d¦  «        rt          | ¦  «        s
| dd…         } | S )zWrapper around os.readlink().ú r   ú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr   ©Úpaths    rA   r`   r`   •   s   € å�d�CÑ Ô Ð&Ð& $Ñ&Ô&Ð ÝŒ;�tÑÔ€Dð �:Š:�fÑÔ˜aÔ €Dð ‡}‚}�\Ñ"Ô"ð Õ+=¸dÑ+CÔ+Cð Ø�D�S�DŒzˆØ€Kr@   c                 ó(  — t           j        dt           j        dt           j        di}|| t           j        t           j        z  t           j        z  z           }| t           j        z  r|                     ddd¦  «        }|                     dd¦  «        }|S )zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    ÚrÚwzw+Úar   zr+)r_   ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)ÚflagsÚ	modes_mapÚmodes      rA   Úfile_flags_to_moderq   ©   sw   € õ ”˜c¥2¤;°µR´YÀÐE€IØ�U�bœk­B¬KÑ7½"¼)ÑCÑDÔE€DØ�rŒ{Ñð )Ø�|Š|˜C  aÑ(Ô(ˆØ�<Š<˜˜dÑ#Ô#€Dà€Kr@   c                 óŒ   — |                       dd¦  «        } d}|rd| › �}nd| › d�}t          j        |t          j        ¦  «        S )zÜReturn True if the given name refers to a root device (e.g.
    "sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
    "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
    return True.
    ú/ú!Tz/sys/block/z/device)rm   r_   ÚaccessÚF_OK)ÚnameÚincluding_virtualrd   s      rA   Úis_storage_devicery   ¶   sX   € ð �<Š<˜˜SÑ!Ô!€DØÐØð +Ø#˜TÐ#Ð#ˆˆà*˜TÐ*Ð*Ð*ˆÝŒ9�T�2œ7Ñ#Ô#Ð#r@   c                 óš  — t          | › d�¦  «        5 }|                     ¦   «                              ¦   «         dd…         }ddd¦  «         n# 1 swxY w Y   g d¢}t          |¦  «        }|dk    r|                     d¦  «         |dk    r|                     d¦  «         |d	k    r|                     d
¦  «         t          d|¦  «        S )zûReturn a namedtuple of variable fields depending on the CPU times
    available on this Linux kernel version which may be:
    (user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
     [guest_nice]]])
    Used by cpu_times() function.
    ú/statr   N)ÚuserÚniceÚsystemÚidleÚiowaitÚirqÚsoftirqé   Ústealé	   Úguesté
   Ú
guest_niceÚ	scputimes)r   Úreadlinera   ÚlenÚappendr   )Úprocfs_pathÚfÚvaluesÚfieldsÚvlens        rA   Ú_scputimes_ntupler’   É   s  € õ 
˜Ð*Ð*Ð*Ñ	+Ô	+ð *¨qØ—’‘”×#Ò#Ñ%Ô% a b bÔ)ˆð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *àKÐKÐK€FÝˆv‰;Œ;€DØˆq‚y€yà�Š�gÑÔÐØˆq‚y€yà�Š�gÑÔÐØˆr‚z€zà�Š�lÑ#Ô#Ð#Ý�k 6Ñ*Ô*Ð*s   “/AÁAÁAú/proczignoring exception on import: r‰   zuser system idleç        c                 óà  — | d         }||                       dd¦  «        z   }	 | d         }| d         }| d         }n6# t          $ r)}t          |j        d         › d�¦  «         |cY d}~S d}~ww xY w	 t	          t          ¦   «         › d	�¦  «        }n# t          $ r |cY S w xY wd}|5  |D ]U}	|	                     ¦   «         }	|	                     d
¦  «        r*|t          |	 
                    ¦   «         d         ¦  «        z  }ŒV	 ddd¦  «         n# 1 swxY w Y   |t          z  }||z
  }
||z   }|t          |dz  |¦  «        z  }|
|z  }
|
|t          |dz  |¦  «        z
  z  }
t          |
¦  «        S )ay  Fallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", see:
    https://blog.famzah.net/2014/09/24/.

    This code reimplements the algorithm outlined here:
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
        commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).

    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
    ó   MemFree:ó   Cached:r   s   Active(file):s   Inactive(file):ó   SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfos   lowr   r:   g       @)ÚgetÚKeyErrorr   Úargsr   r   ÚOSErrorÚstripÚ
startswithÚintra   ÚPAGESIZEÚmin)ÚmemsÚfreeÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrrŽ   Úwatermark_lowÚlineÚavailÚ	pagecaches               rA   Úcalculate_avail_vmemr­   ó   s  € ð< �Ô€DØ�d—h’h˜z¨1Ñ-Ô-Ñ-€Hð	ØÐ/Ô0ˆØ Ð!3Ô4ÐØÐ 0Ô1ÐÐøÝð ð ð ÝØŒx˜Œ{ð >ð >ð >ñ	
ô 	
ð 	
ð ˆˆˆˆˆˆøøøøðøøøðÝ�?Ñ,Ô,Ð7Ð7Ð7Ñ8Ô8ˆˆøÝð ð ð Øˆˆˆðøøøð €MØ	
ð 6ð 6Øð 	6ð 	6ˆDØ—:’:‘<”<ˆDØ�Š˜vÑ&Ô&ð 6Ø¥ T§Z¢Z¡\¤\°!¤_Ñ!5Ô!5Ñ5�øð	6ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð
 •XÑ€Mà�=Ñ €EØÐ"3Ñ3€IØ•�Y ‘] MÑ2Ô2Ñ2€IØ	ˆYÑ€EØ	Ð¥Ð$4°sÑ$:¸MÑ JÔ JÑJÑJ€EÝˆu‰:Œ:Ðs@   £< ¼
A/ÁA*Á$A/Á*A/Á3B ÂB!Â B!Â(ADÄDÄDc                  óÜ  — g } i }t          t          ¦   «         › d�¦  «        5 }|D ]7}|                     ¦   «         }t          |d         ¦  «        dz  ||d         <   Œ8	 ddd¦  «         n# 1 swxY w Y   |d         }|d         }	 |d         }n'# t          $ r d}|                      d	¦  «         Y nw xY w	 |d
         }||                     dd¦  «        z  }n'# t          $ r d}|                      d¦  «         Y nw xY w	 |d         }	nA# t          $ r4 	 |d         }	n'# t          $ r d}	|                      d¦  «         Y nw xY wY nw xY w	 |d         }
n'# t          $ r d}
|                      d¦  «         Y nw xY w	 |d         }nS# t          $ rF 	 |d         |d         z   |d         z   }n'# t          $ r d}|                      d¦  «         Y nw xY wY nw xY w	 |d         }n# t          $ r d}Y nw xY w	 |d         }|dk    rt          |¦  «        }n# t          $ r t          |¦  «        }Y nw xY w|dk     rd}|                      d¦  «         n||k    r|}||z
  }t          ||z
  |d¬¦  «        }| rZd 	                    d 
                    | ¦  «        t          | ¦  «        dk    rdnd¦  «        }t          j        |t          d¬ ¦  «         t          j        ||||||
||||	|¦  «        S )!a7  Report virtual memory stats.
    This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    ú/meminfor   é   r   Ns	   MemTotal:r–   s   Buffers:Úbuffersr—   r˜   Úcacheds   Shmem:s
   MemShared:Úshareds   Active:Úactives	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:Úinactives   Slab:s   MemAvailable:Ú	available©Úround_z6{} memory stats couldn't be determined and {} set to 0z, ÚwasÚwerer:   ©Ú
stacklevel)r   r   ra   rŸ   rš   rŒ   r™   r­   r   ÚformatÚjoinr‹   ÚwarningsÚwarnÚRuntimeWarningÚntpÚsvmem)Úmissing_fieldsr¢   rŽ   rª   r�   Útotalr£   r±   r²   r³   r´   rµ   Úslabr«   ÚusedÚpercentÚmsgs                    rA   Úvirtual_memoryrÊ   2  s[  € ð €NØ€DÝ	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð 4¸Øð 	4ð 	4ˆDØ—Z’Z‘\”\ˆFÝ! &¨¤)™nœn¨tÑ3ˆD�˜”‰OˆOð	4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð �Ô€EØ�Ô€Dð)Ø�{Ô#ˆˆøÝð )ð )ð )àˆØ×Ò˜iÑ(Ô(Ð(Ð(Ð(ð)øøøð0Ø�jÔ!ˆð 	�$—(’(Ð+¨QÑ/Ô/Ñ/ˆˆøõ ð (ð (ð (ØˆØ×Ò˜hÑ'Ô'Ð'Ð'Ð'ð(øøøð,Ø�i”ˆˆøÝð ,ð ,ð ,ð	,Ø˜-Ô(ˆFˆFøÝð 	,ð 	,ð 	,ØˆFØ×!Ò! (Ñ+Ô+Ð+Ð+Ð+ð	,øøøøøð,øøøð(Ø�jÔ!ˆˆøÝð (ð (ð (ØˆØ×Ò˜hÑ'Ô'Ð'Ð'Ð'ð(øøøð.Ø˜Ô%ˆˆøÝð 	.ð 	.ð 	.ð	.à�_Ô%Ø�Ô'ñ(àÐ(Ô)ñ*ð ˆHøõ
 ð 	.ð 	.ð 	.ØˆHØ×!Ò! *Ñ-Ô-Ð-Ð-Ð-ð	.øøøøøð	.øøøðØ�HŒ~ˆˆøÝð ð ð Øˆˆˆðøøøð
/ØÐ%Ô&ˆð �AŠ:ˆ:õ
 )¨Ñ.Ô.ˆEøøõ ð +ð +ð +Ý$ TÑ*Ô*ˆˆˆð+øøøð ˆq‚y€yØˆØ×Ò˜kÑ*Ô*Ð*Ð*Ø	�Šˆð ˆà�5‰=€Då˜U U™]¨U¸1Ð=Ñ=Ô=€Gð ð 9ØF×MÒMØ�IŠI�nÑ%Ô%Ý˜Ñ(Ô(¨AÒ-Ð-ˆEˆE°6ñ
ô 
ˆõ 	Œ�c�>°aÐ8Ñ8Ô8Ð8åŒ9ØØØØØØØØØØØñô ð s×   £;A+Á+A/Á2A/ÂB Â!B4Â3B4Â8C Ã!C>Ã=C>ÄD Ä
E	ÄDÄE	Ä!EÅ E	ÅEÅE	ÅE	ÅE Å!E:Å9E:Å>F Æ
GÆF-Æ,GÆ-!GÇGÇGÇGÇGÇG$ Ç$G3Ç2G3Ç7H ÈH1È0H1c                  ó>  — i } t          t          ¦   «         › d�¦  «        5 }|D ]7}|                     ¦   «         }t          |d         ¦  «        dz  | |d         <   Œ8	 ddd¦  «         n# 1 swxY w Y   	 | d         }| d         }n5# t          $ r( t          j        ¦   «         \  }}}}}}}||z  }||z  }Y nw xY w||z
  }t          ||d¬¦  «        }		 t          t          ¦   «         › d	�¦  «        }|5  dx}
}|D ]�}|                     d
¦  «        r/t          |                     d¦  «        d         ¦  «        dz  dz  }
nC|                     d¦  «        r.t          |                     d¦  «        d         ¦  «        dz  dz  }|
�|� n(Œ�d}|dz  }t          j
        |t          d¬¦  «         dx}
}ddd¦  «         n# 1 swxY w Y   n=# t          $ r0}d|› d�}t          j
        |t          d¬¦  «         dx}
}Y d}~nd}~ww xY wt          j        ||||	|
|¦  «        S )zReturn swap memory metrics.r¯   r   r°   r   Ns
   SwapTotal:s	   SwapFree:r·   z/vmstats   pswpinó    é   s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r:   r»   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (ú))r   r   ra   rŸ   rš   ÚcextÚlinux_sysinfor   rž   r¿   rÀ   rÁ   rœ   rÂ   Ússwap)r¢   rŽ   rª   r�   rÅ   r£   Ú_Úunit_multiplierrÇ   rÈ   ÚsinÚsoutrÉ   r¨   s                 rA   Úswap_memoryrÖ   ³  s  € à€DÝ	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð 4¸Øð 	4ð 	4ˆDØ—Z’Z‘\”\ˆFÝ! &¨¤)™nœn¨tÑ3ˆD�˜”‰OˆOð	4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð Ø�]Ô#ˆØ�LÔ!ˆˆøÝð  ð  ð  Ý37Ô3EÑ3GÔ3GÑ0ˆˆ1ˆa��E˜4 Ø�Ñ ˆØ�Ñˆˆˆð øøøð
 �4‰<€DÝ˜D %°Ð2Ñ2Ô2€GðÝ�?Ñ,Ô,Ð5Ð5Ð5Ñ6Ô6ˆð ð 	ð 	ØÐˆC�$Øð ð �ð —?’? 9Ñ-Ô-ð ?Ý˜dŸjšj¨Ñ.Ô.¨qÔ1Ñ2Ô2°QÑ6¸Ñ=�C�CØ—_’_ ZÑ0Ô0ð ?Ý˜tŸzšz¨$Ñ/Ô/°Ô2Ñ3Ô3°aÑ7¸$Ñ>�DØ�? tÐ'7Ø�Eøð
 E�ØÐ8Ñ8�Ý”˜c¥>¸aÐ@Ñ@Ô@Ð@Ø���dð%	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð ð ð ð7Ø03ð7ð 7ð 7ð 	õ 	Œ�c�>°aÐ8Ñ8Ô8Ð8Øˆˆˆdˆdˆdˆdˆdˆdøøøøðøøøõ8 Œ9�U˜D $¨°°dÑ;Ô;Ð;sN   ¡;A)Á)A-Á0A-Á5B Â/B8Â7B8ÃG	 Ã3B>F=Æ=GÇGÇ	
HÇ&G>Ç>HÚ	heap_infoc                  óD  — t          ¦   «         } t          | › d�¦  «        5 }|                     ¦   «                              ¦   «         }ddd¦  «         n# 1 swxY w Y   |dt	          t
          j        j        ¦  «        dz   …         }d„ |D ¦   «         }t          j        |Ž S )zíReturn a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    r{   Nr   c                 ó<   — g | ]}t          |¦  «        t          z  ‘ŒS r?   ©ÚfloatÚCLOCK_TICKS©Ú.0rI   s     rA   ú
<listcomp>zcpu_times.<locals>.<listcomp>   s#   € Ð5Ð5Ð5¨�e�A‰hŒh�Ñ$Ð5Ð5Ð5r@   )r   r   rŠ   ra   r‹   rÂ   r‰   Ú_fields)r�   rŽ   r�   r�   s       rA   Ú	cpu_timesrá   õ  sÒ   € õ "Ñ#Ô#€KÝ	˜Ð*Ð*Ð*Ñ	+Ô	+ð &¨qØ—’‘”×#Ò#Ñ%Ô%ˆð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &à�A��CœMÔ1Ñ2Ô2°QÑ6Ð6Ô7€FØ5Ð5¨fÐ5Ñ5Ô5€FÝŒ=˜&Ð!Ð!s   ¡'AÁAÁAc                  ó²  — t          ¦   «         } g }t          | › d�¦  «        5 }|                     ¦   «          |D ]ƒ}|                     d¦  «        rl|                     ¦   «         }|dt          t          j        j        ¦  «        dz   …         }d„ |D ¦   «         }t          j        |Ž }| 	                    |¦  «         Œ„|cddd¦  «         S # 1 swxY w Y   dS )zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    r{   s   cpur   c                 ó<   — g | ]}t          |¦  «        t          z  ‘ŒS r?   rÚ   rÝ   s     rA   rß   z!per_cpu_times.<locals>.<listcomp>  s#   € ÐAÐAÐA°Q�% ™(œ(¥[Ñ0ÐAÐAÐAr@   N)
r   r   rŠ   rž   ra   r‹   rÂ   r‰   rà   rŒ   )r�   ÚcpusrŽ   rª   r�   r�   Úentrys          rA   Úper_cpu_timesræ     s  € õ "Ñ#Ô#€KØ€DÝ	˜Ð*Ð*Ð*Ñ	+Ô	+ð 
¨qà	�
Š
‰ŒˆØð 	#ð 	#ˆDØ�Š˜vÑ&Ô&ð #ØŸš™œ�Ø ¥C­¬Ô(=Ñ$>Ô$>ÀÑ$BÐ BÔC�ØAÐA¸&ÐAÑAÔA�Ýœ vÐ.�Ø—’˜EÑ"Ô"Ð"øØð
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   £BCÃCÃCc                  óN  — 	 t          j        d¦  «        S # t          $ �r d} t          t	          ¦   «         › d�¦  «        5 }|D ].}|                     ¦   «                              d¦  «        r| dz  } Œ/	 ddd¦  «         n# 1 swxY w Y   | dk    r…t          j        d¦  «        }t          t	          ¦   «         › d�¦  «        5 }|D ]7}| 
                    d	¦  «        d         }|                     |¦  «        r| dz  } Œ8	 ddd¦  «         n# 1 swxY w Y   | dk    rY dS | cY S w xY w)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNr   ú/cpuinfos	   processorr   Nzcpu\dr{   ú )r_   ÚsysconfÚ
ValueErrorr   r   Úlowerrž   ÚreÚcompiler   ra   Úmatch)ÚnumrŽ   rª   Úsearchs       rA   Úcpu_count_logicalró     sÍ  € ðÝŒzÐ/Ñ0Ô0Ð0øÝð ñ ð àˆÝ�OÑ-Ô-Ð7Ð7Ð7Ñ8Ô8ð 	¸AØð ð �Ø—:’:‘<”<×*Ò*¨<Ñ8Ô8ð Ø˜1‘H�Cøðð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð �!Š8ˆ8Ý”Z Ñ)Ô)ˆFÝ�oÑ/Ô/Ð6Ð6Ð6Ñ7Ô7ð !¸1Øð !ð !�DØŸ:š: c™?œ?¨1Ô-�DØ—|’| DÑ)Ô)ð !Ø˜q™˜øð!ð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð �!Š8ˆ8à�4�4Øˆ
ˆ
ˆ
ð-øøøs]   ‚ –+D$Á2B Á4D$Â B	ÂD$ÂB	Â;D$Ã;DÃ?D$ÄD	ÄD$ÄD	Ä	D$ÄD$Ä#D$c                  óP  — t          ¦   «         } d}d}t          j        |¦  «        pt          j        |¦  «        D ]b}t          |¦  «        5 }|                      |                     ¦   «                              ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   Œct          | ¦  «        }|dk    r|S i }i }t          t          ¦   «         › d�¦  «        5 }|D ]�}|                     ¦   «                              ¦   «         }|s&	 |d         ||d         <   n# t          $ r Y nw xY wi }ŒP| 
                    d¦  «        r+|                     d	d
¦  «        \  }	}
t          |
¦  «        ||	<   Œ‘	 ddd¦  «         n# 1 swxY w Y   t          |                     ¦   «         ¦  «        }|pdS )z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNr   ré   ó	   cpu coresó   physical id)rö   rõ   s   	:r   )ÚsetÚglobr   ÚaddÚreadr�   r‹   r   rí   rš   rž   ra   rŸ   Úsumr�   )ÚlsÚp1Úp2rd   rŽ   ÚresultÚmappingÚcurrent_inforª   ÚkeyÚvalues              rA   Úcpu_count_coresr  4  s4  € õ 
‰Œ€Bð 
E€BØ	J€BÝ”	˜"‘”Ð.¥¤¨2¡¤ð %ð %ˆÝ˜ÑÔð 	% !Ø�FŠF�1—6’6‘8”8—>’>Ñ#Ô#Ñ$Ô$Ð$ð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%øå�‰WŒW€FØ�‚{€{Øˆð €GØ€LÝ	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð /¸Øð 	/ð 	/ˆDØ—:’:‘<”<×%Ò%Ñ'Ô'ˆDØð /ðØ<HØ$ô=�G˜L¨Ô8Ñ9Ð9øõ  ð ð ð Ø�Dðøøøà!��Ø—’Ð!?Ñ@Ô@ð /à!ŸZšZ¨°Ñ2Ô2‘
��UÝ$'¨¡J¤J�˜SÑ!øð	/ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /õ" �—’Ñ!Ô!Ñ"Ô"€FØˆ>�TÐsI   Á:BÂB	ÂB	Ã-E8ÄDÄE8Ä
D$Ä!E8Ä#D$Ä$AE8Å8E<Å?E<c                  ó2  — t          t          ¦   «         › d�¦  «        5 } d}d}d}| D ]À}|                     d¦  «        r(t          |                     ¦   «         d         ¦  «        }ny|                     d¦  «        r(t          |                     ¦   «         d         ¦  «        }n<|                     d¦  «        r't          |                     ¦   «         d         ¦  «        }|�|�|� nŒÁddd¦  «         n# 1 swxY w Y   d}t          j        ||||¦  «        S )z*Return various CPU stats as a named tuple.r{   Ns   ctxtr   s   intrs   softirqr   )r   r   rž   rŸ   ra   rÂ   Ú	scpustats)rŽ   Úctx_switchesÚ
interruptsÚsoft_interruptsrª   Úsyscallss         rA   Ú	cpu_statsr  ^  sO  € å	�Ñ)Ô)Ð0Ð0Ð0Ñ	1Ô	1ð °QØˆØˆ
ØˆØð 	ð 	ˆDØ�Š˜wÑ'Ô'ð 7Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3��Ø—’ Ñ)Ô)ð 7Ý  §¢¡¤¨a¤Ñ1Ô1�
�
Ø—’ Ñ,Ô,ð 7Ý"% d§j¢j¡l¤l°1¤oÑ"6Ô"6�àÐ(Ø#Ð/ØÐ*à�øð!ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð" €HÝŒ=˜ z°?ÀHÑMÔMÐMs   ŸC
C5Ã5C9Ã<C9c                  óŠ   — t          t          ¦   «         › d�¦  «        5 } d„ | D ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z7Return current CPU frequency from cpuinfo if available.ré   c                 ó®   — g | ]R}|                      ¦   «                              d ¦  «        ¯)t          |                     dd¦  «        d         ¦  «        ‘ŒSS )s   cpu mhzó   :r   )rí   rž   rÛ   ra   )rÞ   rª   s     rA   rß   z)_cpu_get_cpuinfo_freq.<locals>.<listcomp>x  s_   € ð 
ð 
ð 
àØ�zŠz‰|Œ|×&Ò& zÑ2Ô2ð
Ý�$—*’*˜T 1Ñ%Ô% aÔ(Ñ)Ô)ð
ð 
ð 
r@   N)r   r   )rŽ   s    rA   Ú_cpu_get_cpuinfo_freqr  u  sœ   € å	�Ñ)Ô)Ð3Ð3Ð3Ñ	4Ô	4ð 
¸ð
ð 
àð
ñ 
ô 
ð
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   Ÿ8¸<¿<z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	      ó†  — t          ¦   «         } t          j        d¦  «        pt          j        d¦  «        }|                     d„ ¬¦  «         g }t          j        j        }t          |¦  «        D �]O\  }}t          |¦  «        t          | ¦  «        k    r| |         dz  }nt           ||d¦  «        d¬¦  «        }|€st           ||d	¦  «        d¬¦  «        }|€Vd
|› d�}t          |d¬¦  «        dk    r*| 
                    t          j        ddd¦  «        ¦  «         Œ±d}t          |¦  «        ‚t          |¦  «        dz  }t          t           ||d¦  «        ¦  «        ¦  «        dz  }	t          t           ||d¦  «        ¦  «        ¦  «        dz  }
| 
                    t          j        ||
|	¦  «        ¦  «         �ŒQ|S )z‚Return frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc                 ój   — t          t          j        d| ¦  «                             ¦   «         ¦  «        S )Nz[0-9]+)rŸ   rî   rò   Úgroup)rI   s    rA   ú<lambda>zcpu_freq.<locals>.<lambda>Œ  s&   € ¥¥R¤Y¨y¸!Ñ%<Ô%<×%BÒ%BÑ%DÔ%DÑ!EÔ!E€ r@   )r  iè  Úscaling_cur_freqN©r¤   Úcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r”   z!can't find current frequency fileÚscaling_max_freqÚscaling_min_freq)r  rø   Úsortr_   rd   r¾   Ú	enumerater‹   r   r   rŒ   rÂ   ÚscpufreqÚNotImplementedErrorrŸ   )Úcpuinfo_freqsÚpathsÚretÚpjoinÚird   ÚcurrÚonline_pathrÉ   Úmax_Úmin_s              rA   Úcpu_freqr&  ƒ  s×  € õ
 .Ñ/Ô/ˆÝ”	Ø:ñ
ô 
ð DåŒYÐBÑCÔCð 	ð 	�
Š
ÐEÐEˆ
ÑFÔFÐFØˆÝ””ˆÝ  Ñ'Ô'ð 	7ñ 	7‰GˆAˆtÝ�5‰zŒz�S Ñ/Ô/Ò/Ð/ð % QÔ'¨$Ñ.��å˜E˜E $Ð(:Ñ;Ô;ÀdÐKÑKÔK�Øˆ|õ ˜E˜E $Ð(:Ñ;Ô;ÀdÐKÑKÔK�Ø�<Ø"JÀÐ"JÐ"JÐ"J�Kå˜;°Ð6Ñ6Ô6¸%Ò?Ð?ØŸ
š
¥3¤<°°S¸#Ñ#>Ô#>Ñ?Ô?Ð?Ø Ø=�CÝ-¨cÑ2Ô2Ð2Ý�t‘9”9˜tÑ#ˆDÝ•t˜E˜E $Ð(:Ñ;Ô;Ñ<Ô<Ñ=Ô=ÀÑDˆDÝ•t˜E˜E $Ð(:Ñ;Ô;Ñ<Ô<Ñ=Ô=ÀÑDˆDØ�JŠJ•s”| D¨$°Ñ5Ô5Ñ6Ô6Ð6Ñ6Øˆ
r@   c                  ó2   — d„ t          ¦   «         D ¦   «         S )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        c                 ó:   — g | ]}t          j        |d d ¦  «        ‘ŒS )r”   )rÂ   r  rÝ   s     rA   rß   zcpu_freq.<locals>.<listcomp>®  s&   € ÐKÐKÐK¨a•”˜Q  SÑ)Ô)ÐKÐKÐKr@   )r  r?   r@   rA   r&  r&  ª  s    € ð LÐKÕ3HÑ3JÔ3JÐKÑKÔKÐKr@   c                   ó   — e Zd ZdS )Ú_Ipv6UnsupportedErrorN)r<   r=   r>   r?   r@   rA   r*  r*  ¹  s   € € € € € Ø€Dr@   r*  c                   ór   — e Zd ZdZd„ Zd„ Zd„ Zed„ ¦   «         Zed
d„¦   «         Z	ed
d„¦   «         Z
d
d	„ZdS )ÚNetConnectionsaw  A wrapper on top of /proc/net/* files, retrieving per-process
    and system-wide open connections (TCP, UDP, UNIX) similarly to
    "netstat -an".

    Note: in case of UNIX sockets we're only able to determine the
    local endpoint/path, not the one it's connected to.
    According to [1] it would be possible but not easily.

    [1] http://serverfault.com/a/417946
    c                 óL  — dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        t           j        f}dt           j        d f}|||||f||f|f|f||f|f|f|f||||f||f||fdœ| _        d | _        d S )NÚtcpÚtcp6ÚudpÚudp6Úunix)Úallr.  Útcp4r/  r0  Úudp4r1  r2  ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)Úselfr4  r/  r5  r1  r2  s         rA   Ú__init__zNetConnections.__init__É  sÃ   € ð •v”~¥vÔ'9Ð:ˆØ�œ­Ô);Ð<ˆØ•v”~¥vÔ'8Ð9ˆØ�œ­Ô):Ð;ˆØ�œ¨Ð-ˆà˜$  d¨DÐ1Ø˜$�<Ø�GØ�GØ˜$�<Ø�GØ�GØ�GØ˜4  tÐ,Ø˜D�\Ø˜D�\ð
ð 
ˆŒ	ð !ˆÔÐÐr@   c                 ó  — t          t          ¦  «        }t          j        | j        › d|› d�¦  «        D ]Ø}	 t          | j        › d|› d|› �¦  «        }|                     d¦  «        r<|dd …         d d…         }||                              |t          |¦  «        f¦  «         Œq# t          t          f$ r Y Œ„t          $ rI}|j        t          j        k    rY d }~Œ§|j        t          j        k    rt          |¦  «         Y d }~ŒÐ‚ d }~ww xY w|S )Nrs   ú/fdú/fd/zsocket:[rƒ   éÿÿÿÿ)r   Úlistr_   Úlistdirr@  r`   rž   rŒ   rŸ   ÚFileNotFoundErrorÚProcessLookupErrorrœ   ÚerrnoÚEINVALÚENAMETOOLONGr   )rA  ÚpidÚinodesÚfdÚinoder¨   s         rA   Úget_proc_inodeszNetConnections.get_proc_inodesà  sA  € Ý�TÑ"Ô"ˆÝ”* Ô 1Ð<Ð<°CÐ<Ð<Ð<Ñ=Ô=ð 	9ð 	9ˆBð9Ý  DÔ$5Ð!EÐ!E¸Ð!EÐ!EÀÐ!EÐ!EÑFÔF�ð  ×#Ò# JÑ/Ô/ð 9à! ! " "œI c r cœN�EØ˜5”M×(Ò(¨#­s°2©w¬w¨Ñ8Ô8Ð8øøõ% &Õ'9Ð:ð ð ð ð �Ýð ð ð Ø”9¥¤Ò,Ð,à�H�H�H�HØ”9¥Ô 2Ò2Ð2å˜#‘J”J�JØ�H�H�H�HØøøøøðøøøð ˆs)   ·B%Â%D
Â8	D
ÃDÃ$DÄDÄD
c                 ó¸   — i }t          ¦   «         D ]H}	 |                     |                      |¦  «        ¦  «         Œ,# t          t          t
          f$ r Y ŒEw xY w|S ©N)ÚpidsÚupdaterR  rI  rJ  ÚPermissionError)rA  rO  rN  s      rA   Úget_all_inodeszNetConnections.get_all_inodesú  ss   € ØˆÝ‘6”6ð 	ð 	ˆCð
Ø—’˜d×2Ò2°3Ñ7Ô7Ñ8Ô8Ð8Ð8øÝ%Õ'9½?ÐKð ð ð ð �ðøøøð ˆs   ”(=½AÁAc           
      ó  — |                       d¦  «        \  }}t          |d¦  «        }|sdS |                     d¦  «        }|t          j        k    r`t
          r1t          j        |t          j        |¦  «        ddd…         ¦  «        }nït          j        |t          j        |¦  «        ¦  «        }nÇt          j        |¦  «        }	 t
          rCt          j        t          j	        t          j        dgt          j        d|¦  «        ¢R Ž ¦  «        }nBt          j        t          j	        t          j        dgt          j        d|¦  «        ¢R Ž ¦  «        }n%# t          $ r t          ¦   «         st          d‚‚ w xY wt!          j        ||¦  «        S )	a†  Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:

        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.

        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        ú:é   r?   ÚasciiNrF  z>4Iz<4I)ra   rŸ   Úencoder9  r:  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoder<  ÚstructÚpackÚunpackrì   r   r*  rÂ   Úaddr)re  ÚfamilyÚipÚports       rA   Údecode_addresszNetConnections.decode_address
  s}  € ð" —:’:˜c‘?”?‰ˆˆDÝ�4˜‰}Œ}ˆð ð 	Ø�2Ø�YŠY�wÑÔˆØ•V”^Ò#Ð#åð DÝÔ% f­fÔ.>¸rÑ.BÔ.BÀ4À4ÀRÀ4Ô.HÑIÔI��åÔ% f­fÔ.>¸rÑ.BÔ.BÑCÔC��åÔ! "Ñ%Ô%ˆBðå ð 	ÝÔ)ÝœÝœ EÐE­F¬M¸%ÀÑ,DÔ,DÐEÐEÐEñô �B�Bõ
  Ô)ÝœÝœ EÐE­F¬M¸%ÀÑ,DÔ,DÐEÐEÐEñô �Bøøõ ð ð ð å$‘”ð :Ý/°TÐ9Øð	øøøõ
 Œx˜˜DÑ!Ô!Ð!s   ÃBE Å"E6Nc              #   ó  K  — |                       d¦  «        r!t          j                             | ¦  «        sdS t	          | ¦  «        5 }|                     ¦   «          t          |d¦  «        D ]ø\  }}	 |                     ¦   «         dd…         \
  }}	}
}}}}}}}n)# t          $ r d| › d|› d|›�}t          |¦  «        d‚w xY w||v r||         d         \  }}nd	\  }}|�||k    rŒ{|t          j        k    rt          |         }nt          j        }	 t                               |	|¦  «        }	t                               |
|¦  «        }
n# t"          $ r Y Œéw xY w||||	|
||fV — Œù	 ddd¦  «         dS # 1 swxY w Y   dS )
z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nr   r‡   úerror while parsing ú; malformed line rê   r   ©NrF  )rb   r_   rd   Úexistsr   rŠ   r  ra   rì   ÚRuntimeErrorr9  r;  ÚTCP_STATUSESr   Ú	CONN_NONEr,  ri  r*  )Úfilerf  Útype_rO  Ú
filter_pidrŽ   Úlinenorª   rÒ   ÚladdrÚraddrÚstatusrQ  rÉ   rN  rP  s                   rA   Úprocess_inetzNetConnections.process_inet=  sI  è è € ð �=Š=˜ÑÔð 	¥b¤g§n¢n°TÑ&:Ô&:ð 	àˆFÝ�t‰_Œ_ð #	I Ø�JŠJ‰LŒLˆLÝ )¨!¨Q¡¤ð !Ið !I‘�˜ð	6àŸ
š
™œ S b SÔ)ñ B�A�u˜e V¨Q°°1°a¸¸E¸Eøõ "ð 6ð 6ð 6ð.¨tð .ð .Ø"ð.ð .Ø%)ð.ð .ð õ ' sÑ+Ô+°Ð5ð6øøøð ˜F�?�?ð % Uœm¨AÔ.‘G�C˜˜à&‘G�C˜ØÐ)¨j¸CÒ.?Ð.?Øà¥Ô 2Ò2Ð2Ý!-¨fÔ!5˜˜å!(Ô!2˜ð!Ý .× =Ò =¸eÀVÑ LÔ L˜Ý .× =Ò =¸eÀVÑ LÔ L˜˜øÝ0ð !ð !ð !Ø ˜ð!øøøà˜v u¨e°U¸FÀCÐHÐHÐHÐHÐHðC!Ið#	Ið #	Ið #	Iñ #	Iô #	Ið #	Ið #	Ið #	Ið #	Ið #	Ið #	Ið #	Iøøøð #	Ið #	Ið #	Ið #	Ið #	Ið #	IsO   Á*E4Á3'BÂE4Â&CÃAE4Ä6E
Å	E4Å

EÅE4ÅEÅE4Å4E8Å;E8c           
   #   ó$  K  — t          | ¦  «        5 }|                     ¦   «          |D ]Í}|                     ¦   «         }	 |dd…         \  }}}}}}}	n+# t          $ r d|vrY Œ:d| › d|›�}
t	          |
¦  «        ‚w xY w|	|v r	||	         }ndg}|D ]e\  }}|�||k    rŒt          |¦  «        dk    r|d	         nd
}t          j        t          |¦  «        ¦  «        }d
}t          j	        }|||||||fV — ŒfŒÎ	 ddd¦  «         dS # 1 swxY w Y   dS )zParse /proc/net/unix files.r   é   rê   rl  rm  rn  Nrƒ   rF  Ú )
r   rŠ   ra   rì   rp  r‹   r   Úsocktype_to_enumrŸ   rr  )rs  rf  rO  ru  rŽ   rª   ÚtokensrÒ   rt  rQ  rÉ   ÚpairsrN  rP  rd   rx  ry  s                    rA   Úprocess_unixzNetConnections.process_unixh  sÚ  è è € õ �t‰_Œ_ð 	L Ø�JŠJ‰LŒLˆLØð Lð L�ØŸš™œ�ð	,Ø28¸¸1¸´+Ñ/�A�q˜!˜Q  q¨%¨%øÝ!ð ,ð ,ð ,Ø $��à ˜àN¨tÐNÐNÀdÐNÐNð õ ' sÑ+Ô+Ð+ð,øøøð ˜F�?�?ð # 5œM�E�Eà'˜L�EØ$ð Lð L‘G�C˜Ø!Ð-°*ÀÒ2CÐ2CØ å-0°©[¬[¸AÒ-=Ð-=˜v bœz˜zÀ2˜Ý 'Ô 8½¸U¹¼Ñ DÔ D˜ð !#˜Ý!(Ô!2˜Ø! 6¨5°$¸¸vÀsÐKÐKÐKÐKÐKðLð%Lð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Ls6   ’-DÁ AÁDÁA;Á!DÁ#A;Á;A<DÄD	ÄD	c                 óN  — t          ¦   «         | _        |�|                      |¦  «        }|sg S n|                      ¦   «         }t	          ¦   «         }| j        |         D ]¸\  }}}| j        › d|› �}|t          j        t          j        hv r|  	                    |||||¬¦  «        }	n|  
                    ||||¬¦  «        }	|	D ]U\  }
}}}}}}|rt          j        |
|||||¦  «        }nt          j        |
||||||¦  «        }|                     |¦  «         ŒVŒ¹t          |¦  «        S )Nz/net/)ru  )r   r@  rR  rX  r÷   r?  r9  r:  r<  rz  r�  rÂ   ÚpconnÚsconnrù   rG  )rA  ÚkindrN  rO  r  Ú
proto_namerf  rt  rd   rü   rP  rw  rx  ry  Ú	bound_pidÚconns                   rA   ÚretrievezNetConnections.retrieveŒ  sh  € Ý+Ñ-Ô-ˆÔØˆ?Ø×)Ò)¨#Ñ.Ô.ˆFØð à�	ðð ×(Ò(Ñ*Ô*ˆFÝ‰eŒeˆØ)-¬°4¬ð 	ð 	Ñ%ˆJ˜ ØÔ'Ð:Ð:¨jÐ:Ð:ˆDØ�&œ.­&¬/Ð:Ð:Ð:Ø×&Ò&Ø˜& %¨¸Cð 'ñ ô ��ð ×&Ò& t¨V°VÈÐ&ÑLÔL�ØFHð ð ÑB��F˜E 5¨%°¸Øð Ýœ9 R¨°¸¸uÀfÑMÔM�D�Dåœ9Ø˜F E¨5°%¸Àñô �Dð —’˜‘”��ðõ �C‰yŒyÐr@   rT  )r<   r=   r>   Ú__doc__rB  rR  rX  Ústaticmethodri  rz  r�  r‰  r?   r@   rA   r,  r,  ½  sÅ   € € € € € ð	ð 	ð!ð !ð !ð.ð ð ð4ð ð ð  ð0"ð 0"ñ „\ð0"ðd ð(Ið (Ið (Iñ „\ð(IðT ð!Lð !Lð !Lñ „\ð!LðFð ð ð ð ð r@   r,  r6  c                 ó6   — t                                | ¦  «        S )z$Return system-wide open connections.)Ú_net_connectionsr‰  )r…  s    rA   Únet_connectionsrŽ  ¬  s   € å×$Ò$ TÑ*Ô*Ð*r@   c                  ó  — t          t          ¦   «         › d�¦  «        5 } |                      ¦   «         }ddd¦  «         n# 1 swxY w Y   i }|dd…         D ]´}|                     d¦  «        }|dk    sJ t	          |¦  «        ¦   «         ‚|d|…                              ¦   «         }||dz   d…                              ¦   «                              ¦   «         }t          t          |¦  «        \  }}}	}
}}}}}}}}}}}}|||||	||
|f||<   Œµ|S )zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z/net/devNr:   rZ  r   r   )	r   r   Ú	readlinesÚrfindÚreprr�   ra   ÚmaprŸ   )rŽ   ÚlinesÚretdictrª   Úcolonrw   r�   Ú
bytes_recvÚpackets_recvÚerrinÚdropinÚ_fifoinÚ_frameinÚ_compressedinÚ_multicastinÚ
bytes_sentÚpackets_sentÚerroutÚdropoutÚ_fifooutÚ_collisionsoutÚ_carrieroutÚ_compressedouts                          rA   Únet_io_countersr§  ±  sy  € õ 
•oÑ'Ô'Ð1Ð1Ð1Ñ	2Ô	2ð °aØ—’‘”ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à€GØ�a�b�b”	ð $
ð $
ˆØ—
’
˜3‘”ˆØ�qŠyˆyˆy�$˜t™*œ*‰yŒyˆyØ�F�U�FŒ|×!Ò!Ñ#Ô#ˆØ�e˜a‘i�k�kÔ"×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2ˆõ* •�VÑÔñ'	
àØØØØØØØàØØØØØØØð ØØØØØØØð	
ˆ�‰ˆð €Ns   ŸA Á AÁAc                  ó*  — t           j        t          t           j        t          t           j        t          i} t          ¦   «                              ¦   «         }i }|D ]¸}	 t          j	        |¦  «        }t          j
        |¦  «        }t          j        |¦  «        \  }}d                     |¦  «        }d|v }	t          j        |	| |         |||¦  «        ||<   Œ}# t          $ r/}
|
j        t           j        k    r‚ t%          |
¦  «         Y d}
~
Œ±d}
~
ww xY w|S )z)Get NIC stats (isup, duplex, speed, mtu).ú,ÚrunningN)rÏ   ÚDUPLEX_FULLr   ÚDUPLEX_HALFr   ÚDUPLEX_UNKNOWNr   r§  ÚkeysÚ
net_if_mtuÚnet_if_flagsÚnet_if_duplex_speedr¾   rÂ   Ú	snicstatsrœ   rK  ÚENODEVr   )Ú
duplex_mapÚnamesr  rw   Úmturn   ÚduplexÚspeedÚoutput_flagsÚisupr¨   s              rA   Únet_if_statsr»  à  s  € õ 	Ô�/ÝÔ�/ÝÔÕ/ð€Jõ
 ÑÔ×"Ò"Ñ$Ô$€EØ
€CØð ð ˆð	Ý”/ $Ñ'Ô'ˆCÝÔ% dÑ+Ô+ˆEÝ Ô4°TÑ:Ô:‰MˆF�Eð Ÿ8š8 E™?œ?ˆLØ Ð%ˆDÝœØ�j Ô(¨%°°lñô ˆC�‰IˆIøõ ð 	ð 	ð 	àŒy�EœLÒ(Ð(ØÝ�#‰JŒJˆJˆJˆJˆJˆJˆJøøøøð		øøøð €Js   Á?CÃ
DÃ!%DÄDFc                 ó¨  — d„ }d„ }t           j                             t          ¦   «         › d�¦  «        r |¦   «         }nJt           j                             d¦  «        r |¦   «         }n t          ¦   «         › d�}t	          |¦  «        ‚i }|D ]C}|\
  }}}	}
}}}}}}| st          |¦  «        sŒ!|
t          z  }
|t          z  }||	|
||||||f	||<   ŒD|S )zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c               3   óÀ  K  — t          t          ¦   «         › d�¦  «        5 } |                      ¦   «         }d d d ¦  «         n# 1 swxY w Y   |D �]}|                     ¦   «         }t	          |¦  «        }|dk    rF|d         }t          |d         ¦  «        }t          t
          |dd…         ¦  «        \
  }}}	}
}}}}}}n�|dk    s|dk    r2|d         }t          t
          |dd…         ¦  «        \  }}}}	}
}}}}}}nO|dk    r5|d         }t          t
          |dd …         ¦  «        \  }}}
}d	x}	x}x}x}}nd
|›�}t          |¦  «        ‚|||
|||	||||f
V — �Œd S )Nú
/diskstatsé   r;   r:   rÍ   é   é   r|  r   znot sure how to interpret line )r   r   r�  ra   r‹   rŸ   r“  rì   )rŽ   r”  rª   r�   Úflenrw   ÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚwrites_mergedÚwbytesÚwtimerÒ   Ú	busy_timerÉ   s                    rA   Úread_procfsz%disk_io_counters.<locals>.read_procfs	  sé  è è € õ" �/Ñ+Ô+Ð7Ð7Ð7Ñ8Ô8ð 	"¸AØ—K’K‘M”MˆEð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"àð 	;ñ 	;ˆDØ—Z’Z‘\”\ˆFÝ�v‘;”;ˆDà�rŠzˆzà˜a”y�Ý˜F 1œI™œ�å69½#¸vÀaÈÀd¼|Ñ6LÔ6Lñ4�˜v u¨f°mØ˜E 1 i°°Ø˜’�˜t ršz˜zà˜a”y�å69½#¸vÀaÈÀd¼|Ñ6LÔ6Lñ4�˜ f¨e°V¸]Ø˜E 1 i°°Ø˜’�à˜a”y�Ý03µC¸ÀÀÀ¼Ñ0DÔ0DÑ-��v˜v vØKLÐL�ÐL˜ÐL ÐL¨}¸y¸yà@¸Ð@Ð@�Ý  ‘o”oÐ%Ø˜ ¨°¸¸uØ °	ð;ð ;ð ;ð ;ñ ;ð/	;ð 	;s   ¡AÁAÁ	Ac               3   ó\  K  — t          j        d¦  «        D �]} t          j        t           j                             d| ¦  «        ¦  «        D ]Ý\  }}}d|vrŒt          t           j                             |d¦  «        ¦  «        5 }|                     ¦   «                              ¦   «                              ¦   «         }d d d ¦  «         n# 1 swxY w Y   t           j         	                    |¦  «        }t          t          |d d…         ¦  «        \
  }}}	}
}}}}}}||||	||
||||f
V — ŒÞ�Œd S )Nú
/sys/blockÚstatr‡   )r_   rH  Úwalkrd   r¾   r   rú   r�   ra   Úbasenamer“  rŸ   )ÚblockÚrootrÒ   ÚfilesrŽ   r�   rw   rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  s                   rA   Ú
read_sysfsz$disk_io_counters.<locals>.read_sysfs7  s  è è € Ý”Z Ñ-Ô-ð 	Fñ 	FˆEÝ"$¤'­"¬'¯,ª,°|ÀUÑ*KÔ*KÑ"LÔ"Lð 
Fð 
F‘��a˜Ø Ð&Ð&ØÝ�rœwŸ|š|¨D°&Ñ9Ô9Ñ:Ô:ð 6¸aØŸVšV™XœXŸ^š^Ñ-Ô-×3Ò3Ñ5Ô5�Fð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6å”w×'Ò'¨Ñ-Ô-�õ 47µs¸FÀ3ÀBÀ3¼KÑ3HÔ3Hñ1�˜ f¨e°V¸]Ø˜E 1 iØ˜U F¨F°F¸EØ˜l¨M¸9ðFð Fð Fð Fð Fñ
Fð	Fð 	Fs   Â9C	Ã	CÃCr¾  rÎ  z6/diskstats nor /sys/block are available on this system)r_   rd   ro  r   r  ry   ÚDISK_SECTOR_SIZE)ÚperdiskrÌ  rÕ  ÚgenrÉ   r•  rå   rw   rÃ  rÇ  rÅ  rÉ  rÆ  rÊ  rÄ  rÈ  rË  s                    rA   Údisk_io_countersrÙ    s;  € ð
+;ð +;ð +;ð\Fð Fð Fõ 
„w‡~‚~�Ñ*Ô*Ð6Ð6Ð6Ñ7Ô7ð 	'Øˆk‰mŒmˆˆÝ	Œ�Š˜Ñ	%Ô	%ð 'Øˆj‰lŒlˆˆõ Ñ Ô ð ð ð ð 	õ " #Ñ&Ô&Ð&à€GØð Að Aˆð ).ñ	&ˆˆu�f˜f f¨e°U¸LØ˜9Øð 	Õ0°Ñ6Ô6ð 	ð àÕ"Ñ"ˆØÕ"Ñ"ˆØ ¨°¸¸uØ% }°iðAˆ�‰ˆð €Nr@   c                   ó8   — e Zd ZdZddgZd„ Zd„ Zd„ Zd„ Zd„ Z	d	S )
ÚRootFsDeviceFinderaF  disk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
    ÚmajorÚminorc                 óœ   — t          j        d¦  «        j        }t          j        |¦  «        | _        t          j        |¦  «        | _        d S ©Nrs   )r_   rÏ  Úst_devrÜ  rÝ  )rA  Údevs     rA   rB  zRootFsDeviceFinder.__init__w  s4   € ÝŒg�c‰lŒlÔ!ˆÝ”X˜c‘]”]ˆŒ
Ý”X˜c‘]”]ˆŒ
ˆ
ˆ
r@   c                 ó.  — t          t          ¦   «         › d�¦  «        5 }|                     ¦   «         dd …         D ]¿}|                     ¦   «         }t	          |¦  «        dk     rŒ*|d                              ¦   «         rt          |d         ¦  «        nd }|d                              ¦   «         rt          |d         ¦  «        nd }|d         }|| j        k    r || j        k    r|rd|› �c cd d d ¦  «         S ŒÀ	 d d d ¦  «         d S # 1 swxY w Y   d S )Nz/partitionsr:   rÍ   r   r   r;   ú/dev/)	r   r   r�  ra   r‹   ÚisdigitrŸ   rÜ  rÝ  )rA  rŽ   rª   r�   rÜ  rÝ  rw   s          rA   Úask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions|  sv  € Ý�/Ñ+Ô+Ð8Ð8Ð8Ñ9Ô9ð 
	.¸QØŸš™œ a b bÔ)ð 	.ð 	.�ØŸš™œ�Ý�v‘;”; ’?�?ØØ*0°¬)×*;Ò*;Ñ*=Ô*=ÐG�˜F 1œI™œ˜À4�Ø*0°¬)×*;Ò*;Ñ*=Ô*=ÐG�˜F 1œI™œ˜À4�Ø˜a”y�Ø˜DœJÒ&Ð&¨5°D´JÒ+>Ð+>Øð .Ø- t˜~˜~Ð-Ð-ð
	.ð 
	.ð 
	.ð 
	.ñ 
	.ô 
	.ð 
	.ð 
	.øð	.ð
	.ð 
	.ð 
	.ñ 
	.ô 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.øøøð 
	.ð 
	.ð 
	.ð 
	.ð 
	.ð 
	.s   ŸCD
Ã;D
Ä
DÄDc                 ó6  — d| j         › d| j        › d�}t          |¦  «        5 }|D ]Y}|                     d¦  «        rB|                     ¦   «                              d¦  «        d         }|rd|› �c cd d d ¦  «         S ŒZ	 d d d ¦  «         d S # 1 swxY w Y   d S )Nz/sys/dev/block/rZ  z/ueventzDEVNAME=r:   rã  )rÜ  rÝ  r   rž   r�   Ú
rpartition)rA  rd   rŽ   rª   rw   s        rA   Úask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block‰  s  € ØA ¤ÐAÐA¨d¬jÐAÐAÐAˆÝ�t‰_Œ_ð 	. Øð .ð .�Ø—?’? :Ñ.Ô.ð .ØŸ:š:™<œ<×2Ò2°:Ñ>Ô>¸qÔA�DØð .Ø- t˜~˜~Ð-Ð-ð	.ð 	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.øð.ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.s   £ABÁ?BÂBÂBc                 óÆ  — | j         › d| j        › �}t          j        d¦  «        }|D ]¸}	 t	          |¦  «        }|5  |                     ¦   «                              ¦   «         }||k    rOt          j         	                    t          j         
                    |¦  «        ¦  «        }d|› �cd d d ¦  «         c S 	 d d d ¦  «         n# 1 swxY w Y   Œ©# t          $ r Y Œµw xY wd S )NrZ  z/sys/class/block/*/devrã  )rÜ  rÝ  rø   Úiglobr   rú   r�   r_   rd   rÑ  ÚdirnamerI  )rA  ÚneedlerÔ  rs  rŽ   Údatarw   s          rA   Úask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block’  sS  € Ø”JÐ-Ð- ¤Ð-Ð-ˆÝ”
Ð3Ñ4Ô4ˆØð 
	.ð 
	.ˆDð	.Ý˜d‘O”O�ð ð .ð .ØŸ6š6™8œ8Ÿ>š>Ñ+Ô+�DØ˜v’~�~Ý!œw×/Ò/µ´·²ÀÑ0EÔ0EÑFÔF˜Ø- t˜~˜~ð	.ð .ð .ð .ñ .ô .ð .ð .ð .ð .à%ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .øøõ %ð ð ð Ø�ðøøøð
	.ð 
	.s#   «C¼A-CÃC		ÃC		Ã
CÃCc                 óÈ  — d }|€<	 |                       ¦   «         }n&# t          $ r}t          |¦  «         Y d }~nd }~ww xY w|€<	 |                      ¦   «         }n&# t          $ r}t          |¦  «         Y d }~nd }~ww xY w|€<	 |                      ¦   «         }n&# t          $ r}t          |¦  «         Y d }~nd }~ww xY w|�!t
          j                             |¦  «        r|S d S d S rT  )rå  rœ   r   rè  rî  r_   rd   ro  )rA  rd   r¨   s      rA   ÚfindzRootFsDeviceFinder.find¡  s(  € ØˆØˆ<ðØ×/Ò/Ñ1Ô1��øÝð ð ð Ý�c‘
”
�
�
�
�
�
�
øøøøðøøøàˆ<ðØ×-Ò-Ñ/Ô/��øÝð ð ð Ý�c‘
”
�
�
�
�
�
�
øøøøðøøøàˆ<ðØ×/Ò/Ñ1Ô1��øÝð ð ð Ý�c‘
”
�
�
�
�
�
�
øøøøðøøøð Ð¥¤§¢¨tÑ 4Ô 4ÐØˆKð ÐÐÐs@   † ›
>¥9¹>ÁA Á
A<Á#A7Á7A<ÂB Â
B:Â!B5Â5B:N)
r<   r=   r>   rŠ  Ú	__slots__rB  rå  rè  rî  rð  r?   r@   rA   rÛ  rÛ  m  su   € € € € € ðð ð ˜'Ð"€Ið#ð #ð #ð
.ð .ð .ð.ð .ð .ð.ð .ð .ðð ð ð ð r@   rÛ  c                 óˆ  — t          ¦   «         }t          ¦   «         }| s·t          |› d�¦  «        5 }|D ]‰}|                     ¦   «         }|                     d¦  «        s(|                     |                     ¦   «         ¦  «         ŒS|                     d¦  «        d         }|dk    r|                     d¦  «         ŒŠ	 ddd¦  «         n# 1 swxY w Y   |dk    r?t          j         	                    d¦  «        r t          j         
                    d¦  «        }n"t          j         
                    |› d	�¦  «        }g }t          j        |¦  «        }|D ]l}	|	\  }
}}}|
d
k    rd}
|
dv r"t          ¦   «                              ¦   «         p|
}
| s|
r||vrŒ@t          j        |
|||¦  «        }|                     |¦  «         Œm|S )z8Return mounted disk partitions as a list of namedtuples.z/filesystemsÚnodevú	r   ÚzfsNr“   z	/etc/mtabz/self/mountsÚnoner}  >   ú	/dev/rootÚrootfs)r÷   r   r   r�   rž   rù   ra   r_   rd   ÚisfileÚrealpathrÏ   Údisk_partitionsrÛ  rð  rÂ   Ú	sdiskpartrŒ   )r3  Úfstypesr�   rŽ   rª   ÚfstypeÚmounts_pathÚretlistÚ
partitionsÚ	partitionÚdeviceÚ
mountpointÚoptsÚntuples                 rA   rû  rû  ¸  s  € å‰eŒe€GÝ!Ñ#Ô#€KØð 
+Ý˜+Ð3Ð3Ð3Ñ4Ô4ð 		+¸Øð +ð +�Ø—z’z‘|”|�Ø—’ wÑ/Ô/ð +Ø—K’K §
¢
¡¤Ñ-Ô-Ð-Ð-ð "ŸZšZ¨Ñ-Ô-¨aÔ0�FØ ’�ØŸš EÑ*Ô*Ð*øð+ð		+ð 		+ð 		+ñ 		+ô 		+ð 		+ð 		+ð 		+ð 		+ð 		+ð 		+øøøð 		+ð 		+ð 		+ð 		+ð �gÒÐ¥"¤'§.¢.°Ñ"=Ô"=ÐÝ”g×&Ò& {Ñ3Ô3ˆˆå”g×&Ò&¨+Ð'CÐ'CÐ'CÑDÔDˆà€GÝÔ% kÑ2Ô2€JØð 
ð 
ˆ	Ø+4Ñ(ˆ�
˜F DØ�VÒÐØˆFØÐ,Ð,Ð,Ý'Ñ)Ô)×.Ò.Ñ0Ô0Ð:°FˆFØð 	Øð ˜V¨7Ð2Ð2ØÝ”˜v z°6¸4Ñ@Ô@ˆØ�Š�vÑÔÐÐà€Ns   ±BCÃCÃCc            	      óì  — t          j        t          ¦  «        } t          j        d¦  «        }|                     t          j        d¦  «        ¦  «         t          d„ |D ¦   «         ¦  «        }t          j        d¦  «        }t          j        d¦  «        }|D ]1}|                     d|¦  «        }||vr| 	                    |¦  «         Œ2|D �][}	 |dz   }t          t          |¦  «        ¦  «        dz  }t          j                             t          j                             |¦  «        d	¦  «        }t!          |¦  «                             ¦   «         }	n# t$          t&          f$ r Y Œšw xY wt          |d
z   d¬¦  «        }
t          |dz   d¬¦  «        }t!          |dz   d¬¦  «                             ¦   «         }|
�&	 t          |
¦  «        dz  }
n# t&          $ r d}
Y nw xY w|�&	 t          |¦  «        dz  }n# t&          $ r d}Y nw xY w| |	          	                    |||
|f¦  «         �Œ]|�s;t          j        d¦  «        }t          t)          |¦  «        ¦  «        }|D �]}	 t          j                             |d¦  «        }t          t          |¦  «        ¦  «        dz  }t          j                             |d¦  «        }t!          |¦  «                             ¦   «         }	n-# t$          t&          f$ r}t+          |¦  «         Y d}~Œªd}~ww xY wt          j        |dz   ¦  «        }d„ |D ¦   «         }d}d}
|D �]}t          j                             ||dz   ¦  «        }t!          |d¬¦  «                             ¦   «         }|dk    r3t          t          j                             ||dz   ¦  «        d¬¦  «        }n8|dk    r2t          t          j                             ||dz   ¦  «        d¬¦  «        }
|
�&	 t          |
¦  «        dz  }
n# t&          $ r d}
Y nw xY w|�'	 t          |¦  «        dz  }Œø# t&          $ r d}Y �Œw xY w�Œ| |	          	                    d||
|f¦  «         �Œ	t-          | ¦  «        S )aø  Return hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*c                 óD   — h | ]}|                      d ¦  «        d         ’ŒS ©rÒ   r   ©ra   rÝ   s     rA   ú	<setcomp>z'sensors_temperatures.<locals>.<setcomp>÷  ó&   € Ð;Ð;Ð;¨A˜Ÿš ™œ QœÐ;Ð;Ð;r@   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @�@rw   Ú_maxNr  Ú_critÚ_labelr}  z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*c                 ó¨   — h | ]O}d                       t          j                             |¦  «                             d ¦  «        dd…         ¦  «        ’ŒPS )rÒ   r   r;   )r¾   r_   rd   rÑ  ra   )rÞ   Úps     rA   r  z'sensors_temperatures.<locals>.<setcomp>8  s[   € ð ð ð àð —’�œ×)Ò)¨!Ñ,Ô,×2Ò2°3Ñ7Ô7¸¸!¸Ô<Ñ=Ô=ðð ð r@   Ú_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   rG  rø   ÚextendÚsortedrî   rï   ÚsubrŒ   rÛ   r   r_   rd   r¾   rë  r   r�   rœ   rì   r÷   r   Údict)r  Ú	basenamesÚ
basenames2Úreplrw   ÚaltnameÚbaserd   ÚcurrentÚ	unit_namer  r  Úlabelr¨   Ú
trip_pathsÚtrip_pointsÚ
trip_pointÚ	trip_types                     rA   Úsensors_temperaturesr*  ä  së  € õ Ô
!¥$Ñ
'Ô
'€CÝ”	Ð;Ñ<Ô<€Ið ×Ò•T”YÐGÑHÔHÑIÔIÐIÝÐ;Ð;°Ð;Ñ;Ô;Ñ<Ô<€Iõ ”Ø?ñô €Jõ Œ:Ð@ÑAÔA€DØð #ð #ˆØ—(’(Ð.°Ñ5Ô5ˆØ˜)Ð#Ð#Ø×Ò˜TÑ"Ô"Ð"øàð  @ñ  @ˆð	Ø˜(‘?ˆDÝ�D ™JœJÑ'Ô'¨&Ñ0ˆGÝ”7—<’<¥¤§¢°Ñ 5Ô 5°vÑ>Ô>ˆDÝ˜D™	œ	ŸšÑ)Ô)ˆIˆIøÝ�Ð$ð 		ð 		ð 		ð ˆHð		øøøõ �D˜6‘M¨DÐ1Ñ1Ô1ˆÝ˜˜w™°Ð6Ñ6Ô6ˆÝ�D˜8‘O¨bÐ1Ñ1Ô1×7Ò7Ñ9Ô9ˆàÐðÝ˜T‘{”{ VÑ+��øÝð ð ð Ø���ðøøøàÐð Ý  ™?œ?¨VÑ3��øÝð  ð  ð  Ø���ð øøøð 	ˆIŒ×Ò˜u g¨t°XÐ>Ñ?Ô?Ð?Ñ?ð ñ ,AÝ”IÐ@ÑAÔAˆ	Ý�3˜y™>œ>Ñ*Ô*ˆ	àð (	Añ (	AˆDðÝ”w—|’| D¨&Ñ1Ô1�Ý¥ T¡
¤
Ñ+Ô+¨fÑ4�Ý”w—|’| D¨&Ñ1Ô1�Ý ™IœIŸOšOÑ-Ô-�	�	øÝ�ZÐ(ð ð ð Ý�c‘
”
�
Ø����øøøøðøøøõ œ 4¨.Ñ#8Ñ9Ô9ˆJðð à#ðñ ô ˆKð ˆHØˆDØ)ð (ñ (�
Ý”w—|’| D¨*°wÑ*>Ñ?Ô?�Ý ¨rÐ2Ñ2Ô2×8Ò8Ñ:Ô:�	Ø 
Ò*Ð*Ý#ÝœŸš T¨:¸Ñ+?Ñ@Ô@È4ð ñ  ô  �H�Hð  &Ò(Ð(ÝÝœŸš T¨:¸Ñ+?Ñ@Ô@È4ðñ ô �Dð Ð#ð$Ý$ T™{œ{¨VÑ3˜˜øÝ%ð $ð $ð $Ø#˜˜˜ð$øøøàÐ'ð(Ý#(¨¡?¤?°VÑ#;˜˜øÝ%ð (ð (ð (Ø#'˜˜™ð(øøøñ (ð �	ŒN×!Ò! 2 w°°hÐ"?Ñ@Ô@Ð@Ñ@å�‰9Œ9Ðst   ÃBEÅE'Å&E'Æ;GÇGÇGÇ#G6Ç6HÈHÉ"B K#Ë#LË4LÌLÏ6P	Ð	PÐPÐP1Ð1QÑ Qc                  óÐ  — t          j        t          ¦  «        } t          j        d¦  «        }|st          j        d¦  «        }t	          d„ |D ¦   «         ¦  «        }|D ]ù}	 t          t          |dz   ¦  «        ¦  «        }n&# t          $ r}t          |¦  «         Y d}~ŒAd}~ww xY wt          t          j                             t          j                             |¦  «        d¦  «        ¦  «                             ¦   «         }t          |dz   d¬	¦  «                             ¦   «         }| |                              t!          j        ||¦  «        ¦  «         Œút%          | ¦  «        S )
a‡  Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*c                 óD   — h | ]}|                      d ¦  «        d         ’ŒS r	  r
  rÝ   s     rA   r  zsensors_fans.<locals>.<setcomp>k  r  r@   r  Nrw   r  r}  r  )r  r   rG  rø   r  rŸ   r   rœ   r   r   r_   rd   r¾   rë  r�   rŒ   rÂ   Úsfanr  )r  r  r"  r#  r¨   r$  r%  s          rA   Úsensors_fansr.  Z  sM  € õ Ô
!¥$Ñ
'Ô
'€CÝ”	Ð:Ñ;Ô;€IØð Gõ ”IÐEÑFÔFˆ	åÐ;Ð;°Ð;Ñ;Ô;Ñ<Ô<€IØð 8ð 8ˆð	Ý�$˜t h™Ñ/Ô/Ñ0Ô0ˆGˆGøÝð 	ð 	ð 	Ý�#‰JŒJˆJØˆHˆHˆHˆHøøøøð	øøøõ �œŸš¥R¤W§_¢_°TÑ%:Ô%:¸FÑCÔCÑDÔD×JÒJÑLÔLˆ	Ý�D˜8‘O¨bÐ1Ñ1Ô1×7Ò7Ñ9Ô9ˆØˆIŒ×Ò�cœh u¨gÑ6Ô6Ñ7Ô7Ð7Ð7å�‰9Œ9Ðs   Á"BÂ
B%ÂB Â B%c                  óv  ‡— t          ¦   «         Šˆfd„} d„ t          j        t          ¦  «        D ¦   «         }|sdS t          j                             t          t          |¦  «        ¦  «        } | |dz   |dz   ¦  «        } | |dz   |dz   ¦  «        } | |dz   |d	z   ¦  «        } | |d
z   ¦  «        }|�|�	 d|z  |z  }n;# t          $ r d}Y n-w xY wt          t          |dz   d¬¦  «        ¦  «        }|dk    rdS d} | t          j                             t          d¦  «        t          j                             t          d¦  «        ¦  «        }	|	�|	dk    }nGt          |dz   d¬¦  «         
                    ¦   «                              ¦   «         }
|
dk    rd}n|
dv rd}|rt          j        }nw|�B|�@	 t          |t          |¦  «        z  dz  ¦  «        }nO# t          $ r t          j        }Y n7w xY w|�%t          |dz  ¦  «        }|dk     rt          j        }nt          j        }t!          j        |||¦  «        S )a  Return battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    c                  ó°   •— | D ]Q}t          |‰¬¦  «        }|‰k    r8	 t          |¦  «        c S # t          $ r |                     ¦   «         cY c S w xY wŒRdS )zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        r  N)r   rŸ   rì   r�   )r  rd   r  Únulls      €rA   Ú
multi_bcatz#sensors_battery.<locals>.multi_bcat‚  s„   ø€ ð ð 	'ð 	'ˆDÝ�t dÐ+Ñ+Ô+ˆCØ�dŠ{ˆ{ð'Ý˜s™8œ8�O�O�OøÝ!ð 'ð 'ð 'ØŸ9š9™;œ;Ð&Ð&Ð&Ð&Ð&ð'øøøð ð
 ˆts   ž/¯AÁAc                 óh   — g | ]/}|                      d ¦  «        sd|                     ¦   «         v ¯-|‘Œ0S )ÚBATÚbattery)rž   rí   rÝ   s     rA   rß   z#sensors_battery.<locals>.<listcomp>�  sK   € ð ð ð àØ�<Š<˜ÑÔðð #,¨q¯wªw©y¬yÐ"8Ð"8ð 	
à"8Ð"8Ð"8r@   Nz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r”   z	/capacityrF  r  z
AC0/onlinez	AC/onliner   ú/statusr}  ÚdischargingF>   ÚfullÚchargingTi  é<   r   )Úobjectr_   rH  ÚPOWER_SUPPLY_PATHrd   r¾   r¡   ÚZeroDivisionErrorrŸ   r   r�   rí   r   ÚPOWER_TIME_UNLIMITEDÚabsÚPOWER_TIME_UNKNOWNrÂ   Úsbattery)r2  ÚbatsrÓ  Ú
energy_nowÚ	power_nowÚenergy_fullÚtime_to_emptyrÈ   Úpower_pluggedÚonlinery  Úsecsleftr1  s               @rA   Úsensors_batteryrJ  y  s°  ø€ õ ‰8Œ8€Dðð ð ð ð ðð å”Õ-Ñ.Ô.ðñ ô €Dð
 ð Øˆtõ Œ7�<Š<Õ)­3¨t©9¬9Ñ5Ô5€Dð �˜D =Ñ0°$¸Ñ2FÑGÔG€JØ�
˜4 ,Ñ.°°~Ñ0EÑFÔF€IØ�*˜T NÑ2°D¸>Ñ4IÑJÔJ€KØ�J˜tÐ&:Ñ:Ñ;Ô;€Mð Ð :Ð#9ð	Ø˜jÑ(¨;Ñ6ˆGˆGøÝ ð 	ð 	ð 	ØˆGˆGˆGð	øøøõ •c˜$ Ñ,°rÐ:Ñ:Ô:Ñ;Ô;ˆØ�bŠ=ˆ=Ø�4ð
 €MØˆZÝ
Œ�ŠÕ&¨Ñ5Ô5Ý
Œ�ŠÕ&¨Ñ4Ô4ñô €Fð ÐØ !šˆˆå�T˜IÑ%°Ð3Ñ3Ô3×9Ò9Ñ;Ô;×AÒAÑCÔCˆØ�]Ò"Ð"Ø!ˆMˆMØÐ+Ð+Ð+Ø ˆMð ð .ÝÔ/ˆˆØ	Ð	 IÐ$9ð	2Ý˜:­¨I©¬Ñ6¸Ñ=Ñ>Ô>ˆHˆHøÝ ð 	2ð 	2ð 	2ÝÔ1ˆHˆHˆHð	2øøøà	Ð	"Ý�} rÑ)Ñ*Ô*ˆØ�aŠ<ˆ<ÝÔ1ˆHøåÔ-ˆåŒ<˜ ¨=Ñ9Ô9Ð9s$   Â7C  Ã CÃCÆ3"G ÇG/Ç.G/c                  ó¨   — g } t          j        ¦   «         }|D ]9}|\  }}}}}t          j        ||pd|||¦  «        }|                      |¦  «         Œ:| S )z:Return currently connected users as a list of namedtuples.N)rÏ   ÚusersrÂ   ÚsuserrŒ   )	r   ÚrawlistÚitemr|   ÚttyÚhostnameÚtstamprN  Únts	            rA   rL  rL  Ø  sf   € à€GÝŒj‰lŒl€GØð ð ˆØ+/Ñ(ˆˆc�8˜V SÝŒY�t˜S˜[ D¨(°F¸CÑ@Ô@ˆØ�Š�rÑÔÐÐØ€Nr@   c                  óH  — t          ¦   «         › d�} t          | ¦  «        5 }|D ]^}|                     d¦  «        rGt          |                     ¦   «                              ¦   «         d         ¦  «        c cddd¦  «         S Œ_d| › �}t          |¦  «        ‚# 1 swxY w Y   dS )zAReturn the system boot time expressed in seconds since the epoch.r{   s   btimer   Nzline 'btime' not found in )r   r   rž   rÛ   r�   ra   rp  )rd   rŽ   rª   rÉ   s       rA   Ú	boot_timerU  ã  sò   € åÑÔÐ&Ð&Ð&€DÝ	�TÑ	Ô	ð  ˜aØð 	6ð 	6ˆDØ�Š˜xÑ(Ô(ð 6Ý˜TŸZšZ™\œ\×/Ò/Ñ1Ô1°!Ô4Ñ5Ô5Ð5Ð5ð ð  ð  ð  ñ  ô  ð  ð  ð6à1¨4Ð1Ð1ˆÝ˜3ÑÔÐð ð  ð  ð  øøøð  ð  ð  ð  ð  ð  s   ¡ABÂBÂBÂBc                  óŠ   — t          ¦   «                              t          ¦  «        } d„ t          j        | ¦  «        D ¦   «         S )z7Returns a list of PIDs currently running on the system.c                 óT   — g | ]%}|                      ¦   «         ¯t          |¦  «        ‘Œ&S r?   )rä  rŸ   rÝ   s     rA   rß   zpids.<locals>.<listcomp>ö  s+   € Ð<Ð<Ð<�q°·	²	±´Ð<�C�‰FŒFÐ<Ð<Ð<r@   )r   r]  r
   r_   rH  rc   s    rA   rU  rU  ó  s9   € åÑÔ×#Ò#¥HÑ-Ô-€DØ<Ð<�BœJ tÑ,Ô,Ð<Ñ<Ô<Ð<r@   c                 ó²  — t          j        | ¦  «        sdS 	 t          ¦   «         › d| › d�}t          |¦  «        5 }|D ]R}|                     d¦  «        r;t          |                     ¦   «         d         ¦  «        }|| k    c cddd¦  «         S ŒSd|› �}t          |¦  «        ‚# 1 swxY w Y   dS # t          t          f$ r | t          ¦   «         v cY S w xY w)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Frs   r6  s   Tgid:r   Nz'Tgid' line not found in )
r   Ú
pid_existsr   r   rž   rŸ   ra   rì   rœ   rU  )rN  rd   rŽ   rª   ÚtgidrÉ   s         rA   rY  rY  ù  sO  € õ Ô˜sÑ#Ô#ð !Øˆuð	!õ &Ñ'Ô'Ð6Ð6¨#Ð6Ð6Ð6ˆDÝ˜TÑ"Ô"ð & aØð +ð +�DØ—’ xÑ0Ô0ð +Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3˜ð  $ sš{Ð*Ð*ð&ð &ð &ð &ñ &ô &ð &ð &ð+ð
 9°$Ð8Ð8�Ý  ‘o”oÐ%ð&ð &ð &ð &øøøð &ð &ð &ð &ð &ð &øõ �Ð$ð 	!ð 	!ð 	!Ø�$™&œ&�=Ð Ð Ð ð	!øøøs;   ˜#B2 »AB%ÂB2 ÂB%Â%B)Â)B2 Â,B)Â-B2 Â2!CÃCc                  óÐ  — i } t          ¦   «         }t          ¦   «         D ]Æ}	 t          |› d|› d�¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |                     d¦  «        }||dz   d…                              ¦   «         }t          |d         ¦  «        }|| |<   Œ“# t          t          f$ r Y Œ¦t          $ r}t          |¦  «        |‚d}~ww xY w| S )zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    rs   r{   Nó   )r:   r   )r   rU  r   rú   r‘  ra   rŸ   rI  rJ  rW  r   )	r  r�   rN  rŽ   rí  ÚrparÚdsetÚppidr¨   s	            rA   Úppid_mapr`    sJ  € ð €CÝ!Ñ#Ô#€KÝ‰vŒvð ð ˆð	Ý Ð8Ð8¨cÐ8Ð8Ð8Ñ9Ô9ð  ¸QØ—v’v‘x”x�ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð —:’:˜dÑ#Ô#ˆDØ˜˜q™˜
˜
Ô#×)Ò)Ñ+Ô+ˆDÝ�t˜A”w‘<”<ˆDØˆC�‰HˆHøõ "Õ#5Ð6ð 	ð 	ð 	ØˆDÝð 	-ð 	-ð 	-Ý˜sÑ#Ô#¨Ð,øøøøð	-øøøð €Js@   ¢B2·AÁB2ÁA	ÁB2ÁA	Á B2Â2C#Ã	C#ÃCÃC#c                 óF   ‡ — t          j        ‰ ¦  «        ˆ fd„¦   «         }|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c                 óž  •— | j         | j        }}	  ‰| g|¢R i |¤ŽS # t          $ r}t          ||¦  «        |‚d }~wt          $ r*}|                      ¦   «          t          ||¦  «        |‚d }~wt          $ rU}|                      ¦   «          t          j	         
                    | j        › d|› d�¦  «        st          ||¦  «        |‚‚ d }~ww xY w)Nrs   r{   )rN  Ú_namerW  r   rJ  Ú_raise_if_zombier   rI  r_   rd   ro  r@  )rA  r›   ÚkwargsrN  rw   r¨   Úfuns         €rA   Úwrapperz wrap_exceptions.<locals>.wrapper5  s	  ø€ à”H˜dœjˆTˆð	Ø�3�tÐ-˜dÐ-Ð-Ð- fÐ-Ð-Ð-øÝð 	3ð 	3ð 	3Ý˜s DÑ)Ô)¨sÐ2øøøøÝ!ð 	4ð 	4ð 	4Ø×!Ò!Ñ#Ô#Ð#Ý  TÑ*Ô*°Ð3øøøøÝ ð 	ð 	ð 	Ø×!Ò!Ñ#Ô#Ð#õ ”7—>’> TÔ%6Ð"CÐ"C¸Ð"CÐ"CÐ"CÑDÔDð 8Ý# C¨Ñ.Ô.°CÐ7Øøøøøð	øøøs+   ‘ �
C§8¸CÁ%A*Á*CÁ7ACÃC)Ú	functoolsÚwraps)rf  rg  s   ` rA   Úwrap_exceptionsrj  0  s:   ø€ õ
 „_�SÑÔðð ð ð ñ Ôðð$ €Nr@   c                   ó  — e Zd ZdZg d¢Zd„ Zd„ Zd„ Zd„ Ze	fd„Z
eed„ ¦   «         ¦   «         Zeed	„ ¦   «         ¦   «         Zeed
„ ¦   «         ¦   «         Zd„ Zd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zej                             d ej        ¦   «         › d�¦  «        red„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed=d„¦   «         Zed>d„¦   «         Zed„ ¦   «         Z e!se"rHd„ Z#e e$j%        d¦  «         e$j%        d¦  «         e$j%        d¦  «        fd „¦   «         Z&ed!„ ¦   «         Z'ne Z'e"red"„ ¦   «         Z(ed#„ ¦   «         Z)e e$j%        d$¦  «        fd%„¦   «         Z*e e$j%        d&¦  «        fd'„¦   «         Z+ed(„ ¦   «         Z,ed)„ ¦   «         Z-ed*„ ¦   «         Z.e/r)ed+„ ¦   «         Z0 e$j%        d,¦  «        fd-„Z1ed.„ ¦   «         Z2e3red/„ ¦   «         Z4ed0„ ¦   «         Z5 e6e7d1¦  «        red=d2„¦   «         Z8ed3„ ¦   «         Z9ed4„ ¦   «         Z:ed?d6„¦   «         Z;ed7„ ¦   «         Z<ed8„ ¦   «         Z=e e$j%        d9¦  «        fd:„¦   «         Z>e e$j%        d;¦  «        fd<„¦   «         Z?dS )@ÚProcesszLinux process implementation.)Ú_cacheÚ_ctimerc  Ú_ppidr@  rN  c                 ód   — || _         d | _        d | _        d | _        t	          ¦   «         | _        d S rT  )rN  rc  ro  rn  r   r@  )rA  rN  s     rA   rB  zProcess.__init__W  s2   € ØˆŒØˆŒ
ØˆŒ
ØˆŒÝ+Ñ-Ô-ˆÔÐÐr@   c                 óº   — 	 t          | j        › d| j        › d�¦  «        }|                     d¦  «        }||dz   |dz   …         }|dk    S # t          $ r Y dS w xY w)Nrs   r{   r\  r:   r;   ó   ZF)r   r@  rN  r‘  rœ   )rA  rí  r]  ry  s       rA   Ú
_is_zombiezProcess._is_zombie^  s‚   € ð	"Ý˜4Ô,Ð>Ð>¨t¬xÐ>Ð>Ð>Ñ?Ô?ˆDð —:’:˜dÑ#Ô#ˆDØ˜$ ™( T¨A¡XÐ-Ô.ˆFØ˜T’>Ð!øõ ð 	ð 	ð 	Ø�5�5ð	øøøs   ‚A Á
AÁAc                 ón   — |                       ¦   «         r t          | j        | j        | j        ¦  «        ‚d S rT  )rs  r   rN  rc  ro  ©rA  s    rA   rd  zProcess._raise_if_zombien  s9   € Ø�?Š?ÑÔð 	BÝ ¤¨$¬*°d´jÑAÔAÐAð	Bð 	Br@   c                 óL   — t          j        | j        › d| j        › �¦  «         dS )z+Raise NSP if the process disappeared on us.rs   N)r_   rÏ  r@  rN  ru  s    rA   Ú_raise_if_not_alivezProcess._raise_if_not_aliver  s-   € õ 	Œ�4Ô$Ð1Ð1 t¤xÐ1Ð1Ñ2Ô2Ð2Ð2Ð2r@   c                 óì   — 	 t          |¦  «        S # t          t          f$ rQ t          j                             | j        › d| j        › �¦  «        r!|                      ¦   «          |t          ur|cY S ‚ w xY wrß  )
r`   rI  rJ  r_   rd   Úlexistsr@  rN  rd  ÚUNSET)rA  rd   r¤   s      rA   Ú	_readlinkzProcess._readlinkx  s†   € ð	Ý˜D‘>”>Ð!øÝ!Õ#5Ð6ð 	ð 	ð 	ÝŒw�Š $Ô"3Ð@Ð@°d´hÐ@Ð@ÑAÔAð $Ø×%Ò%Ñ'Ô'Ð'Ø¥5Ð(Ð(Ø#�O�O�OØð	øøøs   ‚ ‘AA3Á1A3c                 ó"  — t          | j        › d| j        › d�¦  «        }|                     d¦  «        }||                     d¦  «        dz   |…         }||dz   d…                              ¦   «         }i }||d<   |d	         |d
<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   	 |d         |d<   n$# t          $ r t          d¦  «         d	|d<   Y nw xY w|S )aY  Parse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        rs   r{   r\  ó   (r   r:   Nrw   r   ry  r_  rÍ   Úttynré   Úutimeé   Ústimeé   Úchildren_utimerÀ  Úchildren_stimeé   Úcreate_timeé$   Úcpu_numé'   Úblkio_ticksz&can't get blkio_ticks, set iowait to 0)r   r@  rN  r‘  rð  ra   Ú
IndexErrorr   )rA  rí  r]  rw   r�   r  s         rA   Ú_parse_stat_filezProcess._parse_stat_fileˆ  sU  € õ �tÔ(Ð:Ð:¨4¬8Ð:Ð:Ð:Ñ;Ô;ˆð �zŠz˜$ÑÔˆØ�D—I’I˜d‘O”O aÑ'¨$Ð.Ô/ˆØ�d˜Q‘h�j�jÔ!×'Ò'Ñ)Ô)ˆàˆØˆˆF‰Ø˜qœ	ˆˆH‰Ø˜Q”iˆˆF‰Ø˜a”yˆˆG‰Ø˜b”zˆˆG‰Ø˜b”zˆˆG‰Ø & r¤
ˆÐÑØ & r¤
ˆÐÑØ# BœZˆˆMÑØ œˆˆI‰ð	#Ø!'¨¤ˆC�ÑÐøÝð 	#ð 	#ð 	#åÐ:Ñ;Ô;Ð;Ø!"ˆC�ÑÐÐð	#øøøð
 ˆ
s   ÃC+ Ã+DÄDc                 óœ   — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «         cddd¦  «         S # 1 swxY w Y   dS )z�Read /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rs   r6  N)r   r@  rN  rú   ©rA  rŽ   s     rA   Ú_read_status_filezProcess._read_status_file¯  s”   € õ ˜DÔ-ÐAÐA°´ÐAÐAÐAÑBÔBð 	ÀaØ—6’6‘8”8ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s    AÁAÁAc                 óÀ   — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «                              ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )Nrs   r0   )r   r@  rN  rú   r�   r�  s     rA   Ú_read_smaps_filezProcess._read_smaps_file¹  sž   € õ ˜DÔ-Ð@Ð@°´Ð@Ð@Ð@ÑAÔAð 	$ÀQØ—6’6‘8”8—>’>Ñ#Ô#ð	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð 	$ð 	$s    &AÁAÁAc                 ó¢   — | j                              | ¦  «         | j                             | ¦  «         | j                             | ¦  «         d S rT  )r�  Úcache_activater�  r’  ru  s    rA   Úoneshot_enterzProcess.oneshot_enter¿  sM   € ØÔ×,Ò,¨TÑ2Ô2Ð2ØÔ×-Ò-¨dÑ3Ô3Ð3ØÔ×,Ò,¨TÑ2Ô2Ð2Ð2Ð2r@   c                 ó¢   — | j                              | ¦  «         | j                             | ¦  «         | j                             | ¦  «         d S rT  )r�  Úcache_deactivater�  r’  ru  s    rA   Úoneshot_exitzProcess.oneshot_exitÄ  sM   € ØÔ×.Ò.¨tÑ4Ô4Ð4ØÔ×/Ò/°Ñ5Ô5Ð5ØÔ×.Ò.¨tÑ4Ô4Ð4Ð4Ð4r@   c                 óP   — t          |                      ¦   «         d         ¦  «        S )Nrw   )r   r�  ru  s    rA   rw   zProcess.nameÉ  s#   € õ �d×+Ò+Ñ-Ô-¨fÔ5Ñ6Ô6Ð6r@   c                 óP   — |                       | j        › d| j        › d�d¬¦  «        S )Nrs   z/exer}  r  ©r{  r@  rN  ru  s    rA   ÚexezProcess.exeÎ  ó8   € à�~Š~ØÔ Ð1Ð1 4¤8Ð1Ð1Ð1¸Bð ñ 
ô 
ð 	
r@   c                 óÊ  — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   |s|                      ¦   «          g S |                     d¦  «        rdnd}|                     |¦  «        r
|d d…         }|                     |¦  «        }|dk    r,t          |¦  «        dk    rd|v r|                     d¦  «        }|S )Nrs   z/cmdlinerZ   rê   rF  r   )r   r@  rN  rú   rd  rb   ra   r‹   )rA  rŽ   rí  ÚsepÚcmdlines        rA   r   zProcess.cmdlineÔ  s'  € å˜$Ô+Ð@Ð@¨d¬hÐ@Ð@Ð@ÑAÔAð 	ÀQØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	àð 	à×!Ò!Ñ#Ô#Ð#ØˆIð Ÿš fÑ-Ô-Ð6ˆfˆf°3ˆØ�=Š=˜ÑÔð 	Ø˜˜˜”9ˆDØ—*’*˜S‘/”/ˆð �&Š=ˆ=�S ™\œ\¨QÒ.Ð.°3¸$°;°;Ø—j’j ‘o”oˆGØˆó    AÁAÁAc                 ó¶   — t          | j        › d| j        › d�¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   t	          |¦  «        S )Nrs   z/environ)r   r@  rN  rú   r   )rA  rŽ   rí  s      rA   ÚenvironzProcess.environî  s“   € å˜$Ô+Ð@Ð@¨d¬hÐ@Ð@Ð@ÑAÔAð 	ÀQØ—6’6‘8”8ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	å" 4Ñ(Ô(Ð(r¡  c                 óª   — t          |                      ¦   «         d         ¦  «        }t          j        ¦   «         }	 ||         S # t          $ r Y d S w xY w)Nr~  )rŸ   r�  r   Úget_terminal_maprš   )rA  Útty_nrr?  s      rA   ÚterminalzProcess.terminalô  s_   € å�T×*Ò*Ñ,Ô,¨WÔ5Ñ6Ô6ˆÝÔ(Ñ*Ô*ˆð	Ø˜”<ÐøÝð 	ð 	ð 	Ø�4�4ð	øøøs   ¼A Á
AÁAr/   ú/ioc           	      ó>  — | j         › d| j        › d�}i }t          |¦  «        5 }|D ]T}|                     ¦   «         }|r<	 |                     d¦  «        \  }}t          |¦  «        ||<   ŒD# t          $ r Y ŒPw xY wŒU	 d d d ¦  «         n# 1 swxY w Y   |s|› d�}t          |¦  «        ‚	 t          j	        |d         |d         |d         |d         |d	         |d
         ¦  «        S # t          $ r*}|j        d         ›d|› d|›�}t          |¦  «        d ‚d }~ww xY w)Nrs   r¨  s   : z file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )r@  rN  r   r�   ra   rŸ   rì   rp  rÂ   Úpiorš   r›   )	rA  Úfnamer�   rŽ   rª   rw   r  rÉ   r¨   s	            rA   Úio_counterszProcess.io_counters   sÐ  € àÔ(Ð8Ð8¨4¬8Ð8Ð8Ð8ˆEØˆFÝ˜UÑ#Ô#ð 6 qØð 
6ð 
6�DàŸ:š:™<œ<�DØð 6ð6Ø*.¯*ª*°UÑ*;Ô*;™K˜D %õ
 ,/¨u©:¬:˜F 4™L˜Løõ	  *ð %ð %ð %à$˜Hð%øøøð6ð
6ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð ð (ØÐ/Ð/Ð/�Ý" 3Ñ'Ô'Ð'ð0Ý”wØ˜8Ô$Ø˜8Ô$Ø˜=Ô)Ø˜>Ô*Ø˜8Ô$Ø˜8Ô$ñô ð øõ ð 0ð 0ð 0à”x ”{ð .ð .¸eð .ð .Ø#)ð.ð .ð õ ! ‘o”o¨4Ð/øøøøð0øøøsM   ¤B	Á A+ÁB	Á+
A8Á5B	Á7A8Á8B	Â	BÂBÂ+<C( Ã(
DÃ2%DÄDc                 ó|  — |                       ¦   «         }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          |d         ¦  «        t          z  }t          j        |||||¦  «        S )Nr€  r‚  r„  r…  r‹  )r�  rÛ   rÜ   rÂ   Ú	pcputimes)rA  r�   r€  r‚  r„  r…  r€   s          rA   rá   zProcess.cpu_times#  s¥   € à×&Ò&Ñ(Ô(ˆÝ�f˜W”oÑ&Ô&­Ñ4ˆÝ�f˜W”oÑ&Ô&­Ñ4ˆÝ˜vÐ&6Ô7Ñ8Ô8½;ÑFˆÝ˜vÐ&6Ô7Ñ8Ô8½;ÑFˆÝ�v˜mÔ,Ñ-Ô-µÑ;ˆÝŒ}Ø�5˜.¨.¸&ñ
ô 
ð 	
r@   c                 óP   — t          |                      ¦   «         d         ¦  «        S )zWhat CPU the process is on.r‰  ©rŸ   r�  ru  s    rA   r‰  zProcess.cpu_num/  s#   € õ �4×(Ò(Ñ*Ô*¨9Ô5Ñ6Ô6Ð6r@   Nc                 ó6   — t          j        | j        |¦  «        S rT  )r   Úwait_pidrN  )rA  Útimeouts     rA   ÚwaitzProcess.wait4  s   € åÔ  ¤¨7Ñ3Ô3Ð3r@   Fc                 ó¶   — | j         €4t          |                      ¦   «         d         ¦  «        t          z  | _         |r| j         S | j         t	          ¦   «         z   S )Nr‡  )rn  rÛ   r�  rÜ   rU  )rA  Ú	monotonics     rA   r‡  zProcess.create_time8  sY   € ð Œ;Ðå�d×+Ò+Ñ-Ô-¨mÔ<Ñ=Ô=ÅÑKð ŒKð ð 	Ø”;Ðð Œ{�Y™[œ[Ñ(Ð(r@   c           	      ó$  — t          | j        › d| j        › d�¦  «        5 }d„ |                     ¦   «                              ¦   «         d d…         D ¦   «         \  }}}}}}}d d d ¦  «         n# 1 swxY w Y   t          j        |||||||¦  «        S )Nrs   z/statmc              3   óD   K  — | ]}t          |¦  «        t          z  V — Œd S rT  )rŸ   r    rÝ   s     rA   ú	<genexpr>z&Process.memory_info.<locals>.<genexpr>W  s>   è è € ð 8ð 8Ø&'•�A‘”�Ñ!ð8ð 8ð 8ð 8ð 8ð 8r@   r|  )r   r@  rN  rŠ   ra   rÂ   Úpmem)	rA  rŽ   ÚvmsÚrssr³   ÚtextÚlibrí  Údirtys	            rA   Úmemory_infozProcess.memory_infoI  sâ   € õ ˜DÔ-Ð@Ð@°´Ð@Ð@Ð@ÑAÔAð 	ÀQð8ð 8Ø+,¯:ª:©<¬<×+=Ò+=Ñ+?Ô+?ÀÀÀÔ+Cð8ñ 8ô 8Ñ4ˆC��f˜d C¨¨uð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ Œx˜˜S &¨$°°T¸5ÑAÔAÐAs    AA-Á-A1Á4A1c                 ó  — dx}x}}t          | j        › d| j        › d�¦  «        5 }|D ]Ä}|                     d¦  «        r.|t	          |                     ¦   «         d         ¦  «        dz  z  }ŒE|                     d¦  «        r+t	          |                     ¦   «         d         ¦  «        dz  }Œ…|                     d¦  «        r*t	          |                     ¦   «         d         ¦  «        dz  }ŒÅ	 d d d ¦  «         n# 1 swxY w Y   |||fS )	Nr   rs   r1   s   Private_r   r°   ó   Pss:ó   Swap:)r   r@  rN  rž   rŸ   ra   )rA  ÚussÚpssÚswaprŽ   rª   s         rA   Ú_parse_smaps_rollupzProcess._parse_smaps_rollup^  sR  € ð  !Ð ˆCÐ �#˜ÝØÔ$Ð>Ð> t¤xÐ>Ð>Ð>ñô ð 
;àØð ;ð ;�DØ—’ {Ñ3Ô3ð ;à�s 4§:¢:¡<¤<°¤?Ñ3Ô3°dÑ:Ñ:˜˜ØŸš¨Ñ1Ô1ð ;Ý! $§*¢*¡,¤,¨q¤/Ñ2Ô2°TÑ9˜˜ØŸš¨Ñ2Ô2ð ;Ý" 4§:¢:¡<¤<°¤?Ñ3Ô3°dÑ:˜øð;ð
;ð 
;ð 
;ñ 
;ô 
;ð 
;ð 
;ð 
;ð 
;ð 
;ð 
;øøøð 
;ð 
;ð 
;ð 
;ð ˜˜dÐ#Ð#s   ¦CC;Ã;C?ÄC?s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 ó„  — |                       ¦   «         }t          t          t          |                     |¦  «        ¦  «        ¦  «        dz  }t          t          t          |                     |¦  «        ¦  «        ¦  «        dz  }t          t          t          |                     |¦  «        ¦  «        ¦  «        dz  }|||fS )Nr°   )r’  rû   r“  rŸ   Úfindall)rA  Ú_private_reÚ_pss_reÚ_swap_reÚ
smaps_datarÄ  rÅ  rÆ  s           rA   Ú_parse_smapszProcess._parse_smapsu  s    € ð* ×.Ò.Ñ0Ô0ˆJõ •c�#˜{×2Ò2°:Ñ>Ô>Ñ?Ô?Ñ@Ô@À4ÑGˆCÝ•c�#˜wŸš¨zÑ:Ô:Ñ;Ô;Ñ<Ô<¸tÑCˆCÝ•s�3 × 0Ò 0°Ñ <Ô <Ñ=Ô=Ñ>Ô>ÀÑEˆDØ˜˜dÐ#Ð#r@   c                 ó"  — t           rI	 |                      ¦   «         \  }}}nG# t          t          f$ r |                      ¦   «         \  }}}Y nw xY w|                      ¦   «         \  }}}|                      ¦   «         }t          j        ||||fz   Ž S rT  )ÚHAS_PROC_SMAPS_ROLLUPrÇ  rJ  rI  rÎ  rÀ  rÂ   Úpfullmem)rA  rÄ  rÅ  rÆ  Ú	basic_mems        rA   Úmemory_full_infozProcess.memory_full_info’  s§   € å$ð 5ð9Ø%)×%=Ò%=Ñ%?Ô%?‘N�C˜˜d˜døÝ*Õ,=Ð>ð 9ð 9ð 9Ø%)×%6Ò%6Ñ%8Ô%8‘N�C˜˜d˜d˜dð9øøøð "&×!2Ò!2Ñ!4Ô!4‘��S˜$Ø×(Ò(Ñ*Ô*ˆIÝ”< ¨c°3¸Ð-=Ñ!=Ð>Ð>s   ‰" ¢)AÁAc                 ó  — d„ }|                       ¦   «         }|s|                      ¦   «          g S |                     d¦  «        }g }|                     d¦  «        }|g} |||¦  «        D �] \  }}|                     dd¦  «        }	 |\  }	}
}}}}n# t          $ r |dgz   \  }	}
}}}}Y nw xY w|sd}nQt          |¦  «        }|                     ¦   «         }|                     d¦  «        rt          |¦  «        s
|dd	…         }t          |	¦  «        t          |
¦  «        || 	                    d
d¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    dd¦  «        f}| 
                    |¦  «         �Œ¢|S )aÔ  Return process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c              3   óØ  K  — i }| D ]Ê}|                      d d¦  «        }|d                              d¦  «        s.|                     ¦   «         |fV — |                     |¦  «         Œa	 t	          |d         ¦  «        dz  ||d         <   Œ„# t
          t          f$ r3 |d                              d¦  «        rY Œ²d|›�}t          |¦  «        d ‚w xY w|                     ¦   «         |fV — d S )Né   r   r  r   r°   s   VmFlags:z!don't know how to interpret line )ra   rb   ÚpoprŒ   rŸ   rì   rŒ  rž   )r”  Úcurrent_blockrí  rª   r�   rÉ   s         rA   Ú
get_blocksz'Process.memory_maps.<locals>.get_blocks­  s  è è € Ø�Ø!ð <ð <�DØ!ŸZšZ¨¨aÑ0Ô0�FØ! !œ9×-Ò-¨dÑ3Ô3ð <à,×0Ò0Ñ2Ô2°DÐ9Ð9Ð9Ð9Ø%×,Ò,¨TÑ2Ô2Ð2Ð2ð<Ý.1°&¸´)©n¬n¸tÑ.C˜D ¨¤™O˜OøÝ *­JÐ7ð <ð <ð <Ø% aœy×3Ò3°KÑ@Ô@ð )à ( Ø"NÀdÐ"NÐ"N˜CÝ",¨S¡/¤/°tÐ;ð<øøøð %×(Ò(Ñ*Ô*¨DÐ1Ð1Ð1Ð1Ð1Ð1s   Á)!BÂ,CÂ9Có   
r   NrÖ  r}  z[anon]r[   r\   s   Rss:s   Size:rÂ  s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:rÃ  )r’  rd  ra   r×  rì   r   r�   rb   r   r™   rŒ   )rA  rÙ  rí  r”  rü   Ú
first_linerØ  ÚheaderÚhfieldsre  ÚpermsÚ_offsetÚ_devÚ_inoderd   rO  s                   rA   Úmemory_mapszProcess.memory_maps£  s9  € ð2ð 2ð 2ð& ×(Ò(Ñ*Ô*ˆDð ð Ø×%Ò%Ñ'Ô'Ð'Ø�	Ø—J’J˜uÑ%Ô%ˆEØˆBØŸš 1™œˆJØ'˜LˆMØ * 
¨5°-Ñ @Ô @ð  ñ  ‘�˜Ø Ÿ,š, t¨QÑ/Ô/�ðNØ?FÑ<�D˜% ¨$°¸¸øÝ!ð Nð Nð NØ?FÈ"È¹~Ñ<�D˜% ¨$°¸¸¸ðNøøøàð *Ø#�D�Då! $™<œ<�DØŸ:š:™<œ<�DØ—}’} \Ñ2Ô2ð *Õ;MØñ<ô <ð *ð  $ D S Dœz˜å˜4‘L”LÝ˜5‘M”MØØ—H’H˜W aÑ(Ô(Ø—H’H˜X qÑ)Ô)Ø—H’H˜W aÑ(Ô(Ø—H’HÐ-¨qÑ1Ô1Ø—H’HÐ-¨qÑ1Ô1Ø—H’HÐ.°Ñ2Ô2Ø—H’HÐ.°Ñ2Ô2Ø—H’H˜^¨QÑ/Ô/Ø—H’H˜]¨AÑ.Ô.Ø—H’H˜X qÑ)Ô)ð�ð —	’	˜$‘”�‘ØˆIs   Â	BÂB,Â+B,c                 óP   — |                       | j        › d| j        › d�d¬¦  «        S )Nrs   z/cwdr}  r  r›  ru  s    rA   ÚcwdzProcess.cwdë  r�  r@   s   ctxt_switches:\t(\d+)c                 ó  — |                       ¦   «         }|                     |¦  «        }|s"d| j        › d| j        › d�}t	          |¦  «        ‚t          j        t          |d         ¦  «        t          |d         ¦  «        ¦  «        S )NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in rs   z1/status; the kernel is probably older than 2.6.23r   r   )r�  rÉ  r@  rN  r  rÂ   ÚpctxswrŸ   )rA  Ú	_ctxsw_rerí  ÚctxswrÉ   s        rA   Únum_ctx_switcheszProcess.num_ctx_switchesñ  s”   € ð ×%Ò%Ñ'Ô'ˆØ×!Ò! $Ñ'Ô'ˆØð 	+ð.àÔ%ð.ð .à(,¬ð.ð .ð .ð õ & cÑ*Ô*Ð*ÝŒz�#˜e Aœh™-œ-­¨U°1¬X©¬Ñ7Ô7Ð7r@   s   Threads:\t(\d+)c                 óz   — |                       ¦   «         }t          |                     |¦  «        d         ¦  «        S ©Nr   )r�  rŸ   rÉ  )rA  Ú_num_threads_rerí  s      rA   Únum_threadszProcess.num_threads  s6   € ð ×%Ò%Ñ'Ô'ˆÝ�?×*Ò*¨4Ñ0Ô0°Ô3Ñ4Ô4Ð4r@   c                 ó   — t          j        | j        › d| j        › d�¦  «        }|                     ¦   «          g }d}|D �]'}| j        › d| j        › d|› d�}	 t          |¦  «        5 }|                     ¦   «                              ¦   «         }d d d ¦  «         n# 1 swxY w Y   n# t          t          f$ r d}Y Œ|w xY w|| 
                    d¦  «        dz   d …         }|                     d	¦  «        }t          |d
         ¦  «        t          z  }	t          |d         ¦  «        t          z  }
t          j        t!          |¦  «        |	|
¦  «        }|                     |¦  «         �Œ)|r|                      ¦   «          |S )Nrs   z/taskFz/task/r{   Tr\  r:   rÌ   r  r�  )r_   rH  r@  rN  r  r   rú   r�   rI  rJ  rð  ra   rÛ   rÜ   rÂ   ÚpthreadrŸ   rŒ   rw  )rA  Ú
thread_idsr   Ú
hit_enoentÚ	thread_idr«  rŽ   Ústr�   r€  r‚  r  s               rA   ÚthreadszProcess.threads  sÆ  € å”Z 4Ô#4Ð FÐ F°t´xÐ FÐ FÐ FÑGÔGˆ
Ø�ŠÑÔÐØˆØˆ
Ø#ð 	#ñ 	#ˆIØÔ(ÐKÐK¨4¬8ÐKÐK¸9ÐKÐKÐKˆEðÝ  Ñ'Ô'ð *¨1ØŸš™œŸšÑ)Ô)�Bð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *øøå%Õ'9Ð:ð ð ð ð "�
Ø�ð	øøøð �B—G’G˜D‘M”M AÑ%Ð'Ð'Ô(ˆBØ—X’X˜d‘^”^ˆFÝ˜& œ*Ñ%Ô%­Ñ3ˆEÝ˜& œ*Ñ%Ô%­Ñ3ˆEÝ”[¥ Y¡¤°¸Ñ>Ô>ˆFØ�NŠN˜6Ñ"Ô"Ð"Ñ"Øð 	'Ø×$Ò$Ñ&Ô&Ð&Øˆs6   ÁB&Á''BÂB&ÂB	ÂB&Â!B	Â"B&Â&B<Â;B<c                 ó4   — t          j        | j        ¦  «        S rT  )rÏ   Úproc_priority_getrN  ru  s    rA   Únice_getzProcess.nice_get"  s   € õ Ô% d¤hÑ/Ô/Ð/r@   c                 ó6   — t          j        | j        |¦  «        S rT  )rÏ   Úproc_priority_setrN  )rA  r  s     rA   Únice_setzProcess.nice_set+  s   € åÔ% d¤h°Ñ6Ô6Ð6r@   c                 ó4   — t          j        | j        ¦  «        S rT  )rÏ   r3   rN  ru  s    rA   Úcpu_affinity_getzProcess.cpu_affinity_get2  s   € åÔ-¨d¬hÑ7Ô7Ð7r@   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      óf  — |                       ¦   «         }|                     |¦  «        }|rRt          t          t	          |d         d         ¦  «        t	          |d         d         ¦  «        dz   ¦  «        ¦  «        S t          t          t          t          ¦   «         ¦  «        ¦  «        ¦  «        S )Nr   r   )r�  rÉ  rG  ÚrangerŸ   r‹   ræ   )rA  Ú_rerí  rð   s       rA   Ú_get_eligible_cpuszProcess._get_eligible_cpus6  s�   € ð ×)Ò)Ñ+Ô+ˆDØ—K’K Ñ%Ô%ˆEØð 9Ý�E¥# e¨A¤h¨q¤kÑ"2Ô"2µC¸¸a¼À¼Ñ4DÔ4DÀqÑ4HÑIÔIÑJÔJÐJå�E¥#¥m¡o¤oÑ"6Ô"6Ñ7Ô7Ñ8Ô8Ð8r@   c           	      óÐ  — 	 t          j        | j        |¦  «         d S # t          t          f$ r¶}t          |t          ¦  «        s|j        t          j        k    r†|                      ¦   «         }t          t          t          t          ¦   «         ¦  «        ¦  «        ¦  «        }|D ]:}||vrd|›d|›�}t	          |¦  «        d ‚||vrd|› d|› �}t	          |¦  «        |‚Œ;‚ d }~ww xY w)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )rÏ   Úproc_cpu_affinity_setrN  rœ   rì   r]   rK  rL  r   Útuplerþ  r‹   ræ   )rA  rä   r¨   Úeligible_cpusÚall_cpusÚcpurÉ   s          rA   Úcpu_affinity_setzProcess.cpu_affinity_setA  s-  € ðÝÔ*¨4¬8°TÑ:Ô:Ð:Ð:Ð:øÝ�ZÐ(ð ð ð Ý˜c¥:Ñ.Ô.ð ;°#´)½u¼|Ò2KÐ2KØ$(×$;Ò$;Ñ$=Ô$=�MÝ$¥U­3­}©¬Ñ+?Ô+?Ñ%@Ô%@ÑAÔA�HØ#ð ;ð ;˜Ø hÐ.Ð.ð!6¨sð !6ð !6Ø$1ð!6ð !6ð  õ #-¨S¡/¤/°tÐ;Ø mÐ3Ð3ð!<¨cð !<ð !<Ø,9ð!<ð !<ð  õ #-¨S¡/¤/°sÐ:ð 4ð øøøøð#øøøs   ‚ žC%¯B1C Ã C%c                 ó‚   — t          j        | j        ¦  «        \  }}t          |¦  «        }t	          j        ||¦  «        S rT  )rÏ   r2   rN  r9   rÂ   Úpionice)rA  Úioclassr  s      rA   Ú
ionice_getzProcess.ionice_get[  s7   € å!Ô1°$´(Ñ;Ô;‰NˆG�UÝ  Ñ)Ô)ˆGÝ”;˜w¨Ñ.Ô.Ð.r@   c                 óÚ   — |€d}|r.|t           j        t           j        hv r|›d�}t          |¦  «        ‚|dk     s|dk    rd}t          |¦  «        ‚t	          j        | j        ||¦  «        S )Nr   z ioclass accepts no valuer|  zvalue not in 0-7 range)r9   r#   r    rì   rÏ   Úproc_ioprio_setrN  )rA  r
  r  rÉ   s       rA   Ú
ionice_setzProcess.ionice_seta  s†   € àˆ}Ø�Øð &˜ÝÔ,ÝÔ,ð%ð ð ð !Ð=Ð=Ð=�Ý  ‘o”oÐ%Ø�qŠyˆy˜E AšI˜IØ.�Ý  ‘o”oÐ%ÝÔ'¨¬°'¸5ÑAÔAÐAr@   Úprlimitc                 ót  — | j         dk    rd}t          |¦  «        ‚	 |€t          j        | j         |¦  «        S t	          |¦  «        dk    rd|›�}t          |¦  «        ‚t          j        | j         ||¦  «         d S # t
          $ r/}|j        t          j        k    r|                      ¦   «          ‚ d }~ww xY w)Nr   z)can't use prlimit() against PID 0 processr:   z2second argument must be a (soft, hard) tuple, got )	rN  rì   Úresourcer  r‹   rœ   rK  ÚENOSYSrd  )rA  Ú	resource_ÚlimitsrÉ   r¨   s        rA   ÚrlimitzProcess.rlimitr  sÙ   € ð
 Œx˜1Š}ˆ}ØA�Ý  ‘o”oÐ%ðØ�>å#Ô+¨D¬H°iÑ@Ô@Ð@õ ˜6‘{”{ aÒ'Ð'ð5Ø*0ð5ð 5ð õ )¨™oœoÐ-ÝÔ$ T¤X¨y¸&ÑAÔAÐAÐAÐAøÝð ð ð Ø”9¥¤Ò,Ð,ð ×)Ò)Ñ+Ô+Ð+Øøøøøðøøøs   žA> ºAA> Á>
B7Â*B2Â2B7c                 ó”   — |                       ¦   «         d         }|                     ¦   «         }t                               |d¦  «        S )Nry  ú?)r�  r   ÚPROC_STATUSESr™   )rA  Úletters     rA   ry  zProcess.statusŽ  s;   € à×&Ò&Ñ(Ô(¨Ô2ˆØ—’‘”ˆå× Ò  ¨Ñ-Ô-Ð-r@   c                 ó@  — g }t          j        | j        › d| j        › d�¦  «        }d}|D �]Û}| j        › d| j        › d|› �}	 t	          |¦  «        }|                     d¦  «        �r1t          |¦  «        �r!| j        › d| j        › d|› �}	 t          |¦  «        5 }t          | 	                    ¦   «          
                    ¦   «         d         ¦  «        }t          | 	                    ¦   «          
                    ¦   «         d         d¦  «        }	d d d ¦  «         n# 1 swxY w Y   t          |	¦  «        }
t          j        |t          |¦  «        t          |¦  «        |
|	¦  «        }|                     |¦  «         �ŒT# t          t           f$ r d}Y �Œjw xY w�Œp# t          t           f$ r d}Y �Œ†t"          $ rK}|j        t$          j        k    rY d }~�Œª|j        t$          j        k    rt+          |¦  «         Y d }~�ŒÔ‚ d }~ww xY w|r|                      ¦   «          |S )	Nrs   rD  FrE  z/fdinfo/r   rƒ   T)r_   rH  r@  rN  r`   rž   r   r   rŸ   rŠ   ra   rq   rÂ   Ú	popenfilerŒ   rI  rJ  rœ   rK  rL  rM  r   rw  )rA  r   rÔ  rñ  rP  rs  rd   rŽ   Úposrn   rp   r  r¨   s                rA   Ú
open_fileszProcess.open_files•  sœ  € àˆÝ”
˜dÔ/Ð?Ð?°$´(Ð?Ð?Ð?Ñ@Ô@ˆØˆ
Øð &	/ñ &	/ˆBØÔ'Ð<Ð<¨$¬(Ð<Ð<¸Ð<Ð<ˆDð$/Ý ‘~”~�ð& —?’? 3Ñ'Ô'ñ /­M¸$Ñ,?Ô,?ñ /à"Ô/ÐHÐH°$´(ÐHÐHÀBÐHÐH�Dð/Ý(¨Ñ.Ô.ð D°!Ý"% a§j¢j¡l¤l×&8Ò&8Ñ&:Ô&:¸1Ô&=Ñ">Ô">˜CÝ$'¨¯
ª
©¬×(:Ò(:Ñ(<Ô(<¸QÔ(?ÀÑ$CÔ$C˜EðDð Dð Dñ Dô Dð Dð Dð Dð Dð Dð Døøøð Dð Dð Dð Dõ  2°%Ñ8Ô8˜Ý!$¤Ø ¥# b¡'¤'­3¨s©8¬8°T¸5ñ"ô "˜ð  Ÿš vÑ.Ô.Ð.Ñ.øõ .Õ/AÐBð *ð *ð *ð &*˜
˜
™
ð*øøøùøõ3 &Õ'9Ð:ð ð ð à!�
Ø‘Ýð ð ð Ø”9¥¤Ò,Ð,à�H�H�H‘HØ”9¥Ô 2Ò2Ð2å˜#‘J”J�JØ�H�H�H‘HØøøøøðøøøð> ð 	'Ø×$Ò$Ñ&Ô&Ð&Øˆsa   ÁFÂE?ÂA4DÄE?ÄD 	Ä E?Ä#D 	Ä$E?Å?FÆFÆHÆ1	HÆ:H Ç$H Ç?H È Hr6  c                 ón   — t                                || j        ¦  «        }|                      ¦   «          |S rT  )r�  r‰  rN  rw  )rA  r…  r  s      rA   rŽ  zProcess.net_connectionsÅ  s0   € å×'Ò'¨¨d¬hÑ7Ô7ˆØ× Ò Ñ"Ô"Ð"Øˆ
r@   c                 ód   — t          t          j        | j        › d| j        › d�¦  «        ¦  «        S )Nrs   rD  )r‹   r_   rH  r@  rN  ru  s    rA   Únum_fdszProcess.num_fdsË  s0   € å•2”: Ô!2ÐBÐB°T´XÐBÐBÐBÑCÔCÑDÔDÐDr@   c                 óP   — t          |                      ¦   «         d         ¦  «        S )Nr_  r°  ru  s    rA   r_  zProcess.ppidÏ  s!   € å�4×(Ò(Ñ*Ô*¨6Ô2Ñ3Ô3Ð3r@   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                 óâ   — |                       ¦   «         }|                     |¦  «        d         \  }}}t          j        t	          |¦  «        t	          |¦  «        t	          |¦  «        ¦  «        S rë  )r�  rÉ  rÂ   ÚpuidsrŸ   )rA  Ú_uids_rerí  ÚrealÚ	effectiveÚsaveds         rA   ÚuidszProcess.uidsÓ  óX   € à×%Ò%Ñ'Ô'ˆØ!)×!1Ò!1°$Ñ!7Ô!7¸Ô!:Ñˆˆi˜ÝŒy�˜T™œ¥C¨	¡N¤NµC¸±J´JÑ?Ô?Ð?r@   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                 óâ   — |                       ¦   «         }|                     |¦  «        d         \  }}}t          j        t	          |¦  «        t	          |¦  «        t	          |¦  «        ¦  «        S rë  )r�  rÉ  rÂ   ÚpgidsrŸ   )rA  Ú_gids_rerí  r%  r&  r'  s         rA   ÚgidszProcess.gidsÙ  r)  r@   rT  ©F©r6  )@r<   r=   r>   rŠ  rñ  rB  rs  rd  rw  rz  r{  rj  r   r�  r�  r’  r•  r˜  rw   rœ  r   r£  r§  r_   rd   ro  Úgetpidr¬  rá   r‰  r´  r‡  rÀ  rÐ  ÚHAS_PROC_SMAPSrÇ  rî   rï   rÎ  rÓ  râ  rä  ré  rí  rô  r÷  rú  ÚHAS_CPU_AFFINITYrü  r   r  ÚHAS_PROC_IO_PRIORITYr  r  Úhasattrr  r  ry  r  rŽ  r   r_  r(  r-  r?   r@   rA   rl  rl  K  s×  € € € € € Ø'Ð'ðð ð €Ið.ð .ð .ð"ð "ð "ð Bð Bð Bð3ð 3ð 3ð (-ð ð ð ð ð  Øð#ð #ñ Ôñ „_ð#ðJ Øðð ñ Ôñ „_ðð Øð$ð $ñ Ôñ „_ð$ð3ð 3ð 3ð
5ð 5ð 5ð
 ð7ð 7ñ „_ð7ð ð
ð 
ñ „_ð
ð
 ðð ñ „_ðð2 ð)ð )ñ „_ð)ð
 ðð ñ „_ðð 
„w‡~‚~Ð/˜y˜rœy™{œ{Ð/Ð/Ð/Ñ0Ô0ð #0à	ð 	0ð  	0ñ 
Œð 	0ðD ð	
ð 	
ñ „_ð	
ð ð7ð 7ñ „_ð7ð ð4ð 4ð 4ñ „_ð4ð ð)ð )ð )ñ „_ð)ð  ðBð Bñ „_ðBð$ ð C' ð C'ð	$ð 	$ð 	$ð. 
ð #˜œ
Ð#;Ñ<Ô<Ø�B”JÐ2Ñ3Ô3Ø�R”ZÐ 4Ñ5Ô5ð	$ð 	$ð 	$ñ 
Œð	$ð8 
ð		?ð 		?ñ 
Œð		?ð 		?ð 'Ðàð Hà	ðE	ð E	ñ 
ŒðE	ðN ð
ð 
ñ „_ð
ð
 à"˜œ
Ð#<Ñ=Ô=ð8ð 8ð 8ñ „_ð8ð Ø*4¨"¬*Ð5HÑ*IÔ*Ið 5ð 5ð 5ñ „_ð5ð
 ðð ñ „_ðð4 ð0ð 0ñ „_ð0ð ð7ð 7ñ „_ð7ð ð &à	ð	8ð 	8ñ 
Œð	8ð !�b”jÐ!DÑEÔEð		9ð 		9ð 		9ð 		9ð 
ð	ð 	ñ 
Œð	ð. ð Bà	ð	/ð 	/ñ 
Œð	/ð
 
ð	Bð 	Bñ 
Œð	Bð €wˆx˜Ñ#Ô#ð à	ð	ð 	ð 	ñ 
Œð	ð6 ð.ð .ñ „_ð.ð ð-ð -ñ „_ð-ð^ ðð ð ñ „_ðð
 ðEð Eñ „_ðEð ð4ð 4ñ „_ð4ð Ø&˜BœJÐ'DÑEÔEð @ð @ð @ñ „_ð@ð
 Ø&˜BœJÐ'DÑEÔEð @ð @ð @ñ „_ð@ð @ð @r@   rl  r/  r.  )ˆrŠ  r`  r  ÚenumrK  rh  rø   r_   rî   r  r9  rb  Úsysr¿   r   r   r}  r   r   rÂ   r   r	   rÏ   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__extra__all__r<  rd   ro  r0  r1  rÐ  r4  r3  r2  rë   rÜ   Úgetpagesizer    Ú	byteorderr^  r;  rz  rÖ  ÚIntEnumrŸ   Ú	AF_PACKETr6   r7   r9   ÚglobalsrV  Ú__members__ÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_DISK_SLEEPÚSTATUS_STOPPEDÚSTATUS_TRACING_STOPÚSTATUS_ZOMBIEÚSTATUS_DEADÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_IDLEÚSTATUS_PARKEDr  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rq  r`   rq   ry   r’   r‰   Ú	Exceptionr¨   r­   rÊ   rÖ   r×   Ú	heap_trimrá   ræ   ró   r  r  r  r&  Únet_if_addrsr*  r,  r�  rŽ  r§  r»  Ú
disk_usagerÙ  rÛ  rû  r*  r.  rJ  rL  rU  rU  rY  r`  rj  rl  r?   r@   rA   ú<module>rM     s1  ðð
 %Ð $à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø $Ð $Ð $Ð $Ð $Ð $Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø !Ð !Ð !Ð !Ð !Ð !Ø "Ð "Ð "Ð "Ð "Ð "Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø "Ð "Ð "Ð "Ð "Ð "ð	ð 	ð 	€ð$ .Ð Ø”—’Ð <¨¨¬©¬Ð <Ð <Ð <Ñ=Ô=€ØœŸšÐ'J°	°´	±´Ð'JÐ'JÐ'JÑKÔKÐ Ø�w˜tÐ%6Ñ7Ô7Ð Ø�7˜4Ð!8Ñ9Ô9Ð ð ˆbŒj˜Ñ&Ô&€Øˆ4ÔÑÔ€Ø” Ò)€Øˆ‰Œ€ð Ð à�”Ø�i   VÔ%5Ñ!6Ô!6Ð7ñô €ð Ô
€ðð ð ð ð �”ñ ô ð ð €�	„	× Ò �Ô'Ñ (Ô (Ð (ð 
Ô	Ø	Ô	 Ø	Ô	"Ø	Ô	Ø	Ô	$Ø	Ô	Ø	Ô	Ø	Ô	Ø	Ô	!Ø	Ô	Ø	Ô	Ø	Ô	ðð €ð" Ô
"Ø
Ô
Ø
Ô
Ø
Ô
 Ø
Ô
 Ø
Ô
 Ø
Ô
Ø
Ô
!Ø
Ô
Ø
Ô
Ø
Ô
ðð €ð(ð ð ð(
ð 
ð 
ð$ð $ð $ð& 	ð+ð +ñ 	„ð+ð0OØ%Ð% gÑ.Ô.€C„M€MøØð Oð Oð Oà	€EÐ
2¨3Ð
2Ð
2Ñ3Ô3Ð3Ø?�J�J˜{Ð,>Ñ?Ô?ÀÀSÈ#ÑNÔN€C„M€M€M€M€M€MøøøøðOøøøð ŒM€	ð<ð <ð <ð~~ð ~ð ~ðB4<ð 4<ð 4<ðp €7ˆ4�ÑÔð Ø”€IØ”€Ið"ð "ð "ðð ð ð&ð ð ð:'ð 'ð 'ðTNð Nð Nð.
ð 
ð 
ð „7‡>‚>Ð;Ñ<Ô<ð /LÀÄÇÂØ*ñAô Að /Lð#ð #ð #ð #ðNLð Lð Lð Ô €ð	ð 	ð 	ð 	ð 	˜Iñ 	ô 	ð 	ðið ið ið ið iñ iô ið iðX "�>Ñ#Ô#Ð ð+ð +ð +ð +ð
,ð ,ð ,ð^ð ð ðB Ô €
ðfð fð fð fðRHð Hð Hð Hð Hñ Hô Hð HðV$ð $ð $ð $ðXsð sð sðlð ð ð>W:ð W:ð W:ð~ð ð ð ð  ð  ð =ð =ð =ð!ð !ð !ðBð ð ð,ð ð ð6R
@ð R
@ð R
@ð R
@ð R
@ñ R
@ô R
@ð R
@ð R
@ð R
@s   ÊJ ÊKÊ*K
Ë
K