§
    Êj…  ã                  ó”  — d Z ddlm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 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 ddlmZmZmZ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'm(Z( ddl)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0  ej1        e2¦  «        Z3dZ4dZ5dZ6dZ7d!d„Z8e G d„ d¦  «        ¦   «         Z9 G d„ d e&¦  «        Z:dS )"aZ  Browser driver: operates the muse.ai web client in headless Chromium over CDP.

Design notes
------------
* One Chromium process; each account gets its own *browser context* (isolated
  cookie jar), so switching accounts never requires clearing cookies.
* One tab per account, reused across requests. Per-account serialisation is
  guaranteed by the account pool (``MUSE2API_ACCOUNT_MAX_CONCURRENCY=1``).
* A follow-up from the same user stays on that tab when the new ``messages``
  continue the conversation already on the page. Anything else opens a fresh
  thread, so two users never share a page.
é    )ÚannotationsN)ÚAsyncIteratorÚCallable)Ú	dataclassÚfield)ÚAny)Úurlsplité   )ÚAccount)ÚSettings)Úfollowup_text)ÚUpstreamAuthErrorÚUpstreamErrorÚUpstreamQuotaErrorÚUpstreamRefusedÚUpstreamTimeout)Úmuseé   )ÚChatRequestÚDriverCapabilitiesÚImageRequestÚ
InputImageÚMediaResultÚ
MuseDriverÚSessionInfoÚVideoRequesté   )Údom)ÚCDPErrorÚ
CDPSession)ÚChromiumProcessÚfind_chromiumg333333Ã?é   é   é   ÚurlÚstrÚreturnÚboolc                ó†   — t          | ¦  «        j                             d¦  «        }|                     d¦  «        o|dk    S )z:A real muse conversation, not the empty "new thread" page.ú/z/thread/z/thread/new)r	   ÚpathÚrstripÚ
startswith)r&   r,   s     ú;C:\Projects\Muse2API\src\muse2api\drivers\browser\driver.pyÚis_thread_urlr0   <   s:   € å�C‰=Œ=Ô×$Ò$ SÑ)Ô)€DØ�?Š?˜:Ñ&Ô&Ð@¨4°=Ò+@Ð@ó    c                  óØ   — e Zd ZU ded<   ded<   ded<   ded<   dZded	<    ee¬
¦  «        Zded<   dZded<   dZ	ded<   dZ
ded<   	 dZded<   dZded<   	 dZded<   edd„¦   «         ZdS )Ú_Tabr'   Ú
account_idÚ
context_idÚ	target_idr    ÚsessionNú
str | NoneÚhint)Údefault_factoryzlist[tuple[str, str]]Úturnsr   ÚintÚimage_countÚ Ú
thread_urlÚ
quota_noteFr)   ÚbusyÚstaleÚclosedr(   c                ó8   — t          | j        p| j        ¦  «        S ©N)r)   r;   r?   ©Úselfs    r/   Ú	has_statez_Tab.has_stateS   s   € å�D”JÐ1 $¤/Ñ2Ô2Ð2r1   )r(   r)   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r9   r   Úlistr;   r=   r?   r@   rA   rB   rC   ÚpropertyrH   © r1   r/   r3   r3   B   sö   € € € € € € à€O€O�OØ€O€O�OØ€N€N�NØÐÐÑØ€DÐÐÐÑØ#( 5¸Ð#>Ñ#>Ô#>€EÐ>Ð>Ð>Ñ>Ø€KÐÐÐÑØ€JÐÐÐÑØ€JÐÐÐÑØTØ€DÐÐÐÑØ€EÐÐÐÑØ?Ø€FÐÐÐÑàð3ð 3ð 3ñ „Xð3ð 3ð 3r1   r3   c                  ó°  — e Zd ZdZ edddddd¬¦  «        ZdYd„ZdZd	„ZdZd
„Zd[d„Z		 d\d]d„Z
d^d„ZdZd„Zd_d„Zd`d„Zd^d„Zd^d„Zedad„¦   «         Zed^d„¦   «         Zdbd „Zdcd$„Zddd%„Zded'„Zd^d(„Zdfd+„Zdgd-„Zdhd/„Zdid0„Zd^d1„Zded2„Zd^d3„Zdjd4„Z dkd6„Z!ed\dld<„¦   «         Z"d=d>d?œZ#d@Z$dmdF„Z%dGZ&dHZ'dIZ(dJZ)e*dndM„¦   «         Z+dodP„Z,dpdQ„Z-dqdT„Z.drdV„Z/dsdX„Z0dS )tÚBrowserDriverÚbrowserT)ÚchatÚchat_imagesÚimageÚ
image_editÚvideoÚrenew_sessionÚsettingsr   r(   ÚNonec                óº   — || _         d | _        d | _        i | _        i | _        i | _        t          j        ¦   «         | _        t          j	        ¦   «         | _
        d S rE   )rY   Ú	_chromiumÚ_browserÚ	_contextsÚ_tabsÚ_openingÚasyncioÚ	ConditionÚ	_tab_condÚLockÚ	_ctx_lock)rG   rY   s     r/   Ú__init__zBrowserDriver.__init__^   sO   € Ø ˆŒØ15ˆŒØ+/ˆŒð *,ˆŒØ,.ˆŒ
Ø(*ˆŒÝ Ô*Ñ,Ô,ˆŒÝ œ™œˆŒˆˆr1   c              ƒ  ón  K  — t          | j        j        ¦  «        }t          || j        j        | j        j        | j        j        | j        j        ¬¦  «        | _        | j         	                    ¦   «         ƒ d {V —†}t          j        |¦  «        ƒ d {V —†| _        t                               d¦  «         d S )N)Úproxyzbrowser driver ready)r"   rY   Úchromium_pathr!   Úcdp_portÚprofile_dirÚheadlessÚbrowser_proxyr\   Ústartr    Úconnectr]   ÚlogÚinfo)rG   ÚexeÚws_urls      r/   ÚstartupzBrowserDriver.startupk   s²   è è € Ý˜DœMÔ7Ñ8Ô8ˆÝ(Ø�”Ô'¨¬Ô)BÀDÄMÔDZØ”-Ô-ð
ñ 
ô 
ˆŒð ”~×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-ˆÝ(Ô0°Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆŒÝ�ŠÐ'Ñ(Ô(Ð(Ð(Ð(r1   c              ƒ  óR  K  — t          | j                             ¦   «         ¦  «        D ]/}t          |¦  «        D ]}|                      |¦  «        ƒ d {V —† ŒŒ0| j        r| j                             ¦   «         ƒ d {V —† | j        r!| j                             ¦   «         ƒ d {V —† d S d S rE   )rM   r_   ÚvaluesÚ
_close_tabr]   Úcloser\   Ústop)rG   ÚtabsÚtabs      r/   ÚshutdownzBrowserDriver.shutdownu   sÜ   è è € Ý˜œ×*Ò*Ñ,Ô,Ñ-Ô-ð 	+ð 	+ˆDÝ˜D‘z”zð +ð +�Ø—o’o cÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ð+àŒ=ð 	(Ø”-×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØŒ>ð 	(Ø”.×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð	(ð 	(r1   údict[str, Any]c              ƒ  óØ   K  — | j         d uo| j         j         }d„ | j                             ¦   «         D ¦   «         }| j        |t          |¦  «        t          d„ |D ¦   «         ¦  «        dœS )Nc                ó   — g | ]	}|D ]}|‘ŒŒ
S rO   rO   )Ú.0ÚtsÚts      r/   ú
<listcomp>z(BrowserDriver.health.<locals>.<listcomp>€   s%   € Ð<Ð<Ð<�b¸Ð<Ð<°A�Ð<Ð<Ð<Ð<r1   c              3  ó$   K  — | ]}|j         V — Œd S rE   ©rA   ©r€   r‚   s     r/   ú	<genexpr>z'BrowserDriver.health.<locals>.<genexpr>‚   s$   è è € Ð 6Ð 6¨A ¤Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6r1   )ÚdriverÚokrz   Ú	busy_tabs)r]   rC   r_   rv   ÚnameÚlenÚsum)rG   r‰   rz   s      r/   ÚhealthzBrowserDriver.health~   sx   è è € ØŒ] $Ð&ÐC¨t¬}Ô/CÐ+CˆØ<Ð<˜DœJ×-Ò-Ñ/Ô/Ð<Ñ<Ô<ˆØœ)¨2µs¸4±y´yÝ Ð 6Ð 6°Ð 6Ñ 6Ô 6Ñ6Ô6ð8ð 8ð 	8r1   NÚaccountr   ÚpreferúCallable[[_Tab], bool] | Noner3   c              ƒ  ó¨  ‡K  — t          d| j        j        ¦  «        }g }| j        4 ƒd{V —† 	 | j                             |j        g ¦  «        }d„ |D ¦   «         D ],}|                     |¦  «         |                     |¦  «         Œ-d„ |D ¦   «         }t          |¦  «        | j
                             |j        d¦  «        z   |k     }t          ˆfd„|D ¦   «         d¦  «        }	|	s|r,|s*|	pt          d„ |D ¦   «         |d         ¦  «        }
d|
_        nV|r3| j
                             |j        d¦  «        dz   | j
        |j        <   d}
n!| j                             ¦   «         ƒ d{V —† �Œ;	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |D ]}|                      |¦  «        ƒ d{V —† Œ|
r|
S 	 |                      |¦  «        ƒ d{V —†}
| j        4 ƒd{V —† | j
        |j        xx         dz  cc<   |
r:d|
_        | j                             |j        g ¦  «                             |
¦  «         | j                             ¦   «          ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n¥# | j        4 ƒd{V —† | j
        |j        xx         dz  cc<   |
r:d|
_        | j                             |j        g ¦  «                             |
¦  «         | j                             ¦   «          ddd¦  «        ƒd{V —† w # 1 ƒd{V —†swxY w Y   w xY wt$                               d	t          | j        |j                 ¦  «        |j        ¦  «         |
S )
a  Reserve an idle tab of ``account``, opening a new one while under the
        per-account limit. An idle tab matching ``prefer`` wins; without one, a new
        tab beats reusing (and so wiping) a tab that holds another conversation.
        Pair every call with ``_checkin``.r   NTc                óT   — g | ]%}|j         s|j        °|j        s|j        j         ¯#|‘Œ&S rO   )rC   rA   rB   r7   r†   s     r/   rƒ   z+BrowserDriver._checkout.<locals>.<listcomp>�   sY   € ð Yð Yð Y ØœXðYØ./¬fðYØ:;¼'ðYØEFÄYÔEUðY˜!ð Yð Yð Yr1   c                ó    — g | ]}|j         °	|‘ŒS rO   r…   r†   s     r/   rƒ   z+BrowserDriver._checkout.<locals>.<listcomp>”   s   € Ð6Ð6Ð6˜a¨q¬vÐ6˜Ð6Ð6Ð6r1   r   c              3  ó6   •K  — | ]}‰� ‰|¦  «        ¯|V — Œd S rE   rO   )r€   r‚   r�   s     €r/   r‡   z*BrowserDriver._checkout.<locals>.<genexpr>–   s/   øè è € ÐMÐM A°°À6À6È!Á9Ä9°˜a°°°°ÐMÐMr1   c              3  ó(   K  — | ]}|j         °	|V — Œd S rE   ©rH   r†   s     r/   r‡   z*BrowserDriver._checkout.<locals>.<genexpr>˜   s)   è è € Ð(LÐ(L¨qÀÄÐ(L¨Ð(LÐ(LÐ(LÐ(LÐ(LÐ(Lr1   zopened tab %d for account %s)ÚmaxrY   Úaccount_max_concurrencyrc   r_   Ú
setdefaultÚidÚremoveÚappendrŒ   r`   ÚgetÚnextrA   Úwaitrw   Ú	_open_tabÚ
notify_allrp   rq   )rG   r�   r�   ÚlimitÚdeadrz   r‚   ÚidleÚcan_openÚmatchr{   s     `        r/   Ú	_checkoutzBrowserDriver._checkout…   sB  øè è € õ �A�t”}Ô<Ñ=Ô=ˆØˆØ”>ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð,Ø”z×,Ò,¨W¬Z¸Ñ<Ô<�ðYð Y Tð Yñ Yô Yð #ð #�Aà—K’K ‘N”N�NØ—K’K ‘N”N�N�NØ6Ð6 4Ð6Ñ6Ô6�Ý˜t™9œ9 t¤}×'8Ò'8¸¼ÀQÑ'GÔ'GÑGÈ%ÒO�ÝÐMÐMÐMÐM¨ÐMÑMÔMÈtÑTÔT�Øð ˜Tð ¨(ð ØÐV¥4Ð(LÐ(L°DÐ(LÑ(LÔ(LÈdÐSTÌgÑ#VÔ#V�CØ#�C”HØØð Ø04´×0AÒ0AÀ'Ä*ÈaÑ0PÔ0PÐSTÑ0T�D”M '¤*Ñ-Ø�CØð ”n×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ñ',ð ,ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð* ð 	%ð 	%ˆAØ—/’/ !Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Øð 	ØˆJð	,ØŸš wÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/ˆCà”~ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,Ø”˜gœjÐ)Ð)Ô)¨QÑ.Ð)Ð)Ñ)Øð FØ#�C”HØ”J×)Ò)¨'¬*°bÑ9Ô9×@Ò@ÀÑEÔEÐEØ”×)Ò)Ñ+Ô+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,øø�t”~ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,Ø”˜gœjÐ)Ð)Ô)¨QÑ.Ð)Ð)Ñ)Øð FØ#�C”HØ”J×)Ò)¨'¬*°bÑ9Ô9×@Ò@ÀÑEÔEÐEØ”×)Ò)Ñ+Ô+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,øøøõ 	�ŠÐ/µ°T´ZÀÄ
Ô5KÑ1LÔ1LÈgÌjÑYÔYÐYØˆ
sV   ­D=E=Å=
FÆ
FÆ3I/ ÇA0IÉ
I'É*I'É/LÉ=A0K?Ë-LË?
L	Ì	LÌL	ÌLr{   c              ƒ  ó¸   K  — d|_         t          j        |                      ¦   «         ¦  «        ƒ d {V —† |j        r|                      |¦  «        ƒ d {V —† d S d S )NF)rA   ra   ÚshieldÚ_notify_tabsrB   rw   ©rG   r{   s     r/   Ú_checkinzBrowserDriver._checkin²   s{   è è € ð ˆŒÝŒn˜T×.Ò.Ñ0Ô0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØŒ9ð 	'Ø—/’/ #Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð	'ð 	'r1   c              ƒ  ó    K  — | j         4 ƒd {V —† | j                              ¦   «          d d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S rE   )rc   r¢   rF   s    r/   r«   zBrowserDriver._notify_tabsº   sà   è è € Ø”>ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ØŒN×%Ò%Ñ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(s   �=½
AÁ
Ar'   c              ƒ  óh  K  — | j         4 ƒd {V —† | j                             |j        ¦  «        x}r|cd d d ¦  «        ƒd {V —† S | j        sJ ‚| j                             dddi¦  «        ƒ d {V —†}|d         | j        |j        <   |d         cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S )NzTarget.createBrowserContextÚdisposeOnDetachFÚbrowserContextId)re   r^   rž   r›   r]   Úsend)rG   r�   ÚctxÚress       r/   Ú_contextzBrowserDriver._context¾   s‘  è è € Ø”>ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+Ø”n×(Ò(¨¬Ñ4Ô4Ð4ˆsð Øð	+ð 	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð ”=Ð Ð �=Øœ×*Ò*Ð+HÐK\Ð^cÐJdÑeÔeÐeÐeÐeÐeÐeÐeˆCØ),Ð-?Ô)@ˆDŒN˜7œ:Ñ&ØÐ)Ô*ð	+ð 	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s   �#B!ÁAB!Â!
B+Â.B+c              ƒ  ó€  K  — |j                              d¦  «        st          d¦  «        ‚| j        r| j        sJ ‚|                      |¦  «        ƒ d {V —†}| j                             dd|ddœ¦  «        ƒ d {V —†}|d         }t          j        d| j        j	        › d	|› �¦  «        ƒ d {V —†}d
D ] }|                     |› d�¦  «        ƒ d {V —† Œ!|                     dddi¦  «        ƒ d {V —† |                     dddi¦  «        ƒ d {V —† |  
                    ||¦  «        ƒ d {V —† t          |j        |||¦  «        S )NÚ
hatch_sessz-account is missing session cookie: hatch_sesszTarget.createTargetzabout:blankT)r&   r±   Ú	newWindowÚtargetIdzws://127.0.0.1:z/devtools/page/)ÚPageÚRuntimeÚNetworkz.enablez"Emulation.setFocusEmulationEnabledÚenabledzPage.setWebLifecycleStateÚstateÚactive)Úcookiesrž   r   r]   r\   rµ   r²   r    ro   ÚportÚ_set_cookiesr3   r›   )rG   r�   r5   Útargetr6   r7   Údomains          r/   r¡   zBrowserDriver._open_tabÇ   sÙ  è è € ØŒ×"Ò" <Ñ0Ô0ð 	UÝ#Ð$SÑTÔTÐTØŒ}Ð/ ¤Ð/Ð/Ð/ØŸ=š=¨Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1ˆ
ð ”}×)Ò)Ø!Ø!°zÐPTÐUÐUñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ˜:Ô&ˆ	Ý"Ô*ØM˜dœnÔ1ÐMÐMÀ)ÐMÐMñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð 5ð 	3ð 	3ˆFØ—,’, &Ð1Ð1Ð1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø�lŠlÐ?À)ÈTÐARÑSÔSÐSÐSÐSÐSÐSÐSÐSØ�lŠlÐ6¸À(Ð8KÑLÔLÐLÐLÐLÐLÐLÐLÐLØ×Ò ¨Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ý�G”J 
¨I°wÑ?Ô?Ð?r1   c              ƒ  ó”   K  — |j         rdS d\  |_         |_        t          j        |                      |¦  «        ¦  «        ƒ d{V —† dS )zlIdempotent; marks the tab closed first so a cancelled close never leaves it
        counted as open or busy.N)TF)rC   rA   ra   rª   Ú_dispose_tabr¬   s     r/   rw   zBrowserDriver._close_tabÝ   s[   è è € ð Œ:ð 	ØˆFØ*ÑˆŒ
�C”HÝŒn˜T×.Ò.¨sÑ3Ô3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4r1   c              ƒ  ón  K  — | j         4 ƒd {V —† | j                             |j        g ¦  «        }||v r|                     |¦  «         | o| j                             |j        ¦  «         }|r | j                             |j        d ¦  «        nd }| j                              ¦   «          d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |j	         
                    ¦   «         ƒ d {V —† | j        r¾| j        j        s´t          j        t          ¦  «        5  | j                             dd|j        i¦  «        ƒ d {V —† d d d ¦  «         n# 1 swxY w Y   |r[t          j        t          ¦  «        5  | j                             dd|i¦  «        ƒ d {V —† d d d ¦  «         d S # 1 swxY w Y   d S d S d S d S )NzTarget.closeTargetr¹   zTarget.disposeBrowserContextr±   )rc   r_   rž   r4   rœ   r`   r^   Úpopr¢   r7   rx   r]   rC   Ú
contextlibÚsuppressÚ	Exceptionr²   r6   )rG   r{   rz   Úlastr5   s        r/   rÆ   zBrowserDriver._dispose_tabå   s  è è € Ø”>ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(Ø”:—>’> #¤.°"Ñ5Ô5ˆDØ�dˆ{ˆ{Ø—’˜CÑ Ô Ð Ø�8ÐE D¤M×$5Ò$5°c´nÑ$EÔ$EÐ EˆDØEIÐS˜œ×+Ò+¨C¬N¸DÑAÔAÐAÈtˆJØŒN×%Ò%Ñ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð Œk×ÒÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒ=ð 	 ¤Ô!5ð 	ÝÔ$¥YÑ/Ô/ð \ð \Ø”m×(Ò(Ð)=À
ÈCÌMÐ?ZÑ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[ð\ð \ð \ñ \ô \ð \ð \ð \ð \ð \ð \øøøð \ð \ð \ð \àð ÝÔ(­Ñ3Ô3ð ð Øœ-×,Ò,Ø6Ð9KÈZÐ8Xñô ð ð ð ð ð ð ð ðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð ð		ð 	ð 	ð 	ðð s6   �BB<Â<
CÃ	CÄ)EÅEÅEÅ3$F$Æ$F(Æ+F(r7   r    c              ƒ  ó4  K  — t          j         ¦   «         dz   }|j                             ¦   «         D ]e\  }}|sŒ|j                             |¦  «        pd}||ddd||k    r|nt          j         ¦   «         dz   dœ}|                      d|¦  «        ƒ d {V —† Œfd S )	Ni  r   z.muse.air+   Ti€:	 )r‹   ÚvaluerÄ   r,   ÚsecureÚexpireszNetwork.setCookie)ÚtimerÀ   ÚitemsÚcookie_expiresrž   r²   )r7   r�   Úfloorr‹   rÎ   ÚexpÚparamss          r/   rÂ   zBrowserDriver._set_cookies÷   sÈ   è è € å”	‘”˜dÑ"ˆØ"œ?×0Ò0Ñ2Ô2ð 	<ð 	<‰KˆD�%Øð ØØÔ(×,Ò,¨TÑ2Ô2Ð7°aˆCàØØ$ØØà"%¨¢+ +˜3˜3µ4´9±;´;ÀÑ3Jðð ˆFð —,’,Ð2°FÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ð	<ð 	<r1   c                ó>   — d | _         g | _        d| _        d| _        d S )Nr   r>   )r9   r;   r=   r?   )r{   s    r/   Ú_forgetzBrowserDriver._forget	  s"   € àˆŒØˆŒ	ØˆŒØˆŒˆˆr1   c                óÂ  — |j         s|j        rdS |j                             d¦  «        }t	          |t
          ¦  «        sdS g }|                     d¦  «        pg D ]n}t	          |t          t          f¦  «        rPt          |¦  «        dk    r=| 	                    t          |d         ¦  «        t          |d         ¦  «        f¦  «         Œo||_         |                     d¦  «        pd|_        t          |                     d¦  «        pd	¦  «        |_        	 t          |                     d
¦  «        pd¦  «        |_        dS # t          t          f$ r d|_        Y dS w xY w)zCRestore the last conversation after a restart or a new browser tab.NÚhot_pager;   r   r   r   r9   r&   r>   r=   )r;   r?   Úmetarž   Ú
isinstanceÚdictrM   ÚtuplerŒ   r�   r'   r9   r<   r=   Ú	TypeErrorÚ
ValueError)rG   r{   r�   Úhotr;   Úitems         r/   Ú	_load_hotzBrowserDriver._load_hot  sL  € àŒ9ð 	˜œð 	ØˆFØŒl×Ò˜zÑ*Ô*ˆÝ˜#�tÑ$Ô$ð 	ØˆFØˆØ—G’G˜GÑ$Ô$Ð*¨ð 	;ð 	;ˆDÝ˜$¥¥u Ñ.Ô.ð ;µ3°t±9´9À²>°>Ø—’�c $ q¤'™lœl­C°°Q´©L¬LÐ9Ñ:Ô:Ð:øØˆŒ	Ø—7’7˜6‘?”?Ð* dˆŒÝ˜SŸWšW U™^œ^Ð1¨rÑ2Ô2ˆŒð	 Ý! #§'¢'¨-Ñ"8Ô"8Ð"=¸AÑ>Ô>ˆCŒOˆOˆOøÝ�:Ð&ð 	 ð 	 ð 	 ØˆCŒOˆOˆOˆOð	 øøøs   Ä)E ÅEÅEÚreqr   r&   c                óò   — |r||_         |j        |_        t          |j        ¦  «        |_        t          |j        ¦  «        |_        |j        pdd„ |j        D ¦   «         |j         |j        dœ|j        d<   d S )Nr>   c                ó,   — g | ]}t          |¦  «        ‘ŒS rO   )rM   )r€   Úturns     r/   rƒ   z+BrowserDriver._save_hot.<locals>.<listcomp>+  s   € Ð7Ð7Ð7 T•d˜4‘j”jÐ7Ð7Ð7r1   )r9   r;   r&   r=   rÚ   )	r?   Úconversation_hintr9   rM   r;   rŒ   Úimagesr=   rÛ   )rG   r{   r�   rä   r&   s        r/   Ú	_save_hotzBrowserDriver._save_hot#  sz   € Øð 	!Ø ˆCŒNØÔ(ˆŒÝ˜œ‘O”OˆŒ	Ý˜cœj™/œ/ˆŒàÔ)Ð/¨RØ7Ð7¨S¬YÐ7Ñ7Ô7Ø”>Øœ?ð	$
ð $
ˆŒ�ZÑ Ð Ð r1   c              ƒ  ón   K  — 	 |j                              d¦  «        ƒ d {V —†pdS # t          $ r Y dS w xY w)Nzlocation.hrefr>   )r7   Úevaluater   r¬   s     r/   Ú_hrefzBrowserDriver._href0  sZ   è è € ð	Øœ+×.Ò.¨Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ÐFÀBÐFøÝð 	ð 	ð 	Ø�2�2ð	øøøs   „!& ¦
4³4r)   c              ƒ  óð  ‡K  — |                       |¦  «        ƒ d{V —†}t          |¦  «        sdS |j        rWt          |¦  «        j                             d¦  «        t          |j        ¦  «        j                             d¦  «        k    rdS 	 |j                             t          j	        ¦  «        ƒ d{V —†pi }| 
                    d¦  «        sdS d| 
                    d¦  «        pdv rdS |                      |¦  «        ƒ d{V —†Šn# t          $ r Y dS w xY w‰ 
                    d¦  «        rdS t          ˆfd	„t          j        D ¦   «         ¦  «        rdS ‰ 
                    d
¦  «        pdt          k     S )zEThe open page is the saved conversation and can take another message.NFr+   ÚhasInputzConnecting...Úheadr>   Ú
generatingc              3  óH   •K  — | ]}|‰                      d d¦  «        v V — ŒdS ©Útailr>   N©rž   ©r€   r9   r¾   s     €r/   r‡   z+BrowserDriver._on_thread.<locals>.<genexpr>H  ó6   øè è € ÐIÐI°ˆt�u—y’y ¨Ñ,Ô,Ð,ÐIÐIÐIÐIÐIÐIr1   Ú
agentCountr   )rí   r0   r?   r	   r,   r-   r7   rì   r   Ú
PAGE_STATErž   Ú_stater   ÚanyÚSTALL_HINTSÚHOT_BUBBLE_LIMIT)rG   r{   ÚhrefÚpager¾   s       @r/   Ú
_on_threadzBrowserDriver._on_thread6  sŸ  øè è € à—Z’Z ‘_”_Ð$Ð$Ð$Ð$Ð$Ð$ˆÝ˜TÑ"Ô"ð 	Ø�5ØŒ>ð 	�h t™nœnÔ1×8Ò8¸Ñ=Ô=ÅÈ#Ì.ÑAYÔAYÔA^×AeÒAeÐfiÑAjÔAjÒjÐjØ�5ð	Øœ×-Ò-­c¬nÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ÐCÀˆDØ—8’8˜JÑ'Ô'ð Ø�uØ 4§8¢8¨FÑ#3Ô#3Ð#9°rÐ:Ð:Ø�uØŸ+š+ cÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*ˆEˆEøÝð 	ð 	ð 	Ø�5�5ð	øøøà�9Š9�\Ñ"Ô"ð 	Ø�5ÝÐIÐIÐIÐI½¼ÐIÑIÔIÑIÔIð 	Ø�5Ø—	’	˜,Ñ'Ô'Ð,¨1Õ0@Ò@Ð@s   ÂAD	 ÃD	 Ã-D	 Ä	
DÄDc              ƒ  ó¢  ‡K  — |                       |¦  «         |j                             ddt          j        i¦  «        ƒ d {V —† t          j        ¦   «         | j        j        z   }i }t          j        ¦   «         |k     rºt          j
        d¦  «        ƒ d {V —† t          j        t          t          ¦  «        5  |j                             t           j        d¬¦  «        ƒ d {V —†pi }|                     d¦  «        r	 d d d ¦  «         d S 	 d d d ¦  «         n# 1 swxY w Y   t          j        ¦   «         |k     °º|                     d¦  «        pd                     ¦   «         Št)          ˆfd	„t           j        D ¦   «         ¦  «        rt-          d
¦  «        ‚d}t)          ˆfd„|D ¦   «         ¦  «        rt/          d¦  «        ‚t1          d¦  «        ‚)NúPage.navigater&   ç      Ð?g      @)ÚtimeoutÚreadyrð   r>   c              3  ó    •K  — | ]}|‰v V — Œ	d S rE   rO   )r€   Úhrð   s     €r/   r‡   z,BrowserDriver._new_thread.<locals>.<genexpr>Y  ó'   øè è € Ð2Ð2˜Qˆq�DˆyÐ2Ð2Ð2Ð2Ð2Ð2r1   z8muse.ai redirected to login; cookies are no longer valid)Ú
cloudflareÚ	turnstilezjust a momentÚ	challengezverify you are humanzattention requiredc              3  ó    •K  — | ]}|‰v V — Œ	d S rE   rO   )r€   Úbrð   s     €r/   r‡   z,BrowserDriver._new_thread.<locals>.<genexpr>\  r  r1   z€muse.ai blocked Chromium via Cloudflare/anti-bot protection. Switch MUSE2API_DRIVER=invisible in .env to use the stealth driver.z_muse.ai page did not become ready (if blocked by bot protection, try MUSE2API_DRIVER=invisible))rØ   r7   r²   r   ÚNEW_THREAD_URLrÑ   Ú	monotonicrY   Úpage_ready_timeoutra   ÚsleeprÉ   rÊ   r   ÚTimeoutErrorrì   r   rù   rž   Úlowerrû   ÚLOGIN_HINTSr   r   r   )rG   r{   Údeadliner¾   Úbot_block_hintsrð   s        @r/   Ú_new_threadzBrowserDriver._new_threadL  sH  øè è € Ø�Š�SÑÔÐØŒk×Ò˜°½Ô8KÐ0LÑMÔMÐMÐMÐMÐMÐMÐMÐMÝ”>Ñ#Ô# d¤mÔ&FÑFˆØˆÝŒnÑÔ Ò)Ð)Ý”- Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%åÔ$¥X­|Ñ<Ô<ð ð Ø!œk×2Ò2µ3´>È3Ð2ÑOÔOÐOÐOÐOÐOÐOÐOÐUÐSU�Ø—9’9˜WÑ%Ô%ð Øðð ð ñ ô ð ð ð ððð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ŒnÑÔ Ò)Ð)ð —	’	˜&Ñ!Ô!Ð' R×.Ò.Ñ0Ô0ˆÝÐ2Ð2Ð2Ð2¥#¤/Ð2Ñ2Ô2Ñ2Ô2ð 	`Ý#Ð$^Ñ_Ô_Ð_ð BˆÝÐ2Ð2Ð2Ð2 /Ð2Ñ2Ô2Ñ2Ô2ð 	ÝðVñô ð õ Ømñ
ô 
ð 	
s   Â8ADÄDÄDré   úlist[InputImage]c              ƒ  ó$  K  — t          |¦  «        D ]ß\  }}|j                             d¦  «        d                              dd¦  «        }|j                             t          j        t          j	        |j
        ¦  «                             ¦   «         |j        d|› d|› �¦  «        ¦  «        ƒ d {V —†}|pi                      d¦  «        s't          d|pi                      d	¦  «        › �¦  «        ‚Œà|rt          j        d
¦  «        ƒ d {V —† d S d S )Nr+   éÿÿÿÿÚjpegÚjpgÚinput_ú.r‰   zfailed to attach image: Úerrg      ð?)Ú	enumerateÚmimeÚsplitÚreplacer7   rì   r   Úattach_fileÚbase64Ú	b64encodeÚdataÚdecoderž   r   ra   r  )rG   r{   ré   ÚidxÚimgÚextr´   s          r/   Ú_attachzBrowserDriver._attachf  sA  è è € Ý! &Ñ)Ô)ð 	Yð 	Y‰HˆC�Ø”(—.’. Ñ%Ô% bÔ)×1Ò1°&¸%Ñ@Ô@ˆCØœ×,Ò,Ý”¥Ô 0°´Ñ :Ô :× AÒ AÑ CÔ CÀSÄXÐOcÐX[ÐOcÐOcÐ^aÐOcÐOcÑdÔdñô ð ð ð ð ð ð ˆCð �I˜2—?’? 4Ñ(Ô(ð YÝ#Ð$WÀÀ	Àr¿ºÈuÑ?UÔ?UÐ$WÐ$WÑXÔXÐXðYàð 	%Ý”- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ð	%ð 	%r1   Úpromptc           	   ƒ  ó  K  — |j                              t          j        |¦  «        ¦  «        ƒ d {V —†}|pi                      d¦  «        s't          d|pi                      d¦  «        › �¦  «        ‚t          j        ¦   «         dz   }t          j        ¦   «         |k     ra|j                              t          j        ¦  «        ƒ d {V —†dk    rd S t          j
        d¦  «        ƒ d {V —† t          j        ¦   «         |k     °adD ]4}|j                              d|d	d	d
dœ|dk    rddini ¥¦  «        ƒ d {V —† Œ5t          j
        d¦  «        ƒ d {V —† |j                              t          j        ¦  «        ƒ d {V —†st          d¦  «        ‚d S )Nr‰   zcannot fill chat input: r  é   Úclickedgš™™™™™¹?)ÚkeyDownÚkeyUpzInput.dispatchKeyEventÚEnteré   )ÚtypeÚkeyÚcodeÚwindowsVirtualKeyCoder1  Útextúg      à?z.send button not found and Enter did not submit)r7   rì   r   Ú
fill_inputrž   r   rÑ   r  Ú
CLICK_SENDra   r  r²   ÚINPUT_EMPTY)rG   r{   r-  r´   r  Úkinds         r/   Ú_sendzBrowserDriver._sendq  sõ  è è € Ø”K×(Ò(­¬¸Ñ)?Ô)?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@ˆØ�	�r�Š˜tÑ$Ô$ð 	UÝÐ S¸C¸IÀ2¿?º?È5Ñ;QÔ;QÐ SÐ SÑTÔTÐTÝ”>Ñ#Ô# aÑ'ˆÝŒnÑÔ Ò)Ð)Ø”[×)Ò)­#¬.Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9¸YÒFÐFØ�Ý”- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$õ ŒnÑÔ Ò)Ð)ð )ð 	ð 	ˆDØ”+×"Ò"Ø(Ø g°wÐY[ð Bð BØ&*¨iÒ&7Ð&7�V˜T�N�N¸RðBñô ð ð ð ð ð ð ð ð õ
 Œm˜CÑ Ô Ð Ð Ð Ð Ð Ð Ð Ø”[×)Ò)­#¬/Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ð 	RÝÐ PÑQÔQÐQð	Rð 	Rr1   rÝ   c              ƒ  ó  ‡K  — |j                              t          j        ¦  «        ƒ d {V —†pi }|                     dd¦  «        }|                     ¦   «         Št          ˆfd„t          j        D ¦   «         d ¦  «        x}�r‰                     |¦  «        }d 	                    |t          d|dz
  ¦  «        |dz   …                              ¦   «         ¦  «        }|                     dd¦  «        }|                     d¦  «        sM||                     ¦   «         v r7t                               d	||j        pd
|¦  «         t          d|› d�¦  «        ‚||j        k    r+||_        t                               d||j        pd
|¦  «         |S )Nrô   r>   c              3  ó$   •K  — | ]
}|‰v ¯|V — Œd S rE   rO   ©r€   r  Úlows     €r/   r‡   z'BrowserDriver._state.<locals>.<genexpr>ˆ  s'   øè è € Ð?Ð?˜a°a¸3°h°h˜°h°h°h°hÐ?Ð?r1   ú r   éx   ÚlastTextrñ   z quota hint %r in reply on %s: %sz
new threadu0   muse.ai reports the account is out of quota: â€¦u   â€¦z2ignoring quota hint %r outside the reply on %s: %s)r7   rì   r   Ú
CHAT_STATErž   r  rŸ   ÚQUOTA_HINTSÚfindÚjoinr˜   r"  rp   Úwarningr?   r   r@   rq   )	rG   r{   r¾   rô   ÚhitÚiÚsnippetÚreplyrC  s	           @r/   rú   zBrowserDriver._state„  sŽ  øè è € Ø”k×*Ò*­3¬>Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð@¸bˆØ�yŠy˜ Ñ$Ô$ˆØ�jŠj‰lŒlˆÝÐ?Ð?Ð?Ð?¥3¤?Ð?Ñ?Ô?ÀÑFÔFÐFˆ3ñ 	BØ—’˜‘”ˆAØ—h’h˜t¥C¨¨1¨s©7¡O¤O°A¸±GÐ$;Ô<×BÒBÑDÔDÑEÔEˆGð —I’I˜j¨"Ñ-Ô-ˆEØ—9’9˜\Ñ*Ô*ð j¨s°e·k²k±m´mÐ/CÐ/CÝ—’Ð>ÀØœNÐ:¨l¸GñEô Eð Eå(Ð)hÐ\cÐ)hÐ)hÐ)hÑiÔiÐiØ˜#œ.Ò(Ð(Ø!(�”Ý—’ÐMÈsØœÐ7¨<¸ñBô Bð Bàˆr1   c              ƒ  óæ   K  — |                       |¦  «        ƒ d {V —† |                      |¦  «        ƒ d {V —†}|                      ||¦  «        ƒ d {V —† |                      ||¦  «        ƒ d {V —† |S rE   )r  rú   r,  r?  )rG   r{   r-  ré   Úbases        r/   Ú_preparezBrowserDriver._prepare™  s    è è € Ø×Ò˜sÑ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ø—[’[ Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%ˆØ�lŠl˜3 Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�jŠj˜˜fÑ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Øˆr1   c              ƒ  óÆ   K  — |j                              t          j        ¦  «        ƒ d {V —†pg }|D ]/}t                               d|                     ¦   «         ¦  «         Œ0d S )Nzdenied muse.ai %s)r7   rì   r   ÚDENY_APPROVALSrp   rq   r  )rG   r{   ÚdeniedÚwhats       r/   Ú_deny_approvalszBrowserDriver._deny_approvals   sn   è è € Ø”{×+Ò+­CÔ,>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ÐEÀ2ˆØð 	8ð 	8ˆDÝ�HŠHÐ(¨$¯*ª*©,¬,Ñ7Ô7Ð7Ð7ð	8ð 	8r1   c              ƒ  ó¤  ‡K  — t          d„ t          |j        ¦  «        D ¦   «         d¦  «        }|sdS 	 |j                             t
          j        ¦  «        ƒ d{V —†pi }|                     d¦  «        sdS |                      |¦  «        ƒ d{V —†Š|j                             dt          j	        |dd…         ¦  «        › d�¦  «        ƒ d{V —†}n# t          $ r Y dS w xY w‰                     d	¦  «        rdS t          ˆfd
„t
          j        D ¦   «         ¦  «        rdS ‰                     d¦  «        pdt          k    rdS t          |¦  «        S )zUThis tab already shows the stored conversation, even if its URL is still /thread/new.c              3  ó,   K  — | ]\  }}|d k    ¯|V — ŒdS )ÚuserNrO   )r€   Úroler9  s      r/   r‡   z3BrowserDriver._live_continuation.<locals>.<genexpr>¨  s+   è è € ÐWÐW¡: 4¨ÈÐPVÊÈ˜$ÈÈÈÈÐWÐWr1   r>   FNrï   z5!!(document.body && document.body.innerText.includes(éP   z))rñ   c              3  óH   •K  — | ]}|‰                      d d¦  «        v V — ŒdS ró   rõ   rö   s     €r/   r‡   z3BrowserDriver._live_continuation.<locals>.<genexpr>·  r÷   r1   rø   r   )rŸ   Úreversedr;   r7   rì   r   rù   rž   rú   Úqr   rû   rü   rý   r)   )rG   r{   Ú	last_userrÿ   Úpresentr¾   s        @r/   Ú_live_continuationz BrowserDriver._live_continuation¦  s�  øè è € åÐWÐWµ¸#¼)Ñ1DÔ1DÐWÑWÔWÐY[Ñ\Ô\ˆ	Øð 	Ø�5ð		Øœ×-Ò-­c¬nÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ÐCÀˆDØ—8’8˜JÑ'Ô'ð Ø�uØŸ+š+ cÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*ˆEØœK×0Ò0ØaÍÌÈiÐX[ÐY[ÐX[ÌnÑH]ÔH]ÐaÐaÐañô ð ð ð ð ð ð ˆGˆGøõ ð 	ð 	ð 	Ø�5�5ð	øøøà�9Š9�\Ñ"Ô"ð 	Ø�5ÝÐIÐIÐIÐI½¼ÐIÑIÔIÑIÔIð 	Ø�5Ø�IŠI�lÑ#Ô#Ð( qÕ-=Ò=Ð=Ø�5Ý�G‰}Œ}Ðs   µAC Á8AC Ã
C ÃC c              ƒ  ó~  K  — |j                              dd|j        i¦  «        ƒ d {V —† t          j        ¦   «         | j        j        z   }t          j        ¦   «         |k     rNt          j        d¦  «        ƒ d {V —† |  	                    |¦  «        ƒ d {V —†rd S t          j        ¦   «         |k     °Nt          d¦  «        ‚)Nr  r&   r  z'saved conversation did not become ready)r7   r²   r?   rÑ   r  rY   r  ra   r  r   r   )rG   r{   r  s      r/   Ú_open_savedzBrowserDriver._open_saved½  sÔ   è è € ØŒk×Ò˜°¸¼Ð0GÑHÔHÐHÐHÐHÐHÐHÐHÐHÝ”>Ñ#Ô# d¤mÔ&FÑFˆÝŒnÑÔ Ò)Ð)Ý”- Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø—_’_ SÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)ð Ø�õ ŒnÑÔ Ò)Ð)õ ÐGÑHÔHÐHr1   c              ƒ  ó|  ‡
‡K  — |j         pdŠ
|                      |ˆ
fd„¬¦  «        ƒ d{V —†Š|j        |j        }}	 t	          ˆfd„| j                             |j        g ¦  «        D ¦   «         ¦  «        s|                      ‰|¦  «         ‰j	        pd|j         pdk    }‰j
        r|rt          ‰j
        |j
        ¦  «        nd}|rñt          |j        ¦  «        ‰j        k    rÔ‰j        s|                      ‰¦  «        ƒ d{V —†r²|                      ‰¦  «        ƒ d{V —†s|                      ‰¦  «        ƒ d{V —†r#t"                               d‰j        pd¦  «         nB‰j        r;t"                               d‰j        ¦  «         |                      ‰¦  «        ƒ d{V —† |}|j        ‰j        d…         }nšt"                               d	¦  «         |j                             d
¦  «        }t+          |t,          ¦  «        r6|                     d¦  «        pd‰
k    r|j                             d
d¦  «         |                      ‰¦  «        ƒ d{V —† |                      ‰¦  «        ƒ d{V —†}|                      ‰|¦  «        ƒ d{V —† |                      ‰|¦  «        ƒ d{V —† ‰|fS # t8          $ rN}	|                      ‰¦  «        ƒ d{V —† |                      ‰¦  «        ƒ d{V —† t?          d|	› �¦  «        |	‚d}	~	wt@          $ r2 |  !                    ‰¦  «         |                      ‰¦  «        ƒ d{V —† ‚ w xY w)zCSend ``req`` on the saved conversation when it continues that page.r>   c                ó,   •— | j         o| j        pd‰k    S )Nr>   )rH   r9   )r‚   r9   s    €r/   ú<lambda>z+BrowserDriver._begin_chat.<locals>.<lambda>É  s   ø€ ¸Q¼[Ð=cÈaÌfÈlÐXZÐ_cÒMc€ r1   ©r�   Nc              3  ó.   •K  — | ]}|‰u¯|j         V — Œd S rE   r—   )r€   r‚   r{   s     €r/   r‡   z,BrowserDriver._begin_chat.<locals>.<genexpr>Î  s*   øè è € Ð[Ð[ qÈaÐWZÈlÈl�q”{ÈlÈlÈlÈlÐ[Ð[r1   zreusing hot page %sz	open pagezreopening %szopening a new threadrÚ   r9   úbrowser error: )"rè   r¨   r-  ré   rû   r_   rž   r›   rã   r9   r;   r   rŒ   r=   r?   rb  r   rp   rq   rd  rÛ   rÜ   rÝ   rÈ   r  rú   r,  r?  r   rw   r­   r   ÚBaseExceptionrØ   )rG   r�   rä   r-  ré   Ú
same_ownerÚfollowÚsavedrQ  Úexcr9   r{   s             @@r/   Ú_begin_chatzBrowserDriver._begin_chatÆ  sÙ  øøè è € àÔ$Ð*¨ˆØ—N’N 7Ð3cÐ3cÐ3cÐ3c�NÑdÔdÐdÐdÐdÐdÐdÐdˆØœ S¤Z�ˆð"	õ Ð[Ð[Ð[Ð[¨D¬J¯NªN¸7¼:ÀrÑ,JÔ,JÐ[Ñ[Ô[Ñ[Ô[ð -Ø—’˜s GÑ,Ô,Ð,Øœ(˜. b¨cÔ.CÐ.IÀrÒJˆJØ<?¼IÐ^È*Ð^•] 3¤9¨c¬iÑ8Ô8Ð8ÐZ^ˆFØð ,�#˜cœj™/œ/¨S¬_Ò<Ð<Ø”ð =Ø(,×(?Ò(?ÀÑ(DÔ(DÐ"DÐ"DÐ"DÐ"DÐ"DÐ"Dð =ð Ÿš¨Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-ð 0°t×7NÒ7NÈsÑ7SÔ7SÐ1SÐ1SÐ1SÐ1SÐ1SÐ1Sð 0Ý—H’HÐ2°C´NÐ4QÀkÑRÔRÐRÐRØ”^ð 0Ý—H’H˜^¨S¬^Ñ<Ô<Ð<Ø×*Ò*¨3Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø�Øœ C¤OÐ$4Ð$4Ô5��å—’Ð/Ñ0Ô0Ð0Øœ×(Ò(¨Ñ4Ô4�Ý˜e¥TÑ*Ô*ð 7°·	²	¸&Ñ0AÔ0AÐ0GÀRÈDÒ/PÐ/PØ”L×$Ò$ Z°Ñ6Ô6Ð6Ø×&Ò& sÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØŸš SÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)ˆDØ—,’,˜s FÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø—*’*˜S &Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø˜�9ÐøÝð 	Bð 	Bð 	BØ—/’/ #Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø—-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ÝÐ 7°#Ð 7Ð 7Ñ8Ô8¸cÐAøøøøÝð 	ð 	ð 	Ø�LŠL˜ÑÔÐØ—-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Øð	øøøs   ½I+J) Ê)
L;Ê3A	K<Ë<?L;úAsyncIterator[str]c           
    óÔ
  ‡K  — |                       ||¦  «        ƒ d {V —†\  }}|                     dd¦  «        |                     dd¦  «        }}t          j        ¦   «         }d\  }}	}
}d}	 	 |j        �r|j                             ¦   «         rû	 |rÆd}t          d¦  «        D ]H}|                      |¦  «        ƒ d {V —†}t          |¦  «        r nt          j
        d	¦  «        ƒ d {V —† ŒI|                      |||t          |¦  «        r|nd¦  «         |j        r!t                               d
|j        ¦  «         n0t                               d¦  «         n|                      |¦  «         |                      |¦  «        ƒ d {V —† d S t          j        ¦   «         |z
  }||j        k    rt%          d¦  «        ‚|s||j        k    rt%          d¦  «        ‚t          j
        t(          ¦  «        ƒ d {V —† |                      |¦  «        ƒ d {V —†Š‰                     d¦  «        r|                      |¦  «        ƒ d {V —† �ŒÕ‰                     dd¦  «        }‰                     dd¦  «        |k    p|o||k    }|r|s<|dk    r4t/          ˆfd„t0          j        D ¦   «         ¦  «        rt%          d¦  «        ‚�ŒMd}||	k    r=|                     |¦  «        r|t7          |¦  «        d …         n|}|r|}|W V — |d}
}	�n-|
dz  }
‰                     d¦  «        s|
t8          k    s|
t:          k    rýd}	 |rÆd}t          d¦  «        D ]H}|                      |¦  «        ƒ d {V —†}t          |¦  «        r nt          j
        d	¦  «        ƒ d {V —† ŒI|                      |||t          |¦  «        r|nd¦  «         |j        r!t                               d
|j        ¦  «         n0t                               d¦  «         n|                      |¦  «         |                      |¦  «        ƒ d {V —† d S �ŒÀ# t<          $ r3}|                      |¦  «        ƒ d {V —† tA          d|› �¦  «        |‚d }~ww xY w# |rÆd}t          d¦  «        D ]H}|                      |¦  «        ƒ d {V —†}t          |¦  «        r nt          j
        d	¦  «        ƒ d {V —† ŒI|                      |||t          |¦  «        r|nd¦  «         |j        r!t                               d
|j        ¦  «         n0t                               d¦  «         n|                      |¦  «         |                      |¦  «        ƒ d {V —† w xY w)Nrø   r   rF  r>   )r>   Nr   FFTé
   gš™™™™™É?zsaved hot page %sz3reply finished but the thread url was not ready yetzassistant reply timed outzno first token from assistantÚapprovalé   c              3  óH   •K  — | ]}|‰                      d d¦  «        v V — ŒdS ró   rõ   )r€   r  Ústs     €r/   r‡   z,BrowserDriver.chat_stream.<locals>.<genexpr>  s6   øè è € Ð+]Ð+]È¨A°·²¸ÀÑ1CÔ1CÐ,CÐ+]Ð+]Ð+]Ð+]Ð+]Ð+]r1   z&upstream workspace is stuck connectingr   rñ   rj  )!rp  rž   rÑ   r  ÚcancelÚis_setÚrangerí   r0   ra   r  rê   r?   rp   rq   rØ   r­   r  r   Úfirst_token_timeoutÚPOLL_INTERVALrú   rW  rû   r   rü   r.   rŒ   ÚSTABLE_POLLS_DONEÚSTABLE_POLLS_FORCEr   rw   r   )rG   r�   rä   r{   rQ  Ú
base_countÚ	base_textÚstartedÚemittedrÌ   ÚstableÚ	got_firstÚfinishedr&   Ú_Úelapsedr9  Úis_newÚdeltaro  rw  s                       @r/   Úchat_streamzBrowserDriver.chat_streamï  sf  øè è € Ø×*Ò*¨7°CÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8‰	ˆˆTØ $§¢¨°qÑ 9Ô 9¸4¿8º8ÀJÐPRÑ;SÔ;S�Iˆ
Ý”.Ñ"Ô"ˆØ+=Ñ(ˆ��v˜yØˆð2	%ðØ”:ñ  #¤*×"3Ò"3Ñ"5Ô"5ð ØðB ð "Ø�Ý˜r™œð -ð -�AØ $§
¢
¨3¡¤Ð/Ð/Ð/Ð/Ð/Ð/�CÝ$ SÑ)Ô)ð Ø˜Ý!œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø—’˜s G¨S½ÀsÑ9KÔ9KÐ2S°#°#ÐQSÑTÔTÐTØ”>ð TÝ—H’HÐ0°#´.ÑAÔAÐAÐAå—H’HÐRÑSÔSÐSÐSà—’˜SÑ!Ô!Ð!Ø—-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$õ] œ.Ñ*Ô*¨WÑ4�Ø˜Sœ[Ò(Ð(Ý)Ð*EÑFÔFÐFØ ð K W¨sÔ/FÒ%FÐ%FÝ)Ð*IÑJÔJÐJÝ”m¥MÑ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØŸ;š; sÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+�Ø—6’6˜*Ñ%Ô%ð Ø×.Ò.¨sÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ÙØ—v’v˜j¨"Ñ-Ô-�ØŸš ¨aÑ0Ô0°:Ò=Ð]À$ÐB\È4ÐS\ÒK\�Øð  Tð Ø ’|�|­Ð+]Ð+]Ð+]Ð+]ÍSÌ_Ð+]Ñ+]Ô+]Ñ(]Ô(]�|Ý-Ð.VÑWÔWÐWÙØ �	Ø˜4’<�<Ø37·?²?À7Ñ3KÔ3KÐU˜D¥ W¡¤  Ô/Ð/ÐQU�EØð $Ø"&˜Ø#˜˜˜˜Ø#'¨˜&�D‘Dà˜a‘K�FØŸFšF <Ñ0Ô0ð °VÕ?PÒ5PÐ5PÐU[Õ_qÒUqÐUqØ#'˜Øð
 ð "Ø�Ý˜r™œð -ð -�AØ $§
¢
¨3¡¤Ð/Ð/Ð/Ð/Ð/Ð/�CÝ$ SÑ)Ô)ð Ø˜Ý!œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø—’˜s G¨S½ÀsÑ9KÔ9KÐ2S°#°#ÐQSÑTÔTÐTØ”>ð TÝ—H’HÐ0°#´.ÑAÔAÐAÐAå—H’HÐRÑSÔSÐSÐSà—’˜SÑ!Ô!Ð!Ø—-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ñcøõ> ð 	Bð 	Bð 	BØ—/’/ #Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ÝÐ 7°#Ð 7Ð 7Ñ8Ô8¸cÐAøøøøð	Bøøøøð ð "Ø�Ý˜r™œð -ð -�AØ $§
¢
¨3¡¤Ð/Ð/Ð/Ð/Ð/Ð/�CÝ$ SÑ)Ô)ð Ø˜Ý!œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø—’˜s G¨S½ÀsÑ9KÔ9KÐ2S°#°#ÐQSÑTÔTÐTØ”>ð TÝ—H’HÐ0°#´.ÑAÔAÐAÐAå—H’HÐRÑSÔSÐSÐSà—’˜SÑ!Ô!Ð!Ø—-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øøøs2   Á,"P- Æ	F'P- Ð+P- Ð-
Q*Ð7.Q%Ñ%Q*Ñ*Q- Ñ-C:U'r>  Úsizer8   Údurationú
int | Nonec                óÎ   — g }|r|                      d|› �¦  «         |r|                      |› d�¦  «         |dk    rdnd}|rdd                     |¦  «        › d�nd	}|› |› d
| › �S )Nzaspect ratio z seconds longrU   zGenerate an imagezGenerate a videoz (z, ú)r>   ú: )r�   rJ  )r-  r>  r‹  rŒ  ÚhintsÚverbÚsuffixs          r/   Ú_media_promptzBrowserDriver._media_prompt*  s¡   € àˆØð 	1Ø�LŠLÐ/¨Ð/Ð/Ñ0Ô0Ð0Øð 	5Ø�LŠL˜HÐ3Ð3Ð3Ñ4Ô4Ð4Ø&*¨g¢o oÐ"Ð"Ð;MˆØ-2Ð:Ð)�d—i’i Ñ&Ô&Ð)Ð)Ð)Ð)¸ˆØÐ*˜Ð*Ð* &Ð*Ð*Ð*r1   g     €V@ç       @)rW   rU   g      @rQ  r  Úfloatrx  úasyncio.Event | Nonec           
   ƒ  óì  ‡K  — t          |                     dg ¦  «        ¦  «        }|                     dd¦  «        }| j                             ‰d¦  «        }	t          j        ¦   «         }
d }dx}x}}	 t          j        ¦   «         |
z
  }||k    r|r||| j        z  k     s�n$|r |                     ¦   «         rt          j        ‚t          j	        d¦  «        ƒ d {V —† |  
                    |¦  «        ƒ d {V —†}|                     d¦  «        r!|                      |¦  «        ƒ d {V —† d	\  }}Œ¼|                     dg ¦  «        |d …         }ˆfd
„|D ¦   «         }|r|d         S t          |                     d¦  «        ¦  «        pt          ˆfd„|D ¦   «         ¦  «        }t          j        ¦   «         |
z
  }|r, |t          dt          ||z  dz  ¦  «        ¦  «        ¦  «         t          ˆfd„|D ¦   «         ¦  «        rd }�Œ’|                     dd¦  «        }|                     dd¦  «        |k    �rŒ|�r‰|                     d¦  «        �ss|€t          j        ¦   «         }�n^t          j        ¦   «         |z
  |	k    �r@|set                                d‰|rdnd|¦  «         |                      |d‰› d�|rdndz   ¦  «        ƒ d {V —† d	\  }}|                     dd¦  «        }�Œu|j                             t*          j        ¦  «        ƒ d {V —†pi }|                      |                     dg ¦  «        ‰¦  «        }|r!t                                d‰|¦  «         |‰dœS t                                d‰|	|                     dg ¦  «        |                     dd¦  «        ¦  «         t1          d|d d …         › �¦  «        ‚nd }�ŒR|rt                                d!‰|¦  «         t5          ‰› d"�¦  «        ‚)#NÚattachmentsrø   r   r•  FTg333333ã?rt  )TNc                óp   •— g | ]2}|                      d ¦  «        ¯|                      d¦  «        ‰k    ¯0|‘Œ3S ©Úsrcr>  rõ   ©r€   Úar>  s     €r/   rƒ   z-BrowserDriver._wait_media.<locals>.<listcomp>T  s<   ø€ ÐSÐSÐS˜1¨A¯EªE°%©L¬LÐS¸Q¿UºUÀ6¹]¼]ÈdÒ=RÐ=R�QÐ=RÐ=RÐ=Rr1   r  rñ   c              3  óJ   •K  — | ]}‰|                      d ¦  «        pdv V — ŒdS ©Útidr>   Nrõ   r�  s     €r/   r‡   z,BrowserDriver._wait_media.<locals>.<genexpr>W  s8   øè è € Ð4dÐ4dÐVW°T¸a¿eºeÀE¹l¼lÐ>PÈbÐ5QÐ4dÐ4dÐ4dÐ4dÐ4dÐ4dr1   é_   éd   c              3  óJ   •K  — | ]}‰|                      d ¦  «        pdv V — ŒdS r   rõ   r�  s     €r/   r‡   z,BrowserDriver._wait_media.<locals>.<genexpr>]  s7   øè è € ÐBÐB°A�4˜AŸEšE %™LœLÐ.¨BÐ/ÐBÐBÐBÐBÐBÐBr1   rF  r>   z3%s not attached (%s); asking for it in chat: %.120szdenied approvalztext-only replyzPlease attach the final z file here in the chatz instead of uploading it.z, as a single attachment.Úlinksz'%s delivered as link in text bubble: %sr›  z4%s: no media after %.0fs grace; links=%s html=%.300sÚhtmlz!upstream replied with text only: éÈ   z*%s still generating after %.0fs; giving upz generation timed out)rŒ   rž   Ú_MEDIA_GRACErÑ   r  Ú_OVERRUN_FACTORry  ra   ÚCancelledErrorr  rú   rW  r)   rû   Úminr<   rp   rq   r?  r7   rì   r   ÚLAST_BUBBLE_MEDIAÚ_pick_media_urlr   rK  r   )rG   r{   rQ  r>  r  Úon_progressrx  Ú	base_attsr  Úgracer�  Útext_done_atrU  Úasked_to_attachrA   r‡  rw  Únew_attsÚfreshr9  Úprober&   s      `                  r/   Ú_wait_mediazBrowserDriver._wait_media?  s¼  øè è € å˜Ÿš °Ñ3Ô3Ñ4Ô4ˆ	Ø—X’X˜l¨AÑ.Ô.ˆ
ØÔ!×%Ò% d¨CÑ0Ô0ˆÝ”.Ñ"Ô"ˆØ%)ˆØ*/Ð/ˆÐ/� 4ð8	$Ý”nÑ&Ô&¨Ñ0ˆGØ˜'Ò!Ð!¨4Ð!°G¸gÈÔH\Ñ>\Ò4\Ð4\ÙØð -˜&Ÿ-š-™/œ/ð -ÝÔ,Ð,Ý”- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø—{’{ 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'ˆBØ�vŠv�jÑ!Ô!ð Ø×*Ò*¨3Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø'1Ñ$�˜ØØ—v’v˜m¨RÑ0Ô0°°°Ô<ˆHØSÐSÐSÐS ÐSÑSÔSˆEØð !Ø˜R”yÐ Ý˜Ÿš˜|Ñ,Ô,Ñ-Ô-ÐdµÐ4dÐ4dÐ4dÐ4dÐ[cÐ4dÑ4dÔ4dÑ1dÔ1dˆDÝ”nÑ&Ô&¨Ñ0ˆGØð CØ��C ¥C¨°'Ñ(9¸CÑ(?Ñ$@Ô$@ÑAÔAÑBÔBÐBõ ÐBÐBÐBÐB¸ÐBÑBÔBÑBÔBð Ø#�Ùð —6’6˜* bÑ)Ô)ˆDØ�vŠv�l AÑ&Ô&¨Ò3Ñ3¸Ñ3ÀRÇVÂVÈLÑEYÔEYÑ3ØÐ'Ý#'¤>Ñ#3Ô#3�L‘LÝ”^Ñ%Ô%¨Ñ4¸Ò=Ñ=Ø*ð !õ ŸšÐ!VÐX\Ø6<Ð!SÐ!2Ð!2ÐBSÐUYñ[ô [ð [à"Ÿjšj¨ð /9Èð /9ð /9ð /9Ø[að =]Ð<WÐ<WØA\ñ/^ñ _ô _ð _ð _ð _ð _ð _ð _ð _ð 9CÑ5˜¨Ø%'§V¢V¨L¸!Ñ%<Ô%<˜
Ù à"%¤+×"6Ò"6µsÔ7LÑ"MÔ"MÐMÐMÐMÐMÐMÐMÐSÐQS�EØ×.Ò.¨u¯yªy¸À"Ñ/EÔ/EÀtÑLÔL�CØð :ÝŸšÐ!JÈDÐRUÑVÔVÐVØ'*°DÐ9Ð9Ð9Ý—H’HÐSØ! 5¨%¯)ª)°G¸RÑ*@Ô*@À%Ç)Â)ÈFÐTVÑBWÔBWñYô Yð Yå)Ð*ZÈdÐSWÐTWÐSWÌjÐ*ZÐ*ZÑ[Ô[Ð[ð/ >ð2  $�ñq8	$ðr ð 	UÝ�KŠKÐDÀdÈGÑTÔTÐTÝ Ð<Ð<Ð<Ñ=Ô=Ð=r1   )z.mp4z.webmz.movz.m4v)z.pngz.jpgz.jpegz.webpz.gifz.avif)	zvideodelivery.netzcloudflarestream.comzcloudflarestorage.comzamazonaws.comzstorage.googleapis.comzblob.core.windows.netÚmusecdnzcdn.musezmuse-cdn)z/media/z	/downloadz/dl/z/videoz/attachmentz/files/r¥  ú	list[str]c                óÄ   ‡ ‡— |dk    r‰ j         n‰ j        Šdˆ ˆfd„}d„ |D ¦   «         }|                     |d¬	¦  «         |r ||d
         ¦  «        d
k    r|d
         ndS )zFBest media URL from a reply bubble, or None if nothing looks like one.rW   Úur'   r(   r<   c                ó~  •‡— |                       ¦   «         Š‰                     dd¦  «        d                              dd¦  «        d         }|                      d¦  «        s|                     ‰¦  «        rdS t	          ˆfd„‰j        D ¦   «         ¦  «        rdS t	          ˆfd	„‰j        D ¦   «         ¦  «        rdS dS )
Nú?r   r   ú#zblob:r
   c              3  ó    •K  — | ]}|‰v V — Œ	d S rE   rO   rB  s     €r/   r‡   z?BrowserDriver._pick_media_url.<locals>.score.<locals>.<genexpr>•  s'   øè è € Ð6Ð6 �1˜�8Ð6Ð6Ð6Ð6Ð6Ð6r1   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S rE   rO   )r€   ÚsegrC  s     €r/   r‡   z?BrowserDriver._pick_media_url.<locals>.score.<locals>.<genexpr>—  s'   øè è € Ð:Ð: #�3˜#�:Ð:Ð:Ð:Ð:Ð:Ð:r1   )r  r"  r.   Úendswithrû   Ú_MEDIA_HOSTSÚ_MEDIA_PATHS)rº  r,   rC  ÚclsÚextss     @€€r/   Úscorez,BrowserDriver._pick_media_url.<locals>.score�  sÉ   øø€ Ø—'’'‘)”)ˆCØ—9’9˜S !Ñ$Ô$ QÔ'×-Ò-¨c°1Ñ5Ô5°aÔ8ˆDØ�|Š|˜GÑ$Ô$ð ¨¯ª°dÑ(;Ô(;ð Ø�qÝÐ6Ð6Ð6Ð6 SÔ%5Ð6Ñ6Ô6Ñ6Ô6ð Ø�qÝÐ:Ð:Ð:Ð:¨Ô)9Ð:Ñ:Ô:Ñ:Ô:ð Ø�qØ�1r1   c                ó@   — g | ]}|¯|                      d ¦  «        °|‘ŒS ))zmailto:zjavascript:)r.   )r€   rº  s     r/   rƒ   z1BrowserDriver._pick_media_url.<locals>.<listcomp>›  s/   € ÐXÐXÐX�q QÐX¨q¯|ª|Ð<VÑ/WÔ/WÐX�ÐXÐXÐXr1   T)r6  Úreverser   N)rº  r'   r(   r<   )Ú
_VIDEO_EXTÚ
_IMAGE_EXTÚsort)rÄ  r¥  r>  rÆ  ÚcandsrÅ  s   `    @r/   r­  zBrowserDriver._pick_media_url‹  s“   øø€ ð "&¨¢ ˆsŒ~ˆ~°c´nˆð		ð 		ð 		ð 		ð 		ð 		ð 		ð YÐX˜EÐXÑXÔXˆØ�
Š
�u dˆ
Ñ+Ô+Ð+Ø ÐB U U¨5°¬8¡_¤_°qÒ%8Ð%8ˆu�QŒxˆx¸dÐBr1   Úattr   c           	   ƒ  óè  K  — |j                              t          j        |d         ¦  «        dd¬¦  «        ƒ d {V —†}|pi                      d¦  «        s*t          d|› d|pi                      d¦  «        › �¦  «        ‚|                     d	¦  «        p	|d
k    rdnd}t          t          j        |d         ¦  «        |||                     d¦  «        pd |                     d¦  «        pd ¬¦  «        S )Nrœ  Ti,  )Úawait_promiser  r‰   zfailed to download generated r�  r  r!  rW   z	video/mp4z	image/pngÚb64Úwr  )r'  r!  r>  ÚwidthÚheight)	r7   rì   r   Úfetch_as_base64rž   r   r   r%  Ú	b64decode)rG   r{   rÍ  r>  r´   r!  s         r/   Ú	_downloadzBrowserDriver._downloadŸ  s  è è € Ø”K×(Ò(­Ô)<¸SÀ¼ZÑ)HÔ)HÐX\Ø14ð )ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6ˆà�	�r�Š˜tÑ$Ô$ð 	bÝÐ `ÀÐ `Ð `ÈÈÐPRÏÊÐX]ÑH^ÔH^Ð `Ð `ÑaÔaÐaØ�wŠw�v‰ŒÐS°$¸'²/°/ ; ;À{ˆÝ¥Ô 0°°U´Ñ <Ô <À4ÈdØ!$§¢¨¡¤Ð!5°¸c¿gºgÀc¹l¼lÐ>RÈdðTñ Tô Tð 	Tr1   c              ƒ  óð  K  — |                       |d„ ¬¦  «        ƒ d {V —†}	 |                      |||¦  «        ƒ d {V —†}	|                      ||	||||¦  «        ƒ d {V —†}
|                      ||
|¦  «        ƒ d {V —†	 |                      |¦  «        ƒ d {V —† S # t
          $ r3}|                      |¦  «        ƒ d {V —† t          d|› �¦  «        |‚d }~ww xY w# |                      |¦  «        ƒ d {V —† w xY w)Nc                ó   — | j          S rE   r—   )r‚   s    r/   rg  z)BrowserDriver._generate.<locals>.<lambda>«  s
   € ÀÄ¸_€ r1   rh  rj  )r¨   rR  r¶  rÖ  r­   r   rw   r   )rG   r�   r-  ré   r>  r  r®  rx  r{   rQ  rÍ  ro  s               r/   Ú	_generatezBrowserDriver._generate¨  so  è è € ð —N’N 7Ð3LÐ3L�NÑMÔMÐMÐMÐMÐMÐMÐMˆð	%ØŸš s¨F°FÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;ˆDØ×(Ò(¨¨d°D¸'À;ÐPVÑWÔWÐWÐWÐWÐWÐWÐWˆCØŸš¨¨S°$Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ð
 —-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øõ	 ð 	Bð 	Bð 	BØ—/’/ #Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ÝÐ 7°#Ð 7Ð 7Ñ8Ô8¸cÐAøøøøð	Bøøøøð —-’- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øøøs$   ¢AB Â
CÂ".CÃCÃC ÃC5r   úlist[MediaResult]c           
   ƒ  óF  K  — |                       |j        d|j        ¦  «        }g }t          t	          d|j        ¦  «        ¦  «        D ]X}|                      |||j        d|j        |j	        |j
        ¦  «        ƒ d {V —†}|j        |_        |                     |¦  «         ŒY|S )NrU   r   )r”  r-  r‹  rz  r˜   ÚnrÙ  Úreference_imagesr  r®  rx  Úrevised_promptr�   )rG   r�   rä   r-  Úresultsr†  Úrs          r/   Úgenerate_imagezBrowserDriver.generate_image¶  s¼   è è € Ø×#Ò# C¤J°¸¼ÑBÔBˆØˆÝ•s˜1˜cœe‘}”}Ñ%Ô%ð 	ð 	ˆAØ—n’n W¨f°cÔ6JÈGØ%(¤[°#´/À3Ä:ñOô Oð Oð Oð Oð Oð Oð OˆAà"œzˆAÔØ�NŠN˜1ÑÔÐÐØˆr1   r   c           	   ƒ  óÖ   K  — |                       |j        d|j        |j        ¦  «        }|j        r|j        gng }|                      |||d|j        |j        |j        ¦  «        ƒ d {V —†S )NrW   )	r”  r-  r‹  rŒ  Úfirst_framerÙ  r  r®  rx  )rG   r�   rä   r-  ré   s        r/   Úgenerate_videozBrowserDriver.generate_videoÀ  s�   è è € Ø×#Ò# C¤J°¸¼À3Ä<ÑPÔPˆØ&)¤oÐ=�#”/Ð"Ð"¸2ˆØ—^’^ G¨V°V¸WÀcÄkØ$'¤O°S´ZñAô Að Að Að Að Að Að Að 	Ar1   r   c              ƒ  ót  K  — t          j        |j        ¦  «        ƒ d {V —†}| j        4 ƒd {V —† t	          | j                             |j        g ¦  «        ¦  «        }|D ]	}d|_        Œ
d„ |D ¦   «         }d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |D ]}|  	                    |¦  «        ƒ d {V —† Œ|S )NTc                ó    — g | ]}|j         °	|‘ŒS rO   r…   r†   s     r/   rƒ   z/BrowserDriver.renew_session.<locals>.<listcomp>Ï  s   € Ð2Ð2Ð2˜!¨1¬6Ð2�AÐ2Ð2Ð2r1   )
r   rX   rÀ   rc   rM   r_   rž   r›   rB   rw   )rG   r�   rq   rz   r{   r¥   s         r/   rX   zBrowserDriver.renew_sessionÇ  sj  è è € ÝÔ'¨¬Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆð ”>ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3Ý˜œ
Ÿš w¤z°2Ñ6Ô6Ñ7Ô7ˆDØð !ð !�Ø �”	�	Ø2Ð2˜tÐ2Ñ2Ô2ˆDð		3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð
 ð 	'ð 	'ˆCØ—/’/ #Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Øˆs   ¯ABÂ
BÂB)rY   r   r(   rZ   )r(   rZ   )r(   r}   rE   )r�   r   r�   r‘   r(   r3   )r{   r3   r(   rZ   )r�   r   r(   r'   )r�   r   r(   r3   )r7   r    r�   r   r(   rZ   )r{   r3   r�   r   r(   rZ   )
r{   r3   r�   r   rä   r   r&   r'   r(   rZ   )r{   r3   r(   r'   )r{   r3   r(   r)   )r{   r3   ré   r  r(   rZ   )r{   r3   r-  r'   r(   rZ   )r{   r3   r(   rÝ   )r{   r3   r-  r'   ré   r  r(   rÝ   )r�   r   rä   r   )r�   r   rä   r   r(   rq  )
r-  r'   r>  r'   r‹  r8   rŒ  r�  r(   r'   )r{   r3   rQ  rÝ   r>  r'   r  r–  rx  r—  r(   rÝ   )r¥  r¸  r>  r'   r(   r8   )r{   r3   rÍ  rÝ   r>  r'   r(   r   )r�   r   r-  r'   ré   r  r>  r'   r  r–  r(   r   )r�   r   rä   r   r(   rÚ  )r�   r   rä   r   r(   r   )r�   r   r(   r   )1rI   rJ   rK   r‹   r   Úcapabilitiesrf   rt   r|   rŽ   r¨   r­   r«   rµ   r¡   rw   rÆ   ÚstaticmethodrÂ   rØ   rã   rê   rí   r   r  r,  r?  rú   rR  rW  rb  rd  rp  rŠ  r”  r¨  r©  r¶  rÉ  rÊ  rÂ  rÃ  Úclassmethodr­  rÖ  rÙ  rá  rä  rX   rO   r1   r/   rQ   rQ   X   sŽ  € € € € € Ø€DØ%Ð%Ø˜t¨4¸DÈÐ\`ðñ ô €Lð
(ð 
(ð 
(ð 
(ð)ð )ð )ð )ð(ð (ð (ð (ð8ð 8ð 8ð 8ð AEð+ð +ð +ð +ð +ðZ'ð 'ð 'ð 'ð(ð (ð (ð (ð+ð +ð +ð +ð@ð @ð @ð @ð,5ð 5ð 5ð 5ðð ð ð ð$ ð<ð <ð <ñ „\ð<ð" ðð ð ñ „\ðð ð  ð  ð  ð&
ð 
ð 
ð 
ðð ð ð ðAð Að Að Að,
ð 
ð 
ð 
ð4	%ð 	%ð 	%ð 	%ðRð Rð Rð Rð&ð ð ð ð*ð ð ð ð8ð 8ð 8ð 8ðð ð ð ð.Ið Ið Ið Ið'ð 'ð 'ð 'ðR8%ð 8%ð 8%ð 8%ðv ð+ð +ð +ð +ñ „\ð+ð "¨CÐ0Ð0€Lð €OðC>ð C>ð C>ð C>ðJ 3€JØD€Jð7€Lð X€LàðCð Cð Cñ „[ðCð&Tð Tð Tð Tð%ð %ð %ð %ðð ð ð ðAð Að Að Aðð ð ð ð ð r1   rQ   )r&   r'   r(   r)   );Ú__doc__Ú
__future__r   ra   r%  rÉ   ÚloggingrÑ   Úcollections.abcr   r   Údataclassesr   r   Útypingr   Úurllib.parser	   Úaccounts.modelr   Úconfigr   Úcore.promptr   Úerrorsr   r   r   r   r   Úupstreamr   rQ  r   r   r   r   r   r   r   r   r>   r   Úcdpr   r    Úchromiumr!   r"   Ú	getLoggerrI   rp   r|  r}  r~  rý   r0   r3   rQ   rO   r1   r/   ú<module>rù     s’  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !à %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (ðð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4à€gÔ˜Ñ!Ô!€à€ØÐ ØÐ àÐ ðAð Að Að Að ð3ð 3ð 3ð 3ð 3ñ 3ô 3ñ „ð3ð*z	ð z	ð z	ð z	ð z	�Jñ z	ô z	ð z	ð z	ð z	r1   