ó
    …~i3K ã                   ó¦  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSKJ!r!  SSKJ"r"  SSKJ#r#  SSKJ$r$  SSKJ%r%  SSKJ&r&  SSKJ'r'  SSKJ(r(  SSKJ)r)  SSKJ*r*  SSKJ+r+  / SQr,S r-\R\                  R_                  S!\R`                  " 5        S"35      r1\R\                  R_                  S!\R`                  " 5        S#35      r2\3" \S$5      r4\3" \S%5      r5\Rl                  " S&5      r7\Rp                  " 5       r9\Rt                  S':H  r;\<" 5       r=S(r>\R~                  " S)S*\@" \
R‚                  5      05      rB\BR†                  rC " S+ S,\R~                  5      rD\E" 5       R�                  \DRŽ                  5        \R�                  \R’                  \R”                  \R–                  \R˜                  \Rš                  \Rœ                  \Rœ                  \Rž                  \R                   \R¢                  \R¤                  S-.rS\R¨                  \Rª                  \R¬                  \R®                  \R°                  \R²                  \R´                  \R¶                  \R¸                  \Rº                  \R¼                  S..r_S/ r`S0 raS1 rb\$S2 5       rc \c" S35      \ld        \RÈ                  rdS8 rgS9 rhS: ri\3" \S;5      (       a  \RÔ                  rj\RÖ                  rkS< rlS= rmS> rnS? roS@ rpSA rq\R\                  R_                  SB5      (       d   \R\                  R_                  SC5      (       a  SD rrOSE rr\Ræ                  rs " SF SG\e5      rt " SH SI5      ru\u" 5       rvS\SJ jrwSK rxSL ry\Rô                  rzS]SM jr{ " SN SO5      r|S]SP jr}SQ r~SR rSS r€ST r�SU r‚SV rƒSW r„SX r…SY r† " SZ S[5      r‡g! \e a-  rf\ " S4\f< 35        \" S5S65      " S7S7S75      \ld         SrfCfGN;SrfCfff = f)^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                   ó$   • \ rS rSrSrSrSrSrSrg)Ú
IOPriorityéd   r   r   é   é   © N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r    r!   r"   r#   Ú__static_attributes__r=   ó    ÚL/home/mande/repo/quber/.venv/lib/python3.13/site-packages/psutil/_pslinux.pyr9   r9   d   s   † ØÐØ€OØ€OØÓrC   r9   )ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP)Ú01Ú02Ú03Ú04Ú05Ú06Ú07Ú08Ú09Ú0AÚ0Bc                 óè   • [        U [        5      (       d   U 5       e[        R                  " U 5      n U R	                  S5      S   n U R                  S5      (       a  [        U 5      (       d  U SS n U $ )zWrapper around os.readlink().Ú r   ú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr   )Úpaths    rD   rc   rc   •   si   € ä�dœC× Ñ Ð& $Ó&Ð Ü�;Š;�tÓ€Dð �:‰:�fÓ˜aÑ €Dð ‡}�}�\×"Ñ"Ô+=¸d×+CÑ+CØ�D�SˆzˆØ€KrC   c                 óR  • [         R                  S[         R                  S[         R                  S0nX[         R                  [         R                  -  [         R                  -  -     nU [         R                  -  (       a  UR                  SSS5      nUR                  SS5      nU$ )zRConvert file's open() flags into a readable string.
Used by Process.open_files().
ÚrÚwzw+Úar   zr+)rb   ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)ÚflagsÚ	modes_mapÚmodes      rD   Úfile_flags_to_moders   ©   sx   € ô —‘˜c¤2§;¡;°´R·Y±YÀÐE€IØœbŸk™k¬B¯K©KÑ7¼"¿)¹)ÑCÑDÑE€DØŒr�{‰{×Ø�|‰|˜C  aÓ(ˆØ�<‰<˜˜dÓ#€Dà€KrC   c                 óš   • U R                  SS5      n SnU(       a  SU  3nOSU  S3n[        R                  " U[        R                  5      $ )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)ro   rb   ÚaccessÚF_OK)ÚnameÚincluding_virtualrf   s      rD   Úis_storage_devicer{   ¶   sL   € ð �<‰<˜˜SÓ!€DØÐÞØ˜T˜FÐ#‰à˜T˜F 'Ð*ˆÜ�9Š9�Tœ2Ÿ7™7Ó#Ð#rC   c                 óT  • [        U  S35       nUR                  5       R                  5       SS nSSS5        / SQn[        W5      nUS:¼  a  UR	                  S5        US:¼  a  UR	                  S5        US	:¼  a  UR	                  S
5        [        SU5      $ ! , (       d  f       Nn= f)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   Úreadlinerd   ÚlenÚappendr   )Úprocfs_pathÚfÚvaluesÚfieldsÚvlens        rD   Ú_scputimes_ntupler”   É   s’   € ô 
˜�} EÐ*Ô	+¨qØ—‘“×#Ñ#Ó% a bÐ)ˆ÷ 
,âK€FÜˆv‹;€DØˆqƒyà�‰�gÔØˆqƒyà�‰�gÔØˆrƒzà�‰�lÔ#Ü�k 6Ó*Ð*÷ 
,Õ	+ús   �"BÂ
B'ú/proczignoring exception on import: r‹   zuser system idleç        c                 óv  • U S   nXR                  SS5      -   n U S   nU S   nU S   n [	        [        5        S	35      nSnU   U HJ  n	U	R                  5       n	U	R                  S
5      (       d  M+  U[        U	R                  5       S   5      -  nML     SSS5        U[        -  nX-
  n
X4-   nU[        US-  U5      -  nX«-  n
X¥[        US-  U5      -
  -  n
[        U
5      $ ! [         a'  n[        UR                  S    S35        Us SnA$ SnAff = f! [         a    Us $ f = f! , (       d  f       Nš= f)a9  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Úintrd   ÚPAGESIZEÚmin)ÚmemsÚfreeÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrr�   Úwatermark_lowÚlineÚavailÚ	pagecaches               rD   Úcalculate_avail_vmemr¯   ó   sa  € ð< �Ñ€DØ—h‘h˜z¨1Ó-Ñ-€Hð	ØÐ/Ñ0ˆØ Ð!3Ñ4ÐØÐ 0Ñ1ÐðÜœ?Ó,Ð-¨YÐ7Ó8ˆð €MÚ	
ÛˆDØ—:‘:“<ˆDØ�‰˜v×&Ó&Ø¤ T§Z¡Z£\°!¡_Ó!5Ñ5’ñ ÷ 
ð
 ”XÑ€MàÑ €EØÑ3€IØ”�Y ‘] MÓ2Ñ2€IØ	Ñ€EØ	¤Ð$4°sÑ$:¸MÓ JÑJÑJ€EÜˆu‹:Ðøô1 ó ÜØ�x‰x˜‰{ˆmð >ð >ô	
ð �ûðûô ó ØŠðú÷ 
�ús@   ›C$ «D Á*D*Á3#D*Ã$
DÃ.DÄ
DÄDÄD'Ä&D'Ä*
D8c                  ó  • / n 0 n[        [        5        S35       nU H)  nUR                  5       n[        US   5      S-  XS   '   M+     SSS5        US   nUS   n US   n US
   nX�R                  SS5      -  n US   n	 US   n
 US   n US   n US   nUS:X  a  [        U5      nUS:  a  SnU R                  S5        OXÕ:”  a  UnX]-
  n[        X]-
  USS9nU (       aL  SR                  SR                  U 5      [        U 5      S:X  a  SOS5      n[        R                  " U[        SS 9  [        R                   " UUUUUU
UUUU	U5      $ ! , (       d  f       GN= f! [         a    SnU R                  S	5         GN f = f! [         a    SnU R                  S5         GN*f = f! [         a/     US   n	 GN;! [         a    Sn	U R                  S5          GN\f = ff = f! [         a    Sn
U R                  S5         GN~f = f! [         a;     US   US   -   US   -   n GN›! [         a    SnU R                  S5          GN¼f = ff = f! [         a    Sn GNÍf = f! [         a    [        U5      n GNÒf = f)!a  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   rd   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                    rD   Úvirtual_memoryrÌ   2  sû  € ð €NØ€DÜ	œÓ)Ð*¨(Ð3Ô	4¸ÛˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD˜‘‹Oñ ÷ 
5ð �Ñ€EØ�Ñ€Dð)Ø�{Ñ#ˆð
0Ø�jÑ!ˆð 	—(‘(Ð+¨QÓ/Ñ/ˆð,Ø�i‘ˆð(Ø�jÑ!ˆð
.Ø˜Ñ%ˆðØ�H‰~ˆð
/ØÐ%Ñ&ˆð �A‹:ô
 )¨Ó.ˆEàˆqƒyØˆØ×Ñ˜kÕ*Ø	‹ð ˆà‰=€Dä˜U™]¨U¸1Ñ=€Gö ØF×MÑMØ�I‰I�nÓ%Ü˜Ó(¨AÓ-‰E°6ó
ˆô 	�Š�cœ>°aÒ8ä�9Š9ØØØØØØØØØØØóð ÷Q 
5Ö	4ûô ó )àˆØ×Ñ˜i×(ð)ûô ó (ØˆØ×Ñ˜h×'ð(ûô ó ,ð	,Ø˜-Ñ(‹FøÜó 	,ØˆFØ×!Ñ! (×+Ð+ð	,úð,ûô ó (ØˆØ×Ñ˜h×'ð(ûô ó 	.ð	.à�_Ñ%Ø�Ñ'ñ(àÐ(Ñ)ñ*ó øô
 ó 	.ØˆHØ×!Ñ! *×-Ð-ð	.úð	.ûô ó Ø‹ðûô ó +Ü$ TÓ*‹ð+ús¹   ›0EÁE# Á$F Á>F+ ÂG' Â
H ÂI ÂI& Å
E Å#FÆFÆF(Æ'F(Æ+
G$Æ6F>Æ>G ÇG$ÇG Ç G$Ç'HÈHÈ
IÈH*È*IÉIÉIÉIÉI#É"I#É&I?É>I?c                  óÆ  • 0 n [        [        5        S35       nU H)  nUR                  5       n[        US   5      S-  XS   '   M+     SSS5         U S   nU S   nXE-
  n[        X„SS9n	 [        [        5        S	35      nU   S=p«U H€  nUR                  S
5      (       a$  [        UR                  S5      S   5      S-  S-  n
O9UR                  S5      (       a#  [        UR                  S5      S   5      S-  S-  nU
c  M{  Uc  M€    O&   SnUS-  n[        R                  " U[        SS9  S=p«SSS5        [        R                  " XHXYW
W5      $ ! , (       d  f       GN= f! [         a'    [
        R                  " 5       u        pdpWXG-  nXW-  n GN8f = f! , (       d  f       Nm= f! [         a-  nSU S3n[        R                  " U[        SS9  S=p« SnAN¢SnAff = f)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   rd   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                 rD   Úswap_memoryrØ   ³  sñ  € à€DÜ	œÓ)Ð*¨(Ð3Ô	4¸ÛˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD˜‘‹Oñ ÷ 
5ð Ø�]Ñ#ˆØ�LÑ!ˆð ‰<€DÜ˜D°Ñ2€GðÜœ?Ó,Ð-¨WÐ5Ó6ˆò ØÐˆCÛ�ð —?‘? 9×-Ñ-Ü˜dŸj™j¨Ó.¨qÑ1Ó2°QÑ6¸Ñ=‘CØ—_‘_ Z×0Ñ0Ü˜tŸz™z¨$Ó/°Ñ2Ó3°aÑ7¸$Ñ>�DØ“? tÓ'7Ùñ ð E�ØÐ8Ñ8�Ü—’˜c¤>¸aÒ@Ø��÷% ô& �9Š9�U $°°dÓ;Ð;÷c 
5Ö	4ûô ó  Ü37×3EÒ3EÓ3GÑ0ˆˆ1ˆa�˜4ØÑ ˆØÑ‹ð ú÷& �Qûô ó ð0Ø03¨u°Að7ð 	ô 	�Š�cœ>°aÒ8ØˆˆŒdûðúsN   ™0EÁ
E$ Á+F) ÂA=FÄFÄ	(FÅ
E!Å$-FÆFÆ
F&Æ)
G Æ3#GÇG Ú	heap_infoc                  óh  • [        5       n [        U  S35       nUR                  5       R                  5       nSSS5        WS[	        [
        R                  R                  5      S-    nU Vs/ s H  n[        U5      [        -  PM     nn[
        R                  " U6 $ ! , (       d  f       Nl= fs  snf )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   )
r   r   rŒ   rd   r�   rÄ   r‹   Ú_fieldsÚfloatÚCLOCK_TICKS)r�   r�   r‘   r’   rL   s        rD   Ú	cpu_timesrÞ   õ  s�   € ô "Ó#€KÜ	˜�} EÐ*Ô	+¨qØ—‘“×#Ñ#Ó%ˆ÷ 
,à�AœœCŸM™M×1Ñ1Ó2°QÑ6Ð7€FÙ.4Ó5ªf¨Œe�A‹hœÔ$©f€FÐ5Ü�=Š=˜&Ð!Ð!÷	 
,Õ	+üò 6s   ™BÁ-B/Â
B,c                  óÚ  • [        5       n / n[        U  S35       nUR                  5         U Hš  nUR                  S5      (       d  M  UR	                  5       nUS[        [        R                  R                  5      S-    nU Vs/ s H  n[        U5      [        -  PM     nn[        R                  " U6 nUR                  U5        Mœ     UsSSS5        $ s  snf ! , (       d  f       g= f)z^Return a list of namedtuple representing the CPU times
for every CPU available on the system.
r}   s   cpur   N)r   r   rŒ   r    rd   r�   rÄ   r‹   rÛ   rÜ   rÝ   rŽ   )r�   Úcpusr�   r¬   r‘   r’   rL   Úentrys           rD   Úper_cpu_timesrâ     sÂ   € ô "Ó#€KØ€DÜ	˜�} EÐ*Ô	+¨qà	�
‰
ŒÛˆDØ�‰˜v×&Ó&ØŸ™›�Ø ¤C¬¯©×(=Ñ(=Ó$>ÀÑ$BÐC�Ù:@ÓAº&°Qœ% ›(¤[Ô0¹&�ÐAÜŸš vÐ.�Ø—‘˜EÖ"ñ ð ÷ 
,Ñ	+ùò B÷ 
,Õ	+ús#   ›*CÁ	=CÂCÂ"+CÃCÃ
C*c                  ó@  •  [         R                  " S5      $ ! [         aû    Sn [        [	        5        S35       nU H.  nUR                  5       R                  S5      (       d  M)  U S-  n M0     SSS5        O! , (       d  f       O= fU S:X  a�  [        R                  " S5      n[        [	        5        S35       nU H4  nUR                  S	5      S   nUR                  U5      (       d  M/  U S-  n M6     SSS5        O! , (       d  f       O= fU S:X  a   gU s $ f = f)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNr   ú/cpuinfos	   processorr   Nzcpu\dr}   Ú )rb   ÚsysconfÚ
ValueErrorr   r   Úlowerr    ÚreÚcompiler   rd   Úmatch)Únumr�   r¬   Úsearchs       rD   Úcpu_count_logicalrï     só   € ðÜ�zŠzÐ/Ó0Ð0øÜó àˆÜœOÓ-Ð.¨hÐ7Ô8¸AÛ�Ø—:‘:“<×*Ñ*¨<×8Ó8Ø˜1‘H’Cñ ÷ 9×8Ö8úð �!‹8Ü—Z’Z Ó)ˆFÜœoÓ/Ð0°Ð6Ô7¸1Û�DØŸ:™: c›?¨1Ñ-�DØ—|‘| D×)Ó)Ø˜q™šñ ÷ 8×7Ö7úð �!‹8áØŠ
ð-úsP   ‚ ˜"Dº(A8Á&	A8Á/	DÁ8
B	Â9DÂ;.C?Ã-	C?Ã6	DÃ?
D	Ä	DÄDÄDc                  ó  • [        5       n SnSn[        R                  " U5      =(       d    [        R                  " U5       HD  n[        U5       nU R                  UR	                  5       R                  5       5        SSS5        MF     [        U 5      nUS:w  a  U$ 0 n0 n[        [        5        S35       nU Hp  nUR                  5       R                  5       nU(       d   US   XgS   '   0 nM7  UR                  S5      (       d  MO  UR                  S	S
5      u  pš[        U
5      Xy'   Mr     SSS5        [        UR                  5       5      nU=(       d    S$ ! , (       d  f       GM(  = f! [         a     NŒf = f! , (       d  f       NU= f)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    rd   r¡   Úsumr‘   )ÚlsÚp1Úp2rf   r�   ÚresultÚmappingÚcurrent_infor¬   ÚkeyÚvalues              rD   Úcpu_count_coresr   4  sT  € ô 
‹€Bð 
E€BØ	J€BÜ—	’	˜"“×.¤§¢¨2£Ò.ˆÜ˜Ô !Ø�F‰F�1—6‘6“8—>‘>Ó#Ô$÷ Ññ /ô �‹W€FØ�ƒ{Øˆð €GØ€LÜ	œÓ)Ð*¨(Ð3Ô	4¸ÛˆDØ—:‘:“<×%Ñ%Ó'ˆDÞðØ<HØ$ñ=�G¨Ñ8Ñ9ð
  "’Ø—‘Ð!?×@Ó@à!ŸZ™Z¨°Ó2‘
�Ü$'¨£J�Ó!ñ ÷ 
5ô" �—‘Ó!Ó"€FØ�>�TÐ÷7 ×ûô$  ó Ùðú÷ 
5Õ	4úsB   Á.EÂ7+E=Ã#
E-Ã-E=Ä	%E=Å
E*	Å-
E:Å7E=Å9E:Å:E=Å=
Fc                  ó  • [        [        5        S35       n SnSnSnU  Hª  nUR                  S5      (       a  [        UR	                  5       S   5      nOeUR                  S5      (       a  [        UR	                  5       S   5      nO2UR                  S5      (       a  [        UR	                  5       S   5      nUc  M   Uc  M¥  Uc  Mª    O   SSS5        Sn[
        R                  " WWWU5      $ ! , (       d  f       N)= f)z*Return various CPU stats as a named tuple.r}   Ns   ctxtr   s   intrs   softirqr   )r   r   r    r¡   rd   rÄ   Ú	scpustats)r�   Úctx_switchesÚ
interruptsÚsoft_interruptsr¬   Úsyscallss         rD   Ú	cpu_statsr  ^  sØ   € ä	œÓ)Ð*¨%Ð0Ô	1°QØˆØˆ
ØˆÛˆDØ�‰˜w×'Ñ'Ü" 4§:¡:£<°¡?Ó3‘Ø—‘ ×)Ñ)Ü  §¡£¨a¡Ó1‘
Ø—‘ ×,Ñ,Ü"% d§j¡j£l°1¡oÓ"6�àÓ(Ø#Ó/ØÓ*áñ ÷	 
2ð" €HÜ�=Š=˜ z°?ÀHÓMÐM÷% 
2Õ	1ús   —B%C1Ã C1ÃC1Ã
C1Ã1
C?c            
      ó  • [        [        5        S35       n U  Vs/ s HG  nUR                  5       R                  S5      (       d  M)  [	        UR                  SS5      S   5      PMI     snsSSS5        $ s  snf ! , (       d  f       g= f)z7Return current CPU frequency from cpuinfo if available.rå   s   cpu mhzó   :r   N)r   r   ré   r    rÜ   rd   )r�   r¬   s     rD   Ú_cpu_get_cpuinfo_freqr
  u  su   € ä	œÓ)Ð*¨(Ð3Ô	4¸ñ ó
â�Ø�z‰z‹|×&Ñ& z×2ó *ŒE�$—*‘*˜T 1Ó% aÑ(Ö)Ùñ
÷ 
5Ñ	4ùò
÷ 
5Õ	4ús"   —A;œ(A6Á"A6Á*A;Á6A;Á;
B	z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	      ó  • [        5       n [        R                  " S5      =(       d    [        R                  " S5      nUR                  S S9  / n[        R                  R
                  n[        U5       GH  u  pE[        U5      [        U 5      :X  a  X   S-  nO[        U" US5      SS9nUc^  [        U" US	5      SS9nUcJ  S
U S3n[        USS9S:X  a)  UR                  [        R                  " SSS5      5        M‹  Sn[        U5      e[        U5      S-  n[        [        U" US5      5      5      S-  n	[        [        U" US5      5      5      S-  n
UR                  [        R                  " XjU	5      5        GM     U$ )zjReturn 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                 ó^   • [        [        R                  " SU 5      R                  5       5      $ )Nz[0-9]+)r¡   rê   rî   Úgroup©rL   s    rD   Ú<lambda>Úcpu_freq.<locals>.<lambda>Œ  s   € ¤¤R§Y¢Y¨y¸!Ó%<×%BÑ%BÓ%DÔ!ErC   )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ô   Úsortrb   rf   rÀ   Ú	enumerater�   r   r   rŽ   rÄ   ÚscpufreqÚNotImplementedErrorr¡   )Úcpuinfo_freqsÚpathsÚretÚpjoinÚirf   ÚcurrÚonline_pathrË   Úmax_Úmin_s              rD   Úcpu_freqr#  ƒ  sh  € ô
 .Ó/ˆÜ—	’	Ø:ó
÷ Dä�YŠYÐBÓCð 	ð 	�
‰
ÑEˆ
ÑFØˆÜ—‘—‘ˆÜ  ×'‰GˆAÜ�5‹zœS Ó/Ó/ð %Ñ'¨$Ñ.‘ä™E $Ð(:Ó;ÀdÑK�Ø‰|ô ™E $Ð(:Ó;ÀdÑK�Ø‘<Ø$?À¸sÀ'Ð"J�Kä˜;°Ñ6¸%Ó?ØŸ
™
¤3§<¢<°°S¸#Ó#>Ô?Ù Ø=�CÜ-¨cÓ2Ð2Ü�t“9˜tÑ#ˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDØ�J‰J”s—|’| D°Ó5×6ñ- (ð. ˆ
rC   c                  ón   • [        5        V s/ s H  n [        R                  " U SS5      PM     sn $ s  sn f )zmAlternate implementation using /proc/cpuinfo.
min and max frequencies are not available and are set to None.
r–   )r
  rÄ   r  r  s    rD   r#  r#  ª  s/   € ô 4IÔ3JÓKÒ3J¨a”—’˜Q  SÖ)Ñ3JÑKÐKùÒKs   �"2c                   ó   • \ rS rSrSrg)Ú_Ipv6UnsupportedErrori¹  r=   N)r>   r?   r@   rA   rB   r=   rC   rD   r&  r&  ¹  s   † ÚrC   r&  c                   ól   • \ rS rSrSrS rS rS r\S 5       r	\SS j5       r
\SS	 j5       rSS
 jrSrg)ÚNetConnectionsi½  a[  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                 ó‚  • S[         R                  [         R                  4nS[         R                  [         R                  4nS[         R                  [         R                  4nS[         R                  [         R                  4nS[         R
                  S 4nXX4U4X4U4U4X44U4U4U4XX44X4X$4S.U l        S U l        g )NÚtcpÚtcp6ÚudpÚudp6Úunix)Úallr*  Útcp4r+  r,  Úudp4r-  r.  ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)Úselfr0  r+  r1  r-  r.  s         rD   Ú__init__ÚNetConnections.__init__É  s¾   € ð ”v—~‘~¤v×'9Ñ'9Ð:ˆØœŸ™¬×);Ñ);Ð<ˆØ”v—~‘~¤v×'8Ñ'8Ð9ˆØœŸ™¬×):Ñ):Ð;ˆØœŸ™¨Ð-ˆà ¨DÐ1Ø�<Ø�GØ�GØ�<Ø�GØ�GØ�GØ Ð,Ø�\Ø�\ñ
ˆŒ	ð !ˆÕrC   c                 ó&  • [        [        5      n[        R                  " U R                   SU S35       H_  n [        U R                   SU SU 35      nUR                  S5      (       a(  USS  S S nX$   R                  U[        U5      45        M_  Ma     U$ ! [        [        4 a     Mx  [         aY  nUR                  [        R                  :X  a   S nAM¥  UR                  [        R                  :X  a  [        U5         S nAMÔ  e S nAff = f)Nru   ú/fdú/fd/zsocket:[r…   éÿÿÿÿ)r   Úlistrb   Úlistdirr<  rc   r    rŽ   r¡   ÚFileNotFoundErrorÚProcessLookupErrorrž   ÚerrnoÚEINVALÚENAMETOOLONGr   )r=  ÚpidÚinodesÚfdÚinoderª   s         rD   Úget_proc_inodesÚNetConnections.get_proc_inodesà  sù   € ÜœTÓ"ˆÜ—*’* × 1Ñ 1Ð2°!°C°5¸Ð<Ö=ˆBð9Ü  D×$5Ñ$5Ð#6°a¸°u¸DÀÀÐ!EÓF�ð  ×#Ñ# J×/Ñ/à! ! "˜I c r˜N�EØ‘M×(Ñ(¨#¬s°2«w¨Ö8ñ 0ñ% >ð, ˆøô' &Ô'9Ð:ó ò Üó Ø—9‘9¤§¡Ó,åØ—9‘9¤× 2Ñ 2Ó2ä˜#”JÝØûðús)   ºBÂDÂ.	DÂ7DÃ)DÄ
DÄDc                 ó¦   • 0 n[        5        H$  n UR                  U R                  U5      5        M&     U$ ! [        [        [
        4 a     MB  f = f©N)ÚpidsÚupdaterO  rF  rG  ÚPermissionError)r=  rL  rK  s      rD   Úget_all_inodesÚNetConnections.get_all_inodesú  sT   € ØˆÜ–6ˆCð
Ø—‘˜d×2Ñ2°3Ó7Ö8ñ ð ˆøô &Ô'9¼?ÐKó ò ðús   ‘ 7·AÁAc           
      óf  • U R                  S5      u  p#[        US5      nU(       d  gUR                  S5      nU[        R                  :X  ai  [
        (       a2  [        R                  " U[        R                  " U5      SSS2   5      nOî[        R                  " U[        R                  " U5      5      nOÂ[        R                  " U5      n [
        (       aP  [        R                  " [        R                  [        R                  " S/[        R                  " SU5      Q76 5      nOP[        R                  " [        R                  [        R                  " S/[        R                  " SU5      Q76 5      n [         R"                  " X#5      $ ! [         a    [        5       (       d  [        See f = f)	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=   ÚasciiNrC  z>4Iz<4I)rd   r¡   Úencoder5  r6  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoder8  ÚstructÚpackÚunpackrè   r   r&  rÄ   Úaddr)rd  ÚfamilyÚipÚports       rD   Údecode_addressÚNetConnections.decode_address
  s>  € ð" —:‘:˜c“?‰ˆÜ�4˜‹}ˆö ØØ�Y‰Y�wÓˆØ”V—^‘^Ó#çŠ}Ü×%Ò% f¬f×.>Ò.>¸rÓ.BÁ4ÀRÀ4Ñ.HÓI‘ä×%Ò% f¬f×.>Ò.>¸rÓ.BÓC‘ä×!Ò! "Ó%ˆBðç ’=Ü×)Ò)ÜŸ™ÜŸš EÐE¬F¯MªM¸%ÀÓ,DÒEó‘Bô
  ×)Ò)ÜŸ™ÜŸš EÐE¬F¯MªM¸%ÀÓ,DÒEó‘Bô �xŠx˜Ó!Ð!øô ó ä$—‘Ü/°TÐ9Øð	ús   ÃAF Ä(AF Æ"F0Nc              #   ó¸  #   • U R                  S5      (       a%  [        R                  R                  U 5      (       d  g[	        U 5       nUR                  5         [        US5       HŸ  u  pg UR                  5       SS u
  p‰p«        pŒXÃ;   a
  X<   S   u  pïOS	u  pïUb  XN:w  a  M>  U[        R                  :X  a
  [        U   nO[        R                  n [        R!                  X‘5      n	[        R!                  X¡5      n
XñX)X«U4v •  M¡     SSS5        g! [         a    SU  SU SU< 3n[        U5      Sef = f! ["         a     Mß  f = f! , (       d  f       g= f7f)
z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nr   r‰   úerror while parsing ú; malformed line ræ   r   ©NrC  )re   rb   rf   Úexistsr   rŒ   r  rd   rè   ÚRuntimeErrorr5  r7  ÚTCP_STATUSESr   Ú	CONN_NONEr(  rh  r&  )Úfilere  Útype_rL  Ú
filter_pidr�   Úlinenor¬   rÔ   ÚladdrÚraddrÚstatusrN  rË   rK  rM  s                   rD   Úprocess_inetÚNetConnections.process_inet=  sc  é € ð �=‰=˜×Ñ¤b§g¡g§n¡n°T×&:Ñ&:àÜ�tŒ_ Ø�J‰JŒLÜ )¨!¨Q¦‘�ð	6àŸ
™
› S bÐ)ñ B�A˜e¨Q°°1°a¸ð “?ð %™m¨AÑ.‘G�C˜à&‘G�CØÑ)¨jÓ.?Ùà¤× 2Ñ 2Ó2Ü!-¨fÑ!5™ä!(×!2Ñ!2˜ð!Ü .× =Ñ =¸eÓ L˜Ü .× =Ñ =¸eÓ L˜ð  u°UÀCÐHÔHñC !0÷ ˆ_øô "ó 6à.¨t¨fð 5Ø"˜8 1 T¡Hð.ð ô ' sÓ+°Ð5ð6ûô4 1ó !Ú ð!ú÷C �_üs[   ‚AEÁ	"E	Á,DÂAE	Ã*D8Ã=E	Ä		EÄ#D5Ä5E	Ä8
EÅE	ÅEÅE	Å	
EÅEc           
   #   óú  #   • [        U 5       nUR                  5         U H‘  nUR                  5       n USS u        pxpyX’;   a  X)   nOS/nU H_  u  pÍUb  X<:w  a  M  [        U5      S:X  a  US	   OS
n[        R                  " [        U5      5      nS
n[        R                  nXÑXŽUUU4v •  Ma     M“     SSS5        g! [         a    SU;  a   M±  SU  SU< 3n
[	        U
5      ef = f! , (       d  f       g= f7f)zParse /proc/net/unix files.r   é   ræ   rl  rm  rn  Nr…   rC  Ú )
r   rŒ   rd   rè   rp  r�   r   Úsocktype_to_enumr¡   rr  )rs  re  rL  ru  r�   r¬   ÚtokensrÔ   rt  rN  rË   ÚpairsrK  rM  rf   rx  ry  s                    rD   Úprocess_unixÚNetConnections.process_unixh  s  é € ô �tŒ_ Ø�J‰JŒLÛ�ØŸ™›�ð	,Ø28¸¸1°+Ñ/�A�q˜!˜Q qð “?ð #™M‘Eà'˜L�EÛ$‘G�CØ!Ñ-°*Ó2CÙ ä-0°«[¸AÓ-=˜v bšzÀ2˜Ü '× 8Ò 8¼¸U»Ó D˜ð !#˜Ü!(×!2Ñ!2˜Ø!¨5¸¸vÀsÐKÔKó  %ñ% ÷ ˆ_øô "ó ,Ø $“â à.¨t¨fÐ4EÀdÁXÐNð ô ' sÓ+Ð+ð,ú÷ �_üs@   ‚C;Ž&C*µB?Á A6C*Â6	C;Â?C'ÃC*ÃC'Ã'C*Ã*
C8Ã4C;c                 ó6  • [        5       U l        Ub  U R                  U5      nU(       d  / $ OU R                  5       n[	        5       nU R
                  U    Hµ  u  pVnU R                   SU 3nU[        R                  [        R                  1;   a  U R                  X†XsUS9n	OU R                  X†X2S9n	U	 HR  u  p¦p{pÍnU(       a  [        R                  " X¦X{XÍ5      nO[        R                  " X¦X{XÍU5      nUR                  U5        MT     M·     [        U5      $ )Nz/net/)ru  )r   r<  rO  rV  ró   r;  r5  r6  r8  rz  r‚  rÄ   ÚpconnÚsconnrõ   rD  )r=  ÚkindrK  rL  r  Ú
proto_namere  rt  rf   rø   rM  rw  rx  ry  Ú	bound_pidÚconns                   rD   ÚretrieveÚNetConnections.retrieveŒ  s  € Ü+Ó-ˆÔØ‰?Ø×)Ñ)¨#Ó.ˆFÞà�	ð ð ×(Ñ(Ó*ˆFÜ‹eˆØ)-¯©°4¬Ñ%ˆJ Ø×'Ñ'Ð(¨¨j¨\Ð:ˆDØœ&Ÿ.™.¬&¯/©/Ð:Ó:Ø×&Ñ&Ø %¸Cð 'ð ‘ð ×&Ñ& t°VÐ&ÐL�ÛFHÑB�˜E¨%¸ÞÜŸ9š9 R°¸uÓM‘DäŸ9š9Ø E°%Àó�Dð —‘˜–ó GIñ *9ô  �C‹yÐrC   )r<  r;  rR  )r>   r?   r@   rA   Ú__doc__r>  rO  rV  Ústaticmethodrh  rz  r‚  r‹  rB   r=   rC   rD   r(  r(  ½  s^   † ñ	ò!ò.ò4ð  ñ0"ó ð0"ðd ó(Ió ð(IðT ó!Ló ð!L÷FrC   r(  c                 ó,   • [         R                  U 5      $ )z$Return system-wide open connections.)Ú_net_connectionsr‹  )r‡  s    rD   Únet_connectionsr‘  ¬  s   € ä×$Ñ$ TÓ*Ð*rC   c                  ó¶  • [        [        5        S35       n U R                  5       nSSS5        0 nWSS  H�  nUR                  S5      nUS:”  d   [	        U5      5       eUSU R                  5       nX4S-   S R                  5       R                  5       n[        [        U5      u  nnn	n
nnnnnnnnnnnnUUUUU	UU
U4X%'   M�     U$ ! , (       d  f       N¨= f)zkReturn network I/O statistics for every network interface
installed on the system as a dict of raw tuples.
z/net/devNr;   rY  r   r   )	r   r   Ú	readlinesÚrfindÚreprrŸ   rd   Úmapr¡   )r�   ÚlinesÚretdictr¬   Úcolonry   r’   Ú
bytes_recvÚpackets_recvÚerrinÚdropinÚ_fifoinÚ_frameinÚ_compressedinÚ_multicastinÚ
bytes_sentÚpackets_sentÚerroutÚdropoutÚ_fifooutÚ_collisionsoutÚ_carrieroutÚ_compressedouts                          rD   Únet_io_countersrª  ±  s
  € ô 
”oÓ'Ð(¨Ð1Ô	2°aØ—‘“ˆ÷ 
3à€GØ�a�b“	ˆØ—
‘
˜3“ˆØ�q‹yÐ$œ$˜t›*Ó$ˆyØ�F�Uˆ|×!Ñ!Ó#ˆØ˜a‘i�kÐ"×(Ñ(Ó*×0Ñ0Ó2ˆô* ”�VÓñ'	
àØØØØØØØàØØØØØØØð ØØØØØØØð	
ˆ‹ñ7 ðJ €N÷Q 
3Õ	2ús   —C
Ã

Cc                  ó<  • [         R                  [        [         R                  [        [         R
                  [        0n [        5       R                  5       n0 nU H{  n [         R                  " U5      n[         R                  " U5      n[         R                  " U5      u  pgSR                  U5      nSU;   n	[        R                  " X�U   XtU5      X#'   M}     U$ ! [         a5  n
U
R                   [         R"                  :w  a  e [%        U
5         Sn
A
M»  Sn
A
ff = f)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ž   rH  ÚENODEVr   )Ú
duplex_mapÚnamesr  ry   Úmturp   ÚduplexÚspeedÚoutput_flagsÚisuprª   s              rD   Únet_if_statsr¾  à  sî   € ô 	×Ñœ/Ü×Ñœ/Ü×ÑÔ/ð€Jô
 Ó×"Ñ"Ó$€EØ
€CÛˆð	Ü—/’/ $Ó'ˆCÜ×%Ò% dÓ+ˆEÜ ×4Ò4°TÓ:‰MˆFð Ÿ8™8 E›?ˆLØ Ñ%ˆDÜŸšØ Ñ(¨%°lóˆC‹Iñ ð  €Jøô ó 	à�y‰yœEŸL™LÓ(ØÜ�#�JŠJûð		ús   ÁACÃ
DÃ&*DÄDc                 ó˜  • S nS n[         R                  R                  [        5        S35      (       a  U" 5       nOD[         R                  R                  S5      (       a  U" 5       nO[        5        S3n[	        U5      e0 nU H@  nUu
  pxpšp¼pÞnnU (       d  [        U5      (       d  M%  U
[        -  n
U[        -  nX‰X«XÍXïU4	XW'   MB     U$ )z[Return disk I/O statistics for every disk installed on the
system as a dict of raw tuples.
c               3   ó   #   • [        [        5        S35       n U R                  5       nS S S 5        W HÄ  nUR                  5       n[	        U5      nUS:X  a.  US   n[        US   5      n[        [
        USS 5      u
  pxpšnpÍpïnOhUS:X  d  US:¼  a   US   n[        [
        USS 5      u  pgp‰p«pÍpïnO<US:X  a%  US   n[        [
        USS  5      u  php¬S	=n	=n=n=p¿OS
U< 3n[        U5      eXVX¨XÉUX{U4
v •  MÆ     g ! , (       d  f       NÙ= f7f)Nú
/diskstatsé   r<   r;   rÏ   é   é   r}  r   znot sure how to interpret line )r   r   r“  rd   r�   r¡   r–  rè   )r�   r—  r¬   r’   Úflenry   ÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚwrites_mergedÚwbytesÚwtimerÔ   Ú	busy_timerË   s                    rD   Úread_procfsÚ%disk_io_counters.<locals>.read_procfs	  s7  é € ô" œ/Ó+Ð,¨JÐ7Ô8¸AØ—K‘K“MˆE÷ 9ãˆDØ—Z‘Z“\ˆFÜ�v“;ˆDà�r‹zà˜a‘y�Ü˜F 1™I›�ä69¼#¸vÀaÈ¸|Ó6Lñ4� u°mØ 1±Ø˜“˜t r›zà˜a‘y�ä69¼#¸vÀaÈ¸|Ó6Lñ4� f°VØ 1±Ø˜“à˜a‘y�Ü03´C¸ÀÀ¸Ó0DÑ-�˜vØKLÐL�ÐL˜ÐL ÐL¨}¸yà7¸±xÐ@�Ü  “oÐ%Ø °¸uØ°	ð;ô ;ò/ ÷ 9Õ8üs   ‚D™C=ªCDÃ=
DÄDc               3   ó2  #   • [         R                  " S5       Hè  n [         R                  " [         R                  R	                  SU 5      5       H­  u  pnSU;  a  M  [        [         R                  R	                  US5      5       nUR                  5       R                  5       R                  5       nS S S 5        [         R                  R                  U5      n[        [        WS S 5      u
  pxpšp¼pÞp/XgX¹XÚXèXÏ4
v •  M¯     Mê     g ! , (       d  f       NX= f7f)Nú
/sys/blockÚstatr‰   )rb   rE  Úwalkrf   rÀ   r   rö   rŸ   rd   Úbasenamer–  r¡   )ÚblockÚrootrÔ   Úfilesr�   r’   ry   rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÎ  s                   rD   Ú
read_sysfsÚ$disk_io_counters.<locals>.read_sysfs7  sÙ   é € Ü—Z’Z Ö-ˆEÜ"$§'¢'¬"¯'©'¯,©,°|ÀUÓ*KÖ"L‘�˜Ø Ó&ÙÜœrŸw™wŸ|™|¨D°&Ó9Ô:¸aØŸV™V›XŸ^™^Ó-×3Ñ3Ó5�F÷ ;ä—w‘w×'Ñ'¨Ó-�ô 47´s¸FÀ3ÀB¸KÓ3Hñ1� f°VØ 1Ø F°FØ¨MðFô Fó #Mò .÷ ;Õ:üs   ‚BDÂ-DÂ4ADÄ
DÄDrÁ  rÒ  z6/diskstats nor /sys/block are available on this system)rb   rf   ro  r   r  r{   ÚDISK_SECTOR_SIZE)ÚperdiskrÏ  rÙ  ÚgenrË   r˜  rá   ry   rÆ  rÊ  rÈ  rÌ  rÉ  rÍ  rÇ  rË  rÎ  s                    rD   Údisk_io_countersrÞ    sâ   € ò
+;ò\Fô 
‡w�w‡~�~œÓ*Ð+¨:Ð6×7Ñ7Ù‹m‰Ü	�‰�‰˜×	%Ñ	%Ù‹l‰ô Ó Ð!ð "ð ð 	ô " #Ó&Ð&à€GÛˆð ).ñ	&ˆ�f f°UØ˜9ÞÔ0°×6Ñ6ñ àÔ"Ñ"ˆØÔ"Ñ"ˆØ¨¸Ø%°iðAˆ‹ñ) ð0 €NrC   c                   ó>   • \ rS rSrSrSS/rS rS rS rS r	S	 r
S
rg)ÚRootFsDeviceFinderim  a2  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                 ó°   • [         R                  " S5      R                  n[         R                  " U5      U l        [         R                  " U5      U l        g ©Nru   )rb   rÓ  Úst_devrá  râ  )r=  Údevs     rD   r>  ÚRootFsDeviceFinder.__init__w  s3   € Ü�gŠg�c‹l×!Ñ!ˆÜ—X’X˜c“]ˆŒ
Ü—X’X˜c“]ˆ�
rC   c                 óö  • [        [        5        S35       nUR                  5       SS   H²  nUR                  5       n[	        U5      S:  a  M$  US   R                  5       (       a  [        US   5      OS nUS   R                  5       (       a  [        US   5      OS nUS   nX@R                  :X  d  MŠ  XPR                  :X  d  M›  U(       d  M¤  SU 3s  sS S S 5        $    S S S 5        g ! , (       d  f       g = f)Nz/partitionsr;   rÏ   r   r   r<   ú/dev/)	r   r   r“  rd   r�   Úisdigitr¡   rá  râ  )r=  r�   r¬   r’   rá  râ  ry   s          rD   Úask_proc_partitionsÚ&RootFsDeviceFinder.ask_proc_partitions|  sÈ   € Üœ/Ó+Ð,¨KÐ8Ô9¸QØŸ™› a bÓ)�ØŸ™›�Ü�v“; “?ÙØ*0°©)×*;Ñ*;×*=Ñ*=œ˜F 1™IœÀ4�Ø*0°©)×*;Ñ*;×*=Ñ*=œ˜F 1™IœÀ4�Ø˜a‘y�ØŸJ™JÕ&¨5·J±JÕ+>ß�tØ!& t f˜~Ñ-÷ :Ñ9Ù)÷ :×9Ö9ús$   —BC*Â5C*ÃC*ÃC*ÃC*Ã*
C8c                 ó<  • SU R                    SU R                   S3n[        U5       nU HT  nUR                  S5      (       d  M  UR	                  5       R                  S5      S   nU(       d  MF  SU 3s  sS S S 5        $    S S S 5        g ! , (       d  f       g = f)Nz/sys/dev/block/rY  z/ueventzDEVNAME=r;   ré  )rá  râ  r   r    rŸ   Ú
rpartition)r=  rf   r�   r¬   ry   s        rD   Úask_sys_dev_blockÚ$RootFsDeviceFinder.ask_sys_dev_block‰  s{   € Ø  §¡ ¨A¨d¯j©j¨\¸ÐAˆÜ�tŒ_ Û�Ø—?‘? :×.Ó.ØŸ:™:›<×2Ñ2°:Ó>¸qÑA�Dß�tØ!& t f˜~Ñ-÷ ‰_Ù÷ �_Ž_ús   ©BÁ'BÁ2BÂBÂ
Bc                 óÌ  • U R                    SU R                   3n[        R                  " S5      nU HŠ  n [	        U5      nU   UR                  5       R                  5       nXQ:X  aL  [        R                  R                  [        R                  R                  U5      5      nSU 3sS S S 5        s  $  S S S 5        MŒ     g ! , (       d  f       Mž  = f! [         a     M®  f = f)NrY  z/sys/class/block/*/devré  )rá  râ  rô   Úiglobr   rö   rŸ   rb   rf   rÕ  ÚdirnamerF  )r=  ÚneedlerØ  rs  r�   Údatary   s          rD   Úask_sys_class_blockÚ&RootFsDeviceFinder.ask_sys_class_block’  s³   € Ø—J‘J�<˜q §¡ Ð-ˆÜ—
’
Ð3Ó4ˆÛˆDð	.Ü˜d“O�ò ØŸ6™6›8Ÿ>™>Ó+�DØ“~Ü!Ÿw™w×/Ñ/´·±·±ÀÓ0EÓF˜Ø!& t f˜~÷	 “Qà%÷ ‘Qò ÷ –Qûô %ó Úðús   ¸CÁA$CÃ
C	Ã
C#Ã"C#c                 ó   • S nUc   U R                  5       nUc   U R                  5       nUc   U R	                  5       nUb'  [
        R                  R                  U5      (       a  U$ g g ! [         a  n[        U5         S nANmS nAff = f! [         a  n[        U5         S nAN{S nAff = f! [         a  n[        U5         S nAN‰S nAff = frR  )rë  rž   r   rï  rö  rb   rf   ro  )r=  rf   rª   s      rD   ÚfindÚRootFsDeviceFinder.find¡  sÉ   € ØˆØ‰<ðØ×/Ñ/Ó1�ð ‰<ðØ×-Ñ-Ó/�ð ‰<ðØ×/Ñ/Ó1�ð
 Ñ¤§¡§¡¨t× 4Ñ 4ØˆKð !5Ðøô ó Ü�c—
‘
ûðûô
 ó Ü�c—
‘
ûðûô
 ó Ü�c—
‘
ûðúsE   ‡A* ›B ¯B. Á*
B	Á4BÂB	Â
B+ÂB&Â&B+Â.
CÂ8CÃC)rá  râ  N)r>   r?   r@   rA   r�  Ú	__slots__r>  rë  rï  rö  rù  rB   r=   rC   rD   rà  rà  m  s,   † ñð ˜'Ð"€Iò#ò
.ò.ò.õrC   rà  c                 ó„  • [        5       n[        5       nU (       d”  [        U S35       nU Hw  nUR                  5       nUR	                  S5      (       d!  UR                  UR                  5       5        MJ  UR                  S5      S   nUS:X  d  Mf  UR                  S5        My     SSS5        US:X  aD  [        R                  R                  S5      (       a   [        R                  R                  S5      nO"[        R                  R                  U S	35      n/ n[        R                  " U5      nU Ht  n	U	u  p«p\U
S
:X  a  Sn
U
S;   a!  [        5       R                  5       =(       d    U
n
U (       d  U
(       a  XQ;  a  ML  [        R                   " X«X\5      nUR#                  U5        Mv     U$ ! , (       d  f       GN= f)z8Return mounted disk partitions as a list of namedtuples.z/filesystemsÚnodevÚ	r   ÚzfsNr•   z	/etc/mtabz/self/mountsÚnoner~  >   Úrootfsú	/dev/root)ró   r   r   rŸ   r    rõ   rd   rb   rf   ÚisfileÚrealpathrÑ   Údisk_partitionsrà  rù  rÄ   Ú	sdiskpartrŽ   )r/  Úfstypesr�   r�   r¬   ÚfstypeÚmounts_pathÚretlistÚ
partitionsÚ	partitionÚdeviceÚ
mountpointÚoptsÚntuples                 rD   r  r  ¸  sb  € ä‹e€GÜ!Ó#€KÞÜ˜+˜ lÐ3Ô4¸Û�Ø—z‘z“|�Ø—‘ w×/Ñ/Ø—K‘K §
¡
£Ö-ð "ŸZ™Z¨Ó-¨aÑ0�FØ •ØŸ™ EÖ*ñ ÷ 5ð �gÓ¤"§'¡'§.¡.°×"=Ñ"=Ü—g‘g×&Ñ& {Ó3‰ä—g‘g×&Ñ&¨+¨°lÐ'CÓDˆà€GÜ×%Ò% kÓ2€JÛˆ	Ø+4Ñ(ˆ˜FØ�VÓØˆFØÐ,Ó,Ü'Ó)×.Ñ.Ó0×:°FˆFÞÞ˜VÓ2ÙÜ—’˜v°6Ó@ˆØ�‰�vÖñ  ð €N÷? 5Ö4ús   ªA%F0ÂF0Æ0
F?c            	      óÚ  • [         R                  " [        5      n [        R                  " S5      nUR	                  [        R                  " S5      5        [        U Vs1 s H  o"R                  S5      S   iM     sn5      n[        R                  " S5      n[        R                  " S5      nU H-  nUR                  SU5      nXa;  d  M  UR                  U5        M/     U Hä  n US-   n[        [        U5      5      S	-  n	[        R                  R                  [        R                  R!                  U5      S
5      n[#        U5      R%                  5       n
[        US-   SS9n[        US-   SS9n[#        US-   SS9R%                  5       nUb   [        U5      S	-  nUb   [        U5      S	-  nX
   R                  XÙX¼45        Mæ     U(       Gdö  [        R                  " S5      n[        [+        U5      5      nU GHÅ  n [        R                  R                  US5      n[        [        U5      5      S	-  n	[        R                  R                  US5      n[#        U5      R%                  5       n
[        R                  " US-   5      nU Vs1 s HC  nSR                  [        R                  R/                  U5      R                  S5      SS 5      iME     nnSnSnU HÇ  n[        R                  R                  UUS-   5      n[#        USS9R%                  5       nUS:X  a,  [        [        R                  R                  UUS-   5      SS9nO1US:X  a+  [        [        R                  R                  UUS-   5      SS9nUb   [        U5      S	-  nUc  M¸   [        U5      S	-  nMÉ     X
   R                  SX›U45        GMÈ     [1        U 5      $ s  snf ! [&        [(        4 a     GM
  f = f! [(         a    Sn GN`f = f! [(         a    Sn GNaf = f! [&        [(        4 a  n[-        U5         SnAGM:  SnAff = fs  snf ! [(         a    Sn N¾f = f! [(         a    Sn GM…  f = f)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*_*rÔ   r   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @�@ry   Ú_maxNr  Ú_critÚ_labelr~  z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*r<   Ú_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   rD  rô   ÚextendÚsortedrd   rê   rë   ÚsubrŽ   rÜ   r   rb   rf   rÀ   ró  r   rŸ   rž   rè   ró   r   rÕ  Údict)r  Ú	basenamesrL   Ú
basenames2Úreplry   ÚaltnameÚbaserf   ÚcurrentÚ	unit_namer  r  Úlabelrª   Ú
trip_pathsÚpÚtrip_pointsÚ
trip_pointÚ	trip_types                       rD   Úsensors_temperaturesr.  ä  s	  € ô ×
!Ò
!¤$Ó
'€CÜ—	’	Ð;Ó<€Ið ×Ñ”T—Y’YÐGÓHÔIÜ±Ó;²¨AŸ™ › Qœ±Ñ;Ó<€Iô —’Ø?ó€Jô �:Š:Ð@ÓA€DÛˆØ—(‘(Ð.°Ó5ˆØÕ#Ø×Ñ˜TÖ"ñ ó
 ˆð	Ø˜(‘?ˆDÜœD ›JÓ'¨&Ñ0ˆGÜ—7‘7—<‘<¤§¡§¡°Ó 5°vÓ>ˆDÜ˜D›	Ÿ™Ó)ˆIô �D˜6‘M¨DÑ1ˆÜ˜˜w™°Ñ6ˆÜ�D˜8‘O¨bÑ1×7Ñ7Ó9ˆàÑðÜ˜T“{ VÑ+�ð Ñð Ü  ›?¨VÑ3�ð 	‰×Ñ˜u¨tÐ>Ö?ñA ÷F Ü—I’IÐ@ÓAˆ	Üœ3˜y›>Ó*ˆ	äˆDðÜ—w‘w—|‘| D¨&Ó1�Ü¤ T£
Ó+¨fÑ4�Ü—w‘w—|‘| D¨&Ó1�Ü ›IŸO™OÓ-�	ô
 Ÿš 4¨.Ñ#8Ó9ˆJñ $óâ#�Að —‘œŸ™×)Ñ)¨!Ó,×2Ñ2°3Ó7¸¸!Ð<Ö=Ù#ð ð ð ˆHØˆDÛ)�
Ü—w‘w—|‘| D¨*°wÑ*>Ó?�Ü ¨rÑ2×8Ñ8Ó:�	Ø 
Ó*Ü#ÜŸ™Ÿ™ T¨:¸Ñ+?Ó@È4ñ ‘Hð  &Ó(ÜÜŸ™Ÿ™ T¨:¸Ñ+?Ó@È4ñ�Dð Ñ#ð$Ü$ T›{¨VÑ3˜ð Ó'ð(Ü#(¨£?°VÑ#;šñ' *ð. ‰N×!Ñ! 2 w°hÐ"?×@ñQ ôT �‹9ÐùòA <øô* œÐ$ó 		ó ð		ûô$ ó Ø“ðûô
 ó  Ø“ð ûô  œZÐ(ó Ü�c”
Þûðüò
øô* &ó $Ø#šð$ûô
 &ó (Ø#'œð(ús�   ÁOÃ(A2OÆO2Æ%PÈA0PÊA
QÎ	QÎQÏO/Ï.O/Ï2PÐPÐPÐPÐP?Ð(P:Ð:P?ÑQÑQÑQ*Ñ)Q*c                  óÊ  • [         R                  " [        5      n [        R                  " S5      nU(       d  [        R                  " S5      n[	        U Vs1 s H  o"R                  S5      S   iM     sn5      nU H±  n [        [        US-   5      5      n[        [        R                  R                  [        R                  R                  U5      S5      5      R                  5       n[        US-   S	S
9R                  5       nX   R!                  ["        R$                  " Xt5      5        M³     ['        U 5      $ s  snf ! [         a  n[        U5         SnAMà  SnAff = f)ak  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*_*rÔ   r   r  Nry   r  r~  r  )r  r   rD  rô   r  rd   r¡   r   rž   r   r   rb   rf   rÀ   ró  rŸ   rŽ   rÄ   Úsfanr   )r  r!  rL   r%  r&  rª   r'  r(  s           rD   Úsensors_fansr1  Z  s  € ô ×
!Ò
!¤$Ó
'€CÜ—	’	Ð:Ó;€IÞô —I’IÐEÓFˆ	ä±Ó;²¨AŸ™ › Qœ±Ñ;Ó<€IÛˆð	Üœ$˜t h™Ó/Ó0ˆGô œŸ™Ÿ™¤R§W¡W§_¡_°TÓ%:¸FÓCÓD×JÑJÓLˆ	Ü�D˜8‘O¨bÑ1×7Ñ7Ó9ˆØ‰×ÑœcŸhšh uÓ6Ö7ñ ô �‹9Ðùò <øô ó 	Ü�#ŒJÝûð	ús   ÁD=ÂEÅ
E"ÅEÅE"c                  óª  ^• [        5       mU4S jn [        R                  " [        5       Vs/ s H1  nUR	                  S5      (       d  SUR                  5       ;   d  M/  UPM3     nnU(       d  g[        R                  R                  [        [        U5      5      nU " US-   US-   5      nU " US-   US-   5      nU " US	-   US
-   5      nU " US-   5      nUb  Ub
   SU-  U-  nO[        [        US-   SS95      nUS:X  a  gSn	U " [        R                  R                  [        S5      [        R                  R                  [        S5      5      n
U
b  U
S:H  n	O:[        US-   SS9R                  5       R                  5       nUS:X  a  Sn	OUS;   a  Sn	U	(       a  [        R                  nOZUb  Ub   [        U[        U5      -  S-  5      nO8Ub%  [        US-  5      nUS:  a  [        R                   nO[        R                   n["        R$                  " XŒU	5      $ s  snf ! [         a    Sn GN/f = f! [         a    [        R                   n NKf = f)zï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                  ó˜   >• U  H!  n[        UTS9nUT:w  d  M   [        U5      s  $    g! [         a    UR                  5       s s  $ f = f)zfAttempt 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  rf   r  Únulls      €rD   Ú
multi_bcatÚ#sensors_battery.<locals>.multi_bcat‚  sR   ø€ ó ˆDÜ�t dÑ+ˆCØ�d�{ð'Ü˜s›8’Oñ	 ð øô "ó 'ØŸ9™9›;Ô&ð'ús   š
*ªA	ÁA	ÚBATÚbatteryNz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r–   z	/capacityrC  r  z
AC0/onlinez	AC/onliner   ú/statusr~  ÚdischargingF>   ÚfullÚchargingTi  é<   r   )Úobjectrb   rE  ÚPOWER_SUPPLY_PATHr    ré   rf   rÀ   r£   ÚZeroDivisionErrorr¡   r   rŸ   r   ÚPOWER_TIME_UNLIMITEDÚabsÚPOWER_TIME_UNKNOWNrÄ   Úsbattery)r5  rL   Úbatsr×  Ú
energy_nowÚ	power_nowÚenergy_fullÚtime_to_emptyrÊ   Úpower_pluggedÚonlinery  Úsecsleftr4  s                @rD   Úsensors_batteryrM  y  sO  ø€ ô ‹8€Dõô —’Ô-Ô.óâ.ˆAØ�<‰<˜×Ñ )¨q¯w©w«yÑ"8÷ 	
Ù.ð 	ð ö
 Øô �7‰7�<‰<Ô)¬3¨t«9Ó5€Dñ ˜D =Ñ0°$¸Ñ2FÓG€JÙ˜4 ,Ñ.°°~Ñ0EÓF€IÙ˜T NÑ2°D¸>Ñ4IÓJ€KÙ˜tÐ&:Ñ:Ó;€Mð Ñ :Ñ#9ð	Ø˜jÑ(¨;Ñ6‰Gô ”c˜$ Ñ,°rÑ:Ó;ˆØ�b‹=Øð
 €MÙÜ
�‰�‰Ô&¨Ó5Ü
�‰�‰Ô&¨Ó4ó€Fð ÑØ !™‰ä�T˜IÑ%°Ñ3×9Ñ9Ó;×AÑAÓCˆØ�]Ó"Ø!‰MØÐ+Ó+Ø ˆMö Ü×/Ñ/‰Ø	Ñ	 IÑ$9ð	2Ü˜:¬¨I«Ñ6¸Ñ=Ó>‰Hð 
Ñ	"Ü�} rÑ)Ó*ˆØ�a‹<Ü×1Ñ1ˆHøä×-Ñ-ˆä�<Š<˜¨=Ó9Ð9ùòCøô. !ó 	Ø‹Gð	ûôB !ó 	2Ü×1Ñ1ŠHð	2ús/   ®.HÁ HÃH" Æ3H5 È"H2È1H2È5IÉIc                  ó¶   • / n [         R                  " 5       nU H;  nUu  p4pVn[        R                  " X4=(       d    SXVU5      nU R	                  U5        M=     U $ )z:Return currently connected users as a list of namedtuples.N)rÑ   ÚusersrÄ   ÚsuserrŽ   )	r
  ÚrawlistÚitemr~   ÚttyÚhostnameÚtstamprK  Únts	            rD   rO  rO  Ø  sQ   € à€GÜ�jŠj‹l€GÛˆØ+/Ñ(ˆ�8 SÜ�YŠY�tŸ[ D¨(¸CÓ@ˆØ�‰�rÖñ ð €NrC   c                  ó  • [        5        S3n [        U 5       nU HN  nUR                  S5      (       d  M  [        UR	                  5       R                  5       S   5      s  sSSS5        $    SU  3n[        U5      e! , (       d  f       g= f)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Ÿ   rd   rp  )rf   r�   r¬   rË   s       rD   Ú	boot_timerX  ã  s|   € äÓÐ  Ð&€DÜ	�TÔ	˜aÛˆDØ�‰˜x×(Ó(Ü˜TŸZ™Z›\×/Ñ/Ó1°!Ñ4Ó5Ñ5÷ 
Ñ	Ùð +¨4¨&Ð1ˆÜ˜3ÓÐ÷ 
Õ	ús   ™A>·+A>Á,A>Á>
Bc                  óÒ   • [        5       R                  [        5      n [        R                  " U 5       Vs/ s H$  oR                  5       (       d  M  [        U5      PM&     sn$ s  snf )z7Returns a list of PIDs currently running on the system.)r   r\  r
   rb   rE  rê  r¡   )rf   rL   s     rD   rS  rS  ó  sD   € äÓ×#Ñ#¤HÓ-€DÜŸJšJ tÔ,Ó<Ò,�q·	±	·‹FŒC�ŽFÑ,Ñ<Ð<ùÒ<s   ¶A$ÁA$c                 ó�  • [         R                  " U 5      (       d  g [        5        SU  S3n[        U5       nU HD  nUR	                  S5      (       d  M  [        UR                  5       S   5      nX@:H  s  sSSS5        $    SU 3n[        U5      e! , (       d  f       g= f! [        [        4 a    U [        5       ;   s $ f = f)z[Check for the existence of a unix PID. Linux TIDs are not
supported (always return False).
Fru   r9  s   Tgid:r   Nz'Tgid' line not found in )
r   Ú
pid_existsr   r   r    r¡   rd   rè   rž   rS  )rK  rf   r�   r¬   ÚtgidrË   s         rD   r[  r[  ù  s¾   € ô ×Ò˜s×#Ñ#Øð	!ô &Ó'Ð(¨¨#¨¨gÐ6ˆDÜ˜TÔ" aÛ�DØ—‘ x×0Ó0Ü" 4§:¡:£<°¡?Ó3˜ð  $™{Ñ*÷ #Ñ"Ùð 2°$°Ð8�Ü  “oÐ%÷ #Õ"ûô œÐ$ó 	!Øœ$›&‘=Ò ð	!ús:   žB% ¹BÁ!BÁ8	B% ÂBÂ
B"ÂB% Â"B% Â%CÃCc                  óˆ  • 0 n [        5       n[        5        Hf  n [        U SU S35       nUR                  5       nSSS5        WR	                  S5      nXES-   S R                  5       n[        US   5      nXpU'   Mh     U $ ! , (       d  f       NL= f! [        [        4 a     M�  [         a  n[        U5      UeSnAff = f)zkObtain a {pid: ppid, ...} dict for all running processes in
one shot. Used to speed up Process.children().
ru   r}   Nó   )r;   r   )r   rS  r   rö   r”  rd   r¡   rF  rG  rU  r   )	r  r�   rK  r�   rõ  ÚrparÚdsetÚppidrª   s	            rD   Úppid_maprb    sÁ   € ð €CÜ!Ó#€KÜŽvˆð	Ü ˜}¨A¨c¨U°%Ð8Ô9¸QØ—v‘v“x�÷ :ð —:‘:˜dÓ#ˆDØ˜q™˜
Ð#×)Ñ)Ó+ˆDÜ�t˜A‘w“<ˆDØ�‹Hñ ð €J÷ :Õ9ûä!Ô#5Ð6ó 	ÚÜó 	-Ü˜sÓ#¨Ð,ûð	-ús3   ›B¬B½BÂ
B	ÂBÂCÂ'	CÂ0B<Â<Cc                 óF   ^ • [         R                  " T 5      U 4S j5       nU$ )zXDecorator which translates bare OSError exceptions into
NoSuchProcess and AccessDenied.
c                 ó–  >• U R                   U R                  pC T" U /UQ70 UD6$ ! [         a  n[        X45      UeS nAf[         a!  nU R                  5         [        X45      UeS nAf[         aV  nU R                  5         [        R                  R                  U R                   SU S35      (       d  [        X45      Uee S nAff = f)Nru   r}   )rK  Ú_namerU  r   rG  Ú_raise_if_zombier   rF  rb   rf   ro  r<  )r=  r�   ÚkwargsrK  ry   rª   Úfuns         €rD   ÚwrapperÚ wrap_exceptions.<locals>.wrapper5  s¹   ø€ à—H‘H˜dŸj™jˆTð	Ù�tÐ-˜dÒ- fÑ-Ð-øÜó 	3Ü˜sÓ)¨sÐ2ûÜ!ó 	4Ø×!Ñ!Ô#Ü Ó*°Ð3ûÜ ó 	Ø×!Ñ!Ô#ô —7‘7—>‘> T×%6Ñ%6Ð$7°q¸¸¸UÐ"C×DÑDÜ# CÓ.°CÐ7Øûð	ús+   š& ¦
C°<¼CÁ	A%Á%CÁ2ACÃC)Ú	functoolsÚwraps)rh  ri  s   ` rD   Úwrap_exceptionsrm  0  s'   ø€ ô
 ‡_‚_�SÓôó ðð$ €NrC   c                   ó°  • \ rS rSrSr/ SQrS rS rS rS r	\
4S jr\\S	 5       5       r\\S
 5       5       r\\S 5       5       rS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\R2                  R5                  S\R6                  " 5        S35      (       a  \S 5       r\S 5       r\S 5       r\S=S j5       r\S>S j5       r \S 5       r!\"(       d  \#(       aI  S r$\\%RL                  " S5      \%RL                  " S5      \%RL                  " S5      4S  j5       r'\S! 5       r(O\!r(\#(       a  \S" 5       r)\S# 5       r*\\%RL                  " S$5      4S% j5       r+\\%RL                  " S&5      4S' j5       r,\S( 5       r-\S) 5       r.\S* 5       r/\0(       a&  \S+ 5       r1\%RL                  " S,5      4S- jr2\S. 5       r3\4(       a  \S/ 5       r5\S0 5       r6\7" \8S15      (       a
  \S=S2 j5       r9\S3 5       r:\S4 5       r;\S?S5 j5       r<\S6 5       r=\S7 5       r>\\%RL                  " S85      4S9 j5       r?\\%RL                  " S:5      4S; j5       r@S<rAg)@ÚProcessiK  zLinux process implementation.)Ú_cacheÚ_ctimere  Ú_ppidr<  rK  c                 óX   • Xl         S U l        S U l        S U l        [	        5       U l        g rR  )rK  re  rr  rq  r   r<  )r=  rK  s     rD   r>  ÚProcess.__init__W  s'   € ØŒØˆŒ
ØˆŒ
ØˆŒÜ+Ó-ˆÕrC   c                 ó®   •  [        U R                   SU R                   S35      nUR                  S5      nXS-   US-    nUS:H  $ ! [         a     gf = f)Nru   r}   r^  r;   r<   ó   ZF)r   r<  rK  r”  rž   )r=  rõ  r_  ry  s       rD   Ú
_is_zombieÚProcess._is_zombie^  si   € ð	"Ü˜4×,Ñ,Ð-¨Q¨t¯x©x¨j¸Ð>Ó?ˆDð —:‘:˜dÓ#ˆDØ ™( T¨A¡XÐ.ˆFØ˜T‘>Ð!øô ó 	Ùð	ús   ‚%A Á
AÁAc                 ó„   • U R                  5       (       a+  [        U R                  U R                  U R                  5      eg rR  )rw  r   rK  re  rr  ©r=  s    rD   rf  ÚProcess._raise_if_zombien  s/   € Ø�?‰?×ÑÜ §¡¨$¯*©*°d·j±jÓAÐAð rC   c                 ób   • [         R                  " U R                   SU R                   35        g)z+Raise NSP if the process disappeared on us.ru   N)rb   rÓ  r<  rK  rz  s    rD   Ú_raise_if_not_aliveÚProcess._raise_if_not_aliver  s&   € ô 	�Š�4×$Ñ$Ð% Q t§x¡x jÐ1Õ2rC   c                 óø   •  [        U5      $ ! [        [        4 a\    [        R                  R                  U R                   SU R                   35      (       a  U R                  5         U[        La  Us $ e f = frä  )
rc   rF  rG  rb   rf   Úlexistsr<  rK  rf  ÚUNSET)r=  rf   r¦   s      rD   Ú	_readlinkÚProcess._readlinkx  sk   € ð	Ü˜D“>Ð!øÜ!Ô#5Ð6ó 	Ü�w‰w�‰ $×"3Ñ"3Ð!4°A°d·h±h°ZÐ@×AÑAØ×%Ñ%Ô'Ø¤5Ò(Ø#’OØð	ús   ‚
 �A(A9Á7A9c                 ó¸  • [        U R                   SU R                   S35      nUR                  S5      nXR	                  S5      S-   U nXS-   S R                  5       n0 nX5S'   US	   US
'   US   US'   US   US'   US   US'   US   US'   US   US'   US   US'   US   US'   US   US'    US   US'   U$ ! [         a    [        S5        S	US'    U$ f = f)a!  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.
ru   r}   r^  ó   (r   r;   Nry   r   ry  ra  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<  rK  r”  rù  rd   Ú
IndexErrorr   )r=  rõ  r_  ry   r’   r  s         rD   Ú_parse_stat_fileÚProcess._parse_stat_fileˆ  s-  € ô �t×(Ñ(Ð)¨¨4¯8©8¨*°EÐ:Ó;ˆð �z‰z˜$ÓˆØ—I‘I˜d“O aÑ'¨$Ð/ˆØ˜Q‘h�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   Â1B; Â;CÃCc                 ó¢   • [        U R                   SU R                   S35       nUR                  5       sSSS5        $ ! , (       d  f       g= f)zwRead /proc/{pid}/stat file and return its content.
The return value is cached in case oneshot() ctx manager is
in use.
ru   r9  N)r   r<  rK  rö   ©r=  r�   s     rD   Ú_read_status_fileÚProcess._read_status_file¯  s<   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸ÐAÔBÀaØ—6‘6“8÷ C×B×Bús   ¦A Á 
Ac                 ó¾   • [        U R                   SU R                   S35       nUR                  5       R	                  5       sS S S 5        $ ! , (       d  f       g = f)Nru   r0   )r   r<  rK  rö   rŸ   r˜  s     rD   Ú_read_smaps_fileÚProcess._read_smaps_file¹  sC   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@ÔAÀQØ—6‘6“8—>‘>Ó#÷ B×A×Aús   ¦AÁ
Ac                 ó¦   • U R                   R                  U 5        U R                  R                  U 5        U R                  R                  U 5        g rR  )r•  Úcache_activater™  rœ  rz  s    rD   Úoneshot_enterÚProcess.oneshot_enter¿  s>   € Ø×Ñ×,Ñ,¨TÔ2Ø×Ñ×-Ñ-¨dÔ3Ø×Ñ×,Ñ,¨TÕ2rC   c                 ó¦   • U R                   R                  U 5        U R                  R                  U 5        U R                  R                  U 5        g rR  )r•  Úcache_deactivater™  rœ  rz  s    rD   Úoneshot_exitÚProcess.oneshot_exitÄ  s>   € Ø×Ñ×.Ñ.¨tÔ4Ø×Ñ×/Ñ/°Ô5Ø×Ñ×.Ñ.¨tÕ4rC   c                 ó:   • [        U R                  5       S   5      $ )Nry   )r   r•  rz  s    rD   ry   ÚProcess.nameÉ  s   € ô �d×+Ñ+Ó-¨fÑ5Ó6Ð6rC   c                 óV   • U R                  U R                   SU R                   S3SS9$ )Nru   z/exer~  r  ©r‚  r<  rK  rz  s    rD   ÚexeÚProcess.exeÎ  ó5   € à�~‰~Ø× Ñ Ð!  4§8¡8 *¨DÐ1¸Bð ð 
ð 	
rC   c                 óº  • [        U R                   SU R                   S35       nUR                  5       nS S S 5        W(       d  U R	                  5         / $ UR                  S5      (       a  SOSnUR                  U5      (       a  US S nUR                  U5      nUS:X  a&  [        U5      S:X  a  SU;   a  UR                  S5      nU$ ! , (       d  f       N›= f)Nru   z/cmdliner]   ræ   rC  r   )r   r<  rK  rö   rf  re   rd   r�   )r=  r�   rõ  ÚsepÚcmdlines        rD   r¯  ÚProcess.cmdlineÔ  s½   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@ÔAÀQØ—6‘6“8ˆD÷ Bæà×!Ñ!Ô#ØˆIð Ÿ™ f×-Ñ-‰f°3ˆØ�=‰=˜×ÑØ˜˜�9ˆDØ—*‘*˜S“/ˆð �&‹=œS ›\¨QÓ.°3¸$³;Ø—j‘j “oˆGØˆ÷- BÕAús   ¦CÃ
Cc                 ó¶   • [        U R                   SU R                   S35       nUR                  5       nS S S 5        [	        W5      $ ! , (       d  f       N= f)Nru   z/environ)r   r<  rK  rö   r   )r=  r�   rõ  s      rD   ÚenvironÚProcess.environî  sJ   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@ÔAÀQØ—6‘6“8ˆD÷ Bä" 4Ó(Ð(÷ BÕAús   ¦A
Á

Ac                 óŽ   • [        U R                  5       S   5      n[        R                  " 5       n X!   $ ! [         a     g f = f)Nr†  )r¡   r•  r   Úget_terminal_maprœ   )r=  Útty_nrr;  s      rD   ÚterminalÚProcess.terminalô  sG   € ä�T×*Ñ*Ó,¨WÑ5Ó6ˆÜ×(Ò(Ó*ˆð	Ø‘<ÐøÜó 	Ùð	ús   ³7 ·
AÁAr/   ú/ioc           	      ó(  • U R                    SU R                   S3n0 n[        U5       nU H=  nUR                  5       nU(       d  M   UR	                  S5      u  pV[        U5      X%'   M?     S S S 5        U(       d  U S3n[        U5      e [        R                  " US   US   US   US   US	   US
   5      $ ! [         a     M›  f = f! , (       d  f       Nd= f! [         a*  nUR                  S   < SU SU< 3n[        U5      S eS nAff = f)Nru   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<  rK  r   rŸ   rd   r¡   rè   rp  rÄ   Úpiorœ   r�   )	r=  Úfnamer’   r�   r¬   ry   rÿ   rË   rª   s	            rD   Úio_countersÚProcess.io_counters   s6  € à×(Ñ(Ð)¨¨4¯8©8¨*°CÐ8ˆEØˆFÜ˜UÔ# qÛ�DàŸ:™:›<�Dß�tð6Ø*.¯*©*°UÓ*;™K˜Dô
 ,/¨u«:˜F›Lñ ÷ $ö Ø˜˜Ð/�Ü" 3Ó'Ð'ð0Ü—w’wØ˜8Ñ$Ø˜8Ñ$Ø˜=Ñ)Ø˜>Ñ*Ø˜8Ñ$Ø˜8Ñ$óð øô  *ó %â$ð%ú÷ $Õ#ûô0 ó 0à—x‘x ‘{‘oÐ%=¸e¸Wð E#Ø#)¡*ð.ð ô ! “o¨4Ð/ûð0úsG   ªCÁ
B;ÁCÂ,C Â;
C	ÃCÃC	Ã	CÃ
CÃ
DÃ'%DÄDc                 ó$  • U R                  5       n[        US   5      [        -  n[        US   5      [        -  n[        US   5      [        -  n[        US   5      [        -  n[        US   5      [        -  n[        R                  " X#XEU5      $ )Nrˆ  rŠ  rŒ  r�  r“  )r•  rÜ   rÝ   rÄ   Ú	pcputimes)r=  r‘   rˆ  rŠ  rŒ  r�  r‚   s          rD   rÞ   ÚProcess.cpu_times#  sŒ   € à×&Ñ&Ó(ˆÜ�f˜W‘oÓ&¬Ñ4ˆÜ�f˜W‘oÓ&¬Ñ4ˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ�v˜mÑ,Ó-´Ñ;ˆÜ�}Š}Ø˜.¸&ó
ð 	
rC   c                 ó:   • [        U R                  5       S   5      $ )zWhat CPU the process is on.r‘  ©r¡   r•  rz  s    rD   r‘  ÚProcess.cpu_num/  s   € ô �4×(Ñ(Ó*¨9Ñ5Ó6Ð6rC   Nc                 óD   • [         R                  " U R                  U5      $ rR  )r   Úwait_pidrK  )r=  Útimeouts     rD   ÚwaitÚProcess.wait4  s   € ä× Ò  §¡¨7Ó3Ð3rC   c                 óÀ   • U R                   c(  [        U R                  5       S   5      [        -  U l         U(       a  U R                   $ U R                   [	        5       -   $ )Nr�  )rq  rÜ   r•  rÝ   rX  )r=  Ú	monotonics     rD   r�  ÚProcess.create_time8  sR   € ð �;‰;Ñä�d×+Ñ+Ó-¨mÑ<Ó=ÄÑKð ŒKö Ø—;‘;Ðð �{‰{œY›[Ñ(Ð(rC   c           	      ó  • [        U R                   SU R                   S35       nS UR                  5       R	                  5       S S  5       u  p#pEpgnS S S 5        [
        R                  " WWWWWWW5      $ ! , (       d  f       N*= f)Nru   z/statmc              3   óF   #   • U  H  n[        U5      [        -  v •  M     g 7frR  )r¡   r¢   )Ú.0rL   s     rD   Ú	<genexpr>Ú&Process.memory_info.<locals>.<genexpr>W  s   é € ð 8Ú+C a”�A“œÖ!Ò+Cùs   ‚!r}  )r   r<  rK  rŒ   rd   rÄ   Úpmem)	r=  r�   ÚvmsÚrssrµ   ÚtextÚlibrõ  Údirtys	            rD   Úmemory_infoÚProcess.memory_infoI  s�   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@ÔAÀQñ8Ø+,¯:©:«<×+=Ñ+=Ó+?ÀÀÑ+Có8Ñ4ˆC�f C¨u÷ Bô �xŠx˜˜S &¨$°°T¸5ÓAÐA÷	 BÕAús   ¦.A8Á8
Bc                 óô  • S=n=p#[        U R                   SU R                   S35       nU H«  nUR                  S5      (       a$  U[	        UR                  5       S   5      S-  -  nM=  UR                  S5      (       a!  [	        UR                  5       S   5      S-  nMt  UR                  S5      (       d  MŒ  [	        UR                  5       S   5      S-  nM­     S S S 5        XU4$ ! , (       d  f       N= f)	Nr   ru   r1   s   Private_r   r²   ó   Pss:ó   Swap:)r   r<  rK  r    r¡   rd   )r=  ÚussÚpssÚswapr�   r¬   s         rD   Ú_parse_smaps_rollupÚProcess._parse_smaps_rollup^  sÛ   € ð  !Ð ˆCÐ �#ÜØ×$Ñ$Ð% Q t§x¡x j°Ð>ôàÛ�DØ—‘ {×3Ñ3àœs 4§:¡:£<°¡?Ó3°dÑ:Ñ:šØŸ™¨×1Ñ1Ü! $§*¡*£,¨q¡/Ó2°TÑ9šØŸ™¨×2Ó2Ü" 4§:¡:£<°¡?Ó3°dÑ:šñ ÷ð ˜dÐ#Ð#÷õ ús   «BC)Â:#C)Ã)
C7s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 ó,  • U R                  5       n[        [        [        UR	                  U5      5      5      S-  n[        [        [        UR	                  U5      5      5      S-  n[        [        [        UR	                  U5      5      5      S-  nXVU4$ )Nr²   )rœ  r÷   r–  r¡   Úfindall)r=  Ú_private_reÚ_pss_reÚ_swap_reÚ
smaps_datarÝ  rÞ  rß  s           rD   Ú_parse_smapsÚProcess._parse_smapsu  s€   € ð* ×.Ñ.Ó0ˆJô ”cœ#˜{×2Ñ2°:Ó>Ó?Ó@À4ÑGˆCÜ”cœ#˜wŸ™¨zÓ:Ó;Ó<¸tÑCˆCÜ”sœ3 × 0Ñ 0°Ó <Ó=Ó>ÀÑEˆDØ˜dÐ#Ð#rC   c                 ó  • [         (       a   U R                  5       u  pnOU R	                  5       u  pnU R                  5       n[        R                  " XAX#4-   6 $ ! [        [        4 a    U R	                  5       u  pn NLf = frR  )ÚHAS_PROC_SMAPS_ROLLUPrà  rG  rF  rè  rØ  rÄ   Úpfullmem)r=  rÝ  rÞ  rß  Ú	basic_mems        rD   Úmemory_full_infoÚProcess.memory_full_info’  s�   € ç$Ò$ð9Ø%)×%=Ñ%=Ó%?‘N�C™dð "&×!2Ñ!2Ó!4‘�˜$Ø×(Ñ(Ó*ˆIÜ—<’< °3Ð-=Ñ!=Ð>Ð>øô +Ô,=Ð>ó 9Ø%)×%6Ñ%6Ó%8‘N�Cšdð9ús   �A Á#BÂ Bc                 ó~  • S nU R                  5       nU(       d  U R                  5         / $ UR                  S5      n/ nUR                  S5      nU/nU" X65       GHA  u  prUR                  SS5      n Uu  pšp¼pÞU(       d  SnOF[        U5      nUR                  5       nUR                  S5      (       a  [        U5      (       d  USS	 n[        U	5      [        U
5      UUR                  S
S5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      4nUR                  U5        GMD     U$ ! [         a    US/-   u  pšp¼pÞ GN@f = f)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   ó   #   • 0 nU  Hl  nUR                  S S5      nUS   R                  S5      (       d'  UR                  5       U4v •  UR                  U5        MU   [	        US   5      S-  X$S   '   Mn     UR                  5       U4v •  g ! [
        [        4 a/    US   R                  S5      (       a   M±  SU< 3n[        U5      S ef = f7f)Né   r   r	  r   r²   s   VmFlags:z!don't know how to interpret line )rd   re   ÚpoprŽ   r¡   rè   r”  r    )r—  Úcurrent_blockrõ  r¬   r’   rË   s         rD   Ú
get_blocksÚ'Process.memory_maps.<locals>.get_blocks­  sÓ   é € Ø�Û!�DØ!ŸZ™Z¨¨aÓ0�FØ! !™9×-Ñ-¨d×3Ñ3à,×0Ñ0Ó2°DÐ9Ò9Ø%×,Ñ,¨TÖ2ð<Ü.1°&¸±)«n¸tÑ.C˜D¨¡›Oñ "ð %×(Ñ(Ó*¨DÐ1Ó1øô !+¬JÐ7ó <Ø% a™y×3Ñ3°K×@Ñ@â (Ø$EÀdÁXÐ"N˜CÜ",¨S£/°tÐ;ð<üs*   ‚ACÁBÁ3CÂ)CÂ5CÂ8CÃ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œ  rf  rd   ró  rè   r   rŸ   re   r   r›   rŽ   )r=  rõ  rõ  r—  rø   Ú
first_linerô  ÚheaderÚhfieldsrd  ÚpermsÚ_offsetÚ_devÚ_inoderf   rR  s                   rD   Úmemory_mapsÚProcess.memory_maps£  sµ  € ò2ð& ×(Ñ(Ó*ˆDö Ø×%Ñ%Ô'Ø�	Ø—J‘J˜uÓ%ˆEØˆBØŸ™ 1›ˆJØ'˜LˆMÙ *¨5× @‘�Ø Ÿ,™, t¨QÓ/�ðNØ?FÑ<�D °ö Ø#‘Dä! $›<�DØŸ:™:›<�DØ—}‘} \×2Ñ2Ô;MØ÷<ñ <ð  $ D S˜z˜ä˜4“LÜ˜5“MØØ—H‘H˜W aÓ(Ø—H‘H˜X qÓ)Ø—H‘H˜W aÓ(Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ.°Ó2Ø—H‘HÐ.°Ó2Ø—H‘H˜^¨QÓ/Ø—H‘H˜]¨AÓ.Ø—H‘H˜X qÓ)ð�ð —	‘	˜$—ñ= !Að> ˆIøô7 "ó NØ?FÈ"È¹~Ñ<�D °ºðNús   Á5F$Æ$F<Æ;F<c                 óV   • U R                  U R                   SU R                   S3SS9$ )Nru   z/cwdr~  r  r©  rz  s    rD   ÚcwdÚProcess.cwdë  r¬  rC   s   ctxt_switches:\t(\d+)c                 ó   • U R                  5       nUR                  U5      nU(       d(  SU R                   SU R                   S3n[	        U5      e[
        R                  " [        US   5      [        US   5      5      $ )NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in ru   z1/status; the kernel is probably older than 2.6.23r   r   )r™  rã  r<  rK  r  rÄ   Úpctxswr¡   )r=  Ú	_ctxsw_rerõ  ÚctxswrË   s        rD   Únum_ctx_switchesÚProcess.num_ctx_switchesñ  s}   € ð ×%Ñ%Ó'ˆØ×!Ñ! $Ó'ˆÞðà×%Ñ%Ð& a¨¯© zð 2.ð.ð ô & cÓ*Ð*Ü�zŠzœ#˜e A™h›-¬¨U°1©X«Ó7Ð7rC   s   Threads:\t(\d+)c                 ó\   • U R                  5       n[        UR                  U5      S   5      $ ©Nr   )r™  r¡   rã  )r=  Ú_num_threads_rerõ  s      rD   Únum_threadsÚProcess.num_threads  s-   € ð ×%Ñ%Ó'ˆÜ�?×*Ñ*¨4Ó0°Ñ3Ó4Ð4rC   c                 óÎ  • [         R                  " U R                   SU R                   S35      nUR	                  5         / nSnU HØ  nU R                   SU R                   SU S3n [        U5       nUR                  5       R                  5       nS S S 5        WUR                  S5      S-   S  nUR                  S	5      n[        US
   5      [        -  n	[        US   5      [        -  n
[        R                  " [!        U5      Xš5      nUR#                  U5        MÚ     U(       a  U R%                  5         U$ ! , (       d  f       N®= f! [        [        4 a    Sn GM  f = f)Nru   z/taskFz/task/r}   Tr^  r;   rÎ   r‡  r‰  )rb   rE  r<  rK  r  r   rö   rŸ   rF  rG  rù  rd   rÜ   rÝ   rÄ   Úpthreadr¡   rŽ   r}  )r=  Ú
thread_idsr
  Ú
hit_enoentÚ	thread_idr¼  r�   Ústr‘   rˆ  rŠ  r  s               rD   ÚthreadsÚProcess.threads  s;  € ä—Z’Z 4×#4Ñ#4Ð"5°Q°t·x±x°jÀÐ FÓGˆ
Ø�‰ÔØˆØˆ
Û#ˆIØ×(Ñ(Ð)¨¨4¯8©8¨*°F¸9¸+ÀUÐKˆEðÜ  Ô'¨1ØŸ™›Ÿ™Ó)�B÷ (ð �B—G‘G˜D“M AÑ%Ð'Ð(ˆBØ—X‘X˜d“^ˆFÜ˜& ™*Ó%¬Ñ3ˆEÜ˜& ™*Ó%¬Ñ3ˆEÜ—[’[¤ Y£°Ó>ˆFØ�N‰N˜6Ö"ñ! $ö" Ø×$Ñ$Ô&Øˆ÷! (Õ'ûä%Ô'9Ð:ó ð "�
Ûð	ús0   Á*EÁ5D<ÂEÄ<
E
	ÅEÅ
EÅE$Å#E$c                 óB   • [         R                  " U R                  5      $ rR  )rÑ   Úproc_priority_getrK  rz  s    rD   Únice_getÚProcess.nice_get"  s   € ô ×%Ò% d§h¡hÓ/Ð/rC   c                 óD   • [         R                  " U R                  U5      $ rR  )rÑ   Úproc_priority_setrK  )r=  rÿ   s     rD   Únice_setÚProcess.nice_set+  s   € ä×%Ò% d§h¡h°Ó6Ð6rC   c                 óB   • [         R                  " U R                  5      $ rR  )rÑ   r3   rK  rz  s    rD   Úcpu_affinity_getÚProcess.cpu_affinity_get2  s   € ä×-Ò-¨d¯h©hÓ7Ð7rC   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      ó  • U R                  5       nUR                  U5      nU(       a6  [        [        [	        US   S   5      [	        US   S   5      S-   5      5      $ [        [        [        [        5       5      5      5      $ )Nr   r   )r™  rã  rD  Úranger¡   r�   râ   )r=  Ú_rerõ  rì   s       rD   Ú_get_eligible_cpusÚProcess._get_eligible_cpus6  sk   € ð ×)Ñ)Ó+ˆDØ—K‘K Ó%ˆEÞÜœE¤# e¨A¡h¨q¡kÓ"2´C¸¸a¹À¹Ó4DÀqÑ4HÓIÓJÐJäœE¤#¤m£oÓ"6Ó7Ó8Ð8rC   c           	      óÄ  •  [         R                  " U R                  U5        g ! [        [        4 a«  n[        U[        5      (       d  UR                  [        R                  :X  ar  U R                  5       n[        [        [        [        5       5      5      5      nU H7  nXT;  a  SU< SU< 3n[	        U5      S eXS;  d  M%  SU SU 3n[	        U5      Ue   e S nAff = f)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )rÑ   Úproc_cpu_affinity_setrK  rž   rè   r`   rH  rI  r%  Útupler#  r�   râ   )r=  rà   rª   Úeligible_cpusÚall_cpusÚcpurË   s          rD   Úcpu_affinity_setÚProcess.cpu_affinity_setA  sÞ   € ðÜ×*Ò*¨4¯8©8°TÕ:øÜœZÐ(ó Ü˜c¤:×.Ñ.°#·)±)¼u¿|¹|Ó2KØ$(×$;Ñ$;Ó$=�MÜ$¤U¬3¬}«Ó+?Ó%@ÓA�HÛ#˜ØÓ.à".¨s©gð 6$Ø$1Ñ#4ð!6ð  ô #-¨S£/°tÐ;ØÕ3à"-¨c¨Uð 3,Ø,9¨?ð!<ð  ô #-¨S£/°sÐ:ñ  $ð ûð#ús   ‚!$ ¤C´BCÃCÃCc                 óˆ   • [         R                  " U R                  5      u  p[        U5      n[        R
                  " X5      $ rR  )rÑ   r2   rK  r9   rÄ   Úpionice)r=  Úioclassrÿ   s      rD   Ú
ionice_getÚProcess.ionice_get[  s1   € ä!×1Ò1°$·(±(Ó;‰NˆGÜ  Ó)ˆGÜ—;’;˜wÓ.Ð.rC   c                 óø   • Uc  SnU(       a5  U[         R                  [         R                  1;   a  U< S3n[        U5      eUS:  d  US:”  a  Sn[        U5      e[        R
                  " U R                  X5      $ )Nr   z ioclass accepts no valuer}  zvalue not in 0-7 range)r9   r#   r    rè   rÑ   Úproc_ioprio_setrK  )r=  r1  rÿ   rË   s       rD   Ú
ionice_setÚProcess.ionice_seta  sy   € à‰}Ø�Þ˜Ü×,Ñ,Ü×,Ñ,ð%ó ð !™Ð#<Ð=�Ü  “oÐ%Ø�q‹y˜E A›IØ.�Ü  “oÐ%Ü×'Ò'¨¯©°'ÓAÐArC   Úprlimitc                 óŒ  • U R                   S:X  a  Sn[        U5      e Uc!  [        R                  " U R                   U5      $ [	        U5      S:w  a  SU< 3n[        U5      e[        R                  " U R                   X5        g ! [
         a4  nUR                  [        R                  :X  a  U R                  5         e S nAff = f)Nr   z)can't use prlimit() against PID 0 processr;   z2second argument must be a (soft, hard) tuple, got )	rK  rè   Úresourcer8  r�   rž   rH  ÚENOSYSrf  )r=  Ú	resource_ÚlimitsrË   rª   s        rD   ÚrlimitÚProcess.rlimitr  s²   € ð
 �x‰x˜1‹}ØA�Ü  “oÐ%ðØ‘>ä#×+Ò+¨D¯H©H°iÓ@Ð@ô ˜6“{ aÓ'ð*Ø*0©ð5ð ô )¨›oÐ-Ü×$Ò$ T§X¡X¨yÕAøÜó Ø—9‘9¤§¡Ó,ð ×)Ñ)Ô+Øûðús   Ÿ#B ÁAB Â
CÂ/B>Â>Cc                 ót   • U R                  5       S   nUR                  5       n[        R                  US5      $ )Nry  Ú?)r•  r   ÚPROC_STATUSESr›   )r=  Úletters     rD   ry  ÚProcess.statusŽ  s3   € à×&Ñ&Ó(¨Ñ2ˆØ—‘“ˆä× Ñ  ¨Ó-Ð-rC   c                 óL  • / n[         R                  " U R                   SU R                   S35      nSnU GH)  nU R                   SU R                   SU 3n [	        U5      nUR                  S5      (       aå  [        U5      (       aÒ  U R                   SU R                   SU 3n [        U5       n[        UR                  5       R                  5       S   5      n[        UR                  5       R                  5       S   S5      n	S S S 5        [        W	5      n
[        R                  " U[        U5      [        W5      X©5      nUR                  U5        GM&  GM)  GM,     U(       a  U R-                  5         U$ ! , (       d  f       Ny= f! [        [         4 a    Sn GMn  f = f! [        [         4 a    Sn GMˆ  ["         a[  nUR$                  [$        R&                  :X  a   S nAGM¶  UR$                  [$        R(                  :X  a  [+        U5         S nAGMæ  e S nAff = f)	Nru   rA  FrB  z/fdinfo/r   r…   T)rb   rE  r<  rK  rc   r    r   r   r¡   rŒ   rd   rs   rÄ   Ú	popenfilerŽ   rF  rG  rž   rH  rI  rJ  r   r}  )r=  r
  rØ  r  rM  rs  rf   r�   Úposrp   rr   r  rª   s                rD   Ú
open_filesÚProcess.open_files•  sÑ  € àˆÜ—
’
˜d×/Ñ/Ð0°°$·(±(°¸3Ð?Ó@ˆØˆ
ÜˆBØ×'Ñ'Ð(¨¨$¯(©(¨°4¸°tÐ<ˆDð$/Ü “~�ð& —?‘? 3×'Ñ'¬M¸$×,?Ñ,?à"×/Ñ/Ð0°°$·(±(°¸8ÀBÀ4ÐH�Dð/Ü(¨Ô.°!Ü"% a§j¡j£l×&8Ñ&8Ó&:¸1Ñ&=Ó">˜CÜ$'¨¯
©
«×(:Ñ(:Ó(<¸QÑ(?ÀÓ$C˜E÷ /ô  2°%Ó8˜Ü!$§¢Ø ¤# b£'¬3¨s«8°Tó"˜ð  Ÿ™ v×.ò! -@Ò'ñ- öN Ø×$Ñ$Ô&Øˆ÷ /Õ.ûô .Ô/AÐBó *ð &*œ
ð*ûô3 &Ô'9Ð:ó à!�
ÛÜó Ø—9‘9¤§¡Ó,æØ—9‘9¤× 2Ñ 2Ó2ä˜#”JÞØûðúsU   ÁF)Â*FÂ5AE>ÄFÅ>
F	ÆFÆF&Æ%F&Æ)H#Æ?	H#ÇHÇ-)HÈHÈH#c                 ód   • [         R                  XR                  5      nU R                  5         U$ rR  )r�  r‹  rK  r}  )r=  r‡  r  s      rD   r‘  ÚProcess.net_connectionsÅ  s'   € ä×'Ñ'¨¯h©hÓ7ˆØ× Ñ Ô"Øˆ
rC   c                 ót   • [        [        R                  " U R                   SU R                   S35      5      $ )Nru   rA  )r�   rb   rE  r<  rK  rz  s    rD   Únum_fdsÚProcess.num_fdsË  s.   € ä”2—:’: ×!2Ñ!2Ð 3°1°T·X±X°J¸cÐBÓCÓDÐDrC   c                 ó:   • [        U R                  5       S   5      $ )Nra  rÃ  rz  s    rD   ra  ÚProcess.ppidÏ  s   € ä�4×(Ñ(Ó*¨6Ñ2Ó3Ð3rC   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                 ó¶   • U R                  5       nUR                  U5      S   u  p4n[        R                  " [	        U5      [	        U5      [	        U5      5      $ r  )r™  rã  rÄ   Úpuidsr¡   )r=  Ú_uids_rerõ  ÚrealÚ	effectiveÚsaveds         rD   ÚuidsÚProcess.uidsÓ  óI   € à×%Ñ%Ó'ˆØ!)×!1Ñ!1°$Ó!7¸Ñ!:Ñˆ˜Ü�yŠyœ˜T›¤C¨	£N´C¸³JÓ?Ð?rC   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                 ó¶   • U R                  5       nUR                  U5      S   u  p4n[        R                  " [	        U5      [	        U5      [	        U5      5      $ r  )r™  rã  rÄ   Úpgidsr¡   )r=  Ú_gids_rerõ  rT  rU  rV  s         rD   ÚgidsÚProcess.gidsÙ  rY  rC   )rq  re  rr  r<  rK  rR  ©F©r2  )Br>   r?   r@   rA   r�  rû  r>  rw  rf  r}  r�  r‚  rm  r   r•  r™  rœ  r   r¤  ry   rª  r¯  r²  r·  rb   rf   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_PRIORITYr2  r6  Úhasattrr:  r>  ry  rH  r‘  rM  ra  rW  r]  rB   r=   rC   rD   ro  ro  K  sÔ  † Ù'ò€Iò.ò"ò Bò3ð (-ô ð  Øñ#ó ó ð#ðJ Øñó ó ðð Øñ$ó ó ð$ò3ò
5ð
 ñ7ó ð7ð ñ
ó ð
ð
 ñó ðð2 ñ)ó ð)ð
 ñó ðð 
‡w�w‡~�~˜˜rŸyšy›{˜m¨3Ð/×0Ñ0à	ñ 	0ó 
ð 	0ðD ñ	
ó ð	
ð ñ7ó ð7ð ó4ó ð4ð ó)ó ð)ð  ñBó ðBö$ ¦ò	$ð. 
ð Ÿ
š
Ð#;Ó<Ø—J’JÐ2Ó3Ø—Z’ZÐ 4Ó5ó	$ó 
ð	$ð8 
ñ		?ó 
ñ		?ð 'Ðæà	ñE	ó 
ðE	ðN ñ
ó ð
ð
 àŸ
š
Ð#<Ó=ó8ó ð8ð Ø*,¯*ª*Ð5HÓ*Ió 5ó ð5ð
 ñó ðð4 ñ0ó ð0ð ñ7ó ð7ö à	ñ	8ó 
ð	8ð —j’jÐ!DÓEô		9ð 
ñ	ó 
ð	ö. à	ñ	/ó 
ð	/ð
 
ñ	Bó 
ð	Bñ ˆx˜×#Ñ#à	ó	ó 
ð	ð6 ñ.ó ð.ð ñ-ó ð-ð^ óó ðð
 ñEó ðEð ñ4ó ð4ð ØŸJšJÐ'DÓEó @ó ð@ð
 ØŸJšJÐ'DÓEó @ó ó@rC   ro  r`  r_  )ˆr�  r_  r  ÚenumrH  rk  rô   rb   rê   r:  r5  ra  Ú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?  rf   ro  ra  rb  rë  re  rd  rc  rç   rÝ   Úgetpagesizer¢   Ú	byteorderr]  r>  r�  rÛ  ÚIntEnumr¡   Ú	AF_PACKETr6   r7   r9   ÚglobalsrT  Ú__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_PARKEDrB  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rq  rc   rs   r{   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.  r1  rM  rO  rX  rS  r[  rb  rm  ro  r=   rC   rD   Ú<module>r~     s  ðñ
 %ã Û Û Û Û Û Û 	Û 	Û Û Û Û 
Û Ý #Ý "å Ý Ý Ý #Ý Ý $Ý $Ý 'Ý !Ý "Ý "Ý Ý Ý Ý Ý $Ý "Ý Ý +Ý  Ý Ý (Ý 'Ý "Ý "ò	€ð$ .Ð Ø—‘—‘ &¨¯ª«¨°VÐ <Ó=€ØŸ™Ÿ™¨°·	²	³¨}¸MÐ'JÓKÐ Ù˜tÐ%6Ó7Ð Ù˜4Ð!8Ó9Ð ð �jŠj˜Ó&€Ø×ÒÓ€Ø—‘ Ñ)€Ù‹€ð Ð à—’Ø�i¡ V×%5Ñ%5Ó!6Ð7ó€ð ×
Ñ
€ô�—‘ô ñ ƒ	× Ñ �×'Ñ'Ô (ð 
×	Ñ	Ø	×	 Ñ	 Ø	×	"Ñ	"Ø	×	Ñ	Ø	×	$Ñ	$Ø	×	Ñ	Ø	×	Ñ	Ø	×	Ñ	Ø	×	!Ñ	!Ø	×	Ñ	Ø	×	Ñ	Ø	×	Ñ	ñ€ð" ×
"Ñ
"Ø
×
Ñ
Ø
×
Ñ
Ø
×
 Ñ
 Ø
×
 Ñ
 Ø
×
 Ñ
 Ø
×
Ñ
Ø
×
!Ñ
!Ø
×
Ñ
Ø
×
Ñ
Ø
×
Ñ
ñ€ò(ò(
ò$ð& 	ñ+ó 	ð+ð0OÙ% gÓ.€C„Mð �M‰M€	ò<ò~~òB4<ñp ˆ4�×ÑØ—‘€IØ—‘€Iò"òò&ò:'òTNò.
ð ‡7�7‡>�>Ð;×<Ñ<ÀÇÁÇÁØ*÷Añ Aó#òNLð × Ñ €ô	˜Iô 	÷iñ iñX "Ó#Ð ô+ò
,ò^ðB × Ñ €
ôf÷RHñ HôV$òXsòlò>W:ò~ò ò =ò!òBò,÷6R
@ò R
@øðO+ ó Oá	Ð*¨3©'Ð
2Ô3Ù˜{Ð,>Ô?ÀÀSÈ#ÓN€C‡M‚MûðOús   ÌP ÐQÐ#"QÑQ