§
    øžyjß:  ã                  óD  — 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Zddl	Z	ddl
Z
ddlmZmZ ddlmZ  ej        e¦  «        ZdZde› �ZdZd	Z ed
„ eD ¦   «         ¦  «        Z ed„ eD ¦   «         ¦  «        ZdZ ed„ eD ¦   «         ¦  «        Z ed„ eD ¦   «         ¦  «        Zd;d„Zd<d„Zd=d„Zd>d?d„Z dZ!dZ"d>d@d!„Z#dAdBd#„Z$ed$fdCd'„Z%edfdDd(„Z&dEd*„Z'	 	 dFdGd0„Z(d1Z)d2Z*e G d3„ d4¦  «        ¦   «         Z+e G d5„ d6¦  «        ¦   «         Z,dHd8„Z-edfdId9„Z.edfdJd:„Z/dS )KzHShared helpers for attaching Hermes to a local Chromium-family CDP port.é    )ÚannotationsN)Ú	dataclassÚfield)Úget_hermes_homei$  zhttp://127.0.0.1:)z</Applications/Google Chrome.app/Contents/MacOS/Google Chromez2/Applications/Chromium.app/Contents/MacOS/Chromiumz</Applications/Brave Browser.app/Contents/MacOS/Brave Browserz>/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge)))ú
chrome.exeÚchrome))ÚGoogleÚChromeÚApplicationr   ))úchromium.exeÚchromium))ÚChromiumr   r   )r   r   r   ))ú	brave.exeÚbrave))ÚBraveSoftwarezBrave-Browserr   r   ))ú
msedge.exeÚmsedge))Ú	MicrosoftÚEdger   r   c              #  ó*   K  — | ]\  }}|D ]}|V — ŒŒd S ©N© ©Ú.0ÚnamesÚ_Únames       ú@/home/ragecks/.hermes/hermes-agent/hermes_cli/browser_connect.pyú	<genexpr>r   (   s4   è è € ÐZÐZ¡H E¨1ÐTYÐZÐZÈD˜4ÐZÐZÐZÐZÐZÐZÐZó    c              #  ó*   K  — | ]\  }}|D ]}|V — ŒŒd S r   r   )r   r   ÚgroupÚpartss       r   r   r   )   s5   è è € Ð`Ð`©¨¨EÐZ_Ð`Ð`ÐQV˜uÐ`Ð`Ð`Ð`Ð`Ð`Ð`r    )))zgoogle-chromezgoogle-chrome-stable)z/opt/google/chrome/chromez/usr/bin/google-chromez/usr/bin/google-chrome-stable))zchromium-browserr   )z/usr/bin/chromium-browserz/usr/bin/chromium))zbrave-browserzbrave-browser-stabler   )z/usr/bin/brave-browserz/usr/bin/brave-browser-stablez/usr/bin/bravez/snap/bin/bravez"/opt/brave.com/brave/brave-browserz/opt/brave.com/brave/bravez/opt/brave-bin/brave))zmicrosoft-edgezmicrosoft-edge-stabler   )z/usr/bin/microsoft-edgez/usr/bin/microsoft-edge-stablez$/opt/microsoft/msedge/microsoft-edgez/opt/microsoft/msedge/msedgec              #  ó*   K  — | ]\  }}|D ]}|V — ŒŒd S r   r   r   s       r   r   r   K   s4   è è € ÐVÐV¡( %¨ÐPUÐVÐVÈ˜ÐVÐVÐVÐVÐVÐVÐVr    c              #  ó*   K  — | ]\  }}|D ]}|V — ŒŒd S r   r   )r   r   ÚpathsÚpaths       r   r   r   L   s4   è è € ÐZÐZ¡h a¨ÐTYÐZÐZÈD˜TÐZÐZÐZÐZÐZÐZÐZr    ÚsystemÚstrÚreturnú	list[str]c           	     ó¶  ‡‡‡— g Št          ¦   «         Šdˆˆfd„Šdˆfd
„}| dk    rt          D ]} ‰|¦  «         Œ‰S | dk    rÅt          j                             d¦  «        t          j                             d¦  «        t          j                             d¦  «        f}t
          D ]_\  }}|D ]} ‰t          j        |¦  «        ¦  «         Œ t          d |¦  «        D ]'}|D ]"} ‰t          j	        j
        |g|¢R Ž ¦  «         Œ#Œ(Œ`‰S t          D ]7\  }}	|D ]} ‰t          j        |¦  «        ¦  «         Œ |	D ]}
 ‰|
¦  «         ŒŒ8 |dt
          ¦  «         ‰S )Nr'   ú
str | Noner*   ÚNonec                ó&  •— | sd S t           j                             t           j                             | ¦  «        ¦  «        }|‰v st           j                             | ¦  «        sd S ‰                     | ¦  «         ‰                     |¦  «         d S r   )Úosr'   ÚnormcaseÚnormpathÚisfileÚappendÚadd)r'   Ú
normalizedÚ
candidatesÚseens     €€r   r5   z(get_chrome_debug_candidates.<locals>.addS   s„   ø€ Øð 	ØˆFÝ”W×%Ò%¥b¤g×&6Ò&6°tÑ&<Ô&<Ñ=Ô=ˆ
Ø˜ÐÐ¥R¤W§^¢^°DÑ%9Ô%9ÐØˆFØ×Ò˜$ÑÔÐØ�Š�ÑÔÐÐÐr    Úbasesútuple[str | None, ...]Úinstall_groupsú?tuple[tuple[tuple[str, ...], tuple[tuple[str, ...], ...]], ...]c           	     ó~   •— |D ]8\  }}t          d | ¦  «        D ]"}|D ]} ‰t          j        |g|¢R Ž ¦  «         ŒŒ#Œ9d S r   )ÚfilterÚ	posixpathÚjoin)r9   r;   r   r"   Úbaser#   r5   s         €r   Úadd_windows_install_pathsz>get_chrome_debug_candidates.<locals>.add_windows_install_paths\   s{   ø€ ð 'ð 	6ð 	6‰HˆAˆuÝ˜t UÑ+Ô+ð 6ð 6�Ø"ð 6ð 6�Eð �C�	œ tÐ4¨eÐ4Ð4Ð4Ñ5Ô5Ð5Ð5ð	6ð6ð	6ð 	6r    ÚDarwinÚWindowsÚProgramFileszProgramFiles(x86)ÚLOCALAPPDATA)z/mnt/c/Program Filesz/mnt/c/Program Files (x86))r'   r-   r*   r.   )r9   r:   r;   r<   r*   r.   )ÚsetÚ_DARWIN_APPSr0   ÚenvironÚgetÚ_WINDOWS_BROWSER_GROUPSÚshutilÚwhichr>   r'   r@   Ú_LINUX_BROWSER_GROUPS)r(   rB   ÚappÚinstall_basesr   Úinstall_partsr   rA   r#   r&   r'   r5   r7   r8   s              @@@r   Úget_chrome_debug_candidatesrR   O   së  øøø€ Ø€JÝ‘U”U€Dðð ð ð ð ð ð ð
6ð 
6ð 
6ð 
6ð 
6ð 
6ð �ÒÐÝð 	ð 	ˆCØˆC�‰HŒHˆHˆHØÐà�ÒÐåŒJ�NŠN˜>Ñ*Ô*ÝŒJ�NŠNÐ.Ñ/Ô/ÝŒJ�NŠN˜>Ñ*Ô*ð
ˆõ
 %<ð 	4ð 	4Ñ ˆE�=Øð (ð (�Ø�•F”L Ñ&Ô&Ñ'Ô'Ð'Ð'Ý˜t ]Ñ3Ô3ð 4ð 4�Ø*ð 4ð 4�EØ�C�œœ TÐ2¨EÐ2Ð2Ð2Ñ3Ô3Ð3Ð3ð4ð4ð Ðå-ð ð ‰ˆˆuØð 	$ð 	$ˆDØˆC•”˜TÑ"Ô"Ñ#Ô#Ð#Ð#Øð 	ð 	ˆDØˆC�‰IŒIˆIˆIð	àÐÐTÕVmÑnÔnÐnØÐr    c                 ó>   — t          t          ¦   «         dz  ¦  «        S )Nzchrome-debug)r)   r   r   r    r   Úchrome_debug_data_dirrT   „   s   € Ý�Ñ Ô  >Ñ1Ñ2Ô2Ð2r    ÚportÚintc                ó2   — d| › �dt          ¦   «         › �ddgS )Nz--remote-debugging-port=z--user-data-dir=z--no-first-runz--no-default-browser-check)rT   )rU   s    r   Ú_chrome_debug_argsrX   ˆ   s/   € à) 4Ð)Ð)Ø4Õ0Ñ2Ô2Ð4Ð4ØØ$ð	ð r    ç      ð?ÚurlÚtimeoutÚfloatÚboolc                ó$  — ddl }ddl}ddlm}  |d| v r| nd| › �¦  «        }	 |j        p|j        dv rdnd}n# t          $ r Y d	S w xY w|j        d
v rn|j                             d¦  «        rT|j	        sd	S 	 | 
                    |j	        |f|¬¦  «        5  	 ddd¦  «         dS # 1 swxY w Y   n# t          $ r Y d	S w xY wdddœ                     |j        |j        ¦  «        }|dvs|j        sd	S |› d|j        › �                     d¦  «        }|› d�|› d�fD ]u}		 |j                             |	|¬¦  «        5 }
dt#          |
dd¦  «        cxk    rdk     rn n	 ddd¦  «          dS ddd¦  «         n# 1 swxY w Y   Œf# t$          $ r Y Œrw xY wd	S )zFReturn True when ``url`` exposes a reachable Chrome DevTools endpoint.r   N)Úurlparsez://úhttp://>   ÚwssÚhttpsi»  éP   F>   Úwsra   z/devtools/browser/©r[   TÚhttprb   )rd   ra   >   rf   rb   ú/z/json/versionz/jsonéÈ   Ústatusi,  )ÚsocketÚurllib.requestÚurllib.parser_   rU   ÚschemeÚ
ValueErrorr'   Ú
startswithÚhostnameÚcreate_connectionÚOSErrorrJ   ÚnetlocÚrstripÚrequestÚurlopenÚgetattrÚ	Exception)rZ   r[   rj   Úurllibr_   ÚparsedrU   rm   ÚrootÚprobeÚresps              r   Úis_browser_debug_readyr~   ‘   sæ  € à€M€M€MØÐÐÐØ%Ð%Ð%Ð%Ð%Ð%àˆX˜U c˜\˜\�c�c¨¸¨¨Ñ?Ô?€FðØŒ{ÐP f¤mÐ7GÐ&GÐ&G˜s˜sÈRˆˆøÝð ð ð Øˆuˆuðøøøð „}˜Ð%Ð%¨&¬+×*@Ò*@ÐAUÑ*VÔ*VÐ%ØŒð 	Ø�5ð	Ø×)Ò)¨6¬?¸DÐ*AÈ7Ð)ÑSÔSð ð Øðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð øåð 	ð 	ð 	Ø�5�5ð	øøøð  7Ð+Ð+×/Ò/°´¸v¼}ÑMÔM€FØÐ&Ð&Ð&¨f¬mÐ&ØˆuàÐ(Ð(˜œÐ(Ð(×/Ò/°Ñ4Ô4€DØÐ(Ð(Ð(¨T¨.¨.¨.Ð9ð ð ˆð	Ø”×'Ò'¨°wÐ'Ñ?Ô?ð  À4Ø�' $¨°#Ñ6Ô6Ð<Ð<Ò<Ð<¸Ò<Ð<Ð<Ð<Ð<Øð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  øøõ ð 	ð 	ð 	ØˆHð	øøøàˆ5s�   ¤9 ¹
AÁAÁ7B0 ÂB$ÂB0 Â$B(Â(B0 Â+B(Â,B0 Â0
B>Â=B>ÄF Ä9!E4ÅF Å(F Å4E8	Å8F Å;E8	Å<F Æ 
FÆF)ú	127.0.0.1z[::1])r   ú::1r-   c                óT   — t           D ]}d|› d| › �}t          ||¬¦  «        r|c S Œ dS )ay  Return the first loopback URL (IPv4 first, then IPv6) speaking CDP.

    Dual-stack discovery: when another application squats the IPv4
    loopback on ``port``, a debug browser launched with
    ``--remote-debugging-port`` may bind only ``[::1]``. Probing both
    literals finds it either way. Returns ``None`` when neither
    loopback exposes a CDP discovery endpoint.
    r`   ú:re   N)Ú_LOOPBACK_PROBE_HOSTSr~   )rU   r[   ÚhostrZ   s       r   Údiscover_local_cdp_urlr…   ½   sP   € õ &ð ð ˆØ%˜Ð%Ð%˜tÐ%Ð%ˆÝ! #¨wÐ7Ñ7Ô7ð 	ØˆJˆJˆJð	àˆ4r    ç      à?c                ó¬   — ddl }t          D ]G}	 |                     || f|¬¦  «        5  	 ddd¦  «          dS # 1 swxY w Y   Œ8# t          $ r Y ŒDw xY wdS )a  Return True when either loopback accepts TCP on ``port``.

    Callers use this AFTER a failed CDP probe to distinguish "port is
    free, we can launch a browser on it" from "another application
    (IDE debugger, dev server) is squatting the port and a launch
    would fight it".
    r   Nre   TF)rj   Ú_LOOPBACK_SOCKET_HOSTSrq   rr   )rU   r[   rj   r„   s       r   Úlocal_port_in_user‰   Í   sÊ   € ð €M€M€Må&ð ð ˆð	Ø×)Ò)¨4°¨,ÀÐ)ÑHÔHð ð Øðð ð ñ ô ð ð ð ð ð ð ð ð øøøð ð ð ð ð øåð 	ð 	ð 	ØˆHð	øøøàˆ5s-   �A¨8ªA¸<	¼A¿<	Á AÁ
AÁAé
   Ú	preferredÚattemptsc                óŠ  — ddl }t          | dz   | dz   |z   ¦  «        D ]¡}d}|j        df|j        dffD ]„\  }}	 |                      ||j        ¦  «        5 }|                     |j        |j        d¦  «         |                     ||f¦  «         ddd¦  «         n# 1 swxY w Y   Œr# t          $ r d}Y  nw xY w|r|c S Œ¢| dz   S )a|  Return the first port after ``preferred`` bindable on both loopbacks.

    Used when ``preferred`` is occupied by a non-CDP application: rather
    than launching a browser into a bind conflict, pick a nearby free
    port. Falls back to ``preferred + 1`` if nothing binds (the launch
    will then fail with a clear browser-side error instead of silently
    doing nothing).
    r   Né   Tr   r€   F)
rj   ÚrangeÚAF_INETÚAF_INET6ÚSOCK_STREAMÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindrr   )r‹   rŒ   rj   rU   ÚbindableÚfamilyr„   Úsocks           r   Úfind_free_debug_portrš   à   sJ  € ð €M€M€Må�i !‘m Y°¡]°XÑ%=Ñ>Ô>ð ð ˆØˆØ$œn¨kÐ:¸V¼_ÈeÐ<TÐUð 	ð 	‰LˆF�DðØ—]’] 6¨6Ô+=Ñ>Ô>ð ,À$Ø—O’O FÔ$5°vÔ7JÈAÑNÔNÐNØ—I’I˜t T˜lÑ+Ô+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,øøõ ð ð ð Ø �Ø��ðøøøð ð 	ØˆKˆKˆKð	à�q‰=Ðs5   ºB&Á9BÂB&ÂBÂB&Â!BÂ"B&Â&B6Â5B6c                ó  — |pt          j        ¦   «         }t          |¦  «        }|rF|d         gt          | ¦  «        ¢}|dk    rt	          j        |¦  «        nt          j        |¦  «        S |dk    rt          ¦   «         }d| › d|› d�S d S )Nr   rD   rC   z7open -a "Google Chrome" --args --remote-debugging-port=z --user-data-dir="z+" --no-first-run --no-default-browser-check)	Úplatformr(   rR   rX   Ú
subprocessÚlist2cmdlineÚshlexr@   rT   )rU   r(   r7   ÚargvÚdata_dirs        r   Úmanual_chrome_debug_commandr¢   ú   sº   € ØÐ(•x”Ñ(Ô(€FÝ,¨VÑ4Ô4€Jàð ZØ˜1”Ð9Õ 2°4Ñ 8Ô 8Ð9ˆØ06¸)Ò0CÐ0C�zÔ& tÑ,Ô,Ð,ÍÌÐTXÑIYÔIYÐYà�ÒÐÝ(Ñ*Ô*ˆðVÀdð Vð VØ (ðVð Vð Vð	
ð
 ˆ4r    Údictc                ó€   — | dk    rddiS t          t          dd¦  «        t          t          dd¦  «        z  }|rd|ini S )NrD   Ústart_new_sessionTÚDETACHED_PROCESSr   ÚCREATE_NEW_PROCESS_GROUPÚcreationflags)rw   r�   )r(   Úflagss     r   Ú_detach_kwargsrª     sZ   € Ø�ÒÐØ# TÐ*Ð*Ý•JÐ 2°AÑ6Ô6½ÝÐ.°ñ:ô :ñ €Eð (-Ð4ˆO˜UÐ#Ð#°"Ð4r    ç       @çš™™™™™¹?Úprocúsubprocess.PopenÚintervalc                ó$  — t          j        ¦   «         |z   }t          j        ¦   «         |k     rbt          |t          |d¦  «        ¬¦  «        rdS |                      ¦   «         �dS t          j        |¦  «         t          j        ¦   «         |k     °bdS )a+  Classify a launched browser as ready, exited, or still starting.

    We only need to wait long enough to catch the common failure mode where a
    candidate binary exists but exits immediately before exposing the CDP port.
    Slower browsers can still finish starting after this grace window.
    gš™™™™™É?re   ÚreadyNÚexitedÚstarting)ÚtimeÚ	monotonicr…   ÚminÚpollÚsleep)r­   rU   r[   r¯   Údeadlines        r   Ú%_wait_for_browser_debug_ready_or_exitrº     sŽ   € õ Œ~ÑÔ 'Ñ)€Hå
Œ.Ñ
Ô
˜XÒ
%Ð
%õ " $µ°H¸cÑ0BÔ0BÐCÑCÔCð 	Ø�7Ø�9Š9‰;Œ;Ð"Ø�8ÝŒ
�8ÑÔÐõ Œ.Ñ
Ô
˜XÒ
%Ð
%ð ˆ:r    zlaunch-stderr.logiÐ  c                  óD   — e Zd ZU dZded<   ded<   dZded<   dZded	<   dS )
ÚLaunchAttemptz/Outcome of one candidate-binary launch attempt.r)   ÚbinaryÚstateNz
int | NoneÚ
returncodeÚ Ústderr_tail)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r¿   rÁ   r   r    r   r¼   r¼   3  sL   € € € € € € à9Ð9à€K€K�KØ€J€J�JØ!€JÐ!Ð!Ð!Ñ!Ø€KÐÐÐÑÐÐr    r¼   c                  ó\   — e Zd ZU dZdZded<    ee¬¦  «        Zded<   e	dd
„¦   «         Z
dS )ÚChromeDebugLaunchaL  Structured result of ``launch_chrome_debug``.

    ``launched`` mirrors the legacy boolean contract: a launch command was
    executed and the browser is ready or still starting (it does NOT
    guarantee the CDP port ever opens). ``attempts`` carries per-candidate
    diagnostics so callers can explain *why* nothing came up.
    Fr]   Úlaunched)Údefault_factoryzlist[LaunchAttempt]rŒ   r*   r-   c                óŽ  — | j         D ]F}|j        dk    r9|j        dk    r.t          j                             |j        ¦  «        }|› d|› d�c S ŒG| j         D ]n}|j        dk    ra|j        rZt          j                             |j        ¦  «        › d|j                             ¦   «         d          	                    ¦   «         › �c S ŒodS )z>Best user-facing explanation for a failed/soft launch, if any.r²   r   uJ    exited immediately without opening the debug port â€” an already-running z¨ instance likely absorbed the launch (Chromium's single-instance behavior). Close ALL of its processes (including background/tray instances) and retry /browser connect.z& exited before the debug port opened: éÿÿÿÿN)
rŒ   r¾   r¿   r0   r'   Úbasenamer½   rÁ   Ú
splitlinesÚstrip)ÚselfÚattemptr   s      r   ÚhintzChromeDebugLaunch.hintJ  s  € ð ”}ð 	ð 	ˆGØŒ} Ò(Ð(¨WÔ-?À1Ò-DÐ-DÝ”w×'Ò'¨¬Ñ7Ô7�àð 2ð 2Øð2ð 2ð 2ðð ð øð ”}ð 	ð 	ˆGØŒ} Ò(Ð(¨WÔ-@Ð(å”w×'Ò'¨¬Ñ7Ô7ð Fð FØÔ*×5Ò5Ñ7Ô7¸Ô;×AÒAÑCÔCðFð Fðð ð øð ˆtr    N)r*   r-   )rÂ   rÃ   rÄ   rÅ   rÉ   rÆ   r   ÚlistrŒ   ÚpropertyrÒ   r   r    r   rÈ   rÈ   =  so   € € € € € € ðð ð €HÐÐÐÑØ$) E¸$Ð$?Ñ$?Ô$?€HÐ?Ð?Ð?Ñ?àðð ð ñ „Xðð ð r    rÈ   r'   c                ó  — 	 t          | d¦  «        5 }|                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   |t           d …                              dd¬¦  «                             ¦   «         S # t
          $ r Y dS w xY w)NÚrbzutf-8Úreplace)ÚerrorsrÀ   )ÚopenÚreadÚ_STDERR_TAIL_LIMITÚdecoderÏ   rr   )r'   ÚfhÚdatas      r   Ú_read_stderr_tailrß   _  sÌ   € ðÝ�$˜ÑÔð 	 Ø—7’7‘9”9ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	àÕ'Ð'Ð(Ð(Ô)×0Ò0°ÀÐ0ÑKÔK×QÒQÑSÔSÐSøÝð ð ð Øˆrˆrðøøøs,   ‚A5 ’3§A5 ³7·A5 º7»9A5 Á5
BÂBc           
     óx  — |pt          j        ¦   «         }t          ¦   «         }t          |¦  «        }|st                               d|¦  «         |S t          ¦   «         }t          j        |d¬¦  «         t          j	         
                    |t          ¦  «        }|D �]›}	 t          |d¦  «        5 }t          j        |gt          | ¦  «        ¢ft          j        |dœt#          |¦  «        ¤Ž}ddd¦  «         n# 1 swxY w Y   n\# t$          $ rO}	|j                             t+          |d¬¦  «        ¦  «         t                               d	||	¦  «         Y d}	~	Œ½d}	~	ww xY wt                               d
|t-          |dd¦  «        | ¦  «         t/          || ¦  «        }
t+          ||
¬¦  «        }|j                             |¦  «         |
dk    rd|_        |c S t-          |dd¦  «        |_        t5          |¦  «        |_        t                               d||j        | |j        r
d|j        › �nd¦  «         �Œ�|S )uV  Launch a Chromium-family browser with remote debugging, with diagnostics.

    Tries each detected candidate binary in turn. A candidate that exits
    before the CDP port opens (crash, singleton forward to an existing
    instance, bad profile dir) is logged â€” with exit code and a stderr tail â€”
    and the next candidate is tried.
    zAbrowser debug launch: no Chromium-family binary found (system=%s)T)Úexist_okÚwb)ÚstdoutÚstderrNzspawn-failed)r½   r¾   z,browser debug launch: failed to spawn %s: %szIbrowser debug launch: spawned %s (pid=%s) with --remote-debugging-port=%dÚpidr²   r¿   zAbrowser debug launch: %s exited (code=%s) before port %d opened%sz; stderr tail: rÀ   )rœ   r(   rÈ   rR   ÚloggerÚinforT   r0   Úmakedirsr'   r@   Ú_LAUNCH_STDERR_LOGrÙ   r�   ÚPopenrX   ÚDEVNULLrª   rx   rŒ   r4   r¼   rw   rº   rÉ   r¿   rß   rÁ   Úwarning)rU   r(   Úresultr7   r¡   Ústderr_pathÚ	candidateÚstderr_filer­   Úexcr¾   rÑ   s               r   Úlaunch_chrome_debugrò   h  s¦  € ð Ð(•x”Ñ(Ô(€FÝÑ Ô €FÝ,¨VÑ4Ô4€JØð Ý�ŠÐWÐY_Ñ`Ô`Ð`Øˆå$Ñ&Ô&€HÝ„K� 4Ð(Ñ(Ô(Ð(Ý”'—,’,˜xÕ);Ñ<Ô<€Kàð $
ñ $
ˆ	ð	Ý�k 4Ñ(Ô(ð ¨KÝ!Ô'ØÐ:Õ!3°DÑ!9Ô!9Ð:ðå%Ô-Ø&ðð õ % VÑ,Ô,ð	ð �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ ð 	ð 	ð 	ØŒO×"Ò"¥=¸	ÈÐ#XÑ#XÔ#XÑYÔYÐYÝ�KŠKÐFÈ	ÐSVÑWÔWÐWØˆHˆHˆHˆHøøøøð	øøøõ
 	�ŠØWØÝ�D˜% Ñ&Ô&Øñ		
ô 	
ð 	
õ 6°d¸DÑAÔAˆÝ y¸Ð>Ñ>Ô>ˆØŒ×Ò˜wÑ'Ô'Ð'à�HÒÐØ"ˆFŒOØˆMˆMˆMå$ T¨<¸Ñ>Ô>ˆÔÝ/°Ñ<Ô<ˆÔÝ�ŠØOØØÔØØ7>Ô7JÐRÐ3˜gÔ1Ð3Ð3Ð3ÐPRñ	
ô 	
ð 	
ñ 	
ð €Ms=   Â!DÂ1=C:Ã.DÃ:C>	Ã>DÄC>	ÄDÄ
EÄAEÅEc                ó,   — t          | |¦  «        j        S r   )rò   rÉ   )rU   r(   s     r   Útry_launch_chrome_debugrô   ¦  s   € Ý˜t VÑ,Ô,Ô5Ð5r    )r(   r)   r*   r+   )r*   r)   )rU   rV   r*   r+   )rY   )rZ   r)   r[   r\   r*   r]   )rU   rV   r[   r\   r*   r-   )r†   )rU   rV   r[   r\   r*   r]   )r‹   rV   rŒ   rV   r*   rV   )rU   rV   r(   r-   r*   r-   )r(   r)   r*   r£   )r«   r¬   )
r­   r®   rU   rV   r[   r\   r¯   r\   r*   r)   )r'   r)   r*   r)   )rU   rV   r(   r-   r*   rÈ   )rU   rV   r(   r-   r*   r]   )0rÅ   Ú
__future__r   Úloggingr0   rœ   r?   rŸ   rL   r�   r´   Údataclassesr   r   Úhermes_constantsr   Ú	getLoggerrÂ   ræ   ÚDEFAULT_BROWSER_CDP_PORTÚDEFAULT_BROWSER_CDP_URLrH   rK   ÚtupleÚ_WINDOWS_BIN_NAMESÚ_WINDOWS_INSTALL_PARTSrN   Ú_LINUX_BIN_NAMESÚ_LINUX_INSTALL_PATHSrR   rT   rX   r~   rƒ   rˆ   r…   r‰   rš   r¢   rª   rº   ré   rÛ   r¼   rÈ   rß   rò   rô   r   r    r   ú<module>r     sB  ðØ NÐ Nà "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à ,Ð ,Ð ,Ð ,Ð ,Ð ,à	ˆÔ	˜8Ñ	$Ô	$€ð  Ð ØHÐ.FÐHÐHÐ ð€ðÐ ð �UÐZÐZÐ0GÐZÑZÔZÑZÔZÐ Ø˜Ð`Ð`Ð5LÐ`Ñ`Ô`Ñ`Ô`Ð ðÐ ð@ �5ÐVÐVÐ.CÐVÑVÔVÑVÔVÐ Ø�uÐZÐZÐ2GÐZÑZÔZÑZÔZÐ ð2ð 2ð 2ð 2ðj3ð 3ð 3ð 3ðð ð ð ð!ð !ð !ð !ð !ðP /Ð Ø-Ð ðð ð ð ð ð ð ð ð ð ð& +CÐTVð ð ð ð ð ð4 -EÐ[_ð ð ð ð ð ð$5ð 5ð 5ð 5ð Øð	ð ð ð ð ð4 )Ð ØÐ ð ðð ð ð ð ñ ô ñ „ðð ðð ð ð ð ñ ô ñ „ððBð ð ð ð )¸tð;ð ;ð ;ð ;ð ;ð| )AÐW[ð 6ð 6ð 6ð 6ð 6ð 6ð 6r    