§
    øžyjXM  ã            
       óâ   — d Z ddlZddlZddlZddlmZ d„ Zddœdee         dz  de	e
eef                  fd„Z	 dd
dœdededeee	f         fd„Zddœdededz  de	e
eef                  fd„ZdS )u  Dashboard process-hygiene helpers â€” extracted from ``hermes_cli/main.py``.

Mechanical move (main.py decomposition): the three leaf process-hygiene
helpers (``_scan_dashboard_processes``, ``_kill_stale_dashboard_processes``,
``_detect_concurrent_hermes_instances``) are lifted verbatim. References to
helpers that STAY in ``hermes_cli.main`` (``_find_stale_dashboard_pids``,
``_respawn_dashboard_processes``, ``_is_windows``, ...) are routed through a
lazy ``_m()`` main reference so existing test monkeypatches on
``hermes_cli.main.<name>`` keep reaching this code path, and imports stay
one-way at import time (main.py imports this module, never the reverse).
``main.py`` re-exports all three names (``# noqa: F401``) so callers and test
patches on ``hermes_cli.main`` resolve unchanged.
é    N)ÚPathc                  ó   — ddl m}  | S )zFLazy ``hermes_cli.main`` reference (call-time; keeps patches working).r   ©Úmain)Ú
hermes_clir   r   s    ú@/home/ragecks/.hermes/hermes-agent/hermes_cli/dashboard_procs.pyÚ_mr	      s   € àÐÐÐÐÐà€Kó    ©Úexclude_pidsr   Úreturnc           
      ó   ‡ ‡‡— g d¢}t          j        ¦   «         }g }	 t          j        dk    �r0ddlm} t          j        g d¢ddddd	 |¦   «         ¬
¦  «        }|j        dk    s|j	        €g S dŠ|j	         
                    d¦  «        D ]Ó}|                     ¦   «         }|                     d¦  «        r|t          d¦  «        d…         ŠŒC|                     d¦  «        r{|t          d¦  «        d…         }t          ˆfd„|D ¦   «         ¦  «        rIt          |¦  «        |k    r6	 |                     t          |¦  «        ‰f¦  «         ŒÃ# t"          $ r Y ŒÏw xY wŒÔnút          j        g d¢ddddd¬¦  «        }|j        dk    rÓt%          |dd¦  «         
                    d¦  «        D ]®}|                     ¦   «         }|rd|v rŒ| 
                    dd¦  «        }	t          |	¦  «        dk    rŒG	 t          |	d         ¦  «        }
n# t"          $ r Y Œjw xY w|	d         Št          ˆfd„|D ¦   «         ¦  «        r|
|k    r|                     |
‰f¦  «         Œ¯n$# t&          t          j        t*          f$ r g cY S w xY w‰ rˆ fd„|D ¦   «         }|S )uD  Return matching ``dashboard``/``serve`` processes with their cmdlines.

    ``hermes dashboard`` is a long-lived server process commonly started and
    forgotten.  When ``hermes update`` replaces files on disk, the running
    process keeps the old Python backend in memory while the JS bundle on
    disk is updated, causing a silent frontend/backend mismatch (e.g. new
    auth headers the old backend doesn't recognise â†’ every API call 401s).

    The dashboard may be manually started or managed by the optional
    ``hermes-dashboard.service`` systemd unit.  Managed units are restarted
    through their owning systemd scope; only manually-started processes use
    the kill path because we can't know their original launch args.

    *exclude_pids* is an optional set of PIDs that must never be returned.
    This is used by the Hermes Desktop Electron app to protect its own
    backend child process: when the desktop spawns ``hermes serve`` as
    a backend and triggers an auto-update, the update must not kill the
    backend that the desktop itself manages.  The desktop sets the
    environment variable ``HERMES_DESKTOP_CHILD_PID`` on the spawned
    backend process; ``_kill_stale_dashboard_processes`` reads it and
    passes it here.  (#37532)

    Returns an empty list on any scan error (missing ps/wmic, timeout, etc.).
    )zhermes dashboardzhermes_cli.main dashboardzhermes_cli/main.py dashboardzhermes servezhermes_cli.main servezhermes_cli/main.py serveÚwin32r   )Úwindows_hide_flags)ÚwmicÚprocessÚgetzProcessId,CommandLinez/FORMAT:LISTTé
   úutf-8Úignore)Úcapture_outputÚtextÚtimeoutÚencodingÚerrorsÚcreationflagsNÚ ú
zCommandLine=z
ProcessId=c              3   ó    •K  — | ]}|‰v V — Œ	d S ©N© )Ú.0ÚpÚcurrent_cmds     €r   ú	<genexpr>z,_scan_dashboard_processes.<locals>.<genexpr>g   s(   øè è € Ð?Ð?°˜A Ð,Ð?Ð?Ð?Ð?Ð?Ð?r
   )Úpsz-Az-ozpid=,command=Úreplace©r   r   r   r   r   ÚstdoutÚgrepé   é   c              3   ó    •K  — | ]}|‰v V — Œ	d S r    r!   )r"   r#   Úcommands     €r   r%   z,_scan_dashboard_processes.<locals>.<genexpr>ˆ   s'   øè è € Ð:Ð:¨A˜1 ˜<Ð:Ð:Ð:Ð:Ð:Ð:r
   c                 ó(   •— g | ]}|d          ‰v¯|‘ŒS ©r   r!   )r"   Úprocr   s     €r   ú
<listcomp>z-_scan_dashboard_processes.<locals>.<listcomp>Ž   s.   ø€ ð 
ð 
ð 
Ø°D¸´GÀ<Ð4OÐ4OˆDÐ4OÐ4OÐ4Or
   )ÚosÚgetpidÚsysÚplatformÚhermes_cli._subprocess_compatr   Ú
subprocessÚrunÚ
returncoder)   ÚsplitÚstripÚ
startswithÚlenÚanyÚintÚappendÚ
ValueErrorÚgetattrÚFileNotFoundErrorÚTimeoutExpiredÚOSError)r   ÚpatternsÚself_pidÚdashboard_processesr   ÚresultÚlineÚpid_strÚstrippedÚpartsÚpidr.   r$   s   `          @@r   Ú_scan_dashboard_processesrP      sU  øøø€ ð8
ð 
ð 
€Hõ Œy‰{Œ{€HØ13ÐðEÝŒ<˜7Ò"Ñ"ð IÐHÐHÐHÐHÐHå”^ØSÐSÐSØ#ØØØ ØØ0Ð0Ñ2Ô2ðñ ô ˆFð Ô  AÒ%Ð%¨¬Ð)>Ø�	ØˆKØœ×+Ò+¨DÑ1Ô1ð !ð !�Ø—z’z‘|”|�Ø—?’? >Ñ2Ô2ð !Ø"&¥s¨>Ñ':Ô':Ð'<Ð'<Ô"=�K�KØ—_’_ \Ñ2Ô2ð 	!Ø"¥3 |Ñ#4Ô#4Ð#6Ð#6Ô7�GåÐ?Ð?Ð?Ð?°hÐ?Ñ?Ô?Ñ?Ô?ð!å ™LœL¨HÒ4Ð4ð!Ø/×6Ò6½¸G¹¼ÀkÐ7RÑSÔSÐSÐSøÝ)ð !ð !ð !Ø ˜Dð!øøøøð!õ*  ”^Ø3Ð3Ð3Ø#Ø G°IØð	ñ ô ˆFð Ô  AÒ%Ð%Ý# F¨H°bÑ9Ô9×?Ò?ÀÑEÔEð Cð C�DØ#Ÿzšz™|œ|�HØ#ð ! v°Ð'9Ð'9Ø Ø$ŸNšN¨4°Ñ3Ô3�EÝ˜5‘z”z Q’�Ø ð!Ý! %¨¤(™mœm˜˜øÝ%ð !ð !ð !Ø ˜ð!øøøà# Aœh�GÝÐ:Ð:Ð:Ð:°Ð:Ñ:Ô:Ñ:Ô:ð C¸sÀhº¸Ø+×2Ò2°C¸°>ÑBÔBÐBøøøÝ�zÔ8½'ÐBð ð ð Øˆ	ˆ	ˆ	ðøøøð ð 
ð
ð 
ð 
ð 
Ø0ð
ñ 
ô 
Ðð Ðsc   žAI Á.B9I Ä($EÅI Å
EÅI ÅEÅBI Ç2HÈI È
HÈI ÈHÈAI ÉI;É:I;ú:the running backend no longer matches the updated frontendF)Úrestart_managedÚreasonrR   c          	      ót  ‡‡‡‡ — |r't          ¦   «                              | ¦  «        rg g g dœS d}t          j                             d¦  «        }|r{t          ¦   «         }|                     d¦  «        D ]S}|                     ¦   «         }|sŒ	 |                     t          |¦  «        ¦  «         Œ=# t          t          f$ r Y ŒPw xY w|r|}t          ¦   «                              |¬¦  «        }|sg g g dœS t          ¦   «          t          dt          |¦  «        › d| › d�¦  «         i }i }i Š |r�t          j        d	k    r|D ]|}	t          ¦   «                              |	¦  «        }
|
||	<   t          ¦   «                              |	¦  «        ||	<   ||	         s(t          ¦   «                              |	¦  «        }|r|‰ |	<   Œ}g Šg Št          j        d	k    rØ|D ]Ó}		 t)          j        d
dt-          |	¦  «        dgddddd¬¦  «        }|j        dk    r‰                     |	¦  «         n7‰                     |	|j        p|j        pd                     ¦   «         f¦  «         Œ‡# t6          t(          j        t:          f$ r.}‰                     |	t-          |¦  «        f¦  «         Y d}~ŒÌd}~ww xY w�nÕddl}ddl}|D ]}		 t          j         |	|j!        ¦  «         Œ# tD          $ r ‰                     |	¦  «         Y Œ?tF          t:          f$ r.}‰                     |	t-          |¦  «        f¦  «         Y d}~Œxd}~ww xY w| $                    ¦   «         dz   }ˆˆfd„|D ¦   «         }|rŒ| $                    ¦   «         |k     rt| %                    d¦  «         g }ddl&m'} |D ]8}	 ||	¦  «        r|                     |	¦  «         Œ#‰                     |	¦  «         Œ9|}|r| $                    ¦   «         |k     °t|D ]”}		 t          j         |	|j(        ¦  «         ‰                     |	¦  «         Œ3# tD          $ r ‰                     |	¦  «         Y ŒTtF          t:          f$ r.}‰                     |	t-          |¦  «        f¦  «         Y d}~Œ�d}~ww xY w‰D ]}	t          d|	› �¦  «         Œ‰D ]\  }	}t          d|	› d|› �¦  «         Œg }g }‰�r–|�r“g }t          ¦   «         }g }‰D ]à}	|                     |	¦  «        }|r’||v rŒ|                     |¦  «         t          ¦   «          )                    ||                     |	¦  «        ¦  «        r|                     |¦  «         Œ~|                     |df¦  «         |                     |	¦  «         Œ«|	‰ v r|                     ‰ |	         ¦  «         ŒË|                     |	¦  «         Œá|D ]}t          d|› �¦  «         Œ|D ]\  }}t          d|› d|› �¦  «         Œ|rEt          ¦   «          *                    |¦  «        Š‰r"| +                    ˆˆ fd„‰D ¦   «         ¦  «         |s|rt          d¦  «         t          d ¦  «         n/‰r-tY          ‰¦  «        }t          d!¦  «         t          d ¦  «         tY          |¦  «        tY          ‰¦  «        tY          ‰¦  «        tY          |¦  «        d"œS )#u%  Kill running ``hermes dashboard`` / ``hermes serve`` processes.

    Called at the end of ``hermes update`` (default ``reason``) and also
    from ``hermes dashboard --stop`` (which overrides ``reason``).  The
    dashboard has no service manager, so after a code update the running
    process is guaranteed to be serving stale Python against a
    freshly-updated JS bundle.  Leaving it alive produces silent
    frontend/backend mismatches (new auth headers the old backend doesn't
    recognise â†’ every API call 401s).

    POSIX: SIGTERM, wait up to ~3s for graceful exit, SIGKILL any survivors.
    Windows: ``taskkill /PID <pid> /F`` since there's no clean SIGTERM
    equivalent for background console apps.

    Manually-started dashboards are not auto-restarted because we don't know
    the original launch args (--host, --port, --insecure, --tui, --no-open).
    When ``restart_managed`` is true (the ``hermes update`` path), a detected
    ``hermes-dashboard.service`` is restarted through systemd; any OTHER
    killed PID that was supervised by a systemd unit (custom unit names â€”
    e.g. a remote backend's ``hermes-serve.service``) has its owning unit
    restarted after the kill, because systemd treats our SIGTERM as a clean
    stop and ``Restart=on-failure`` would never fire (#68934).
    )ÚmatchedÚkilledÚfailedNÚHERMES_DESKTOP_CHILD_PIDú,r   u   âŸ² Stopping z dashboard process(es) (ú)r   Útaskkillz/PIDz/FTr   r'   r   r(   r   r   g      @c                 ó8   •— g | ]}|‰v¯|d „ ‰D ¦   «         v¯|‘ŒS )c                 ó   — h | ]
}|d          ’ŒS r0   r!   )r"   Úfs     r   ú	<setcomp>z=_kill_stale_dashboard_processes.<locals>.<listcomp>.<setcomp>  s   € Ð<RÐ<RÐ<RÀa¸Q¸q¼TÐ<RÐ<RÐ<Rr
   r!   )r"   r#   rW   rV   s     €€r   r2   z3_kill_stale_dashboard_processes.<locals>.<listcomp>  sA   ø€ ð 
ð 
ð 
Ø˜q¨˜˜°1Ð<RÐ<RÈ6Ð<RÑ<RÔ<RÐ3RÐ3RˆAÐ3RÐ3RÐ3Rr
   gš™™™™™¹?)Ú_pid_existsu       âœ“ stopped PID u       âœ— failed to stop PID z: z#systemctl restart returned non-zerou"       âœ“ restarted systemd service u       âš  c              3   óJ   •K  — | ]}‰                      |¦  «        ‰v ¯|V — Œd S r    )r   )r"   r#   Úfailed_cmdsÚpid_cmdlines     €€r   r%   z2_kill_stale_dashboard_processes.<locals>.<genexpr>G  s9   øè è € Ð"ZÐ"Z¨¸¿ºÈÑ8JÔ8JÈkÐ8YÐ8Y 1Ð8YÐ8YÐ8YÐ8YÐ"ZÐ"Zr
   z8  Restart anything not auto-restarted when you're ready:z"    hermes dashboard --port <port>z*  Restart the dashboard when you're ready:)rU   rV   rW   Úunrecovered)-r	   Ú"_restart_managed_dashboard_servicer3   Úenvironr   Úsetr;   r<   Úaddr@   rB   Ú	TypeErrorÚ_find_stale_dashboard_pidsÚprintr>   r5   r6   Ú_get_pid_cgroup_pathÚ_get_systemd_service_for_pidÚ_dashboard_cmdline_for_pidr8   r9   Ústrr:   rA   Ústderrr)   rD   rE   rF   ÚsignalÚtimeÚkillÚSIGTERMÚProcessLookupErrorÚPermissionErrorÚ	monotonicÚsleepÚgateway.statusr`   ÚSIGKILLÚ_try_restart_systemd_serviceÚ_respawn_dashboard_processesÚextendÚlist)!rS   rR   ÚexcludeÚraw_pidÚparsedÚpartÚpidsÚ
pid_cgroupÚpid_servicerO   Úcg_pathÚcmdlinerJ   ÚeÚ_signalÚ_timeÚdeadlineÚpendingÚstill_pendingr`   Úerr_msgÚrestarted_servicesrd   Úfailed_restartsÚseen_servicesÚrespawn_cmdsÚsvc_nameÚsvcÚerrrW   rb   rV   rc   s!                                @@@@r   Ú_kill_stale_dashboard_processesr–   “   sL  øøøø€ ð8 ð ;�2™4œ4×BÒBÀ6ÑJÔJð ;Ø¨°rÐ:Ð:Ð:ð
  $€GÝŒj�nŠnÐ7Ñ8Ô8€GØð õ ™5œ5ˆØ—M’M #Ñ&Ô&ð 	ð 	ˆDØ—:’:‘<”<ˆDØð ØðØ—
’
�3˜t™9œ9Ñ%Ô%Ð%Ð%øÝ¥	Ð*ð ð ð Ø�ðøøøàð 	ØˆGå‰4Œ4×*Ò*¸Ð*Ñ@Ô@€DØð ;Ø¨°rÐ:Ð:Ð:å	�G„G€GÝ	Ð
F�#˜d™)œ)Ð
FÐ
F¸VÐ
FÐ
FÐ
FÑGÔGÐGð )+€JØ)+€KØ(*€KØð 
/�3œ<¨7Ò2Ð2Øð 		/ð 		/ˆCÝ‘d”d×/Ò/°Ñ4Ô4ˆGØ%ˆJ�s‰OÝ!™tœt×@Ò@ÀÑEÔEˆK˜ÑØ˜sÔ#ð /õ ™$œ$×9Ò9¸#Ñ>Ô>�Øð /Ø'.�K Ñ$øà€FØ$&€Få
„|�wÒÐØð 	-ð 	-ˆCð-Ý#œØ ­¨S©¬°4Ð8Ø#'Ø¨¸	Øð	ñ ô �ð Ô$¨Ò)Ð)Ø—M’M #Ñ&Ô&Ð&Ð&à—M’M 3¨¬Ð)M¸&¼-Ð)MÈ2×(TÒ(TÑ(VÔ(VÐ"WÑXÔXÐXøøÝ%¥zÔ'@Å'ÐJð -ð -ð -Ø—’˜s¥C¨¡F¤F˜mÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,øøøøð-øøøñ	-ð 	!Ð Ð Ð ØÐÐÐð ð 	-ð 	-ˆCð-Ý”˜˜Wœ_Ñ-Ô-Ð-Ð-øÝ%ð #ð #ð #à—’˜cÑ"Ô"Ð"Ð"Ð"Ý#¥WÐ-ð -ð -ð -Ø—’˜s¥C¨¡F¤F˜mÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,øøøøð-øøøð —?’?Ñ$Ô$ sÑ*ˆð
ð 
ð 
ð 
ð 
Øð
ñ 
ô 
ˆð ð 	$˜%Ÿ/š/Ñ+Ô+¨hÒ6Ð6Ø�KŠK˜ÑÔÐØˆMð 3Ð2Ð2Ð2Ð2Ð2Øð 'ð '�Ø�;˜sÑ#Ô#ð 'Ø!×(Ò(¨Ñ-Ô-Ð-Ð-à—M’M #Ñ&Ô&Ð&Ð&Ø#ˆGð ð 	$˜%Ÿ/š/Ñ+Ô+¨hÒ6Ð6ð ð 	-ð 	-ˆCð-Ý”˜˜Wœ_Ñ-Ô-Ð-Ø—’˜cÑ"Ô"Ð"Ð"øÝ%ð #ð #ð #Ø—’˜cÑ"Ô"Ð"Ð"Ð"Ý#¥WÐ-ð -ð -ð -Ø—’˜s¥C¨¡F¤F˜mÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,øøøøð-øøøð ð ,ð ,ˆÝÐ* SÐ*Ð*Ñ+Ô+Ð+Ð+Øð >ð >‰ˆˆWÝÐ<¨CÐ<Ð<°7Ð<Ð<Ñ=Ô=Ð=Ð=ð %'ÐØ€KØñ $4�/ñ $4Ø13ˆÝ"%¡%¤%ˆØ(*ˆØð 	(ð 	(ˆCØ"—’ sÑ+Ô+ˆHØð (Ø˜}Ð,Ð,ØØ×!Ò! (Ñ+Ô+Ð+Ý‘4”4×4Ò4°X¸z¿~º~ÈcÑ?RÔ?RÑSÔSð ,Ø&×-Ò-¨hÑ7Ô7Ð7Ð7à#×*Ò*¨HÐ6[Ð+\Ñ]Ô]Ð]Ø×&Ò& sÑ+Ô+Ð+Ð+Ø˜Ð#Ð#Ø×#Ò# K°Ô$4Ñ5Ô5Ð5Ð5à×"Ò" 3Ñ'Ô'Ð'Ð'à%ð 	>ð 	>ˆCÝÐ<°sÐ<Ð<Ñ=Ô=Ð=Ð=Ø'ð 	+ð 	+‰HˆC�ÝÐ)˜SÐ)Ð) CÐ)Ð)Ñ*Ô*Ð*Ð*àð 	[Ý™$œ$×;Ò;¸LÑIÔIˆKØð [Ø×"Ò"Ð"ZÐ"ZÐ"ZÐ"ZÐ"Z¨fÐ"ZÑ"ZÔ"ZÑZÔZÐZàð 	8˜kð 	8ÝÐLÑMÔMÐMÝÐ6Ñ7Ô7Ð7øØ	ð 4Ý˜6‘l”lˆÝÐ:Ñ;Ô;Ð;ÝÐ2Ñ3Ô3Ð3õ ˜‘:”:Ý�v‘,”,Ý�v‘,”,Ý˜KÑ(Ô(ð	ð ð sg   Â"B1Â1CÃCÇBIÉJ%É7$J Ê J%Ê7KËL1Ë3L1Ì$L,Ì,L1Ï-/PÐQ<Ð>Q<Ñ$Q7Ñ7Q<)Úexclude_pidÚscripts_dirr—   c                ó–  — t          ¦   «                              ¦   «         sg S 	 ddl}n# t          $ r g cY S w xY wt	          ¦   «         }t          ¦   «                              | ¦  «        D ]�}	 |                     t          |                     ¦   «         ¦  «         	                    ¦   «         ¦  «         ŒJ# t          $ r7 |                     t          |¦  «         	                    ¦   «         ¦  «         Y ŒŠw xY w|sg S |�t          |¦  «        h}nt          j        ¦   «         h}	 t          t          |¦  «        ¦  «        }	 |                     |¦  «                             ¦   «         }n# t          $ r g }Y nw xY w|D ]â}	 |                     ¦   «         }	n# t          $ r Y Œ$w xY w|	sŒ+	 t          t'          |	¦  «                             ¦   «         ¦  «         	                    ¦   «         }
n8# t          t(          f$ r$ t          |	¦  «         	                    ¦   «         }
Y nw xY w|
|v r9	 |                     t          |j        ¦  «        ¦  «         ŒÒ# t          $ r Y ŒÞw xY wŒãn# t          $ r Y nw xY wg }	 |                     g d¢¦  «        }n# t          $ r g cY S w xY w|D �]'}	 |j        }n# t          $ r Y Œw xY w|                     d¦  «        }|                     d¦  «        }|r|�||v rŒO	 t          t'          |¦  «                             ¦   «         ¦  «         	                    ¦   «         }n8# t          t(          f$ r$ t          |¦  «         	                    ¦   «         }Y nw xY w||v rZ|                     d¦  «        pt'          |¦  «        j        }|                     t          |¦  «        t          |¦  «        f¦  «         �Œ)|S )um  Find other live processes whose .exe is one of our entry-point shims.

    Windows blocks DELETE/REPLACE on a running .exe â€” and even RENAME on the
    same .exe when another process opened it without ``FILE_SHARE_DELETE``.
    The Hermes Desktop Electron app spawns ``hermes.EXE`` as a backend child,
    so during ``hermes update`` the user-invoked process and the desktop's
    child both hold the same file. The quarantine rename then fails with
    ``[WinError 32]`` and uv inherits the lock.

    This helper enumerates processes whose ``exe`` matches one of the venv's
    shims (``hermes.exe`` / ``hermes-gateway.exe``) and returns ``(pid,
    process_name)`` pairs. The caller's own PID and its entire ancestor
    chain are excluded so the running ``hermes update`` invocation never
    reports itself â€” this matters on Windows where the setuptools .exe
    launcher (``hermes.exe``) is a separate process from the Python
    interpreter it loads (``python.exe``).

    Returns an empty list off-Windows, on missing psutil, or when no other
    instances exist. Never raises â€” process enumeration is best-effort.
    r   N)rO   ÚexeÚnamerO   rš   r›   )r	   Ú_is_windowsÚpsutilÚ	Exceptionrg   Ú_hermes_exe_shimsrh   ro   ÚresolveÚlowerrF   r@   r3   r4   ÚnextÚiterÚProcessÚparentsrš   r   rB   rO   Úprocess_iterÚinfor   r›   rA   )r˜   r—   r�   Ú
shim_pathsÚshimr   ÚseedÚ	ancestorsÚancestorÚanc_exeÚanc_normÚmatchesÚ	proc_iterr1   r§   rO   rš   Úexe_normr›   s                      r   Ú#_detect_concurrent_hermes_instancesr²   X  sG  € õ. ‰4Œ4×ÒÑÔð Øˆ	ðØˆˆˆˆøÝð ð ð Øˆ	ˆ	ˆ	ðøøøõ ™5œ5€JÝ‘”×&Ò& {Ñ3Ô3ð .ð .ˆð	.Ø�NŠN�3˜tŸ|š|™~œ~Ñ.Ô.×4Ò4Ñ6Ô6Ñ7Ô7Ð7Ð7øÝð 	.ð 	.ð 	.Ø�NŠN�3˜t™9œ9Ÿ?š?Ñ,Ô,Ñ-Ô-Ð-Ð-Ð-ð	.øøøàð Øˆ	ð. ÐÝ"% kÑ"2Ô"2Ð!3ˆˆåœ	™œ�}ˆðÝ•D˜Ñ&Ô&Ñ'Ô'ˆð	ØŸš tÑ,Ô,×4Ò4Ñ6Ô6ˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøà!ð 	ð 	ˆHðØ"Ÿ,š,™.œ.��øÝð ð ð Ø�ðøøøàð Øð0Ý�t G™}œ}×4Ò4Ñ6Ô6Ñ7Ô7×=Ò=Ñ?Ô?��øÝ�ZÐ(ð 0ð 0ð 0Ý˜w™<œ<×-Ò-Ñ/Ô/���ð0øøøà˜:Ð%Ð%ðØ ×$Ò$¥S¨¬Ñ%6Ô%6Ñ7Ô7Ð7Ð7øÝ ð ð ð Ø�Hðøøøð &ð	øõ  ð ð ð Øˆðøøøð &(€GðØ×'Ò'Ð(>Ð(>Ð(>Ñ?Ô?ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð ð 2ñ 2ˆð	Ø”9ˆDˆDøÝð 	ð 	ð 	ØˆHð	øøøà�hŠh�u‰oŒoˆØ�hŠh�u‰oŒoˆØð 	�c�k S¨LÐ%8Ð%8Øð	(Ý�4 ™9œ9×,Ò,Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7ˆHˆHøÝ�Ð$ð 	(ð 	(ð 	(Ý˜3‘x”x—~’~Ñ'Ô'ˆHˆHˆHð	(øøøà�zÐ!Ð!Ø—8’8˜FÑ#Ô#Ð5¥t¨C¡y¤y¤~ˆDØ�NŠN�C ™HœH¥c¨$¡i¤iÐ0Ñ1Ô1Ð1ùà€Nsù   ¤) ©8·8Á-AB4Â4>C5Ã4C5Ä$I! Å'E) Å(I! Å)E8Å5I! Å7E8Å8I! Æ FÆI! Æ
F"ÆI! Æ!F"Æ"I! Æ)A G*Ç)I! Ç*2HÈI! ÈHÈI! È''IÉI! É
IÉI! ÉIÉI! É!
I.É-I.É4J ÊJÊJÊ$J,Ê,
J9Ê8J9Ë0A L1Ì12M&Í%M&)rQ   )Ú__doc__r3   r8   r5   Úpathlibr   r	   rg   r@   r~   Útuplero   rP   ÚboolÚdictr–   r²   r!   r
   r   ú<module>r¸      sa  ððð ð 
€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ð Ð ðð ð ð %)ðuð uð uà�c”(˜T‘/ðuð 
ˆ%��S�Œ/Ôðuð uð uð uðp OðCð "ðCð Cð CØðCð ðCð 
ˆ#ˆtˆ)„_ð	Cð Cð Cð CðL 59ðrð rð rØðrØ'*¨T¡zðrà	ˆ%��S�Œ/Ôðrð rð rð rð rð rr
   