o
    îðhâo  ã                
   @   sˆ  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m
Z
 ddlmZ ddlmZ ddlmZ zddlmZ W n eyQ   dZY nw zddlmZ W n eye   dZY nw ee d	¡ƒZeƒ Zg d
¢ZejdkZejdkZej d¡Zej d¡ZeZej d¡Zej d¡Z ej d¡Z!ep£e p£e!Z"ej d¡Z#ej d¡Z$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>G d.d/„ d/ej?ƒZ@eAƒ  Be@jC¡ G d0d1„ d1ej?ƒZDeAƒ  BeDjC¡ e E¡ ZFe G¡ ZHe
d2g d3¢ƒZIe
d4g d5¢ƒZJe
d6g d7¢ƒZKe
d8g d9¢ƒZLe
d:g d;¢ƒZMe
d<g d=¢ƒZNe
d>g d?¢ƒZOe
d@g dA¢ƒZPe
dBg dC¢ƒZQe
dDg dE¢ƒZRe
dFg dG¢ƒZSe
dHg dI¢ƒZTe
dJg dK¢ƒZUe
dLdMdNgƒZVe
dOg dP¢ƒZWe
dQdRdSgƒZXe
dTg dU¢ƒZYe
dVg dW¢ƒZZe
dXg dW¢ƒZ[e
dYg dZ¢ƒZ\e
d[d\d]gƒZ]e
d^d_d`gƒZ^e
dag db¢ƒZ_e
dcdddegƒZ`eeegeegfeegegfegegfeegegfegegfeegeegfegeegfegeegfdfœZaedurýea Begegfegegfdgœ¡ edure#sea Bdhegeegfi¡ G didj„ djebƒZcG dkdl„ dlecƒZdG dmdn„ dnedƒZeG dodp„ dpecƒZfG dqdr„ drecƒZgd¨dsdt„Zhdudv„ Zidwdx„ Zjdydz„ Zkd{d|„ Zleid}d~„ ƒZmdd€„ Zndd‚„ Zodƒd„„ Zpd¨d…d†„Zqd‡dˆ„ Zrd‰dŠ„ ZsG d‹dŒ„ dŒƒZtddŽ„ Zuetƒ Zvevjweu_wevjxeu_xdZydd‘„ Zzd’d“„ Z{ee{fd”d•„Z|efd–d—„Z}d©d™dš„Z~d›dœ„ Zddž„ Z€eiejfdŸd „ƒZ‚dªd¢d£„Zƒdd¡ejfd¤d¥„Z„d¦d§„ Z…dS )«zCommon objects shared by __init__.py and _ps*.py modules.

Note: this module is imported by setup.py, so it should not import
psutil or third-party modules.
é    N)Ú
namedtuple)ÚAF_INET)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚAF_INET6)ÚAF_UNIXÚPSUTIL_DEBUG)RÚFREEBSDÚBSDÚLINUXÚNETBSDÚOPENBSDÚMACOSÚOSXÚPOSIXÚSUNOSÚWINDOWSÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_CLOSINGÚCONN_ESTABLISHEDÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_LAST_ACKÚCONN_LISTENÚ	CONN_NONEÚCONN_SYN_RECVÚCONN_SYN_SENTÚCONN_TIME_WAITÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNÚSTATUS_DEADÚSTATUS_DISK_SLEEPÚSTATUS_IDLEÚSTATUS_LOCKEDÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_STOPPEDÚSTATUS_SUSPENDEDÚSTATUS_TRACING_STOPÚSTATUS_WAITINGÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_ZOMBIEÚSTATUS_PARKEDÚENCODINGÚENCODING_ERRSr   ÚpconnÚ	pcputimesÚpctxswÚpgidsÚpioÚpioniceÚ	popenfileÚpthreadÚpuidsÚsconnÚ	scpustatsÚsdiskioÚ	sdiskpartÚ
sdiskusageÚsnetioÚsnicaddrÚ	snicstatsÚsswapÚsuserÚ	conn_tmapÚdeprecated_methodÚisfile_strictÚmemoizeÚparse_environ_blockÚpath_exists_strictÚusage_percentÚsupports_ipv6Úsockfam_to_enumÚsocktype_to_enumÚwrap_numbersÚ	open_textÚopen_binaryÚcatÚbcatÚbytes2humanÚconn_to_ntupleÚdebugÚhiliteÚterm_supports_colorsÚprint_colorÚposixÚntÚlinuxÚdarwin)ÚfreebsdÚmidnightbsdÚopenbsdÚnetbsd)ÚsunosÚsolarisÚaixÚrunningÚsleepingz
disk-sleepÚstoppedztracing-stopÚzombieÚdeadz	wake-killÚwakingÚidleÚlockedÚwaitingÚ	suspendedÚparkedÚESTABLISHEDÚSYN_SENTÚSYN_RECVÚ	FIN_WAIT1Ú	FIN_WAIT2Ú	TIME_WAITÚCLOSEÚ
CLOSE_WAITÚLAST_ACKÚLISTENÚCLOSINGÚNONEc                   @   s   e Zd ZdZdZdZdS )Ú	NicDuplexé   é   r   N)Ú__name__Ú
__module__Ú__qualname__r   r    r!   © r‚   r‚   úB/var/www/vscode/kcb/lib/python3.10/site-packages/psutil/_common.pyr|   €   s    r|   c                   @   s   e Zd ZdZdZdS )ÚBatteryTimeéÿÿÿÿéþÿÿÿN)r   r€   r   ÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDr‚   r‚   r‚   rƒ   r„   Š   s    r„   rC   )ÚtotalÚusedÚfreeÚpercentÚsinÚsoutr?   )r‰   rŠ   r‹   rŒ   r=   )Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚ	read_timeÚ
write_timer>   )ÚdeviceÚ
mountpointÚfstypeÚoptsr@   )Ú
bytes_sentÚ
bytes_recvÚpackets_sentÚpackets_recvÚerrinÚerroutÚdropinÚdropoutrD   )ÚnameÚterminalÚhostÚstartedÚpidr;   )ÚfdÚfamilyÚtypeÚladdrÚraddrÚstatusr¥   rA   )r§   ÚaddressÚnetmaskÚ	broadcastÚptprB   )ÚisupÚduplexÚspeedÚmtuÚflagsr<   )Úctx_switchesÚ
interruptsÚsoft_interruptsÚsyscallsÚscpufreq)ÚcurrentÚminÚmaxÚshwtemp)Úlabelrº   ÚhighÚcriticalÚsbattery)rŒ   ÚsecsleftÚpower_pluggedÚsfanr¾   rº   r3   )ÚuserÚsystemÚchildren_userÚchildren_systemr8   Úpathr¦   r9   )ÚidÚ	user_timeÚsystem_timer:   )ÚrealÚ	effectiveÚsavedr5   r6   )r   r   r‘   r’   r7   ÚioclassÚvaluer4   Ú	voluntaryÚinvoluntaryr2   )r¦   r§   r¨   r©   rª   r«   ÚaddrÚipÚport)ÚallÚtcpÚtcp4ÚudpÚudp4ÚinetÚinet4Úinet6)Útcp6Úudp6Úunixc                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚErrorzQBase exception class. All other psutil exceptions inherit
    from this one.
    Úpsutilc                 C   s>   t  ¡ }|D ]}t| |d ƒ}|s|dkr|dkr|||< q|S )Nr¥   r   )ÚcollectionsÚOrderedDictÚgetattr)ÚselfÚattrsÚinfor¡   rÑ   r‚   r‚   rƒ   Ú	_infodict  s   €zError._infodictc                 C   sR   |   d¡}|rd d dd„ | ¡ D ƒ¡¡}nd }d dd„ t| dd	ƒ|fD ƒ¡S )
N)r¥   Úppidr¡   z({})ú, c                 S   ó   g | ]\}}|› d |›‘qS ©ú=r‚   ©Ú.0ÚkÚvr‚   r‚   rƒ   Ú
<listcomp>  ó    z!Error.__str__.<locals>.<listcomp>ú c                 S   s   g | ]}|r|‘qS r‚   r‚   )rñ   Úxr‚   r‚   rƒ   rô     s    ÚmsgÚ )rê   ÚformatÚjoinÚitemsræ   ©rç   ré   Údetailsr‚   r‚   rƒ   Ú__str__  s   
ÿ zError.__str__c                 C   s8   |   d¡}d dd„ | ¡ D ƒ¡}d| jj› d|› dS )N)r¥   rë   r¡   Úsecondsrø   rì   c                 S   rí   rî   r‚   rð   r‚   r‚   rƒ   rô   "  rõ   z"Error.__repr__.<locals>.<listcomp>zpsutil.ú(ú))rê   rû   rü   Ú	__class__r   rý   r‚   r‚   rƒ   Ú__repr__  s   
zError.__repr__N)r   r€   r   Ú__doc__rê   rÿ   r  r‚   r‚   r‚   rƒ   râ     s    râ   c                   @   ó&   e Zd ZdZdZddd„Zdd„ ZdS )	ÚNoSuchProcesszXException raised when a process with a certain PID doesn't
    or no longer exists.
    rã   Nc                 C   ó$   t  | ¡ || _|| _|pd| _d S )Nzprocess no longer exists©râ   Ú__init__r¥   r¡   rø   ©rç   r¥   r¡   rø   r‚   r‚   rƒ   r
  -  ó   
zNoSuchProcess.__init__c                 C   ó   | j | j| j| jffS ©N©r  r¥   r¡   rø   ©rç   r‚   r‚   rƒ   Ú
__reduce__3  ó   zNoSuchProcess.__reduce__©NN©r   r€   r   r  r
  r  r‚   r‚   r‚   rƒ   r  &  s
    
r  c                   @   r  )	ÚZombieProcessa1  Exception raised when querying a zombie process. This is
    raised on macOS, BSD and Solaris only, and not always: depending
    on the query the OS may be able to succeed anyway.
    On Linux all zombie processes are querable (hence this is never
    raised). Windows doesn't have zombie processes.
    rã   Nc                 C   s$   t  | |||¡ || _|pd| _d S )Nz"PID still exists but it's a zombie)r  r
  rë   rø   )rç   r¥   r¡   rë   rø   r‚   r‚   rƒ   r
  A  s   zZombieProcess.__init__c                 C   s   | j | j| j| j| jffS r  )r  r¥   r¡   rë   rø   r  r‚   r‚   rƒ   r  F  s   zZombieProcess.__reduce__©NNNr  r‚   r‚   r‚   rƒ   r  7  s
    
r  c                   @   r  )	ÚAccessDeniedz@Exception raised when permission to perform an action is denied.rã   Nc                 C   r  )Nrù   r	  r  r‚   r‚   rƒ   r
  O  r  zAccessDenied.__init__c                 C   r  r  r  r  r‚   r‚   rƒ   r  U  r  zAccessDenied.__reduce__r  r  r‚   r‚   r‚   rƒ   r  J  s
    
r  c                   @   r  )	ÚTimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process
    is still alive.
    rã   Nc                 C   s.   t  | ¡ || _|| _|| _d|› d| _d S )Nztimeout after z seconds)râ   r
  r   r¥   r¡   rø   )rç   r   r¥   r¡   r‚   r‚   rƒ   r
  `  s
   
zTimeoutExpired.__init__c                 C   r  r  )r  r   r¥   r¡   r  r‚   r‚   rƒ   r  g  r  zTimeoutExpired.__reduce__r  r  r‚   r‚   r‚   rƒ   r  Y  s
    
r  c                 C   s@   z
t | ƒ| d }W n
 ty   Y dS w |durt||ƒ}|S )z5Calculate percentage usage of 'used' against 'total'.éd   g        N)ÚfloatÚZeroDivisionErrorÚround)rŠ   r‰   Úround_Úretr‚   r‚   rƒ   rK   p  s   ÿ
rK   c                    s2   t  ˆ¡‡ ‡fdd„ƒ}‡ fdd„}i ‰ ||_|S )a¹  A simple memoize decorator for functions supporting (hashable)
    positional arguments.
    It also provides a cache_clear() function for clearing the cache:

    >>> @memoize
    ... def foo()
    ...     return 1
        ...
    >>> foo()
    1
    >>> foo.cache_clear()
    >>>

    It supports:
     - functions
     - classes (acts as a @singleton)
     - staticmethods
     - classmethods

    It does NOT support:
     - methods
    c                     sn   | t t| ¡ ƒƒf}zˆ | W S  ty6   zˆ| i |¤Ž }ˆ |< W | Y S  ty5 } z|d ‚d }~ww w r  )Ú	frozensetÚsortedrü   ÚKeyErrorÚ	Exception)ÚargsÚkwargsÚkeyr  Úerr©ÚcacheÚfunr‚   rƒ   Úwrapper”  s   
þ€ÿýzmemoize.<locals>.wrapperc                      s   ˆ   ¡  dS )zClear cache.N)Úclearr‚   )r(  r‚   rƒ   Úcache_clear   ó   zmemoize.<locals>.cache_clear)Ú	functoolsÚwrapsr,  )r)  r*  r,  r‚   r'  rƒ   rH   |  s   rH   c                    s6   t  ˆ ¡‡ fdd„ƒ}dd„ }dd„ }||_||_|S )aú  A memoize decorator which is disabled by default. It can be
    activated and deactivated on request.
    For efficiency reasons it can be used only against class methods
    accepting no arguments.

    >>> class Foo:
    ...     @memoize
    ...     def foo()
    ...         print(1)
    ...
    >>> f = Foo()
    >>> # deactivated (default)
    >>> foo()
    1
    >>> foo()
    1
    >>>
    >>> # activated
    >>> foo.cache_activate(self)
    >>> foo()
    1
    >>> foo()
    >>> foo()
    >>>
    c                    s°   z| j ˆ  }W |S  ty&   zˆ | ƒW  Y S  ty% } z|d ‚d }~ww  tyW   zˆ | ƒ}W n tyA } z|d ‚d }~ww z	|| j ˆ < W Y |S  tyV   Y Y |S w w r  )Ú_cacheÚAttributeErrorr"  r!  )rç   r  r&  ©r)  r‚   rƒ   r*  Ä  s2   í€ÿ€ÿüü÷z'memoize_when_activated.<locals>.wrapperc                 S   s
   i | _ dS )zsActivate cache. Expects a Process instance. Cache will be
        stored as a "_cache" instance attribute.
        N)r0  ©Úprocr‚   r‚   rƒ   Úcache_activateÞ  s   
z.memoize_when_activated.<locals>.cache_activatec                 S   s    z| ` W dS  ty   Y dS w )zDeactivate and clear cache.N)r0  r1  r3  r‚   r‚   rƒ   Úcache_deactivateä  s
   
ÿz0memoize_when_activated.<locals>.cache_deactivate)r.  r/  r5  r6  )r)  r*  r5  r6  r‚   r2  rƒ   Úmemoize_when_activated©  s   r7  c                 C   s>   zt  | ¡}W n ty   ‚  ty   Y dS w t |j¡S )zSame as os.path.isfile() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html.
    F)ÚosÚstatÚPermissionErrorÚOSErrorÚS_ISREGÚst_mode)rÉ   Ústr‚   r‚   rƒ   rG   ð  s   ÿrG   c                 C   s4   zt  | ¡ W dS  ty   ‚  ty   Y dS w )zSame as os.path.exists() but does not swallow EACCES / EPERM
    exceptions. See:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html.
    FT)r8  r9  r:  r;  )rÉ   r‚   r‚   rƒ   rJ   ÿ  s   ûÿrJ   c                  C   sj   t jrtdu r	dS z!t   tt j¡} |  d¡ W d  ƒ W dS 1 s#w   Y  W dS  ty4   Y dS w )z2Return True if IPv6 is supported on this platform.NF)z::1r   T)ÚsocketÚhas_ipv6r   r   Úbindr;  )Úsockr‚   r‚   rƒ   rL     s   
ÿþÿrL   c                 C   sx   i }d}t }	 |  d|¡}||kr	 |S |  d||¡}||kr7| ||… }| |d |… }|r3| ¡ }|||< |d }q)zCParse a C environ block of environment variables into a dictionary.r   Tú rï   r~   )r   ÚfindÚupper)Údatar  ÚposÚWINDOWS_Únext_posÚ	equal_posr%  rÑ   r‚   r‚   rƒ   rI     s"   öòrI   c                 C   ó$   zt  | ¡W S  ty   |  Y S w )zConvert a numeric socket family value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    )r?  ÚAddressFamilyÚ
ValueError©Únumr‚   r‚   rƒ   rM   7  ó
   ÿrM   c                 C   rK  )zConvert a numeric socket type value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    )r?  Ú
SocketKindrM  rN  r‚   r‚   rƒ   rN   A  rP  rN   c                 C   sŒ   |t jthv r|rt|Ž }|rt|Ž }|t jkr%|tthv r%| |t¡}nt}t|ƒ}t|ƒ}|du r<t	| |||||ƒS t
| ||||||ƒS )z2Convert a raw connection tuple to a proper ntuple.N)r?  r   r   rÔ   r   Úgetr   rM   rN   r2   r;   )r¦   ÚfamÚtype_r©   rª   r«   Ú
status_mapr¥   r‚   r‚   rƒ   rU   K  s   rU   c                 C   sx   ddl }| jr
| jsdS | jtjkr#t|j| j› d| j› ddjƒS | jtj	kr:t|j
| j› d| j› ddjƒS dS )zbGiven the address ntuple returned by ``net_if_addrs()``
    calculates the broadcast address.
    r   Nú/F)Ústrict)Ú	ipaddressr¬   r­   r§   r?  r   ÚstrÚIPv4NetworkÚbroadcast_addressr   ÚIPv6Network)rÔ   rX  r‚   r‚   rƒ   Úbroadcast_addr^  s$   ÿýÿýÿr]  c                    s   ‡ fdd„}|S )zƒA decorator which can be used to mark a method as deprecated
    'replcement' is the method name which will be called instead.
    c                    s>   | j › dˆ› d‰ | jd u rˆ | _t | ¡‡ ‡fdd„ƒ}|S )Nz*() is deprecated and will be removed; use z
() insteadc                    s$   t jˆ tdd t| ˆƒ|i |¤ŽS )Nr}   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚDeprecationWarningræ   )rç   r#  r$  )rø   Úreplacementr‚   rƒ   Úinner  s   z/deprecated_method.<locals>.outer.<locals>.inner)r   r  r.  r/  )r)  rd  ©rc  )rø   rƒ   Úoutery  s   ÿÿ
z deprecated_method.<locals>.outerr‚   )rc  rf  r‚   re  rƒ   rF   t  s   rF   c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	d
S )Ú_WrapNumberszNWatches numbers so that they don't overflow and wrap
    (reset to zero).
    c                 C   s    t  ¡ | _i | _i | _i | _d S r  )Ú	threadingÚLockÚlockr(  Ú	remindersÚreminder_keysr  r‚   r‚   rƒ   r
    s   

z_WrapNumbers.__init__c                 C   sX   || j vsJ ‚|| jvsJ ‚|| jvsJ ‚|| j |< t t¡| j|< t t¡| j|< d S r  )r(  rk  rl  rä   ÚdefaultdictÚintÚset)rç   Ú
input_dictr¡   r‚   r‚   rƒ   Ú	_add_dict–  s   
z_WrapNumbers._add_dictc                 C   s\   | j | }t| ¡ ƒt| ¡ ƒ }|D ]}| j| | D ]}| j| |= q| j| |= qdS )z†In case the number of keys changed between calls (e.g. a
        disk disappears) this removes the entry from self.reminders.
        N)r(  ro  Úkeysrl  rk  )rç   rp  r¡   Úold_dictÚ	gone_keysÚgone_keyÚremkeyr‚   r‚   rƒ   Ú_remove_dead_remindersž  s   
ýz#_WrapNumbers._remove_dead_remindersc              	   C   s   || j vr|  ||¡ |S |  ||¡ | j | }i }|D ]\}|| }z|| }W n ty5   |||< Y qw g }tt|ƒƒD ]3}	||	 }
||	 }||	f}|
|k re| j| |  |7  < | j| |  |¡ | 	|
| j| |  ¡ q>t
|ƒ||< q|| j |< |S )zlCache dict and sum numbers which overflow and wrap.
        Return an updated copy of `input_dict`.
        )r(  rq  rw  r!  ÚrangeÚlenrk  rl  ÚaddÚappendÚtuple)rç   rp  r¡   rs  Únew_dictr%  Úinput_tupleÚ	old_tupleÚbitsÚiÚinput_valueÚ	old_valuerv  r‚   r‚   rƒ   Úrun©  s4   

ü
z_WrapNumbers.runNc                 C   sŽ   | j : |du r| j ¡  | j ¡  | j ¡  n| j |d¡ | j |d¡ | j |d¡ W d  ƒ dS W d  ƒ dS 1 s@w   Y  dS )z>Clear the internal cache, optionally only for function 'name'.N)rj  r(  r+  rk  rl  Úpop)rç   r¡   r‚   r‚   rƒ   r,  Ð  s   

ø"üz_WrapNumbers.cache_clearc                 C   s:   | j  | j| j| jfW  d  ƒ S 1 sw   Y  dS )z5Return internal cache dicts as a tuple of 3 elements.N)rj  r(  rk  rl  r  r‚   r‚   rƒ   Ú
cache_infoÜ  s   $ÿz_WrapNumbers.cache_infor  )
r   r€   r   r  r
  rq  rw  r„  r,  r†  r‚   r‚   r‚   rƒ   rg  ‹  s    
'rg  c                 C   s6   t j t  | |¡W  d  ƒ S 1 sw   Y  dS )zÅGiven an `input_dict` and a function `name`, adjust the numbers
    which "wrap" (restart from zero) across different calls by adding
    "old value" to "new value" and return an updated dict.
    N)Ú_wnrj  r„  )rp  r¡   r‚   r‚   rƒ   rO   â  s   
$ÿrO   i €  c                 C   s   t | dtdS )NÚrb)Ú	buffering)ÚopenÚFILE_READ_BUFFER_SIZE)Úfnamer‚   r‚   rƒ   rQ   ý  ó   rQ   c                 C   sH   t | tttd}zt|_W |S  ty   Y |S  ty#   | ¡  ‚ w )zaOpen a file in text mode by using the proper FS encoding and
    en/decoding error handlers.
    )r‰  ÚencodingÚerrors)rŠ  r‹  r0   r1   Ú_CHUNK_SIZEr1  r"  Úclose)rŒ  Úfobjr‚   r‚   rƒ   rP     s    üúüþrP   c                 C   sŒ   |t u r|| ƒ}| ¡ W  d  ƒ S 1 sw   Y  dS z|| ƒ}| ¡ W  d  ƒ W S 1 s3w   Y  W dS  tyE   | Y S w )zÛRead entire file content and return it as a string. File is
    opened in text mode. If specified, `fallback` is the value
    returned in case of error, either if the file does not exist or
    it can't be read().
    N)Ú_DEFAULTÚreadr;  )rŒ  ÚfallbackÚ_openÚfr‚   r‚   rƒ   rR     s   
$ÿ
(ÿÿrR   c                 C   s   t | |tdS )z,Same as above but opens file in binary mode.)r•  r–  )rR   rQ   )rŒ  r•  r‚   r‚   rƒ   rS   ,  s   rS   ú%(value).1f%(symbol)sc                 C   sŽ   d}i }t |dd… ƒD ]\}}d|d d > ||< qt|dd… ƒD ]}t| ƒ|| kr<t| ƒ||  }|tƒ    S q#|t|d | d S )zÚUsed by various scripts. See: https://code.activestate.com/recipes/578019-bytes-to-human-human-to-bytes-converter/?in=user-4178764.

    >>> bytes2human(10000)
    '9.8K'
    >>> bytes2human(100001221)
    '95.4M'
    )	ÚBÚKÚMÚGÚTÚPÚEÚZÚYr~   Né
   r   )ÚsymbolrÑ   )Ú	enumerateÚreversedÚabsr  ÚlocalsÚdict)Únrú   ÚsymbolsÚprefixr  Úsr£  rÑ   r‚   r‚   rƒ   rT   1  s   þrT   c                   C   s   t jd jS )z+Return updated psutil.PROCFS_PATH constant.rã   )ÚsysÚmodulesÚPROCFS_PATHr‚   r‚   r‚   rƒ   Úget_procfs_pathD  r-  r°  c                 C   s   | j ttdS )N)rŽ  r  )Údecoder0   r1   )r¬  r‚   r‚   rƒ   r±  I  r  r±  c                 C   sX   t jdkrdS zdd l}|  ¡ sJ ‚| ¡  | d¡dksJ ‚W dS  ty+   Y dS w )Nr[   Tr   ÚcolorsF)r8  r¡   ÚcursesÚisattyÚ	setuptermÚtigetnumr"  )Úfiler³  r‚   r‚   rƒ   rX   R  s   
ýÿrX   Fc                 C   sž   t ƒ s| S g }tddddddddd	d
	}d|d< z|| }W n ty6   d|›dt| ¡ ƒ› }t|ƒd‚w | |¡ |rC| d¡ dd |¡› d| › dS )z*Return an highlighted version of 'string'.Ú34Ú33Ú30Ú32Ú37Ú36Ú91Ú35Ú93)	ÚblueÚbrownÚdarkgreyÚgreenÚgreyÚ	lightblueÚredÚvioletÚyellowÚ29Núinvalid color z; choose amongst Ú1z[ú;Úmz[0m)rX   r¨  r!  Úlistrr  rM  r{  rû   )r¬  ÚcolorÚboldÚattrr²  rø   r‚   r‚   rƒ   rW   b  s2   ÷
þ

rW   c              	   C   s  t ƒ st| |d dS trtt| ||ƒ|d dS ddl}d}|jjj}|jjj}t	ddddd}||d< z|| }W n t
yS   d	|›d
t| ¡ ƒ›}	t|	ƒd‚w |r^|dkr^|d7 }|tju rednd}
|j|_||
ƒ}|||ƒ zt| |d W |||ƒ dS |||ƒ w )z$Print a colorized version of string.©r·  r   Né   r}   é   é   )rÄ  rÇ  rÂ  rÉ  rË  z; choose between é   iôÿÿÿiõÿÿÿ)rX   Úprintr   rW   ÚctypesÚwindllÚKernel32ÚGetStdHandleÚSetConsoleTextAttributer¨  r!  rÏ  rr  rM  r­  ÚstderrÚc_ulongÚrestype)r¬  rÐ  rÑ  r·  rÙ  ÚDEFAULT_COLORrÜ  rÝ  r²  rø   Ú	handle_idÚhandler‚   r‚   rƒ   rY   ~  s:   
ÿ
ÿÿ
û
rY   c                 C   sx   t r:ddl}| | ¡ j¡\}}}}}t| tƒr(t| tƒr#d| › } nd| ›} td|› d|› d| › t	j
d dS dS )z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.r   Nz	ignoring zpsutil-debug [ú:z]> rÓ  )r   ÚinspectÚgetframeinfoÚcurrentframeÚf_backÚ
isinstancer"  r;  rØ  r­  rÞ  )rø   rå  rŒ  ÚlinenoÚ_Ú_linesÚ_indexr‚   r‚   rƒ   rV   ¦  s   ÿ



ÿôrV   r  )r˜  )NF)†r  rä   Úenumr.  r8  r?  r9  r­  rh  r`  r   r   r   r   r   ÚImportErrorr   ÚboolÚgetenvr   Úobjectr“  Ú__all__r¡   r   r   ÚplatformÚ
startswithr   r   r   r	   r   r   r
   r   ÚAIXr&   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   ÚIntEnumr|   ÚglobalsÚupdateÚ__members__r„   Úgetfilesystemencodingr0   Úgetfilesystemencodeerrorsr1   rC   r?   r=   r>   r@   rD   r;   rA   rB   r<   r¹   r½   rÁ   rÄ   r3   r8   r9   r:   r5   r6   r7   r4   r2   rÔ   rE   r"  râ   r  r  r  r  rK   rH   r7  rG   rJ   rL   rI   rM   rN   rU   r]  rF   rg  rO   r‡  r,  r†  r‹  rQ   rP   rR   rS   rT   r°  r±  ÚstdoutrX   rW   rY   rV   r‚   r‚   r‚   rƒ   Ú<module>   sB  ÿÿ
&
	ÿÿÿÿÿÿÿ	

ø


þ!
-G



W	
	

ÿ(