§
    D›jE‰  ã                   ó¬   — d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	m
Z
 d dlZddlmZ ddlmZmZmZmZmZmZmZmZ defd„Zdd„Z G d	„ d
¦  «        ZdS )é    N)ÚLiteralÚSequenceÚOptionalÚListÚUnionÚAsyncGeneratorÚ	Awaitableé   )Úget_max_items_from_list)ÚUsageLimitExceededErrorÚInvalidAPIKeyErrorÚMissingAPIKeyErrorÚBadRequestErrorÚForbiddenErrorÚTimeoutErrorÚTavilyKeylessLimitErrorÚKeylessUnsupportedEndpointErrorÚreturnc                 óØ   — t          | t          ¦  «        oUt          |                      d¦  «        t          ¦  «        o-t          | d                              d¦  «        t          ¦  «        S )zWReturn True when the response body matches the Tavily recoverable-error envelope shape.ÚerrorÚcode)Ú
isinstanceÚdictÚgetÚstr)Úbodys    úP/home/lighthouse/health/venv/lib/python3.11/site-packages/tavily/async_tavily.pyÚ_is_keyless_enveloper      sX   € õ 	�4�ÑÔð 	7Ý�t—x’x Ñ(Ô(­$Ñ/Ô/ð	7å�t˜G”}×(Ò(¨Ñ0Ô0µ#Ñ6Ô6ðó    c           	      ó   — | d         }t          |                     d¦  «        pd|                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        pg ¬¦  «        ‚)	zHRaise ``TavilyKeylessLimitError`` from an envelope-shaped response body.r   ÚmessageÚ r   ÚwindowÚretry_after_secondsÚnext_actions)r!   r   r#   r$   r%   )r   r   )r   Úerrs     r   Ú_raise_keyless_enveloper'      sv   € à
ˆwŒ-€CÝ
!Ø—’˜	Ñ"Ô"Ð( bØ�WŠW�V‰_Œ_Ø�wŠw�xÑ Ô ØŸGšGÐ$9Ñ:Ô:Ø—W’W˜^Ñ,Ô,Ð2°ðñ ô ð r   c            )       óÖ  — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d_dee         dee         deeeef                  dee         dee         d	ee         d
ee         dee         dee         deej	                 fd„Z
d„ Zd„ Zd„ Zd`dad„Zdeddfd„Zededee         fd„¦   «         Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dbdeded         ded         ded         d ed!ed"ed#ed$ee         d%ee         d&eeed'         f         d(eeed)         f         d*ed+ed,ed-ed.ed/ed0edef(d1„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dbdeded         ded         ded         d ed!ed"ed#ed$ee         d%ee         d&eeed'         f         d(eeed)         f         d*ed+ed,ed-ed.ed/ed0edef(d2„Z	 	 	 	 	 	 	 	 dcd4eee         ef         d*ed5ed'         d6ed)         d+ed.ed/eded7edefd8„Z	 	 	 	 	 	 	 	 dcd4eee         ef         d*ed5ed'         d6ed)         d+ed.ed/eded7edefd9„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddd;ed<ed=ed>ed?ed@ee         dAee         dBee         d%ee         dCed*ed5ed'         d6ed)         d+ed.ed/ed7edef$dD„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddd;ed<ed=ed>ed?ed@ee         dAee         dBee         d%ee         dCed5ed'         d*ed6ed)         d+ed.ed/ed7edef$dE„Z	 	 	 	 	 	 	 	 	 	 	 	 ded;ed<ed=ed>ed?ed@ee         dAee         dBee         d%ee         dCed*ed+ed/edefdF„Z	 	 	 	 	 	 	 	 	 	 	 	 ded;ed<ed=ed>ed?ed@ee         dAee         dBee         d%ee         dCed*ed+ed/edefdG„Z	 	 	 	 	 	 	 	 	 	 dfdeded         ded         d"ed#ed$ee         d%ee         dMed+ed,ed.edefdN„Z 	 	 	 	 	 	 	 	 	 dgdeded         ded         d"ed#ed$ee         d%ee         d+ed,ed.edefdP„Z!	 	 	 	 dhdeded         d#ed+ed,edee         fdQ„Z"	 	 	 	 	 didTedUedV         dWedXedYedZ         d+ee         dee#e$df         e%e         f         fd[„Z&	 	 	 	 	 didTedUedV         dWedXedYedZ         d+ee         deee#e$df         f         fd\„Z'd]edefd^„Z(dS )jÚAsyncTavilyClientz(
    Async Tavily API client class.
    N©ÚnewsÚgeneralÚfinanceÚapi_keyÚcompany_info_tagsÚproxiesÚapi_base_urlÚclient_sourceÚ
project_idÚ
session_idÚhuman_idÚclient_nameÚclientc                 óš  — |€t          j        d¦  «        }|pd }|pt          j        d¦  «        }|pd| _        || _        |d u o|
d u | _        | j        r|pd}n|pd}ddi|rdd	|› �ini ¥| j        rd
dini ¥d|i¥|rd|ini ¥|rd|ini ¥|rd|ini ¥|	rd|	ini ¥}|
d u| _        |
�l|
| _        |                     ¦   «         D ]"\  }}|| j        j        vr|| j        j        |<   Œ#t          | j        j
        ¦  «        s| j        | j        _
        d S d S |pi }|                     dt          j        d¦  «        ¦  «        |                     dt          j        d¦  «        ¦  «        dœ}d„ |                     ¦   «         D ¦   «         }|rd„ |                     ¦   «         D ¦   «         nd }t          j        || j        |¬¦  «        | _        d S )NÚTAVILY_API_KEYÚTAVILY_PROJECTzhttps://api.tavily.comztavily-python-keylessztavily-pythonzContent-Typezapplication/jsonÚAuthorizationzBearer zX-Tavily-Access-ModeÚkeylesszX-Client-SourcezX-Project-IDúX-Session-Idú
X-Human-IdúX-Client-NameÚhttpÚTAVILY_HTTP_PROXYÚhttpsÚTAVILY_HTTPS_PROXY)zhttp://zhttps://c                 ó   — i | ]
\  }}|¯||“ŒS © rE   )Ú.0ÚkeyÚvalues      r   ú
<dictcomp>z.AsyncTavilyClient.__init__.<locals>.<dictcomp>k   s$   € Ð[Ð[Ð[©Z¨S°%ÐUZÐ[˜c 5Ð[Ð[Ð[r   c                 ó@   — i | ]\  }}|t          j        |¬ ¦  «        “ŒS ))Úproxy)ÚhttpxÚAsyncHTTPTransport)rF   ÚschemerK   s      r   rI   z.AsyncTavilyClient.__init__.<locals>.<dictcomp>n   s,   € ÐkÐkÐkÁ=À6È5��Ô1¸Ð>Ñ>Ô>ÐkÐkÐkr   )ÚheadersÚbase_urlÚmounts)ÚosÚgetenvÚ_api_base_urlÚ_company_info_tagsÚ_keylessÚ_external_clientÚ_clientÚitemsrO   r   rP   r   rL   ÚAsyncClient)Úselfr.   r/   r0   r1   r2   r3   r4   r5   r6   r7   Útavily_projectÚclient_source_headerÚdefault_headersrG   rH   Úmapped_proxiesÚproxy_mountss                     r   Ú__init__zAsyncTavilyClient.__init__/   sª  € ð ˆ?Ý”iÐ 0Ñ1Ô1ˆGð �/˜Tˆà#ÐB¥r¤yÐ1AÑ'BÔ'Bˆà)ÐEÐ-EˆÔØ"3ˆÔØ 4˜Ð:¨F°d¨NˆŒàŒ=ð 	Dð $1Ð#KÐ4KÐ Ð à#0Ð#C°OÐ ð Ð.ð	
à9@ÐH�Ð!4¨7Ð!4Ð!4Ð5Ð5Àbð	
ð 7;´mÐKÐ&¨	Ð2Ð2Èð	
ð Ð3ð		
ð 	
ð
 4BÐI� Ð/Ð/Àrð	
ð 0:ÐA� 
Ð+Ð+¸rð	
ð ,4Ð;�˜hÐ'Ð'¸ð	
ð 2=ÐD� Ð-Ð-À"ð	
ˆð !'¨dÐ 2ˆÔàÐØ!ˆDŒLà-×3Ò3Ñ5Ô5ð 6ð 6‘
��UØ˜dœlÔ2Ð2Ð2Ø05�D”LÔ(¨Ñ-øå�t”|Ô,Ñ-Ô-ð ;Ø(,Ô(:�”Ô%Ð%Ð%ð;ð ;ð �m ˆGð #Ÿ;š; v­r¬yÐ9LÑ/MÔ/MÑNÔNØ#ŸKšK¨µ´Ð;OÑ1PÔ1PÑQÔQðð ˆNð
 \Ð[¸>×;OÒ;OÑ;QÔ;QÐ[Ñ[Ô[ˆNð "ðÐkÐkÐTb×ThÒThÑTjÔTjÐkÑkÔkÐkàð õ !Ô,Ø'ØÔ+Ø#ðñ ô ˆDŒLˆLˆLr   c              ƒ   óZ   K  — | j         s!| j                             ¦   «         ƒ d{V —† dS dS )z7Close the client and release connection pool resources.N)rW   rX   Úaclose©r[   s    r   ÚclosezAsyncTavilyClient.closey   sG   è è € àÔ$ð 	(Ø”,×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð	(ð 	(r   c              ƒ   ó
   K  — | S ©NrE   rd   s    r   Ú
__aenter__zAsyncTavilyClient.__aenter__~   s   è è € Øˆr   c              ƒ   ó>   K  — |                       ¦   «         ƒ d {V —† d S rg   )re   )r[   Úexc_typeÚexc_valÚexc_tbs       r   Ú	__aexit__zAsyncTavilyClient.__aexit__�   s,   è è € Ø�jŠj‰lŒlÐÐÐÐÐÐÐÐÐr   r   c                 óv  — |�|}n(	 |                      ¦   «         }n# t          $ r d}Y nw xY w| j        rt          |¦  «        rt	          |¦  «         d}t          |t          ¦  «        r@	 |                     di ¦  «                             dd¦  «        pd}n)# t          $ r d}Y nw xY wt          |t          ¦  «        r|}|j	        dk    rt          |¦  «        ‚|j	        dv rt          |¦  «        ‚|j	        dk    rt          |¦  «        ‚|j	        dk    rt          |¦  «        ‚|                     ¦   «         ‚)	a  Raise an appropriate exception for a non-2xx httpx response.

        On keyless calls, checks the response body for the recoverable-error
        envelope shape and raises ``TavilyKeylessLimitError`` with the
        envelope's structured fields when present.
        Nr"   Údetailr   i­  )i“  i°  i±  i‘  i�  )ÚjsonÚ	ExceptionrV   r   r'   r   r   r   r   Ústatus_coder   r   r   r   Úraise_for_status)r[   ÚresponseÚbody_overrider   ro   s        r   Ú_handle_error_responsez(AsyncTavilyClient._handle_error_response„   sv  € ð Ð$Ø ˆDˆDðØ—}’}‘”��øÝð ð ð Ø���ðøøøð Œ=ð 	*Õ1°$Ñ7Ô7ð 	*Ý# DÑ)Ô)Ð)àˆÝ�d�DÑ!Ô!ð 	ðØŸš (¨BÑ/Ô/×3Ò3°G¸TÑBÔBÐHÀb��øÝð ð ð Ø���ðøøøå˜�cÑ"Ô"ð 	ØˆFàÔ 3Ò&Ð&Ý)¨&Ñ1Ô1Ð1ØÔ! _Ð4Ð4Ý  Ñ(Ô(Ð(ØÔ! SÒ(Ð(Ý$ VÑ,Ô,Ð,ØÔ! SÒ(Ð(Ý! &Ñ)Ô)Ð)à×+Ò+Ñ-Ô-Ð-s   ‡ œ+ª+Á+,B ÂB'Â&B'Úmethodc                 ó2   — | j         rt          |¦  «        ‚dS )zGRaise ``KeylessUnsupportedEndpointError`` when running in keyless mode.N)rV   r   )r[   rw   s     r   Ú_check_keyless_supportedz*AsyncTavilyClient._check_keyless_supportedª   s$   € àŒ=ð 	:Ý1°&Ñ9Ô9Ð9ð	:ð 	:r   Úkwargsc                 ór   — i }dD ]/\  }}|                       |d¦  «        }|�t          |¦  «        ||<   Œ0|pdS )z¶Pop session_id, human_id, and client_name from kwargs and return them as headers.

        Returns None when no overrides are provided so callers can omit the headers kwarg.
        ))r4   r=   )r5   r>   )r6   r?   N)Úpopr   )rz   Ú	overridesrG   Úheader_namerH   s        r   Ú_pop_request_headersz&AsyncTavilyClient._pop_request_headers¯   sV   € ð ˆ	ð!
ð 	4ð 	4ÑˆC�ð
 —J’J˜s DÑ)Ô)ˆEØÐ Ý),¨U©¬�	˜+Ñ&øØÐ ˜DÐ r   é<   ÚqueryÚsearch_depth)ÚbasicÚadvancedÚfastz
ultra-fastÚtopic)r,   r+   r-   Ú
time_range)ÚdayÚweekÚmonthÚyearÚ
start_dateÚend_dateÚdaysÚmax_resultsÚinclude_domainsÚexclude_domainsÚinclude_answer)rƒ   r„   Úinclude_raw_content)ÚmarkdownÚtextÚinclude_imagesÚtimeoutÚcountryÚauto_parametersÚinclude_faviconÚinclude_usageÚexact_matchc              ‹   óF  K  — i d|“d|“d|“d|“d|“d|“d|“d|“d	|“d
|“d|	“d|
“d|“d|“d|“d|“d|“d|i¥}d„ |                      ¦   «         D ¦   «         }|                      |¦  «        }|r|                     |¦  «         t          |d¦  «        }	  | j        j        dt          j        |¦  «        |dœ|rd|ini ¤Žƒ d{V —†}n"# t          j	        $ r t          |¦  «        ‚w xY w|j        dk    r|                     ¦   «         S |                      |¦  «         dS )zH
        Internal search method to send the request to the API.
        r�   r‚   r†   r‡   rŒ   r�   rŽ   r’   r“   r�   r�   r‘   r–   r˜   r™   rš   r›   rœ   c                 ó   — i | ]
\  }}|®||“ŒS rg   rE   ©rF   ÚkÚvs      r   rI   z-AsyncTavilyClient._search.<locals>.<dictcomp>ï   ó   € Ð?Ð?Ð?™˜˜A°°��1°°°r   éx   ú/search©Úcontentr—   rO   NéÈ   )r¤   )rY   r   ÚupdateÚminrX   Úpostrp   ÚdumpsrL   ÚTimeoutExceptionr   rr   rv   )r[   r�   r‚   r†   r‡   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r–   r—   r˜   r™   rš   r›   rœ   rz   ÚdataÚoverride_headersrt   s                           r   Ú_searchzAsyncTavilyClient._searchÀ   s7  è è € ð4
Ø�Uð
à˜Lð
ð �Uð
ð ˜*ð	
ð
 ˜*ð
ð ˜ð
ð �Dð
ð ˜nð
ð "Ð#6ð
ð ˜;ð
ð ˜ð
ð ˜ð
ð ˜nð
ð �wð
ð ˜ð
ð  ˜ð!
ð" ˜]ð#
ð$ ˜;ð%
ð 
ˆð* @Ð? §¢¡¤Ð?Ñ?Ô?ˆà×4Ò4°VÑ<Ô<ÐØð 	 Ø�KŠK˜ÑÔÐå�g˜sÑ#Ô#ˆð	(Ø.˜Tœ\Ô.ð  dÅ$Ä*ÈTÑBRÔBRÐ\cð  dð  dð  JZð  ibÐirð  uEð  iFð  iFð  `bð  dð  dð  dð  dð  dð  dð  dð  dˆHˆHøÝÔ%ð 	(ð 	(ð 	(Ý˜wÑ'Ô'Ð'ð	(øøøð Ô 3Ò&Ð&Ø—=’=‘?”?Ð"à×'Ò'¨Ñ1Ô1Ð1Ð1Ð1s   Â3C ÃC*c              ‹   óô   K  — t          |d¦  «        } | j        |fi d|“d|“d|“d|“d|“d|“d|“d	|	“d
|
“d|“d|“d|“d|“d|“d|“d|“d|“d|“|¤Žƒ d{V —†}|                     dg ¦  «        }||d<   |S )zr
        Combined search method. Set search_depth to either "basic", "advanced", "fast", or "ultra-fast".
        r£   r‚   r†   r‡   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r–   r—   r˜   r™   rš   r›   rœ   NÚresults)r©   r¯   r   )r[   r�   r‚   r†   r‡   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r–   r—   r˜   r™   rš   r›   rœ   rz   Úresponse_dictÚtavily_resultss                          r   ÚsearchzAsyncTavilyClient.search  s`  è è € õ2 �g˜sÑ#Ô#ˆØ*˜dœl¨5ð -ð -ð -Ø8D¸ð-à16°ð-ð 7A°jð-ð 7A°jð	-ð
 5=°Hð-ð 15°ð-ð 8C°{ð-ð <K¸?ð-ð <K¸?ð-ð ;I¸.ð-ð @SÐ?Rð-ð ;I¸.ð-ð 4;°7ð-ð 4;°7ð-ð <K¸?ð-ð  <K¸?ð!-ð" :G¸ð#-ð$ 8C°{Ø-3ð'-ð -ð -ð -ð -ð -ð -ð -ˆð, '×*Ò*¨9°bÑ9Ô9ˆà#1ˆ�iÑ àÐr   é   ÚurlsÚextract_depthÚformatÚchunks_per_sourcec
           
   ‹   óÌ  K  — |||||||||	dœ	}d„ |                      ¦   «         D ¦   «         }|                      |
¦  «        }|
r|                     |
¦  «         	  | j        j        dt          j        |¦  «        |dœ|rd|ini ¤Žƒ d{V —†}n"# t          j        $ r t          |¦  «        ‚w xY w|j
        dk    r|                     ¦   «         S |                      |¦  «         dS )	zš
        Internal extract method to send the request to the API.
        include_favicon: If True, include the favicon in the extraction results.
        )	r¶   r–   r·   r¸   r—   rš   r›   r�   r¹   c                 ó   — i | ]
\  }}|®||“ŒS rg   rE   rŸ   s      r   rI   z.AsyncTavilyClient._extract.<locals>.<dictcomp>T  r¢   r   ú/extractr¥   rO   Nr§   )r¼   )rY   r   r¨   rX   rª   rp   r«   rL   r¬   r   rr   rv   )r[   r¶   r–   r·   r¸   r—   rš   r›   r�   r¹   rz   r­   r®   rt   s                 r   Ú_extractzAsyncTavilyClient._extract7  sp  è è € ð$ Ø,Ø*ØØØ.Ø*ØØ!2ð

ð 

ˆð @Ð? §¢¡¤Ð?Ñ?Ô?ˆà×4Ò4°VÑ<Ô<ÐØð 	 Ø�KŠK˜ÑÔÐð	(Ø.˜Tœ\Ô.ð  eÅ4Ä:ÈdÑCSÔCSÐ]dð  eð  eð  K[ð  jcÐjsð  vFð  jGð  jGð  acð  eð  eð  eð  eð  eð  eð  eð  eˆHˆHøÝÔ%ð 	(ð 	(ð 	(Ý˜wÑ'Ô'Ð'ð	(øøøð Ô 3Ò&Ð&Ø—=’=‘?”?Ð"à×'Ò'¨Ñ1Ô1Ð1Ð1Ð1s   Á3B ÂB-c
              ‹   ó°   K  —  | j         |||||f||||	dœ|
¤Žƒ d{V —†}|                     dg ¦  «        }|                     dg ¦  «        }||d<   ||d<   |S )z{
        Combined extract method.
        include_favicon: If True, include the favicon in the extraction results.
        )rš   r›   r�   r¹   Nr±   Úfailed_results)r½   r   )r[   r¶   r–   r·   r¸   r—   rš   r›   r�   r¹   rz   r²   r³   r¿   s                 r   ÚextractzAsyncTavilyClient.extractd  s²   è è € ð  ,˜dœm¨DØ,:Ø,9Ø,2Ø,3ð	
.ð
 =LØ:GØ27Ø>Oð
.ð 
.ð /5ð
.ð 
.ð 
.ð 
.ð 
.ð 
.ð 
.ð 
.ˆð '×*Ò*¨9°bÑ9Ô9ˆØ&×*Ò*Ð+;¸RÑ@Ô@ˆà#1ˆ�iÑ Ø*8ˆÐ&Ñ'àÐr   é–   ÚurlÚ	max_depthÚmax_breadthÚlimitÚinstructionsÚselect_pathsÚselect_domainsÚexclude_pathsÚallow_externalc              ‹   ó  K  — i d|“d|“d|“d|“d|“d|“d|“d|“d	|	“d
|
“d|“d|“d|“d|“d|“d|“d|“}|                       |¦  «        }|r|                     |¦  «         d„ |                     ¦   «         D ¦   «         }	  | j        j        dt          j        |¦  «        |dœ|rd|ini ¤Žƒ d{V —†}n"# t          j        $ r t          |¦  «        ‚w xY w|j
        dk    r|                     ¦   «         S |                      |¦  «         dS )zG
        Internal crawl method to send the request to the API.
        rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r–   r·   r¸   r—   rš   r›   r¹   c                 ó   — i | ]
\  }}|®||“ŒS rg   rE   rŸ   s      r   rI   z,AsyncTavilyClient._crawl.<locals>.<dictcomp>·  r¢   r   ú/crawlr¥   rO   Nr§   )rÍ   ©r   r¨   rY   rX   rª   rp   r«   rL   r¬   r   rr   rv   )r[   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r–   r·   r¸   r—   rš   r›   r¹   rz   r­   r®   rt   s                         r   Ú_crawlzAsyncTavilyClient._crawlˆ  s  è è € ð.
Ø�3ð
à˜ð
ð ˜;ð
ð �Uð	
ð
 ˜Lð
ð ˜Lð
ð ˜nð
ð ˜]ð
ð ˜ð
ð ˜nð
ð ˜nð
ð ˜]ð
ð �fð
ð �wð
ð ˜ð
ð  ˜]ð!
ð"  Ð!2ð#
ˆð(  ×4Ò4°VÑ<Ô<ÐØð 	 Ø�KŠK˜ÑÔÐà?Ð? §¢¡¤Ð?Ñ?Ô?ˆð	(Ø.˜Tœ\Ô.ð  cÅÄÈDÑAQÔAQÐ[bð  cð  cð  IYð  haÐhqð  tDð  hEð  hEð  _að  cð  cð  cð  cð  cð  cð  cð  cˆHˆHøÝÔ%ð 	(ð 	(ð 	(Ý˜wÑ'Ô'Ð'ð	(øøøð Ô 3Ò&Ð&Ø—=’=‘?”?Ð"à×'Ò'¨Ñ1Ô1Ð1Ð1Ð1s   Â3B7 Â7Cc              ‹   ó¼   K  — |                       d¦  «          | j        |fi d|“d|“d|“d|“d|“d|“d|“d	|	“d
|
“d|“d|“d|“d|“d|“d|“d|“|¤Žƒ d{V —†}|S )z)
        Combined crawl method.

        ÚcrawlrÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r·   r–   r¸   r—   rš   r›   r¹   N)ry   rÏ   )r[   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r·   r–   r¸   r—   rš   r›   r¹   rz   r²   s                       r   rÑ   zAsyncTavilyClient.crawlÃ  s*  è è € ð0 	×%Ò% gÑ.Ô.Ð.Ø)˜dœk¨#ð .ð .ð .Ø.7¨ið.à0;°ð.ð +0¨%ð.ð 2>°ð	.ð
 2>°ð.ð 4B°>ð.ð 3@°-ð.ð 5D°Oð.ð 4B°>ð.ð 3@°-ð.ð 4B°>ð.ð ,2¨6ð.ð -4¨Gð.ð 5D°Oð.ð 3@°-ð.ð  7HÐ6GØ&,ð#.ð .ð .ð .ð .ð .ð .ð .ˆð& Ðr   c              ‹   óÔ  K  — |||||||||	|
|||dœ}|                       |¦  «        }|r|                     |¦  «         d„ |                     ¦   «         D ¦   «         }	  | j        j        dt          j        |¦  «        |dœ|rd|ini ¤Žƒ d{V —†}n"# t          j        $ r t          |¦  «        ‚w xY w|j
        dk    r|                     ¦   «         S |                      |¦  «         dS )	zE
        Internal map method to send the request to the API.
        )rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r–   r—   r›   c                 ó   — i | ]
\  }}|®||“ŒS rg   rE   rŸ   s      r   rI   z*AsyncTavilyClient._map.<locals>.<dictcomp>  r¢   r   ú/mapr¥   rO   Nr§   )rÔ   rÎ   )r[   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r–   r—   r›   rz   r­   r®   rt   s                     r   Ú_mapzAsyncTavilyClient._mapñ  s{  è è € ð( Ø"Ø&ØØ(Ø(Ø,Ø*Ø.Ø,Ø,ØØ*ð
ð 
ˆð   ×4Ò4°VÑ<Ô<ÐØð 	 Ø�KŠK˜ÑÔÐà?Ð? §¢¡¤Ð?Ñ?Ô?ˆð	(Ø.˜Tœ\Ô.ð  a½t¼zÈ$Ñ?OÔ?OÐY`ð  að  að  GWð  f_Ðfoð  rBð  fCð  fCð  ]_ð  að  að  að  að  að  að  að  aˆHˆHøÝÔ%ð 	(ð 	(ð 	(Ý˜wÑ'Ô'Ð'ð	(øøøð Ô 3Ò&Ð&Ø—=’=‘?”?Ð"à×'Ò'¨Ñ1Ô1Ð1Ð1Ð1s   Á3B ÂB1c              ‹   óv   K  — |                       d¦  «          | j        |f||||||||	|
|||dœ|¤Žƒ d{V —†}|S )z'
        Combined map method.

        Úmap)rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r–   r—   r›   N)ry   rÕ   )r[   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   r‘   rÊ   r–   r—   r›   rz   r²   s                   r   r×   zAsyncTavilyClient.map$  s�   è è € ð( 	×%Ò% eÑ,Ô,Ð,Ø'˜dœi¨ð .Ø.7Ø0;Ø*/Ø1=Ø1=Ø3AØ2?Ø4CØ3AØ3AØ,3Ø2?ð.ð .ð '-ð.ð .ð .ð .ð .ð .ð .ð .ˆð Ðr   rƒ   r,   é   é   é   Ú
max_tokensc              ‹   ó  K  — |                       d¦  «         t          |	d¦  «        }	 | j        |f||||||ddd|	|
|dœ|¤Žƒ d{V —†}|                     dg ¦  «        }d„ |D ¦   «         }t	          j        t          ||¦  «        ¦  «        S )a‰  
        Get the search context for a query. Useful for getting only related content from retrieved websites
        without having to deal with context extraction and limitation yourself.

        max_tokens: The maximum number of tokens to return (based on openai token compute). Defaults to 4000.

        Returns a string of JSON containing the search context up to context limit.
        Úget_search_contextr£   F)r‚   r†   rŽ   r�   r�   r‘   r’   r“   r–   r—   r˜   rš   Nr±   c                 ó0   — g | ]}|d          |d         dœ‘ŒS )rÂ   r¦   )rÂ   r¦   rE   )rF   Úsources     r   ú
<listcomp>z8AsyncTavilyClient.get_search_context.<locals>.<listcomp>r  s)   € Ð^Ð^Ð^ÈF˜6 %œ=°V¸IÔ5FÐGÐGÐ^Ð^Ð^r   )ry   r©   r¯   r   rp   r«   r   )r[   r�   r‚   r†   rŽ   r�   r�   r‘   rÛ   r—   r˜   rš   rz   r²   ÚsourcesÚcontexts                   r   rÝ   z$AsyncTavilyClient.get_search_contextJ  sÝ   è è € ð, 	×%Ò%Ð&:Ñ;Ô;Ð;Ý�g˜sÑ#Ô#ˆØ*˜dœl¨5ð -Ø8DØ16Ø04Ø7BØ;JØ;JØ:?Ø?DØ:?Ø5<Ø3:Ø;Jð-ð -ð .4ð-ð -ð -ð -ð -ð -ð -ð -ˆð  ×#Ò# I¨rÑ2Ô2ˆØ^Ð^ÐV]Ð^Ñ^Ô^ˆÝŒzÕ1°'¸:ÑFÔFÑGÔGÐGr   r„   c              ‹   ó¾   K  — |                       d¦  «         t          |d¦  «        } | j        |f||||||ddd||	|
dœ|¤Žƒ d{V —†}|                     dd¦  «        S )	z`
        Q&A search method. Search depth is advanced by default to get the best answer.
        Ú
qna_searchr£   FT)r‚   r†   rŽ   r�   r�   r‘   r“   r–   r’   r—   r˜   rš   NÚanswerr"   )ry   r©   r¯   r   )r[   r�   r‚   r†   rŽ   r�   r�   r‘   r—   r˜   rš   rz   r²   s                r   rä   zAsyncTavilyClient.qna_searchu  s®   è è € ð  	×%Ò% lÑ3Ô3Ð3Ý�g˜sÑ#Ô#ˆØ*˜dœl¨5ð -Ø8DØ16Ø04Ø7BØ;JØ;JØ?DØ:?Ø:>Ø5<Ø3:Ø;Jð-ð -ð .4ð-ð -ð -ð -ð -ð -ð -ð -ˆð × Ò  ¨2Ñ.Ô.Ð.r   c              ƒ   óN  ‡ ‡‡‡‡‡‡	K  — ‰                       d¦  «         t          ‰d¦  «        Šdt          fˆˆˆˆˆ ˆfd„Š	g }t          j        ˆ	fd„‰ j        D ¦   «         Ž ƒ d{V —†D ]!}d|v r|                     |d         ¦  «         Œ"t          |d„ d	¬
¦  «        d‰…         }|S )z` Company information search method. Search depth is advanced by default to get the best answer. Úget_company_infor£   r†   c           	   “   óL   •K  — ‰                      ‰‰| ‰d‰‰¬¦  «        ƒ d {V —†S )NF)r‚   r†   r�   r’   r—   r˜   )r¯   )r†   r˜   r�   r�   r‚   r[   r—   s    €€€€€€r   Ú_perform_searchz;AsyncTavilyClient.get_company_info.<locals>._perform_search£  sT   øè è € ØŸš eØ3?Ø,1Ø2=Ø5:Ø07Ø.5ð &ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rE   rE   )rF   r†   ré   s     €r   rà   z6AsyncTavilyClient.get_company_info.<locals>.<listcomp>­  s#   ø€ Ð*gÐ*gÐ*gÀe¨?¨?¸5Ñ+AÔ+AÐ*gÐ*gÐ*gr   Nr±   c                 ó   — | d         S )NÚscorerE   )Úxs    r   ú<lambda>z4AsyncTavilyClient.get_company_info.<locals>.<lambda>²  s
   € ¸1¸W¼:€ r   T)rG   Úreverse)ry   r©   r   ÚasyncioÚgatherrU   ÚextendÚsorted)
r[   r�   r‚   r�   r—   r˜   Úall_resultsr­   Úsorted_resultsré   s
   ``````   @r   rç   z"AsyncTavilyClient.get_company_info˜  s  øøøøøøøè è € ð 	×%Ò%Ð&8Ñ9Ô9Ð9Ý�g˜sÑ#Ô#ˆð	7­ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð ˆÝ!œ.Ð*gÐ*gÐ*gÐ*gÈtÔOfÐ*gÑ*gÔ*gÐhÐhÐhÐhÐhÐhÐhð 	4ð 	4ˆDØ˜DÐ Ð Ø×"Ò" 4¨	¤?Ñ3Ô3Ð3øõ   Ð1EÐ1EÈtÐTÑTÔTÐUaÐVaÐUaÔbˆàÐr   FÚnumberedÚinputÚmodel)ÚminiÚproÚautoÚoutput_schemaÚstreamÚcitation_format)rö   ÚmlaÚapaÚchicagoc                 ó$  ‡ ‡‡
‡— |||||dœŠ
d„ ‰
                      ¦   «         D ¦   «         Š
‰                      |¦  «        Š|r‰
                     |¦  «         |r'dt          t          df         fˆ
ˆˆ ˆfd„} |¦   «         S ˆ
ˆˆ ˆfd„}	 |	¦   «         S )zJ
        Internal research method to send the request to the API.
        )r÷   rø   rü   rý   rþ   c                 ó   — i | ]
\  }}|®||“ŒS rg   rE   rŸ   s      r   rI   z/AsyncTavilyClient._research.<locals>.<dictcomp>Ê  r¢   r   r   Nc                 óö  •K  — 	  ‰j         j        	 	 d
t          j        ‰¦  «        ‰dœ‰rd‰ini ¤Ž4 ƒd {V —†	 } | j        dk    r›	 |                      ¦   «         ƒ d {V —†}t          |t          ¦  «        r|                     d¦  «        n|}n# t          $ r d}Y nw xY wd }	 t          j
        |¦  «        }n# t          $ r |}Y nw xY w‰                     | |¬¦  «         |                      ¦   «         2 3 d {V —†}|r|W V — Œ6 	 d d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S # t          j        $ r t          ‰¦  «        ‚t          $ r$}t          d	t!          |¦  «        › �¦  «        ‚d }~ww xY w)NÚPOSTú	/researchr¥   rO   r§   zutf-8zUnknown error)ru   zError during research stream: )r  r  )rX   rý   rp   r«   rr   Úareadr   ÚbytesÚdecoderq   Úloadsrv   Úaiter_bytesrL   r¬   r   r   )	rt   Ú
error_textru   ÚchunkÚer­   r®   r[   r—   s	        €€€€r   Ústream_generatorz5AsyncTavilyClient._research.<locals>.stream_generatorÑ  s¼  øè è € ðOØ2˜tœ|Ô2ØØ#ð õ !%¤
¨4Ñ 0Ô 0Ø 'ð	 ð  ð
 =MÐT˜IÐ'7Ð8Ð8ÐRTð ð  ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð "Ø#Ô/°3Ò6Ð6ð=Ø3;·>²>Ñ3CÔ3CÐ-CÐ-CÐ-CÐ-CÐ-CÐ-C 
ÝKUÐV`ÕbgÑKhÔKhÐ-x¨Z×->Ò->¸wÑ-GÔ-GÐ-GÐnx 
 
øÝ#,ð =ð =ð =Ø-< 
 
 
ð=øøøð -1˜Mð;Ý04´
¸:Ñ0FÔ0F  øÝ#,ð ;ð ;ð ;Ø0:   ð;øøøð !×7Ò7¸ÐP]Ð7Ñ^Ô^Ð^à+3×+?Ò+?Ñ+AÔ+Að ,ð ,ð ,ð ,ð ,ð ,ð , %Ø$ð ,Ø&+    øð ,BÐ+Að-,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,ð ,øõ2 Ô-ð 0ð 0ð 0Ý& wÑ/Ô/Ð/Ý ð Oð Oð OÝ#Ð$MÅSÈÁVÄVÐ$MÐ$MÑNÔNÐNøøøøðOøøøs�   …5D- »DÁABÂDÂBÂDÂBÂDÂ$B9Â8DÂ9CÃDÃCÃ.DÃ6DÃ<
DÄD- Ä
D$Ä$D- Ä'D$Ä(D- Ä-'E8ÅE3Å3E8c               “   ó"  •K  — 	  ‰j         j        dt          j        ‰¦  «        ‰dœ‰rd‰ini ¤Žƒ d {V —†} n"# t          j        $ r t          ‰¦  «        ‚w xY w| j        dk    r|                      ¦   «         S ‰                     | ¦  «         d S )Nr  r¥   rO   r§   )r  )	rX   rª   rp   r«   rL   r¬   r   rr   rv   )rt   r­   r®   r[   r—   s    €€€€r   Ú_make_requestz2AsyncTavilyClient._research.<locals>._make_requestó  sý   øè è € ð0Ø%6 T¤\Ô%6ð  &nÍDÌJÐW[ÑL\ÔL\Ðfmð  &nð  &nð  Tdð  slÐs|ð  Oð  sPð  sPð  jlð  &nð  &nð   nð   nð   nð   nð   nð   n�H�HøÝÔ-ð 0ð 0ð 0Ý& wÑ/Ô/Ð/ð0øøøð Ô'¨3Ò.Ð.Ø#Ÿ=š=™?œ?Ð*à×/Ò/°Ñ9Ô9Ð9Ð9Ð9s	   …39 ¹A)rY   r   r¨   r   r  )r[   r÷   rø   rü   rý   rþ   r—   rz   r  r  r­   r®   s   `     `   @@r   Ú	_researchzAsyncTavilyClient._research¶  s  øøøø€ ð ØØ*ØØ.ð
ð 
ˆð @Ð? §¢¡¤Ð?Ñ?Ô?ˆà×4Ò4°VÑ<Ô<ÐØð 	 Ø�KŠK˜ÑÔÐàð .	#ðO­N½5À$¸;Ô,Gð Oð Oð Oð Oð Oð Oð Oð Oð Oð@ $Ð#Ñ%Ô%Ð%ð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð !�=‘?”?Ð"r   c           
   ‹   óp   K  — |                       d¦  «          | j        d||||||dœ|¤Ž}|r|S |ƒ d{V —†S )a   
        Research method to create a research task.

        Args:
            input: The research task description (required).
            model: Research depth - must be either 'mini', 'pro', or 'auto'.
            output_schema: Schema for the 'structured_output' response format (JSON Schema dict).
            stream: Whether to stream the research task.
            citation_format: Citation format - must be either 'numbered', 'mla', 'apa', or 'chicago'.
            timeout: Optional HTTP request timeout in seconds.
            **kwargs: Additional custom arguments.

        Returns:
            When stream=False: dict - the response dictionary.
            When stream=True: AsyncGenerator[bytes, None] - iterate over this to get streaming chunks.
        Úresearch)r÷   rø   rü   rý   rþ   r—   NrE   )ry   r  )	r[   r÷   rø   rü   rý   rþ   r—   rz   Úresults	            r   r  zAsyncTavilyClient.research   sv   è è € ð2 	×%Ò% jÑ1Ô1Ð1Ø�”ð 
ØØØ+ØØ /Øð
ð 
ð ð
ð 
ˆð ð 	 ØˆMà�<�<�<�<�<�<Ðr   Ú
request_idc              ƒ   ó.  K  — |                       d¦  «         	 | j                             d|› �¦  «        ƒ d{V —†}n$# t          $ r}t          d|› �¦  «        ‚d}~ww xY w|j        dv r|                     ¦   «         }|S |                      |¦  «         dS )zú
        Get research results by request_id.

        Args:
            request_id: The research request ID.

        Returns:
            dict: Research response containing request_id, created_at, completed_at, status, content, and sources.
        Úget_researchz
/research/NzError getting research: )r§   éÊ   )ry   rX   r   rq   rr   rp   rv   )r[   r  rt   r  r­   s        r   r  zAsyncTavilyClient.get_research(  sÅ   è è € ð 	×%Ò% nÑ5Ô5Ð5ð	<Ø!œ\×-Ò-Ð.G¸:Ð.GÐ.GÑHÔHÐHÐHÐHÐHÐHÐHˆHˆHøÝð 	<ð 	<ð 	<ÝÐ:°qÐ:Ð:Ñ;Ô;Ð;øøøøð	<øøøð Ô :Ð-Ð-Ø—=’=‘?”?ˆDØˆKà×'Ò'¨Ñ1Ô1Ð1Ð1Ð1s   ™#= ½
AÁAÁA)
Nr*   NNNNNNNNrg   ©r   N)NNNNNNNNNNNNr€   NNNNN)NNNrµ   NNNN)NNNNNNNNNNNNrÁ   NNN)NNNNNNNNNNrÁ   N)
rƒ   r,   rØ   rÙ   NNrÚ   r€   NN)	r„   r,   rØ   rÙ   NNr€   NN)r„   rÙ   r€   N)NNFrö   N))Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   rL   rZ   ra   re   rh   rm   rv   ry   Ústaticmethodr   r   Úintr   ÚboolÚfloatr¯   r´   r   r½   rÀ   rÏ   rÑ   rÕ   r×   rÝ   rä   rç   r   r  r	   r  r  r  rE   r   r   r)   r)   *   sÄ  € € € € € ðð ð 15Ø4RØ59Ø/3Ø04Ø-1Ø-1Ø+/Ø.2Ø7;ðHð H ¨¤ð HØ$,¨S¤MðHà" 4¨¨S¨¤>Ô2ðHð  (¨œ}ðHð !)¨¤ð	Hð
 & cœ]ðHð & cœ]ðHð $ Cœ=ðHð ' sœmðHð " %Ô"3Ô4ðHð Hð Hð HðT(ð (ð (ð
ð ð ðð ð ð$.ð $.ð $.ð $.ð $.ðL:¨sð :°tð :ð :ð :ð :ð
 ð! Tð !¨h°t¬nð !ð !ð !ñ „\ð!ð& PTØ;?ØBFØ"Ø ØØ#Ø-1Ø-1ØHLØLPØ#'ØØØ$(Ø$(Ø"&Ø $ð)?2ð ?2àð?2ð "Ð"KÔLð?2ð Ð7Ô8ð	?2ð
  Ð >Ô?ð?2ð ð?2ð ð?2ð ð?2ð ð?2ð & cœ]ð?2ð & cœ]ð?2ð " $¨Ð0CÔ(DÐ"DÔEð?2ð "' t¨WÐ5GÔ-HÐ'HÔ!Ið?2ð !ð?2ð ð?2ð  ð!?2ð" "ð#?2ð$ "ð%?2ð&  ð'?2ð( ð)?2ð, 
ð-?2ð ?2ð ?2ð ?2ðF Y]ØDHØKOØ'+Ø%)Ø!%Ø(,Ø6:Ø6:ØQUØUYØ,0Ø&(Ø$(Ø-1Ø-1Ø+/Ø)-ð'4ð 4Øð4à#*Ð+TÔ#Uð4ð $Ð$@ÔAð4ð ")Ð)GÔ!Hð	4ð
 "%ð4ð  #ð4ð ð4ð #&ð4ð '/¨s¤mð4ð '/¨s¤mð4ð &+¨4°Ð9LÔ1MÐ+MÔ%Nð4ð +0°°gÐ>PÔ6QÐ0QÔ*Rð4ð &*ð4ð $ð4ð "ð4ð  '+ð!4ð" '+ð#4ð$ %)ð%4ð& #'ð'4ð* ð+4ð 4ð 4ð 4ðr $(Ø:>Ø26ØØ$(Ø"&ØØ%)ð+2ð +2à˜˜Sœ	 3˜Ô'ð+2ð !ð+2ð #Ð#6Ô7ð	+2ð
 Ð.Ô/ð+2ð ð+2ð "ð+2ð  ð+2ð ð+2ð  #ð+2ð 
ð+2ð +2ð +2ð +2ð^ .2ØDHØ<@Ø')Ø.2Ø,0Ø#'Ø/3ð"ð "Ø! $ s¤)¨S .Ô1ð"à&*ð"ð &-Ð-@Ô%Að"ð &Ð&8Ô9ð	"ð
  %ð"ð (,ð"ð &*ð"ð !ð"ð *-ð"ð  ð"ð "ð "ð "ðL !%Ø"&Ø Ø#'Ø-1Ø/3Ø.2Ø04Ø&*Ø&*Ø=AØ59Ø #Ø'+Ø%)Ø(,ð#92ð 92Øð92àð92ð  ð92ð ð	92ð
 !ð92ð & cœ]ð92ð  (¨œ}ð92ð ' sœmð92ð !)¨¤ð92ð  $ð92ð  $ð92ð &Ð&9Ô:ð92ð Ð1Ô2ð92ð ð92ð !%ð92ð  #ð!92ð" #&ð#92ð& ð'92ð 92ð 92ð 92ðz &*Ø'+Ø!%Ø(,Ø26Ø48Ø37Ø59Ø+/ØBFØ+/Ø:>Ø%(Ø,0Ø*.Ø-1ð#,ð ,Øð,à"ð,ð "%ð,ð ð	,ð
 #&ð,ð #+¨3¤-ð,ð %-¨S¤Mð,ð $,¨C¤=ð,ð &.¨c¤]ð,ð %)ð,ð $+Ð+>Ô#?ð,ð %)ð,ð $Ð$6Ô7ð,ð #ð,ð &*ð,ð  $(ð!,ð" (+ð#,ð& ð',ð ,ð ,ð ,ð` !%Ø"&Ø Ø#'Ø-1Ø/3Ø.2Ø04Ø&*Ø&*Ø #Ø%)ð12ð 12Øð12àð12ð  ð12ð ð	12ð
 !ð12ð & cœ]ð12ð  (¨œ}ð12ð ' sœmð12ð !)¨¤ð12ð  $ð12ð  $ð12ð ð12ð #ð12ð ð12ð 12ð 12ð 12ðj &*Ø'+Ø!%Ø(,Ø26Ø48Ø37Ø59Ø+/Ø+/Ø%(Ø*.ð$ð $Øð$à"ð$ð "%ð$ð ð	$ð
 #&ð$ð #+¨3¤-ð$ð %-¨S¤Mð$ð $,¨C¤=ð$ð &.¨c¤]ð$ð %)ð$ð %)ð$ð #ð$ð $(ð$ð ð$ð $ð $ð $ðP elØPYØ-.Ø45ØBFØBFØ37Ø24Ø04Ø9=ð)Hð )HØ(+ð)Hà/6Ð7`Ô/að)Hð )0Ð0LÔ(Mð)Hð (+ð	)Hð
 /2ð)Hð 3;¸3´-ð)Hð 3;¸3´-ð)Hð .1ð)Hð +0ð)Hð +.ð)Hð 37ð)Hð '*ð)Hð )Hð )Hð )HðZ ]gØHQØ%&Ø,-Ø:>Ø:>Ø*,Ø(,Ø15ð!/ð !/Ø #ð!/à'.Ð/XÔ'Yð!/ð !(Ð(DÔ Eð!/ð  #ð	!/ð
 '*ð!/ð +3°3¬-ð!/ð +3°3¬-ð!/ð #(ð!/ð #&ð!/ð +/ð!/ð "ð!/ð !/ð !/ð !/ðJ cmØ23Ø02Ø.2ðð Ø&)ðà-4Ð5^Ô-_ðð -0ðð ).ð	ð
 ),ðð %-¨T¤Nðð ð ð ð@ ;?Ø(,Ø!&ØR\Ø-1ðH#ð H#ØðH#à Ð!6Ô7ðH#ð "&ðH#ð ð	H#ð
 $+Ð+NÔ#OðH#ð $ Eœ?ðH#ð ˜^¨E°4¨KÔ8¸)ÀD¼/ÐIÔJðH#ð H#ð H#ð H#ðX @DØ-1Ø&+ØWaØ26ð& ð & Ø!ð& à%Ð&;Ô<ð& ð '+ð& ð  $ð	& ð
 )0Ð0SÔ(Tð& ð !)¨¤ð& ð " $¨°u¸d°{Ô(CÐ"CÔDð& ð & ð & ð & ðP2Ø'*ð2à $ð2ð 2ð 2ð 2ð 2ð 2r   r)   r  )rð   rp   rR   Útypingr   r   r   r   r   r   r	   rL   Úutilsr   Úerrorsr   r   r   r   r   r   r   r   r!  r   r'   r)   rE   r   r   ú<module>r&     s@  ðØ €€€Ø €€€Ø 	€	€	€	Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ Và €€€à *Ð *Ð *Ð *Ð *Ð *ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð $ð ð ð ð ð	ð 	ð 	ð 	ðT2ð T2ð T2ð T2ð T2ñ T2ô T2ð T2ð T2ð T2r   