+
    kHàjù  ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHt R	t]! ]4      P$                  t] R
2tRtRt ! R R]4      tR R ltR1R R lltR1R R llt]! RR7       ! R R4      4       t]P:                  ! R4      tR R ltR R lt R R lt!R  R! lt"R" R# lt#]! RR7       ! R$ R%4      4       t$]! RR7       ! R& R'4      4       t%R( R) lt&R* R+ lt'R,R/R- R. llt(R/ R0 lt)R# )2uÔ  Termux pool pins: the runtime-lib table and lock.json's bionic rows.

``scripts/termux/stage_runtime_libs.py`` merges their .debs into one flat
``lib/`` inside the sealed Termux payload, and ``scripts/ci/archive_inputs.py``
mirrors the same bytes into R2. Both are chained to the pin table that lives
beside this module.

The pool is rolling: rebuilding a package DELETES the previous archive from
``pool/main/``, so a pin rots silently until a payload build downloads it and
gets a 404. The library set is the payload's recursive DT_NEEDED closure, so a
pin may not simply track "newest" â€” a repin is a repair:

    hermes pm update --termux --check   # what the pool no longer serves
    hermes pm update --termux           # repin exactly those rows

Nothing here resolves versions. "Move to the newest" is a different job with a
different blast radius (a repin can land a rebuilt library under a moved
soname), so an alive pin is left alone even when the pool has moved on.
)ÚannotationsN)Ú	dataclass)ÚPath)ÚOptional)Úurlsplit)Úhash_url)Ú	_get_textz,https://packages.termux.dev/apt/termux-main/z)dists/stable/main/binary-aarch64/Packagesz/apt/termux-main/pool/main/ztermux_runtime_libs.jsonc                  ó   € ] tR t^)tRtRtR# )ÚPinMismatchz:The pool serves bytes the package index does not describe.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    Ú3/home/ubuntu/.hermes/hermes-agent/pm/termux_libs.pyr
   r
   )   s   † ÝDr   r
   c               ó   € V ^8„  d   QhRR/# )é   Úreturnr   r   )Úformats   "r   Ú__annotate__r   -   s   € ÷ 8ñ 8�Dñ 8r   c                 óf   € \        \        4      P                  4       P                  \        ,          # ©N)r   Ú__file__ÚresolveÚparentÚ
TABLE_NAMEr   r   r   Ú
table_pathr   -   s    € Ü”‹>×!Ñ!Ó#×*Ñ*¬ZÕ7Ð7r   c               ó    € V ^8„  d   QhRRRR/# )r   ÚpathúOptional[Path]r   Údictr   )r   s   "r   r   r   1   s   € ÷ Rñ R�^ð R¨tñ Rr   c                ó„   € \         P                  ! \        T ;'       g    \        4       4      P	                  R R7      4      # )z	utf-8-sig)Úencoding)ÚjsonÚloadsr   r   Ú	read_text)r!   s   &r   Ú
load_tabler)   1   s.   € Ü�:Š:”d˜4×/Ð/¤:£<Ó0×:Ñ:ÀKÐ:ÓPÓQÐQr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Útabler#   r!   r"   r   ÚNoner   )r   s   "r   r   r   5   s!   € ÷ ñ �dð  .ð ¸Dñ r   c                óž   € \        T;'       g    \        4       4      P                  \        P                  ! V ^R7      R,           RRR7       R# )r   )ÚindentÚ
zutf-8)r%   ÚnewlineN)r   r   Ú
write_textr&   Údumps)r+   r!   s   &&r   Ú
save_tabler3   5   s;   € Üˆ×	Ð	”“Ó×)Ñ)Ü�
Š
�5 Ô# dÕ*°WÀdð *ö r   T)Úfrozenc                  ó@   € ] tR t^@t$ R]R&   R]R&   R]R&   R]R&   RtR# )ÚPoolPackageÚstrÚnameÚversionÚurlÚsha256r   N©r   r   r   r   Ú__annotations__r   r   r   r   r6   r6   @   s   ‡ à
ƒIØƒLØ	ƒHØ‡Kr   r6   z"^([A-Za-z][A-Za-z0-9-]*):[ ]?(.*)$c               ó    € V ^8„  d   QhRRRR/# )r   Útextr7   r   údict[str, PoolPackage]r   )r   s   "r   r   r   K   s   € ÷ ñ �cð Ð4ñ r   c                óŽ  € / p/ p. V P                  4       ORN F¨  pVP                  4       '       g"   \        V4      pVe   WAVP                  &   / pK:  V^ ,          P	                  4       '       d   KY  \
        P                  V4      pV'       g   Kx  VP                  ^4      P                  4       W%P                  ^4      &   Kª  	  V# )zäPackage -> the archive the pool currently serves.

RFC822-ish stanzas: one field per line, indented continuation lines
(long descriptions) ignored. A stanza without a filename or hash is not
installable evidence and is dropped.
Ú )Ú
splitlinesÚstripÚ_packager8   ÚisspaceÚ_FIELDÚmatchÚgroup)r?   ÚpoolÚfieldsÚlineÚrowrH   s   &     r   Úparse_indexrN   K   sŸ   € ð $&€DØ€FØ(�$—/‘/Ó#Ð( RÓ(ˆØ�z‰z�|Š|Ü˜6Ó"ˆCØŠØ!$�S—X‘X‘ØŠFØ�a•—‘×"Ô"Ü—L‘L Ó&ˆEß‰uØ).¯©°Q«×)=Ñ)=Ó)?�—{‘{ 1“~Ó&ñ )ð €Kr   c               ó    € V ^8„  d   QhRRRR/# )r   rK   zdict[str, str]r   úOptional[PoolPackage]r   )r   s   "r   r   r   a   s   € ÷ Qñ Q�^ð QÐ(=ñ Qr   c                óì   € V P                  R 4      pV P                  R4      pV P                  R4      pV'       d   V'       d	   V'       g   R# \        WP                  RR4      \        V,           V4      # )ÚPackageÚFilenameÚSHA256NÚVersionrB   )Úgetr6   ÚPOOL)rK   r8   Úfilenamer;   s   &   r   rE   rE   a   sT   € Ø�:‰:�iÓ €DØ�z‰z˜*Ó%€HØ�Z‰Z˜Ó!€Fß—x§vÙÜ�tŸZ™Z¨	°2Ó6¼¸x½ÈÓPÐPr   c               ó   € V ^8„  d   QhRR/# )r   r   r@   r   )r   s   "r   r   r   j   s   € ÷ -ñ -Ð%ñ -r   c                 ó2   € \        \        \        4      4      # r   )rN   r   Ú	INDEX_URLr   r   r   Úindexr\   j   s   € Ü”y¤Ó+Ó,Ð,r   c               ó    € V ^8„  d   QhRRRR/# )r   r:   r7   r   zOptional[str]r   )r   s   "r   r   r   n   s   € ÷ 
ñ 
�Cð 
˜Mñ 
r   c                ód  € \        V 4      pVP                  R8w  g   VP                  \        8w  d   R# VP                  P                  \        4      '       g   R# VP                  \        \        4      R P                  R4      p\        V4      ^8w  g   \        V4      '       g   R# V^,          # )zBThe pool package a pinned URL names, or None for any other source.ÚhttpsNÚ/)
r   ÚschemeÚnetlocÚ	POOL_HOSTr!   Ú
startswithÚPOOL_PATH_PREFIXÚlenÚsplitÚall)r:   ÚparsedÚpartss   &  r   Ú
package_ofrk   n   s   € ä�c‹]€FØ‡}�}˜Ô 6§=¡=´IÔ#=ÙØ�;‰;×!Ñ!Ô"2×3Ò3ÙØ�K‰KœÔ,Ó-Ð.Ð/×5Ñ5°cÓ:€EÜ
ˆ5ƒz�Q„œc %ŸjšjÙØ��8€Or   c               ó    € V ^8„  d   QhRRRR/# )r   r:   r7   r   r   )r   s   "r   r   r   {   s   € ÷ "ñ "�3ð "˜3ñ "r   c                ó4   € V P                  R ^4      R,          # )r`   éÿÿÿÿ)Úrsplit)r:   s   &r   Ú	_filenamerp   {   s   € Ø�:‰:�c˜1Ó˜bÕ!Ð!r   c                  ó@   € ] tR t^„t$ R]R&   R]R&   R]R&   R]R&   RtR# )ÚPinr7   Úscoper8   r:   r9   r   Nr<   r   r   r   rr   rr   „   s   ‡ àƒJØ
ƒIØ	ƒHØ‡Lr   rr   c                  ó,   € ] tR t^Œt$ R]R&   R]R&   RtR# )ÚRetiredrr   ÚpinrP   Úreplacementr   Nr<   r   r   r   ru   ru   Œ   s   ‡ à	ƒHð '×&r   ru   c               ó    € V ^8„  d   QhRRRR/# )r   r+   r#   r   z	list[Pin]r   )r   s   "r   r   r   ”   s   € ÷ ñ �ð  9ñ r   c                ó$  € V P                  R4      ;'       g    / P                  4        UUu. uF)  w  r#\        RW#R,          VP                  RR4      4      NK+  	  pppV P                  R4      pV'       d5   VP                  \        RRVR,          VP                  RR4      4      4       VP	                  4        FÊ  pVP                  V4      P                  4        F¤  w  rg\        V\        4      '       d   TMV. F€  p\        V\        4      '       g   K  \        VP                  RR4      4      '       g   K>  TP                  \        R	V R
V 2VR,          VP                  V4      ;'       g    R4      4       K‚  	  K¦  	  KÌ  	  V# u uppi )u3  Every pinned URL the Termux pool serves, from both authorities.

The table owns the payload's libraries and its license package; the
lockfile owns the cross-target tools whose bionic arm is a pool .deb
(python, node, uv). Other lock sources â€” GitHub tarballs, OCI digests â€”
are not the pool's business.
ÚlibsÚlibraryr:   r9   rB   ÚlicensesÚlicenseztermux-licensesÚtoolÚ@)rV   Úitemsrr   ÚappendÚnamesÚpinned_artifactsÚ
isinstanceÚlistr#   rk   r9   )r+   Úlockfiler8   rM   Úoutr|   ÚtargetÚrowss   &&      r   ÚpinsrŠ   ”   sM  € ð  Ÿ)™) FÓ+×1Ð1¨r×8Ñ8Ô:ôá:‰IˆDô 	ˆI�t �Z¨¯©°¸BÓ)?Ö@Ù:ð ñ ð �y‰y˜Ó$€HßØ�
‰
”3�yÐ"3°X¸eµ_ÀhÇlÁlÐS\Ð^`ÓFaÓbÔcØ—‘Ö ˆØ$×5Ñ5°dÓ;×AÑAÖC‰LˆFÜ)¨$´×5Ò5‘t¸D¸6ÒA�Ü˜c¤4×(Ô(¬Z¸¿¹ÀÀrÓ8J×-KÔ-KØ—J‘Jœs 6¨d¨V°1°V°HÐ+=¸sÀ5½zÈ8×K[ÑK[Ð\`ÓKa×KgÐKgÐegÓhÖió Bó Dñ !ð
 €Jùós   ­/Fc               ó$   € V ^8„  d   QhRRRRRR/# )r   r+   r#   rJ   r@   r   úlist[Retired]r   )r   s   "r   r   r   «   s"   € ÷ ñ �4ð Ð)?ð ÀMñ r   c                ó$  € . p\        W4       F~  pTP                  \        VP                  4      ;'       g    R4      pVe0   \	        VP                  4      \	        VP                  4      8w  g   Kd  VP                  \        WE4      4       K€  	  V# )z6Pins whose archive the pool has replaced (or dropped).rB   )rŠ   rV   rk   r:   rp   r�   ru   )r+   r†   rJ   r‡   rv   Úentrys   &&&   r   Úretiredr�   «   sk   € à
€CÜ�EÖ$ˆØ—‘œ C§G¡GÓ,×2Ð2°Ó3ˆØŠ=œI e§i¡iÓ0´I¸c¿g¹gÓ4FÖFØ�J‰J”w˜sÓ*Ö+ñ %ð €Jr   Úverifyc               ó$   € V ^8„  d   QhRRRRRR/# )r   r+   r#   ÚstalerŒ   r   Úintr   )r   s   "r   r   r   µ   s!   € ÷ ñ �$ð ¨ð È3ñ r   c               óz  € T;'       g    \         p^ pV F¢  pVP                  f   K  V! VP                  P                  4      pWeP                  P                  8w  dE   \	        \        VP                  P                  4       RV RVP                  P                   24      h\        WV4       V^,          pK¤  	  V# )u   Repin every retired row to the pool's current archive.

The index's SHA256 is not taken on faith: the replacement's bytes are
fetched and hashed first â€” the same evidence `pm lock` pins with. Rows
the pool no longer carries are left exactly as they are.
z: the pool serves z, the index declares )r   rw   r:   r;   r
   rk   rv   Ú_repoint)r+   r†   r’   r�   ÚappliedrŽ   Úserveds   &&&$   r   Úrepairr˜   µ   s¸   € ð ×Ð”x€FØ€GÛˆØ×ÑÒ$ÙÙ˜×)Ñ)×-Ñ-Ó.ˆØ×&Ñ&×-Ñ-Ô-ÜÜ˜eŸi™iŸm™mÓ,Ð-Ð-?À¸xð H&Ø&+×&7Ñ&7×&>Ñ&>Ð%?ðAóð ô 	� %Ô(Ø�1�Šñ ð €Nr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r+   r#   rŽ   ru   r   r,   r   )r   s   "r   r   r   Ì   s!   € ÷ ñ �Dð ¨7ð °tñ r   c                óº  € VP                   VP                  rCVP                  R 8X  dÑ   VP                  P	                  R^4      w  rVVP                  V4      pWv,          p\        V\        4      '       d   TMV. FW  p	\        V	P                  RR4      4      \        VP                  4      8X  g   K8  VP                  VP                  uV	R&   V	R&   KY  	  VP                  WQP                  V4      V4       R# VP                  R8X  d   V R,          VP                  ,          MV R,          p	VP                  VP                  VP                  uV	R&   V	R&   V	R	&   R# )
r~   r   r:   rB   r;   Nr{   rz   r|   r9   )rv   rw   rs   r8   rg   rƒ   r„   r…   rk   rV   r:   r;   Úset_pinr9   )
r+   r†   rŽ   rv   rw   r8   rˆ   Ú	artifactsr‰   rM   s
   &&&       r   r•   r•   Ì   s  € Ø—y‘y %×"3Ñ"3ˆØ
‡y�y�FÔØ—x‘x—~‘~ c¨1Ó-‰ˆØ×-Ñ-¨dÓ3ˆ	ØÕ ˆÜ% d¬D×1Ò1‘4¸°vÒ=ˆCÜ˜#Ÿ'™' %¨Ó,Ó-´¸C¿G¹GÓ1DÖDØ,7¯O©O¸[×=OÑ=OÐ)��E‘
˜C ›Mñ >ð 	×Ñ˜×/Ñ/°Ó5°yÔAÙØ%(§Y¡Y°)Ô%;ˆ%��-˜Ÿ™Ö
!ÀÀzÕAR€Cà�‰Ø×ÑØ×Ñð .€Cˆ�J��H‘˜s 9›~r   r   )*r   Ú
__future__r   r&   ÚreÚdataclassesr   Úpathlibr   Útypingr   Úurllib.parser   Úpm.storer   Ú	pm.updater   rW   Úhostnamerc   r[   re   r   ÚRuntimeErrorr
   r   r)   r3   r6   ÚcompilerG   rN   rE   r\   rk   rp   rr   ru   rŠ   r�   r˜   r•   r   r   r   Ú<module>r¨      s  ðñõ( #ã Û 	Ý !Ý Ý Ý !å Ý à5€Ù�T‹N×#Ñ#€	ØˆfÐ=Ð>€	Ø0Ð à'€
ôE�,ô Eõ8÷R÷ñ �$Ô÷ð ó ðð 
�ŠÐ9Ó	:€õõ,Qõ-õ
õ"ñ �$Ô÷ð ó ðñ �$Ô÷'ð 'ó ð'õõ.ðÀ$÷ ÷.r   