+
    jHàjÝÏ  ã                  óº  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIHtHtHt ^ RIHt Rt]R,           tRt]
P,                  ! 4       tR R	 ltRžR
 R lltR R ltRžR R lltR R lt ! R R]4      t ! R R]4      t ! R R]4      t  ! R R]4      t!]]3R R ll4       t"R R lt#R R lt$R  R! lt%R" R# lt&RžR$ R% llt'R& R' lt(R( R) lt)R* R+ lt*^t+R, R- lt,R. R/ lt-R0 R1 lt.R2 R3 lt/R4 R5 lt0R6 R7 lt1R8 R9 lt2R: R; lt3RžR< R= llt4R> R? lt5RžR@ RA llt6RB^ RCR/t7RDRRER/RF RG llt8RžRH RI llt9RJ RK lt:RL RM lt;RN RO lt<RP RQ lt=RžRR RS llt>RT RU lt?RV RW lt@RX RY ltARZ R[ ltBR\ R] ltCR^ R_ ltDR` Ra ltERb Rc ltFRd Re ltG]H! 4       3Rf Rg lltIRh Ri ltJRžRj Rk lltKRžRl Rm lltLRn Ro ltMRp Rq ltNRr Rs ltORt Ru ltPRv Rw ltQRŸtRRx Ry ltSRz R{ ltTR| R} ltUR~ R ltVR€ R� ltWR‚ Rƒ ltXR„ R… ltYR† R‡ ltZRˆ R‰ lt[RŠ R‹ lt\RŒ R� lt]RŽ R� lt^R� R‘ lt_R’t`R“taR” R• ltbR– R— ltcR˜ R™ ltdRš R› lteRžRœ R� lltfR# ) uþ
  Durable record of the gateways and services ``hermes update`` paused on Windows.

The pause token used to live only in the updater's memory (plus an ``atexit`` resume), so a
killed updater (console closed, ``taskkill``, power loss) left every paused gateway and SCM
service stopped with nothing on disk saying so. The record is written under the ROOT Hermes
home BEFORE anything is stopped, names its owner (pid + creation time, the update-marker
identity format), is rewritten as the token changes, and is removed only after a verified
resume. A later launch whose owner check finds the updater dead (and no update live) resumes it.

One record per checkout (the file name carries a key of the install root): a checkout sharing
the home never imports, relabels or certifies another checkout's paused set â€” its tree gate
says nothing about the other tree.

Resuming is gated on a whole tree: no interrupted-pull marker; at the pre-update HEAD, no tracked
change beyond the ones present at pause time (git died before moving HEAD); at a moved HEAD,
dependencies current for it where a launch syncs them (a build step may rewrite tracked files there). Every pause folded into
a record keeps its own baseline (``baselines``): each one taken at the current HEAD must hold.
Otherwise the record stays for the next launch, which runs after the interrupted-pull restore and
the dependency sync.

Custody: every mutation (write, claim, retire, discharge) happens while holding a kernel lock on
``<record dir>/.hermes-update-paused-gateways.lock`` (flock / msvcrt, released by the kernel when
the holder dies; the file is never deleted), and the read â†’ judge â†’ mutate decision is made
inside that hold. A recovering launch claims a record by publishing ``<record>.<pid>.<nonce>.claim``
with its own identity already inside (atomic replace), then retires the source; a crash between the
two leaves two files with ONE obligation id (``pause_id``), and an update that folds orphaned sets
into its own record lists their ids under ``absorbed`` before retiring them. Readers treat a file
whose id another file carries as a copy, never as a second obligation, and the next mutator
retires it. Completing an obligation first adds its ids to ``<record stem>.retired`` (atomic), then
unlinks its files: an unlink Windows refuses (a reader holding the file without
FILE_SHARE_DELETE) leaves a copy that is redundant by id, never an obligation that executes again.
The list is read only under the mutex, and only its absence means "nothing retired": a list that
cannot be read means unknown, so nothing is claimed and the list is never rewritten from that read.
A list that reads but does not parse is unknown too while any record or claim exists; with none
left it guards nothing and is set aside as ``<record stem>.corrupt``.
)ÚannotationsN)ÚcontextmanagerÚredirect_stdoutÚsuppress)ÚPathz.hermes-update-paused-gatewaysz.lockg      $@c               ó   € V ^8„  d   QhRR/# ©é   Úreturnr   © )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/hermes_cli/update_pause_record.pyÚ__annotate__r   =   s   € ÷ /ñ /�dñ /ó    c                 ó^   € \        \        4      P                  4       P                  ^,          # )é   )r   Ú__file__ÚresolveÚparentsr   r   r   Úinstall_rootr   =   s    € Ü”‹>×!Ñ!Ó#×+Ñ+¨AÕ.Ð.r   c               ó    € V ^8„  d   QhRRRR/# )r	   ÚrootúPath | Noner
   Ústrr   )r   s   "r   r   r   A   s   € ÷ jñ j�{ð j¨cñ jr   c                óæ   € \         P                  ! \        P                  P	                  \        T ;'       g    \        4       4      4      P                  R 4      4      P                  4       R,          # )úutf-8:Né   N)	ÚhashlibÚsha256ÚosÚpathÚnormcaser   r   ÚencodeÚ	hexdigest)r   s   &r   Ú_install_keyr$   A   sI   € Ü�>Š>œ"Ÿ'™'×*Ñ*¬3¨t×/EÐ/E´|³~Ó+FÓG×NÑNÈwÓWÓX×bÑbÓdÐehÕiÐir   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   E   s   € ÷ Nñ N�Tñ Nr   c                 óN   € ^ RI Hp  V ! 4       \         R\        4        R2,          # )é    ©Úget_default_hermes_rootÚ.ú.json)Úhermes_constantsr)   ÚRECORD_STEMr$   r(   s    r   Úrecord_pathr.   E   s#   € Ý8Ù"Ó$¬+¨°a¼»Ð7GÀuÐ'MÕMÐMr   c               ó    € V ^8„  d   QhRRRR/# )r	   Úpidú
int | Noner
   Údictr   )r   s   "r   r   r   J   s   € ÷ 	Pñ 	P�*ð 	P¨ñ 	Pr   c                óš   € ^ RI Hp V f   \        P                  ! 4       M
\	        V 4      p VP                  V 4      pRT RVf   R/# RVR 2/# )a1  ``{"pid", "ct"}`` with ``ct`` spelled like the update marker's line 3 (``ct:<s.3f>``).

The creation time comes from the probe :func:`identity_is_live` judges with
(``update_lock.process_create_time``: psutil, else stdlib), so a host without psutil still
writes a provable identity instead of ``ct=None``.©Úupdate_lockNr0   Úctzct:z.3f)Ú
hermes_clir5   r   ÚgetpidÚintÚprocess_create_time)r0   r5   Úcreateds   &  r   Úidentityr<   J   sP   € õ 'ØšŒ"�)Š)Œ+¬#¨c«(€CØ×-Ñ-¨cÓ2€GØ�3˜ g¢o˜dÐOÐO¸SÀÈÀÐ;NÐOÐOr   c               ó    € V ^8„  d   QhRRRR/# )r	   Úidentúdict | Noner
   Úboolr   )r   s   "r   r   r   V   s   € ÷ eñ e˜Kð e¨Dñ er   c                ó²   € ^ RI Hp T ;'       g    / p TP                  V P                  R4      ;'       g    ^ V P                  R4      ;'       g    R4      RJ# )a  The update marker's incarnation rule (``update_lock.incarnation_live``) for a recorded identity.

Unprovable (alive, no readable creation time) counts as live: a record is never taken from, nor
a paused process restarted over, a process that may still be the one recorded.
r4   r0   r6   NF)r7   r5   Úincarnation_liveÚget)r>   r5   s   & r   Úidentity_is_liverD   V   sM   € õ 'Ø�KˆK�R€EØ×'Ñ'¨¯	©	°%Ó(8×(=Ð(=¸A¸u¿y¹yÈ»×?VÐ?VÐRVÓWÐ_dÐdÐdr   c                  ó   € ] tR t^atRtRtR# )ÚRecordConflictz9The record names another pause whose owner is still live.r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   r   r   rF   rF   a   s   † ÝCr   rF   c                  ó   € ] tR t^etRtRtR# )Ú
RecordBusyz<Another process held the record mutex past the bounded wait.r   NrG   r   r   r   rO   rO   e   s   † ÝFr   rO   c                  ó   € ] tR t^itRtRtR# )ÚRetiredUnknownzYThe retired-id list exists but cannot be read: which obligations are complete is unknown.r   NrG   r   r   r   rQ   rQ   i   s   † Ýcr   rQ   c                  ó   € ] tR t^mtRtRtR# )ÚRecordUnknownzZA saved pause or claim exists but cannot be read or parsed: what it still owes is unknown.r   NrG   r   r   r   rS   rS   m   s   † Ýdr   rS   c               ó   € V ^8„  d   QhRR/# )r	   Úwait_sÚfloatr   )r   s   "r   r   r   r   s   € ÷ ñ �5ñ r   c           	   #  óø  "  € \        \        R^ 4      pV'       d7   V^,           \        n         Rx € \        ;P                  ^,          un        R# ^ RIHp \        4       P                  \        4      pVP                  P                  RRR7       \        P                  ! V\        P                  \        P                  ,          \        \        R^ 4      ,          R4      p \        P                  ! 4       V ,           pVP!                  V4      '       gA   \        P                  ! 4       V8”  d   \#        V R24      h\        P$                  ! R	4       KW  ^\        n         Rx € ^ \        n        VP'                  V4        \        P(                  ! V4       R#   \        ;P                  ^,          un        i ; i  ^ \        n        TP'                  T4       i ; i  \        P(                  ! T4       i ; i5i)
z¶Exclusive kernel lock on the record directory's sidecar (A7). Re-entrant per thread; each
thread's first entry opens its own descriptor, so threads exclude each other like processes.ÚdepthNr4   T©r   Úexist_okÚO_BINARYi¤  z% is held by another process or threadgš™™™™™©?)ÚgetattrÚ_mutex_heldrX   r7   r5   r.   Ú	with_nameÚ
MUTEX_NAMEÚparentÚmkdirr   ÚopenÚO_RDWRÚO_CREATÚtimeÚ	monotonicÚ	_try_lockrO   ÚsleepÚ_unlockÚclose)rU   rX   r5   r    ÚfdÚdeadlines   &     r   Ú_mutexrm   q   sX  é € ô ”K ¨!Ó,€EßØ! A�IŒÔð	#Ûä×Ò Õ"ÕÙÝ&Ü‹=×"Ñ"¤:Ó.€DØ‡K�K×Ñ˜d¨TÐÔ2Ü	�Š�”r—y‘y¤2§:¡:Õ-´¼¸JÈÓ0JÕJÈEÓ	R€BðÜ—>’>Ó# fÕ,ˆØ×'Ñ'¨×+Ò+Ü�~Š~Ó (Ô*Ü  D 6Ð)NÐ!OÓPÐPÜ�JŠJ�tÖØŒÔð	$Ûà !ŒKÔØ×Ñ Õ#ä
�Š�Žøô' ×Ò Õ"Öûð  !"ŒKÔØ×Ñ Õ#ûä
�Š��üsS   ‚,G:¯F ³B0G:Ã$2G ÄAG Å#F> Å'G ÆG:ÆF;Æ;G:Æ>GÇG ÇG7Ç7G:c               ó   € V ^8„  d   QhRR/# )r	   r
   r   r   )r   s   "r   r   r   ‘   s   € ÷ ñ ˜ñ r   c            	     óê  € \         P                  ! R4      p V '       d   V # \        \        4      ;_uu_ 4        ^ RIp^ RIHp ^ RIHp VP                  RRR7      pVeN   VP                  e@   VP                  P                  4       '       d    \        VP                  4      uuRRR4       # VP                  R4      VP                  4       reV! VP                  4       4      P                  R4      pVP                  VP!                  4       VP#                  Wv4      ,          V4      pVe,   VP                  4       '       d   \        V4      uuRRR4       # RRR4       R#   + '       g   i     R# ; i)aQ  The git ``hermes update`` runs, found without installing anything: PATH's, else the copy
install.ps1 staged in PM's store (``_subprocess_compat.expose_pm_git`` puts it on PATH only
inside the updater). A bare ``git`` on such an install dies with WinError 2, so every gate
read would fail and the paused gateways would never be restarted.ÚgitN)Úpaths)ÚLockfileT)Úallow_outdated)ÚshutilÚwhichr   Ú	ExceptionÚpmrq   Úpm.lockrr   Úinstalled_packageÚbinaryÚis_filer   Úget_packageÚcurrent_targetÚlockfile_pathÚversionÚ
store_rootÚstore_entry)	Úfoundrw   rq   rr   ÚrecordedÚpackageÚtargetr   Ústageds	            r   Ú_git_executabler‡   ‘   s  € ô
 �LŠL˜Ó€EßØˆÜ	”)×	Õ	ÛÝÝ$à×'Ñ'¨¸dÐ'ÓCˆØÒ H§O¡OÒ$?ÀHÇOÁO×D[ÑD[×D]ÒD]Ü�x—‘Ó'÷ 
Ò	ð Ÿ.™.¨Ó/°×1BÑ1BÓ1D�Ù˜5×.Ñ.Ó0Ó1×9Ñ9¸%Ó@ˆØ—‘ × 0Ñ 0Ó 2°W×5HÑ5HÈÓ5YÕ YÐ[aÓbˆØÒ &§.¡.×"2Ò"2Ü�v“;÷ 
×	Ò	ñ ÷ 
Ö	ñ ús   ¸AE!ÂE!Â-BE!Å
E!Å!E2	c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r   r   Úargsr   r
   z"subprocess.CompletedProcess | Noner   )r   s   "r   r   r   ©   s"   € ÷ ñ ˆtð ˜Cð Ð$Fñ r   c                óÄ   € ^ RI Hp  V! \        4       R\        V 4      .VRRRR\        P
                  ^RR7	      #   \        \        \        P                  3 d     R# i ; i)	z©A read-only git query in the updater's custody (``update_custody.run_git``: job-bound on
Windows inside an update, custody config in argv); ``None`` when git cannot run.)Úrun_gitz-CTr   ÚreplaceF)Úcapture_outputÚtextÚencodingÚerrorsÚstdinÚtimeoutÚcheckN)	Úhermes_cli.update_custodyr‹   r‡   r   Ú
subprocessÚDEVNULLÚOSErrorÚ
ValueErrorÚSubprocessError)r   r‰   r‹   s   &* r   Ú_gitrš   ©   se   € õ 2ðÙœÓ)¨4´°T³Ð;¸TÐRVÐ]aØ '°	Ä×ASÑASÐ]_Ðglônð 	nøä”Z¤×!;Ñ!;Ð<ô Úðús   ˆ2; » AÁAc               ó    € V ^8„  d   QhRRRR/# )r	   r   r   r
   ú
str | Noner   )r   s   "r   r   r   ´   s   € ÷ )ñ )�4ð )˜Jñ )r   c                ó”   € \        V R RR4      pVe   VP                  ^ 8w  d   R# VP                  P                  4       ;'       g    R# )ú	rev-parsez--verifyÚHEADN)rš   Ú
returncodeÚstdoutÚstrip)r   Úresults   & r   Úhead_shar¤   ´   sB   € Ü�$˜ Z°Ó8€FØ‚~˜×*Ñ*¨aÔ/ÙØ�=‰=×ÑÓ ×(Ð( DÐ(r   c               ó    € V ^8„  d   QhRRRR/# )r	   r   r   r
   úlist[str] | Noner   )r   s   "r   r   r   »   s   € ÷ ñ ˜$ð Ð#3ñ r   c                ó~  € \        V RRRR4      pVe   VP                  ^ 8w  d   R# \        4       pVP                  P	                  R4      p^ pV\        V4      8  dW   W4,          pV^,          p\        V4      ^8  d   K3  VP                  VR,          4       V^ ,          R9   g   K[  V^,          pKf  \        V4      # )	zVTracked paths that differ from HEAD (index or worktree); ``None`` when git cannot say.Ústatusz--porcelain=v1ú-zz--untracked-files=noNÚ :é   NNÚRC)rš   r    Úsetr¡   ÚsplitÚlenÚaddÚsorted)r   r£   rq   ÚentriesÚindexÚentrys   &     r   Útracked_changesrµ   »   s¤   € ä�$˜Ð"2°DÐ:PÓQ€FØ‚~˜×*Ñ*¨aÔ/ÙÜ‹E€EØ�m‰m×!Ñ! $Ó'€GØ€EØ
”#�g“,Ô
Ø•ˆØ��
ˆÜˆu‹:˜Œ>ÙØ�	‰	�%˜•)ÔØ��8�tÖØ�Q�JŠEÜ�%‹=Ðr   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   Útokenr2   r   r   r
   r   )r   s   "r   r   r   Î   s!   € ÷ ñ �dð  +ð ¸ñ r   c                ó‚  a€ T;'       g    \        4       pV P                  R\        P                  ! 4       P                  4      oV P                  R. 4      p\
        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g)   \        V4      ;p'       d   VP                  RS/VC4       V # )z»Record what "the tree before this update" was, for the whole-tree gate: one baseline per
pause (idempotent for this token's ``pause_id``), next to the baselines of the pauses it absorbed.Úpause_idÚ	baselinesc              3  óJ   <"  € T F  qP                  R 4      S8H  x € K  	  R# 5i)r¹   N©rC   )Ú.0Úbr¹   s   & €r   Ú	<genexpr>Ústamp_tree.<locals>.<genexpr>Ô   s   øé € Ð@±i°�u‰u�ZÓ  HÖ,³iùs   ƒ #TF)r   Ú
setdefaultÚuuidÚuuid4ÚhexÚanyÚ
tree_stateÚappend)r·   r   rº   Ústater¹   s   &&  @r   Ú
stamp_treerÉ   Î   s’   ø€ ð ×!Ð!”<“>€DØ×Ñ 
¬D¯JªJ«L×,<Ñ,<Ó=€HØ× Ñ  ¨bÓ1€Iß‹3Ô@±iÓ@�3�3Š3Ô@±iÓ@×@Ò@ÌzÐZ^ÓO_ÐF_ÀeÖF_Ø×Ñ˜* hÐ8°%Ð8Ô9Ø€Lr   c               ó    € V ^8„  d   QhRRRR/# )r	   r   r   r
   r?   r   )r   s   "r   r   r   Ù   s   € ÷ Sñ S�Tð S˜kñ Sr   c                óÔ   € V R,          P                  4       '       g   R# \        V 4      pR\        V 4      RTRT;'       g    .  Uu/ uF  q"\        W,          4      bK  	  up/# u upi )zZHEAD, the tracked changes and their bytes now; ``None`` when *root* is not a git checkout.ú.gitNÚpre_shaÚdirty_at_pauseÚdirty_digests)Úexistsrµ   r¤   Ú_digest)r   Údirtyr    s   &  r   rÆ   rÆ   Ù   se   € à�6�M×!Ñ!×#Ò#ÙÜ˜DÓ!€Eà”x “~Ð'7¸ØÀUÇ[À[ÈbÀ[ÓQÁ[¸T¤G¨D­KÓ$8Ò8Á[ÑQðSð SùÚQs   ÁA%c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   rœ   r   )r   s   "r   r   r   ã   s   € ÷ ñ �$ð ˜:ñ r   c                óŒ   €  \         P                  ! V P                  4       4      P                  4       #   \         d     R # i ; i©N)r   r   Ú
read_bytesr#   r—   ©r    s   &r   rÑ   rÑ   ã   s8   € ðÜ�~Š~˜dŸo™oÓ/Ó0×:Ñ:Ó<Ð<øÜô Úðús   ‚14 ´AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r?   r…   r   r
   ÚNoner   )r   s   "r   r   r   ê   s!   € ÷ 	,ñ 	,�[ð 	,¨#ð 	,°$ñ 	,r   c                ó@  € V '       d    V P                  R4      '       d	   V'       g   R# V P                  R4      ;'       g    .  FD  pVP                  R4      V R,          8X  g   K"  \        0 VP                  R. 4      mVk4      VR&   KF  	  \        / V CRR/C4       R# )a  Persist, BEFORE git writes the tree, the commit this run's checkout move goes to, on this
pause's own baseline: an unmoved HEAD is later judged against what THAT move could write, never
against refs a later fetch replaced. Raises when it cannot be recorded: the move must not run.r¹   Nrº   Úmove_targetsÚresume_neededT)rC   r±   Úwrite)r·   r…   Úbaselines   && r   Ú	mark_moverß   ê   s‹   € ÷ ˜Ÿ	™	 *×-Ò-·VÙØ—I‘I˜kÓ*×0Ð0¨bÒ0ˆØ�<‰<˜
Ó# u¨ZÕ'8Ö8Ü'-Ð.Y°·±¸^ÈRÓ0PÐ.YÐRXÐ.YÓ'ZˆH�^Ó$ñ 1ô 
Ð
*ˆUÐ
*�O TÑ
*Ö+r   c               ó    € V ^8„  d   QhRRRR/# ©r	   r   r   r
   zset[str] | Noner   )r   s   "r   r   r   ù   s   € ÷ 	ñ 	˜ð 	¨?ñ 	r   c                óú   € \        4       p\        V4       Fa  p\        V RRRRRVR4      pVe   VP                  ^ 8w  d    R# VP	                  \        RVP                  P                  R4      4      4       Kc  	  V# )	u—   Tracked paths that differ between HEAD and any of *targets* â€” all a fast-forward, reset or
merge toward them can write; ``None`` when git cannot say.Údiffz--name-onlyr©   z--no-renamesrŸ   z--Nrª   )r­   r±   rš   r    ÚupdateÚfilterr¡   r®   )r   Útargetsrq   r…   rã   s   &&   r   Ú_paths_betweenrç   ù   sn   € ô “e€EÜ˜–/ˆÜ�D˜& -°°~ÀvÈvÐW[Ó\ˆØŠ<˜4Ÿ?™?¨aÔ/ÚØ�‰”V˜D $§+¡+×"3Ñ"3°DÓ"9Ó:Ö;ñ	 "ð
 €Lr   c               ó    € V ^8„  d   QhRRRR/# rá   r   )r   s   "r   r   r     s   € ÷ )ñ ) Dð )¨_ñ )r   c                ó|  € \        V RRR4      p\        V RRR4      pVe'   VP                  ^ 8w  g   Ve   VP                  ^ 8w  d   R#  WP                  P                  4       ,          P	                  RR	R
7      P                  R4      pT Uu0 uF1  qDP                  4       '       g   K  TP                  4       ^ ,          kK3  	  up\        TP                  P                  4       4      ,          pT'       d   \        T4      \        8”  d   R# \        Y4      #   \         d    . p Lž\         d     R# i ; iu upi )a  For a pause with no recorded move (:func:`mark_move`: none attempted, or a record from before
it was kept): the paths between HEAD and a commit the checkout fetched (``FETCH_HEAD``) or tracks
(``refs/remotes``). ``None`` when git cannot say or nothing was fetched (target unknown).rž   z
--git-pathÚ
FETCH_HEADzfor-each-refz--format=%(objectname)zrefs/remotesNú	utf-8-sigrŒ   ©r�   r�   Ú
)rš   r    r¡   r¢   Ú	read_textr®   ÚFileNotFoundErrorr—   r­   r¯   Ú_MAX_MOVE_TARGETSrç   )r   ÚwhereÚrefsÚfetchedÚlineræ   s   &     r   Ú_paths_a_move_could_writerõ     s  € ô ��{ L°,Ó?€EÜ��nÐ&>ÀÓO€DØ‚}˜×(Ñ(¨AÔ-°²ÀÇÁÐTUÔAUÙðØŸ,™,×,Ñ,Ó.Õ.×9Ñ9À;ÐW`Ð9Óa×gÑgÐhlÓmˆñ
 ,3ÓC©7 4·j±j·lŒˆt�z‰z‹|˜A�ˆ©7ÑCÄcÈ$Ï+É+×J[ÑJ[ÓJ]ÓF^Õ^€Gß”c˜'“lÔ%6Ô6ÙÜ˜$Ó(Ð(øô ô ØŠÜô ÚðüâCs+   Á
A D ÂD9Â*D9ÄD6Ä(D6Ä1D6Ä5D6c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r	   r   r   rÞ   r2   r    r   r
   r@   r   )r   s   "r   r   r     s.   € ÷ Hñ H˜ð H¨ð H°Sð H¸Tñ Hr   c                óÄ   € Y!P                  R4      ;'       g    . 9  d   R# VP                  R4      pVRJ ;'       g$    VP                  V4      \        W,          4      8H  # )z€*path* is as the pause saw it: dirty then, with the same bytes now (a baseline from before
digests were kept has only the name).rÎ   FrÏ   N)rC   rÑ   )r   rÞ   r    Údigestss   &&& r   Ú_seen_at_pauserù     sT   € ð —L‘LÐ!1Ó2×8Ð8°bÔ9ÙØ�l‰l˜?Ó+€GØ�dˆ?×GÐG˜gŸk™k¨$Ó/´7¸4½;Ó3GÑGÐGr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r   r   Úchangesú	list[str]Úat_headú
list[dict]r
   r   )r   s   "r   r   r   "  s(   € ÷ ñ ˜ð  yð ¸:ð È)ñ r   c                ó~  a a	€ V F¯  o	\        V	V 3R lV 4       4      pV'       g   K#  S	P                  R4      S	P                  R4      rTV'       d   \        S V4      MV'       d   \        4       M
\	        S 4      pVf   TM'V Uu. uF  qw0 VmT;'       g    Rm9   g   K  VNK  	  uppV'       g   K­  Vu # 	  . # u upi )a$  Tracked changes at an unmoved HEAD that git may have left half-written, for the first
baseline that has any. A change the pause did not see counts only on a path the update's move
could write: a build/sync step (or the user) rewriting any other tracked file is not git's
doing, and holding the set for it would keep gateways stopped until someone cleans the file.
The move is the one recorded before it ran, so a later fetch never narrows it; with none
recorded the fetched refs stand in, and when even those are unknown every unseen change counts.c              3  óR   <"  € T F  p\        SSV4      '       d   K  Vx € K  	  R # 5irÕ   ©rù   )r½   r    rÞ   r   s   & €€r   r¿   Ú _half_written.<locals>.<genexpr>*  s    øé € Ða©W T¼NÈ4ÐQYÐ[_×<`ŸDšD«Wùs   ƒ'�
'rÛ   Ú
move_pathsr   )r±   rC   rç   r­   rõ   )
r   rû   rý   Ú
unexpectedræ   rq   Úwritabler    ÚtornrÞ   s
   f&&      @r   Ú_half_writtenr  "  sª   ù€ ó ˆÜÕa©WÓaÓaˆ
ßÙà!Ÿ™ nÓ5°x·|±|ÀLÓ7Q�ß4;”> $¨Ô0Ï%ÄÄÔUnÐosÓUtˆØ%Ò-‰zÁZÓ3wÁZ¸TÐ[vÐ]eÐ[vÐin×itÐitÐrtÐ[vÑSv·D°DÁZÑ3wˆß‰4ØŠKñ ð €Iùò 4xs   ÂB:ÂB:ÂB:c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r   r   r‚   r2   rû   r¦   r
   r   )r   s   "r   r   r   6  s0   € ÷ jñ j�tð j Dð jÐ3Cð jÐHXñ jr   c                ó¤   a aa€ SP                  R4      '       d   \        S SR,          .4      MRoSe   Vf   R# \        VV V3R lV 4       4      # )zßPaths a move from *found*'s HEAD to the current one wrote that do not hold the current
commit's bytes: tracked changes on them that were not already there, byte for byte, when the
move started. ``None`` when git cannot say.rÍ   Nc              3  ób   <"  € T F$  qS9   g   K  \        SSV4      '       d   K   Vx € K&  	  R # 5irÕ   r  )r½   r    r‚   r   r  s   & €€€r   r¿   Útorn_by_move.<locals>.<genexpr>=  s(   øé € Ði¡7˜4°hÑ.>”$Ä~ÐVZÐ\aÐcg×Gh—$’$£7ùs   ƒ/�/¥
/)rC   rç   r±   )r   r‚   rû   r  s   ff&@r   Útorn_by_mover  6  sI   ú€ ð <A¿9¹9ÀY×;OÒ;OŒ~˜d U¨9Õ%5Ð$6Ô7ÐUY€HØÒ˜7š?ÙÜÖi¡7ÓiÓiÐir   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r	   r   r   Úheadr   rû   rü   Úlandedrþ   r
   r   )r   s   "r   r   r   @  s0   € ÷ ñ �tð  3ð °ð ÀJð ÐS\ñ r   c                ó   € V Fr  pVP                  R4      ;'       g    / P                  V4      pVf   \        WV4      pVf   \        V4      MV Uu. uF  qfV9   g   K  VNK  	  uppV'       g   Kp  Vu # 	  . # u upi )aÍ  Tracked changes at a HEAD a recorded move reached that are not that commit's bytes. git can
move HEAD past a file it failed to write (``checkout`` exits 0 after "unable to unlink old"),
so a moved HEAD vouches for nothing by itself. The verdict the updater took the moment git
returned stands while those paths stay changed: a later dependency sync or stash restore
rewriting a file is not the move's doing. A move the updater died before judging is judged now.r  )rC   r  Úlist)r   r  rû   r  rÞ   Úverdictr    r  s   &&&&    r   Ú_landed_tornr  @  s}   € ó ˆØ—<‘< Ó)×/Ð/¨R×4Ñ4°TÓ:ˆØŠ?Ü" 4°7Ó;ˆGØ '¢Œt�GŒ}ÁwÓ5bÁw¸tÐZaÑRa·d°dÁwÑ5bˆß‰4ØŠKñ ð €Iùò 6cs   ÁA;Á A;c               ó    € V ^8„  d   QhRRRR/# )r	   r   r   r
   r@   r   )r   s   "r   r   r   P  s   € ÷ ñ ˜Dð  Tñ r   c                ó„  € \         P                  P                  RR4      P                  4       R9   g;   V R,          P	                  4       '       d   V R,          P                  4       '       g   R#  ^ RIHp V! V 4      P                  R4      R8w  d   R# ^ R	IpVP                  V R
7      '       * #   \         d     R# i ; i)uh  At a moved HEAD: are stale dependencies a reason to keep the paused set stopped?

Only where waiting converges. A self-managed install (``updateMechanism: self``) syncs its
dependencies at the start of every launch (``venv_sync.prepare_launch``), before startup
recovery runs, so a deferred set comes back on the next launch. Anywhere else nothing a launch
does makes them current (a developer checkout owns its own venv): the set resumes now, as it
did before the pause was durable, and a currency the probe cannot establish never holds it
either â€” the restarted gateway's own launch syncs or reports the remedy.
ÚHERMES_DISABLE_LAZY_INSTALLSÚ rÌ   zpyproject.tomlF)Úread_install_stampÚupdateMechanismÚselfN)Úproject_root)Ú1ÚtrueÚyes)r   ÚenvironrC   ÚlowerrÐ   r{   Úhermes_cli.stewardr  rw   Úvenv_is_currentrv   )r   r  rw   s   &  r   Ú_deps_hold_resumer#  P  s    € ô 	�
‰
�‰Ð5°rÓ:×@Ñ@ÓBÐFZÔZØ˜6•M×)Ñ)×+Ò+°DÐ;KÕ4K×3TÑ3T×3VÒ3VÙðÝ9Ù˜dÓ#×'Ñ'Ð(9Ó:¸fÔDÙÛØ×%Ñ%°4Ð%Ó8Ô8Ð8øÜô Úðús   Á1"B0 ÂB0 Â0B?Â>B?c               ó    € V ^8„  d   QhRRRR/# ©r	   r·   r2   r
   r@   r   )r   s   "r   r   r   g  s   € ÷ ñ  dð ¨tñ r   c                óÆ   € V P                  R4      ;'       g    . p\        V4      ;'       d5    \        ;QJ d    R V 4       F  '       d   K   R# 	  R# ! R V 4       4      # )aÒ  Every pause in the set already found HEAD unreadable and none bound a tree move since.

The gateways were serving exactly this tree when they stopped, and no step of the update wrote
a file (``_checkout_move`` records its targets/paths before git writes), so restarting them
leaves the tree as they knew it. Without this a ``.git`` git rejects (an empty ``HEAD``) kept
the set stopped on every later launch, since no update can fetch until the checkout is repaired.
rº   c              3  óè   "  € T Fh  pVP                  R 4      RJ ;'       dI    VP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      '       * x € Kj  	  R# 5i)rÍ   NrÛ   r  r  r¼   )r½   r¾   s   & r   r¿   Ú-_paused_on_unreadable_head.<locals>.<genexpr>p  sb   é € ð #áˆAð 	
�‰ˆiÓ˜DÐ ×jÐj¨!¯%©%°Ó*?×*iÐ*iÀ1Ç5Á5ÈÓCV×*iÐ*iÐZ[×Z_ÑZ_Ð`hÓZiÔ%jÔjÛùs   ‚A2¡A2ºA2ÁA2FT)rC   r@   Úall)r·   rº   s   & r   Ú_paused_on_unreadable_headr*  g  se   € ð —	‘	˜+Ó&×,Ð,¨"€IÜ�	‹?÷ ð Ÿs›sñ #áó#Ÿsœsð šsð ˜sñ #áó#ó  ð r   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r2   r   r   r
   ztuple[bool, str]r   )r   s   "r   r   r   u  s"   € ÷ ñ ˜ð  [ð Ð<Lñ r   c                óf  € ^ RI Hp T;'       g    \        4       pVR,          P                  4       '       Ed\   V! V4      P                  4       '       d   R# \	        V4      pVf   \        V 4      '       d   R# R# V P                  R4      ;'       g    . pV Uu. uF  qUP                  R4      V8X  g   K  VNK  	  ppV Uu. uF\  qUP                  R4      V8w  g   K  Y5P                  R4      ;'       g    / 9   g"   Y5P                  R4      ;'       g    . 9   g   KZ  VNK^  	  ppV'       g	   V'       d_   \        V4      pVf   R# \        WV4      ;'       g    \        WW‡4      p	V	'       d   RR\        V	4       R	V	^ ,           R
23# V'       d   R# \        V4      '       d   R# R# u upi u upi )zOMay paused gateways start on this checkout now? ``(verdict, reason when not)``.)Úinterrupted_pull_markerrÌ   Frº   rÍ   r  rÛ   zthe checkout has z% file(s) git left half-written (e.g. Ú))Fz:the checkout is mid-pull (interrupted-pull marker present))Tr  )Fzthe checkout HEAD is unreadable)Fz"git cannot read the checkout state)Fz5dependencies are not current for the updated code yet)Úhermes_cli._early_recoveryr-  r   rÐ   r¤   r*  rC   rµ   r  r  r¯   r#  )
r·   r   r-  r  rº   r¾   rý   r  rû   r  s
   &&        r   Útree_is_wholer0  u  s‰  € åBØ×!Ð!”<“>€DØˆv�×Ñ×ÓÙ" 4Ó(×/Ñ/×1Ò1ØVÐVÜ˜‹~ˆØŠ<Ü)¨%×0Ò0Ø�Ø;Ð;Ø—I‘I˜kÓ*×0Ð0¨bˆ	Ù'ÓD™i˜¯5©5°Ó+;¸tÑ+C—1�1™iˆÐDá&ó b™Y˜¯%©%°	Ó*:¸dÑ*B”!Ø§¡ h£× 5Ð 5°2Ô6¸$Ç5Á5ÈÓCX×C^ÐC^Ð\^Ñ:_÷ �!™Yˆð bç—fô & dÓ+ˆGØŠØBÐBÜ  °Ó8×eÐe¼LÈÐU\Ó<eˆDßØÐ 1´#°d³)°Ð<aÐbfÐghÕbiÐajÐjkÐlÐlÐlßØ�Ü˜×ÒØMÐMØ€Oùò% Eùòbs*   ÂF)Â6F)ÃF.ÃF.Ã6F.ÄF.ÄF.c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r    r   Úbodyr2   r
   rÙ   r   )r   s   "r   r   r   —  s!   € ÷ ñ ˜ð  Dð ¨Tñ r   c           	     óz  € V P                   P                  R R R7       V P                  V P                   R\        P
                  ! 4        R24      p \        VRRR7      ;_uu_ 4       p\        P                  ! W^R R7       VP                  4        \        P                  ! VP                  4       4       RRR4       \        P                  ! W 4       R#   + '       g   i     L(; i  \         dF    \        \        4      ;_uu_ 4        TP!                  4        RRR4       h   + '       g   i     h ; ii ; i)	TrY   r*   z.tmpÚwr   ©r�   )ÚindentÚ	sort_keysN)r`   ra   r^   Únamer   r8   rb   ÚjsonÚdumpÚflushÚfsyncÚfilenorŒ   ÚBaseExceptionr   r—   Úunlink)r    r2  ÚtmpÚfhs   &&  r   Ú_atomic_writerB  —  sÕ   € Ø‡K�K×Ñ˜d¨TÐÔ2Ø
�.‰.˜DŸI™I˜; a¬¯	ª	« }°DÐ9Ó
:€CðÜ�#�s W×-Õ-°Ü�IŠI�d q°DÕ9Ø�H‰HŒJÜ�HŠH�R—Y‘Y“[Ô!÷ .ô 	�
Š
�3Ö÷	 .×-ûô
 ô ô ”g×ÕØ�J‰JŒL÷ à÷ Öàúðús=   ÁC* Á)ACÂ7C* ÃC'	Ã"C* Ã*"D:ÄD&Ä	D:Ä&D6Ä1	D:c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   r?   r   )r   s   "r   r   r   ¨  s   € ÷ ñ ˆ{ð  kñ r   c                ó   € T ;'       g    \        4       p  V P                  RR7      p \
        P                  ! T4      p\        T\        4      '       d&   \        TP                  R4      \        4      '       g   \	        RT  R24      hT#   \         d     R# \         d   p\	        RT  RT 24      ThRp?ii ; i  \         d    Rp L�i ; i)	ar  The saved body; ``None`` only when the file is absent. One that exists but cannot be read
(a Windows sharing violation, an AV scanner) or does not parse raises :class:`RecordUnknown`:
it may be the newest copy of an obligation (its partial progress) or the only one, so it never
lets an older copy execute nor a new pause replace it. Callers fail closed and retry later.rë   r5  Nz&cannot read the paused-gateway record ú: r·   zthe paused-gateway record z) is malformed; fix or remove it to resume)r.   rî   rï   r—   rS   r9  Úloadsr˜   Ú
isinstancer2   rC   )r    rŽ   Úexcr2  s   &   r   ÚreadrI  ¨  sË   € ð
 × Ð ”;“=€Dð]Ø�~‰~ {ˆ~Ó3ˆð
Ü�zŠz˜$Óˆô �dœD×!Ò!¬°D·H±H¸WÓ4EÄt×)LÒ)LÜÐ8¸¸Ð>gÐhÓiÐiØ€Køô ô ÚÜô ]ÜÐDÀTÀFÈ"ÈSÈEÐRÓSÐY\Ð\ûð]ûô ô ØŠðús4   –B ©B= ÂB:ÂB:Â"B:Â#B5Â5B:Â=CÃCr0   r6   Úownerr    c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r	   r·   r2   rJ  r?   r    r   r
   rÙ   r   )r   s   "r   r   r   À  s/   € ÷ pñ p�ð p ð p¸;ð pÐRVñ pr   c               ó  € T;'       g    \        4       p\        4       ;_uu_ 4        \        V4      pVRJ;'       d+    VR,          P                  R4      V P                  R4      8H  pVe»   V'       g³   VP                  R4      \	        \        4       4      8w  d!   \        V RVP                  R4       R24      h\        VP                  R4      4      '       d'   \        V RVR,          P                  R	4       24      h\        V \        \        VR,          4      4      4       Vf    V'       d   Ve
   VR,          M	\        4       p\        VR
^RVR\	        \        4       4      RV /4       RRR4       R#   + '       g   i     R# ; i)z®Persist *token*. The owner of the same pause is kept; another pause's orphaned set is merged
into *token* (in place, so this run's resume brings it back); a live one refuses.Nr·   r¹   r   z- holds gateways paused for another checkout (r.  rJ  z' holds gateways paused by live process r0   Úschema)r.   rm   rI  rC   r   r   rF   rD   Ú
merge_intoÚdrop_never_stoppedr2   r<   rB  )r·   rJ  r    ÚexistingÚsames   &$$  r   rÝ   rÝ   À  s?  € ð × Ð ”;“=€DÜ	��Ü˜“:ˆØ˜tÐ#×bÐb¨°Õ(9×(=Ñ(=¸jÓ(IÈUÏYÉYÐWaÓMbÑ(bˆØÒ¯Ø�|‰|˜NÓ+¬s´<³>Ó/BÔBÜ$¨ vÐ-ZÐ[c×[gÑ[gÐhvÓ[wÐZxÐxyÐ%zÓ{Ð{Ü §¡¨WÓ 5×6Ò6Ü$¨ vÐ-TÐU]Ð^eÕUf×UjÑUjÐkpÓUqÐTrÐ%sÓtÐtÜ�uÔ0´°h¸wÕ6GÓ1HÓIÔJØŠ=ß)-°(Ò2F�H˜WÖ%ÌHËJˆEÜ�d˜X q¨'°5¸.Ì#ÌlËnÓJ]Ð_fÐhmÐnÔo÷ 
��Šús   §AE9Á5B=E9Ä3<E9Å9F
	c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r2   Úmarkersr?   r
   rÙ   r   )r   s   "r   r   r   Ò  s!   € ÷ 	#ñ 	#˜tð 	#°Kð 	#È4ñ 	#r   c           
     ó*  € \        0 \        \        V P                  R4      ;'       g    . 4      mR V 4       m4      V R&   \        \        \        V P                  R4      ;'       g    . 4      4      V R&   \        P
                  ! 4       V R&   / V P                  R4      ;'       g    / CT;'       g    / P                  4        UUu/ uF#  w  r4\        \        V4      4      \        V4      bK%  	  uppCV R&   \        V \        4       R7       R# u uppi )aS  Persist, BEFORE the first stop request, the stops this update intends and where each mapped
gateway's request (its planned-stop marker) will be written. Intent is not a request: a live
process counts as asked only once the producer or consumer checkpoints it, or while the
valid request this update wrote is still on disk (:func:`_asked`).Ústop_requestedc              3  óJ   "  € T F  p\        \        V4      4      x € K  	  R # 5irÕ   )r   r9   )r½   Úps   & r   r¿   Ú&mark_stop_requested.<locals>.<genexpr>×  s#   é € ÐUpÑkoÐfgÔVYÔZ]Ð^_ÓZ`×VaÐVaÓkoùs   ‚!#Ú	stop_sentÚstopper_pidÚstop_markers©rJ  N)
r±   Úmapr   rC   r   r8   Úitemsr9   rÝ   r<   )r·   ÚpidsrS  rW  Úms   &&&  r   Úmark_stop_requestedra  Ò  sê   € ô
 %Ð%q¤s¬3°·	±	Ð:JÓ0K×0QÐ0QÈrÓ'RÐ%qÑUpÑkoÓUpÐ%qÓr€EÐ
ÑÜ¤¤C¨¯©°;Ó)?×)EÐ)EÀ2Ó FÓG€Eˆ+ÑÜŸ9š9›;€Eˆ-ÑØ~ §	¡	¨.Ó 9× ?Ð ?¸RÐ~Ðfm×fsÐfsÐqs×ezÑezÔe|ÔD}Ñe|Ñ]aÐ]^ÄSÌÈQËÃ[ÔRUÐVWÓRXÒEXÑe|ÒD}Ð~€Eˆ.ÑÜ	ˆ%”x“z×"ùó E~s   Ã)Dc               ó    € V ^8„  d   QhRRRR/# ©r	   r·   r2   r
   rÙ   r   )r   s   "r   r   r   Þ  s   € ÷ 	Sñ 	S˜$ð 	S¨ñ 	Sr   c           	     ó  € \        0 \        \        V P                  R4      ;'       g    . 4      m\        \	        V4      4      k4      V R&    \        V \        4       R7       R#   \         d   p\        RT RT 24        Rp?R# Rp?ii ; i)aI  Persist that *pid*'s stop request was issued (its planned-stop marker is on disk, or the
POSIX pause records it just before its socket request): from here a live *pid* is draining and
keeps its restart debt until it exits. Best effort: the marker itself is evidence until this
lands; its consumer checkpoints before unlinking it.rY  r\  u4     âš  Could not record the stop request for gateway rE  N)	r±   r]  r   rC   r9   rÝ   r<   r—   Úprint)r·   r0   rH  s   && r   Úmark_stop_sentrf  Þ  s|   € ô
  Ð X¤#¤c¨5¯9©9°[Ó+A×+GÐ+GÀRÓ"HÐ XÌ#ÌcÐRUËhË-Ð XÓY€Eˆ+ÑðSÜˆeœ8›:×&øÜô SÜÐDÀSÀEÈÈCÈ5ÐQ×RÒRûðSús   ÁA$ Á$BÁ/BÂBc               ó$   € V ^8„  d   QhRRRRRR/# ©r	   r    r   Úmarkerr2   r
   rÙ   r   )r   s   "r   r   r   ê  s!   € ÷ !ñ !˜Tð !¨4ð !°Dñ !r   c           
     ó8  € ^ RI Hp \        VR,          4      p\        \	        4       4       Fê  w  rEVR,          pVP                  R4      ;'       g    / P                  V4      p\        VP                  R4      4      \        VP                  R4      4      8w  g6   Y6P                  R4      ;'       g    . 9  g   V'       d   V! Wp4      '       g   K¦  \        0 \        \        VP                  R4      ;'       g    . 4      mVk4      VR&   \        WE4       Kì  	  R# )	zÙCheckpoint a validated gateway consume BEFORE its marker disappears.

Called under the pause mutex by the consumer. Preserve the holder's identity;
this is evidence of a stop, not a transfer of the updater's custody.
)Ú_same_hermes_homeÚ
target_pidr·   r[  rZ  rU  rY  N)	Úgateway.statusrk  r   Ú_filesr.   rC   r±   r]  rB  )r    ri  rk  r0   Úsrcr2  r·   Úrecorded_paths   &&      r   Úmark_stop_consumedrq  ê  sÚ   € õ 1Ü
ˆf�\Õ"Ó
#€CÜœK›MÖ*‰	ˆØ�W•ˆØŸ™ >Ó2×8Ð8°b×=Ñ=¸cÓBˆÜ�—	‘	˜-Ó(Ó)¬S°·±¸MÓ1JÓ-KÔKØŸy™yÐ)9Ó:×@Ð@¸bÔAß$Ñ,=¸m×,RÒ,RÙÜ#Ð$R¤c¬#¨u¯y©y¸Ó/E×/KÐ/KÈÓ&LÐ$RÈcÐ$RÓSˆˆkÑÜ�cÖ ó +r   c               ó    € V ^8„  d   QhRRRR/# )r	   Úmarker_pathr   r
   r   )r   s   "r   r   r   ý  s   € ÷ Añ A ð A¨ñ Ar   c                óF   € V P                  V P                  R ,           4      # )z	.accepted)r^   r8  )rs  s   &r   Ú_accepted_pathru  ý  s   € Ø× Ñ  ×!1Ñ!1°KÕ!?Ó@Ð@r   c               ó$   € V ^8„  d   QhRRRRRR/# rh  r   )r   s   "r   r   r     s&   € ÷ mñ m˜Tð m¨4ð m°Dñ mr   c           	     ó   €  \        \        V 4      \        V4      4       R#   \         d   pTp Rp?MRp?ii ; i \	        T RRR7      ;_uu_ 4       p\
        P                  ! / TCRR/CT4       TP                  4        TP                  4        \        P                  ! TP                  4       4       RRR4       R#   + '       g   i     R# ; i  \         d0   p\        RT  RT R	T 2\        P                  R
7        Rp?R# Rp?ii ; i)a3  The consumer's receipt when it cannot checkpoint into the record (busy mutex, refused
replace): this incarnation accepted the request and drains until it exits, however long past
the request's TTL. Written beside the marker, in the gateway's own home, never into the record.

A home that refuses the new file (an ACL, a read-only directory) still lets the kept request be
rewritten in place: stamped ``accepted`` it is the receipt. Torn mid-write it reads malformed,
which recovery holds as unknown, never as "not asked". The consumer accepts the stop either way.Nzr+r   r5  ÚacceptedTu1     âš  Could not record the accepted stop request rE  z; ©Úfile)rB  ru  r2   r—   rb   r9  r:  Útruncater;  r   r<  r=  re  ÚsysÚstderr)r    ri  rH  ÚrefusedrA  s   &&   r   Úmark_stop_acceptedr    sÕ   € ðÜ”n TÓ*¬D°«LÔ9ÙøÜô Ø�ûðúðmÜ�$˜ w×/Õ/°2Ü�IŠIÐ2˜Ð2 ¨TÑ2°BÔ7Ø�K‰KŒMØ�H‰HŒJÜ�HŠH�R—Y‘Y“[Ô!÷	 0×/×/Ò/ûô
 ô mÜÐAÀ$ÀÀrÈ'ÈÐRTÐUXÐTYÐZÔad×akÑak×lÓlûðmúsF   ‚" ¢9­4´9½C ÁA"B?Â5C Â?C	Ã
C ÃC ÃDÃ$DÄDc               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r2   r    r   r
   rÙ   r   )r   s   "r   r   r     s!   € ÷ .ñ .�Tð . ð .¸ñ .r   c                ó  € T;'       g    \        4       p\        4       ;_uu_ 4        \        V4      pVe;   VR,          P                  R4      V P                  R4      8X  d   \	        WV3.4       RRR4       R#   + '       g   i     R# ; i)zQRemove the record only while it still names this pause (decided under the mutex).Nr·   r¹   )r.   rm   rI  rC   Ú_retire)r·   r    rP  s   && r   Ú	dischargerƒ    sd   € à× Ð ”;“=€DÜ	��Ü˜“:ˆØÒ H¨WÕ$5×$9Ñ$9¸*Ó$EÈÏÉÐS]ÓI^Ô$^Ü�D (Ð+Ð,Ô-÷ 
��Šús   §A
A;Á;B	c               ó    € V ^8„  d   QhRRRR/# rc  r   )r   s   "r   r   r   !  s   € ÷ Zñ Z�ð Z˜ñ Zr   c                óŒ  € V P                  R4      '       d   V P                  R4      '       d   R#  V P                  R4      '       g   V P                  R4      '       d(   / V CRR/CpVP                  RR4       \        V4       R# \        V 4       R#   \         d%   p\        R\        4        RT 24        Rp?R# Rp?ii ; i)	uZ   Mirror the token after a resume attempt: done â†’ delete; anything still owed â†’ rewrite.r¹   ÚrecoveryNrÜ   Úresume_deferredTu1     âš  Could not update the paused-gateway record rE  )rC   ÚpoprÝ   rƒ  r—   re  r.   )r·   ÚowedrH  s   &  r   ÚsyncrŠ  !  s¥   € à�9‰9�Z× Ò  E§I¡I¨j×$9Ò$9ÙðZØ�9‰9�_×%Ò%¨¯©Ð3D×)EÒ)EØ3�eÐ3˜_¨dÑ3ˆDØ�H‰HÐ&¨Ô-Ü�$ŽKä�eÖøÜô ZÜÐAÄ+Ã-ÀÐPRÐSVÐRWÐX×YÒYûðZús)   ²B Á	B Á %B ÂB ÂCÂB>Â>Cc               ó   € V ^8„  d   QhRR/# )r	   r
   r@   r   )r   s   "r   r   r   0  s   € ÷ ^ñ ^ ñ ^r   c                 ó€   € ^ RI Hp  \        4       pV P                  V4      '       * ;'       d    V P	                  V4      # )z¯A live update other than the one this process belongs to. The update tree holding the
checkout lock (this process plus the partner whose marker it adopted) is not "elsewhere".r4   )r7   r5   r   Úholds_checkout_lockÚupdate_in_progress)r5   r   s     r   Ú_live_update_elsewherer�  0  s6   € õ 'Ü‹>€DØ×.Ñ.¨tÓ4Ô4×]Ð]¸×9WÑ9WÐX\Ó9]Ð]r   c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   ú
list[Path]r   )r   s   "r   r   r   8  s   € ÷ Iñ I�$ð I˜:ñ Ir   c                óŒ   € \        V P                  P                  \        P                  ! V P                  4       R 24      4      # )z.*.claim)r±   r`   ÚglobÚescaper8  r×   s   &r   Ú_claimsr•  8  s1   € Ü�$—+‘+×"Ñ"¤d§k¢k°$·)±)Ó&<Ð%=¸XÐ#FÓGÓHÐHr   c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   r   )r   s   "r   r   r   <  s   € ÷ (ñ (˜ð ( ñ (r   c                ó$   € V P                  R 4      # )z.retired)Úwith_suffixr×   s   &r   Ú_retired_pathr™  <  s   € Ø×Ñ˜JÓ'Ð'r   c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   úset[str]r   )r   s   "r   r   r   @  s   € ÷ !ñ !�4ð !˜Hñ !r   c                ó¶  € \        V 4      p VP                  RRR7      p \        P                  ! T4      P                  R4      p\        T\        4      '       g   \        Y4      # T Uu0 uF  p\        T4      kK  	  up#   \         d    \        4       u # \         d   p\        RT RT 24      ThRp?ii ; i  \        \        3 d    Rp LŒi ; iu upi )zÿThe completed obligation ids (call under the mutex). Only an absent list is empty: one that
exists but cannot be read raises :class:`RetiredUnknown`, so a completed obligation is never
claimed again and the list is never rewritten from a read that failed.rë   rŒ   rì   z,cannot read the retired paused-gateway list rE  NÚids)r™  rî   rï   r­   r—   rQ   r9  rF  rC   r˜   ÚAttributeErrorrG  r  Ú_quarantine_retiredr   )r    r…   rŽ   rH  r�  Úis   &     r   Ú_retiredr¡  @  sÚ   € ô ˜4Ó €FðfØ×Ñ¨¸YÐÓGˆð
Ü�jŠj˜Ó×"Ñ" 5Ó)ˆô �cœ4× Ò Ü" 4Ó0Ð0ÙÓ ™C�qŒC�ŽF™CÑ Ð øô ô Ü‹uŠÜô fÜÐKÈFÈ8ÐSUÐVYÐUZÐ[Ó\ÐbeÐeûðfûô œÐ'ô ØŠðüò !s:   �B ¡%B= Á+CÂB:ÂB:Â"B:Â#B5Â5B:Â=CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r	   r    r   r…   r
   r›  r   )r   s   "r   r   r   T  s!   € ÷ ñ ˜dð ¨Dð °Xñ r   c                óX  € V P                  4       '       g   \        V 4      '       d   \        RV R24      hVP                  R4      p \        P
                  ! W4       \        RT 2\        P                  R7       \        4       #   \         d   p\        RT RT 24      ThRp?ii ; i)	a  A retired list that reads but does not parse. While a record or claim of this checkout
exists the list may be the only proof it is complete: unknown, fail closed. With none left it
guards nothing, and keeping it would abort every Windows update: set it aside and go on.z the retired paused-gateway list z is malformedz.corruptz;cannot set aside the malformed retired paused-gateway list rE  NuQ     âš  Set aside a malformed paused-gateway history (no paused set refers to it): ry  )rÐ   r•  rQ   r˜  r   rŒ   r—   re  r|  r}  r­   )r    r…   ÚcorruptrH  s   &&  r   rŸ  rŸ  T  s§   € ð ‡{�{‡}‚}œ ŸšÜÐ?À¸xÀ}ÐUÓVÐVØ× Ñ  Ó,€GðuÜ
�
Š
�6Ô#ô 
Ð]Ð^eÐ]fÐ
gÜ�z‰zõä‹5€Løô	 ô uÜÐZÐ[aÐZbÐbdÐehÐdiÐjÓkÐqtÐtûðuús   Á	B ÂB)ÂB$Â$B)c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r    r   Úcarriersúlist[tuple[Path, dict]]r
   rÙ   r   )r   s   "r   r   r   d  s"   € ÷ ñ �$ð Ð"9ð ¸dñ r   c           
     óú  € V UUUu0 uF[  w  r#VR,          P                  R4      .VR,          P                  R4      ;'       g    . O F  qD'       g   K  \        V4      kK  	  K]  	  pppp\        V 4      pWV8:  g)   \        \	        V 4      R^R\        We,          4      /4       V F5  w  rx\        \        4      ;_uu_ 4        VP                  4        RRR4       K7  	  R# u upppi   + '       g   i     KS  ; i)a  Complete the obligations *carriers* hold (call under the mutex): their ids (and every id
they absorbed) go on the durable retired list FIRST; a failed read or write raises and deletes
nothing. Then the files go; one that cannot be deleted is a redundant copy from here on.r·   r¹   ÚabsorbedrM  r�  N)	rC   r   r¡  rB  r™  r±   r   r—   r?  )	r    r¦  Ú_srcr2  r   r�  Úretiredro  Ú_bodys	   &&       r   r‚  r‚  d  sÏ   € ñ %-õ b¡H‘j�dØ˜'•]×&Ñ& zÓ2Ð[°d¸7µm×6GÑ6GÈ
Ó6S×6YÐ6YÐWYÓ[ˆqÓ_`ô Œ3ˆqŽ6Ù[ñ ¡H€Cò bä�t‹n€GØŒ>Ü”m DÓ)¨H°a¸ÄÀwÅ}Ó@UÐ+VÔWÛ‰
ˆÜ”g×ÕØ�J‰JŒL÷ Ñó ùôb÷ ×Ðús   ‡=C"ÁC"ÁC"ÃC)Ã)C:c               ó$   € V ^8„  d   QhRRRRRR/# )r	   ro  r   r2  r2   r
   r   )r   s   "r   r   r   r  s!   € ÷ =ñ =�ð =˜Tð = dñ =r   c                ó¤   € V P                   R8X  d   VP                  R4      MVP                  R4      p\        V\        4      '       d   V# \        # )zWWho holds *src*: a record's owner, a claim's claimer (published with the claim itself).r+   rJ  Úclaimer)ÚsuffixrC   rG  r2   ÚUNOWNED)ro  r2  Úheld_bys   && r   Ú_holderr³  r  s=   € à#&§:¡:°Ô#8ˆd�h‰h�wÔ¸d¿h¹hÀyÓ>Q€GÜ  ¬$×/Ò/ˆ7Ð<´WÐ<r   c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   r§  r   )r   s   "r   r   r   x  s   € ÷ ñ �ð Ð1ñ r   c                óÌ   € . pV .\        V 4      O FO  p\        V4      pVf   K  VP                  R4      \        \	        4       4      8X  g   K=  VP                  W#34       KQ  	  V# )zYThis checkout's record and claims; one that cannot be read raises :class:`RecordUnknown`.r   )r•  rI  rC   r   r   rÇ   )r    r‚   ro  r2  s   &   r   rn  rn  x  sX   € à€EØÐ%”w˜t“}Ó%ˆÜ�C‹yˆØÔ §¡¨Ó 8¼CÄÃÓ<OÖ OØ�L‰L˜#˜Ö%ñ &ð €Lr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r‚   r§  Úheldz	set[Path]r«  r›  r
   r   )r   s   "r   r   r   ‚  s*   € ÷ ñ Ð-ð °Yð Èð Ðdmñ r   c           
     ó  aa
a€ / pV  FI  w  rEVR,          P                  R4      ;'       g    .  F  pVP                  \        V4      V4       K   	  KK  	  \        4       p/ pV  F‡  w  rE\        VR,          P                  R4      ;'       g    R4      pV'       g   K:  Wb9   g   Wc9   d!   W6,          V8w  d   VP	                  V4       Kf  VP                  V. 4      P                  V4       K‰  	  V  UUu/ uF*  w  rET\        VP                  R4      ;'       g    ^ 4      bK,  	  uppoVP                  4        FC  p	\        V3R lV	 4       \        V	V3R lR7      4      o
VP                  V
3R	 lV	 4       4       KE  	  VS,
          # u uppi )
a  Files that only copy an obligation another file carries or that was completed: a source an
update absorbed but died before retiring, one of two same-id files a claim transfer left (the
furthest-progressed copy is kept), a retired id's leftover. Never a held file.r·   r©  r¹   r  Úrevc              3  ó8   <"  € T F  qS9   g   K  Vx € K  	  R # 5irÕ   r   )r½   Úsr·  s   & €r   r¿   Ú_redundant.<locals>.<genexpr>–  s   øé € Ð4¡˜1¨t©)—Q’Q£ùó   ƒ�
c                ó   <€ SV ,          # rÕ   r   )r»  r¹  s   &€r   Ú<lambda>Ú_redundant.<locals>.<lambda>–  s   ø€ ÐPSÐTUÖPVr   )Úkeyc              3  ó8   <"  € T F  qS8w  g   K  Vx € K  	  R # 5irÕ   r   )r½   r»  Úkeeps   & €r   r¿   r¼  —  s   øé € Ð8¡F˜q°4©iŸš£Fùr½  )rC   rÁ   r   r­   r°   rÇ   r9   ÚvaluesÚnextÚmaxrä   )r‚   r·  r«  r¦  ro  r2  ÚoidÚ	redundantÚby_idÚcopiesrÃ  r¹  s   &f&       @@r   Ú
_redundantrË  ‚  sL  ú€ ð !#€HÛ‰	ˆØ˜•=×$Ñ$ ZÓ0×6Ð6°BÒ6ˆCØ×Ñ¤ C£¨#Ö.ó 7ñ ô ›5€IØ#%€EÛ‰	ˆÜ�$�w•-×#Ñ# JÓ/×5Ð5°2Ó6ˆßÙØŒ>˜cœo°(µ-À3Ô2FØ�M‰M˜#Öà×Ñ˜S "Ó%×,Ñ,¨SÖ1ñ ñ <AÔ
A¹5©i¨cˆ3”�D—H‘H˜U“O×(Ð( qÓ)Ò)¹5Ò
A€CØ—,‘,–.ˆÜÔ4¡Ó4´c¸&ÔFVÔ6WÓXˆØ×ÑÔ8¡FÓ8Ö8ñ !ð �tÕÐùó	 Bs   Ã3$FÄFc               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   z4tuple[list[tuple[Path, dict]], set[Path], set[Path]]r   )r   s   "r   r   r   ›  s   € ÷ @ñ @�$ð @ÐOñ @r   c           
     ó´   € \        V 4      pV UUu0 uF#  w  r#\        \        W#4      4      '       g   K!  VkK%  	  pppW\        W\	        V 4      4      3# u uppi rÕ   )rn  rD   r³  rË  r¡  )r    r‚   ro  r2  r·  s   &    r   Ú_surveyrÎ  ›  sL   € Ü�4‹L€EÙ!&ÔO¡‘I�CÔ*:¼7À3Ó;M×*N�CˆC¡€DÑOØœ
 5´¸³Ó?Ð?Ð?ùó Ps
   ‘A´Ac               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   r§  r   )r   s   "r   r   r   ¡  s   € ÷ ñ �+ð Ð)@ñ r   c                óˆ  € T ;'       g    \        4       p V P                  4       '       g   \        V 4      '       g   . # \        4       ;_uu_ 4        \	        V 4      w  rpRRR4       X UUu. uF  w  rEVX9  g   K  VX9  g   K  WE3NK  	  pppV'       d   \        4       '       d   . # V#   + '       g   i     LT; iu uppi )u  ``(file, body)`` for every obligation of this checkout whose holder is dead â€” one file per
obligation id; empty while another update is live (it adopts them itself). Surveyed under the
mutex (a mutator replaces the retired list meanwhile); raises when the list cannot be read.N)r.   rÐ   r•  rm   rÎ  r�  )r    r‚   r·  rÈ  ro  r2  s   &     r   ÚorphansrÑ  ¡  s�   € ð × Ð ”;“=€DØ�;‰;�=Š=¤¨§¢Øˆ	Ü	��Ü!(¨£Ñˆ�Y÷ 
á*/Ô\©%™Y˜S°3¸d±?Œ[ÀsÐR[ÑG[Œ[ˆc‹[©%€EÑ\ßÔ*×,Ò,Øˆ	Ø€L÷ 
�üã\s   ÁB+Á,B>Á<B>ÂB>Â+B;	c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   rÙ   r   )r   s   "r   r   r   °  s   € ÷ 
ñ 
˜;ð 
°$ñ 
r   c                óN  € T ;'       g    \        4       p V P                  4       '       g3   \        V 4      '       g"   \        V 4      P                  4       '       g   R# \	        \
        4      ;_uu_ 4        \        4       ;_uu_ 4        \        V 4      w  rpV F3  p\	        \        4      ;_uu_ 4        VP                  4        RRR4       K5  	  \        V 4       RRR4       RRR4       R#   + '       g   i     Ke  ; i  + '       g   i     L.; i  + '       g   i     R# ; i)zZDelete copies of obligations another file already carries (crash leftovers of a transfer).N)r.   rÐ   r•  r™  r   rO   rm   rÎ  r—   r?  Ú_prune_retired)r    Ú_foundÚ_heldrÈ  ro  s   &    r   Úretire_redundantr×  °  s²   € à× Ð ”;“=€DØ�;‰;�=Š=¤¨§¢´}ÀTÓ7J×7QÑ7Q×7SÒ7SÙÜ	”*×	Õ	œvŸx�xÜ#*¨4£=Ñ ˆ�yÛˆCÜœ'×"Õ"Ø—
‘
”÷ #Ñ"ñ ô 	�tÔ÷  (×	Ñ	÷ #×"Ð"ú÷  (Ÿxú×	×	Ð	ús<   Á4DÂ+D 	Â2C,ÃD 	ÃDÃ,C=Ã7	D 	Ä DÄDÄD$	c               ó    € V ^8„  d   QhRRRR/# )r	   r    r   r
   rÙ   r   )r   s   "r   r   r   ½  s   € ÷ )ñ )˜ð ) $ñ )r   c                ó  € \        V 4      p\        \        V .\        V 4      O54       Uu. uF
  q"f   K  VNK  	  ppV'       g   R# V Uu0 uF$  p\	        VR,          P                  R4      4      kK&  	  ppW,          p\        \        4      ;_uu_ 4        V'       d$   \        \        V 4      R^R\        V4      /4       M\        V 4      P                  4        RRR4       R# u upi u upi   + '       g   i     R# ; i)zYForget retired ids no file carries any more (a carrier that cannot be read raises first).Nr·   r¹   rM  r�  )r¡  r]  rI  r•  r   rC   r   r—   rB  r™  r±   r?  )r    r«  r2  Úbodiesr¾   ÚcarriedrÃ  s   &      r   rÔ  rÔ  ½  sÃ   € ä�t‹n€GÜ"¤4¨$Ð)?´¸³Ñ)?Ô@ÓUÑ@�t�dˆdÑ@€FÐUßÙÙ8>Ó?¹°1Œs�1�W•:—>‘> *Ó-Ö.¹€GÐ?ØÕ€DÜ	”'×	Õ	ßÜœ-¨Ó-°¸!¸UÄFÈ4ÃLÐ/QÕRä˜$Ó×&Ñ&Ô(÷	 
Ñ	ùò Vùò @ç	×	Ð	ús   «C%µC%Á*C*ÂAC/Ã/D 	c               ó    € V ^8„  d   QhRRRR/# )r	   ro  r   r
   ztuple[Path, dict] | Noner   )r   s   "r   r   r   Ì  s   € ÷ ñ ˆtð Ð0ñ r   c           	     óx  € \        4       pVP                  VP                   R\        P                  ! 4        R\
        P                  ! 4       P                  R,           R24      p \        4       ;_uu_ 4        \        V 4      pVe(   VP                  R4      \        \        4       4      8w  d    RRR4       R# \        V4      w  rEpW9   g!   W9   g   Y UUu0 uF  w  rxVkK	  	  upp9  d    RRR4       R# \        4       VR&   \        VP                  R4      ;'       g    ^ 4      ^,           VR&   \!        W#4       \#        \$        4      ;_uu_ 4        V P'                  4        RRR4       RRR4       W#3# u uppi   + '       g   i     L!; i  + '       g   i     TX3# ; i  \$         d     R# i ; i)a  Take *src* (an orphaned record or a dead claimer's claim) for this process; ``None`` when a
concurrent launch won it or holds the mutex. The claim is published with our identity inside,
then the source is retired; a crash between leaves a same-id copy :func:`_redundant` drops.r*   :Né   Nz.claimNr   r¯  r¹  )r.   r^   r8  r   r8   rÂ   rÃ   rÄ   rm   rI  rC   r   r   rÎ  r<   r9   rB  r   r—   r?  )	ro  r    Úminer2  rÕ  r·  rÈ  r»  Ú_s	   &        r   Úclaimrá  Ì  sU  € ô ‹=€DØ�>‰>˜TŸY™Y˜K q¬¯ª«¨°Q´t·z²z³|×7GÑ7GÈÕ7KÐ6LÈFÐSÓT€DðÜ�X�XÜ˜“9ˆDØŠ|˜tŸx™x¨Ó7¼3¼|»~Ó;NÔNØ÷ ‰Xô '.¨d£mÑ#ˆF˜)ØŒ{˜cÔ.°#ÈFÔ=SÉFÁDÀA»aÉFÒ=SÔ2SØ÷ ‰Xô '›jˆD�‰OÜ˜dŸh™h u›o×2Ð2°Ó3°aÕ7ˆD�‰KÜ˜$Ô%Üœ'×"Õ"Ø—
‘
”÷ #÷ ð ˆ:Ðùó >T÷
 #×"ú÷ ŽXð �ˆ:Ðûô ô Úðúsx   Á'F* Á98FÂ1F* Â;FÃE;Ã'	FÃ0F* Ã:)FÄ$3FÅF	Å(FÅ0F* Å;FÆFÆFÆF'	ÆF* Æ'F* Æ*F9Æ8F9c               ó   € V ^8„  d   QhRR/# )r	   r
   ztuple[dict | None, list[Path]]r   )r   s   "r   r   r   ä  s   € ÷ ñ Ð5ñ r   c                 óˆ  € \        4        R. r\        4        F‘  w  r#\        V4      pVf   K  VP                  V^ ,          4       \	        4       ;_uu_ 4        \        V^ ,          4      ;'       g
    V^,          p\        V \        \        VR,          4      4      4      p RRR4       K“  	  W3#   + '       g   i     K©  ; i)z¶For ``hermes update``: claim every orphaned pause and merge their sets. The caller records the
merged set durably (its ``absorbed`` ids name the claims), then :func:`release_claims`.Nr·   )	r×  rÑ  rá  rÇ   rm   rI  rN  rO  r2   )ÚadoptedÚclaimsro  r¬  Úwonr2  s         r   Úadopt_orphansrç  ä  s–   € ô ÔØ˜BˆVÜ–i‰
ˆÜ�C‹jˆØŠ;ÙØ�‰�c˜!•fÔÜ�X�XÜ˜˜A�“<×)Ð) 3 q¥6ˆDÜ  Ô*<¼TÀ$ÀwÅ-Ó=PÓ*QÓRˆG÷ ‰Xñ  ð ˆ?Ð÷ �XˆXús   ÁA	B0Â0Cc               ó    € V ^8„  d   QhRRRR/# )r	   rå  r‘  r
   rÙ   r   )r   s   "r   r   r   ô  s   € ÷ ñ ˜:ð ¨$ñ r   c                ód  € \        \        4      ;_uu_ 4        \        4       ;_uu_ 4        V  F3  p\        \        4      ;_uu_ 4        VP	                  4        R R R 4       K5  	  R R R 4       R R R 4       R #   + '       g   i     KZ  ; i  + '       g   i     L.; i  + '       g   i     R # ; irÕ   )r   rO   rm   r—   r?  )rå  r    s   & r   Úrelease_claimsrê  ô  s`   € Ü	”*×	Õ	œvŸx�xÛˆDÜœ'×"Õ"Ø—‘”÷ #Ñ"ñ ÷  (×	Ñ	ç"×"Ð"ú÷  (Ÿxú×	×	Ð	ús:   ˜B«B	ÁA7ÁB	Á%BÁ7BÂ	B	ÂBÂBÂB/	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r·   r2   rä  r?   rå  r‘  r
   r   )r   s   "r   r   r   û  s(   € ÷ 	ñ 	˜ð 	 {ð 	¸Jð 	È4ñ 	r   c                óž   € Ve   \        W4       \        V 4       V P                  R. 4       \        V \	        4       R7       \        V4       V # )z¶Merge the adopted set, stamp the tree and persist under this process BEFORE the first stop.
Publish then retire: a crash between leaves claims whose ids the record lists as absorbed.rU  r\  )rN  rÉ   rÁ   rÝ   r<   rê  )r·   rä  rå  s   &&&r   Úrecord_pauserí  û  sD   € ð ÒÜ�5Ô"ÜˆuÔØ	×ÑÐ% rÔ*Ü	ˆ%”x“zÕ"Ü�6ÔØ€Lr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r·   r2   Úintendedrä  r?   r
   r   )r   s   "r   r   r     s(   € ÷ ñ ˜ð ¨ð °{ð Àtñ r   c                ó¬   € Ve   \        W4       T P                  \         Uu/ uF  q3V9   g   K  W1V,          bK  	  up4       \        V 4       V # u upi )zMCarry the recorded pause identity onto the final token and mirror it to disk.)rN  rä   Ú_CARRIEDrŠ  )r·   rï  rä  rÁ  s   &&& r   Úfinish_pauserò    sK   € àÒÜ�5Ô"Ø	‡L�LµÓL±¨À8¹OÔ$�# •}Ò$±ÑLÔMÜˆ„KØ€Lùò Ms
   £A°Ac               ó$   € V ^8„  d   QhRRRRRR/# )r	   rï  r2   rä  r?   r
   rÙ   r   )r   s   "r   r   r     s!   € ÷ 1ñ 1˜Dð 1¨;ð 1¸4ñ 1r   c                óœ   € Vf   \        V 4       R# R Uu/ uF  q"V 9   g   K  W V,          bK  	  pp\        / VCVC\        R7       R# u upi )zŽThis run's own stops were rolled back in-line: only an adopted orphan set is still owed,
and it goes back on disk unowned for the next launch.Nr\  )r¹   rº   r©  )rƒ  rÝ   r±  )rï  rä  rÁ  rÛ  s   &&  r   Úabandon_pauserõ    sU   € ð ‚Ü�(ÔÙÙ-RÓfÑ-R cÐ]eÑVeÔ!ˆs˜S•MÒ!Ñ-R€GÐfÜ	Ð
 ˆWÐ
 ˜Ð
 ¬×0ùò gs
   –A	£A	c               ó    € V ^8„  d   QhRRRR/# ©r	   r·   r2   r
   r›  r   )r   s   "r   r   r     s   € ÷ 9ñ 9�dð 9˜xñ 9r   c           
     óÈ   € V P                  R 4      ;'       g    / P                  4        UUu0 uF'  w  r\        RVRV/4      '       g   K  \        V4      kK)  	  upp# u uppi )Ú
identitiesr0   r6   )rC   r^  rD   r   )r·   r0   r6   s   &  r   Ú
_live_pidsrú    sZ   € Ø%*§Y¡Y¨|Ó%<×%BÐ%BÀ×$IÑ$IÔ$Kô 9Ñ$K™˜Ü ¨¨T°2Ð 6×7ô ŒC�ŽHÑ$Kò 9ð 9ùó 9s   ­AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r2   r_  r›  r
   r   )r   s   "r   r   r   #  s!   € ÷ ñ �Dð  ð ¨Tñ r   c                ó  € V P                  R 4      ;'       g    / P                  4        UUu/ uF  w  r#\        V4      V9  g   K  W#bK  	  uppV R &   V P                  R4      ;'       g    .  Uu. uF&  p\        VP                  R4      4      V9  g   K$  VNK(  	  upV R&   RV 9   dH   V R,          ;'       g    .  Uu. uF&  p\        VP                  R4      4      V9  g   K$  VNK(  	  upV R&   V # u uppi u upi u upi )ÚprofilesÚunmappedr0   Úposix_units)rC   r^  r   )r·   r_  rW  r0   Úus   &&   r   Ú_withoutr  #  sî   € Ø/4¯y©y¸Ó/D×/JÐ/JÈ×.QÑ.QÔ.SÔlÑ.S¡F AÔWZÐ[^ÓW_ÐgkÑWkœ˜šÑ.SÒl€Eˆ*ÑØ%*§Y¡Y¨zÓ%:×%@Ð%@¸bÐ%@ÓcÑ%@˜qÄSÈÏÉÈuËÓEVÐ^bÑEbŸ˜Ñ%@Ñc€Eˆ*ÑØ˜ÔØ+0°Õ+?×+EÐ+EÀ2Ð+EÓgÑ+E aÌÈQÏUÉUÐSXË\ÓIZÐbfÑIf§ Ñ+EÑgˆˆmÑØ€Lùó	 mùÚcùâgs#   ­C2ÁC2Á0!C8ÂC8Â>!C=Ã$C=c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r2   r0   r   r
   úbool | Noner   )r   s   "r   r   r   +  s&   € ÷ Mñ M˜Dð M sð M¨{ñ Mr   c           
     ó  € V P                  R4      ;'       g    / P                  \        V4      4      pV'       g   R# ^ RIHp \	        W\        V4      V4      \	        W\        \        V4      4      R4      3pRV9   d   R# RV9   d   R# R# )uÔ  The planned-stop marker this update's stopper wrote for *pid* is still on disk (the gateway's
watcher has not consumed it yet): the request was issued even if the updater died before
:func:`mark_stop_sent` â€” or the gateway's receipt of accepting it (:func:`mark_stop_accepted`).
A marker naming another stopper (a user's ``hermes gateway stop``) is not. ``None``: one of them
exists but cannot be read or parsed â€” the stop may have been accepted, so it is unknown.r[  F)Ú_PLANNED_STOP_MARKER_TTL_SNT)rC   r   rm  r  Ú_names_requestr   ru  )r·   r0   r    r  Úverdictss   &&   r   Ú_request_on_diskr  +  s€   € ð �I‰I�nÓ%×+Ð+¨×0Ñ0´°S³Ó:€DßÙÝ9ô ˜u¬4°«:Ð7QÓRÜ˜u¬>¼$¸t»*Ó+EÀtÓLðN€Hà˜8Ô#ˆ4ÐL°¸Ô1A¨ÐLÀuÐLr   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r	   r·   r2   r0   r   r    r   Úttl_sr1   r
   r  r   )r   s   "r   r   r   <  s/   € ÷ <ñ <˜$ð < Sð <°ð <¸Zð <ÈKñ <r   c                óf  € ^ RI HpHp  \        P                  ! VP                  RR7      4      p\        VR,          4      \        VR,          4      r‡T\        T4      8w  gm   T\        T P                  R4      ;'       g    ^ 4      8w  gD   TeB   TP                  R4      '       g+   T! TP                  R	4      ;'       g    R
T4      '       d   R# TP                  R4      T! \        T4      4      r©RYš39   ;'       g    Yš8H  #   \         d     R# \        \        \        \        3 d     R# i ; i)z×Does *path* hold this stopper's request for *pid*'s incarnation? Only an absent file or a
valid one naming something else is ``False``; refused (a sharing violation, an AV scanner) or
malformed is ``None``, unknown.)Ú_marker_is_staleÚget_process_start_timerë   r5  rl  rZ  FNrx  Ú
written_atr  Útarget_start_time)rm  r  r  r9  rF  rî   r9   rï   r—   r˜   Ú	TypeErrorÚKeyErrorrC   )r·   r0   r    r
  r  r  ri  r…   ÚstopperÚexpectedÚactuals   &&&&       r   r  r  <  sþ   € ÷ HðÜ—’˜DŸN™N°K˜NÓ@ÓAˆÜ˜f \Õ2Ó3´S¸ÀÕ9NÓ5O�ð
 	”#�c“(Ô˜g¬¨U¯Y©Y°}Ó-E×-JÐ-JÈÓ)KÔKØÒ!¨&¯*©*°Z×*@Ò*@Ù$ V§Z¡Z°Ó%=×%CÐ%CÀÀU×KÒKÙØ—z‘zÐ"5Ó6Ñ8NÌsÐSVËxÓ8Xˆfà�HÐ%Ñ%×;Ð;¨Ñ);Ð;øô ô ÚÜ”Z¤¬HÐ5ô Úðús   ŠA	D ÄD0ÄD0Ä+D0Ä/D0c               ó    € V ^8„  d   QhRRRR/# )r	   r·   r2   r
   ztuple[set[str], set[str]]r   )r   s   "r   r   r   Q  s   € ÷ gñ g�$ð gÐ4ñ gr   c           
     ó  € V P                  R4      ;'       g    .  Uu0 uF  p\        V4      kK  	  ppV P                  R4      ;'       g    .  Uu/ uF4  p\        V4      V9  g   K  \        V4      \        V \        V4      4      bK6  	  ppY#P                  4        UUu0 uF  w  rV'       g   K  VkK  	  upp,          VP                  4        UUu0 uF  w  rVe   K  VkK  	  upp3# u upi u upi u uppi u uppi )z¯``(asked, unknown)``: pids this update actually asked to stop (recorded as sent, or whose
request is still on disk), and pids whose request evidence exists but cannot be read.rY  rU  )rC   r   r  r^  )r·   rW  Úsentr  Úvs   &    r   Ú_askedr  Q  sÞ   € ð "ŸI™I kÓ2×8Ð8°bÐ8Ó9Ñ8�qŒC�ŽFÑ8€DÐ9ØAFÇÁÐK[ÓA\×AbÐAbÐ`bÐAbÓyÑAb¸AÔfiÐjkÓflÐtxÑfxÔ7”�A“Ô(¨´°A³Ó7Ò7ÑAb€HÐyØ§¡Ô!1Ô7Ñ!1™˜´Q—1�1Ñ!1Ò7Õ7ÈÏÉÔHXÔ9fÑHXÁÀÐ\]¿!¸!ÑHXÒ9fÐfÐfùò :ùÚyùÛ7ùÓ9fs)   žC+ÁC0Á(#C0Â C5Â1C5ÃC;Ã C;c               ó    € V ^8„  d   QhRRRR/# ©r	   r·   r2   r
   r   )r   s   "r   r   r   Y  s   € ÷ @ñ @˜dð @ tñ @r   c                ó¨   € V P                  R4      f   V # \        V 4      w  r\        V4      V R&   \        V \	        V 4      V,
          V,
          4      # )u«  Drop entries whose recorded process is the same live incarnation AND was never actually asked
to stop (the update died before issuing its request, even with the intent on disk): it is still
serving, and a later exit â€” a user's ``hermes gateway stop`` included â€” is not this update's to
undo. One it asked may be draining: it keeps its restart debt (:func:`split_draining`). The
evidence is resolved here, once, into ``stop_sent`` (a merge carries it under another stopper).
Evidence that cannot be read keeps the entry too (it may be draining) but resolves nothing: it is
judged again next time. No stop record at all (a set from before stop tracking): nothing can be
told apart.rU  rY  )rC   r  r±   r  rú  )r·   ÚaskedÚunknowns   &  r   rO  rO  Y  sN   € ð ‡y�yÐ!Ó"Ò*ØˆÜ˜E“]�N€EÜ ›€Eˆ+ÑÜ�Eœ: eÓ,¨uÕ4°wÕ>Ó?Ð?r   c               ó    € V ^8„  d   QhRRRR/# r  r   )r   s   "r   r   r   i  s   € ÷ ñ ˜$ð  4ñ r   c                ó$  € \        V 4      pRV P                  R4      ;'       g    / P                  4        UUu/ uF  w  r#\        V4      V9   g   K  W#bK  	  uppRV P                  R4      ;'       g    .  Uu. uF&  p\        VP                  R4      4      V9   g   K$  VNK(  	  upRV P                  R4      ;'       g    .  Uu. uF&  p\        VP                  R4      4      V9   g   K$  VNK(  	  up/p\	        W4       V# u uppi u upi u upi )z¼Remove and return ``{"profiles", "unmapped", "posix_units"}`` whose recorded process is still
running: it was asked to stop and has not exited yet, so it can only be restarted once it has.rý  rþ  r0   rÿ  )rú  rC   r^  r   r  )r·   ÚliverW  r0   r   Údrainings   &     r   Úsplit_drainingr#  i  sþ   € ô �eÓ€DØ°5·9±9¸ZÓ3H×3NÐ3NÈB×2UÑ2UÔ2WÔlÑ2W©¨Ô[^Ð_bÓ[cÐgkÑ[kœV˜QšVÑ2WÒlØ¨¯©°:Ó)>×)DÐ)DÀ"Ð)DÓcÑ)D 1ÌÈQÏUÉUÐSXË\ÓIZÐ^bÑIbŸQ˜QÑ)DÑcØ¨E¯I©I°mÓ,D×,JÐ,JÈÐ,JÓiÑ,J aÌsÐST×SXÑSXÐY^ÓS_ÓO`ÐdhÑOh§ Ñ,JÑiðk€Hô ˆUÔØ€Oùó	 mùÚcùÚis#   ¹DÁDÁ9!D
ÂD
Ã!DÃ+Dc               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r?   rä  r2   r
   r   )r   s   "r   r   r   t  s!   € ÷ +ñ +�kð +¨Dð +°Tñ +r   c           	     ó¶  a aaaaa€ S e   S M	RRR/ R. R. /o RS R&   S P                  R. 4      oSP                  V3R lVP                  R4      ;'       g    .  4       4       S P                  R. 4      oSP                  V3R	 lVP                  R
4      .VP                  R4      ;'       g    . O 4       4       S P                  R/ 4      pVP                  R4      ;'       g    / P                  4        F  w  r4VP                  W44       K  	  S P                  R. 4      oSP                  V3R lVP                  R4      ;'       g    .  4       4       S P                  R/ 4      pVP                  R4      ;'       g    / P                  4        F  w  rFVP                  WF4       K  	  RV9   g   RS 9   dã   VP                  R4      VP                  R4      r‡Vf&   \	        VP                  R4      ;'       g    / 4      ;rx\        0 \        \        S P                  R4      ;'       g    . 4      m\        \        V4      m4      S R&   \        0 \        \        S P                  R4      ;'       g    . 4      m\        \        T;'       g    . 4      m4      S R&   S P                  R/ 4      p	VP                  R4      ;'       g    / P                  4        F  w  r:V	P                  W:4       K  	  VP                  R4      '       d&   RS R&   RV9   d   S P                  RVR,          4       VP                  R4      '       dS   VR,          S R&   S P                  R. 4      oSP                  V3R lVP                  R4      ;'       g    .  4       4       S P                  R. 4      oSP                  V3R lVP                  R4      ;'       g    .  4       4       S'       dx   S P                  R. 4      P                  V 3R lS 4       4       S P                  R. 4       S P                  R/ 4      P                  VP                  R4      ;'       g    / 4       S # )z¸Fold an orphaned pause into this update's token so its resume brings both sets back; its
obligation id (and every id it absorbed) is recorded so a leftover copy is never resumed twice.rÜ   Trý  Úunmapped_pidsrþ  rº   c              3  ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5irÕ   r   )r½   r¾   rº   s   & €r   r¿   Úmerge_into.<locals>.<genexpr>}  s   øé € ÐUÑ >˜1È9ÑBT—Q’QÓ >ùr½  r©  c              3  óL   <"  € T F  q'       g   K  VS9  g   K  Vx € K  	  R # 5irÕ   r   )r½   r   r©  s   & €r   r¿   r(    s#   øé € ÐvÑZ˜!Ó^_”AÐdeÐmuÑdu—A’AÓZùs   ƒ	$‘$š
$r¹   c              3  ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5irÕ   r   )r½   r   rþ  s   & €r   r¿   r(  „  ó   øé € ÐRÑ<˜!ÈÑ@Q—A’AÓ<ùr½  rù  rU  rY  Úcold_start_profilesÚcold_start_if_installedÚattested_generationÚplatformrÿ  c              3  ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5irÕ   r   )r½   r   Úunitss   & €r   r¿   r(  ˜  s   øé € ÐSÑ @˜1ÈUÁN—Q’QÓ @ùr½  Úservicesc              3  ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5irÕ   r   )r½   r»  r2  s   & €r   r¿   r(  š  r+  r½  Úexpected_servicesc              3  óF   <"  € T F  qSR ,          9  g   K  Vx € K  	  R# 5i)r4  Nr   )r½   r»  r·   s   & €r   r¿   r(  œ  s   øé € Ð8tÁH¸qÐY^Ð_rÕYsÑPs¿ºÃHùs   ƒ!—
!Úrestarted_servicesÚservice_profiles)	rÁ   ÚextendrC   r^  r  r±   r]  r   rä   )r·   rä  rý  r8  r0   rù  r6   Ú	requestedr  ÚcoldÚ
generationr©  rº   r2  r1  rþ  s   f&         @@@@@r   rN  rN  t  sÃ  ý€ ð Ò&‰E¨_¸dÀJÐPRÐTcÐegÐisÐuwÐ,x€EØ!€Eˆ/Ñð × Ñ  ¨bÓ1€IØ×ÑÔU §¡¨KÓ 8× >Ð >¸BÐ >ÓUÔUØ×Ñ 
¨BÓ/€HØ‡O�OÔv §¡¨JÓ 7ÐZ¸7¿;¹;ÀzÓ;R×;XÐ;XÐVXÑZÓvÔvØ×Ñ 
¨BÓ/€HØ—k‘k *Ó-×3Ð3°×:Ñ:Ö<‰	ˆØ×Ñ˜DÖ&ñ =à×Ñ 
¨BÓ/€HØ‡O�OÔR˜wŸ{™{¨:Ó6×<Ð<¸"Ð<ÓRÔRØ×!Ñ! ,°Ó3€JØ—K‘K Ó-×3Ð3°×:Ñ:Ö<‰ˆØ×Ñ˜cÖ&ñ =à˜7Ô"Ð&6¸%Ô&?Ø!Ÿ+™+Ð&6Ó7¸¿¹À[Ó9Q�4ØÒÜ# G§K¡K°Ó$=×$CÐ$CÀÓDÐDˆIÜ"(Ð)m¬3¬s°E·I±IÐ>NÓ4O×4UÐ4UÐSUÓ+VÐ)mÔY\Ô]`ÐbkÓYlÐ)mÓ"nˆÐÑÜ#Ð$d¤c¬#¨u¯y©y¸Ó/E×/KÐ/KÈÓ&LÐ$dÌsÔSVÐX\×XbÐXbÐ`bÓOcÐ$dÓeˆˆkÑØ×ÑÐ1°2Ó6€DØ$Ÿ[™[Ð)>Ó?×EÐEÀ2×LÑLÖNÑˆØ�‰˜Ö)ñ Oà‡{�{Ð,×-Ò-Ø+/ˆÐ'Ñ(Ø  GÔ+Ø×ÑÐ2°GÐ<QÕ4RÔSØ‡{�{�:×ÒØ# JÕ/ˆˆjÑØ× Ñ  °Ó3ˆØ�‰ÔS §¡¨MÓ :× @Ð @¸bÐ @ÓSÔSØ×Ñ 
¨BÓ/€HØ‡O�OÔR˜wŸ{™{¨:Ó6×<Ð<¸"Ð<ÓRÔRßØ×ÑÐ,¨bÓ1×8Ñ8Ô8tÁHÓ8tÔtØ×ÑÐ-¨rÔ2Ø×ÑÐ+¨RÓ0×7Ñ7¸¿¹ÐDVÓ8W×8]Ð8]Ð[]Ô^Ø€Lr   c               ó    € V ^8„  d   QhRRRR/# r%  r   )r   s   "r   r   r   ¢  s   € ÷ Rñ R�Tð R˜dñ Rr   c                óÚ  € \        V P                  R 4      ;'       gË    \        ;QJ d5    R V P                  R4      ;'       g    .  4       F  '       g   K   RM*	  RM&! R V P                  R4      ;'       g    .  4       4      ;'       g]    V P                  R4      ;'       gD    V P                  R4      ;'       g+    V P                  R4      ;'       g    V P                  R4      4      # )	rý  c              3  óB   "  € T F  qP                  R 4      x € K  	  R# 5i)ÚargvNr¼   )r½   r   s   & r   r¿   Ú_has_work.<locals>.<genexpr>£  s   é € Ð,`ÑD_¸q¯U©U°6¯]¨]ÓD_ùs   ‚rþ  TFr2  rÿ  r-  r,  )r@   rC   rÅ   )r·   s   &r   Ú	_has_workrA  ¢  sÛ   € Ü�—	‘	˜*Ó%÷ Qð Q¯«Ñ,`ÀEÇIÁIÈjÓDY×D_ÐD_Ð]_ÐD_Ó,`¯¯ªÑ,`ÀEÇIÁIÈjÓDY×D_ÐD_Ð]_ÐD_Ó,`Ó)`÷ Qð QØ—9‘9˜ZÓ(÷Qð QØ,1¯I©I°mÓ,D÷Qð QØHMÏ	É	ÐRkÓHl÷Qð QØpu×pyÑpyð  {Pó  qQóRð Rr   c               ó$   € V ^8„  d   QhRRRRRR/# ©r	   Ú
claim_pathr   r2  r2   r
   rÙ   r   )r   s   "r   r   r   §  s!   € ÷ ñ  ð ¨Dð °Tñ r   c                óÚ  € ^ RI Hp V! 4       pVP                  \        4       4      '       gg   \	        \
        4      ;_uu_ 4        \        4       ;_uu_ 4        \        T / \        V 4      ;'       g    TCR\        /C4       RRR4       RRR4       R#  \        W4       VP                  4        R#   + '       g   i     L8; i  + '       g   i     R# ; i  TP                  4        i ; i)z´Resume under the checkout lock, so no update mutates the tree between the gate and the
verified start; an update that took the checkout after our claim gets the set back untouched.)Ú
UpdateLockr¯  N)Úhermes_cli.update_lockrF  Úacquire_checkoutr   r   r—   rm   rB  rI  r±  Ú_resume_fencedÚrelease)rD  r2  rF  Úfences   &&  r   Ú_resume_claimedrL  §  s–   € õ 2Ù‹L€EØ×!Ñ!¤,£.×1Ò1Ü”g×Õ¤§¥Ü˜*Ð&X¬$¨zÓ*:×*BÐ*B¸dÐ&XÀYÔPWÑ&XÔY÷ !)×áðÜ�zÔ(à�‰Ž÷ !)§ú×Öáûð 	�‰�ús0   ÁCÁ*B1	ÂCÂC Â1CÂ<CÃC	ÃC*c               ó$   € V ^8„  d   QhRRRRRR/# rC  r   )r   s   "r   r   r   ¶  s!   € ÷ 6ñ 6˜tð 6¨4ð 6°Dñ 6r   c                ó  € \        4       ;_uu_ 4        \        V 4      ;'       g    Tp\        \        VR ,          4      4      p\	        V4      pRRR4       \        XX4       \        V4      pVP                  RRR7        \        V4      '       dU   \        R\        P                  R7       ^ RIHp \        \        P                  4      ;_uu_ 4        V! V4       RRR4       MRVR&    \!        W$V4       \#        WW#4       R#   + '       g   i     LÀ; i  + '       g   i     L=; i  \         d*   p\        R	T R
2\        P                  R7        Rp?LoRp?ii ; i  \!        Y$T4       \#        YY#4       i ; i)r·   NT)rÜ   r†  uE   â†’ Restarting gateway(s) paused by an interrupted `hermes update`...ry  )Ú%_resume_windows_gateways_after_updateFrÜ   u.     âš  Could not restart every paused gateway: z0. Run `hermes update` or `hermes gateway start`.)rm   rI  rO  r2   r#  Ú_hold_backing_offÚ_relaunch_keysrä   rA  re  r|  r}  Úhermes_cli.update_cmd_windowsrO  r   rv   Ú_back_off_unreadyÚ
_hand_back)rD  r2  r·   r"  Ú	attemptedrO  rH  s   &&     r   rI  rI  ¶  s(  € Ü	��ä�JÓ×'Ð' 4ˆÜ"¤4¨¨W­Ó#6Ó7ˆÜ! %Ó(ˆ÷	 
ô
 �e˜XÔ&Ü˜uÓ%€IØ	‡L�L˜t¨d€LÔ3ð6Ü�U×ÒÜÐYÔ`c×`jÑ`jÕkÝ[ä ¤§¡×,Õ,Ù5°eÔ<÷ -Ð,ð &+ˆE�/Ò"ô
 	˜%¨HÔ5Ü�: UÖ5÷- 
�ú÷ -×,ûô ô :ÜÐ>¸s¸eð D(ð (Ü.1¯j©j÷	:ò 	:ûð:ûô 	˜%¨HÔ5Ü�: UÕ5úsl   “<DÂAD- Ã	DÃD- Ã&E$ Ã'D- Ã,E$ ÄD	ÄD*	Ä%D- Ä)E$ Ä*D- Ä-E!Ä8EÅE$ ÅE!Å!E$ Å$E>g      N@g      ¬@c               ó    € V ^8„  d   QhRRRR/# r÷  r   )r   s   "r   r   r   Ø  s   € ÷ cñ c˜$ð c 8ñ cr   c                óæ  € V P                  R 4      ;'       g    /  Uu0 uF  pRV 2kK
  	  upV P                  R4      ;'       g    .  Uu0 uF/  q"P                  R4      '       g   K  RVP                  R4       2kK1  	  up,          V P                  R4      ;'       g    .  Uu0 uF0  pRVP                  R4      ;'       g    VP                  R	4       2kK2  	  up,          # u upi u upi u upi )
rý  úprofile:rþ  r?  ú	unmapped:r0   rÿ  úunit:ÚunitÚlabelr¼   )r·   r8  r   s   &  r   rQ  rQ  Ø  sÛ   € Ø+0¯9©9°ZÓ+@×+FÐ+FÀBÐ+FÓGÑ+F 4ˆx˜�vÓÑ+FÑGØ38·9±9¸ZÓ3H×3NÐ3NÈBÐ3NÓ`Ñ3N¨a×RWÑRWÐX^×R_Ô)�˜1Ÿ5™5 ›<˜.Ó)Ñ3NÑ`õaàBGÇ)Á)ÈMÓBZ×B`ÐB`Ð^`ÐB`ÓaÑB`¸Q��q—u‘u˜V“}×6Ð6¨¯©¨g«Ð7Ó8ÑB`Ñaõbð cùÒGùÚ`ùÚas   žC$ÁC)Á(C)Â%C.ÃC.c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r·   r2   r·  r
   rÙ   r   )r   s   "r   r   r   Þ  s&   € ÷ Rñ R˜Tð R¨ð R°$ñ Rr   c           
     ó²  a	€ \         P                   ! 4       pV P                  R4      ;'       g    / P                  4        UUu0 uF2  w  r4T\        VP                  R4      ;'       g    ^ 4      8  g   K0  VkK4  	  uppo	VR,          P	                  V R,          P                  4        UUu/ uF  w  rVRV 2S	9   g   K  WVbK  	  upp4       VR,          P                  V	3R lV R,           4       4       V R,          P                  4        UUu/ uF  w  rVRV 2S	9  g   K  WVbK  	  uppV R&   V R,           Uu. uF  qwVR,          9  g   K  VNK  	  upV R&   V P                  R4      ;p'       dI   VR,          P                  V	3R lV 4       4       V Uu. uF  qwVR,          9  g   K  VNK  	  upV R&   R	# R	# u uppi u uppi u uppi u upi u upi )
zªMove the profile/unmapped/supervised entries still inside their relaunch backoff from *token*
into *held* (beside the draining ones): owed, not relaunched by this launch.Úrelaunch_retryÚnext_atrý  rX  rþ  c              3  óŽ   <"  € T F:  qP                  R 4      '       g   K  RVP                  R4       2S9   g   K6  Vx € K<  	  R# 5i)r?  rY  r0   Nr¼   ©r½   r   Úwaitings   & €r   r¿   Ú$_hold_backing_off.<locals>.<genexpr>ä  s=   øé € ÐtÑ'8 !¿E¹EÀ&¿MœAÐPYÐZ[×Z_ÑZ_Ð`eÓZfÐYgÐNhÐlsÑNsŸAšAÓ'8ùs   ƒA A»
Arÿ  c              3  ó�   <"  € T F;  pR VP                  R4      ;'       g    VP                  R4       2S9   g   K7  Vx € K=  	  R# 5i)rZ  r[  r\  Nr¼   rb  s   & €r   r¿   rd  è  s@   øé € Ð"l©e¨¸¸q¿u¹uÀV»}×?^Ð?^ÐPQ×PUÑPUÐV]ÓP^Ð>_Ð7`ÐdkÑ7k§1¢1«eùs   ƒA¡A¼
AN)re   rC   r^  rV   rä   r8  )
r·   r·  ÚnowrÁ  rÈ   ÚnrW  r   r1  rc  s
   &&       @r   rP  rP  Þ  s¦  ø€ ô �)Š)‹+€CØ&+§i¡iÐ0@Ó&A×&GÐ&GÀR×%NÑ%NÔ%PÔ{Ñ%P‘z�sÐTWÔZ_Ð`e×`iÑ`iÐjsÓ`t×`yÐ`yÐxyÓZzÑTz�sˆsÑ%PÒ{€GØˆÕ×Ñ¨e°JÕ.?×.EÑ.EÔ.GÔeÑ.G¡d aÈXÐVWÐUXÈ>Ð]dÑKdœT˜QšTÑ.GÒeÔfØˆÕ×ÑÔt u¨ZÖ'8ÓtÔtØ*/°
Õ*;×*AÑ*AÔ*CÔeÑ*C¡$ !ÈÐRSÐQTÀ~Ð]dÑGdœ˜šÑ*CÒe€Eˆ*ÑØ$)¨*Ö$5ÓSÑ$5˜qÀ$ÀzÕBRÑ9RŸ˜Ñ$5ÑS€Eˆ*ÑØ—	‘	˜-Ó(Ð(€uÖ(Øˆ]Õ×"Ñ"Ô"l©eÓ"lÔlÙ+0ÓQ©5 a¸TÀ-Õ=PÑ4P§ ©5ÑQˆˆmÓñ )ùó |ùÛeùãeùÚSùò  RsB   Á$F=Á(F=Á5F=Â+G
Â>G
ÄG	Ä"G	Ä:GÅGÆGÆ-Gc               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r·   r2   rU  r›  r·  r
   rÙ   r   )r   s   "r   r   r   ì  s.   € ÷ Zñ Z˜Tð Z¨hð Z¸dð ZÀtñ Zr   c                ó¦  € \        V P                  R4      ;'       g    / 4      pV P                  R4      '       gÆ   \        V 4      pV F´  pWT9  d   VP                  VR4       K  \	        VP                  V4      ;'       g    / P                  R4      ;'       g    ^ 4      ^,           pRVR\
        P
                  ! 4       \        \        ^\        V^,
          ^4      ,          ,          \        4      ,           /W5&   K¶  	  \        V 4      \        V4      ,          pVP                  4        UUu/ uF  w  rXWW9   g   K  WXbK  	  uppV R&   R# u uppi )z­Start or extend the backoff of each attempted entry the resume left owed (not ready, not
launched); forget it for one that came back. A tree-gate deferral attempted nothing.r_  r‡  NÚattemptsr`  )
r2   rC   rQ  rˆ  r9   re   ÚminÚ_RELAUNCH_RETRY_BASE_SÚ_RELAUNCH_RETRY_MAX_Sr^  )	r·   rU  r·  ÚretryÚunreadyrÁ  rj  r‰  rÈ   s	   &&&      r   rS  rS  ì  s  € ô �—‘Ð+Ó,×2Ð2°Ó3€EØ�9‰9Ð&×'Ò'Ü  Ó'ˆÛˆCØÔ!Ø—	‘	˜#˜tÔ$ÙÜ˜EŸI™I c›N×0Ð0¨b×5Ñ5°jÓA×FÐFÀQÓGÈ!ÕKˆHØ$ h°	¼4¿9º9»;ÌÜ&¨¬c°(¸Qµ,ÀÓ.BÕ)BÕBÔDYóJ[õ <[ð \ˆE‹Jñ ô ˜%Ó ¤>°$Ó#7Õ7€DØ<A¿K¹K¼MÔY¹M©j¨cÈSÉ[œz˜sšz¹MÒY€EÐ
ÓùÓYs   Ä/
EÄ>Ec          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r	   rD  r   r2  r2   r·   r"  r
   rÙ   r   )r   s   "r   r   r   ý  s6   € ÷ Mñ M˜4ð M tð M°Dð MÀDð MÈTñ Mr   c                óÐ  € / VP                  R4      ;'       g    / CVR,          CVR&   . VP                  R4      ;'       g    . OVR,          OVR&   VP                  R4      '       d*   . VP                  R4      ;'       g    . OVR,          OVR&   \        VP                  R4      ;'       gM    VP                  R4      ;'       g4    VR,          ;'       g#    VR,          ;'       g    VP                  R4      4      p\        \        4      ;_uu_ 4        \	        4       ;_uu_ 4        V'       dL   VP                  4        UUu/ uF  w  rVVR
9  g   K  WVbK  	  ppp\        V / VCR/ VCRR/CR\        /C4       M*\        \        4       T \        V 4      ;'       g    T3.4       R	R	R	4       R	R	R	4       R	# u uppi   + '       g   i     L ; i  + '       g   i     R	# ; i)ut  Retire the claim when nothing is owed; else hand it back unowned for the next launch â€” this
launch may live for hours (a chat) â€” which retries at once, except a relaunch that did not
become ready (its backoff, :func:`_back_off_unready`). A draining process stays owed until it
has exited and been restarted. A failed rewrite leaves our claimer line, dead once we exit.rý  rþ  rÿ  rÜ   r‡  r·   Tr¯  N)r†  r‡  )rC   r@   r   r—   rm   r^  rB  r±  r‚  r.   rI  )rD  r2  r·   r"  r‰  rÁ  ÚvalueÚkepts   &&&&    r   rT  rT  ý  s¨  € ð
 R˜EŸI™I jÓ1×7Ð7°RÐQ¸HÀZÕ<PÐQ€Eˆ*ÑØO˜5Ÿ9™9 ZÓ0×6Ð6°BÐO¸(À:Õ:NÐO€Eˆ*ÑØ‡|�|�M×"Ò"Ø\ %§)¡)¨MÓ":×"@Ð"@¸bÐ\ÀHÈ]ÕD[Ð\ˆˆmÑÜ�—	‘	˜/Ó*÷ Gð G¨e¯i©iÐ8IÓ.J÷ Gð GÈhÐWaÕNb÷ Gð GØ˜JÕ'÷Gð GØ+3¯<©<¸Ó+FóH€Dä	”'×	Õ	œFŸH�HßØ16·±´Ôm±¡: 3À#ÐMlÑBl”J�C’J±ˆDÑmÜ˜*Ð&l¨Ð&l¨wÐ8W¸4Ð8WÀÐRVÑ8WÐYbÔdkÑ&lÕmä”K“M Z´°jÓ1A×1IÐ1IÀTÐ$JÐ#KÔL÷ %×	Ñ	ùãm÷ %ŸHú×	×	Ð	ús=   ÄGÄ+G	ÅF;ÅF;ÅAG	Æ)GÆ;G	ÇGÇGÇG%	c               ó    € V ^8„  d   QhRRRR/# )r	   r?  r¦   r
   rÙ   r   )r   s   "r   r   r     s   € ÷ Pñ PÐ"ð P¨dñ Pr   c                óŠ  € ^ RI Hp T! \        V f   \        P                  R,          MT 4      4      pVR,          R.8X  g   VR,          RR.8X  d   R#  \        4        \        4        F  w  r4\        V4      pVf   K  \        V!   K!  	  R#   \         d*   p\        R	T 2\        P                  R
7        Rp?R# Rp?ii ; i)zAStart-of-run recovery: resume every orphaned pause. Never raises.)Úcommand_argvN:r   NN:Nr   Nrä   :Nr	   NÚgatewayÚrunu'     âš  Paused-gateway recovery skipped: ry  )Úhermes_cli._parserrv  r  r|  r?  r×  rÑ  rá  rL  rv   re  r}  )r?  rv  Úcommandro  r¬  ræ  rH  s   &      r   Úrecoverr{    s    € å/Ùœ4°²¤§¡¨¦À$ÓGÓH€GØˆr…{�x�jÔ  G¨B¥K°I¸uÐ3EÔ$EÙðPÜÔÜ!ž)‰JˆCÜ˜“*ˆCØŒÜ Ô%ó $øô ô PÜÐ7¸°uÐ=ÄCÇJÁJ×OÓOûðPús   Á%B Á?B ÂCÂB=Â=CrÕ   )r¹   rº   rù  rU  rY  rZ  r[  r©  )grL   Ú
__future__r   r“  r   r9  r   rt   r•   r|  Ú	threadingre   rÂ   Ú
contextlibr   r   r   Úpathlibr   r-   r_   Ú_MUTEX_WAIT_SÚlocalr]   r   r$   r.   r<   rD   r—   rF   rO   rQ   rS   rm   r‡   rš   r¤   rµ   rÉ   rÆ   rÑ   rß   rð   rç   rõ   rù   r  r  r  r#  r*  r0  rB  rI  r±  rÝ   ra  rf  rq  ru  r  rƒ  rŠ  r�  r•  r™  r¡  rŸ  r‚  r³  rn  Ú	frozensetrË  rÎ  rÑ  r×  rÔ  rá  rç  rê  rí  rñ  rò  rõ  rú  r  r  r  r  rO  r#  rN  rA  rL  rI  rl  rm  rQ  rP  rS  rT  r{  r   r   r   Ú<module>rƒ     s^  ðñ#õJ #ã Û Û Û 	Û Û Û 
Û Û Û ß @Ñ @Ý à.€Ø˜7Õ"€
Ø€ð �oŠoÓ€õ/÷jõN÷
	PõeôD�Wô DôG�ô Gôd�Wô dôe�Gô eð Ø(ö ó ðõ>õ0õ)õ÷&õSõõ	,ð Ð õ	õ)õ(Hõõ(jõõ õ.÷õD÷"ð* �!�T˜4Ð
 €ðp¨tð pÈ÷ p÷$	#õ	Sõ!õ&Aõm÷..õZõ^õIõ(õ!õ(õ õ=õñ U^ÓT_÷ õ2@÷÷
õ)õõ0õ õ	ð(€õõ1õ9õ
õMõ"<õ*gõ@õ õ+õ\Rõ
õ6ð< Ð ØÐ õcõRõZõ"M÷&Pñ Pr   