o
    ÷3ÂaMg  ã                
   @   s  d Z ddlmZ ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddl	mZ ddl	mZ ddl	mZ zdd	l	mZ W n eya   dZY nw zdd
l	mZ W n eyu   dZY nw ejdkr€ddlZndZejd dkZee dd¡ƒ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Z0dZ1d Z2d!Z3d"Z4d#Z5d$Z6d%Z7d&Z8d'Z9d(Z:d)Z;d*Z<d+Z=d,Z>d-Z?d.Z@d/ZAd0ZBd1ZCedu �rd2ZDd3ZEdZFnG d4d5„ d5ejGƒZHeIƒ  JeHjK¡ edu �r+d6ZLd7ZMnG d8d9„ d9ejGƒZNeIƒ  JeNjK¡ e O¡ ZPe�sEd:ZQnze R¡ ZQW n eS�y\   e�rXd;nd:ZQY nw ed<g d=¢ƒZTed>g d?¢ƒZUed@g dA¢ƒZVedBg dC¢ƒZWedDg dE¢ƒZXedFg dG¢ƒZYedHg dI¢ƒZZedJg dK¢ƒZ[edLg dM¢ƒZ\edNg dO¢ƒZ]edPg dQ¢ƒZ^edRg dS¢ƒZ_edTg dU¢ƒZ`edVdWdXgƒZaedYg dZ¢ƒZbed[d\d]gƒZced^g d_¢ƒZded`g da¢ƒZeedbg da¢ƒZfedcg dd¢ƒZgededfdggƒZhedhdidjgƒZiedkg dl¢ƒZjedmdndogƒZke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dpœZledu�rNel Jegegfegegfdqœ¡ edu�r_el Jdregeegfi¡ G dsdt„ dtemƒZnG dudv„ dvenƒZoG dwdx„ dxeoƒZpG dydz„ dzenƒZqG d{d|„ d|enƒZrd¬d}d~„Zsdd€„ Ztd�d‚„ Zudƒd„„ Zvd…d†„ Zwetd‡dˆ„ ƒZxd‰dŠ„ Zyd‹dŒ„ Zzd�dŽ„ Z{d¬d�d�„Z|d‘d’„ Z}G d“d”„ d”ƒZ~d•d–„ Ze~ƒ Z€e€j�e_�e€j‚e_‚d—d˜„ Zƒd™dš„ Z„d­dœd�„Z…dždŸ„ Z†e�ræd d¡„ Z‡nd¢d¡„ Z‡etejˆfd£d¤„ƒZ‰d®d¦d§„ZŠdd¥ejˆfd¨d©„Z‹dªd«„ ZŒdS )¯z9Common objects shared by __init__.py and _ps*.py modules.é    )Údivision)Úprint_functionN)Ú
namedtuple)ÚAF_INET)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚAF_INET6)ÚAF_UNIX)é   é   r
   ÚPSUTIL_DEBUG)NÚ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Ú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ÚNONEé   é   c                   @   s   e Zd ZdZdZdZdS )Ú	NicDuplexr|   r}   r   N)Ú__name__Ú
__module__Ú__qualname__r#   r$   r%   © r‚   r‚   ú0/usr/lib/python3/dist-packages/psutil/_common.pyr~   Š   s    r~   éÿÿÿÿéþÿÿÿc                   @   s   e Zd ZdZdZdS )ÚBatteryTimer„   r…   N)r   r€   r�   ÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDr‚   r‚   r‚   rƒ   r†   –   s    r†   ÚreplaceÚsurrogateescaperG   )ÚtotalÚusedÚfreeÚpercentÚsinÚsoutrC   )r‹   rŒ   r�   rŽ   rA   )Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesÚ	read_timeÚ
write_timerB   )ÚdeviceÚ
mountpointÚfstypeÚoptsÚmaxfileÚmaxpathrD   )Ú
bytes_sentÚ
bytes_recvÚpackets_sentÚpackets_recvÚerrinÚerroutÚdropinÚdropoutrH   )ÚnameÚterminalÚhostÚstartedÚpidr?   )ÚfdÚfamilyÚtypeÚladdrÚraddrÚstatusr©   rE   )r«   ÚaddressÚnetmaskÚ	broadcastÚptprF   )ÚisupÚduplexÚspeedÚmtur@   )Úctx_switchesÚ
interruptsÚsoft_interruptsÚsyscallsÚscpufreq)ÚcurrentÚminÚmaxÚshwtemp)Úlabelr½   ÚhighÚcriticalÚsbattery)rŽ   ÚsecsleftÚpower_pluggedÚsfanrÁ   r½   r7   )ÚuserÚsystemÚchildren_userÚchildren_systemr<   Úpathrª   r=   )ÚidÚ	user_timeÚsystem_timer>   )ÚrealÚ	effectiveÚsavedr9   r:   )r‘   r’   r“   r”   r;   ÚioclassÚvaluer8   Ú	voluntaryÚinvoluntaryr6   )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   sJ   zt  ¡ }W n ty   i }Y nw |D ]}t| |d ƒ}|r"|||< q|S ©N)ÚcollectionsÚOrderedDictÚAttributeErrorÚgetattr)ÚselfÚattrsÚinfor¥   rÔ   r‚   r‚   rƒ   Ú	_infodict  s   ÿ€zError._infodictc                 C   sJ   |   d¡}|rdd dd„ | ¡ D ƒ¡ }nd }d dd„ | j|fD ƒ¡S )N)r©   Úppidr¥   z(%s)ú, c                 S   ó   g | ]
\}}d ||f ‘qS ©z%s=%rr‚   ©Ú.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    )rï   ÚjoinÚitemsÚmsg©rì   rî   Údetailsr‚   r‚   rƒ   Ú__str__$  s   
ÿzError.__str__c                 C   s2   |   d¡}d dd„ | ¡ D ƒ¡}d| jj|f S )N)r©   rð   r¥   Úsecondsrþ   rñ   c                 S   rò   ró   r‚   rô   r‚   r‚   rƒ   rø   1  rù   z"Error.__repr__.<locals>.<listcomp>zpsutil.%s(%s))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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__©NN©r   r€   r�   r  r
  r‚   r‚   r‚   rƒ   r  5  ó    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
  K  s   zZombieProcess.__init__©NNNr  r‚   r‚   r‚   rƒ   r  B  s    r  c                   @   r  )ÚAccessDeniedz@Exception raised when permission to perform an action is denied.ræ   Nc                 C   r  )NÚ r	  r  r‚   r‚   rƒ   r
  U  r  zAccessDenied.__init__r  r  r‚   r‚   r‚   rƒ   r  Q  s    r  c                   @   r  )ÚTimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process
    is still alive.
    ræ   Nc                 C   s*   t  | ¡ || _|| _|| _d| | _d S )Nztimeout after %s seconds)rå   r
  r  r©   r¥   rþ   )rì   r  r©   r¥   r‚   r‚   rƒ   r
  b  s
   
zTimeoutExpired.__init__r  r  r‚   r‚   r‚   rƒ   r  \  r  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ƒ   rO   o  s   ÿ
rO   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()
    >>>
    c                     sL   | t t| ¡ ƒƒf}zˆ | W S  ty%   ˆ| i |¤Ž }ˆ |< | Y S w rç   )Ú	frozensetÚsortedrý   ÚKeyError)ÚargsÚkwargsÚkeyr  ©Ú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ƒ   rL   {  s   rL   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                    sj   z| j ˆ  }W |S  ty   ˆ | ƒ Y S  ty4   ˆ | ƒ}z	|| j ˆ < W Y |S  ty3   Y Y |S w w rç   )Ú_cacherê   r  )rì   r  ©r#  r‚   rƒ   r$  µ  s   óüüúz'memoize_when_activated.<locals>.wrapperc                 S   s
   i | _ dS )zjActivate cache. Expects a Process instance. Cache will be
        stored as a "_cache" instance attribute.N)r*  ©Ú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)r*  rê   r,  r‚   r‚   rƒ   Úcache_deactivateÎ  s
   
ÿz0memoize_when_activated.<locals>.cache_deactivate)r(  r)  r.  r/  )r#  r$  r.  r/  r‚   r+  rƒ   Úmemoize_when_activated›  s   r0  c              
   C   sV   zt  | ¡}W n ty$ } z|jtjtjfv r‚ W Y d}~dS d}~ww t |j¡S )zœSame as os.path.isfile() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    NF)ÚosÚstatÚOSErrorÚerrnoÚEPERMÚEACCESÚS_ISREGÚst_mode)rÌ   ÚstÚerrr‚   r‚   rƒ   rK   Ú  s   €ýrK   c              
   C   sL   zt  | ¡ W dS  ty% } z|jtjtjfv r‚ W Y d}~dS d}~ww )zœSame as os.path.exists() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html
    NFT)r1  r2  r3  r4  r5  r6  )rÌ   r:  r‚   r‚   rƒ   rN   é  s   û€ýrN   c                  C   sv   t jrtdu r	dS z&t   tt j¡} t | ¡� |  d¡ W d  ƒ W dS 1 s(w   Y  W dS  t jy:   Y dS w )z2Return True if IPv6 is supported on this platform.NF)z::1r   T)ÚsocketÚhas_ipv6r   r   Ú
contextlibÚclosingÚbindÚerror)Úsockr‚   r‚   rƒ   rP   ø  s   
ÿþÿrP   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   ÚfindÚupper)Údatar  ÚposÚWINDOWS_Únext_posÚ	equal_posr   rÔ   r‚   r‚   rƒ   rM     s"   öòrM   c                 C   ó0   t du r| S zt | ¡W S  ty   |  Y S w )z�Convert a numeric socket family value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)Úenumr;  ÚAddressFamilyÚ
ValueError©Únumr‚   r‚   rƒ   rQ   "  ó   ÿrQ   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.
    N)rL  r;  Ú
SocketKindrN  rO  r‚   r‚   rƒ   rR   /  rQ  rR   c                 C   sŒ   |t jtfv r|rt|Ž }|rt|Ž }|t jkr%|ttf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   rQ   rR   r6   r?   )rª   ÚfamÚtype_r­   r®   r¯   Ú
status_mapr©   r‚   r‚   rƒ   rU   <  s   rU   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:   d| j ˆf ‰ | jd u rˆ | _t | ¡‡ ‡fdd„ƒ}|S )Nz8%s() is deprecated and will be removed; use %s() insteadc                    s$   t jˆ tdd� t| ˆƒ|i |¤ŽS )Nr|   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrë   )rì   r  r  )rþ   Úreplacementr‚   rƒ   ÚinnerY  s   z/deprecated_method.<locals>.outer.<locals>.inner)r   r  r(  r)  )r#  r]  ©r\  )rþ   rƒ   ÚouterS  s   ÿ
z deprecated_method.<locals>.outerr‚   )r\  r_  r‚   r^  rƒ   rJ   O  s   rJ   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_keys©rì   r‚   r‚   rƒ   r
  f  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"  rd  re  rè   ÚdefaultdictÚintÚset)rì   Ú
input_dictr¥   r‚   r‚   rƒ   Ú	_add_dictl  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"  ri  Úkeysre  rd  )rì   rj  r¥   Úold_dictÚ	gone_keysÚgone_keyÚremkeyr‚   r‚   rƒ   Ú_remove_dead_reminderst  s   
ýz#_WrapNumbers._remove_dead_remindersc              	   C   s  || j vr|  ||¡ |S |  ||¡ | j | }i }| ¡ D ]\}|| }z|| }W n ty7   |||< Y qw g }tt|ƒƒD ]3}	||	 }
||	 }||	f}|
|k rg| j| |  |7  < | j| |  	|¡ | 
|
| j| |  ¡ q@t|ƒ||< q|| j |< |S )zkCache dict and sum numbers which overflow and wrap.
        Return an updated copy of `input_dict`
        )r"  rk  rq  rl  r  ÚrangeÚlenrd  re  ÚaddÚappendÚtuple)rì   rj  r¥   rm  Únew_dictr   Úinput_tupleÚ	old_tupleÚbitsÚiÚinput_valueÚ	old_valuerp  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)rc  r"  r%  rd  re  Ú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)rc  r"  rd  re  rf  r‚   r‚   rƒ   Ú
cache_info²  s   $ÿz_WrapNumbers.cache_inforç   )
r   r€   r�   r  r
  rk  rq  r~  r&  r€  r‚   r‚   r‚   rƒ   r`  a  s    
'r`  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)Ú_wnrc  r~  )rj  r¥   r‚   r‚   rƒ   rS   ¸  s   
$ÿrS   c                 K   s   t | dfi |¤ŽS )NÚrb)Úopen©Úfnamer  r‚   r‚   rƒ   Úopen_binaryÆ  s   r†  c                 K   s.   t r| dt¡ | dt¡ t| dfi |¤ŽS )z¨On Python 3 opens a file in text mode by using fs encoding and
    a proper en/decoding errors handler.
    On Python 2 this is just an alias for open(name, 'rt').
    ÚencodingÚerrorsÚrt)ÚPY3Ú
setdefaultr4   r5   rƒ  r„  r‚   r‚   rƒ   Ú	open_textÊ  s   rŒ  ú%(value).1f%(symbol)sc                 C   sŠ   d}i }t |dd… ƒD ]\}}d|d d > ||< qt|dd… ƒD ]}| || kr:t| ƒ||  }|tƒ    S q#|t|d | d� S )zŒUsed by various scripts. See:
    http://goo.gl/zeJZl

    >>> bytes2human(10000)
    '9.8K'
    >>> bytes2human(100001221)
    '95.4M'
    )	ÚBÚKÚMÚGÚTÚPÚEÚZÚYr}   Né
   r   )ÚsymbolrÔ   )Ú	enumerateÚreversedr  ÚlocalsÚdict)ÚnÚformatÚsymbolsÚprefixr{  Úsr˜  rÔ   r‚   r‚   rƒ   rT   Ø  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_pathì  r'  r¥  c                 C   s   | j ttd�S )N)r‡  rˆ  )Údecoder4   r5   ©r¡  r‚   r‚   rƒ   r¦  ò  s   r¦  c                 C   s   | S rç   r‚   r§  r‚   r‚   rƒ   r¦  õ  s   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)r1  r¥   ÚcursesÚisattyÚ	setuptermÚtigetnumÚ	Exception)Úfiler©  r‚   r‚   rƒ   rX   þ  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y/   tdt| ¡ ƒ ƒ‚w | |¡ |r<| d¡ dd |¡| f S )z*Return an highlighted version of 'string'.Ú32Ú91Ú33Ú93Ú34Ú35Ú36Ú37Ú30)	ÚgreenÚredÚbrownÚyellowÚblueÚvioletÚ	lightblueÚgreyÚdarkgreyÚ29Nz#invalid color %r; choose between %sÚ1z[%sm%s[0mú;)rX   rœ  r  rN  Úlistrl  ru  rü   )r¡  ÚcolorÚboldÚattrr¨  r‚   r‚   rƒ   rW     s$   ÿ
ÿÿ

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
yN   td	|t| ¡ ƒf ƒ‚w |rY|dkrY|d
7 }|tju r`d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#invalid color %r; choose between %ré   iôÿÿÿiõÿÿÿ)rX   Úprintr   rW   ÚctypesÚwindllÚKernel32ÚGetStdHandleÚSetConsoleTextAttributerœ  r  rN  rÄ  rl  r¢  ÚstderrÚc_ulongÚrestype)r¡  rÅ  rÆ  r®  rÍ  ÚDEFAULT_COLORrÐ  rÑ  r¨  Ú	handle_idÚhandler‚   r‚   rƒ   rY      s6   
ÿÿÿ
rY   c                 C   sr   t r7ddl}| | ¡ j¡\}}}}}t| tƒr)t| ttt	fƒr%d|  } nd|  } t
d||| f tjd� dS dS )z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.r   Nzignoring %szignoring %rzpsutil-debug [%s:%s]> %srÈ  )r   ÚinspectÚgetframeinfoÚcurrentframeÚf_backÚ
isinstancer­  r3  ÚIOErrorÚEnvironmentErrorrÌ  r¢  rÒ  )rþ   rØ  r…  ÚlinenoÚ	func_nameÚlinesÚindexr‚   r‚   rƒ   rV   C  s   ÿ


ÿörV   rç   )r�  )NF)�r  Ú
__future__r   r   rè   r=  r4  r(  r1  r;  r2  r¢  ra  rY  r   r   r   r   r   ÚImportErrorr	   Úversion_inforL  rŠ  ÚboolÚgetenvr   Ú__all__r¥   r   r   ÚplatformÚ
startswithr   r   r   r   r   r   r   r   ÚAIXr*   r+   r'   r,   r.   r2   r&   r0   r1   r(   r)   r/   r-   r3   r   r!   r    r   r   r"   r   r   r   r   r   r   r#   r$   r%   ÚIntEnumr~   ÚglobalsÚupdateÚ__members__r‡   rˆ   r†   Úgetfilesystemencodingr4   r5   Úgetfilesystemencodeerrorsrê   rG   rC   rA   rB   rD   rH   r?   rE   rF   r@   r¼   rÀ   rÄ   rÇ   r7   r<   r=   r>   r9   r:   r;   r8   r6   r×   rI   r­  rå   r  r  r  r  rO   rL   r0  rK   rN   rP   rM   rQ   rR   rU   rJ   r`  rS   r�  r&  r€  r†  rŒ  rT   r¥  r¦  ÚstdoutrX   rW   rY   rV   r‚   r‚   r‚   rƒ   Ú<module>   s\  ÿÿ


$
	

ÿÿÿÿÿ	

ø


þ
ÿ
"
 ?

W	

	

ÿ#