o
    \h=                     @   s  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mZ d dl	m
Z
mZmZ d dlmZm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 d d	lmZmZmZmZmZ d d
lm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>m?Z? d dl@mAZA zd dlBZBW n eCy   d dlDZBY nw ejEeefZFdZGdd ZHdeIeJe
f fddZKG dd deLZMdd ZNdd ZOdS )    N)datetime	timedelta)AnyOptionalUnion)UUIDuuid4)tzutc)string_types)Consumer)ExceptionCapture)exc_info_from_errorexceptions_from_error_tuplehandle_in_appexception_is_already_capturedmark_exception_as_captured)InconclusiveMatchErrormatch_feature_flag_properties)Poller)DEFAULT_HOSTAPIError
batch_postdetermine_server_hostflagsgetremote_config)_get_current_contextget_context_distinct_idget_context_session_id)
FeatureFlagFeatureFlagResultFlagMetadataFlagsAndPayloadsFlagsResponse	FlagValuenormalize_flags_responseto_flags_and_payloadsto_payloads	to_values)SizeLimitedDictcleanguess_timezoneremove_trailing_slash)VERSIONiP  c                  C   s   d} d}t j}|dr!d} ttdrt d }|r|}| |fS |dkr:d} ttdr6t d }|r6|}| |fS |d	rQd
} t }|d rM|d }| |fS |dred} ttdrat }| |fS |} ttdrpt }| |fS )zr
    Returns standardized OS name and version information.
    Similar to how user agent parsing works in JS.
     winWindows	win32_verr   darwinzMac OS Xmac_verlinuxLinuxversionfreebsdFreeBSDrelease)	sysplatform
startswithhasattrr1   r3   distroinfor9   )os_name
os_versionplatform_namewin_versionmac_version
linux_info rF   Q/home/air/segue/gemini/backup/venv/lib/python3.10/site-packages/posthog/client.pyget_os_infoB   s@   






rH   returnc                  C   s*   t  \} }t dtjd d  | |dS )Nz%s.%s.%s   )z$python_runtimez$python_versionz$osz$os_version)rH   r;   python_implementationr:   version_info)r@   rA   rF   rF   rG   system_contextm   s   
rM   c                   @   s   e Zd ZdZedZ													
																diddZedd Z	e	j
dd Z							djddZ				dkdeeeeef f fddZ				dkdeeef fddZ				dkdefddZ				dkdefddZ									dlddZ						djdd Z						djd!d"Z								dmd#d$Z						djd%d&Z							dnd'd(Z							dnd)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Z d3d4 Z!d5d6 Z"i i i dd7de#fd8d9Z$i i i dddd:d;d<Z%di i i dddd=d>e&e# de&e' fd?d@Z(i i i dddd:de&e' fdAdBZ)i i i dddd:de&e# fdCdDZ*dEedFedGeeef dHeeef dIeeef de&e# fdJdKZ+di i i ddddLdMe&e# fdNdOZ,dEedFedGeeef dHeeef dIeeef dPe&e de-e&e. e&e f fdQdRZ/dFedEedSe&e# dTe&e dUedGeeef dPe&e dVe&e dWe&e. fdXdYZ0dEefdZd[Z1dEedMe#de&e fd\d]Z2i i i ddd^de&eeeeef f  fd_d`Z3i i i ddd^defdadbZ4i i i dd7de-eef fdcddZ5dedf Z6dgdh Z7dS )oClientzCreate a new PostHog client.posthogNF'  Td         ?rJ            c                 C   s  t || _ |p	|| _td| jt || _|| _|| _|| _|p!t	| _
t|| _|	| _|| _d | _d | _d | _d | _|| _|| _d | _ttt| _|| _|| _|| _|| _|| _|| _|| _ d | _!|| _"|d u rzzt#$ }W n t%yy   d }Y nw || _&|| _'|rt()  | j*+t(j, n| j*+t(j- |d urt.|r|| _/n| j*0d d | _/nd | _/| jrt1| | j d| _!|rd | _2d S |rt34| j5 t6|D ]"}g | _2t7| j | j| j||||	|
||d
}| j28| |r|9  qd S )Napi_keyz/before_send is not callable, it will be ignored)integrations)hoston_errorflush_atflush_intervalgzipretriestimeouthistorical_migration):queueQueuerV   requirer
   rY   debugsend	sync_moder   raw_hostr   rX   r\   r^   _feature_flagsfeature_flags_by_keygroup_type_mappingcohortspoll_interval%feature_flags_request_timeout_secondspollerr)   MAX_DICT_SIZEset#distinct_ids_feature_flags_reporteddisableddisable_geoipr_   super_propertiesenable_exception_autocapturelog_captured_exceptions"exception_autocapture_integrationsexception_captureprivacy_modeosgetcwd	Exceptionproject_rootpersonal_api_keyloggingbasicConfiglogsetLevelDEBUGWARNINGcallablebefore_sendwarningr   	consumersatexitregisterjoinranger   appendstart)selfrV   rX   rc   max_queue_sizerd   rY   rZ   r[   r\   max_retriesre   r^   threadrk   r}   project_api_keyrq   rr   r_   rl   rs   rt   ru   rv   r|   rx   r   nconsumerrF   rF   rG   __init__}   s   



zClient.__init__c                 C      | j S )z9
        Get the local evaluation feature flags.
        )rg   r   rF   rF   rG   feature_flags   s   zClient.feature_flagsc                 C   s2   |pg | _ dd | j D | _| jdusJ ddS )z9
        Set the local evaluation feature flags.
        c                 S   s$   i | ]}| d dur|d  |qS )keyNr   ).0flagrF   rF   rG   
<dictcomp>  s
    z(Client.feature_flags.<locals>.<dictcomp>NDfeature_flags_by_key should be initialized when feature_flags is set)rg   rh   )r   r   rF   rF   rG   r     s   
c                 C   sz   |d urt jdtdd |d u rt }|pi }td|t td|t d|vr/t r/t |d< |||d|d}| ||S )	NNThe 'context' parameter is deprecated and will be removed in a future version.   
stackleveldistinct_id
properties$session_idz	$identify	timestampr   $seteventuuid)	warningswarnDeprecationWarningr   rb   ID_TYPESdictr   _enqueuer   r   r   contextr   r   rr   msgrF   rF   rG   identify  s(   	
zClient.identifyrI   c                 C      |  |||||}t|pi S )zP
        Get feature flag variants for a distinct_id by calling decide.
        )get_flags_decisionr(   r   r   groupsperson_propertiesgroup_propertiesrr   	resp_datarF   rF   rG   get_feature_variants9     
zClient.get_feature_variantsc                 C   r   )zP
        Get feature flag payloads for a distinct_id by calling decide.
        )r   r'   r   rF   rF   rG   get_feature_payloadsI  r   zClient.get_feature_payloadsc                 C   s   |  |||||}t|S )zU
        Get feature flags and payloads for a distinct_id by calling decide.
        )r   r&   )r   r   r   r   r   rr   resprF   rF   rG   get_feature_flags_and_payloadsY  s   
z%Client.get_feature_flags_and_payloadsc                 C   sr   |du rt  }td|t |du r| j}|rtd|t ni }|||||d}t| j| jfd| ji|}t	|S )zd
        Get feature flags decision, using either flags() or decide() API based on rollout.
        Nr   r   )r   r   r   r   geoip_disabler^   )
r   rb   r   rr   r   r   rV   rX   rl   r%   )r   r   r   r   r   rr   request_datar   rF   rF   rG   r   i  s.   zClient.get_flags_decisionc
              
   C   s  |d urt jdtdd i |pi t }d|vr!t r!t |d< |d u r(t }td|t td|t td|t	 t
 }
|
rJ|
 }|| |}|||||d}|r`td	|t ||d d
< i }i }|rz
| j|||	d}W n- ty } z| jd|  W Y d }~nd }~ww | jr|dkr| j||pi |	dd}|pi  D ]\}}||d| < qdd |pi  D }|r||d< |ri ||d |d< | ||	S )Nr   r   r   r   r   r   r   )r   r   r   r   r   r   z$groups)rr   z0[FEATURE FLAGS] Unable to get feature variants: $feature_flag_calledT)r   rr   only_evaluate_locally	$feature/c                 S   s   g | ]
\}}|d ur|qS )FrF   )r   r   valuerF   rF   rG   
<listcomp>  s
    z"Client.capture.<locals>.<listcomp>z$active_feature_flags)r   r   r   rM   r   r   rb   r   r   r
   r   collect_tagsupdater   r{   r   	exceptionr   get_all_flagsitemsr   )r   r   r   r   r   r   r   r   send_feature_flagsrr   current_contextcontext_tagsr   extra_propertiesfeature_variantsefeaturevariantactive_feature_flagsrF   rF   rG   capture  st   



zClient.capturec                 C   b   |d urt jdtdd |d u rt }|pi }td|t td|t |||d|d}| ||S )Nr   r   r   r   r   r   r   r   r   r   r   rb   r   r   r   r   rF   rF   rG   ro     $   	z
Client.setc                 C   r   )Nr   r   r   r   r   	$set_once)r   r   r   r   r   r   r   rF   rF   rG   set_once
  r   zClient.set_oncec	           
      C   s   |d urt jdtdd |pi }td|t td|t td|t |r+td|t nd||}d	|||d
|||d}	| |	|S )Nr   r   r   
group_type	group_keyr   r   z${}_{}z$groupidentify)z$group_type
$group_keyz
$group_set)r   r   r   r   r   )r   r   r   rb   r   r   formatr   )
r   r   r   r   r   r   r   rr   r   r   rF   rF   rG   group_identify+  s.   zClient.group_identifyc                 C   s^   |d urt jdtdd |d u rt }td|t td|t ||d|d|d}| ||S )	Nr   r   r   previous_idr   )r   aliasz$create_alias)r   r   r   r   )r   r   r   r   rb   r   r   )r   r   r   r   r   r   rr   r   rF   rF   rG   r   T  s$   	
zClient.aliasc           	      C   s   |d urt jdtdd |d u rt }|pi }td|t td|t d|vr/t r/t |d< td|t ||d< d	||||d
}| 	||S )Nr   r   r   r   r   r   urlz$current_urlz	$pageview)r   r   r   r   r   )
r   r   r   r   rb   r   r   r   r
   r   )	r   r   r   r   r   r   r   rr   r   rF   rF   rG   pagev  s,   

zClient.pagec              
   K   s  |d urt jdtdd |d u rt }z|pi }|d ur)t|r)| jd W d S |d u r4d|d< t }td|t	 td|t
 |d urIt|}	nt }	|	d u sU|	d	kr^| jd
 W d S t|	}
tdd|
ii| jd}|d d }|d d|d d|t| j d| j d| d|}| jr| jj||d | |d|||||}|d urt| |W S  ty } z| jd|  W Y d }~d S d }~ww )Nr   r   r   z$Exception already captured, skippingFz$process_person_profiler   r   )NNNz"No exception information availabler   values)r|   r   typer   z	/project/z/person/)z$exception_typez$exception_messagez$exception_listz$exception_personURL)extraz
$exceptionzFailed to capture exception: )r   r   r   r   r   r   rc   r   rb   r   r   r   r:   exc_infor   r   r   r|   r   r,   rf   rV   ru   r   r   r   r{   )r   r   r   r   r   r   r   r   kwargsr   all_exceptions_with_tracer   $all_exceptions_with_trace_and_in_appresr   rF   rF   rG   capture_exception  sl   

 zClient.capture_exceptionc              
   C   s  | j rdS |d }|du rtjt d}td|t t|}| |d< d|v r5|d}|r5t||d< |	ds>i |d< d|d d< t
|d d	< |du rQ| j}|rYd
|d d< | jrgi |d | j|d< t|	dd|d< t|}| jrz| |}|du r| jd W dS |}W n ty } z| jd|  W Y d}~nd}~ww | jd| | jsd
|fS | jr| jd|d  t| j| j| j| j|g| jd d
|fS z| jj|dd | jd|d  d
|fW S  tjy   | jd d|f Y S w )z8Push a new `msg` onto the queue, return `(success, msg)`)Frq   r   Ntzr   r   zposthog-pythonz$libz$lib_versionTz$geoip_disabler   z%Event dropped by before_send callback)TNzError in before_send callback: zqueueing: %szenqueued with blocking %s.r   )r\   r^   batchr_   F)blockzenqueued %s.zanalytics-python queue is full)rq   r   nowr	   rb   r+   	isoformatpopstringify_idr   r-   rr   rs   r*   r   r   rc   r{   r   rd   re   r   rV   rX   r\   r^   r_   r`   putFullr   )r   r   rr   r   r   modified_msgr   rF   rF   rG   r     sr   


	
zClient._enqueuec                 C   s(   | j }| }|  | jd| dS )z4Forces a flush from the internal queue to the serverz$successfully flushed about %s items.N)r`   qsizer   r   rc   )r   r`   sizerF   rF   rG   flushD  s   zClient.flushc              	   C   sJ   | j D ]}|  z|  W q ty   Y qw | jr#| j  dS dS )zbEnds the consumer thread once the queue is empty.
        Blocks execution until finished
        N)r   pauser   RuntimeErrorrm   stop)r   r   rF   rF   rG   r   L  s   
zClient.joinc                 C   s(   |    |   | jr| j  dS dS )z2Flush all messages and cleanly shutdown the clientN)r   r   rw   closer   rF   rF   rG   shutdown[  s
   zClient.shutdownc              
   C   s>  z&t | jd| j d| jdd}|d pg | _|d pi | _|d p#i | _W nn tyt } zB|jdkrC| j	
d	 | jrBtdd
dn'|jdkra| j	d g | _i | _i | _| jr`tdddn	| j	
d|  W Y d }~n%d }~w ty } z| j	d| j  | j	| W Y d }~nd }~ww tjt d| _d S )Nz*/api/feature_flag/local_evaluation/?token=z&send_cohorts
   r^   r   ri   rj   i  z[FEATURE FLAGS] Error loading feature flags: To use feature flags, please set a valid personal_api_key. More information: https://posthog.com/docs/api/overviewzYou are using a write-only key with feature flags. To use feature flags, please set a personal_api_key More information: https://posthog.com/docs/api/overview)statusmessagei  z[FEATURE FLAGS] PostHog feature flags quota limited, resetting feature flag data.  Learn more about billing limits at https://posthog.com/docs/billing/limits-alertsz#PostHog feature flags quota limitedz-[FEATURE FLAGS] Error loading feature flags: z`[FEATURE FLAGS] Fetching feature flags failed with following error. We will retry in %s seconds.r   )r   r}   rV   rX   r   ri   rj   r   r  r   errorrc   r   r{   rk   r   r   r	   _last_feature_flag_poll)r   responser   rF   rF   rG   _load_feature_flagsc  s\   

zClient._load_feature_flagsc                 C   s^   | j s| jd g | _d S |   | jr| j s-tt| j	d| jd| _| j
  d S d S )NzL[FEATURE FLAGS] You have to specify a personal_api_key to use feature flags.)seconds)intervalexecute)r}   r   r   r   r  rm   is_aliver   r   rk   r   r   rF   rF   rG   load_feature_flags  s   
zClient.load_feature_flagsr   r   r   warn_on_unknown_groupsc                C   s   | ddr
td| dsdS | dpi }| d}|d urk| j t|}	|	s=| jd| d|d	   td
|	|vr_|rQ| jd|d	  d dS | jd|d	  d dS ||	 }
t|||	 |
S t|||| jS )Nensure_experience_continuityFz&Flag has experience continuity enabledactivefiltersaggregation_group_type_indexz)[FEATURE FLAGS] Unknown group type index z for feature flag r   z!Flag has unknown group type indexz2[FEATURE FLAGS] Can't compute group feature flag: z without group names passed in)	r   r   ri   strr   r   rc   r   rj   )r   feature_flagr   r   r   r   r  flag_filtersr  
group_namefocused_group_propertiesrF   rF   rG   _compute_flag_locally  s<   




zClient._compute_flag_locallyr   r   r   r   send_feature_flag_eventsrr   c          
   
   C   s.   | j ||||||||d}	|	d u rd S t|	S )Nr  )get_feature_flagbool)
r   r   r   r   r   r   r   r  rr   r  rF   rF   rG   feature_enabled  s   zClient.feature_enabledoverride_match_valuer   r   r   r   r  rr   r   c                C   sL  t d|t t d|t t d|t | jrd S | ||||\}}d }
d }d }| |||||}|d u}|rL|p9|}|rB| ||nd }t	|||}
n>|sz | 
||||||	\}}t||}
| jd| d|
  W n ty } z| jd|  W Y d }~nd }~ww |r| |||
r|
 nd |
r|
jnd |||	||	 |
S )Nr   r   r   z&Successfully computed flag remotely: #z -> #z-[FEATURE FLAGS] Unable to get flag remotely: )rb   r
   r   r   rq   &_add_local_person_and_group_properties_locally_evaluate_flag_compute_payload_locallyr    from_value_and_payload%_get_feature_flag_details_from_decidefrom_flag_detailsr   rc   r{   r   _capture_feature_flag_called	get_valuepayload)r   r   r   r   r   r   r   r   r  rr   flag_resultflag_details
request_id
flag_valueflag_was_locally_evaluatedlookup_match_valuer)  r   rF   rF   rG   _get_feature_flag_result  st   
zClient._get_feature_flag_resultc          	   
   C   s   | j ||||||||dS )aL  
        Get a FeatureFlagResult object which contains the flag result and payload for a key by evaluating locally or remotely
        depending on whether local evaluation is enabled and the flag can be locally evaluated.

        This also captures the $feature_flag_called event unless send_feature_flag_events is False.
        r  )r0  )	r   r   r   r   r   r   r   r  rr   rF   rF   rG   get_feature_flag_resultA  s   zClient.get_feature_flag_resultc          
   
   C   s*   | j ||||||||d}	|	r|	 S dS )a#  
        Get a feature flag value for a key by evaluating locally or remotely
        depending on whether local evaluation is enabled and the flag can be
        locally evaluated.

        This also captures the $feature_flag_called event unless send_feature_flag_events is False.
        r  N)r1  r(  )
r   r   r   r   r   r   r   r  rr   feature_flag_resultrF   rF   rG   r  ^  s   
zClient.get_feature_flagr   r   r   r   r   c           	   
   C   s   | j d u r| jr|   d }| j rv| jd usJ d| j|}|rvz| j|||||d}| jd| d|  W |S  tyZ } z| jd| d|  W Y d }~|S d }~w t	yu } z| j
d|  W Y d }~|S d }~ww |S )Nr   r   r   r   z$Successfully computed flag locally: z -> zFailed to compute flag z
 locally: z7[FEATURE FLAGS] Error while computing variant locally: )r   r}   r  rh   r   r  r   rc   r   r{   r   )	r   r   r   r   r   r   r  r   r   rF   rF   rG   r"  }  sB   	"zClient._locally_evaluate_flag)match_valuer   r   r   r   r  rr   r4  c                C   s*   | j |||||||||	d	}
|
r|
jS d S )Nr  )r0  r)  )r   r   r   r4  r   r   r   r   r  rr   r2  rF   rF   rG   get_feature_flag_payload  s   zClient.get_feature_flag_payloadrr   c                 C   s@   |  |||||}|d}|d}	|	r|	|nd}
|
|fS )zK
        Calls /decide and returns the flag details and request id
        	requestIdr   N)r   r   )r   r   r   r   r   r   rr   r   r,  r   r+  rF   rF   rG   r%    s   


z,Client._get_feature_flag_details_from_decider  r)  r.  r,  r+  c
                 C   s   | d|d u r	dnt | }
|
| j| vrod|d|d|d| |i}|r)||d< |r/||d< t|	tr[|	jrA|	jjrA|	jj|d	< t|	jtr[|	jjrQ|	jj|d
< |	jj	r[|	jj	|d< | j
|d|||d | j| |
 d S d S )N_z::null::z$feature_flagz$feature_flag_responselocally_evaluatedr   z$feature_flag_payloadz$feature_flag_request_idz$feature_flag_reasonz$feature_flag_versionz$feature_flag_idr   )r   rr   )r  rp   
isinstancer   reasondescriptionmetadatar!   r6   idr   add)r   r   r   r  r)  r.  r   rr   r,  r+  feature_flag_reported_keyr   rF   rF   rG   r'    sD   


z#Client._capture_feature_flag_calledc              
   C   sv   | j rd S | jd u r| jd d S zt| j| j|| jdW S  ty: } z| jd|  W Y d }~d S d }~ww )Nz`[FEATURE FLAGS] You have to specify a personal_api_key to fetch decrypted feature flag payloads.r  z>[FEATURE FLAGS] Unable to get decrypted feature flag payload: )	rq   r}   r   r   r   rX   rl   r{   r   )r   r   r   rF   rF   rG   get_remote_config_payload  s(   
z Client.get_remote_config_payloadc                 C   sh   d }| j d u r	|S | j |}|r2|dpi }|dpi }t|tr(|r(dnt|}||d }|S )Nr  payloadstrue)rh   r   r9  r  r  )r   r   r4  r)  flag_definitionr  flag_payloadslookup_valuerF   rF   rG   r#    s   
zClient._compute_payload_locallyr   r   r   r   rr   c                C   s   | j ||||||d}|d S )NrF  featureFlags)get_all_flags_and_payloads)r   r   r   r   r   r   rr   r  rF   rF   rG   r   4  s   
	zClient.get_all_flagsc             
   C   s   | j rd d dS | ||||\}}| j||||d\}}|rM|sMz| j|||||d}	t|	W S  tyL }
 z| jd|
  W Y d }
~
|S d }
~
ww |S )NrG  featureFlagPayloadsr3  )r   r   r   rr   z:[FEATURE FLAGS] Unable to get feature flags and payloads: )rq   r!  #_get_all_flags_and_payloads_locallyr   r&   r{   r   r   )r   r   r   r   r   r   rr   r  fallback_to_decidedecide_responser   rF   rF   rG   rH  I  s<   



z!Client.get_all_flags_and_payloadsc                C   s   t d|t t d|t | jd u r| jr|   i }i }d}| jrt| jD ]N}	z%| j|	|||||d||	d < | |	d ||	d  }
|
rJ|
||	d < W q$ tyV   d}Y q$ t	yr } z| j
d|  d}W Y d }~q$d }~ww nd}||d|fS )	Nr   r   Fr  r   Tz;[FEATURE FLAGS] Error while computing variant and payload: rI  )rb   r   r   r   r}   r  r  r#  r   r{   r   r   )r   r   r   r   r   r  r   rA  rL  r   matched_payloadr   rF   rF   rG   rK  t  sP   	
z*Client._get_all_flags_and_payloads_locallyc                 C   r   N)r   r   rF   rF   rG   feature_flag_definitions  s   zClient.feature_flag_definitionsc                 C   sH   d|i|pi }i }|r |D ]}d|| i| |pi ||< q||fS )Nr   r   r   )r   r   r   r   r   all_person_propertiesall_group_propertiesr  rF   rF   rG   r!    s   
z-Client._add_local_person_and_group_properties)NNFrP   TNrQ   rR   FrJ   FrS   rT   rU   NNFTFrJ   NFFNNFN)NNNNNN)NNNN)	NNNNNNNFN)NNNNNNNN)NNNNNNN)8__name__
__module____qualname____doc__r~   	getLoggerr   r   propertyr   setterr   r   r  r   r  r   r   r"   r   r#   r   r   ro   r   r   r   r   r   r   r   r   r   r  r  r$   r  r  r   r    r0  r1  r  r"  r5  tupler   r%  r'  r@  r#  r   rH  rK  rP  r!  rF   rF   rF   rG   rN   x   s   

 


(




+
Y
#
#
+
$
*
XN2	
7 
T
"




+





	

7
	
	
/

3rN   c                 C   s$   t ||sd| ||}t|dS )z8Require that the named `field` has the right `data_type`z{0} must have {1}, got: {2}N)r9  r   AssertionError)namefield	data_typer   rF   rF   rG   rb     s   
rb   c                 C   s"   | d u rd S t | tr| S t| S rO  )r9  r
   r  )valrF   rF   rG   r     s
   
r   )Pr   r~   numbersry   r;   r:   r   r   r   typingr   r   r   r   r   r   r>   dateutil.tzr	   sixr
   posthog.consumerr   posthog.exception_capturer   posthog.exception_utilsr   r   r   r   r   posthog.feature_flagsr   r   posthog.pollerr   posthog.requestr   r   r   r   r   r   r   posthog.scopesr   r   r   posthog.typesr   r    r!   r"   r#   r$   r%   r&   r'   r(   posthog.utilsr)   r*   r+   r,   posthog.versionr-   r`   ImportErrorra   Numberr   rn   rH   r   r  rM   objectrN   rb   r   rF   rF   rF   rG   <module>   sZ    $	0+          O