+
     vi"  c                   s   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ]P                  R8X  d   ^ RItM^ RIt]P                  ! ]4      t]P                   ! R4      tRR lt]	RR/R	 l4       t]P                  R8w  dF   ]P                  ]P(                  0]P*                  8:  d   ]	RR
R/R ll4       t]	R 4       tR^ /R ltM]	R 4       tR t ! R R4      t ! R R4      tR# )zSimple key-value based storage for liquidctl drivers.

Copyright Jonas Malaco and contributors
SPDX-License-Identifier: GPL-3.0-or-later
N)literal_eval)contextmanagerwin32XDG_RUNTIME_DIRc                s   \         P                  R8X  d8   \        P                  P	                  \        P
                  ! R4      V 4      .pV# \         P                  R8X  dA   \        P                  P                  \        P                  P	                  RV 4      4      .pV# \         P                  R8X  d   . p\        '       d4   VP                  \        P                  P	                  \        V 4      4       \        P                  P                  R4      '       d0   VP                  \        P                  P	                  RV 4      4       V# \        P                  P	                  RV 4      .pV# )zhReturn base directories for application runtime data.

Directories are returned in order of preference.
r   ZTEMPZdarwinz~/Library/CachesZlinuxz/var/runz/tmp)
sysplatformospathjoingetenvZ
expanduserr   ZappendZisdir)ZappnameZdirs   & 5/usr/lib/python3.14/site-packages/liquidctl/keyval.pyget_runtime_dirsr      s    
 ||wRYYv.89" K! 
	!""277<<0BG#LMN K 
	 ?KK_g>?
 77==$$KKZ9: K VW-.K    sharedFc             #   sl  "   V\         P                  \         P                  ,          \         P                  ,          ,          pV\         P                  8X  d   R pM>V\         P                  8X  d   RpM&V\         P                  8X  d   RpM\	        RV 24      h\         P
                  ! \         P                  ! WR4      VR7      ;_uu_ 4       p\        P                  R8X  d6   \        P                  ! VP                  4       \        P                  ^4       MSV'       d'   \        P                  ! V\        P                  4       M%\        P                  ! V\        P                   4       Vx  V\         P                  8w  d   VP#                  4        RRR4       R#   + '       g   i     R# ; i5i)zr+ZwZrzInvalid os.open() flags: i  )moder   N)r   O_RDONLYO_WRONLYO_RDWR
ValueErrorZfdopenopenr   r   msvcrtZlockingZfilenoZLK_LOCKfcntlZflockZLOCK_SHZLOCK_EXZflush)r   flagsr   ZaccessZ
write_modef   &&$   r   _open_with_lockr   3   s     bkkBKK/"));<F
	2;;	
	2;;	
4UG<==	2774.Z	@	@A<<7"NN188:v~~q9KK5==)KK5==)R[[ GGI 
A	@	@	@s&   CF4AF "A4F 
F4 F1	+	F4dir_fdc             #  s   "   \         P                  ! WW#R7      p Vx  \         P                  ! V4       R#   \         P                  ! T4       i ; i5i)zHHelper function that wraps os.open() and os.close() in a context manager)r   N)r   r   Zclose)r   r   r   r   fds   &&&$ r   _os_openr   O   s7      WWT$6	HHHRLBHHRLs   A8 AAAc              #  s   "   \         P                  ! R4      p\         P                  ! W,          4        Rx  \         P                  ! V4       R#   \         P                  ! T4       i ; i5i)z\Context manager that temporarily sets the specified bits in the umask of the current process  N)r   umask)r   Z	old_umaskr
   r   _umask_bitsr    X   sC      HHUO	
!"	 HHYBHHYs   3A-A A-A**A-r   c               sR   \        V \        P                  V,          4      ;_uu_ 4       p\        P                  ! V4      p\        P                  ! VP
                  4      pWQ,          V8w  d   \        P                  ! W5V,          4       RRR4       R#   + '       g   i     R# ; i)zNHelper function that sets the specified bits in the Unix permissions of a fileN)r   r   r   statZS_IMODEst_modechmod)r   r   r   r   Zstr"   r   r   _chmod_bitsr$   b   sb    dBKK%/00BBll2::.G~(t^, 1000s   A!BB&	c              #   s   "   R x  R # 5iN )r   s   &r   r    r    k   s     s   	c                 s    R # r%   r&   )r   r      &&r   r$   r$   o   s    r   c                   sN   a  ] tR t^st o R t]! 4       3R ltR tR tR t	Rt
V tR# )_FilesystemBackendc                s    \        V\        4      '       g   \        R 4      hVP                  4       '       g   \	        R4      hV# )zkey must strz#key must be valid Python identifier)
isinstanceZstr	TypeErrorZisidentifierr   )selfkeyr'   r   	_sanitizeZ_FilesystemBackend._sanitizet   s:    #s##N++!!BCC
r   c                s   V Uu. uF  q0P                  V4      NK  	  ppV Uu. uF%  p\        P                  P                  ! V.VO5!  NK'  	  upV n        V P                  ^ ,          V n        \        P                  ! \        P                  P                  V P
                  4      RR7       \        ^?4      ;_uu_ 4        \        P                  ! V P
                  RR7       \        V P
                  R4       RRR4       \        P                  RV P
                  4       R# u upi u upi   + '       g   i     L<; i)i    T)Zexist_oki   Nz
data in %s)r-   r   r   r   
_read_dirs
_write_dirZmakedirsZdirnamer    r$   _LOGGERdebug)r+   key_prefixesZruntime_dirsZpZxs   &&&  r   __init__Z_FilesystemBackend.__init__{   s    3?@<aq)<@ DPP<a277<<9L9<P//!,
BGGOODOO4tDKK$70	  
 	lDOO4 A Q  s   D$+D)9D..D>	c                s   V P                    F  p\        P                  P                  W!4      p\        P                  P	                  V4      '       g   KI   \        V\        P                  R R7      ;_uu_ 4       pVP                  4       P                  4       pRRR4       X'       g   K  \        V4      p\        P                  RWV4       Vu # 	  \        P                  RV4       R#   + '       g   i     LZ; i  \         d#   p\        P                  RY74        Rp?EK  Rp?i\        \        \         \"        \$        3 d#   p\        P                  RY4        Rp?EKZ  Rp?ii ; i)Tr   Nloaded %s=%r (from %s)#%s exists but could not be read: %s%s exists but was corrupted: %sno data (file) found for %s)r.   r   r   r   isfiler   r   readstripr    r0   r1   OSErrorwarningr   r*   SyntaxErrorMemoryErrorRecursionError)r+   r,   baser   r   datavalueerrs   &&      r   loadZ_FilesystemBackend.load   s    OOD77<<*D77>>$''$T2;;tDD668>>+D E $T*6DI % $( 	3S9! ED  R EtQQ	;^T M A3LLMsH   $C?;C,C?,"C?,C<7C??E,
D''!E,	E,
E''E,c                s   \        V4      p\        P                  P                  V P                  V4      p\        V\        P                  \        P                  ,          \        P                  ,          4      ;_uu_ 4       pVP                  V4       R R R 4       \        P                  RWV4       R #   + '       g   i     L); i)Nzstored %s=%r (in %s))reprr   r   r   r/   r   r   O_CREATZO_TRUNCwriter0   r1   )r+   r,   rC   rB   r   r   s   &&&   r   storeZ_FilesystemBackend.store   sv    E{ww||DOOS1T2;;#;bjj#HIIQGGDM J 	,c$? JIs   B55C	c           
     s$   R pR p\         P                  P                  V P                  V4      p\	        V\         P
                  \         P                  ,          4      ;_uu_ 4       pV P                   EF  p\         P                  P                  Wq4      p\         P                  P                  V4      '       g   KJ   \         P                  P                  W4      '       d1   VP                  4       P                  4       p	VP                  ^ 4       MK\	        V\         P                  RR7      ;_uu_ 4       p
V
P                  4       P                  4       p	R R R 4       X	'       g   K  \        V	4      p\        P!                  RWV4        M	  \        P!                  RV4       V! V4      p\1        V4      p	VP3                  V	4       VP5                  4        \        P!                  RWV4       R R R 4       W43#   + '       g   i     L; i  \"         d#   p\        P%                  RY4        R p?EK  R p?i\&        \(        \*        \,        \.        3 d#   p\        P%                  RY4        R p?EK  R p?ii ; i  + '       g   i     Y43# ; i)NTr4   r5   r6   r7   r8   z"replaced with %s=%r (stored in %s))r   r   r   r/   r   r   rG   r.   r9   Zsamefiler:   r;   Zseekr   r    r0   r1   r<   r=   r   r*   r>   r?   r@   rF   rH   Ztruncate)r+   r,   funcrC   Z	new_valuer   r   rA   Z	read_pathrB   ZauxrD   s   &&&         r   
load_storeZ_FilesystemBackend.load_store   s   	ww||DOOS1 T299rzz#9::a GGLL3	ww~~i00Qww''	88 vvx~~/q	,YDQQUX#&88:#3#3#5D R   (.EMM":C	R% (0 ;SAUI	?DGGDMJJLMM>PTUI ;L !!3 RQ  [OO$I9ZZ"I{KX QOO$EsPPQ1 ;:L !!su   &AI=>A9H7G:H&I=("H
A%I=:H
HI:	H5	.I=5!I:	I:	I5	.I=5I:	:I==J	)r.   r/   N)__name__
__module____qualname____firstlineno__r-   r   r3   rE   rI   rK   __static_attributes____classdictcell__Z__classdict__   @r   r(   r(   s   s-      3C2D 50@-" -"r   r(   c                   sH   a  ] tR t^t o RtRR ltR	R ltR	R ltR tRt	V t
R# )
RuntimeStorageUnstable API.Nc                s8    V'       g   \        V4      pW n        R # r%   )r(   _backend)r+   r2   Zbackend   &&&r   r3   ZRuntimeStorage.__init__   s    (6Gr   c                s~    V P                   P                  V4      pVf   V# V'       d   \        WB4      '       g   V# V# rU   )rV   rE   r)   )r+   r,   of_typedefaultrC   s   &&&& r   rE   ZRuntimeStorage.load   s9     ""3'=NZ77NLr   c                sN   aaa VVV3R lpV P                   P                  W4      # )rU   c                 sZ   < V f   Sp MS'       d   \        V S4      '       g   Sp S! V 4      # r%   )r)   )rC   rZ   rJ   rY   s   &r   lZ$RuntimeStorage.load_store.<locals>.l   s+    }E7!;!;;r   )rV   rK   )r+   r,   rJ   rY   rZ   r[   s   &&fff r   rK   ZRuntimeStorage.load_store   s    	 }}''//r   c                s<    V P                   P                  W4       V# rX   )rV   rI   )r+   r,   rC   rW   r   rI   ZRuntimeStorage.store   s    C'r   )rV   r%   )NN)rL   rM   rN   rO   __doc__r3   rE   rK   rI   rP   rQ   rR   rS   r   rT   rT      s!      


0 r   rT   )Z	liquidctl)r   )r\   Zloggingr   r!   r   ZtempfileZastr    Z
contextlibr   r   r   r   Z	getLoggerrL   r0   r	   r   r   r   r#   Zsupports_fdr   r    r$   r(   rT   r&   r   r   <module>r]      s    	  
   %<<7 

H
%))-.4 5  4 <<72bnnDD      - -  f" f"R# #r   