
    ;^hXa                        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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\R<                  " 5       r\R@                  r \RB                  S:  r"Sr#Sr$\RJ                  \RL                  \RN                  \RP                  \RR                  \RT                  \RV                  \RX                  \RZ                  \R\                  \R^                  \RP                  \R`                  \Rb                  0r2\Rf                  \Rh                  \Rj                  \Rl                  \Rn                  \Rp                  \Rr                  \Rt                  \Rv                  \Rx                  \Rz                  \R|                  \R~                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \R                  \#\R                  \$0rM\N" SSSSSSSSS S!S"S#S$9rO\" S%/ S&Q5      rP\" S'/ S(Q5      rQ\" S)/ S*Q5      rR\" S+S,S-/5      rS\SrT\" S./ S/Q5      rU\" S0S1S2R                  \UR                  5      -   5      rXS3 rYS4 rZS5 r[S6 r\S7 r]S8 r^S9 r_\R                  r`\R                  raSDS: jrb\R                  rc\R                  rdSES; jreS< rfS= rgS> rhS? riS@ rjSA rk " SB SC5      rlg)Fz'Sun OS Solaris platform implementation.    N)
namedtuple)AF_INET   )_common)_psposix)_psutil_posix)_psutil_sunos)AF_INET6)ENCODING)AccessDenied)NoSuchProcess)ZombieProcess)debug)get_procfs_path)isfile_strict)memoize_when_activated)sockfam_to_enum)socktype_to_enum)usage_percent)	CONN_IDLE
CONN_BOUNDPROCFS_PATHl        IDLEBOUND                     	   
      )ppidrssvmscreate_timenicenum_threadsstatusttynruideuidgidegid	scputimes)usersystemidleiowait	pcputimes)r2   r3   children_userchildren_systemsvmem)total	availablepercentusedfreepmemr&   r'   pmmap_grouped)pathr&   	anonymouslocked	pmmap_extzaddr perms  c                      [         R                  " S5      [        -  n [         R                  " S5      [        -  =pX-
  n[        X0SS9n[	        XXCU5      $ )zReport virtual memory metrics.SC_PHYS_PAGESSC_AVPHYS_PAGESr   round_)ossysconf	PAGE_SIZEr   r9   )r:   r>   availr=   r<   s        A/var/www/html/env/lib/python3.13/site-packages/psutil/_pssunos.pyvirtual_memoryrP   {   sP     JJ')3E::/09<<D<DD2Gwd33    c            	         [         R                  " 5       u  p[        R                  " SS[        R
                  S    3SS/[        R                  S9nUR                  5       u  p4UR                  [        R                  R                  5      nUR                  S:w  a  SUR                   S	3n[        U5      eUR                  5       R                  S
5      SS nU(       d  Sn[        U5      eS=pxU HN  n	U	R                  5       n	U	SS u  pU[!        [!        U
5      S-  5      -  nU[!        [!        U5      S-  5      -  nMP     Xx-
  n[#        XSS9n[$        R&                  " X|XU [(        -  U[(        -  5      $ )zReport swap memory metrics.z/usr/bin/envzPATH=/usr/sbin:/sbin:PATHswapz-l)stdoutr   z'swap -l' failed (retcode=)
r   Nzno swap device(s) configuredr   r   i   rI   )cextswap_mem
subprocessPopenrK   environPIPEcommunicatedecodesysrU   encoding
returncodeRuntimeErrorstripsplitintr   r   sswaprM   )sinsoutprU   _msglinesr:   r>   linetfr=   r<   s                 rO   swap_memoryrq      s\   IC 	#BJJv$6#78		
 	A IF]]3::../F||q*1<<.:3LLN  &qr*E,3Ezz|AaySVc\""CFSL!!	 
 <DD2G==TC)OTI5E rQ   c                      [         R                  " 5       n [        [        U 6  Vs/ s H  n[	        U5      PM     sn6 $ s  snf )z.Return system-wide CPU times as a named tuple.)rX   per_cpu_timesr1   zipsumretxs     rO   	cpu_timesry      s5    



CsCy1y!s1vy1221s   >c                  h    [         R                  " 5       n U  Vs/ s H  n[        U6 PM     sn$ s  snf )z6Return system per-CPU times as a list of named tuples.)rX   rs   r1   rv   s     rO   rs   rs      s,    



C#&'3aIqM3'''s   /c                  P     [         R                  " S5      $ ! [         a     gf = f)z0Return the number of logical CPUs in the system.SC_NPROCESSORS_ONLNN)rK   rL   
ValueError rQ   rO   cpu_count_logicalr      s)    zz/00 s    
%%c                  ,    [         R                  " 5       $ )z-Return the number of CPU cores in the system.)rX   cpu_count_coresr~   rQ   rO   r   r      s    !!rQ   c                  d    [         R                  " 5       u  pp#Sn[        R                  " XXB5      $ )z*Return various CPU stats as a named tuple.r   )rX   	cpu_statsr   	scpustats)ctx_switches
interruptssyscalls_trapssoft_interruptss        rO   r   r      s0    151A.LhO/ rQ   c                 N   / n[         R                  " 5       nU H]  nUu  pEpgUS:X  a  SnU (       d   [        U5      R                  (       d  M4   [        R                  " XEXg5      n	UR                  U	5        M_     U$ ! [         a  n[        SU< SU 35         SnAM  SnAff = f)zReturn system disk partitions.none z	skipping z: N)	rX   disk_partitions
disk_usager:   OSErrorr   r   	sdiskpartappend)
allretlist
partitions	partitiondevice
mountpointfstypeoptserrntuples
             rO   r   r      s     G%%'J	+4(FVF!*-33 4 ""6vDv!  " N  	*r#78s   A==
B$BB$c           
         [         R                  U    u  p#[        R                  " U5      n[	        5       nU H  nUu  pxppnX;  a  M  X;  a  M  U[
        [        1;   a4  U
(       a  [         R                  " U
6 n
U(       a  [         R                  " U6 n[        U   n[        U5      n[        U	5      n	US:X  a  [         R                  " XxXXU5      nO[         R                  " XxXX5      nUR                  U5        M     [        U5      $ )zReturn socket connections.  If pid == -1 return system-wide
connections (as opposed to connections opened by one process only).
Only INET sockets are returned (UNIX are not).
)r   	conn_tmaprX   net_connectionssetr   r
   addrTCP_STATUSESr   r   sconnpconnaddlist)kind_pidfamiliestypesrawlistrw   itemfdfamtype_laddrraddrr+   pidnts                  rO   r   r     s    
 ''-OH""4(G
%C481uc7H%%e,e,f%c" '2:reSIBreDB' ( 9rQ   c                      [         R                  " 5       n U R                  5        HO  u  pUu  p4pV[        [        S5      (       a  [        R
                  " U5      n[        R                  " X4XVS5      X'   MQ     U $ )z)Get NIC stats (isup, duplex, speed, mtu).	NicDuplexr   )rX   net_if_statsitemshasattrr   r   	snicstats)rw   namer   isupduplexspeedmtus          rO   r   r   "  sf    



Cyy{#( e7K((&&v.F%%dEC		 #
 JrQ   c                  ,    [         R                  " 5       $ )z:The system boot time expressed in seconds since the epoch.)rX   	boot_timer~   rQ   rO   r   r   2  s    >>rQ   c                      / n [         R                  " 5       nSnU HB  nUu  pEpgpU(       d  M  Xb;   a  Sn[        R                  " XEXgU	5      n
U R	                  U
5        MD     U $ )z:Return currently connected users as a list of namedtuples.)z:0.0z:0	localhost)rX   usersr   suserr   )r   r   r   r   r2   ttyhostnametstampuser_processr   r   s              rO   r   r   7  se    GjjlGI9=68\  "H]]4h<r  NrQ   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   encoder   rK   listdirisdigitrf   )rA   rx   s     rO   pidsr   O  sD    ##H-DJJt,<,q		FCF,<<<s   A$A$c                 .    [         R                  " U 5      $ )z&Check for the existence of a unix pid.)r   
pid_exists)r   s    rO   r   r   U  s    s##rQ   c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )z{Call callable into a try/except clause and translate ENOENT,
EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
c                 v  > U R                   U R                  U R                  pTn T" U /UQ70 UD6$ ! [        [        4 a.  n[        U5      (       d  [        X55      Ue[        X5U5      UeS nAf[         a  n[        X55      UeS nAf[         a'  nUS:X  a  S[        5       ;   a  [        X55      Uee e S nAff = fNr   )r   _ppid_nameFileNotFoundErrorProcessLookupErrorr   r   r   PermissionErrorr   r   r   )selfargskwargsr   r%   r   r   funs          rO   wrapper wrap_exceptions.<locals>.wrapper_  s    ((DJJ

4	t-d-f--!#56 	: c??#C.C740c9 	3s)s2 	ax;&s1s:	s-   2 B8)A++B88BB8"B33B8)	functoolswraps)r   r   s   ` rO   wrap_exceptionsr   Z  s'    
 __S ( NrQ   c                   <   \ rS rSrSr/ SQrS rS rS rS r	\
\S 5       5       r\
\S	 5       5       r\
\S
 5       5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\r\
S 5       r \
S 5       r!\
S 5       r"S r#\
S)S j5       r$\%" S S!5      r&\%" S S"5      r'\
S# 5       r(\
S$ 5       r)\
S% 5       r*\
S*S' j5       r+S(r,g&)+Processiw  z1Wrapper class around underlying C implementation.)_cacher   r   _procfs_pathr   c                 J    Xl         S U l        S U l        [        5       U l        g N)r   r   r   r   r   )r   r   s     rO   __init__Process.__init__|  s     

+-rQ   c                 b    [         R                  " U R                   SU R                   35        g)z+Raise NSP if the process disappeared on us./N)rK   statr   r   r   s    rO   _assert_aliveProcess._assert_alive  s&     	4$$%Qtxxj12rQ   c                     U R                   R                  U 5        U R                  R                  U 5        U R                  R                  U 5        g r   )_proc_name_and_argscache_activate_proc_basic_info
_proc_credr   s    rO   oneshot_enterProcess.oneshot_enter  s<      //5,,T2&&t,rQ   c                     U R                   R                  U 5        U R                  R                  U 5        U R                  R                  U 5        g r   )r   cache_deactivater   r   r   s    rO   oneshot_exitProcess.oneshot_exit  s<      11$7..t4((.rQ   c                 X    [         R                  " U R                  U R                  5      $ r   )rX   proc_name_and_argsr   r   r   s    rO   r   Process._proc_name_and_args  s!     &&txx1B1BCCrQ   c                 ^   U R                   S:X  aS  [        R                  R                  U R                   SU R                    S35      (       d  [        U R                   5      e[        R                  " U R                   U R                  5      n[        U5      [        [        5      :X  d   eU$ )Nr   r   z/psinfo)
r   rK   rA   existsr   r   rX   proc_basic_infolenproc_info_map)r   rw   s     rO   r   Process._proc_basic_info  s     88q=  !488*G4"
 "
 txx((""488T->->?3x3}----
rQ   c                 X    [         R                  " U R                  U R                  5      $ r   )rX   	proc_credr   r   r   s    rO   r   Process._proc_cred  s     ~~dhh(9(9::rQ   c                 (    U R                  5       S   $ r   )r   r   s    rO   r   Process.name  s     '')!,,rQ   c                      [         R                  " U R                   SU R                   S35      $ ! [         a     Of = fU R                  5         g)Nr   z/path/a.outr   )rK   readlinkr   r   r   cmdliner   s    rO   exeProcess.exe  sN    	;;$"3"3!4AdhhZ{KLL 		
 	s   /2 
??c                 F    U R                  5       S   R                  S5      $ )Nr   rE   )r   re   r   s    rO   r
  Process.cmdline  s!    '')!,22377rQ   c                 X    [         R                  " U R                  U R                  5      $ r   )rX   proc_environr   r   r   s    rO   r\   Process.environ        4+<+<==rQ   c                 6    U R                  5       [        S      $ )Nr(   r   r  r   s    rO   r(   Process.create_time      $$&}]'CDDrQ   c                 6    U R                  5       [        S      $ )Nr*   r  r   s    rO   r*   Process.num_threads  r  rQ   c                 6    U R                  5       [        S      $ )Nr)   r  r   s    rO   nice_getProcess.nice_get  s    
 $$&}V'<==rQ   c                     U R                   S;   a   [        U R                   U R                  5      e[        R                  " U R                   U5      $ )N>   r   r   )r   r   r   
cext_posixsetpriority)r   values     rO   nice_setProcess.nice_set  s<    88v
 txx44%%dhh66rQ   c                 X    U R                  5       [        S      U l        U R                  $ )Nr%   )r   r  r   r   s    rO   r%   Process.ppid  s&    **,]6-BC
zzrQ   c                      U R                  5       u  pn    n[        R
                  " XU5      $ ! [         a9    U R                  5       [        S      nU R                  5       [        S      nS n NYf = f)Nr-   r.   r   r   r   r  r   puids)r   real	effectivesavedrk   s        rO   uidsProcess.uids  sw    	.2oo.?+DUAq!
 }}Te44	  	((*=+?@D--/f0EFIE	s   / A A21A2c                      U R                  5       u      pp4[        R
                  " X#U5      $ ! [         a9    U R                  5       [        S      nU R                  5       [        S      nS n NYf = f)Nr/   r0   r%  )r   rk   r'  r(  r)  s        rO   gidsProcess.gids  su    	.2oo.?+Aq!9
 }}Te44	  	((*=+?@D--/f0EFIE	s   . A A10A1c                     [         R                  " U R                  U R                  5      n[        R                  " U6 $ ! [         a6  nUR
                  [
        R                  :X  a  [        (       d  Sn S nANMe S nAff = f)N)        r0  r0  r0  )
rX   proc_cpu_timesr   r   r   errno	EOVERFLOW	IS_64_BITr   r6   )r   timesr   s      rO   ry   Process.cpu_times  sf    	''$2C2CDE   %((  	yyEOO+II -	s   +A   
B 
+A;:A;;B c                 X    [         R                  " U R                  U R                  5      $ r   )rX   proc_cpu_numr   r   r   s    rO   cpu_numProcess.cpu_num  r  rQ   c                 H   U R                   nSn[        U R                  5       [        S      5      nU[        R
                  :w  a2  S H,  n [        R                  " U SU R                   SU 35      s  $    U(       a  U R                  5         g g ! [         a    Sn MX  f = f)NFr,   )r   r   r      r   /path/T)r   r   r   r  rX   PRNODEVrK   r	  r   r   r   )r   procfs_path
hit_enoentr   rx   s        rO   terminalProcess.terminal  s    ''
d335mG6LMN$,,#;;+azs'KLL $    ) !%Js   'BB! B!c                     U R                   n [        R                  " U SU R                   S35      $ ! [         a(    [        R
                  " U SU R                   35         gf = f)Nr   z	/path/cwdr   )r   rK   r	  r   r   r   )r   r?  s     rO   cwdProcess.cwd  sa     ''	;;+azCDD  	GG{m1TXXJ/0	s   %4 /A&%A&c                 t    U R                  5       nU[        S      S-  nU[        S      S-  n[        X#5      $ )Nr&   i   r'   )r   r  r?   )r   rw   r&   r'   s       rO   memory_infoProcess.memory_info$  sB    ##%-&'$.-&'$.C~rQ   c                 b    U R                  5       [        S      n[        R                  US5      $ )Nr+   ?)r   r  PROC_STATUSESget)r   codes     rO   r+   Process.status-  s-    $$&}X'>?  s++rQ   c                 0   U R                   n/ n[        R                  " U SU R                   S35      nSnU HZ  n[	        U5      n [
        R                  " U R                  XQ5      u  pg[        R                  " XVU5      nUR                  U5        M\     U(       a  U R                  5         U$ ! [         a[  n	U	R                  [        R                  :X  a  [        (       d   S n	A	M  U	R                  [        R                  :X  a  Sn S n	A	M  e S n	A	ff = f)Nr   z/lwpFT)r   rK   r   r   rf   rX   query_process_threadr   pthreadr   r   r2  r3  r4  ENOENTr   )
r   r?  rw   tidsr@  tidutimestimer   r   s
             rO   threadsProcess.threads3  s    ''zz[M488*D9:
Cc(C#88HHc & __S7

2/ 0  
)  99/		 99,!%Js$   #B00
D:)D) DDDc           	      2   / nSnU R                   nU SU R                   S3n[        R                  " U SU R                   S35       H  n[        R                  R                  XE5      n[        R                  R                  U5      (       d  MH   [        R                  " U5      n[        U5      (       a1  UR                  [        R                  " U[        U5      5      5        M  M     U(       a  U R                  5         U$ ! [         a    Sn M  f = f)NFr   z/path/fdT)r   r   rK   r   rA   joinislinkr	  r   r   r   	popenfilerf   r   r   )r   r   r@  r?  pathdirr   rA   files           rO   
open_filesProcess.open_filesU  s    
'' M488*E2**}AdhhZs;<B77<<,Dww~~d##I;;t,D
 %T**w'8'8s2w'GH + =   ) !%Js   DDDc              #   z  #    S[        U5      /n[        R                  " U[        R                  [        R                  S9nUR	                  5       u  pES XE4 5       u  pEUR
                  S:w  a{  SUR                  5       ;   a   [        U R                  U R                  5      eSUR                  5       ;   a   [        U R                  U R                  5      eU< SU 3n[        U5      eUR                  S5      S	S
 n[        U5       H  u  pU	R                  5       n	U	R                  S5      (       d  M-  U	R                  SS	5      S	   n
XxS	-
     R!                  5       nUS:X  a  ["        R$                  nOUS:X  a  ["        R&                  nOSnS["        R(                  XS[*        R,                  4v   M     g
7f)z<Get UNIX sockets used by process by parsing 'pfiles' output.pfiles)rU   stderrc              3   r   #    U  H-  oR                  [        R                  R                  5      v   M/     g 7fr   )r_   r`   rU   ra   ).0rx   s     rO   	<genexpr>,Process._get_unix_sockets.<locals>.<genexpr>s  s(      
3CaHHSZZ(())3Cs   57r   zpermission deniedzno such processz command error
rW   r   Nzsockname: AF_UNIXrE   SOCK_STREAM
SOCK_DGRAMr   r   )strrZ   r[   r]   r^   rb   lowerr   r   r   r   rc   re   	enumeratelstrip
startswithrd   socketri  rj  AF_UNIXr   	CONN_NONE)r   r   cmdrj   rU   rd  rl   rm   irn   rA   types               rO   _get_unix_socketsProcess._get_unix_socketsj  sw     S"


 
4:3C
 <<1"flln4"488TZZ88 FLLN2#DHHdjj99G+F84Cs##T"12& 'GA;;=D233zz#q)!,U|))+=(!--D\)!,,DD6>>4r7;L;LMM (s   D1F;7BF;c                 F   [        XR                  S9nU(       d/  [        R                  " U R                   SU R                   35        US;   aL  UR                  U R                  U R                  5       Vs/ s H  n[        R                  " U6 PM     sn5        U$ s  snf )N)r   r   >   r   unix)	r   r   rK   r   r   extendrv  r   r   )r   r   rw   conns       rO   r   Process.net_connections  s    d2 GGt(()488*56 ?"JJ 22488<<D t$<  
	s   8Bmmapzpath rss anon lockedzaddr perms path rss anon lockedc           	         S nU R                   n/ n [        R                  " U R                  U5      nSnU He  nUu  pppnU" X5      nUR                  S5      (       d)   [        R                  " U SU R                   SU 35      nUR                  XXX45        Mg     U(       a  U R                  5         U$ ! [         a6  nUR
                  [
        R                  :X  a  [        (       d  / s S nA$ e S nAff = f! [         a?  nUR
                  [
        R                  :X  a  U SU R                   SU 3nSn S nANe S nAff = f)Nc                     SR                  [        U 5      SS  R                  S5      [        U5      SS  R                  S5      5      $ )Nz{}-{}r   L)formathexrd   )startends     rO   toaddr#Process.memory_maps.<locals>.toaddr  sB    >>E
12$$S)3s8AB<+=+=c+B rQ   F[r   r=  T)r   rX   proc_memory_mapsr   r   r2  r3  r4  ro  rK   r	  rR  r   r   )r   r  r?  r   r   r   r@  r   r   addrsizepermr   r&   anonrC   s                  rO   memory_mapsProcess.memory_maps  s5   	
 ''	++DHHkBG 
D<@9DD6$)D??3'';;+azv'NOD NND4@A% &  E  	yyEOO+II 		&  yyELL0 #.azvF%)
sA   !B: !(C=:
C:*C5.C:4C55C:=
E4E EEc                 t    [        [        R                  " U R                   SU R                   S35      5      $ )Nr   rZ  )r   rK   r   r   r   r   s    rO   num_fdsProcess.num_fds  s.    2::!2!2 31TXXJcBCDDrQ   c                 z    [         R                  " [        R                  " U R                  U R
                  5      6 $ r   )r   pctxswrX   proc_num_ctx_switchesr   r   r   s    rO   num_ctx_switchesProcess.num_ctx_switches  s-    ~~''$2C2CD
 	
rQ   Nc                 X    [         R                  " U R                  XR                  5      $ r   )r   wait_pidr   r   )r   timeouts     rO   waitProcess.wait  s      7JJ??rQ   )r   r   r   r   )inetr   )-__name__
__module____qualname____firstlineno____doc__	__slots__r   r   r   r   r   r   r   r   r   r   r  r
  r\   r(   r*   r  r   r%   r*  r-  ry   r9  rA  rD  rG  memory_full_infor+   rW  r`  rv  r   r   nt_mmap_groupednt_mmap_extr  r  r  r  __static_attributes__r~   rQ   rO   r   r   w  s   ;CI.3-
/
 D  D    ;  ; - - 	 	 8 8 > > E E E E > > 7 7   5 5 5 5 ) )" > > ! ! 
 
   #, ,
  B  ( ND  & !)?@OV%FGK, ,\ E E 
 

 @ @rQ   r   )F)r   )mr  r2  r   rK   rp  rZ   r`   collectionsr   r   r   r   r   r   r  r	   rX   r
   r   r   r   r   r   r   r   r   r   r   r   __extra__all__getpagesizerM   AF_LINKmaxsizer4  r   r   SSLEEPSTATUS_SLEEPINGSRUNSTATUS_RUNNINGSZOMBSTATUS_ZOMBIESSTOPSTATUS_STOPPEDSIDLSTATUS_IDLESONPROCSWAITSTATUS_WAITINGrK  TCPS_ESTABLISHEDCONN_ESTABLISHEDTCPS_SYN_SENTCONN_SYN_SENTTCPS_SYN_RCVDCONN_SYN_RECVTCPS_FIN_WAIT_1CONN_FIN_WAIT1TCPS_FIN_WAIT_2CONN_FIN_WAIT2TCPS_TIME_WAITCONN_TIME_WAITTCPS_CLOSED
CONN_CLOSETCPS_CLOSE_WAITCONN_CLOSE_WAITTCPS_LAST_ACKCONN_LAST_ACKTCPS_LISTENCONN_LISTENTCPS_CLOSINGCONN_CLOSINGPSUTIL_CONN_NONErr  	TCPS_IDLE
TCPS_BOUNDr   dictr  r1   r6   r9   r?   pfullmemr@   r[  _fieldsrD   rP   rq   ry   rs   r   r   r   disk_io_countersr   r   net_io_countersnet_if_addrsr   r   r   r   r   r   r   r   r~   rQ   rO   <module>r     s  
 .   	   
 "    ) #   ! " "  $ " + $ % " < ""$	


KK%		
 	KK((IIw%%JJ%%JJ&&IIw""LL'((JJ&& 	733----'00'00//g(('11--g))w++7,,NNIOOZ" 	
			

		

	, {$HI	G	 	7MN&5%.); -*?*?!@@	4&\3("
 ((   
> &&&&> 
0=$
:g@ g@rQ   