§
    {›j¦  ã                   óv  — 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
mZ d dlmZmZ ddlmZ 	 d dlZd	Zn# e$ r dZd
ZY nw xY wdZdZg d¢Zd„ eD ¦   «         Zd„ eD ¦   «         Zg d¢Zg d¢Zd„ eD ¦   «         Z ej        d¦  «        Zdedefd„Zdedefd„Z de!de!fd„Z"d„ Z# G d„ de
¦  «        Z$dS )é    N)ÚCallable)ÚAny)ÚField)ÚBaseSettingsÚSettingsConfigDict)ÚResponseÚSessioné   )Ú__version__TFz
[REDACTED]Ú7pylf_v1_us_6zTrqKw3YjJBHfpVPVr55wYcJ9sTV6sd4D3C4hsXLfJC)ÚusernameÚpasswordÚrefresh_tokenÚoauth_tokenÚoauth_token_secretÚ	mfa_tokenÚembedc                 óR   — g | ]$}t          j        |› d �t           j        ¦  «        ‘Œ%S )z=[^&\s]*)ÚreÚcompileÚ
IGNORECASE©Ú.0Úkeys     úL/home/lighthouse/health/venv/lib/python3.11/site-packages/garth/telemetry.pyú
<listcomp>r   %   s?   € ð ð ð àõ „J�3Ð Ð Ð ¥"¤-Ñ0Ô0ðð ð ó    c                 ó&   — g | ]}|› d t           › �‘ŒS )ú=)ÚREDACTEDr   s     r   r   r   )   s3   € ð ð ð Ø€sÐÐ�XÐÐðð ð r   )Úaccess_tokenr   ÚjtiÚconsumer_keyÚconsumer_secretr   r   r   )ÚAuthorizationÚCookiez
Set-Cookiec                 ó6   — h | ]}|                      ¦   «         ’ŒS © )Úlower)r   Úhs     r   ú	<setcomp>r+   ;   s    € Ð@Ð@Ð@¨˜1Ÿ7š7™9œ9Ð@Ð@Ð@r   z=[^;]*Úcookie_valueÚreturnc                 óH   — t                                dt          › �| ¦  «        S )z.Sanitize cookie value by redacting all values.r   )Ú_COOKIE_PATTERNÚsubr    )r,   s    r   Úsanitize_cookier1   A   s   € å×Ò˜~¥8˜~˜~¨|Ñ<Ô<Ð<r   Útextc                 ó\  — t          t          t          d¬¦  «        D ]\  }}|                     || ¦  «        } Œ	 t	          j        | ¦  «        }t          |t          ¦  «        r,t          D ]}||v r
t          ||<   Œt	          j
        |¦  «        S n# t          j        t          f$ r Y nw xY w| S )z3Sanitize sensitive data from request/response text.T)Ústrict)ÚzipÚ_QUERY_PARAM_PATTERNSÚ_QUERY_PARAM_REPLACEMENTSr0   ÚjsonÚloadsÚ
isinstanceÚdictÚJSON_SENSITIVE_FIELDSr    ÚdumpsÚJSONDecodeErrorÚ	TypeError)r2   ÚpatternÚreplacementÚdataÚflds        r   ÚsanitizerD   F   sÔ   € õ !$ÝÕ8Àð!ñ !ô !ð .ð .Ñˆ�ð �{Š{˜;¨Ñ-Ô-ˆˆðÝŒz˜$ÑÔˆÝ�d�DÑ!Ô!ð 	$Ý,ð )ð )�Ø˜$�;�;Ý (�D˜‘IøÝ”:˜dÑ#Ô#Ð#ð		$øõ
 Ô ¥)Ð,ð ð ð Øˆðøøøð €Ks   ºAB ÂB)Â(B)Úheadersc                 ó¶   — t          | ¦  «        }t          |                     ¦   «         ¦  «        D ]'}|                     ¦   «         t          v r
t
          ||<   Œ(|S )zSanitize sensitive headers.)r;   ÚlistÚkeysr)   ÚSENSITIVE_HEADERS_LOWERr    )rE   Ú	sanitizedr   s      r   Úsanitize_headersrK   \   sR   € å�W‘”€IÝ�I—N’NÑ$Ô$Ñ%Ô%ð &ð &ˆØ�9Š9‰;Œ;Õ1Ð1Ð1Ý%ˆI�c‰NøØÐr   c                 ó   — | j         S )z@Bypass logfire scrubbing since we've already sanitized all data.)Úvalue)Úms    r   Ú_scrubbing_callbackrO   e   s	   € àŒ7€Nr   c                   ól  — e Zd ZU  edd¬¦  «        ZdZeed<   dZeed<   e	Z
eed<    edd	¬
¦  «        Zeegdf         dz  ed<    ed„ d	¬¦  «        Zeed<   dZeed<   dZeed<    e¦   «         Zeed<   d„ Zdefd„Zdefd„Z	 	 	 	 ddedz  dedz  dedz  deegdf         dz  fd„Zd„ Zdefd„ZdS )Ú	TelemetryÚGARTH_TELEMETRY_Úignore)Ú
env_prefixÚextraFÚenabledÚsend_to_logfireÚtokenNT)ÚdefaultÚexcludeÚcallbackc                  óB   — t          j        ¦   «         j        d d…         S )Né   )ÚuuidÚuuid4Úhexr(   r   r   ú<lambda>zTelemetry.<lambda>u   s   € ¥¤
¡¤Ô 0°°"°Ô 5€ r   )Údefault_factoryrZ   Ú
session_idÚ_logfire_configuredÚ_logfire_instanceÚ_attached_sessionsc                 ó,   — t          ¦   «         | _        d S )N)Úsetrf   )ÚselfÚ_Telemetry__contexts     r   Úmodel_post_initzTelemetry.model_post_init|   s   € Ý"%¡%¤%ˆÔÐÐr   rB   c                 óL   — t           r| j        sdS  | j        j        	 di |¤Ž dS )z'Default callback that sends to logfire.Nú!http {method} {url} {status_code})rm   )ÚLOGFIRE_AVAILABLErd   re   Úinfo)ri   rB   s     r   Ú_default_callbackzTelemetry._default_callback   sM   € å ð 	¨Ô(@ð 	ØˆFØ#ˆÔÔ#Ø/ð	
ð 	
Ø37ð	
ð 	
ð 	
ð 	
ð 	
r   Úresponsec                 ó@  — | j         sdS 	 |j        }|€dS | j        t          |j        |j        |j        t          t          t          |j
        ¦  «        ¦  «        ¦  «        t          t          t          |j
        ¦  «        ¦  «        ¦  «        dœ}|j        rE|j        }t          |t          ¦  «        r|                     dd¬¦  «        }t          |¦  «        |d<   t          |j        ¦  «        |d<   | j        p| j        } ||¦  «         dS # t&          $ r Y dS w xY w)z1Session hook that captures request/response data.N)rc   Úgarth_versionÚmethodÚurlÚstatus_codeÚrequest_headersÚresponse_headerszutf-8Úreplace)ÚerrorsÚrequest_bodyÚresponse_body)rV   Úrequestrc   r   rt   ru   rv   ÚstrrK   r;   rE   Úbodyr:   ÚbytesÚdecoderD   r2   r[   rp   Ú	Exception)ri   rq   ÚargsÚkwargsr}   rB   r   r[   s           r   Ú_response_hookzTelemetry._response_hook‡   s4  € àŒ|ð 	ØˆFð	ØÔ&ˆGØˆØ�à"œoÝ!,Ø!œ.Ø”{Ø'Ô3Ý#&Ý$¥T¨'¬/Ñ%:Ô%:Ñ;Ô;ñ$ô $õ %(Ý$¥T¨(Ô*:Ñ%;Ô%;Ñ<Ô<ñ%ô %ðð ˆDð Œ|ð 6Ø”|�Ý˜d¥EÑ*Ô*ð BØŸ;š; w°y˜;ÑAÔA�DÝ'/°¡~¤~��^Ñ$å$,¨X¬]Ñ$;Ô$;ˆD�Ñ!à”}Ð>¨Ô(>ˆHØˆH�T‰NŒNˆNˆNˆNøÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‹	D –C7D Ä
DÄDc                 ó¬   — |�|| _         |�|| _        |�|| _        |�|| _        | j         sdS | j        €| j        s|                      ¦   «          dS dS dS )a¬  
        Configure telemetry. Disabled by default.

        Args:
            enabled: Enable/disable telemetry (default: False)
            send_to_logfire: Send to Logfire Cloud (default: False)
            token: Logfire write token
            callback: Custom callback for telemetry data. If provided,
                logfire will not be configured and data will be passed
                to this callback instead.
        N)rV   rW   rX   r[   rd   Ú_configure_logfire)ri   rV   rW   rX   r[   s        r   Ú	configurezTelemetry.configure«   s€   € ð$ ÐØ"ˆDŒLØÐ&Ø#2ˆDÔ ØÐØˆDŒJØÐØ$ˆDŒMàŒ|ð 	ØˆFð Œ=Ð ¨Ô)AÐ Ø×#Ò#Ñ%Ô%Ð%Ð%Ð%ð !Ð Ð Ð r   c           	      ó¨   — t           sdS t          j        dd| j        | j        t          j        t          ¬¦  «        d¬¦  «        | _        d| _        dS )z²Configure a local logfire instance for garth telemetry.

        Uses local=True to avoid overwriting logfire configuration
        in applications that integrate garth.
        NTÚgarth)r[   F)ÚlocalÚservice_namerW   rX   Ú	scrubbingÚconsole)	rn   Úlogfirerˆ   rW   rX   ÚScrubbingOptionsrO   re   rd   )ri   s    r   r‡   zTelemetry._configure_logfireÍ   sa   € õ !ð 	ØˆFå!(Ô!2ØØ Ø Ô0Ø”*ÝÔ.Õ8KÐLÑLÔLØð"
ñ "
ô "
ˆÔð $(ˆÔ Ð Ð r   Úsessionc                 ó¸   — t          |¦  «        }|| j        v rdS |j        d                              | j        ¦  «         | j                             |¦  «         dS )zªAttach telemetry hooks to a session.

        This method is idempotent - calling it multiple times with the
        same session will only attach the hook once.
        Nrq   )Úidrf   ÚhooksÚappendr…   Úadd)ri   r‘   rc   s      r   ÚattachzTelemetry.attachà   s]   € õ ˜‘[”[ˆ
Ø˜Ô0Ð0Ð0ØˆFàŒ�jÔ!×(Ò(¨Ô)<Ñ=Ô=Ð=ØÔ×#Ò# JÑ/Ô/Ð/Ð/Ð/r   )NNNN)Ú__name__Ú
__module__Ú__qualname__r   Úmodel_configrV   ÚboolÚ__annotations__rW   ÚDEFAULT_TOKENrX   r~   r   r[   r   r;   rc   rd   re   r   rh   rf   rk   rp   r   r…   rˆ   r‡   r	   r—   r(   r   r   rQ   rQ   j   sÙ  € € € € € € Ø%Ð%Ø%Øðñ ô €Lð
 €GˆTÐÐÑØ!€O�TÐ!Ð!Ñ!Ø€Eˆ3ÐÐÑØ.3¨e¸DÈ$Ð.OÑ.OÔ.O€Hˆh˜�v˜t�|Ô$ tÑ+ÐOÐOÑOØ�eØ5Ð5Øðñ ô €J�ð ð ñ ð !&Ð˜Ð%Ð%Ñ%Ø!Ð�sÐ!Ð!Ñ!Ø!˜c™eœeÐ˜Ð#Ð#Ñ#ð(ð (ð (ð
 dð 
ð 
ð 
ð 
ð" xð "ð "ð "ð "ðL  $Ø'+Ø Ø26ð &ð  &à˜‘ð &ð  ™ð &ð �T‰zð	 &ð
 ˜D˜6 4˜<Ô(¨4Ñ/ð &ð  &ð  &ð  &ðD(ð (ð (ð&0˜gð 0ð 0ð 0ð 0ð 0ð 0r   rQ   )%r8   r   r^   Úcollections.abcr   Útypingr   Úpydanticr   Úpydantic_settingsr   r   Úrequestsr   r	   Úversionr   r�   rn   ÚImportErrorr    rž   Ú_SENSITIVE_QUERY_PARAMSr6   r7   r<   ÚSENSITIVE_HEADERSrI   r   r/   r~   r1   rD   r;   rK   rO   rQ   r(   r   r   ú<module>r¨      s2  ðØ €€€Ø 	€	€	€	Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à  Ð  Ð  Ð  Ð  Ð  ðØ€N€N€NàÐÐøØð ð ð Ø€GØÐÐÐðøøøð
 €ØI€ðð ð Ð ðð à&ðñ ô Ð ðð Ø#:ðñ ô Ð ð
	ð 	ð 	Ð ð >Ð=Ð=Ð Ø@Ð@Ð.?Ð@Ñ@Ô@Ð ð �"”*˜YÑ'Ô'€ð= #ð =¨#ð =ð =ð =ð =ð
�3ð ˜3ð ð ð ð ð,˜dð  tð ð ð ð ðð ð ð
A0ð A0ð A0ð A0ð A0�ñ A0ô A0ð A0ð A0ð A0s   ¶= ½	A	ÁA	