+
    jHàj	?  ã                  óº  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
Ht RRRRRRRRR	RR
R
RR
RR
/tRRRRRR
/tRRRRRR
/tR R lt]P                   R R l4       t]P                   R R l4       tR R ltR R ltR R lt]P                   R R  l4       tR!tR"R#/R$ R% lltRpR& R' lltR( R) ltR* R+ ltR, R- ltR. R/ lt]P                   R0 R1 l4       t^AR2^BR3^CR4^FR5^HR6^NR7^PR8^QR9^aR:^iR;^mR<^ÀR8/tR= R> lt ]P                   R? R@ l4       t!RA RB lt"RC RD lt#]P                   RE RF l4       t$RGRHRIRJRKRL/t%Rqt&RMt'^t(RN RO lt)RP RQ lt*RR RS lt+RT RU lt,]P                   RV RW l4       t-RXt.]P                   RY RZ l4       t/R[t0R\t1R]t2R^ R_ lt3 ! R` Ra]	4      t4Rb Rc lt5Rd Re lt6Rf Rg lt7]P                   Rh Ri l4       t8Rj Rk lt9Rl Rm lt:Rn Ro lt;R# )ra  Cached OS, architecture, CPU, memory and GPU facts for the current machine.

Native architecture remains accurate when the Python process is emulated. Facts read the registry,
sysctl, IOKit, procfs or sysfs: never the environment, a subprocess or a GPU driver library.
)ÚannotationsN)Ú
NamedTuple)Ú
darwin_pciÚamd64Úx86_64Úx64Úarm64Úaarch64Úx86Úi386Úi686id†  idª  iL  z	win-amd64z	win-arm64Úwin32c               ó    € V ^8„  d   QhRRRR/# )é   Úrawz
str | NoneÚreturnÚstr© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/hermes_platform/host/facts.pyÚ__annotate__r      s   € ÷ Cñ C˜
ð C sñ Có    c                óz   € \         P                  T ;'       g    RP                  4       P                  4       R4      # )z%Return a canonical architecture name.Ú Úunknown)Ú_ARCH_NAMESÚgetÚstripÚlower)r   s   &r   Únormalize_archr      s+   € ä�?‰?˜CŸI˜I 2×,Ñ,Ó.×4Ñ4Ó6¸	ÓBÐBr   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r   #   s   € ÷ ñ �3ñ r   c                 ó"   € \         P                  # )z'Return the current platform identifier.)ÚsysÚplatformr   r   r   Ú	os_familyr%   "   s   € ô �<‰<Ðr   c               ó   € V ^8„  d   QhRR/# r!   r   )r   s   "r   r   r   )   s   € ÷ .ñ .�cñ .r   c                 óº   € \         P                  R8X  d*   \        P                  \        P
                  ! 4       R4      # \        \        P                  ! 4       4      # )z/Return the architecture of this Python process.r   r   )r#   r$   Ú_WINDOWS_BUILD_ARCHr   Ú	sysconfigÚget_platformr   Úmachiner   r   r   Úprocess_archr,   (   s@   € ô ‡|�|�wÔÜ"×&Ñ&¤y×'=Ò'=Ó'?ÀÓKÐKÜœ(×*Ò*Ó,Ó-Ð-r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úwow64_nativeú
int | Noner+   r   r   r   )r   s   "r   r   r   0   s&   € ÷ Pñ P¨ð P¸cð PÀcñ Pr   c                óf   € \         P                  T ;'       g    ^ 4      ;'       g    \        V4      # )zbReturn the native architecture: ``IsWow64Process2``'s native machine, else ``platform.machine()``.)ÚIMAGE_FILE_MACHINEr   r   ©r.   r+   s   $$r   Úwindows_native_archr3   0   s(   € ä×!Ñ! ,×"3Ð"3°!Ó4×OÐO¼ÀwÓ8OÐOr   c               ó   € V ^8„  d   QhRR/# ©r   r   r/   r   )r   s   "r   r   r   5   s   € ÷ (ñ (˜zñ (r   c                 óT  € ^ RI p ^ RI Hp V P                  RRR7      p\        VRR4      pVf   R# VP                  VP
                  n        . VP
                  n        VP                  V P                  VP                  4      V P                  VP                  4      .Vn        VP                  Vn        VP                  ^ 4      pVP                  ^ 4      pV! VP                  4       V P                  V4      V P                  V4      4      '       g   R# VP                  ;'       g    R# )zHReturn the IsWow64Process2 native machine, or ``None`` when unavailable.N©ÚwintypesÚkernel32T©Úuse_last_errorÚIsWow64Process2)Úctypesr8   ÚWinDLLÚgetattrÚHANDLEÚGetCurrentProcessÚrestypeÚargtypesÚPOINTERÚUSHORTÚBOOLÚbyrefÚvalue)r=   r8   r9   ÚprobeÚprocess_machineÚnative_machines         r   Ú_wow64_native_machinerL   5   sé   € ãÝà�}‰}˜Z¸ˆ}Ó=€HÜ�HÐ/°Ó6€EØ‚}Ùà)1¯©€H×ÑÔ&Ø*,€H×ÑÔ'Ø—o‘o v§~¡~°h·o±oÓ'FÈÏÉÐW_×WfÑWfÓHgÐh€E„NØ—M‘M€E„MØ—o‘o aÓ(€OØ—_‘_ QÓ'€NÙ�×+Ñ+Ó-¨v¯|©|¸OÓ/LÈfÏlÉlÐ[iÓNj×kÒkÙØ×Ñ×'Ð' 4Ð'r   c               ó   € V ^8„  d   QhRR/# ©r   r   Úboolr   )r   s   "r   r   r   J   s   € ÷ 7ñ 7˜Dñ 7r   c                 ó   € \        R4      ^8H  # )z/Return whether this process runs under Rosetta.s   sysctl.proc_translated)Ú_sysctl_intr   r   r   Ú_darwin_translatedrR   J   s   € äÐ0Ó1°QÑ6Ð6r   c               ó   € V ^8„  d   QhRR/# r!   r   )r   s   "r   r   r   P   s   € ÷ 
ñ 
�Sñ 
r   c                 óH  € \         P                  R8X  d,    \        4       p \        V \        P                  ! 4       R7      # \         P                  R8X  d"   \        4       R8X  d   \        4       '       d   R# \        4       #   \        \        \
        \        3 d    Rp  Li ; i)zCReturn the machine architecture even when this process is emulated.r   Nr2   Údarwinr   r   )r#   r$   rL   ÚOSErrorÚAttributeErrorÚ	TypeErrorÚ
ValueErrorr3   r+   r,   rR   )Úwow64s    r   Únative_archr[   O   s}   € ô ‡|�|�wÔð	Ü)Ó+ˆEô #°¼x×?OÒ?OÓ?QÔRÐRÜ
‡|�|�xÔ¤L£N°gÔ$=ÔBT×BVÒBVÙÜ‹>Ðøô œ¬´JÐ?ô 	ØŠEð	ús   —
B ÂB!Â B!z.HARDWARE\DESCRIPTION\System\CentralProcessor\0Údevice_tree_modelr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Útextr   r\   r   r   )r   s   "r   r   r   `   s&   € ÷ Iñ I˜ð I°3ð IÀñ Ir   c               óp  € R F�  pV P                  4        Fj  pVP                  4       P                  VP                  4       4      '       g   K8  RV9   g   KA  VP                  R^4      ^,          P	                  4       u u # 	  Kƒ  	  VP                  RR4      P                  RR4      P	                  4       # )z4Return the first available CPU or device-tree model.Ú:Ú r   Ú_Ú )z
model nameÚHardware)Ú
splitlinesr   Ú
startswithÚsplitr   Úreplace)r^   r\   ÚkeyÚlines   &$  r   Úparse_cpuinfork   `   sŠ   € ã)ˆØ—O‘OÖ%ˆDØ�z‰z‹|×&Ñ& s§y¡y£{×3Ô3¸¸t¾Ø—z‘z # qÓ)¨!Õ,×2Ñ2Ó4Ô4ó &ñ *ð ×$Ñ$ T¨2Ó.×6Ñ6°s¸CÓ@×FÑFÓHÐHr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úpathr   ÚlimitÚintr   r   )r   s   "r   r   r   i   s!   € ÷ ñ �Sð  ð °ñ r   c                ó¶   €  \        V R RRR7      ;_uu_ 4       pVP                  V4      uuRRR4       #   + '       g   i     R# ; i  \         d     R# i ; i)Úrz	utf-8-sigrh   )ÚencodingÚerrorsNr   )ÚopenÚreadrV   )rm   rn   Úhandles   && r   Ú
_read_textrw   i   sG   € ðÜ�$˜ k¸)×DÕDÈØ—;‘;˜uÓ%÷ E×D×DÓDûäô Úðús+   ‚A	 ™5ª
A	 µA	Á A	 ÁA	 Á	AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úsubkeyr   Únamer   r   )r   s   "r   r   r   q   s!   € ÷ ñ ˜ð  3ð ¨3ñ r   c                ó  € ^ RI p VP                  VP                  V 4      ;_uu_ 4       pVP                  W14      ^ ,          pRRR4       \        X4      P                  4       #   + '       g   i     L); i  \         d     R# i ; i)é    Nr   )ÚwinregÚOpenKeyÚHKEY_LOCAL_MACHINEÚQueryValueExrV   r   r   )ry   rz   r}   ri   rH   s   &&   r   Ú_winreg_strr�   q   sl   € ÛðØ�^‰^˜F×5Ñ5°v×>Ô>À#Ø×'Ñ'¨Ó2°1Õ5ˆE÷ ?ô ˆu‹:×ÑÓÐ÷	 ?×>ûäô Úðús.   †$A7 ªA$ÁA7 Á$A4	Á/A7 Á4A7 Á7BÂBc               ó    € V ^8„  d   QhRRRR/# ©r   rz   Úbytesr   r/   r   )r   s   "r   r   r   |   ó   € ÷ 	ñ 	�eð 	 
ñ 	r   c                óf  € ^ RI p^ RIpVP                  VP                  P	                  R4      4      pVP                  ^ 4      pVP                  VP                  VP
                  4      4      pVP                  WP                  V4      VP                  V4      R^ 4      ^ 8w  d   R# VP                  # ©r|   NÚc)r=   Úctypes.utilÚCDLLÚutilÚfind_libraryÚc_intÚc_size_tÚsizeofÚsysctlbynamerG   rH   ©rz   r=   ÚlibcrH   Úsizes   &    r   rQ   rQ   |   s†   € ÛÛà�;‰;�v—{‘{×/Ñ/°Ó4Ó5€DØ�L‰L˜‹O€EØ�?‰?˜6Ÿ=™=¨¯©Ó6Ó7€DØ×Ñ˜Ÿ|™|¨EÓ2°F·L±LÀÓ4FÈÈaÓPÐTUÔUÙØ�;‰;Ðr   c               ó    € V ^8„  d   QhRRRR/# rƒ   r   )r   s   "r   r   r   ˆ   r…   r   c                óf  € ^ RI p^ RIpVP                  VP                  P	                  R4      4      pVP                  ^ 4      pVP                  VP                  VP
                  4      4      pVP                  WP                  V4      VP                  V4      R^ 4      ^ 8w  d   R# VP                  # r‡   )r=   r‰   rŠ   r‹   rŒ   Úc_uint64rŽ   r�   r�   rG   rH   r‘   s   &    r   Ú_sysctl_u64r—   ˆ   s‡   € ÛÛà�;‰;�v—{‘{×/Ñ/°Ó4Ó5€DØ�O‰O˜AÓ€EØ�?‰?˜6Ÿ=™=¨¯©Ó9Ó:€DØ×Ñ˜Ÿ|™|¨EÓ2°F·L±LÀÓ4FÈÈaÓPÐTUÔUÙØ�;‰;Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   rz   r„   r   r   r   )r   s   "r   r   r   ”   s   € ÷ 9ñ 9�eð 9 ñ 9r   c                ó¼  € ^ RI p^ RIpVP                  VP                  P	                  R4      4      pVP                  ^ 4      pVP                  V RVP                  V4      R^ 4      ^ 8w  d   R# VP                  VP                  4      pVP                  WVP                  V4      R^ 4      ^ 8w  d   R# VP                  P                  RR7      P                  4       # )r|   Nrˆ   r   rh   )rs   )r=   r‰   rŠ   r‹   rŒ   rŽ   r�   rG   Úcreate_string_bufferrH   Údecoder   )rz   r=   r’   r“   Úbuffers   &    r   Ú_sysctl_strr�   ”   s´   € ÛÛà�;‰;�v—{‘{×/Ñ/°Ó4Ó5€DØ�?‰?˜1Ó€DØ×Ñ˜˜t V§\¡\°$Ó%7¸¸qÓAÀQÔFÙØ×(Ñ(¨¯©Ó4€FØ×Ñ˜ v§|¡|°DÓ'9¸4ÀÓCÀqÔHÙØ�<‰<×Ñ iÐÓ0×6Ñ6Ó8Ð8r   c               ó   € V ^8„  d   QhRR/# r!   r   )r   s   "r   r   r   £   s   € ÷ tñ t�3ñ tr   c                 óÌ   € \         P                  R8X  d   \        \        R4      # \         P                  R8X  d   \	        R4      # \        \        R4      \        RR4      R7      # )	z:Return the CPU model, or an empty string when unavailable.r   ÚProcessorNameStringrU   s   machdep.cpu.brand_stringú/proc/cpuinfoz/proc/device-tree/modeli   )r\   )r#   r$   r�   Ú_CPU_KEYr�   rk   rw   r   r   r   Ú	cpu_modelr£   ¢   sQ   € ô ‡|�|�wÔÜœ8Ð%:Ó;Ð;Ü
‡|�|�xÔÜÐ6Ó7Ð7Üœ OÓ4Ì
ÐSlÐnqÓHrÔsÐsr   ÚARMÚBroadcomÚCaviumÚFujitsuÚ	HiSiliconÚNVIDIAÚAmpereÚQualcommÚAppleÚIntelÚ	Microsoftc               ó    € V ^8„  d   QhRRRR/# )r   r^   r   r   r   )r   s   "r   r   r   ³   s   € ÷ 	ñ 	˜sð 	 sñ 	r   c                óf  € R V P                  4        4       pV UUu/ uF$  w  r#VP                  4       VP                  4       bK&  	  pppVP                  R4      '       d
   VR,          #  \        P                  \	        VP                  RR4      ^4      R4      # u uppi   \
         d     R# i ; i)z[Return ``vendor_id`` (x86) or the named ``CPU implementer`` (arm64) from ``/proc/cpuinfo``.c              3  óX   "  € T F   pR V9   g   K  VP                  R ^4      x € K"  	  R# 5i)r`   N©rg   )Ú.0rj   s   & r   Ú	<genexpr>Ú'parse_cpuinfo_vendor.<locals>.<genexpr>µ   s)   é € ÐMÑ,= DÀÈÁÔˆT�Z‰Z˜˜Q×ÐÓ,=ùs   ‚	*�*Ú	vendor_idzCPU implementerr   )re   r   r   Ú_ARM_IMPLEMENTERSro   rY   )r^   Úpairsri   rH   Úfieldss   &    r   Úparse_cpuinfo_vendorrº   ³   sš   € áM¨D¯O©OÔ,=ÓM€EÙ;@ÔA¹5©Z¨Sˆc�i‰i‹k˜5Ÿ;™;›=Ò(¹5€FÑAØ‡z�z�+×ÒØ�kÕ"Ð"ðÜ ×$Ñ$¤S¨¯©Ð4EÀrÓ)JÈBÓ%OÐQSÓTÐTùó	 Bøô
 ô Úðús   �*BÁ+/B! Â!B0Â/B0c               ó   € V ^8„  d   QhRR/# r!   r   )r   s   "r   r   r   À   s   € ÷ 	=ñ 	=�Cñ 	=r   c                 óÖ   € \         P                  R8X  d   \        \        R4      # \         P                  R8X  d   \	        4       R8X  d   R# \        R4      # \        \        R4      4      # )z›Return the CPU vendor, or an empty string when unavailable.

Windows reports the SoC vendor (``NVIDIA`` on an N1X); arm64 Linux reports the core designer.
r   ÚVendorIdentifierrU   r   r¬   s   machdep.cpu.vendorr¡   )r#   r$   r�   r¢   r[   r�   rº   rw   r   r   r   Ú
cpu_vendorr¾   ¿   sT   € ô ‡|�|�wÔÜœ8Ð%7Ó8Ð8Ü
‡|�|�xÔÜ%›-¨7Ô2ˆwÐZ¼ÐDYÓ8ZÐZÜ¤
¨?Ó ;Ó<Ð<r   c               ó    € V ^8„  d   QhRRRR/# )r   r^   r   r   r/   r   )r   s   "r   r   r   Ì   s   € ÷ ñ ˜cð  jñ r   c                ó  € V P                  4        Fv  pVP                  R4      '       g   K  VP                  4       p\        V4      ^8¼  g   K>  V^,          P	                  4       '       g   K]  \        V^,          4      R,          u # 	  R# )z:Return ``MemTotal`` from ``/proc/meminfo`` text, in bytes.z	MemTotal:i   N)re   rf   rg   ÚlenÚisdigitro   )r^   rj   r¹   s   &  r   Úparse_meminfo_totalrÃ   Ì   sc   € à—‘Ö!ˆØ�?‰?˜;×'Ô'Ø—Z‘Z“\ˆFÜ�6‹{˜aÖ F¨1¥I×$5Ñ$5×$7Ô$7Ü˜6 !�9“~¨Õ,Ò,ñ	 "ñ
 r   c               ó   € V ^8„  d   QhRR/# r5   r   )r   s   "r   r   r   Ö   s   € ÷ ,ñ ,˜Jñ ,r   c                 ó<  aa€ ^ RI o^ RI Ho  ! VV3R lRSP                  4      p V ! 4       pSP                  V 4      Vn        SP
                  P                  P                  SP                  V4      4      '       g   R# \        VP                  4      ;'       g    R# )r|   Nr7   c            
      ó  <€ ] tR t^ÚtR ZP                  3R ZP                  3R Z P
                  3R Z P
                  3R Z P
                  3R Z P
                  3R Z P
                  3R Z P
                  3R	 Z P
                  3.	tR
tR# )Ú*_windows_ram_total.<locals>.MEMORYSTATUSEXÚdwLengthÚdwMemoryLoadÚullTotalPhysÚullAvailPhysÚullTotalPageFileÚullAvailPageFileÚullTotalVirtualÚullAvailVirtualÚullAvailExtendedVirtualr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚDWORDr–   Ú_fields_Ú__static_attributes__)r=   r8   s   €€r   ÚMEMORYSTATUSEXrÇ   Ú   st   ø† à™Ÿ™Ð(¨>¹8¿>¹>Ð*JØ™VŸ_™_Ð-°ÁÇÁÐ/PØ¡§¡Ð1Ð4FÉÏÉÐ3XØ¡§¡Ð0Ð3DÁfÇoÁoÐ2VØ&©¯©Ð8ð
Œr   rØ   )r=   r8   Ú	Structurer�   rÈ   Úwindllr9   ÚGlobalMemoryStatusExrG   ro   rÊ   )rØ   Ústatusr=   r8   s     @@r   Ú_windows_ram_totalrÝ   Ö   sz   ù€ ÛÝ÷
ð 
˜×)Ñ)ô 
ñ Ó€FØ—m‘m NÓ3€F„OØ�=‰=×!Ñ!×6Ñ6°v·|±|ÀFÓ7K×LÒLÙÜˆv×"Ñ"Ó#×+Ð+ tÐ+r   c               ó   € V ^8„  d   QhRR/# r5   r   )r   s   "r   r   r   ë   s   € ÷ 	Bñ 	B˜ñ 	Br   c                 ó  €  \         P                  R8X  d   \        4       # \         P                  R8X  d   \        R4      ;'       g    R#  \        \        RR4      4      #   \        \
        \        \        3 d     R# i ; i)zLReturn the physical memory visible to this OS, or ``None`` when unavailable.r   rU   s
   hw.memsizeNz/proc/meminfoé   )
r#   r$   rÝ   r—   rW   rV   rX   rY   rÃ   rw   r   r   r   Úram_total_bytesrá   ê   sq   € ðÜ�<‰<˜7Ô"Ü%Ó'Ð'Ü�<‰<˜8Ô#Ü˜}Ó-×5Ð5°Ð5ð $ô œz¨/¸4Ó@ÓAÐAøô œG¤Y´
Ð;ô Úðús   ‚A! ¡&A! ÁA! Á!B Á?B Ú10deÚnvidiaÚ1002ÚamdÚ8086ÚintelzMSYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}c               ó    € V ^8„  d   QhRRRR/# )r   Ú
vendor_idsz	list[str]r   r   r   )r   s   "r   r   r   þ   s   € ÷ Kñ K Yð K°3ñ Kr   c                ój  a€ V '       d=   \         ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      '       g   R# V  Uu0 uFC  p\        P                  VP                  4       P	                  4       P                  R4      4      kKE  	  upo\        V3R l\         4       R4      # u upi )z—Return the highest-priority GPU class for PCI vendor ids, or ``none``.

``unknown`` when devices were seen but none of their vendor ids could be read.
c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5i©N)r   )r³   Úvs   & r   r´   Ú'classify_gpu_vendors.<locals>.<genexpr>  s   é € Ð<±¨AŸg™gŸi˜i³ùs   ‚TFr   Ú0xc              3  ó8   <"  € T F  qS9   g   K  Vx € K  	  R # 5irì   r   )r³   rz   Úfounds   & €r   r´   rî     s   øé € ÐA¡-˜$¸5±=—’£-ùs   ƒ�
Únone)ÚanyÚ_GPU_PCI_VENDORSr   r   r   ÚremoveprefixÚnextÚ_GPU_PRIORITY)ré   rí   rñ   s   & @r   Úclassify_gpu_vendorsrø   þ   s~   ø€ ÷
 Ÿ#›#Ñ<±Ó<Ÿ#Ÿ#š#Ñ<±Ó<×<Ò<ÙÙQ[Ó\ÑQ[ÈAÔ×!Ñ! !§'¡'£)§/¡/Ó"3×"@Ñ"@ÀÓ"FÖGÑQ[Ñ\€EÜÔA¥-ÓAÀ6ÓJÐJùò ]s   Á
A	B0c               ó   € V ^8„  d   QhRR/# )r   r   zlist[str] | Noner   )r   s   "r   r   r   	  s   € ÷ Vñ VÐ/ñ Vr   c            	     ón  € Rp  \        \        P                  ! V 4      4      R\        ^,           pT Uu. uF&  q"P                  R4      '       g   K  RT9  g   K$  TNK(  	  upR\         pT Uu. uF#  p\        T  RT R2^4      P                  4       NK%  	  up#   \         d     R# i ; iu upi u upi )zLPCI vendor ids of DRM cards; ``None`` when sysfs exposes no DRM tree at all.z/sys/class/drmNÚcardÚ-Ú/z/device/vendor)ÚsortedÚosÚlistdirÚ_GPU_SCAN_LIMITrV   rf   rw   r   )ÚrootÚentriesÚeÚcardsrû   s        r   Ú_linux_gpu_vendor_idsr  	  s¨   € à€DðÜœŸš DÓ)Ó*Ð+?¬O¸aÕ,?Ð@ˆñ  ÓI™�1§<¡<°×#7ŒQ¸CÀq¹L�QˆQ™ÑIÐJZÌ?Ð[€EÙOTÓUÉuÀtŒJ˜$˜˜q   nÐ5°rÓ:×@Ñ@ÖBÉuÑUÐUøô ô ÚðüâIùÚUs(   „-B µB-ÁB-ÁB-Á/)B2ÂB*Â)B*c               ó$   € V ^8„  d   QhRRRRRR/# )r   r^   r   Útagr   r   )r   s   "r   r   r     s!   € ÷ <ñ <�Sð <˜sð < sñ <r   c                óR   € W9   d!   V P                  V^4      ^,          R,          # R# )é   :Né   Nr   r²   )r^   r  s   &&r   Ú
_hex_afterr    s&   € Ø(+¬ˆ4�:‰:�c˜1Ó˜aÕ  Õ$Ð;¸Ð;r   c               ó    € V ^8„  d   QhRRRR/# )r   Úrowsúlist[tuple[str, str, str]]r   r   )r   s   "r   r   r     s   € ÷ ñ Ð)Cð ÐHbñ r   c                ó  € . pV  F}  w  r#pVP                  4       pRV9   d+   VP                  \        VR4      \        VR4      V34       KG  VP                  4       '       g   K_  V'       d   Ki  VP                  RRV34       K  	  V# )a  ``(vendor id, device id, description)`` per adapter from ``(subkey, MatchingDeviceId, DriverDesc)`` rows.

Virtual adapters (no ``VEN_`` id, such as the remote-display driver) are skipped; an
adapter subkey without a readable id keeps empty ids so it counts as unreadable.
ÚVEN_ÚDEV_r   )ÚupperÚappendr  rÂ   )r  Úadaptersry   Úmatching_idÚdescriptionr  s   &     r   Úparse_windows_display_adaptersr    sz   € ð €HÛ,0Ñ(ˆ˜[Ø×!Ñ!Ó#ˆØ�UŒ?Ø�O‰OœZ¨¨vÓ6¼
À5È&Ó8QÐS^Ð_Ö`Ø�^‰^×Ô§k¡kØ�O‰O˜R  [Ð1Ö2ñ -1ð €Or   c               ó   € V ^8„  d   QhRR/# )r   r   z'tuple[tuple[str, str, str], ...] | Noner   )r   s   "r   r   r   )  s   € ÷ 7ñ 7Ð#Jñ 7r   c                 óÀ  € ^ RI p . p V P                  V P                  \        4      ;_uu_ 4       p\	        \
        4       FH  p V P                  W#4      p\         RT 2pTP                  T\        TR4      \        TR4      34       KJ  	  RRR4       \        \        T4      4      #   \         d      K+  i ; i  + '       g   i     L7; i  \         d     R# i ; i)r|   NÚ\ÚMatchingDeviceIdÚ
DriverDesc)r}   r~   r   Ú_DISPLAY_CLASS_KEYÚranger  ÚEnumKeyrV   r  r�   Útupler  )r}   r  r  Úindexry   rm   s         r   Ú_windows_display_adaptersr#  (  sÌ   € ãà€Dð
Ø�^‰^˜F×5Ñ5Ô7I×JÔJÈdÜœÖ/�ðØ#Ÿ^™^¨DÓ8�Fô -Ð-¨R°¨xÐ8�Ø—‘˜V¤[°Ð7IÓ%JÌKÐX\Ð^jÓLkÐlÖmñ 0÷ Kô Ô/°Ó5Ó6Ð6øô ô Ûðú÷	 K×Jûô ô ÚðúsR   ˆ(C °B;ÁB(Á7B;ÂC Â(B8	Â3B;Â7B8	Â8B;Â;C	ÃC ÃC ÃCÃCz/usr/lib/wsl/lib/libcuda.so.1c               ó   € V ^8„  d   QhRR/# r!   r   )r   s   "r   r   r   @  s   € ÷ Kñ K�3ñ Kr   c                 ó  €  \         P                  R8X  d(   \        4       R8X  d   R# \        P                  ! 4       p M˜\         P                  R8X  d)   \        4       pVf   RMV UUu. uF  w  p q2NK
  	  uppp M[\        P                  P                  R4      '       g*   \        P                  P                  \        4      '       d   R# \        4       p  V f   R# \        V 4      # u uppi   \        \        \        \        3 d     R# i ; i)	a  Return ``nvidia``/``amd``/``intel``/``apple_silicon``/``none``, or ``unknown``.

Apple silicon by architecture; Intel Macs by IOKit PCI display controllers; Windows by the
display-class registry; Linux by the NVIDIA driver's procfs, the WSL GPU bridge, then sysfs DRM cards.
rU   r   Úapple_siliconr   Nz/proc/driver/nvidia/versionrã   r   )r#   r$   r[   r   Údisplay_vendor_idsr#  rÿ   rm   ÚexistsÚ_WSL_NVIDIA_CUDAr  rW   rV   rX   rY   rø   )Úvendorsr  Úvendorrb   s       r   Ú	gpu_classr,  ?  sÒ   € ðÜ�<‰<˜8Ô#Ü‹} Ô'Ù&Ü ×3Ò3Ó5‰GÜ�\‰\˜WÔ$Ü0Ó2ˆHØ&Ò.‘dÑPXÔ4YÑPXÁÀÈÈ1²VÑPXÒ4Y‰GÜ�W‰W�^‰^Ð9×:Ò:¼b¿g¹g¿n¹nÔM]×>^Ò>^Ùä+Ó-‰Gð  šˆ9ÐJÔ-AÀ'Ó-JÐJùó 5Zøô
 œG¤Y´
Ð;ô Úðús?   ‚$C- ¨C- ¾*C- Á(C'Á6C- Á;$C- Â (C- Ã
C- Ã'C- Ã-DÄDz/proc/driver/nvidia/gpusiÞ  z/sys/bus/pci/devicesc               ó    € V ^8„  d   QhRRRR/# )r   Úinformationr   r   r   )r   s   "r   r   r   \  s   € ÷ ñ ¨ð °ñ r   c                ó´   € V P                  4        FC  pVP                  R4      '       g   K  VP                  R^4      ^,          P                  4       u # 	  R# )zUReturn the ``Model:`` value of a ``/proc/driver/nvidia/gpus/<bus>/information`` file.zModel:r`   r   )re   rf   rg   r   )r.  rj   s   & r   Úparse_nvidia_gpu_modelr0  \  sH   € à×&Ñ&Ö(ˆØ�?‰?˜8×$Ô$Ø—:‘:˜c 1Ó% aÕ(×.Ñ.Ó0Ò0ñ )ñ r   c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )Ú	NvidiaGpuid  r   rz   r/   Úpci_idr   N)rÑ   rÒ   rÓ   rÔ   Ú__annotations__r×   r   r   r   r2  r2  d  s   ‡ Ø
ƒIØ×r   r2  c               ó    € V ^8„  d   QhRRRR/# )r   Ú
device_hexr   r   r/   r   )r   s   "r   r   r   i  s   € ÷ ñ ˜ð  
ñ r   c                ód   €  \        V ^4      ^,          \        ,          #   \         d     R# i ; i)é   N)ro   Ú_NVIDIA_PCI_VENDORrY   )r6  s   &r   Ú_pci_idr:  i  s1   € ðÜ�:˜rÓ" bÕ(Ô+=Õ=Ð=øÜô Úðús   ‚   /®/c               ó    € V ^8„  d   QhRRRR/# )r   r  r  r   útuple[NvidiaGpu, ...]r   )r   s   "r   r   r   p  s   € ÷ .ñ .Ð(Bð .ÐG\ñ .r   c                óZ   € \         ;QJ d    . R V  4       F  NK  	  5# ! R V  4       4      # )z6The NVIDIA entries of parsed Windows display adapters.c              3  ó€   "  € T F4  w  rpVP                  4       R 8X  g   K  \        V\        V4      4      x € K6  	  R# 5i)râ   N)r   r2  r:  )r³   r+  Údevicer  s   &   r   r´   Ú,nvidia_gpus_from_adapters.<locals>.<genexpr>r  s:   é € ð .Ñ\dÑ=X¸VÈ[Ø—L‘L“N fÑ,ô 9”˜;¬°«×8Ð8Ó\dùs   ‚>¡>)r!  )r  s   &r   Únvidia_gpus_from_adaptersrA  p  s4   € çŒ5ñ .Ñ\dó .�5ð .ˆ5ñ .Ñ\dó .ó .ð .r   c               ó   € V ^8„  d   QhRR/# ©r   r   r<  r   )r   s   "r   r   r   v  s   € ÷ 2ñ 2Ð1ñ 2r   c                 óè   €  \        \        P                  ! \        4      4      R \         p R T  4       p\        ;QJ d    . R T 4       F  NK  	  5# ! R T 4       4      #   \
         d    Ru # i ; i)Nc              3  óè   "  € T Fh  p\        \        \        \         R V R2R4      4      \	        \        \
         R V R2^4      P                  4       P                  R4      4      4      x € Kj  	  R# 5i)rý   z/informationrà   z/devicerï   N)r2  r0  rw   Ú_NVIDIA_PROC_GPUSr:  Ú_SYS_PCI_DEVICESr   rõ   )r³   Úbuss   & r   r´   Ú%_linux_nvidia_gpus.<locals>.<genexpr>{  sv   é € ð á�ô Ô,¬ZÔ;LÐ:MÈQÈsÈeÐS_Ð8`ÐbfÓ-gÓhÜœjÔ,<Ð+=¸Q¸s¸eÀ7Ð)KÈRÓP×VÑVÓX×eÑeÐfjÓkÓl÷nð nãùs   ‚A0A2c              3  óL   "  € T F  qP                   '       g   K  Vx € K  	  R # 5irì   )rz   )r³   Úgpus   & r   r´   rI  ~  s   é € Ð1¡˜¯­—’£ùs   ‚$š
$r   )rþ   rÿ   r   rF  r  rV   r!  )ÚbusesÚgpuss     r   Ú_linux_nvidia_gpusrN  v  sl   € ðÜ”r—z’zÔ"3Ó4Ó5Ð6F´ÐGˆñáó€D÷ Œ5Ñ1¡Ó1�5Ð1ˆ5Ñ1¡Ó1Ó1Ð1øô ô ØŠ	ðús   ‚*A! Á!A1Á0A1c               ó   € V ^8„  d   QhRR/# rC  r   )r   s   "r   r   r   ‚  s   € ÷ Lñ LÐ*ñ Lr   c                 ó"  € \         P                  R8X  d(    \        \        \	        4       ;'       g    R4      4      # \         P                  P                  R4      '       d   \        4       # R#   \
        \        \        \        3 d    Ru # i ; i)z™Name and PCI id of each NVIDIA GPU: the Windows display-class registry, or Linux driver procfs
with sysfs PCI ids; empty elsewhere or without the driver.r   Úlinuxr   )r#   r$   rA  Úlistr#  rW   rV   rX   rY   rf   rN  r   r   r   Únvidia_gpusrS  �  sv   € ô ‡|�|�wÔð	Ü,¬TÔ2KÓ2M×2SÐ2SÐQSÓ-TÓUÐUô $'§<¡<×#:Ñ#:¸7×#CÒ#CÔÓÐKÈÐKøô ¤¬´JÐ?ô 	ØŠIð	ús   —%A. Á.BÂBc               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r   �  s   € ÷ 4ñ 4 dñ 4r   c                 ór  € ^ RI p ^ RI Hp V P                  RRR7      pVP                  4       pVP	                  4       pVP                  W0P                  V4      4      '       d   VP                  ^ 8X  d   R# VP                  4       pVR8w  d   WTP                  8X  d   R# \        VP                  4       4      # )r|   Nr7   r9   Tr:   Fl   ÿÿ )r=   r8   r>   ÚGetCurrentProcessIdrÕ   ÚProcessIdToSessionIdrG   rH   ÚWTSGetActiveConsoleSessionIdrO   ÚGetProcessWindowStation)r=   r8   r9   Ú
process_idÚ
session_idÚactive_sessions         r   Ú_windows_interactive_sessionr]  �  s˜   € ÛÝà�}‰}˜Z¸ˆ}Ó=€HØ×-Ñ-Ó/€JØ—‘Ó!€JØ×(Ñ(¨·\±\À*Ó5M×NÒNÐR\×RbÑRbÐfgÔRgÙØ×:Ñ:Ó<€NØ˜Ô#¨×:JÑ:JÔ(JÙÜ�×0Ñ0Ó2Ó3Ð3r   c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   r   œ  s   € ÷ 
ñ 
˜Tñ 
r   c                 ó²  € \         P                  R8X  d    \        4       # \         P                  P                  R4      '       dp   \        R^@4      P                  4       p \        T ;'       dC    V R8g  ;'       d6    \        P                  P                  R\        P                  ! 4        24      4      # R#   \        \        \
        \        3 d     R# i ; i)zBReturn whether this process can reach an interactive user session.r   FrQ  z/proc/self/sessionidÚ
4294967295z
/run/user/T)r#   r$   r]  rW   rV   rX   rY   rf   rw   r   rO   rÿ   rm   ÚisdirÚgetuid)r[  s    r   Úinteractive_sessionrc  œ  s©   € ä
‡|�|�wÔð	Ü/Ó1Ð1ô ‡|�|×Ñ˜w×'Ò'ÜÐ 6¸Ó;×AÑAÓCˆ
Ü�J×kÐk :°Ñ#=×kÐkÄ"Ç'Á'Ç-Á-ÐR\Ô]_×]fÒ]fÓ]hÐ\iÐPjÓBkÓlÐlÙøô ¤¬´JÐ?ô 	Úð	ús   —	B7 Â7CÃCc               ó   € V ^8„  d   QhRR/# )r   r   ÚNoner   )r   s   "r   r   r   ©  s   € ÷ ñ �dñ r   c            	     ó’   € \         \        \        \        \        \
        \        \        \        3	 F  p V P                  4        K  	  R# )zClear every cached host fact.N)
r%   r,   r[   r£   r¾   rá   r,  rS  r#  Úcache_clear)Úfacts    r   Úclear_cachesri  ©  s0   € äœL¬+´yÄ*ÌoÔ_hÜÔ7ó9ˆà×ÑÖó9r   )i   )rã   rå   rç   )<Ú__doc__Ú
__future__r   Ú	functoolsrÿ   r$   r#   r)   Útypingr   Úhermes_platform.hostr   r   r1   r(   r   Úcacher%   r,   r3   rL   rR   r[   r¢   rk   rw   r�   rQ   r—   r�   r£   r·   rº   r¾   rÃ   rÝ   rá   rô   r÷   r  r  rø   r  r  r  r#  r)  r,  rF  r9  rG  r0  r2  r:  rA  rN  rS  r]  rc  ri  r   r   r   Ú<module>rp     ss  ðñõ #ã Û 	Û Û 
Û Ý å +ð ˆW�h ¨°ØˆW�i Ø	ˆ5�&˜% ¨ð€ð
 ˜g v¨w¸ÀÐFÐ ð # G¨[¸'À7ÈEÐRÐ õCð
 ‡�ôó ðð
 ‡�ô.ó ð.õPõ
(õ*7ð
 ‡�ô
ó ð
ð =€ðI¸÷ I÷õõ	õ	õ9ð ‡�ôtó ðtð 	ˆ%��z 4¨°4¸ÀDÈ+ÐW[Ð]eØˆ(�D˜* d¨G°T¸7ÀDÈ+ÐW[Ð]eðÐ õ	ð ‡�ô	=ó ð	=õõ,ð( ‡�ô	Bó ð	Bð ˜H f¨e°V¸WÐEÐ Ø*€ØeÐ Ø€õKõVõ<õð  ‡�ô7ó ð7ð& 3Ð ð ‡�ôKó ðKð. /Ð ØÐ Ø)Ð õô�
ô õ
õ.õ2ð ‡�ôLó ðLõ4õ
÷r   