§
    øžyjf ã                  óR  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZmZmZ ddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZm Z  dd
l!m"Z"m#Z# 	 ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. n`# e/$ rX e0xZ%xZ&xZ+xZ,Z. G d„ d¦  «        Z1e1Z' G d„ d¦  «        Z2e2Z( G d„ d¦  «        Z3e3Z) G d„ d¦  «        Z4e4Z* G d„ d¦  «        Z5e5Z-Y nw xY wddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZC  ejD        eE¦  «        ZFdZGd~d„ZHdd!„ZI e	jJ        d"e	jK        ¦  «        ZLd€d%„ZMd�d'„ZN e	jJ        d(¦  «        ZOd‚d+„ZPdƒd,„ZQ G d-„ d.e¦  «        ZR ed/¬0¦  «         G d1„ d2¦  «        ¦   «         ZSe G d3„ d4¦  «        ¦   «         ZTe G d5„ d6¦  «        ¦   «         ZUe G d7„ d8¦  «        ¦   «         ZVd9ZWd:ZXd„d<„ZYeWZZdd=l[m\Z]  e]d>d?¦  «        Z^e^d@z  Z_dAZ` e	jJ        dB¦  «        ZadCZb ech dD£¦  «        ZddEZeeedFz   ZfdGdGdGdGdGdGdGdGdGdGdGdHdGdIœZgdJehdK<   d…dL„Zid†dN„Zjd‡dR„ZkdˆdT„Zld‰dU„ZmdŠdW„Znd‹dŒdZ„ZodŠd[„Zpd�d^„ZqdŽd`„Zrd�dc„Zsd�dd„Ztd‘df„Zud’dh„Zvd�di„Zwd“dj„Zxd‰dk„Zyd‰dl„Zzd‰dm„Z{ G dn„ do¦  «        Z| G dp„ dqe:¦  «        Z}dddrdsœdt„Z~d”du„Zd•dz„Z€d‰d{„Z�d|„ Z‚d”d}„ZƒdS )–u:  Matrix gateway adapter.

Connects to any Matrix homeserver (self-hosted or matrix.org) via the
mautrix Python SDK.  Supports optional end-to-end encryption (E2EE)
when installed with ``pip install "mautrix[encryption]"``.

Environment variables:
    MATRIX_HOMESERVER           Homeserver URL (e.g. https://matrix.example.org)
    MATRIX_ACCESS_TOKEN         Access token (preferred auth method)
    MATRIX_USER_ID              Full user ID (@bot:server) â€” required for password login
    MATRIX_PASSWORD             Password (alternative to access token)
    MATRIX_ENCRYPTION           Set "true" to enable E2EE
    MATRIX_E2EE_MODE            off | optional | required. Overrides MATRIX_ENCRYPTION
                                when set. Legacy MATRIX_ENCRYPTION=true maps to required.
    MATRIX_DEVICE_ID            Stable device ID for E2EE persistence across restarts
    MATRIX_PROXY                HTTP(S) or SOCKS proxy URL for Matrix traffic
    MATRIX_ALLOWED_USERS    Comma-separated Matrix user IDs (@user:server)
    MATRIX_ALLOWED_ROOMS    Comma-separated Matrix room IDs allowed to trigger turns
    MATRIX_HOME_ROOM        Room ID for cron/notification delivery
    MATRIX_REACTIONS        Set "false" to disable processing lifecycle reactions
                            (eyes/checkmark/cross). Default: true
    MATRIX_REQUIRE_MENTION      Require @mention in rooms (default: true)
    MATRIX_FREE_RESPONSE_ROOMS  Comma-separated room IDs exempt from mention requirement
                                (alias of matrix.free_response_rooms)
    MATRIX_ALLOWED_ROOMS    Comma-separated room IDs; if set, bot ONLY responds
                            in these rooms (whitelist, DMs exempt; alias of
                            matrix.allowed_rooms)
    MATRIX_IGNORE_USER_PATTERNS Comma-separated regular expressions for appservice /
                                bridge ghost user IDs to ignore
    MATRIX_PROCESS_NOTICES      Set "true" to process inbound m.notice events
                                (default: false)
    MATRIX_ALLOW_ROOM_MENTIONS  Allow outbound @room mentions to notify whole rooms
                                (default: false)
    MATRIX_TOOLS_ALLOW_REDACTION
                              Allow Matrix redaction tool execution (default: false)
    MATRIX_TOOLS_ALLOW_INVITES Allow Matrix invite tool execution (default: false)
    MATRIX_TOOLS_ALLOW_ROOM_CREATE
                              Allow Matrix room creation tool execution (default: false)
    MATRIX_AUTO_THREAD          Auto-create threads for room messages (default: true)
    MATRIX_DM_AUTO_THREAD       Auto-create threads for DM messages (default: false)
    MATRIX_RECOVERY_KEY         Recovery key for cross-signing verification after device key rotation
    MATRIX_DM_MENTION_THREADS   Create a thread when bot is @mentioned in a DM (default: false)
    MATRIX_ALLOW_PUBLIC_ROOMS   Allow Matrix tools to create public rooms (default: false)
    MATRIX_MAX_MESSAGE_LENGTH   Outbound message chunk size in characters (default: 16000)
    MATRIX_APPROVAL_REQUIRE_SENDER
                              Require reaction controls to come from the original requester
                              when requester metadata is available (default: true)
    MATRIX_APPROVAL_TIMEOUT_SECONDS
                              Reaction approval/model-picker timeout (default: 300)
é    )ÚannotationsN)ÚurljoinÚurlsplitÚ
urlunsplit)Ú	dataclassÚfield)Úescape)Ú
HTMLParser)ÚPath)ÚAnyÚDictÚOptionalÚSet)ÚUnscopedSecretErrorÚ
get_secret©
Ú
ContentURIÚEventIDÚ	EventTypeÚPaginationDirectionÚPresenceStateÚRoomCreatePresetÚRoomIDÚ	SyncTokenÚ
TrustStateÚUserIDc                  ó   — e Zd ZdZdZdZdZdS )Ú_EventTypeStubzm.room.messagez
m.reactionzm.room.encryptedúm.room.nameN)Ú__name__Ú
__module__Ú__qualname__ÚROOM_MESSAGEÚREACTIONÚROOM_ENCRYPTEDÚ	ROOM_NAME© ó    úF/home/ragecks/.hermes/hermes-agent/plugins/platforms/matrix/adapter.pyr   r   _   s"   € € € € € Ø'ˆØˆØ+ˆØ!ˆ	ˆ	ˆ	r(   r   c                  ó   — e Zd ZdZdZdS )Ú_PaginationDirectionStubÚbÚfN)r    r!   r"   ÚBACKWARDÚFORWARDr'   r(   r)   r+   r+   g   s   € € € € € ØˆØˆˆˆr(   r+   c                  ó   — e Zd ZdZdZdZdS )Ú_PresenceStateStubÚonlineÚofflineÚunavailableN)r    r!   r"   ÚONLINEÚOFFLINEÚUNAVAILABLEr'   r(   r)   r1   r1   m   s   € € € € € ØˆØˆØ#ˆˆˆr(   r1   c                  ó   — e Zd ZdZdZdZdS )Ú_RoomCreatePresetStubÚprivate_chatÚpublic_chatÚtrusted_private_chatN)r    r!   r"   ÚPRIVATEÚPUBLICÚTRUSTED_PRIVATEr'   r(   r)   r9   r9   t   s   € € € € € Ø ˆØˆØ0ˆˆˆr(   r9   c                  ó   — e Zd ZdZdZdS )Ú_TrustStateStubr   é   N)r    r!   r"   Ú
UNVERIFIEDÚVERIFIEDr'   r(   r)   rA   rA   {   s   € € € € € Øˆ
Øˆˆˆr(   rA   )ÚPlatformÚPlatformConfig)ÚBasePlatformAdapterÚMessageEventÚMessageTypeÚProcessingOutcomeÚ
SendResultÚresolve_proxy_urlÚproxy_kwargs_for_aiohttpÚ_ssrf_redirect_guard)ÚThreadParticipationTrackeré   Úpathr   ÚreturnúDict[str, Any]c                óÚ  — i }t          j        d¦  «        }|r·	 t          j        |ddddddt	          | ¦  «        gddd	t          j        ¬
¦  «        }|j        dk    rEt          |j        pd 	                    ¦   «         pd¦  «        }|dk    rt          |dz  ¦  «        |d<   n-# t          $ r  t                               d| d¬¦  «         Y nw xY wt          j        d¦  «        }|�r„	 t          j        |dddt	          | ¦  «        dddddddgddt          j        ¬¦  «        }|j        dk    �r|j        �rt          j        d¦  «        }|                     |j        ¦  «         t           j        dk    r|                     ¦   «          |r²t'          |¦  «        }g }t)          t*          ¦  «        D ]‡}	|	|z  t*          z  }
t-          |
dz   |	dz   |z  t*          z  ¦  «        }t-          d„ ||
|…         D ¦   «         ¦  «        }|                     t1          d t          |d!z  d z  ¦  «        ¦  «        ¦  «         Œˆ||d"<   n-# t          $ r  t                               d#| d¬¦  «         Y nw xY w|S )$a‘  Return best-effort Matrix voice metadata for an audio file.

    Matrix clients such as Element render ``m.audio`` events with
    ``org.matrix.msc3245.voice`` as voice bubbles. They are more reliable when
    the event also includes duration and MSC1767 waveform metadata. Metadata
    extraction is deliberately best-effort: media delivery must still work on
    systems without ffprobe/ffmpeg.
    Úffprobeú-vÚerrorz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1Té
   )Úcapture_outputÚtextÚtimeoutÚstdinr   Ú éè  Údurationz-Matrix: failed to probe voice duration for %s©Úexc_infoÚffmpegú-iú-acÚ1z-arÚ8000z-fÚs16leÚ-é   ©rY   r[   r\   ÚhÚlittlerB   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S ©N)Úabs)Ú.0Úvalues     r)   ú	<genexpr>z2_matrix_voice_metadata_for_file.<locals>.<genexpr>Ù   s(   è è € Ð"NÐ"N°%¥3 u¡:¤:Ð"NÐ"NÐ"NÐ"NÐ"NÐ"Nr(   i   iÿ  Úwaveformz-Matrix: failed to build voice waveform for %s)ÚshutilÚwhichÚ
subprocessÚrunÚstrÚDEVNULLÚ
returncodeÚfloatÚstdoutÚstripÚintÚ	ExceptionÚloggerÚdebugÚarrayÚ	frombytesÚsysÚ	byteorderÚbyteswapÚlenÚrangeÚ_MATRIX_VOICE_WAVEFORM_BINSÚmaxÚappendÚmin)rQ   ÚmetadatarU   Úresultr_   rb   ÚsamplesÚcountrs   ÚidxÚstartÚendÚpeaks                r)   Ú_matrix_voice_metadata_for_filer•   “   sÜ  € ð  "€HåŒl˜9Ñ%Ô%€GØð _ð	_Ý”^àØØØ#Ø%ØØ8Ý˜‘I”Ið	ð  $ØØÝ Ô(ðñ ô ˆFð  Ô  AÒ%Ð%Ý  &¤-Ð"5°2×!<Ò!<Ñ!>Ô!>Ð!CÀ!ÑDÔD�Ø˜a’<�<Ý+.¨x¸$©Ñ+?Ô+?�H˜ZÑ(øøÝð 	_ð 	_ð 	_Ý�LŠLÐHÈ$ÐY]ˆLÑ^Ô^Ð^Ð^Ð^ð	_øøøõ Œ\˜(Ñ#Ô#€FØñ $_ð#	_Ý”^àØØØÝ˜‘I”IØØØØØØØðð  $ØÝ Ô(ð#ñ ô ˆFð& Ô  AÒ%Ñ%¨&¬-Ñ%Ýœ+ cÑ*Ô*�Ø×!Ò! &¤-Ñ0Ô0Ð0Ý”= HÒ,Ð,Ø×$Ò$Ñ&Ô&Ð&Øð 4Ý ™LœL�EØ!�HÝ$Õ%@ÑAÔAð Mð M˜Ø # e¡Õ/JÑ J˜Ý! %¨!¡)¨c°A©g¸Ñ->ÕB]Ñ-]Ñ^Ô^˜Ý"Ð"NÐ"N¸7À5ÈÀ9Ô;MÐ"NÑ"NÔ"NÑNÔN˜Ø Ÿš­¨Dµ#°d¸U±lÀTÑ6IÑ2JÔ2JÑ(KÔ(KÑLÔLÐLÐLØ+3�H˜ZÑ(øøÝð 	_ð 	_ð 	_Ý�LŠLÐHÈ$ÐY]ˆLÑ^Ô^Ð^Ð^Ð^ð	_øøøð €Os%   šBB# Â#'CÃCÃ(EH> È>'I(É'I(rx   úOptional[str]c                ó(  — t          j        d¦  «        }|sdS ddl}|                     dd¬¦  «        \  }}t	          j        |¦  «         	 t          j        |ddd	d
t          | ¦  «        dddddddddddd|gddt          j	        ¬¦  «        }|j
        dk    r%t          j                             |¦  «        dk    r|S n-# t          $ r  t                               d| d¬¦  «         Y nw xY w	 t	          j        |¦  «         n# t"          $ r Y nw xY wdS )uz  Best-effort transcode of an audio file to Ogg/Opus for MSC3245 delivery.

    Returns the path of a NEW temporary ``.ogg`` file (caller owns cleanup), or
    ``None`` when ffmpeg is unavailable or fails â€” callers then send the
    original file, matching the adapter's previous behaviour. Runs blocking
    subprocess work; call via ``asyncio.to_thread`` from async code.
    rb   Nr   Úmatrix_voice_ú.ogg)ÚprefixÚsuffixrV   rW   z-yrc   z-acodecÚlibopusrd   re   z-b:aÚ48kz-vbrÚonz-applicationÚvoipz-compression_levelÚ10TrP   rj   z1Matrix: voice transcode to Ogg/Opus failed for %sr`   )rt   ru   ÚtempfileÚmkstempÚosÚcloserv   rw   rx   ry   rz   rQ   Úgetsizer   r€   r�   ÚunlinkÚOSError)rQ   rb   r¡   ÚfdÚogg_pathrŽ   s         r)   Ú_matrix_transcode_voice_to_oggrª   á   sj  € õ Œ\˜(Ñ#Ô#€FØð ØˆtØ€O€O€Oà×#Ò#¨?À6Ð#ÑJÔJ�L€BˆÝ„HˆR�L„L€Lð_Ý”àØØØØÝ�D‘	”	ØØØØØØØØØØØ$ØØð'ð*  ØÝÔ$ð1
ñ 
ô 
ˆð4 Ô Ò!Ð!¥b¤g§o¢o°hÑ&?Ô&?À!Ò&CÐ&CØˆOøøÝð _ð _ð _Ý�ŠÐHÈ$ÐY]ˆÑ^Ô^Ð^Ð^Ð^ð_øøøðÝ
Œ	�(ÑÔÐÐøÝð ð ð Øˆðøøøàˆ4s%   ÁA1B? Â?'C)Ã(C)Ã-D Ä
DÄDz'^!([A-Za-z][A-Za-z0-9_-]*)(?=$|\s)(.*)$Únameú
str | Nonec                óþ  — | sdS |                       ¦   «         g}|                       ¦   «                              dd¦  «        }||d         k    r|                     |¦  «         	 ddlm} |D ]} ||¦  «        r|c S Œn-# t
          $ r  t                               d| d¬¦  «         Y nw xY w	 dd	lm	}  |¦   «         pi }|D ]}d
|› �|v r|c S Œn-# t
          $ r  t                               d| d¬¦  «         Y nw xY wdS )uÐ  Resolve a ``!command`` token to a dispatchable Hermes command token.

    Matrix clients often reserve leading ``/`` for local client commands.
    Hermes accepts ``!command`` as a Matrix-friendly alias, but only for
    commands that the gateway can actually dispatch so ordinary exclamations
    remain normal chat text.

    Returns the token form that actually resolves (which may differ from
    *name* only by underscoreâ†’hyphen normalization, e.g. ``reload_skills`` â†’
    ``reload-skills``) so the emitted ``/command`` always resolves downstream,
    or ``None`` when *name* is not a known command. Aliases are intentionally
    left as-is â€” the gateway dispatcher resolves them to their canonical name.
    NÚ_rh   r   )Úis_gateway_known_commandz.Matrix: is_gateway_known_command failed for %rTr`   )Úget_skill_commandsú/z(Matrix: get_skill_commands failed for %r)
ÚlowerÚreplacer‹   Úhermes_cli.commandsr¯   r   r€   r�   Úagent.skill_commandsr°   )r«   Ú
candidatesÚ
hyphenatedr¯   Ú	candidater°   Úskill_commandss          r)   Ú_resolve_matrix_bang_commandrº     s¥  € ð ð Øˆtð
 —*’*‘,”,�€JØ—’‘”×%Ò% c¨3Ñ/Ô/€JØ�Z ”]Ò"Ð"Ø×Ò˜*Ñ%Ô%Ð%ð	
Ø@Ð@Ð@Ð@Ð@Ð@à#ð 	!ð 	!ˆIØ'Ð'¨	Ñ2Ô2ð !Ø Ð Ð Ð ð!ð	!øõ ð 
ð 
ð 
Ý�ŠØ<¸dÈTð 	ñ 	
ô 	
ð 	
ð 	
ð 	
ð
øøøð

VØ;Ð;Ð;Ð;Ð;Ð;à+Ð+Ñ-Ô-Ð3°ˆð $ð 	!ð 	!ˆIØ�9ˆˆ .Ð0Ð0Ø Ð Ð Ð ð 1ð	!øõ ð Vð Vð VÝ�ŠÐ?ÀÐPTˆÑUÔUÐUÐUÐUðVøøøð ˆ4s0   Á$A? Á=A? Á?'B)Â(B)Â- C ÃC Ã'C:Ã9C:rZ   c                óô   — | r|                       d¦  «        s| S t                               | ¦  «        }|s| S t          |                     d¦  «        ¦  «        }|€| S d|› |                     d¦  «        pd› �S )zGConvert Matrix ``!command`` aliases to normal Hermes ``/command`` text.ú!rB   Nr±   é   r]   )Ú
startswithÚ_MATRIX_BANG_COMMAND_REÚmatchrº   Úgroup)rZ   rÀ   Úresolveds      r)   Ú_normalize_matrix_bang_commandrÃ   O  s†   € àð �t—’ sÑ+Ô+ð ØˆÝ#×)Ò)¨$Ñ/Ô/€EØð ØˆÝ+¨E¯KªK¸©N¬NÑ;Ô;€HØÐØˆØ/ˆxÐ/˜Ÿš Q™œÐ-¨2Ð/Ð/Ð/r(   z^>\s*<(@[^>]+)>\s*(.*)$Úbodyú#tuple[Optional[str], Optional[str]]c                óÂ  — | r|                       d¦  «        sdS g }d}|                      d¦  «        D ]€}|                      d¦  «        s nh|dd…         }|€Ft                               |¦  «        }|r*|                     d¦  «        }|                     d¦  «        }|                     |¦  «         Œ�d                     |¦  «                             ¦   «         pd}||fS )a7  Return (reply_to_text, reply_to_author_id) parsed from a Matrix reply body.

    Matrix stores reply text inline as ``> <@user:server> <line>\n> <line>...``
    followed by a blank line and the actual reply. The first line carries an
    optional ``<@user:server>`` mention pill naming the original author.
    ú> ©NNNÚ
r½   rB   )r¾   ÚsplitÚ_MATRIX_REPLY_FALLBACK_PILL_RErÀ   rÁ   r‹   Újoinr}   )rÄ   Úquoted_linesÚ	author_idÚlineÚcontentÚ
pill_matchÚquoted_texts          r)   Ú_extract_reply_fallbackrÓ   i  sü   € ð ð �t—’ tÑ,Ô,ð Øˆzà €LØ#€IØ—
’
˜4Ñ Ô ð %ð %ˆØ�Š˜tÑ$Ô$ð 	àˆEØ�q�r�r”(ˆØÐÝ7×=Ò=¸dÑCÔCˆJØð .Ø&×,Ò,¨QÑ/Ô/�	ð %×*Ò*¨1Ñ-Ô-�Ø×Ò˜GÑ$Ô$Ð$Ð$à—)’)˜LÑ)Ô)×/Ò/Ñ1Ô1Ð9°T€KØ˜	Ð!Ð!r(   c                ó  — | r|                       d¦  «        s| S |                      d¦  «        }g }d}|D ]@}|s'|                      d¦  «        s|dk    rŒ |dk    rd}Œ)d}|                     |¦  «         ŒA|rd                     |¦  «        n| S )zÅStrip Matrix's inline ``> <text>\n\n<actual reply>`` fallback prefix.

    Returns the body without the quoted lines. If the body doesn't start
    with a reply fallback, returns it unchanged.
    rÇ   rÉ   FÚ>r]   T)r¾   rÊ   r‹   rÌ   )rÄ   ÚlinesÚstrippedÚpast_fallbackrÏ   s        r)   Ú_strip_reply_fallbackrÙ   ‡  s¼   € ð ð �t—’ tÑ,Ô,ð ØˆØ�JŠJ�tÑÔ€EØ€HØ€MØð ð ˆØð 	!Ø�Š˜tÑ$Ô$ð ¨°ª¨ØØ�rŠzˆzØ $�ØØ ˆMØ�Š˜ÑÔÐÐØ"*Ð4ˆ4�9Š9�XÑÔÐ°Ð4r(   c                  ó„   ‡ — e Zd ZdZh d£ZddhZdˆ fd„Zedd
„¦   «         Zdd„Z	dd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zˆ xZS )Ú_MatrixHtmlSanitizerz9Allowlist sanitizer for Matrix-compatible formatted HTML.>   Úar,   ÚiÚpÚsÚbrÚemÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdelÚpreÚcodeÚtableÚtbodyÚtheadÚstrikeÚstrongÚ
blockquoterà   rè   rR   ÚNonec                óh   •— t          ¦   «                              d¬¦  «         g | _        d| _        d S )NF)Úconvert_charrefsr   )ÚsuperÚ__init__Ú_partsÚ_skip_depth)ÚselfÚ	__class__s    €r)   rü   z_MatrixHtmlSanitizer.__init__¨  s3   ø€ Ý‰Œ×Ò¨%ÐÑ0Ô0Ð0Ø!#ˆŒØˆÔÐÐr(   rq   rx   c                óê   — t          j        dd| pd¦  «                             ¦   «         }t          j        d|¦  «        }|r'|                     d¦  «                             ¦   «         nd}|r|dvrdS |S )Nz[\x00-\x1f\x7f]+r]   z^([A-Za-z][A-Za-z0-9+.-]*):rB   >   ÚhttpÚhttpsÚmailtoÚmatrix)ÚreÚsubr}   rÀ   rÁ   r²   )rq   r×   rÀ   Úschemes       r)   Ú	_safe_urlz_MatrixHtmlSanitizer._safe_url­  sz   € å”6Ð-¨r°5°;¸BÑ?Ô?×EÒEÑGÔGˆÝ”Ð7¸ÑBÔBˆØ+0Ð8�—’˜Q‘”×%Ò%Ñ'Ô'Ð'°bˆØð 	�fÐ$IÐIÐIØ�2Øˆr(   ÚtagÚattrsúlist[tuple[str, str | None]]c                ó  — g }|D ]æ\  }}t          |pd¦  «                             ¦   «         }|€dnt          |¦  «        }|                     d¦  «        rŒQ|dk    rF|dk    r@|                      |¦  «        }|r(|                     dt          |d¬¦  «        › d�¦  «         Œ�|d	k    rC|d
k    r=t          j        d|¦  «        r(|                     dt          |d¬¦  «        › d�¦  «         Œçd                     |¦  «        S )Nr]   rž   rÜ   Úhrefz href="T©Úquoteú"rñ   Úclasszlanguage-[A-Za-z0-9_+.-]{1,64}z class=")	rx   r²   r¾   r	  r‹   Ú_html_escaper  Ú	fullmatchrÌ   )	rÿ   r
  r  ÚsafeÚkeyrq   ÚattrÚ	raw_valuer  s	            r)   Ú_safe_attrsz _MatrixHtmlSanitizer._safe_attrs¶  s  € ØˆØð 	Sð 	S‰JˆC�Ý�s�y˜b‘>”>×'Ò'Ñ)Ô)ˆDØ#˜m˜˜µ°U±´ˆIØ�Š˜tÑ$Ô$ð ØØ�cŠzˆz˜d fšn˜nØ—~’~ iÑ0Ô0�Øð MØ—K’KÐ K­,°tÀ4Ð*HÑ*HÔ*HÐ KÐ KÐ KÑLÔLÐLøØ˜’� 4¨7¢? ?Ý”<Ð AÀ9ÑMÔMð SØ—K’KÐ Q­<¸	ÈÐ+NÑ+NÔ+NÐ QÐ QÐ QÑRÔRÐRøØ�wŠw�t‰}Œ}Ðr(   c                ó<  — |                      ¦   «         }|dv r| xj        dz  c_        d S | j        rd S || j        vrd S || j        v r | j                             d|› d�¦  «         d S | j                             d|› |                      ||¦  «        › d�¦  «         d S )N>   ÚstyleÚscriptrB   Ú<rÕ   )r²   rþ   Ú_ALLOWED_TAGSÚ
_VOID_TAGSrý   r‹   r  )rÿ   r
  r  s      r)   Úhandle_starttagz$_MatrixHtmlSanitizer.handle_starttagÆ  sÄ   € Ø�iŠi‰kŒkˆØÐ%Ð%Ð%ØÐÔ Ñ!ÐÔØˆFØÔð 	ØˆFØ�dÔ(Ð(Ð(ØˆFØ�$”/Ð!Ð!ØŒK×Ò˜z 3˜z˜z˜zÑ*Ô*Ð*ØˆFØŒ×ÒÐC˜sÐC D×$4Ò$4°S¸%Ñ$@Ô$@ÐCÐCÐCÑDÔDÐDÐDÐDr(   c                óÚ   — |                      ¦   «         }|dv r| j        r| xj        dz  c_        d S | j        s|| j        vs	|| j        v rd S | j                             d|› d�¦  «         d S )N>   r  r  rB   z</rÕ   )r²   rþ   r  r  rý   r‹   )rÿ   r
  s     r)   Úhandle_endtagz"_MatrixHtmlSanitizer.handle_endtagÔ  s‰   € Ø�iŠi‰kŒkˆØÐ%Ð%Ð%¨$Ô*:Ð%ØÐÔ Ñ!ÐÔØˆFØÔð 	˜s¨$Ô*<Ð<Ð<ÀÀtÄÐ@VÐ@VØˆFØŒ×Ò˜; ˜;˜;˜;Ñ'Ô'Ð'Ð'Ð'r(   Údatac                óf   — | j         s)| j                             t          |¦  «        ¦  «         d S d S rn   )rþ   rý   r‹   r  )rÿ   r#  s     r)   Úhandle_dataz _MatrixHtmlSanitizer.handle_dataÝ  s;   € ØÔð 	3ØŒK×Ò�|¨DÑ1Ô1Ñ2Ô2Ð2Ð2Ð2ð	3ð 	3r(   r«   c                óT   — | j         s | j                             d|› d�¦  «         d S d S )Nú&ú;©rþ   rý   r‹   ©rÿ   r«   s     r)   Úhandle_entityrefz%_MatrixHtmlSanitizer.handle_entityrefá  s;   € ØÔð 	,ØŒK×Ò˜{ 4˜{˜{˜{Ñ+Ô+Ð+Ð+Ð+ð	,ð 	,r(   c                óT   — | j         s | j                             d|› d�¦  «         d S d S )Nz&#r(  r)  r*  s     r)   Úhandle_charrefz#_MatrixHtmlSanitizer.handle_charrefå  s;   € ØÔð 	-ØŒK×Ò˜| D˜|˜|˜|Ñ,Ô,Ð,Ð,Ð,ð	-ð 	-r(   c                ó6   — d                      | j        ¦  «        S ©Nr]   )rÌ   rý   )rÿ   s    r)   Úget_htmlz_MatrixHtmlSanitizer.get_htmlé  s   € Ø�wŠw�t”{Ñ#Ô#Ð#r(   ©rR   rø   )rq   rx   rR   rx   )r
  rx   r  r  rR   rx   )r
  rx   r  r  rR   rø   )r
  rx   rR   rø   )r#  rx   rR   rø   )r«   rx   rR   rø   ©rR   rx   )r    r!   r"   Ú__doc__r  r  rü   Ústaticmethodr	  r  r   r"  r%  r+  r-  r0  Ú__classcell__©r   s   @r)   rÛ   rÛ   ž  s  ø€ € € € € ØCÐCðð ð €Mð
 ˜�€Jðð ð ð ð ð ð
 ðð ð ñ „\ððð ð ð ð Eð Eð Eð Eð(ð (ð (ð (ð3ð 3ð 3ð 3ð,ð ,ð ,ð ,ð-ð -ð -ð -ð$ð $ð $ð $ð $ð $ð $ð $r(   rÛ   T)Úfrozenc                  ó†   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<   dZded<   dS )ÚMatrixRoomIdentityz=Resolved Matrix room identity for routing and prompt context.rx   Úroom_idr¬   Ú	room_nameÚ
room_topicÚcanonical_aliasÚserver_namez
int | NoneÚjoined_member_countÚboolÚis_direct_account_dataÚdisplay_nameÚhas_explicit_nameÚ	chat_typeFÚconflictN)r    r!   r"   r3  Ú__annotations__rE  r'   r(   r)   r9  r9  í  s›   € € € € € € àGÐGà€L€L�LØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ#Ð#Ð#Ñ#Ø Ð Ð Ñ ØÐÐÑØÐÐÑØ€N€N�NØ€HÐÐÐÑÐÐr(   r9  c                  ó"   — e Zd ZdZ	 	 	 ddd„ZdS )Ú_MatrixApprovalPromptz<Tracks a pending Matrix reaction-based exec approval prompt.FNÚsession_keyrx   Úchat_idÚ
message_idrÂ   r@  Úrequester_user_idr¬   Ú
expires_atúfloat | Nonec                óh   — || _         || _        || _        || _        || _        || _        i | _        d S rn   )rI  rJ  rK  rÂ   rL  rM  Úbot_reaction_events)rÿ   rI  rJ  rK  rÂ   rL  rM  s          r)   rü   z_MatrixApprovalPrompt.__init__  s>   € ð 'ˆÔØˆŒØ$ˆŒØ ˆŒØ!2ˆÔØ$ˆŒØ35ˆÔ Ð Ð r(   )FNN)rI  rx   rJ  rx   rK  rx   rÂ   r@  rL  r¬   rM  rN  )r    r!   r"   r3  rü   r'   r(   r)   rH  rH  þ  s>   € € € € € àFÐFð Ø(,Ø#'ð6ð 6ð 6ð 6ð 6ð 6ð 6r(   rH  c                  ó’   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
Zded<   d
Zded<   dZded<    ee	¬¦  «        Z
ded<   d
S )Ú_MatrixModelPickerPromptz;Tracks a pending Matrix reaction-based model picker prompt.rx   rJ  rK  rI  zdict[str, tuple[str, str]]Úchoicesr   Úon_model_selectedNr¬   rL  rN  rM  Fr@  rÂ   ©Údefault_factoryúdict[str, str]rP  ©r    r!   r"   r3  rF  rL  rM  rÂ   r   ÚdictrP  r'   r(   r)   rR  rR    s¡   € € € € € € àEÐEà€L€L�LØ€O€O�OØÐÐÑØ'Ð'Ð'Ñ'ØÐÐÑØ$(ÐÐ(Ð(Ð(Ñ(Ø#€JÐ#Ð#Ð#Ñ#Ø€HÐÐÐÑØ*/¨%ÀÐ*EÑ*EÔ*EÐÐEÐEÐEÑEÐEÐEr(   rR  c                  ó’   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
Zded<   d
Zded<   dZded<    ee	¬¦  «        Z
ded<   d
S )Ú_MatrixChoicePickerPromptzITracks a pending Matrix reaction-based choice picker (/reasoning, /fast).rx   rJ  rK  rI  rW  rS  r   Úon_choice_selectedNr¬   rL  rN  rM  Fr@  rÂ   rU  rP  rX  r'   r(   r)   r[  r[  #  s¡   € € € € € € àSÐSà€L€L�LØ€O€O�OØÐÐÑØÐÐÑØÐÐÑØ$(ÐÐ(Ð(Ð(Ñ(Ø#€JÐ#Ð#Ð#Ñ#Ø€HÐÐÐÑØ*/¨%ÀÐ*EÑ*EÔ*EÐÐEÐEÐEÑEÐEÐEr(   r[  i€>  iÿÿ  r~   c                ó²  — t          | di ¦  «        pi }|                     d¦  «        }|€t          j        d¦  «        }|€=	 ddlm} |                     d¦  «        }|r|j        r|j        }n# t          $ r Y nw xY w|€t          S 	 t          |¦  «        }n# t          t          f$ r
 t          cY S w xY wt          dt          |t          ¦  «        ¦  «        S )	zAResolve outbound chunk size from config, env, or plugin registry.ÚextraÚmax_message_lengthNÚMATRIX_MAX_MESSAGE_LENGTHr   )Úplatform_registryr  iô  )ÚgetattrÚgetr£   ÚgetenvÚgateway.platform_registryra  r_  r   ÚDEFAULT_MAX_MESSAGE_LENGTHr~   Ú	TypeErrorÚ
ValueErrorrŠ   rŒ   Ú!MATRIX_MAX_MESSAGE_LENGTH_CEILING)Úconfigr^  Úrawra  Úentryrq   s         r)   Ú_resolve_max_message_lengthrm  9  s  € å�F˜G RÑ(Ô(Ð.¨B€EØ
�)Š)Ð(Ñ
)Ô
)€CØ
€{ÝŒiÐ3Ñ4Ô4ˆØ
€{ð	ØCÐCÐCÐCÐCÐCà%×)Ò)¨(Ñ3Ô3ˆEØð /˜Ô1ð /ØÔ.�øøÝð 	ð 	ð 	ØˆDð	øøøà
€{Ý)Ð)ð*Ý�C‘”ˆˆøÝ•zÐ"ð *ð *ð *Ý)Ð)Ð)Ð)ð*øøøåˆs•C˜Õ@ÑAÔAÑBÔBÐBs$   Á+A. Á.
A;Á:A;ÂB ÂB3Â2B3)Úget_hermes_dirzplatforms/matrix/storezmatrix/storez	crypto.dbé   z6(?<![\w/])(@[0-9A-Za-z._=/-]+:[0-9A-Za-z.-]+(?::\d+)?)z^Install with: pip install 'mautrix[encryption]' asyncpg aiosqlite  (requires libolm C library)>
   ú.bmpú.svgú.avifú.heicú.heifú.jpegú.gifú.jpgú.pngú.webp)
u   1ï¸�âƒ£u   2ï¸�âƒ£u   3ï¸�âƒ£u   4ï¸�âƒ£u   5ï¸�âƒ£u   6ï¸�âƒ£u   7ï¸�âƒ£u   8ï¸�âƒ£u   9ï¸�âƒ£u   ðŸ”Ÿ)u   ðŸ…°ï¸�u   ðŸ…±ï¸�Úyeszoff / optional / required)rZ   ÚthreadsÚ	reactionsÚ	approvalsúmodel pickerzthinking panesÚimageszmultiple imagesÚfileszvoice/audioÚvideoÚE2EEÚdiagnosticsúDict[str, str]Ú_MATRIX_CAPABILITIESc                 ó*   — t          t          ¦  «        S )z?Return Matrix gateway capabilities for docs and release checks.)rY  r…  r'   r(   r)   Úget_matrix_capabilitiesr‡  š  s   € åÕ$Ñ%Ô%Ð%r(   r@  c                ó„  — t          | pd¦  «                             ¦   «         }|rd|v s|                     d¦  «        rdS t          |¦  «        j        }|r||k    rdS t          |¦  «        j                             ¦   «         }|sdS t          j        |¦  «        \  }}|r| 	                    d¦  «        rdS |t          v S )a5  Return True when Matrix image body text is probably just a transport filename.

    Matrix ``m.image`` events commonly populate ``content.body`` with the uploaded
    filename when the user did not add a caption. Treating that raw filename as
    user-authored text confuses downstream vision enrichment.
    r]   rÉ   r±   Fúimage/T)rx   r}   Úendswithr   r«   r›   r²   Ú	mimetypesÚ
guess_typer¾   Ú_MATRIX_IMAGE_FILENAME_EXTS)rZ   r¸   r«   r›   Úguessed_typer®   s         r)   Ú!_looks_like_matrix_image_filenamer�  Ÿ  s×   € õ �D�J˜B‘”×%Ò%Ñ'Ô'€IØð ˜ 	Ð)Ð)¨Y×-?Ò-?ÀÑ-DÔ-DÐ)Øˆuå�	‰?Œ?Ô€DØð �4˜9Ò$Ð$Øˆuå�$‰ZŒZÔ×$Ò$Ñ&Ô&€FØð ØˆuåÔ*¨4Ñ0Ô0�O€L�!Øð ˜×/Ò/°Ñ9Ô9ð ØˆtØÕ0Ð0Ð0r(   Úeventr   r{   c                ó¾   — t          | dd¦  «        pt          | dd¦  «        pd}|sdS 	 t          |¦  «        }n# t          t          f$ r Y dS w xY w|dk    r|dz  S |S )zGReturn a Matrix event timestamp in seconds, accepting ms or sec values.Ú	timestampNÚserver_timestampr   ç        l    d(	 g     @�@)rb  r{   rg  rh  )r�  Úraw_tsÚtss      r)   Ú_matrix_event_timestamp_secondsr—  ¸  s™   € õ 	��{ DÑ)Ô)ð 	Ý�5Ð,¨dÑ3Ô3ð	àð ð
 ð ØˆsðÝ�6‰]Œ]ˆˆøÝ•zÐ"ð ð ð Øˆsˆsðøøøð 
ˆNÒÐØ�F‰{ÐØ€Is   ª: ºAÁAÚ	proxy_urlc                óÌ  — ddl }| s|                     d¬¦  «        S |                      d¦  «        d                              ¦   «                              d¦  «        rs	 ddlm} |                     |                     | d¬¦  «        ¬	¦  «        S # t          $ r4 t           
                    d
| ¦  «         |                     d¬¦  «        cY S w xY w|                     | ¬¦  «        S )a  Create an ``aiohttp.ClientSession`` whose proxy applies to *all* requests.

    mautrix's ``HTTPAPI._send()`` calls ``session.request()`` without forwarding
    per-request ``proxy=`` kwargs.  For HTTP(S) proxies we use aiohttp's native
    ``proxy=`` session parameter which sets a default for every request.  For SOCKS
    we use ``aiohttp_socks.ProxyConnector`` (connector-level).
    When no proxy is configured we enable ``trust_env`` so standard env vars
    (``HTTP_PROXY`` / ``HTTPS_PROXY``) are honoured automatically.
    r   NT)Ú	trust_envz://Úsocks)ÚProxyConnector)Úrdns)Ú	connectoruV   aiohttp_socks not installed â€” SOCKS proxy %s ignored. Run: pip install aiohttp-socks)Úproxy)ÚaiohttpÚClientSessionrÊ   r²   r¾   Úaiohttp_socksrœ  Úfrom_urlÚImportErrorr€   Úwarning)r˜  r   rœ  s      r)   Ú_create_matrix_sessionr¦  Ì  s  € ð €N€N€Nàð 5Ø×$Ò$¨tÐ$Ñ4Ô4Ð4à‡‚�uÑÔ˜aÔ ×&Ò&Ñ(Ô(×3Ò3°GÑ<Ô<ð 9ð	9Ø4Ð4Ð4Ð4Ð4Ð4à×(Ò(Ø(×1Ò1°)À$Ð1ÑGÔGð )ñ ô ð øõ ð 	9ð 	9ð 	9Ý�NŠNð1àñô ð ð
 ×(Ò(°4Ð(Ñ8Ô8Ð8Ð8Ð8ð	9øøøð × Ò  yÐ Ñ1Ô1Ð1s   Á0B Â;CÃCc                 ó`   — 	 ddl m}  ddlm} ddl}ddl}dS # t          t          f$ r Y dS w xY w)u[  Return True if mautrix E2EE dependencies are available.

    Verifies python-olm (via mautrix.crypto.OlmMachine), the SQLite crypto
    store backend (mautrix.crypto.store.asyncpg.PgCryptoStore â€” yes, the
    PgCryptoStore class also drives the sqlite backend in mautrix 0.21),
    and the database drivers actually used at connect time (``asyncpg`` for
    the underlying upgrade_table machinery, ``aiosqlite`` for the
    ``sqlite:///`` URL we pass to ``Database.create``).  Without all four,
    encrypted rooms fail at connect time with a confusing
    ``No module named 'asyncpg'`` (#31116).
    r   ©Ú
OlmMachine©ÚPgCryptoStoreNTF)Úmautrix.cryptor©  Úmautrix.crypto.store.asyncpgr«  ÚasyncpgÚ	aiosqliter¤  ÚAttributeError)r©  r«  r®  r¯  s       r)   Ú_check_e2ee_depsr±  í  sl   € ðØ-Ð-Ð-Ð-Ð-Ð-Ø>Ð>Ð>Ð>Ð>Ð>ØˆˆˆØÐÐÐàˆtøÝ�Ð(ð ð ð Øˆuˆuðøøøs   ‚ ˜-¬-rq   c                óˆ   — t          | pd¦  «                             ¦   «                              ¦   «         }|dv rdS |dv rdS dS )z4Normalize Matrix E2EE mode to off/optional/required.r]   )ÚrequiredÚrequireÚtruere   rz  rž   r³  )ÚoptionalÚpreferÚ	preferredr¶  Úoff)rx   r}   r²   )rq   rk  s     r)   Ú_normalize_e2ee_moderº    sR   € å
ˆeˆk�rÑ
Ô
×
 Ò
 Ñ
"Ô
"×
(Ò
(Ñ
*Ô
*€CØ
Ð?Ð?Ð?ØˆzØ
Ð1Ð1Ð1ØˆzØˆ5r(   r^  úOptional[Dict[str, Any]]c                ó  — | pi } |                       d¦  «        pt          j        dd¦  «        }|rt          |¦  «        S |                       dt          j        dd¦  «                             ¦   «         dv ¦  «        }|rdndS )	zAResolve E2EE mode with MATRIX_ENCRYPTION backwards compatibility.Ú	e2ee_modeÚMATRIX_E2EE_MODEr]   Ú
encryptionÚMATRIX_ENCRYPTION©rµ  re   rz  r³  r¹  )rc  r£   rd  rº  r²   )r^  ÚexplicitÚlegacy_enableds      r)   Ú_resolve_e2ee_moderÄ    s�   € àˆK�R€EØ�yŠy˜Ñ%Ô%ÐJ­¬Ð3EÀrÑ)JÔ)J€HØð .Ý# HÑ-Ô-Ð-Ø—Y’YØÝ
Œ	Ð% rÑ*Ô*×0Ò0Ñ2Ô2Ð6JÐJñô €Nð (Ð2ˆ:ˆ:¨UÐ2r(   c                óT   — t          | pd¦  «                             ¦   «         }|sdS dS )z=Return a safe, non-reversible preview for Matrix diagnostics.r]   ú***©rx   r}   )rq   rZ   s     r)   Ú_redact_matrix_valuerÈ    s1   € åˆuˆ{˜ÑÔ×!Ò!Ñ#Ô#€DØð ØˆrØˆ5r(   Úrecovery_keyúOptional[Path]c                ón  — t          j        dd¦  «                             ¦   «         }|sdS t          |¦  «                             ¦   «         }|j                             dd¬¦  «         t           j        t           j        z  t           j	        z  }t          j
        ||d¦  «        }	 t          j        |dd¬	¦  «        5 }|                     | ¦  «         |                     d
¦  «         ddd¦  «         n# 1 swxY w Y   n5# t          $ r( 	 t          j        |¦  «         n# t          $ r Y nw xY w‚ w xY w|S )z¸Write a generated Matrix recovery key to an operator-chosen file.

    The file is created with mode 0600 and never overwritten. Returns the path
    when written, otherwise None.
    ÚMATRIX_RECOVERY_KEY_OUTPUT_FILEr]   NT©ÚparentsÚexist_oki€  Úwzutf-8)ÚencodingrÉ   )r£   rd  r}   r   Ú
expanduserÚparentÚmkdirÚO_WRONLYÚO_CREATÚO_EXCLÚopenÚfdopenÚwriter   r¤   r§   )rÉ  Úoutput_filerQ   Úflagsr¨   Úfhs         r)   Ú&_write_matrix_recovery_key_output_filerÞ  #  sv  € õ ”)Ð=¸rÑBÔB×HÒHÑJÔJ€KØð ØˆtÝ�ÑÔ×'Ò'Ñ)Ô)€DØ„K×Ò˜d¨TÐÑ2Ô2Ð2ÝŒK�"œ*Ñ$¥r¤yÑ0€EÝ	Œ��u˜eÑ	$Ô	$€Bð	ÝŒY�r˜3¨Ð1Ñ1Ô1ð 	°RØ�HŠH�\Ñ"Ô"Ð"Ø�HŠH�T‰NŒNˆNð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð ð ð ð	ÝŒH�R‰LŒLˆLˆLøÝð 	ð 	ð 	ØˆDð	øøøàðøøøð €KsT   Â&D  Â=+C4Ã(D  Ã4C8Ã8D  Ã;C8Ã<D  Ä 
D2ÄD ÄD2Ä 
D-Ä*D2Ä,D-Ä-D2útuple[Optional[Path], str]c                 óF  — t          j        dd¦  «                             ¦   «         } | sdS t          | ¦  «                             ¦   «         }|                     ¦   «         rdS 	 |j                             dd¬¦  «         n# t          $ r}dd|› �fcY d}~S d}~ww xY w|dfS )	zHReturn a usable one-time recovery-key output path, or a redacted reason.rÌ  r]   )NÚnot_configured)NÚexistsTrÍ  Nz
unusable: )	r£   rd  r}   r   rÒ  râ  rÓ  rÔ  r   )rÛ  rQ   Úexcs      r)   Ú&_get_matrix_recovery_key_output_targeträ  =  sÊ   € å”)Ð=¸rÑBÔB×HÒHÑJÔJ€KØð &Ø%Ð%Ý�ÑÔ×'Ò'Ñ)Ô)€DØ‡{‚{�}„}ð Øˆ~ð(ØŒ×Ò $°ÐÑ6Ô6Ð6Ð6øÝð (ð (ð (ØÐ' #Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð(øøøà�ˆ8€Os   Á$B Â
BÂBÂBÂBÚmxidrø   c                óT  — 	 t          |¦  «        }n[# t          $ r t                               d| ¦  «         Y dS t          $ r'}t                               d| |¦  «         Y d}~dS d}~ww xY w|rt                               d| |¦  «         dS t                               d| ¦  «         dS )zBHandle a freshly generated Matrix recovery key without logging it.z¼Matrix: bootstrapped cross-signing for %s. Recovery key output file already exists; refusing to overwrite. Store the generated key securely and set MATRIX_RECOVERY_KEY for future restarts.NzµMatrix: bootstrapped cross-signing for %s, but failed to write MATRIX_RECOVERY_KEY_OUTPUT_FILE: %s. Store the generated key securely and set MATRIX_RECOVERY_KEY for future restarts.z­Matrix: bootstrapped cross-signing for %s. A new recovery key was written to %s with mode 0600. Move it to your secret store and set MATRIX_RECOVERY_KEY for future restarts.zùMatrix: bootstrapped cross-signing for %s. A new recovery key was generated but will not be logged. Set MATRIX_RECOVERY_KEY_OUTPUT_FILE to write it once with mode 0600, or configure MATRIX_RECOVERY_KEY from your Matrix client before future restarts.)rÞ  ÚFileExistsErrorr€   r¥  r   )rå  rÉ  Úoutput_pathrã  s       r)   Ú%_handle_generated_matrix_recovery_keyré  L  s  € ðÝ<¸\ÑJÔJˆˆøÝð ð ð Ý�ŠðHð ñ		
ô 	
ð 	
ð 	ˆˆÝð ð ð Ý�ŠðHð Øñ	
ô 	
ð 	
ð 	ˆˆˆˆˆøøøøðøøøð ð 
Ý�Šð7ð Øñ	
ô 	
ð 	
ð 	
ð 	
õ 	�Šð>ð ñ	
ô 	
ð 	
ð 	
ð 	
s   ‚ ’%A*º	A*ÁA%Á%A*c                 ó¸   — 	 t          d¦  «        pd                     ¦   «         S # t          $ r* t          j        dd¦  «                             ¦   «         cY S w xY w)uµ  Resolve MATRIX_RECOVERY_KEY honoring the active profile's secret scope.

    Under ``gateway.multiplex_profiles`` the secret scope holds the secondary
    profile's credentials, while ``os.environ`` may carry the default profile's
    key â€” so a bare ``os.getenv`` resolves the wrong key and E2EE verification
    fails with "Key MAC does not match" (#69090). We read through
    :func:`get_secret`, which is scope-aware. An *unscoped* read under multiplex
    (e.g. the default-profile startup loop) raises ``UnscopedSecretError``; in
    that context ``os.environ`` is that profile's own value, so we fall back to
    it â€” mirroring the established Slack app-token pattern (#59739).
    ÚMATRIX_RECOVERY_KEYr]   ©r   r}   r   r£   rd  r'   r(   r)   Ú_scoped_recovery_keyrí  t  sg   € ð<ÝÐ0Ñ1Ô1Ð7°R×>Ò>Ñ@Ô@Ð@øÝð <ð <ð <ÝŒyÐ.°Ñ3Ô3×9Ò9Ñ;Ô;Ð;Ð;Ð;ð<øøøó   ‚"% ¥1AÁAÚhtmlc                óà   — t          ¦   «         }	 |                     | pd¦  «         |                     ¦   «          |                     ¦   «         S # t          $ r t          | pd¦  «        cY S w xY wr/  )rÛ   Úfeedr¤   r0  r   r  )rï  Ú	sanitizers     r)   Ú_sanitize_matrix_htmlró  †  s}   € Ý$Ñ&Ô&€Ið(Ø�Š�t�z˜rÑ"Ô"Ð"Ø�ŠÑÔÐØ×!Ò!Ñ#Ô#Ð#øÝð (ð (ð (Ý˜D˜J BÑ'Ô'Ð'Ð'Ð'ð(øøøs   �>A ÁA-Á,A-Úurlc                óF  — 	 t          t          | ¦  «        ¦  «        }|j        sJ|j        sCt          | ¦  «                             dd¦  «        d                              dd¦  «        d         S t          |j        |j        |j        ddf¦  «        S # t          $ r Y dS w xY w)zAStrip query/fragment from URLs before logging signed media links.ú?rB   r   ú#r]   z<url>)r   rx   r  ÚnetlocrÊ   r   rQ   r   )rô  Úpartss     r)   Ú_redact_url_for_logrú  �  s¢   € ðÝ�˜S™œÑ"Ô"ˆØŒ|ð 	> E¤Lð 	>Ý�s‘8”8—>’> # qÑ)Ô)¨!Ô,×2Ò2°3¸Ñ:Ô:¸1Ô=Ð=Ý˜5œ<¨¬°u´zÀ2ÀrÐJÑKÔKÐKøÝð ð ð Øˆwˆwðøøøs   ‚A,B Á/"B Â
B ÂB c                óŽ   — t          j        dd| pd¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }|S )z@Remove unsafe raw HTML before Markdown conversion can escape it.z0(?is)<\s*(script|style)\b[^>]*>.*?<\s*/\s*\1\s*>r]   z5(?is)\s+on[a-z0-9_-]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)zš(?is)\s+(href|src)\s*=\s*("[^"]*(?:javascript|data|vbscript):[^"]*"|'[^']*(?:javascript|data|vbscript):[^']*'|[^\s>]*(?:javascript|data|vbscript):[^\s>]*)©r  r  )rZ   rŽ   s     r)   Ú_pre_sanitize_matrix_markdownrý  ›  sb   € åŒVØ;Ø
Øˆ
�ñô €Fõ
 ŒVØDØ
Øñô €Fõ
 ŒVð 	jØ
Øñô €Fð
 €Mr(   c                ó¸   — 	 t          | ¦  «        pd                     ¦   «         S # t          $ r* t          j        | d¦  «                             ¦   «         cY S w xY w)uk  Read a Matrix credential at adapter-startup time, scope-aware.

    Slack pattern (#59739): a scoped read honors the installed profile's
    secret scope verdict (scoped miss â‡’ empty, no borrowing the process
    env); only an UNSCOPED read under multiplex (default-profile startup
    loop) falls back to ``os.environ``, which is that profile's own value.
    r]   rì  )r«   s    r)   Ú_startup_env_secretrÿ  ¯  se   € ð+Ý˜4Ñ Ô Ð& B×-Ò-Ñ/Ô/Ð/øÝð +ð +ð +ÝŒy˜˜rÑ"Ô"×(Ò(Ñ*Ô*Ð*Ð*Ð*ð+øøørî  c                 óH   — 	 ddl m}   | d¦  «        S # t          $ r Y dS w xY w)ue  PASSIVE probe: are the ``platform.matrix`` packages installed?

    Registry ``check_fn`` â€” called from status displays and config loading,
    so it must never install anything.  The ACTIVE lazy-installer
    (``check_matrix_requirements``) is registered as ``ensure_deps_fn``
    and runs from ``create_adapter()`` when this returns False (#79812).
    r   ©Úis_availableúplatform.matrixF)Útools.lazy_depsr  r   r  s    r)   Úmatrix_deps_presentr  ½  sL   € ðØ0Ð0Ð0Ð0Ð0Ð0Øˆ|Ð-Ñ.Ô.Ð.øÝð ð ð Øˆuˆuðøøøs   ‚ “
! !c                 ó   — t          d¦  «        } t          d¦  «        }t          j        dd¦  «        }| s|st                               d¦  «         dS |st                               d¦  «         dS t          ¦   «         S )u™  Return True if the Matrix adapter can be used.

    Combined credentials + deps answer for setup/status callers.  The
    registry's ``ensure_deps_fn`` is the deps-only
    :func:`ensure_matrix_deps` below â€” credentials must NOT gate the
    installer (they're handled by ``is_connected``, which also accepts
    ``PlatformConfig.extra``-configured setups that these env checks
    would wrongly veto).
    ÚMATRIX_ACCESS_TOKENÚMATRIX_PASSWORDÚMATRIX_HOMESERVERr]   z;Matrix: neither MATRIX_ACCESS_TOKEN nor MATRIX_PASSWORD setFz!Matrix: MATRIX_HOMESERVER not set)rÿ  r£   rd  r€   r�   r¥  Úensure_matrix_deps)ÚtokenÚpasswordÚ
homeservers      r)   Úcheck_matrix_requirementsr  Ì  s…   € õ  Ð 5Ñ6Ô6€EÝ"Ð#4Ñ5Ô5€HÝ”Ð.°Ñ3Ô3€Jàð ˜ð Ý�ŠÐRÑSÔSÐSØˆuØð Ý�ŠÐ:Ñ;Ô;Ð;ØˆuåÑÔÐr(   c                 ó@  — 	 ddl m} m}  | d¦  «        }n6# t          $ r)}t                               d|¦  «         d}d}Y d}~nd}~ww xY w|s|€Vd„ }|€dS  |d|t          ¦   «         d¬	¦  «        s4t                               d
|rd                     |¦  «        nd¦  «         dS t          ¦   «         }|dk    r0t          ¦   «         s"t                               dt          ¦  «         dS |dk    r.t          ¦   «         s t                               dt          ¦  «         dS )u#  ACTIVE deps-only installer (registry ``ensure_deps_fn``).

    Lazy-installs the full ``platform.matrix`` feature group via
    ``tools.lazy_deps.ensure_and_bind`` whenever any of the declared
    packages (mautrix, Markdown, aiosqlite, asyncpg, aiohttp-socks) is
    missing â€” not just mautrix itself.  Previously this short-circuited on
    ``import mautrix``, which left the other four packages uninstalled
    forever and broke E2EE connect with ``No module named 'asyncpg'``
    (#31116).  Rebinds module-level type globals on success.
    r   )Úfeature_missingÚensure_and_bindr  z#Matrix: lazy_deps lookup failed: %sr'   Nc                 óL   — ddl m} m}m}m}m}m}m}m}m	}m
}	 | |||||||||	dœ
S )Nr   r   )Úmautrix.typesr   r   r   r   r   r   r   r   r   r   r   s
             r)   Ú_importz#ensure_matrix_deps.<locals>._importü  s©   € ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð )Ø"Ø&Ø':Ø!.Ø$4Ø Ø&Ø(Ø ðð ð r(   F©Úpromptz}Matrix: required packages not installed (%s). Run: pip install 'mautrix[encryption]' asyncpg aiosqlite Markdown aiohttp-socksz, r³  z‘Matrix: E2EE is required but dependencies are missing. %s. Without this, encrypted rooms will not work. Set MATRIX_E2EE_MODE=off to disable E2EE.r¶  z6Matrix: E2EE optional but dependencies are missing. %sT)r  r  r  r   r€   r�   Úglobalsr¥  rÌ   rÄ  r±  rW   Ú_E2EE_INSTALL_HINT)r  r  Úmissingrã  r  r½  s         r)   r
  r
  ä  s…  € ðØDÐDÐDÐDÐDÐDÐDÐDØ!�/Ð"3Ñ4Ô4ˆˆøÝð ð ð Ý�ŠÐ:¸CÑ@Ô@Ð@ØˆØˆˆˆˆˆˆøøøøðøøøð
 ð �/Ð)ð	ð 	ð 	ð& Ð"Ø�5ØˆÐ0°'½7¹9¼9ÈUÐSÑSÔSð 	Ý�NŠNð)ð '.ÐD�—	’	˜'Ñ"Ô"Ð"Ð3Dñ	ô ð ð �5å"Ñ$Ô$€IØ�JÒÐÕ'7Ñ'9Ô'9ÐÝ�Šð8õ ñ		
ô 	
ð 	
ð ˆuØ�JÒÐÕ'7Ñ'9Ô'9ÐÝ�ŠØDÝñ	
ô 	
ð 	
ð
 ˆ4s   ‚ –
A	 AÁA	c                  ó4   — e Zd ZdZddd„Zdd„Zdd„Zdd„ZdS )Ú_CryptoStateStorea×  Adapter that satisfies the mautrix crypto StateStore interface.

    OlmMachine requires a StateStore with ``is_encrypted``,
    ``get_encryption_info``, and ``find_shared_rooms``.  The basic
    ``MemoryStateStore`` from ``mautrix.client`` doesn't implement these,
    so we provide simple implementations that consult the client's room
    state, falling back to a direct homeserver state event query when
    the in-memory store has no encryption info for a room.
    NÚclient_state_storer   Újoined_roomsÚsetc                ó>   — || _         || _        || _        i | _        d S rn   )Ú_ssÚ_joined_roomsÚ_clientÚ_enc_info_cache)rÿ   r  r  Úclients       r)   rü   z_CryptoStateStore.__init__7  s(   € Ø%ˆŒØ)ˆÔØˆŒð
 &(ˆÔÐÐr(   r:  rx   rR   r@  c              ƒ  ó@   K  — |                       |¦  «        ƒ d {V —†d uS rn   )Úget_encryption_info©rÿ   r:  s     r)   Úis_encryptedz_CryptoStateStore.is_encryptedA  s1   è è € Ø×.Ò.¨wÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7ÀÐDÐDr(   c              ƒ  óê  K  — d }t          | j        d¦  «        r | j                             |¦  «        ƒ d {V —†}|�|S || j        v r| j        |         S | j        }|€d S 	 ddlm}m}m} | 	                     ||¦  «        |j
        ¦  «        ƒ d {V —†}n4# t          $ r'}t                               d||¦  «         Y d }~d S d }~ww xY w|sd S t          ||¦  «        r|n8|                     t          |d¦  «        r|                     ¦   «         n|¦  «        }	t          | j        d¦  «        r<	 | j                              ||¦  «        |	¦  «        ƒ d {V —† n# t          $ r Y nw xY w|	| j        |<   |	S )Nr&  r   )r   ÚRoomEncryptionStateEventContentr   z:Matrix: homeserver encryption-info query failed for %s: %sÚ	serializeÚset_encryption_info)Úhasattrr   r&  r#  r"  r  r   r*  r   Úget_state_eventÚROOM_ENCRYPTIONr   r€   r�   Ú
isinstanceÚdeserializer+  r,  )
rÿ   r:  Úinfor$  Ú_ETÚ_EncÚ_RIDrk  rã  rÐ   s
             r)   r&  z%_CryptoStateStore.get_encryption_infoD  s  è è € ØˆÝ�4”8Ð2Ñ3Ô3ð 	?Øœ×5Ò5°gÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ˆDØÐØˆKà�dÔ*Ð*Ð*ØÔ'¨Ô0Ð0Ø”ˆØˆ>Ø�4ð	ðð ð ð ð ð ð ð ð ð ð
 ×.Ò.¨t¨t°G©}¬}¸cÔ>QÑRÔRÐRÐRÐRÐRÐRÐRˆCˆCøÝð 	ð 	ð 	Ý�LŠLØLØØñô ð ð
 �4�4�4�4�4øøøøð	øøøð ð 	Ø�4Ý# C¨Ñ.Ô.ð 
�#�#°D×4DÒ4DÝ& s¨KÑ8Ô8ÐAˆC�MŠM‰OŒOˆO¸cñ5
ô 5
ˆõ �4”8Ð2Ñ3Ô3ð 	ðØ”h×2Ò2°4°4¸±=´=À'ÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJøÝð ð ð Ø�ðøøøà(/ˆÔ˜WÑ%Øˆs*   Á 4B Â
CÂCÃCÄ.*E Å
E&Å%E&Úuser_idÚlistc              ƒ  ó.   K  — t          | j        ¦  «        S rn   )r7  r!  )rÿ   r6  s     r)   Úfind_shared_roomsz#_CryptoStateStore.find_shared_roomsk  s   è è € å�DÔ&Ñ'Ô'Ð'r(   rn   )r  r   r  r  ©r:  rx   rR   r@  )r:  rx   )r6  rx   rR   r7  )r    r!   r"   r3  rü   r(  r&  r9  r'   r(   r)   r  r  ,  sx   € € € € € ðð ð(ð (ð (ð (ð (ðEð Eð Eð Eð%ð %ð %ð %ðN(ð (ð (ð (ð (ð (r(   r  c                  ó  ‡ — e Zd ZdZdZdZdZeZedz
  Z	dãˆ fd„Z
däd
„Zedäd„¦   «         Zedäd„¦   «         Zedåd„¦   «         Zdæd„Zdçd„Zdèd„Zdéd„Zdêd „Zd!d"œdëd$„Zdìd%„Z	 	 dídîd-„Zdïd/„Zdðd0„Z	 dñdòd1„Zdód2„Zd!d3œdôd6„Z	 	 	 dõdöˆ fd9„Zd÷d<„Z	 	 	 dõdød>„Z	 	 dùdúdD„Z 	 	 	 	 dûdüdG„Z!	 	 	 dõdýdI„Z"	 	 	 dõdþdK„Z#dLZ$dMZ%	 	 	 	 	 dÿ�d dV„Z&	 dñ�dd[„Z'	 dñ�dd^„Z(�dd_„Z)	 	 	 	 	 �d�ddh„Z*	 	 	 	 	 �d�ddi„Z+dìdj„Z,�ddl„Z-�d	dn„Z.e�d	do„¦   «         Z/�d	dp„Z0�d
dq„Z1�d
dr„Z2�ddt„Z3�dd{„Z4�dd}„Z5�dd~„Z6�dd„Z7�d
d€„Z8d!d�d‚œ�dd…„Z9�dd†„Z:�ddˆ„Z;	 �d�dd‹„Z<	 �d�ddŒ„Z=�ddŽ„Z>�dd‘„Z?�dd’„Z@�dd”„ZA�dd—„ZB�dd™„ZC�dd›„ZD�dd�„ZE�ddž„ZF�ddŸ„ZG�dd „ZH�dd¡„ZI�dd£„ZJ�dd¤„ZK�d d¥„ZL	 �d�d!d¦„ZM	 	 	 	 	 �d"�d#d­„ZN�d$d¯„ZO	 	 �d%�d&dµ„ZP�d'd·„ZQ eRd¸¦  «        ZS�d(�d)d¼„ZT�d*d½„ZUe�d+d¾„¦   «         ZV�d,dÀ„ZW�d-dÁ„ZX�d-dÂ„ZY�d-dÃ„ZZe�d-dÄ„¦   «         Z[�d.dÇ„Z\d!dÈœ�d/dÊ„Z]�d
dË„Z^dìdÌ„Z_�d0dÍ„Z`�d1�d2dÏ„Zad&d&dÐœ�d3dÒ„Zb�d4dÔ„Zc�d5dÕ„Zd�d6dÖ„Ze�d7dØ„Zf	 	 dí�d8dÛ„Zg�d9dÜ„Zh�d:dÝ„Zi�d;dß„Zj�d6dà„Zke�d<dá„¦   «         Zle�d6dâ„¦   «         Zmˆ xZnS (=  ÚMatrixAdapterz,Gateway adapter for Matrix (any homeserver).Tr¼   éd   rj  rF   c           	     ó‚  •— t          ¦   «                              |t          j        ¦  «         t	          |¦  «        | _        | j        | _        t          d| j        dz
  ¦  «        | _        |j	         
                    dd¦  «        pt          j        dd¦  «                             d¦  «        | _        |j        pt!          d¦  «        | _        |j	         
                    dd¦  «        pt          j        dd¦  «        | _        |j	         
                    d	d¦  «        pt!          d
¦  «        | _        t)          |j	        ¦  «        | _        | j        dk    | _        |j	         
                    dd¦  «        pt          j        dd¦  «        | _        d| _        d | _        d | _        d | _        i | _        d| _        d| _        d| _        d| _         d| _!        d| _"        i | _#        i | _$        i | _%        	 tM          t          j        dd¦  «        ¦  «        | _'        n# tP          $ r
 d| _'        Y nw xY wd| _)        tU          ¦   «         | _+        ddl,m-}  |d¬¦  «        | _.        tU          ¦   «         | _/        ta          d¦  «        | _1        |  2                    |¦  «        | _3        |  4                    |¦  «        | _5        |j	         
                    d¦  «        }|€t          j        dd¦  «        }tm          |tn          ¦  «        rd„ |D ¦   «         | _8        n1d„ ts          |¦  «         :                    d¦  «        D ¦   «         | _8        |j	         
                    d¦  «        }|€t          j        dd¦  «        }tm          |tn          ¦  «        rd „ |D ¦   «         | _;        n1d!„ ts          |¦  «         :                    d¦  «        D ¦   «         | _;        t          j        d"d#¦  «         <                    ¦   «         d$v | _=        t          j        d%d&¦  «         <                    ¦   «         d$v | _>        t          j        d'd#¦  «         <                    ¦   «         d(v | _?        t          j        d)d#¦  «         <                    ¦   «         d$v | _@        t          j        d*d+¦  «         A                    ¦   «          <                    ¦   «         }|d,v r|nd+| _B        t          j        d-d#¦  «         <                    ¦   «         d$v | _C        t          j        d.d&¦  «         <                    ¦   «         d/v| _D        i | _E        d0| _F        tU          ¦   «         | _G        t‘          d1¬2¦  «        | _I        | jI        r t”           K                    d3| jI        ¦  «         	 t™          t          j        d4ts          d5¦  «        ¦  «        ¦  «        | _M        n# tP          $ r
 d5| _M        Y nw xY wtM          t          j        d6d7¦  «        ¦  «        | _N        tM          t          j        d8d9¦  «        ¦  «        | _O        i | _P        i | _Q        d:d;d<d<d<d<d=d=d>œ| _R        i | _S        i | _T        t          j        d?d&¦  «         <                    ¦   «         d$v | _U        	 t™          t          j        d@dA¦  «        ¦  «        | _V        n# tP          $ r
 dB| _V        Y nw xY wi | _W        i | _X        t          j        dCd¦  «        }dD„ | :                    d¦  «        D ¦   «         | _Y        tU          | j;        ¦  «        | _Z        t          j        dEd¦  «        }g | _[        dF„ | :                    d¦  «        D ¦   «         D ]g}	 | j[         \                    t»          j^        |¦  «        ¦  «         Œ0# tº          j_        $ r&}	t”           `                    dG||	¦  «         Y d }	~	Œ`d }	~	ww xY wd S )HNr=  r  r]   r	  r±   r  r6  ÚMATRIX_USER_IDr  r  r¹  Ú	device_idÚMATRIX_DEVICE_IDFr”  r   Ú MATRIX_ROOM_IDENTITY_TTL_SECONDSÚ60g      N@é   )Údequer^   )Úmaxlenr  Úfree_response_roomsÚMATRIX_FREE_RESPONSE_ROOMSc                ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES r'   rÇ  ©rp   Úrs     r)   ú	<setcomp>z)MatrixAdapter.__init__.<locals>.<setcomp>Ð  sI   € ð *ð *ð *Ø#$½#¸a¹&¼&¿,º,¹.¼.ð*Ý�A‘”—’‘”ð*ð *ð *r(   c                ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S r'   ©r}   rJ  s     r)   rL  z)MatrixAdapter.__init__.<locals>.<setcomp>Ô  s=   € ð *ð *ð *ØÀQÇWÂWÁYÄYð*Ø—’‘	”	ð*ð *ð *r(   Ú,Úallowed_roomsÚMATRIX_ALLOWED_ROOMSc                ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES r'   rÇ  rJ  s     r)   rL  z)MatrixAdapter.__init__.<locals>.<setcomp>Ü  sI   € ð -ð -ð -Ø#$½SÀ¹V¼V¿\º\¹^¼^ð-Ý�A‘”—’‘”ð-ð -ð -r(   c                ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S r'   rN  rJ  s     r)   rL  z)MatrixAdapter.__init__.<locals>.<setcomp>à  s=   € ð -ð -ð -ØÈÏÊÉ	Ì	ð-Ø—’‘	”	ð-ð -ð -r(   ÚMATRIX_ALLOW_ROOM_MENTIONSÚfalserÁ  ÚMATRIX_AUTO_THREADrµ  ÚMATRIX_DM_AUTO_THREAD>   re   rz  rµ  ÚMATRIX_DM_MENTION_THREADSÚMATRIX_SESSION_SCOPEÚauto>   rZ  ÚroomÚthreadÚMATRIX_PROCESS_NOTICESÚMATRIX_REACTIONS>   Ú0ÚnorU  g      @ÚMATRIX_PROXY)Úplatform_env_varu   Matrix: proxy configured â€” %sÚMATRIX_MAX_MEDIA_BYTESi  @Ú&HERMES_MATRIX_TEXT_BATCH_DELAY_SECONDSz0.6Ú,HERMES_MATRIX_TEXT_BATCH_SPLIT_DELAY_SECONDSz2.0ÚonceÚsessionÚalwaysÚdeny)õ   âœ…õ   ðŸŒ€õ   â™¾ï¸�õ   â™¾rl  rm  õ   â�Œu   â�ŽÚMATRIX_APPROVAL_REQUIRE_SENDERÚMATRIX_APPROVAL_TIMEOUT_SECONDSÚ300i,  ÚMATRIX_ALLOWED_USERSc                ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S r'   rN  ©rp   Úus     r)   rL  z)MatrixAdapter.__init__.<locals>.<setcomp>2  s=   € ð ,
ð ,
ð ,
Ø¸q¿wºw¹y¼yð,
Ø�GŠG‰IŒIð,
ð ,
ð ,
r(   ÚMATRIX_IGNORE_USER_PATTERNSc              3  óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S rn   rN  )rp   rÞ   s     r)   rr   z)MatrixAdapter.__init__.<locals>.<genexpr>8  s7   è è € ÐWÐW aÈQÏWÊWÉYÌYÐW˜Ÿš™	œ	ÐWÐWÐWÐWÐWÐWr(   zAMatrix: ignoring invalid MATRIX_IGNORE_USER_PATTERNS entry %r: %s)arû   rü   rE   ÚMATRIXrm  r_  ÚMAX_MESSAGE_LENGTHrŠ   Ú_split_thresholdr^  rc  r£   rd  ÚrstripÚ_homeserverr  rÿ  Ú_access_tokenÚ_user_idÚ	_passwordrÄ  Ú
_e2ee_modeÚ_encryptionÚ
_device_idÚ_device_id_unverifiedr"  Ú
_crypto_dbÚ
_sync_taskÚ_invite_join_tasksÚ_closingÚ_startup_tsÚ_late_grace_dropsÚ_late_grace_skewÚ_clock_skew_warnedÚ_last_sync_tsÚ	_dm_roomsÚ_room_identitiesÚ_room_identity_cached_atr{   Ú_room_identity_ttl_secondsrh  Ú_room_identity_cache_maxr  r!  ÚcollectionsrE  Ú_processed_eventsÚ_processed_events_setrO   Ú_threadsÚ_parse_require_mentionÚ_require_mentionÚ_parse_thread_require_mentionÚ_thread_require_mentionr0  r7  Ú_free_roomsrx   rÊ   Ú_allowed_roomsr²   Ú_allow_room_mentionsÚ_auto_threadÚ_dm_auto_threadÚ_dm_mention_threadsr}   Ú_matrix_session_scopeÚ_process_noticesÚ_reactions_enabledÚ_pending_reactionsÚ!_reaction_redaction_delay_secondsÚ_reaction_redaction_tasksrL   Ú
_proxy_urlr€   r2  r~   Ú_max_media_bytesÚ_text_batch_delay_secondsÚ_text_batch_split_delay_secondsÚ_pending_text_batchesÚ_pending_text_batch_tasksÚ_approval_reaction_mapÚ_approval_prompts_by_eventÚ_approval_prompt_by_sessionÚ_approval_require_senderÚ_approval_timeout_secondsÚ_model_picker_prompts_by_eventÚ_choice_picker_prompts_by_eventÚ_allowed_user_idsÚ_allowed_room_idsÚ_ignored_user_patternsr‹   r  ÚcompilerW   r¥  )rÿ   rj  rE  Úfree_rooms_rawÚallowed_rooms_rawÚraw_session_scopeÚallowed_users_rawÚignore_patterns_rawÚpatternrã  r   s             €r)   rü   zMatrixAdapter.__init__�  sI  ø€ Ý‰Œ×Ò˜¥¤Ñ1Ô1Ð1å"=¸fÑ"EÔ"EˆÔà"&Ô"9ˆÔå # C¨Ô)@À3Ñ)FÑ GÔ GˆÔð ŒL×Ò˜\¨2Ñ.Ô.ÐTµ"´)Ð<OÐQSÑ2TÔ2Tß
Š&�‰+Œ+ð 	Ôð #)¤,ð #
Õ2EØ!ñ3
ô 3
ˆÔð $œ\×-Ò-¨i¸Ñ<Ô<ð 
ÅÄ	Ø˜bñA
ô A
ˆŒð %œl×.Ò.¨z¸2Ñ>Ô>ð 
ÕBUØñC
ô C
ˆŒõ  2°&´,Ñ?Ô?ˆŒØ!%¤°EÒ!9ˆÔØ%œ|×/Ò/°¸RÑ@Ô@ð  
ÅBÄIØ ñE
ô E
ˆŒð ,1ˆÔ"à ˆŒØ#ˆŒØ26ˆŒØ;=ˆÔØˆŒØ"%ˆÔð '(ˆÔØ'*ˆÔØ(-ˆÔØ$'ˆÔð +-ˆŒØ?AˆÔØ:<ˆÔ%ð	3Ý.3Ý”	Ð<¸dÑCÔCñ/ô /ˆDÔ+Ð+øõ ð 	3ð 	3ð 	3Ø.2ˆDÔ+Ð+Ð+ð	3øøøà(+ˆÔ%å'*¡u¤uˆÔà%Ð%Ð%Ð%Ð%Ð%à(-¨°TÐ(:Ñ(:Ô(:ˆÔÝ*-©%¬%ˆÔ"õ 3°8Ñ<Ô<ˆŒð '+×&AÒ&AÀ&Ñ&IÔ&IˆÔØ-1×-OÒ-OÐPVÑ-WÔ-WˆÔ$Øœ×)Ò)Ð*?Ñ@Ô@ˆØÐ!ÝœYÐ'CÀRÑHÔHˆNÝ�n¥dÑ+Ô+ð 	ð*ð *Ø(6ð*ñ *ô *ˆDÔÐð*ð *Ý#& ~Ñ#6Ô#6×#<Ò#<¸SÑ#AÔ#Að*ñ *ô *ˆDÔð #œL×,Ò,¨_Ñ=Ô=ÐØÐ$Ý "¤	Ð*@À"Ñ EÔ EÐÝÐ'­Ñ.Ô.ð 	ð-ð -Ø(9ð-ñ -ô -ˆDÔÐð-ð -Ý#&Ð'8Ñ#9Ô#9×#?Ò#?ÀÑ#DÔ#Dð-ñ -ô -ˆDÔõ +-¬)Ø(¨'ñ+
ô +
ç
Š%‰'Œ'Ð)ð+*ˆÔ!õ #%¤)Ð,@À&Ñ"IÔ"I×"OÒ"OÑ"QÔ"Qð V
ð #
ˆÔõ
 &(¤YØ# Wñ&
ô &
ç
Š%‰'Œ'Ð)ð&*ˆÔõ *,¬Ø'¨ñ*
ô *
ç
Š%‰'Œ'Ð)ð**ˆÔ õ œIÐ&<¸fÑEÔE×KÒKÑMÔM×SÒSÑUÔUÐà!2Ð6PÐ!PÐ!PÐÐÐV\ð 	Ô"õ ')¤iØ$ gñ'
ô '
ç
Š%‰'Œ'Ð)ð'*ˆÔõ
 )+¬	Ø ñ)
ô )
ç
Š%‰'Œ'Ð-ð).ˆÔð ?AˆÔð
 25ˆÔ.Ý<?¹E¼EˆÔ&õ '8ÈÐ&XÑ&XÔ&XˆŒØŒ?ð 	LÝ�KŠKÐ9¸4¼?ÑKÔKÐKð	6Ý$'­¬	Ð2JÍCÐPaÑLbÔLbÑ(cÔ(cÑ$dÔ$dˆDÔ!Ð!øÝð 	6ð 	6ð 	6Ø$5ˆDÔ!Ð!Ð!ð	6øøøõ
 */ÝŒIÐ>ÀÑFÔFñ*
ô *
ˆÔ&õ 05ÝŒIÐDÀeÑLÔLñ0
ô 0
ˆÔ,ð ?AˆÔ"ØBDˆÔ&ð ØØØØ$ØØØð	'
ð 	'
ˆÔ#ð MOˆÔ'Ø;=ˆÔ(Ý.0¬iØ,¨fñ/
ô /
ç
Š%‰'Œ'Ð)ð/*ˆÔ%ð	1Ý-0Ý”	Ð;¸UÑCÔCñ.ô .ˆDÔ*Ð*øõ ð 	1ð 	1ð 	1Ø-0ˆDÔ*Ð*Ð*ð	1øøøàSUˆÔ+ØUWˆÔ,ÝœIÐ&<¸bÑAÔAÐð,
ð ,
Ø0×6Ò6°sÑ;Ô;ð,
ñ ,
ô ,
ˆÔõ ,/¨tÔ/BÑ+CÔ+CˆÔÝ œiÐ(EÀrÑJÔJÐØ=?ˆÔ#ØWÐWÐ+>×+DÒ+DÀSÑ+IÔ+IÐWÑWÔWð 	ð 	ˆGðØÔ+×2Ò2µ2´:¸gÑ3FÔ3FÑGÔGÐGÐGøÝ”8ð ð ð Ý—’ØWØØñô ð ð ð ð ð ð øøøøðøøøð	ð 	sN   Ç3'H ÈH/È.H/Ö4V= Ö=W×WÙ='Z% Ú%Z9Ú8Z9Ý,^Þ^<Þ^7Þ7^<rR   r@  c                ó  — |sdS || j         v rdS t          | j        ¦  «        | j        j        k    r'| j        d         }| j                              |¦  «         | j                             |¦  «         | j                              |¦  «         dS )zIReturn True if this event was already processed. Tracks the ID otherwise.FTr   )r”  r‡   r“  rF  Údiscardr‹   Úadd)rÿ   Úevent_idÚevicteds      r)   Ú_is_duplicate_eventz!MatrixAdapter._is_duplicate_eventB  s•   € àð 	Ø�5Ø�tÔ1Ð1Ð1Ø�4ÝˆtÔ%Ñ&Ô&¨$Ô*@Ô*GÒGÐGØÔ,¨QÔ/ˆGØÔ&×.Ò.¨wÑ7Ô7Ð7ØÔ×%Ò% hÑ/Ô/Ð/ØÔ"×&Ò& xÑ0Ô0Ð0Øˆur(   c                ó.  — | j                              d¦  «        }|�Qt          |t          ¦  «        r|S t          |t          ¦  «        r|                     ¦   «         dvS t          |¦  «        S t          j        dd¦  «                             ¦   «         dvS )a  Parse require_mention from config.extra or env var.

        Handles both YAML booleans and string values (``"true"``, ``"false"``,
        ``"yes"``, ``"no"``, ``"on"``, ``"off"``, ``"1"``, ``"0"``).
        Falls back to ``MATRIX_REQUIRE_MENTION`` env var, default ``true``.
        Úrequire_mentionN>   r_  r`  r¹  rU  ÚMATRIX_REQUIRE_MENTIONrµ  ©r^  rc  r0  r@  rx   r²   r£   rd  ©rj  Ú
configureds     r)   r–  z$MatrixAdapter._parse_require_mentionO  s›   € ð ”\×%Ò%Ð&7Ñ8Ô8ˆ
ØÐ!Ý˜*¥dÑ+Ô+ð "Ø!Ð!Ý˜*¥cÑ*Ô*ð MØ!×'Ò'Ñ)Ô)Ð1LÐLÐLÝ˜
Ñ#Ô#Ð#ÝŒyØ$ fñ
ô 
ç
Š%‰'Œ'Ð4ð5ð 	5r(   c                ó.  — | j                              d¦  «        }|�Qt          |t          ¦  «        r|S t          |t          ¦  «        r|                     ¦   «         dvS t          |¦  «        S t          j        dd¦  «                             ¦   «         dv S )a_  Parse thread_require_mention from config.extra or env var.

        Handles both YAML booleans and string values (``"true"``, ``"false"``,
        ``"yes"``, ``"no"``, ``"on"``, ``"off"``, ``"1"``, ``"0"``).
        Falls back to ``MATRIX_THREAD_REQUIRE_MENTION`` env var, default ``false``.
        Mirrors Discord adapter's parsing pattern.
        Úthread_require_mentionN>   r_  r`  r¹  rU  ÚMATRIX_THREAD_REQUIRE_MENTIONrU  >   re   rž   rz  rµ  rÆ  rÇ  s     r)   r˜  z+MatrixAdapter._parse_thread_require_mentionb  s›   € ð ”\×%Ò%Ð&>Ñ?Ô?ˆ
ØÐ!Ý˜*¥dÑ+Ô+ð "Ø!Ð!Ý˜*¥cÑ*Ô*ð MØ!×'Ò'Ñ)Ô)Ð1LÐLÐLå˜
Ñ#Ô#Ð#ÝŒyØ+¨Wñ
ô 
ç
Š%‰'Œ'Ð/ð0ð 	0r(   Údevice_keys_objr   r–   c                óÂ   — t          | di ¦  «        pi                      ¦   «         D ]8\  }}t          |¦  «                             d¦  «        rt          |¦  «        c S Œ9dS )z:Extract the ed25519 identity key from a DeviceKeys object.Úkeyszed25519:N)rb  Úitemsrx   r¾   )rÌ  ÚkidÚkvals      r)   Ú_extract_server_ed25519z%MatrixAdapter._extract_server_ed25519{  sl   € õ " /°6¸2Ñ>Ô>ÐDÀ"×KÒKÑMÔMð 	!ð 	!‰IˆC�Ý�3‰xŒx×"Ò" :Ñ.Ô.ð !Ý˜4‘y”yÐ Ð Ð ð!àˆtr(   r$  Úlocal_ed25519rx   c              ƒ  ó`  K  — |j         r| j        rt                               d¦  «         dS 	 |                     |j        |j         gi¦  «        ƒ d{V —†}t          |di ¦  «        pi }|                     t          |j        ¦  «        ¦  «        pi }|                     t          |j         ¦  «        ¦  «        }|r=|  	                    |¦  «        }||k    r"t           
                    d|j         ¦  «         dS n5# t          $ r(}t           
                    d|d¬¦  «         Y d}~dS d}~ww xY wdS )	zJRe-query the server after share_keys() and verify our ed25519 key matches.uO   Matrix: skipping post-upload key verification â€” device_id not yet establishedTNÚdevice_keysz‚Matrix: device %s has immutable identity keys that don't match this installation. Generate a new access token with a fresh device.Fz/Matrix: post-upload key verification failed: %sr`   )r@  rƒ  r€   r¥  Ú
query_keysrå  rb  rc  rx   rÒ  rW   r   )	rÿ   r$  rÓ  ÚrespÚdkÚudÚdevÚ	server_edrã  s	            r)   Ú_reverify_keys_after_uploadz)MatrixAdapter._reverify_keys_after_uploadƒ  sf  è è € ð Ôð 	 4Ô#=ð 	Ý�NŠNð0ñô ð ð �4ð	Ø×*Ò*¨F¬K¸&Ô:JÐ9KÐ+LÑMÔMÐMÐMÐMÐMÐMÐMˆDÝ˜˜}¨bÑ1Ô1Ð7°RˆBØ—’�˜FœKÑ(Ô(Ñ)Ô)Ð/¨RˆBØ—&’&�˜VÔ-Ñ.Ô.Ñ/Ô/ˆCØð 	!Ø ×8Ò8¸Ñ=Ô=�	Ø Ò-Ð-Ý—L’Lð5ð Ô(ñ	ô ð ð !˜5øøÝð 	ð 	ð 	Ý�LŠLÐJÈCÐZ^ˆLÑ_Ô_Ð_Ø�5�5�5�5�5øøøøð	øøøð ˆts   ®CC9 Ã9
D+ÄD&Ä&D+Úcrypto_storer@  c              ƒ  ó0  K  — |sdS 	 |                      ¦   «         ƒ d{V —†}n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w|r||k    rdS t                               d||¦  «         |                     ¦   «         ƒ d{V —† dS )a  Reset the local Olm account when the access token's device changed.

        The crypto store is keyed by user ID, so a new access token (= new
        device ID) would otherwise inherit the previous device's Olm account.
        Its identity keys can never be published under the new device ID
        (and the pickle key embeds the old device ID anyway), which leads to
        stale-key mismatches and cross-signing signatures that the
        homeserver refuses to replace. Returns True if the store was reset.
        FNz+Matrix: could not read stored device ID: %suŒ   Matrix: access token belongs to a new device (%s -> %s) â€” resetting local Olm account so fresh identity keys are generated for this deviceT)Úget_device_idr   r€   r¥  Údelete)rÿ   rÝ  r@  Ústored_device_idrã  s        r)   Ú%_reset_crypto_store_if_device_changedz3MatrixAdapter._reset_crypto_store_if_device_changed¡  sê   è è € ð ð 	Ø�5ð	Ø%1×%?Ò%?Ñ%AÔ%AÐAÐAÐAÐAÐAÐAÐÐøÝð 	ð 	ð 	Ý�NŠNÐHÈ#ÑNÔNÐNØ�5�5�5�5�5øøøøð	øøøð  ð 	Ð#3°yÒ#@Ð#@Ø�5Ý�Šð(ð Øñ	
ô 	
ð 	
ð ×!Ò!Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Øˆts   ˆ# £
A­AÁAÚ	crypto_dbÚacct_idÚ
pickle_keyc              ƒ  óV  K  — 	 |                      ¦   «         ƒ d{V —† dS # t          $ r Y nw xY wddlm} |› d�|fD ]Ñ}||k    rŒ	 ||||¬¦  «        }	 |                      ¦   «         ƒ d{V —†}n# t          $ r Y Œ?w xY w|€ŒF	 |                      ||||¦  «        ƒ d{V —† n4# t          $ r'}	t
                               d|	¦  «         Y d}	~	 dS d}	~	ww xY w|                     |¦  «        ƒ d{V —† t
                               d	¦  «          dS t
                               d
¦  «         dS )u‹  Re-pickle the Olm account when the pickle key changed.

        The pickle key embeds the *configured* device ID. If the account was
        created before MATRIX_DEVICE_ID was set (e.g. first password login,
        where the device ID is only known after connecting), the store was
        pickled under ``<acct>:default``; setting MATRIX_DEVICE_ID afterwards
        changes the key and unpickling fails with BAD_ACCOUNT_KEY â€” which in
        optional-E2EE mode silently disables encryption. Try known legacy
        keys and re-pickle under the current one. Returns False only when an
        account exists but no key can unpickle it.
        NTr   rª  z:default©Ú
account_idrå  ÚdbuŸ   Matrix: pickle key migration failed while re-pickling sessions (%s) â€” leaving the account under the legacy key so the migration is retried on the next start.FzŠMatrix: re-pickled crypto store account and sessions under the current pickle key (device ID was configured after the account was created)z¬Matrix: crypto store account exists but cannot be unpickled with the current or any legacy pickle key. If MATRIX_DEVICE_ID was changed manually, restore its previous value.)	Úget_accountr   r­  r«  Ú_repickle_crypto_sessionsr€   rW   Úput_accountr2  )
rÿ   rÝ  rã  rä  rå  r«  Ú
legacy_keyÚlegacy_storeÚaccountrã  s
             r)   Ú_migrate_legacy_crypto_picklez+MatrixAdapter._migrate_legacy_crypto_pickleÀ  s  è è € ð	Ø×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø�4øÝð 	ð 	ð 	ØˆDð	øøøð 	?Ð>Ð>Ð>Ð>Ð>à%Ð/Ð/Ð/°Ð9ð #	ð #	ˆJØ˜ZÒ'Ð'ØØ(˜=Ø"¨z¸iðñ ô ˆLðØ ,× 8Ò 8Ñ :Ô :Ð:Ð:Ð:Ð:Ð:Ð:��øÝð ð ð Ø�ðøøøàˆØðØ×4Ò4Ø˜w¨
°Jñô ð ð ð ð ð ð ð ð øõ ð ð ð Ý—’ðIð ñ	ô ð ð �u�u�u�u�u�uøøøøðøøøð ×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ý�KŠKð'ñô ð ð
 �4�4å�Šð@ñ	
ô 	
ð 	
ð
 ˆus6   „   
-¬-ÁA0Á0
A=Á<A=ÂB#Â#
CÂ-CÃCrí  rø   c           	   ƒ  óX  K  — ddl }|j        |j        |j        dœ}|                     ¦   «         D ]ù\  }}|                     d|› d�|¦  «        ƒ d{V —†}	|	D ]Ñ}
|
d         }|€Œt          |¦  «        }	 |                     ||¦  «         Œ4# t          $ r Y nw xY w	 |                     ||¦  «        }n:# t          $ r-}t           
                    d||
d         |¦  «         Y d}~ŒŽd}~ww xY w|                     d	|› d
�|                     |¦  «        ||
d         ¦  «        ƒ d{V —† ŒÒŒúdS )a  Re-pickle olm/megolm session blobs alongside the account.

        The account and every stored session share the pickle key; migrating
        only the account leaves sessions unreadable (BAD_ACCOUNT_KEY on the
        next olm decrypt), which breaks key sharing with peers.
        r   N)Úcrypto_olm_sessionÚcrypto_megolm_inbound_sessionÚcrypto_megolm_outbound_sessionz SELECT session_id, session FROM z WHERE account_id=$1rg  z}Matrix: %s row %s cannot be unpickled with the current or legacy key; leaving it in place, its sessions are unrecoverable: %sÚ
session_idzUPDATE z5 SET session=$1 WHERE account_id=$2 AND session_id=$3)ÚolmÚSessionÚInboundGroupSessionÚOutboundGroupSessionrÏ  ÚfetchÚbytesÚfrom_pickler   r€   r¥  ÚexecuteÚpickle)rÿ   rã  rä  rí  rå  Úolm_libÚtablesrò   Úsession_clsÚrowsÚrowÚblobÚpickledrg  rã  s                  r)   rë  z'MatrixAdapter._repickle_crypto_sessions  sï  è è € ð 	ÐÐÐð #*¤/Ø-4Ô-HØ.5Ô.Jð
ð 
ˆð
 #)§,¢,¡.¤.ð %	ð %	ÑˆE�;Ø"ŸšØN°5ÐNÐNÐNØñô ð ð ð ð ð ð ˆDð ð  ð  �Ø˜9”~�Ø�<ØÝ ™+œ+�ðØ×+Ò+¨G°ZÑ@Ô@Ð@ØøÝ ð ð ð Ø�DðøøøðØ)×5Ò5°g¸zÑJÔJ�G�GøÝ ð ð ð õ
 —N’Nð9ð Ø˜LÔ)Øñô ð ð �H�H�H�Høøøøðøøøð  ×'Ò'ð<˜eð <ð <ð <à—N’N :Ñ.Ô.ØØ˜Ô%ñô ð ð ð ð ð ð ð ð ð5 ð%	ð %	s*   Á4BÂ
BÂBÂB3Â3
C*Â=#C%Ã%C*rö  c              ƒ  ó  K  — |j         r| j        rt                               d¦  «         dS 	 |                     |j        |j         gi¦  «        ƒ d{V —†}n5# t          $ r(}t                               d|d¬¦  «         Y d}~dS d}~ww xY wt          |di ¦  «        pi }| 	                    t          |j        ¦  «        ¦  «        pi }| 	                    t          |j         ¦  «        ¦  «        }|j        j         	                    d¦  «        }|s“t                               d	¦  «         d|j        _        	 |                     ¦   «         ƒ d{V —† n5# t          $ r(}t                               d
|d¬¦  «         Y d}~dS d}~ww xY w|                      ||¦  «        ƒ d{V —†S |                      |¦  «        }	|	|k    �rH|j        j        r(t                               d|j         t"          ¦  «         dS t                               d|j         ¦  «         	 |j                             t)          |j        d¦  «        r|j        j        j        ndd|j         › �¦  «        ƒ d{V —† t                               d|j         ¦  «         n# t          $ r Y nw xY w	 |                     ¦   «         ƒ d{V —† n;# t          $ r.}t                               d|j         |d¬¦  «         Y d}~dS d}~ww xY w|                      ||¦  «        ƒ d{V —†S dS )zäVerify our device keys are on the homeserver after loading crypto state.

        Returns True if keys are valid or were successfully re-uploaded.
        Returns False if verification fails (caller should refuse E2EE).
        uJ   Matrix: skipping device key verification â€” device_id not yet establishedTNuA   Matrix: cannot verify device keys on server: %s â€” refusing E2EEr`   FrÕ  Úed25519u8   Matrix: device keys missing from server â€” re-uploadingz+Matrix: failed to re-upload device keys: %sup   Matrix: server has different identity keys for device %s â€” local crypto state is stale. Delete %s and restart.uD   Matrix: server has stale keys for device %s â€” attempting re-uploadÚMethodÚDELETEz/_matrix/client/v3/devices/z+Matrix: deleted stale device %s from serverzfMatrix: cannot upload device keys for %s: %s. Try generating a new access token to get a fresh device.)r@  rƒ  r€   r¥  rÖ  rå  r   rW   rb  rc  rx   rï  Úidentity_keysÚsharedÚ
share_keysrÜ  rÒ  Ú_CRYPTO_DB_PATHÚapiÚrequestr-  r  r	  r2  )
rÿ   r$  rö  r×  rã  Údevice_keys_mapÚour_user_devicesÚour_keysrÓ  Úserver_ed25519s
             r)   Ú_verify_device_keys_on_serverz+MatrixAdapter._verify_device_keys_on_server9  sÛ  è è € ð Ôð 	 4Ô#=ð 	Ý�NŠNð0ñô ð ð �4ð	Ø×*Ò*¨F¬K¸&Ô:JÐ9KÐ+LÑMÔMÐMÐMÐMÐMÐMÐMˆDˆDøÝð 	ð 	ð 	Ý�LŠLØSØØð ñ ô ð ð
 �5�5�5�5�5øøøøð	øøøõ " $¨°rÑ:Ô:Ð@¸bˆØ*×.Ò.­s°6´;Ñ/?Ô/?Ñ@Ô@ÐFÀBÐØ#×'Ò'­¨FÔ,<Ñ(=Ô(=Ñ>Ô>ˆØœÔ1×5Ò5°iÑ@Ô@ˆàð 	QÝ�NŠNÐUÑVÔVÐVØ!&ˆCŒKÔðØ—n’nÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð ð ð Ý—’ÐJÈCÐZ^�Ñ_Ô_Ð_Ø�u�u�u�u�uøøøøðøøøð ×9Ò9¸&À-ÑPÔPÐPÐPÐPÐPÐPÐPÐPà×5Ò5°hÑ?Ô?ˆà˜]Ò*Ñ*ØŒ{Ô!ð Ý—’ðJàÔ$Ý#ñ	ô ð ð �uå�NŠNØVØÔ ñô ð ðØ”j×(Ò(å˜vœz¨8Ñ4Ô4ð"�F”JÔ%Ô,Ð,à!ØD°&Ô2BÐDÐDñ	ô ð ð ð ð ð ð ð õ —’ØAÀ6ÔCSñô ð ð øõ ð ð ð Ø�ðøøøð
Ø—n’nÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð ð ð Ý—’ðOàÔ$ØØ!ð ñ ô ð ð �u�u�u�u�uøøøøðøøøð ×9Ò9¸&À-ÑPÔPÐPÐPÐPÐPÐPÐPÐPàˆtsZ   ®(A Á
B	Á!BÂB	Ä7E Å
FÅE?Å?FÈA/J Ê
JÊJÊJ0 Ê0
K(Ê:#K#Ë#K(F)Úis_reconnectr  c             ƒ  ó\  K  — d| _         | j        �N	 |                      ¦   «         ƒ d{V —† n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wddlm} ddlm	} ddl
m}m} | j        st                               d¦  «         dS t                               d	d	¬
¦  «         t#          | j        ¦  «        } || j        | j        pd|¬¦  «        } |¦   «         }	 |¦   «         }
 || j        rt+          | j        ¦  «        nt+          d¦  «        | j        pd||	|
¬¦  «        }|| _        | j        �rŒ| j        |_        	 |                     ¦   «         ƒ d{V —†}t3          |dd¦  «        p| j        }t5          t3          |dd¦  «        pd¦  «        }|r-t5          |¦  «        | _        t+          | j        ¦  «        |_        |r<| j        r5|| j        k    r*t                               d| j        || j        ¦  «         |}n	| j        p|}|r||_        |j        sø	 |                     |j        g i¦  «        ƒ d{V —†}t3          |di ¦  «        pi                      t5          |j        ¦  «        ¦  «        pi }t?          |¦  «        dk    r"tA          tC          |¦  «        ¦  «        |_        n3t?          |¦  «        dk    r t                               d|j        ¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|j        s't                               d|j        ¦  «         d	| _         t           "                    d| j        pd|rd|› d�nd¦  «         �n_# t          $ rG}t                               d|d	¬¦  «         |j#         $                    ¦   «         ƒ d{V —† Y d}~dS d}~ww xY w| j%        rÉ| j        rÂ	 | &                    | j        | j%        d| j        pd¬¦  «        ƒ d{V —†}|rtO          |d¦  «        r|j        |_        t           "                    d| j        ¦  «         n�# t          $ rE}t                               d|¦  «         |j#         $                    ¦   «         ƒ d{V —† Y d}~dS d}~ww xY wt                               d ¦  «         |j#         $                    ¦   «         ƒ d{V —† dS | j(        �r¬tS          ¦   «         st| j*        d!k    r(t                               d"tV          ¦  «         d| _(        nAt                               d#tV          ¦  «         |j#         $                    ¦   «         ƒ d{V —† dS | j(        snÁ	 dd$l,m-} dd%l.m/} dd&l0m1} t                               d	d	¬
¦  «         n‘# t          $ r„}| j*        d!k    r)t                               d'|tV          ¦  «         d| _(        nFt                               d(|tV          ¦  «         |j#         $                    ¦   «         ƒ d{V —† Y d}~dS Y d}~nd}~ww xY w| j(        �rY	 t          d)z  }| 2                    ¦   «         r.t           "                    d*¦  «         | 3                    ¦   «          | 4                    d+tj          › �|j6        ¬,¦  «        }| 7                    ¦   «         ƒ d{V —† || _8        | j        pd-}|› d.|j        p| j        pd/› �} ||||¬0¦  «        }| 9                    ¦   «         ƒ d{V —† |j        rB|  :                    ||j        ¦  «        ƒ d{V —†}| ;                    |j        ¦  «        ƒ d{V —† nd}|s8|  <                    ||||¦  «        ƒ d{V —†st                               d1¦  «         t{          |	| j>        |¦  «        } ||||¦  «        }t~          j@        |_A        t~          j@        |_B        | C                    ¦   «         ƒ d{V —† |  D                    ||¦  «        ƒ d{V —†s;| E                    ¦   «         ƒ d{V —† |j#         $                    ¦   «         ƒ d{V —† dS 	 | F                    ¦   «         ƒ d{V —† n¤# t          $ r—}t5          |¦  «        }d2|v r_t                               d3|j        ¦  «         | E                    ¦   «         ƒ d{V —† |j#         $                    ¦   «         ƒ d{V —† Y d}~dS t                               d4|¦  «         Y d}~nd}~ww xY wt�          ¦   «         }|rk	 | H                    |¦  «        ƒ d{V —† t           "                    d5¦  «         �nf# t          $ r&}t                               d6|¦  «         Y d}~�n;d}~ww xY w	 | I                    ¦   «         ƒ d{V —†}n4# t          $ r'}d}t                               d7|¦  «         Y d}~nd}~ww xY w|€át•          ¦   «         \  } }!|!d8k    rt                               d9¦  «         n¯|!d:k    rt                               d;¦  «         nŽ|!rt                               d<|!¦  «         np	 | K                    ¦   «         ƒ d{V —†}"t™          t5          |j        ¦  «        |"¦  «         n2# t          $ r%}t                               d=|¦  «         Y d}~nd}~ww xY w||_M        t           "                    d>t5          tj          ¦  «        |j        r
d?|j        › �nd¦  «         n‘# t          $ r„}| j*        d!k    r)t                               d@|tV          ¦  «         d| _(        nFt                               dA|tV          ¦  «         |j#         $                    ¦   «         ƒ d{V —† Y d}~dS Y d}~nd}~ww xY wddBlmN}# ddClOmP}$ | Q                    |$¦  «         | R                    t¦          jT        | jU        d	¬D¦  «         | R                    t¦          jV        | jW        d	¬D¦  «         | R                    |#jX        | jY        d	¬D¦  «         tµ          jZ        ¦   «         | _[        d| _\        dE| _]        d| _^        d| __        	 | `                    dFd	¬G¦  «        ƒ d{V —†}%tÃ          |%tÄ          ¦  «        �rœtµ          jZ        ¦   «         | _c        |%                     dHi ¦  «                             dIi ¦  «        }&| j>         d                    ¦   «          | j>         e                    |& f                    ¦   «         ¦  «         | jg         d                    ¦   «          | jh         d                    ¦   «          |%                     dJ¦  «        }'|'r |ji         j                    |'¦  «        ƒ d{V —† t           "                    dKt?          | j>        ¦  «        ¦  «         |  k                    ¦   «         ƒ d{V —† 	 |  l                    |%¦  «        ƒ d{V —† n2# t          $ r%}t                               dL|¦  «         Y d}~nd}~ww xY w|  m                    |%¦  «         n-t                               dMtÝ          |%¦  «        jo        ¦  «         n2# t          $ r%}t                               dN|¦  «         Y d}~nd}~ww xY w| j(        rdt3          |dOd¦  «        rS	 |jM         F                    ¦   «         ƒ d{V —† n2# t          $ r%}t                               dP|¦  «         Y d}~nd}~ww xY wtá          jq        |  r                    ¦   «         ¦  «        | _s        |  t                    ¦   «          d	S )Qz3Connect to the Matrix homeserver and start syncing.FNz0Matrix: error disconnecting before reconnect: %sr   )ÚHTTPAPI)ÚClient)ÚMemoryStateStoreÚMemorySyncStorez%Matrix: homeserver URL not configuredTrÍ  r]   )Úbase_urlr  Úclient_session)rå  r@  r  Ústate_storeÚ
sync_storer6  r@  zéMatrix: MATRIX_DEVICE_ID=%s does not match the device this access token belongs to (%s). A token can only upload keys for its own device, so the configured value is being ignored. Unset MATRIX_DEVICE_ID, or use a token issued for %s.rÕ  rB   uD   Matrix: no devices found for %s â€” key verification will be skippedz$Matrix: device list query failed: %szžMatrix: device_id could not be resolved for %s. Set MATRIX_DEVICE_ID for full key verification. E2EE will proceed without server-side device key confirmation.z#Matrix: using access token for %s%sz(unknown user)z	 (device ú)uM   Matrix: whoami failed â€” check MATRIX_ACCESS_TOKEN and MATRIX_HOMESERVER: %sr`   zHermes Agent)Ú
identifierr  Údevice_namer@  zMatrix: logged in as %su   Matrix: login failed â€” %szDMatrix: need MATRIX_ACCESS_TOKEN or MATRIX_USER_ID + MATRIX_PASSWORDr¶  zaMatrix: E2EE optional but dependencies are missing. Continuing without encrypted-room support. %suw   Matrix: E2EE is required but dependencies are missing. %s. Refusing to connect â€” encrypted rooms would silently fail.r¨  rª  )ÚDatabasez`Matrix: failed to import optional E2EE client; continuing without encrypted-room support: %s. %sz,Matrix: failed to import E2EE client: %s. %szcrypto_store.picklez@Matrix: removing legacy crypto_store.pickle (migrated to SQLite)z
sqlite:///)Úupgrade_tableÚhermesú:Údefaultrç  uF   Matrix: crypto pickle migration failed â€” E2EE may not work correctlyzalready existszÈMatrix: device %s has stale one-time keys on the server signed with a previous identity key. Delete the device from the homeserver and restart, or generate a new access token to get a fresh device ID.z/Matrix: share_keys() warning during startup: %sz/Matrix: cross-signing verified via recovery keyz,Matrix: recovery key verification failed: %sz+Matrix: cross-signing key lookup failed: %srá  a  Matrix: cross-signing keys are missing, but automatic bootstrap is skipped because MATRIX_RECOVERY_KEY_OUTPUT_FILE is not configured. Configure MATRIX_RECOVERY_KEY from your Matrix client or set MATRIX_RECOVERY_KEY_OUTPUT_FILE to write a new recovery key once with mode 0600.râ  zžMatrix: cross-signing keys are missing, but automatic bootstrap is skipped because MATRIX_RECOVERY_KEY_OUTPUT_FILE already exists and will not be overwritten.z„Matrix: cross-signing keys are missing, but automatic bootstrap is skipped because MATRIX_RECOVERY_KEY_OUTPUT_FILE is not usable: %suh   Matrix: cross-signing bootstrap failed (non-fatal â€” Element will show 'not verified by its owner'): %sz"Matrix: E2EE enabled (store: %s%s)z, device_id=z`Matrix: failed to create optional E2EE client; continuing without encrypted-room support: %s. %sz,Matrix: failed to create E2EE client: %s. %s)ÚInternalEventType)ÚMembershipEventDispatcher)Ú	wait_syncr”  i'  )r[   Ú
full_stateÚroomsrÌ   Ú
next_batchz.Matrix: initial sync complete, joined %d roomsz-Matrix: initial sync event dispatch error: %sz0Matrix: initial sync returned unexpected type %szMatrix: initial sync error: %sÚcryptoz$Matrix: initial key share failed: %s)urƒ  r"  Ú
disconnectr   r€   r¥  Úmautrix.apir  Úmautrix.clientr  Úmautrix.client.state_storer  r  r|  rW   Ú
_STORE_DIRrÔ  r¦  r¦  r}  r~  r   r‚  r  Úwhoamirb  rx   rå  r@  rÖ  rc  r‡   ÚnextÚiterr2  rg  r¤   r  Úloginr-  r�  r±  r€  r  r¬  r©  r­  r«  Úmautrix.util.async_dbr"  râ  r¦   Úcreater  r#  r’   r„  rØ  râ  Úput_device_idrð  r  r!  r   rC   Úshare_keys_min_trustÚsend_keys_min_trustÚloadr  Ústopr  rí  Úverify_with_recovery_keyÚ!get_own_cross_signing_public_keysrä  Úgenerate_recovery_keyré  r-  r'  Úmautrix.client.dispatcherr(  Úadd_dispatcherÚadd_event_handlerr   r#   Ú_on_room_messager$   Ú_on_reactionÚINVITEÚ
_on_inviteÚtimerˆ  r‰  rŠ  r‹  r‡  Úsyncr0  rY  rŒ  ÚclearÚupdaterÎ  rŽ  r�  r  Úput_next_batchÚ_refresh_dm_cacheÚ_dispatch_syncÚ_schedule_pending_invite_joinsÚtyper    ÚasyncioÚcreate_taskÚ
_sync_loopr…  Ú_mark_connected)(rÿ   r  rã  r  r  r  r  r  r  r  r  r$  r×  Úresolved_user_idÚresolved_device_idÚeffective_device_idÚdev_respÚall_devicesr©  r«  r"  Úlegacy_picklerã  Ú_acct_idÚ_pickle_keyrÝ  Ú_store_was_resetÚcrypto_staterö  Úexc_strrÉ  Ú	own_xsignr®   Úoutput_errorÚnew_recovery_keyÚIntEvtr(  Ú	sync_dataÚ
rooms_joinÚnbs(                                           r)   ÚconnectzMatrixAdapter.connect�  s{  è è € à%*ˆÔ"ØŒ<Ð#ðXØ—o’oÑ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'øÝð Xð Xð XÝ—’ÐQÐSVÑWÔWÐWÐWÐWÐWÐWÐWøøøøðXøøøð 	(Ð'Ð'Ð'Ð'Ð'Ø)Ð)Ð)Ð)Ð)Ð)ØPÐPÐPÐPÐPÐPÐPÐPàÔð 	Ý�LŠLÐ@ÑAÔAÐAØ�5õ 	×Ò °ÐÑ5Ô5Ð5õ 0°´Ñ@Ô@ˆØˆgØÔ%ØÔ$Ð*¨Ø)ð
ñ 
ô 
ˆð 'Ð&Ñ(Ô(ˆØ$�_Ñ&Ô&ˆ
Ø�Ø*.¬-ÐG•˜œÑ&Ô&Ð&½VÀB¹Z¼ZØ”oÐ-¨ØØ#Ø!ð
ñ 
ô 
ˆð ˆŒð Ôñ i	ØÔ*ˆCŒIðPØ#Ÿ]š]™_œ_Ð,Ð,Ð,Ð,Ð,Ð,�Ý#*¨4°¸BÑ#?Ô#?Ð#PÀ4Ä=Ð Ý%(­°°{ÀBÑ)GÔ)GÐ)MÈ2Ñ%NÔ%NÐ"Ø#ð 8Ý$'Ð(8Ñ$9Ô$9�D”MÝ"(¨¬Ñ"7Ô"7�F”Kð 'ðPàœðPð +¨d¬oÒ=Ð=å—L’Lð5ð
 œØ*Øœñ	ô 	ð 	ð +=Ð'Ð'à*.¬/Ð*OÐ=OÐ'Ø&ð ;Ø':�FÔ$àÔ'ð ðØ)/×):Ò):¸F¼KÈÐ;LÑ)MÔ)MÐ#MÐ#MÐ#MÐ#MÐ#MÐ#M˜å$ X¨}¸bÑAÔAÐGÀRß šS¥ V¤[Ñ!1Ô!1Ñ2Ô2ð9Ø68ð $õ ˜{Ñ+Ô+¨qÒ0Ð0Ý/3µD¸Ñ4EÔ4EÑ/FÔ/F˜FÔ,Ð,Ý  Ñ-Ô-°Ò2Ð2Ý"ŸNšNð!Cà &¤ñô ð øøõ
 %ð ð ð ÝŸšØBÀCñô ð ð ð ð ð ð øøøøðøøøð
 Ô'ð 6Ý—N’Nð,ð œñô ð ð 26�DÔ.å—’Ø9Ø”MÐ5Ð%5Ø:MÐUÐ6Ð 3Ð6Ð6Ð6Ð6ÐSUñô ð ñ øõ
 ð ð ð Ý—’ØcØØ!ð ñ ô ð ð
 ”k×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø�u�u�u�u�uøøøøðøøøð Œ^ð 	 ¤ð 	ðØ#Ÿ\š\Ø#œ}Ø!œ^Ø .Ø"œoÐ5°ð	 *ñ ô ð ð ð ð ð ð �ð ð 6�G D¨+Ñ6Ô6ð 6Ø'+¤~�FÔ$Ý—’Ð5°t´}ÑEÔEÐEÐEøÝð ð ð Ý—’Ð:¸CÑ@Ô@Ð@Ø”k×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø�u�u�u�u�uøøøøðøøøõ
 �LŠLØVñô ð ð ”+×#Ò#Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø�5ð Ôñ I	%Ý#Ñ%Ô%ð !Ø”? jÒ0Ð0Ý—N’NðHå*ñô ð ð
 (-�DÔ$Ð$å—L’LðWå*ñô ð ð
 œ+×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø ˜5ØÔ#ð %Øð%Ø9Ð9Ð9Ð9Ð9Ð9ØJÐJÐJÐJÐJÐJØ>Ð>Ð>Ð>Ð>Ð>å×$Ò$¨T¸DÐ$ÑAÔAÐAÐAøÝ ð %ð %ð %Ø”¨*Ò4Ð4ÝŸšðPàÝ.ñ	ô ð ð ,1˜Ô(Ð(åŸšØJØÝ.ñô ð ð
 "œk×/Ò/Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ø$˜u˜u˜u˜u˜uð )Ð(Ð(Ð(Ð(øøøøð%øøøð" Ôñ ^%ð]%å$.Ð1FÑ$F�MØ$×+Ò+Ñ-Ô-ð /ÝŸšØ^ñô ð ð &×,Ò,Ñ.Ô.Ð.à (§¢Ø6¥_Ð6Ð6Ø&3Ô&Að !0ñ !ô !�Ið $Ÿ/š/Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø&/�D”Oà#œ}Ð8°�Hð &.Ð"bÐ"b°Ô0@Ð0`ÀDÄOÐ0`ÐW`Ð"bÐ"b�KØ#0 =Ø#+Ø#.Ø$ð$ñ $ô $�Lð
 '×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-àÔ'ð 1Ø15×1[Ò1[Ø(¨&Ô*:ñ2ô 2ð ,ð ,ð ,ð ,ð ,ð ,Ð(ð +×8Ò8¸Ô9IÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJà+0Ð(ð ,ð Ø%)×%GÒ%GØ(¨)°X¸{ñ&ô &ð  ð  ð  ð  ð  ð  ð õ #ŸNšNð!>ñô ð õ
 $5°[À$ÔBTÐV\Ñ#]Ô#]�LØ$˜* V¨\¸<ÑHÔH�CÝ/9Ô/D�CÔ,Ý.8Ô.C�CÔ+àŸ(š(™*œ*Ð$Ð$Ð$Ð$Ð$Ð$Ð$à!%×!CÒ!CÀFÈCÑ!PÔ!PÐPÐPÐPÐPÐPÐPð %Ø'ŸnšnÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø!œk×/Ò/Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ø$˜uð_Ø!ŸnšnÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øÝ$ð _ð _ð _Ý"% c¡(¤(˜Ø+¨wÐ6Ð6Ý"ŸLšLð![ð !'Ô 0ñô ð ð #,§.¢.Ñ"2Ô"2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø"%¤+×"3Ò"3Ñ"5Ô"5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø#( 5 5 5 5 5ÝŸšÐ'XÐZ]Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^øøøøð_øøøõ& $8Ñ#9Ô#9�LØ#ð 1&ð`Ø"%×">Ò">¸|Ñ"LÔ"LÐLÐLÐLÐLÐLÐLÐLÝ"ŸKšKÐ(YÑZÔZÐZÑZøÝ(ð `ð `ð `Ý"ŸNšNÐ+YÐ[^Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ñ_øøøøð`øøøð_Ø.1×.SÒ.SÑ.UÔ.UÐ(UÐ(UÐ(UÐ(UÐ(UÐ(U˜I˜IøÝ(ð _ð _ð _Ø(,˜IÝ"ŸNšNÐ+XÐZ]Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^øøøøð_øøøð %Ð,Ý.TÑ.VÔ.V™O˜A˜|Ø+Ð/?Ò?Ð?Ý &§¢ð%Hñ!"ô !"ð !"ð !"ð ".°Ò!9Ð!9Ý &§¢ð%?ñ!"ô !"ð !"ð !"ð ".ð &Ý &§¢ð%Xð %1ñ	!"ô !"ð !"ð !"ð!&Ø=@×=VÒ=VÑ=XÔ=XÐ7XÐ7XÐ7XÐ7XÐ7XÐ7XÐ$4Ý$IÝ(+¨F¬KÑ(8Ô(8Ø(8ñ%&ô %&ð %&ð %&øõ (1ð !&ð !&ð !&Ý$*§N¢Nð)là(+ñ%&ô %&ð %&ð %&ð %&ð %&ð %&ð %&øøøøð!&øøøð %(�F”MÝ—K’KØ<Ý�OÑ,Ô,Ø=CÔ=MÐUÐ9 vÔ'7Ð9Ð9Ð9ÐSUñô ð ð øõ
 !ð %ð %ð %Ø”¨*Ò4Ð4ÝŸšðPàÝ.ñ	ô ð ð ,1˜Ô(Ð(åŸšØJØÝ.ñô ð ð
 "œk×/Ò/Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ø$˜u˜u˜u˜u˜uð )Ð(Ð(Ð(Ð(øøøøð%øøøð& 	?Ð>Ð>Ð>Ð>Ð>ØGÐGÐGÐGÐGÐGð 	×ÒÐ7Ñ8Ô8Ð8à× Ò ÝÔ"ØÔ!Øð 	!ñ 	
ô 	
ð 	
ð
 	× Ò ÝÔØÔØð 	!ñ 	
ô 	
ð 	
ð
 	× Ò ØŒMØŒOØð 	!ñ 	
ô 	
ð 	
õ  œ9™;œ;ˆÔð "#ˆÔØ #ˆÔØ"'ˆÔØˆŒð"	BØ$Ÿkšk°%ÀD˜kÑIÔIÐIÐIÐIÐIÐIÐIˆIÝ˜)¥TÑ*Ô*ñ Ý%)¤Y¡[¤[�Ô"Ø&Ÿ]š]¨7°BÑ7Ô7×;Ò;¸FÀBÑGÔG�
ØÔ"×(Ò(Ñ*Ô*Ð*ØÔ"×)Ò)¨*¯/ª/Ñ*;Ô*;Ñ<Ô<Ð<ØÔ%×+Ò+Ñ-Ô-Ð-ØÔ-×3Ò3Ñ5Ô5Ð5ð —]’] <Ñ0Ô0�Øð ?Ø Ô+×:Ò:¸2Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ý—’ØDÝ˜Ô*Ñ+Ô+ñô ð ð
 ×,Ò,Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ðYØ×-Ò-¨iÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8øÝ ð Yð Yð YÝ—N’NÐ#RÐTWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøà×3Ò3°IÑ>Ô>Ð>Ð>å—’ØFÝ˜‘O”OÔ,ñô ð øøõ ð 	Bð 	Bð 	BÝ�NŠNÐ;¸SÑAÔAÐAÐAÐAÐAÐAÐAøøøøð	Bøøøð Ôð 	L¥¨°¸$Ñ ?Ô ?ð 	LðLØ”m×.Ò.Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øÝð Lð Lð LÝ—’ÐEÀsÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøõ "Ô-¨d¯oªoÑ.?Ô.?Ñ@Ô@ˆŒØ×ÒÑÔÐØˆts¸  ’- ­
A·AÁAÅCM: È(CK- Ë,M: Ë-
LË7LÌM: ÌLÌAM: Í:
OÎ<OÏOÏA.Q Ñ
RÑ:RÒRÕ,.V Ö
X)Ö%A4X$Ø$X)Ø5Hk< áa# á"k< á#
dá-A,c?ãk< ãc?ã:k< ã?däk< ä5e åk< å
e?åe:å4k< å:e?å?k< æf æk< æ
gæ(g
çk< ç
gçA6k< é<j êk< ê
j2êj-ê(k< ê-j2ê2A	k< ë<
n
ìA4nîn
ñE*y ö>w ÷y ÷
x	÷$x÷?y øx	ø	Ay ù
y?ùy:ù:y?úz; ú;
{*û{%û%{*c              ƒ  ój  K  — d| _         | j        r]| j                             ¦   «         sD| j                             ¦   «          	 | j        ƒ d{V —† n# t          j        t          f$ r Y nw xY wt          | j         	                    ¦   «         ¦  «        }|D ]*}|                     ¦   «         s|                     ¦   «          Œ+|rt	          j
        |ddiŽƒ d{V —† | j                             ¦   «          t          | j        ¦  «        }|D ]*}|                     ¦   «         s|                     ¦   «          Œ+|rt	          j
        |ddiŽƒ d{V —† | j                             ¦   «          t          | d¦  «        rZ| j        rS	 | j                             ¦   «         ƒ d{V —† n2# t          $ r%}t                                d|¦  «         Y d}~nd}~ww xY w| j        rB	 | j        j        j                             ¦   «         ƒ d{V —† n# t          $ r Y nw xY wd| _        t                                d¦  «         dS )zDisconnect from Matrix.TNÚreturn_exceptionsr„  z3Matrix: could not close crypto DB on disconnect: %szMatrix: disconnected)r‡  r…  ÚdoneÚcancelrQ  ÚCancelledErrorr   r7  r†  ÚvaluesÚgatherrJ  r¥  r-  r„  r=  r€   r�   r"  r  rg  r¤   r2  )rÿ   Úinvite_join_tasksÚtaskÚredaction_tasksrã  s        r)   r.  zMatrixAdapter.disconnect>  s´  è è € àˆŒàŒ?ð 	 4¤?×#7Ò#7Ñ#9Ô#9ð 	ØŒO×"Ò"Ñ$Ô$Ð$ðØ”oÐ%Ð%Ð%Ð%Ð%Ð%Ð%Ð%øÝÔ*­IÐ6ð ð ð Ø�ðøøøõ ! Ô!8×!?Ò!?Ñ!AÔ!AÑBÔBÐØ%ð 	ð 	ˆDØ—9’9‘;”;ð Ø—’‘”�øØð 	MÝ”.Ð"3ÐLÀtÐLÐLÐLÐLÐLÐLÐLÐLÐLØÔ×%Ò%Ñ'Ô'Ð'å˜tÔ=Ñ>Ô>ˆØ#ð 	ð 	ˆDØ—9’9‘;”;ð Ø—’‘”�øØð 	KÝ”. /ÐJÀTÐJÐJÐJÐJÐJÐJÐJÐJÐJØÔ&×,Ò,Ñ.Ô.Ð.õ �4˜Ñ&Ô&ð 	Y¨4¬?ð 	YðYØ”o×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð Yð Yð YÝ—’ÐRÐTWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøð Œ<ð 	 ðØ”lÔ&Ô.×4Ò4Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øÝð ð ð Ø�ðøøøàˆDŒLå�ŠÐ*Ñ+Ô+Ð+Ð+Ð+s<   ÁA ÁA+Á*A+Å>F Æ
GÆ(GÇGÇ)H È
HÈHNrJ  rÐ   Úreply_tor�   r»  rK   c           	   ƒ  ó  K  — |st          d¬¦  «        S |                      |¦  «        }|                      || j        ¦  «        }d}t	          |¦  «        D �]\  }}	|                      |	¦  «        }
|                      |
||¬¦  «         	 t          j        | j	         
                    t          |¦  «        t          j        |
¦  «        d¬¦  «        ƒ d{V —†}t          |¦  «        }t                               d||¦  «         Œ­# t"          $ �r_}| j        �rt'          | j	        dd¦  «        rû	 | j	        j                             ¦   «         ƒ d{V —† t          j        | j	         
                    t          |¦  «        t          j        |
¦  «        d¬¦  «        ƒ d{V —†}t          |¦  «        }t                               d	||¦  «         Y d}~�Œy# t"          $ rK}t                               d
||¦  «         t          dt          |¦  «        ¬¦  «        cY d}~cY d}~c S d}~ww xY wt                               d||¦  «         t          dt          |¦  «        ¬¦  «        cY d}~c S d}~ww xY wt          d|¬¦  «        S )z Send a message to a Matrix room.T)ÚsuccessN©rr  r�   é-   ©r[   zMatrix: sent event %s to %sr-  z-Matrix: sent event %s to %s (after key share)z,Matrix: failed to send to %s after retry: %sF©rt  rW   z Matrix: failed to send to %s: %s©rt  rK  )rK   Úformat_messageÚtruncate_messager_  Ú	enumerateÚ_build_text_message_contentÚ_apply_relation_metadatarQ  Úwait_forr"  Úsend_message_eventr   r   r#   rx   r€   r2  r   r�  rb  r-  r  rW   )rÿ   rJ  rÐ   rr  r�   Ú	formattedÚchunksÚlast_event_idrÝ   ÚchunkÚmsg_contentrÀ  rã  Ú	retry_excs                 r)   ÚsendzMatrixAdapter.sendi  s  è è € ð ð 	,Ý dÐ+Ñ+Ô+Ð+à×'Ò'¨Ñ0Ô0ˆ	Ø×&Ò& y°$Ô2IÑJÔJˆàˆÝ! &Ñ)Ô)ð ,	Añ ,	A‰HˆAˆuØ×:Ò:¸5ÑAÔAˆKà×)Ò)¨+ÀÐS[Ð)Ñ\Ô\Ð\ð'AÝ!(Ô!1Ø”L×3Ò3Ý˜w™œÝ!Ô.Ø#ñô ð
 ð"ñ "ô "ð ð ð ð ð ð �õ !$ H¡¤�Ý—’Ð9¸=È'ÑRÔRÐRÐRøÝð Añ Að AàÔ#ñ O­°´¸hÈÑ(MÔ(Mð OðOØ"œlÔ1×<Ò<Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ý)0Ô)9Ø œL×;Ò;Ý & w¡¤Ý )Ô 6Ø +ñô ð
 %'ð*ñ *ô *ð $ð $ð $ð $ð $ð $˜õ ),¨H©¬˜ÝŸšØKØ)Ø#ñô ð ð
 !˜˜˜™øÝ$ð Oð Oð OÝŸšØJØ#Ø%ñô ð õ
  *°%½sÀ9¹~¼~ÐNÑNÔNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNøøøøðOøøøõ —’Ð?ÀÈ#ÑNÔNÐNÝ!¨%µs¸3±x´xÐ@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð9Aøøøõ<  $°=ÐAÑAÔAÐAsP   Â
A8DÄI-ÄI(Ä-BGÇ
H$Ç9HÈH$ÈI(ÈI-ÈH$È$<I(É I-É(I-rS   c              ƒ  ón   K  — |                       |¦  «        ƒ d{V —†}|j        dk    rdnd}|j        |dœS )z%Return room name and type (dm/group).NÚdmrÁ   )r«   rP  )Ú_resolve_room_identityrD  rB  )rÿ   rJ  ÚidentityrD  s       r)   Úget_chat_infozMatrixAdapter.get_chat_info©  sR   è è € à×4Ò4°WÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØ$Ô.°$Ò6Ð6�D�D¸Gˆ	Ø Ô-°yÐAÐAÐAr(   c                ó¸  — t          j         ¦   «         }t          | j        ¦  «        }| j        pt	          | j        dd¦  «        pd}| j        pt	          | j        dd¦  «        pd}d| j        |t          | j        ¦  «        |rdnd|t          |¦  «        t          |¦  «        dœ| j        dut          | j        ¦  «        | j        rt          d|| j        z
  ¦  «        ndd	œ| j        t          | j        ¦  «        t!          ¦   «         t#          t$          ¦  «        t          t'          ¦   «                              ¦   «         ¦  «        d
œt          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        | j        t          | j        ¦  «        | j        | j        t9          j        dd¦  «                             ¦   «         dv dœd| j        idœS )z4Return redacted Matrix readiness/status diagnostics.rå  r]   r@  r  rÆ  )Úaccess_token_presentÚpassword_presentÚtoken_previewr6  Údevice_id_presentÚdevice_id_previewNr”  )Ú	connectedÚjoined_room_countÚlast_sync_age_seconds)ÚmodeÚenabledÚdeps_availableÚcrypto_store_pathÚrecovery_key_configuredÚMATRIX_ALLOW_PUBLIC_ROOMSrÁ  )Úallowed_user_countÚallowed_room_countÚignored_user_pattern_countrÄ  Úfree_response_room_countÚallow_room_mentionsÚprocess_noticesÚallow_public_roomsÚmax_media_bytes)Úplatformr  ÚauthrI  Úe2eeÚpolicyÚmedia) rH  r@  r}  r~  rb  r"  r‚  r|  r  rÈ  r‡   r!  rŒ  rŠ   r€  r�  r±  rx   r  rí  r}   r³  r´  rµ  r—  rš  rœ  r¡  r£   rd  r²   r§  )rÿ   ÚnowÚtoken_presentr6  r@  s        r)   Úget_diagnosticszMatrixAdapter.get_diagnostics¯  s×  € åŒi‰kŒkˆÝ˜TÔ/Ñ0Ô0ˆØ”-ÐJ¥7¨4¬<¸ÀÑ#DÔ#DÐJÈˆØ”OÐS¥w¨t¬|¸[È"Ñ'MÔ'MÐSÐQSˆ	à ØÔ*à(5Ý$(¨¬Ñ$8Ô$8Ø*7Ð!?  ¸RØ"Ý%)¨)¡_¤_Ý%9¸)Ñ%DÔ%Dðð ð "œ\°Ð5Ý%(¨Ô);Ñ%<Ô%<à:>Ô:LÐV•C˜˜S 4Ô#5Ñ5Ñ6Ô6Ð6ÐRVð	ð ð œÝ Ô 0Ñ1Ô1Ý"2Ñ"4Ô"4Ý%(­Ñ%9Ô%9Ý+/Ý(Ñ*Ô*×0Ò0Ñ2Ô2ñ,ô ,ðð õ '*¨$Ô*@Ñ&AÔ&AÝ&)¨$Ô*@Ñ&AÔ&AÝ.1°$Ô2MÑ.NÔ.NØ#'Ô#8Ý,/°Ô0@Ñ,AÔ,AØ'+Ô'@Ø#'Ô#8Ý&(¤iÐ0KÈRÑ&PÔ&P×&VÒ&VÑ&XÔ&XØ'ð'(ð
ð 
ð " 4Ô#8ððM)
ð )
ð )	
r(   c              ƒ  óž   K  — | j         rC	 | j                              t          |¦  «        d¬¦  «        ƒ d{V —† dS # t          $ r Y dS w xY wdS )zSend a typing indicator.é0u  rw  N©r"  Ú
set_typingr   r   )rÿ   rJ  r�   s      r)   Úsend_typingzMatrixAdapter.send_typingä  s|   è è € ð Œ<ð 	ðØ”l×-Ò-­f°W©o¬oÀuÐ-ÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMøÝð ð ð Ø��ðøøøð	ð 	ó   ‹/< ¼
A
Á	A
c              ƒ  óž   K  — | j         rC	 | j                              t          |¦  «        d¬¦  «        ƒ d{V —† dS # t          $ r Y dS w xY wdS )zClear the typing indicator.r   rw  Nr®  )rÿ   rJ  s     r)   Ústop_typingzMatrixAdapter.stop_typingî  sz   è è € àŒ<ð 	ðØ”l×-Ò-­f°W©o¬oÀqÐ-ÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIøÝð ð ð Ø��ðøøøð	ð 	r±  )ÚfinalizerK  r´  c             ƒ  óâ  K  — |                       |¦  «        }|                      |¦  «        }dd|› �|dœ}d|v r|d         |d<   d|v rd|d<   d|d         › �|d<   d|d	œ|d
<   	 | j                             t	          |¦  «        t
          j        |¦  «        ƒ d{V —†}t          dt          |¦  «        ¬¦  «        S # t          $ r(}	t          dt          |	¦  «        ¬¦  «        cY d}	~	S d}	~	ww xY w)z)Edit an existing message (via m.replace).úm.textz* )ÚmsgtyperÄ   zm.new_contentú
m.mentionsÚformatted_bodyúorg.matrix.custom.htmlÚformatú	m.replace)Úrel_typerÀ  úm.relates_toNTry  Frx  )
rz  r}  r"  r€  r   r   r#   rK   rx   r   )
rÿ   rJ  rK  rÐ   r´  r�  Únew_contentr…  rÀ  rã  s
             r)   Úedit_messagezMatrixAdapter.edit_message÷  sZ  è è € ð
 ×'Ò'¨Ñ0Ô0ˆ	Ø×6Ò6°yÑAÔAˆàØ$˜Ð$Ð$Ø(ð'
ð '
ˆð
 ˜;Ð&Ð&Ø(3°LÔ(AˆK˜Ñ%Ø˜{Ð*Ð*Ø$<ˆK˜Ñ!Ø,P°Ð=MÔ1NÐ,PÐ,PˆKÐ(Ñ)à#Ø"ð'
ð '
ˆ�NÑ#ð
	=Ø!œ\×<Ò<Ý�w‘”ÝÔ&Øñô ð ð ð ð ð ð ˆHõ
  dµs¸8±}´}ÐEÑEÔEÐEøÝð 	=ð 	=ð 	=Ý eµ3°s±8´8Ð<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøs   Á%AB< Â<
C.ÃC)Ã#C.Ã)C.Ú	image_urlÚcaptionc           
   ƒ  ó  •K  — ddl m}  ||¦  «        sFt                               d¦  «         t	          ¦   «                              |||||¬¦  «        ƒ d{V —†S 	 |                      |¦  «        ƒ d{V —†\  }}}	nh# t          $ r[}
t                               dt          |¦  «        |
¦  «         d}|r|› d|› �}|  	                    |||¦  «        ƒ d{V —†cY d}
~
S d}
~
ww xY w|  
                    |||	|d	|||¦  «        ƒ d{V —†S )
z.Download an image URL and upload it to Matrix.r   ©Úis_safe_urlz2Matrix: blocked unsafe image URL (SSRF protection)©r�   Nz'Matrix: failed to download image %s: %szwI couldn't download and upload the image to Matrix. The source URL was not shown because it may contain private tokens.rÉ   úm.image)Útools.url_safetyrÅ  r€   r¥  rû   Ú
send_imageÚ!_download_external_media_with_capr   rú  r‡  Ú_upload_and_send)rÿ   rJ  rÁ  rÂ  rr  r�   rÅ  r#  ÚctÚfnamerã  Úfallbackr   s               €r)   rÉ  zMatrixAdapter.send_image	  sÉ  øè è € ð 	1Ð0Ð0Ð0Ð0Ð0àˆ{˜9Ñ%Ô%ð 	Ý�NŠNÐOÑPÔPÐPÝ™œ×+Ò+Ø˜ G¨XÀð ,ñ ô ð ð ð ð ð ð ð ð	Ø$(×$JÒ$JÈ9Ñ$UÔ$UÐUÐUÐUÐUÐUÐU‰OˆD�"�e�eøÝð 	ð 	ð 	Ý�NŠNØ9Ý# IÑ.Ô.Øñô ð ðVð ð ð 4Ø%Ð3Ð3¨Ð3Ð3�ØŸšØØØñô ð ð ð ð ð ð ð ð ð ð ð ð øøøøð	øøøð$ ×*Ò*Ø�T˜5 " i°¸(ÀHñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
s   ÁA< Á<
C!ÂACÃC!ÃC!rô  útuple[bytes, str, str]c              ƒ  óF  ‡ ‡K  — ddl mŠ  ‰|¦  «        st          d¦  «        ‚d0ˆ fd„}d1d„}d2ˆ fd„}|                     dd¦  «        d                              d¦  «        d         pd}d3ˆfd„}	 ddl}t          ‰ j        ¦  «        \  }}	 |j        d4i |¤Ž4 ƒd{V —†}
|}t          d¦  «        D �]l} |
j
        |f|                     d¬¦  «        dd œ|	¤Ž4 ƒd{V —†	 }|j        d!v rJ|j         
                    d"¦  «        }|st          d#¦  «        ‚ |||¦  «        }	 ddd¦  «        ƒd{V —† Œƒ|                     ¦   «           ||j        ¦  «         g }d}|j                             d$¦  «        2 3 d{V —†} |||t#          |¦  «        ¦  «        }Œ"6  |t%          |d	d¦  «        p|j         
                    d%d&¦  «        ¦  «        }d'                     |¦  «        ||fcddd¦  «        ƒd{V —† c cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   �Œnt          d(¦  «        ‚# 1 ƒd{V —†swxY w Y   dS # t(          $ �rR dd)l m} i }‰ j        r
‰ j        |d*<   d+t,          gi|d,<    |d4i |¤Ž4 ƒd{V —†}
|
                     d-|d.d¬/¦  «        4 ƒd{V —†	 }|                     ¦   «           ||j        ¦  «         g }d}|                     ¦   «         2 3 d{V —†} |||t#          |¦  «        ¦  «        }Œ"6  ||j         
                    d%d&¦  «        ¦  «        }d'                     |¦  «        ||fcddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† cY S # 1 ƒd{V —†swxY w Y   	 ddd¦  «        ƒd{V —† Y dS # 1 ƒd{V —†swxY w Y   Y dS w xY w)5zFDownload external media while enforcing redirect safety and size caps.r   rÄ  zblocked unsafe media URLÚheadersr   rR   rø   c                ó.  •— d }	 |                       d¦  «        p|                       d¦  «        }n# t          $ r d }Y nw xY w|€d S 	 t          |¦  «        }n# t          t          f$ r Y d S w xY w|‰j        k    rt	          d|› d‰j        › d�¦  «        ‚d S )NzContent-Lengthzcontent-lengthzmedia exceeds Matrix limit (ú > ú bytes))rc  r   r~   rg  rh  r§  )rÑ  rk  Úsizerÿ   s      €r)   Ú_check_content_lengthzNMatrixAdapter._download_external_media_with_cap.<locals>._check_content_lengthG	  sÛ   ø€ ØˆCðØ—k’kÐ"2Ñ3Ô3ÐT°w·{²{ÐCSÑ7TÔ7T��øÝð ð ð Ø���ðøøøàˆ{Ø�ðÝ˜3‘x”x��øÝ�zÐ*ð ð ð Ø��ðøøøà�dÔ+Ò+Ð+Ý ØZ°4ÐZÐZ¸DÔ<QÐZÐZÐZñô ð ð ,Ð+s   …*0 °?¾?ÁA ÁA,Á+A,Úcontent_typerx   c                óì   — t          | pd¦  «                             dd¦  «        d                              ¦   «                              ¦   «         } |                      d¦  «        st          d¦  «        ‚| S )Nr]   r(  rB   r   r‰  zexternal media is not an image)rx   rÊ   r}   r²   r¾   rh  )r×  s    r)   Ú_check_image_content_typezRMatrixAdapter._download_external_media_with_cap.<locals>._check_image_content_typeX	  sm   € Ý˜|Ð1¨rÑ2Ô2×8Ò8¸¸aÑ@Ô@ÀÔC×IÒIÑKÔK×QÒQÑSÔSˆLØ×*Ò*¨8Ñ4Ô4ð CÝ Ð!AÑBÔBÐBØÐr(   rù  úlist[bytes]Útotalr~   r„  rû  c                óœ   •— |t          |¦  «        z  }|‰j        k    rt          d‰j        › d�¦  «        ‚|                      |¦  «         |S )Nzmedia exceeds Matrix limit (> rÔ  )r‡   r§  rh  r‹   )rù  rÛ  r„  rÿ   s      €r)   Ú_append_chunkzFMatrixAdapter._download_external_media_with_cap.<locals>._append_chunk^	  s]   ø€ Ø•S˜‘Z”ZÑˆEØ�tÔ,Ò,Ð,Ý ØS°TÔ5JÐSÐSÐSñô ð ð �LŠL˜ÑÔÐØˆLr(   r±   rB   éÿÿÿÿrö  z	image.pngÚcurrent_urlÚlocationc                ó\   •— t          | |¦  «        } ‰|¦  «        st          d¦  «        ‚|S )aˆ  Resolve a redirect Location and re-validate it against SSRF policy.

            A public-looking URL can 302-redirect the gateway toward loopback,
            private-network, or cloud-metadata endpoints. Validating only the
            final URL is insufficient because the connection to the unsafe hop
            has already been made. Re-check every hop before following it.
            zblocked unsafe redirect URL)r   rh  )rß  rà  Únext_urlrÅ  s      €r)   Ú_safe_redirect_targetzNMatrixAdapter._download_external_media_with_cap.<locals>._safe_redirect_targeti	  s;   ø€ õ ˜{¨HÑ5Ô5ˆHØ�;˜xÑ(Ô(ð @Ý Ð!>Ñ?Ô?Ð?ØˆOr(   Né   rP   )rÛ  F)r[   Úallow_redirects>   é-  é.  é/  é3  é4  ÚLocationzredirect missing Locationi   zcontent-typeúapplication/octet-streamr(   ztoo many redirects)Úcreate_ssrf_safe_async_clientrŸ  ÚresponseÚevent_hooksÚGETT)Úfollow_redirectsr[   )rÑ  r   rR   rø   )r×  rx   rR   rx   )rù  rÚ  rÛ  r~   r„  rû  rR   r~   )rß  rx   rà  rx   rR   rx   r'   )rÈ  rÅ  rh  ÚrsplitrÊ   r   rM   r¦  r¡  rˆ   rc  ÚClientTimeoutÚstatusrÑ  Úraise_for_statusrÐ   Úiter_chunkedrû  rb  rÌ   r¤  rí  rN   ÚstreamÚaiter_bytes)rÿ   rô  rÖ  rÙ  rÝ  rÍ  rã  Ú_aiohttpÚ_sess_kwÚ_req_kwr  Ú	fetch_urlr®   r×  rà  rù  rÛ  r„  rÌ  rí  Ú	_httpx_kwrÅ  s   `                    @r)   rÊ  z/MatrixAdapter._download_external_media_with_cap@	  s¨  øøè è € à0Ð0Ð0Ð0Ð0Ð0àˆ{˜3ÑÔð 	9ÝÐ7Ñ8Ô8Ð8ð	ð 	ð 	ð 	ð 	ð 	ð"	 ð 	 ð 	 ð 	 ð	ð 	ð 	ð 	ð 	ð 	ð —
’
˜3 Ñ"Ô" 2Ô&×,Ò,¨SÑ1Ô1°!Ô4ÐC¸ˆð	ð 	ð 	ð 	ð 	ð 	ð6	6Ø&Ð&Ð&Ð&å 8¸¼Ñ IÔ IÑˆH�gØ-�xÔ-Ð9Ð9°Ð9Ð9ð 7ð 7ð 7ð 7ð 7ð 7ð 7¸TØ�	Ý˜r™œð :ñ :�AØ'˜tœxØ!ð à (× 6Ò 6¸RÐ 6Ñ @Ô @Ø(-ð ð  ð "ð	 ð  ð :ð :ð :ð :ð :ð :ð :ð :ð
 Øœ;Ð*CÐCÐCØ'+¤|×'7Ò'7¸
Ñ'CÔ'C˜HØ#+ð NÝ&0Ð1LÑ&MÔ&MÐ MØ(=Ð(=¸iÈÑ(RÔ(R˜IØ$ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :ð :ð :ð ×-Ò-Ñ/Ô/Ð/Ø-Ð-¨d¬lÑ;Ô;Ð;Ø-/˜Ø !˜Ø+/¬<×+DÒ+DÀUÑ+KÔ+Kð Nð Nð Nð Nð Nð Nð N %Ø$1 M°%¸ÅÀeÁÄÑ$MÔ$M˜E˜Eð ,Là6Ð6Ý# D¨.¸$Ñ?Ô?ð \Ø#œ|×/Ò/°Ð@ZÑ[Ô[ñô ˜ð  #Ÿxšx¨™œ°°EÐ9ð-:ð :ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð7ð 7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð:ð :ð :ð :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ñ :õ. !Ð!5Ñ6Ô6Ð6ð57ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7øõ6 ð 	6ñ 	6ð 	6ØFÐFÐFÐFÐFÐFà ˆIØŒð 5Ø%)¤_�	˜'Ñ"Ø(2Õ5IÐ4JÐ'KˆI�mÑ$Ø4Ð4ÐAÐA°yÐAÐAð 6ð 6ð 6ð 6ð 6ð 6ð 6ÀTØŸ;š;ØØØ%)Øð	 'ñ ô ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð
 Ø×)Ò)Ñ+Ô+Ð+Ø)Ð)¨$¬,Ñ7Ô7Ð7Ø)+�EØ�EØ'+×'7Ò'7Ñ'9Ô'9ð Jð Jð Jð Jð Jð Jð J˜eØ - ¨e°U½EÀ%¹L¼LÑ IÔ I˜˜ð (:à2Ð2Øœ×(Ò(¨Ð9SÑTÔTñô �Bð Ÿ8š8 E™?œ?¨B°Ð5ð6ð 6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð6ð 6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð 6ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð 6ð 6ð 6ð	6øøøsÑ   Á3.I Â!A H0Ã"AHÄ$H0Ä6AHÅ8FÅ>A)HÇ'H0Ç;I È
HÈH0ÈHÈH0È0
H:È:I È=H:È>I É?N Ê NÊ#=M%Ë LË&AM%Ì>NÍN Í%
M/Í/NÍ2M/Í3NÍ7N Î
N	ÎN ÎN	ÎN ÎN Ú
image_pathc              ƒ  óH   K  — |                       ||d|||¬¦  «        ƒ d{V —†S )z$Upload a local image file to Matrix.rÇ  rÆ  N©Ú_send_local_file)rÿ   rJ  rþ  rÂ  rr  r�   s         r)   Úsend_image_filezMatrixAdapter.send_image_file®	  óP   è è € ð ×*Ò*Ø�Z ¨G°XÈð +ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r(   r”  r  úlist[tuple[str, str]]Úhuman_delayr{   c           	   ƒ  ó  K  — |sdS ddl m} t          |¦  «        }t          |d¬¦  «        D ]Ó\  }\  }}	|dk    r |dk    rt	          j        |¦  «        ƒ d{V —† |	pd}
|dk    r|
r|
› d|› d|› d�}
|                     d	¦  «        r1|                      | ||d
d…         ¦  «        |
|¬¦  «        ƒ d{V —†}n|                      |||
|¬¦  «        ƒ d{V —†}|j	        s"t                               d|||j        ¦  «         ŒÔdS )z9Send multiple Matrix images as one ordered logical batch.Nr   )ÚunquoterB   )r’   z (r±   r  zfile://é   )rJ  rþ  rÂ  r�   )rJ  rÁ  rÂ  r�   z&Matrix: failed to send image %d/%d: %s)Úurllib.parser  r‡   r|  rQ  Úsleepr¾   r  rÉ  rt  r€   r¥  rW   )rÿ   rJ  r  r�   r  Ú_unquoterÛ  r‘   rÁ  Úalt_textrÂ  rŽ   s               r)   Úsend_multiple_imagesz"MatrixAdapter.send_multiple_images»	  s«  è è € ð ð 	ØˆFØ4Ð4Ð4Ð4Ð4Ð4å�F‘”ˆÝ*3°FÀ!Ð*DÑ*DÔ*Dð 	cð 	cÑ&ˆCÑ&�)˜XØ˜QŠˆ 3¨¢7 7Ý”m KÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ& $ˆGØ�qŠyˆy˜WˆyØ$Ð6Ð6¨Ð6Ð6¨eÐ6Ð6Ð6�Ø×#Ò# IÑ.Ô.ð Ø#×3Ò3Ø#Ø'˜x¨	°!°"°"¬Ñ6Ô6Ø#Ø%ð	  4ñ  ô  ð ð ð ð ð ð ��ð  $ŸšØ#Ø'Ø#Ø%ð	  /ñ  ô  ð ð ð ð ð ð �ð ”>ð cÝ—’ÐGÈÈeÐU[ÔUaÑbÔbÐbøð+	cð 	cr(   Ú	file_pathÚ	file_namec           	   ƒ  óH   K  — |                       ||d||||¦  «        ƒ d{V —†S )z"Upload a local file as a document.úm.fileNr   )rÿ   rJ  r  rÂ  r  rr  r�   s          r)   Úsend_documentzMatrixAdapter.send_documentß	  sM   è è € ð ×*Ò*Ø�Y ¨'°8¸YÈñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r(   Ú
audio_pathc           
   ƒ  ó  K  — d}|}t          |¦  «                             ¦   «                              d¦  «        s$t          j        t
          |¦  «        ƒ d{V —†}|r|}	 |                      ||d|||r't          |¦  «                             d¦  «        j	        nd|d¬¦  «        ƒ d{V —†	 |r&	 t          j        |¦  «         S # t          $ r Y S w xY wS # |r&	 t          j        |¦  «         w # t          $ r Y w w xY ww xY w)u(  Upload an audio file as a voice message (MSC3245 native voice).

        Matrix voice bubbles require Opus in an Ogg container (MSC3245), but
        callers can reach this with any audio format â€” e.g. a model-invoked
        ``text_to_speech`` result routed through gateway media delivery, not
        just ``_send_voice_reply``. Enforce the codec at this boundary:
        transcode non-Ogg input to Ogg/Opus (best-effort â€” if ffmpeg is
        unavailable the original file is sent unchanged, preserving the
        previous behaviour).
        N)r™   z.ogaz.opusúm.audior™   T)r  r�   Úis_voice)rx   r²   rŠ  rQ  Ú	to_threadrª   r  r   Úwith_suffixr«   r£   r¦   r§   )rÿ   rJ  r  rÂ  rr  r�   Úconverted_pathÚ	send_paths           r)   Ú
send_voicezMatrixAdapter.send_voiceí	  sŽ  è è € ð$ )-ˆØˆ	Ý�:‰Œ×$Ò$Ñ&Ô&×/Ò/Ð0IÑJÔJð 	+Ý#*Ô#4Ý.°
ñ$ô $ð ð ð ð ð ð ˆNð ð +Ø*�	ð	Ø×.Ò.ØØØØØð
 &ð•D˜Ñ$Ô$×0Ò0°Ñ8Ô8Ô=Ð=àà!Øð /ñ ô ð ð ð ð ð ð ð ð" ð ðÝ”I˜nÑ-Ô-Ð-Ð-øÝð ð ð Ø�Dðøøøðøˆ~ð ðÝ”I˜nÑ-Ô-Ð-Ð-øÝð ð ð Ø�DðøøøðøøøsC   Á AC Â/CÃ
CÃCÃC?ÃC.Ã-C?Ã.
C;Ã8C?Ã:C;Ã;C?Ú
video_pathc              ƒ  óH   K  — |                       ||d|||¬¦  «        ƒ d{V —†S )zUpload a video file.úm.videorÆ  Nr   )rÿ   rJ  r  rÂ  rr  r�   s         r)   Ú
send_videozMatrixAdapter.send_video
  r  r(   u/   âš ï¸� **Dangerous command requires approval**
iÐ  údangerous commandÚcommandrI  ÚdescriptionúOptional[dict]Úallow_permanentÚallow_sessionÚsmart_deniedc	              ƒ  ó.  K  — | j         st          dd¬¦  «        S t          |pi                      d¦  «        pd¦  «        pd}	d}
|rd}
nd}
|r|
dz  }
|r|
d	z  }
d
g}|r,|                     d¦  «         |r|                     d¦  «         |                     d¦  «         |                      ||¦  «        › d|
› d�d                     |¦  «        z   }|                      |||¬¦  «        ƒ d{V —†}|j        r|j	        s|S t          |||j	        |	t          j        ¦   «         t          | j        d¦  «        z   ¬¦  «        }| j                             |¦  «        }|r| j                             |d¦  «         || j        |j	        <   |j	        | j        |<   |sd}n|sd}nd}|D ]q}	 |                      ||j	        |¦  «        ƒ d{V —†}|rt          |¦  «        |j        |<   Œ?# t(          $ r&}t*                               d||¦  «         Y d}~Œjd}~ww xY w|S )z6Send a reaction-based exec approval prompt for Matrix.FúNot connectedrx  rL  r]   Nz?Smart DENY: owner override applies to this one operation only.
zBReply `!approve session` to approve this pattern for the session, z*`!approve always` to approve permanently, u   âœ… = approve onceu   ðŸŒ€ = approve for this sessionu   â™¾ï¸� = approve alwaysu
   â�Ž = denyz

zeReply `!approve` to execute once, or `!deny` to cancel.

You can also click the reaction to approve:
rÉ   rÆ  r   )rI  rJ  rK  rL  rM  )rj  rn  )rj  rk  rn  )rj  rk  rl  rn  z.Matrix: failed to add approval reaction %s: %s)r"  rK   rx   rc  r‹   Ú_format_exec_approvalrÌ   r‡  rt  rK  rH  rH  Ú	monotonicrŠ   r°  r®  r­  ÚpopÚ_send_reactionrP  r   r€   r�   )rÿ   rJ  r!  rI  r"  r�   r$  r%  r&  rL  Úscope_choicesÚreaction_legend_partsrZ   rŽ   r  Ú	old_eventr|  ÚemojiÚreaction_resultrã  s                       r)   Úsend_exec_approvalz MatrixAdapter.send_exec_approval2
  sí  è è € ð Œ|ð 	DÝ e°?ÐCÑCÔCÐCå  ¨R× 4Ò 4Ð5HÑ IÔ IÐ OÈRÑPÔPÐXÐTXÐØˆØð 	NØ^ˆMˆMàˆMØð fØÐ!eÑe�Øð NØÐ!MÑM�Ø!5Ð 6ÐØð 	HØ!×(Ò(Ð)JÑKÔKÐKØð HØ%×,Ò,Ð-FÑGÔGÐGØ×$Ò$ \Ñ2Ô2Ð2à×)Ò)¨'°;Ñ?Ô?ð <ð <Øð<ð <ð <ð �iŠiÐ-Ñ.Ô.ñ/ð 	ð —y’y ¨$¸�yÑBÔBÐBÐBÐBÐBÐBÐBˆØŒ~ð 	 VÔ%6ð 	ØˆMå&Ø#ØØÔ(Ø/Ý”~Ñ'Ô'­#¨dÔ.LÈaÑ*PÔ*PÑPð
ñ 
ô 
ˆð Ô4×8Ò8¸ÑEÔEˆ	Øð 	AØÔ+×/Ò/°	¸4Ñ@Ô@Ð@Ø=CˆÔ'¨Ô(9Ñ:Ø8>Ô8IˆÔ(¨Ñ5àð 	9Ø&ˆIˆIØ ð 	9Ø.ˆIˆIà8ˆIØð 	[ð 	[ˆEð[Ø(,×(;Ò(;¸GÀVÔEVÐX]Ñ(^Ô(^Ð"^Ð"^Ð"^Ð"^Ð"^Ð"^�à"ð MÝ8;¸OÑ8LÔ8L�FÔ.¨uÑ5øøÝð [ð [ð [Ý—’ÐMÈuÐVYÑZÔZÐZÐZÐZÐZÐZÐZøøøøð[øøøð ˆs   Æ&;G"Ç"
HÇ,HÈHÚ	providersr7  Úcurrent_modelÚcurrent_providerc              ƒ  ó’  K  — | j         st          dd¬¦  «        S g }|pg D ]ò}	t          |	                     d¦  «        pd¦  «        }
t          |	                     d¦  «        p|
¦  «        }|	                     d¦  «        pg }|D ]g}t	          |¦  «        t	          t
          ¦  «        k    r n?|                     t
          t	          |¦  «                 t          |¦  «        |
|f¦  «         Œht	          |¦  «        t	          t
          ¦  «        k    r nŒó|s|                      |d|¬	¦  «        ƒ d
{V —†S 	 ddlm	}  ||¦  «        }n# t          $ r |}Y nw xY wdd|pd› d�d|pd› �ddg}i }|D ]+\  }}}
}||
f||<   |                     |› d|› d|› �¦  «         Œ,|                      |d                     |¦  «        |¬	¦  «        ƒ d
{V —†}|j        r|j        s|S t          ||j        |||t          |pi                      d¦  «        pd¦  «        pd
t          j        ¦   «         t#          | j        d¦  «        z   ¬¦  «        }|| j        |j        <   |D ]q}	 |                      ||j        |¦  «        ƒ d
{V —†}|rt          |¦  «        |j        |<   Œ?# t          $ r&}t,                               d||¦  «         Y d
}~Œjd
}~ww xY w|S )z*Send a Matrix reaction-based model picker.Fr(  rx  Úslugr]   r«   Úmodelsz7No authenticated models are available for this session.rÆ  Nr   )Ú	get_labelu   âš™ **Model Configuration**zCurrent model: `Úunknownú`z
Provider: zReact to choose a model:z `u   ` â€” rÉ   rL  )rJ  rK  rI  rS  rT  rL  rM  z2Matrix: failed to add model picker reaction %s: %s)r"  rK   rx   rc  r‡   Ú_MATRIX_MODEL_PICKER_REACTIONSr‹   r‡  Úhermes_cli.providersr9  r   rÌ   rt  rK  rR  rH  r*  rŠ   r°  r±  r,  rP  r€   r�   )rÿ   rJ  r3  r4  r5  rI  rT  r�   Úflat_choicesÚproviderÚprovider_slugÚprovider_namer8  Úmodel_idr9  Úprovider_labelrÖ   rS  r0  rŽ   r  Úreaction_event_idrã  s                          r)   Úsend_model_pickerzMatrixAdapter.send_model_pickerz
  s×  è è € ð Œ|ð 	DÝ e°?ÐCÑCÔCÐCà8:ˆØ!˜ Rð 	ð 	ˆHÝ §¢¨VÑ 4Ô 4Ð :¸Ñ;Ô;ˆMÝ §¢¨VÑ 4Ô 4Ð E¸ÑFÔFˆMØ—\’\ (Ñ+Ô+Ð1¨rˆFØ"ð ð �Ý�|Ñ$Ô$­Õ,JÑ(KÔ(KÒKÐKØ�EØ×#Ò#Ý2µ3°|Ñ3DÔ3DÔEÝ˜‘M”MØ!Ø!ð	%ñ ô ð ð õ �<Ñ Ô ¥CÕ(FÑ$GÔ$GÒGÐGØ�ð Hð ð 	ØŸšØØIØ!ð #ñ ô ð ð ð ð ð ð ð ð	.Ø6Ð6Ð6Ð6Ð6Ð6Ø&˜YÐ'7Ñ8Ô8ˆNˆNøÝð 	.ð 	.ð 	.Ø-ˆNˆNˆNð	.øøøð *Ø<˜}Ð9°	Ð<Ð<Ð<Ø6˜Ð4¨9Ð6Ð6ØØ&ð
ˆð /1ˆØ=Ið 	Fð 	FÑ9ˆE�8˜]¨MØ&¨Ð6ˆG�E‰NØ�LŠL˜EÐDÐD XÐDÐD°]ÐDÐDÑEÔEÐEÐEà—y’y ¨$¯)ª)°EÑ*:Ô*:ÀX�yÑNÔNÐNÐNÐNÐNÐNÐNˆØŒ~ð 	 VÔ%6ð 	ØˆMå)ØØÔ(Ø#ØØ/Ý! 8 >¨r×"6Ò"6Ð7JÑ"KÔ"KÐ"QÈrÑRÔRÐZÐVZÝ”~Ñ'Ô'­#¨dÔ.LÈaÑ*PÔ*PÑPð
ñ 
ô 
ˆð BHˆÔ+¨FÔ,=Ñ>àð 	_ð 	_ˆEð_Ø*.×*=Ò*=¸gÀvÔGXÐZ_Ñ*`Ô*`Ð$`Ð$`Ð$`Ð$`Ð$`Ð$`Ð!Ø$ð OÝ8;Ð<MÑ8NÔ8N�FÔ.¨uÑ5øøÝð _ð _ð _Ý—’ÐQÐSXÐZ]Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^øøøøð_øøøð ˆs*   Ä5E ÅEÅEÉ;JÊ
KÊJ?Ê?KÚtitlerS  c              ƒ  ó’  K  — | j         st          dd¬¦  «        S i }|dg}t          |¦  «        D ]­\  }	}
|	t          t          ¦  «        k    r n�t          |	         }t          |
                     d¦  «        pd¦  «        }t          |
                     d¦  «        p|¦  «        }|
                     d¦  «        r|› d�}|||<   |                     |› d	|› �¦  «         Œ®|st          dd
¬¦  «        S |                     d¦  «         |                     d¦  «         |                      |d 	                    |¦  «        |¬¦  «        ƒ d{V —†}|j
        r|j        s|S t          ||j        |||t          |pi                      d¦  «        pd¦  «        pdt          j        ¦   «         t          | j        d¦  «        z   ¬¦  «        }|| j        |j        <   |D ]q}	 |                      ||j        |¦  «        ƒ d{V —†}|rt          |¦  «        |j        |<   Œ?# t(          $ r&}t*                               d||¦  «         Y d}~Œjd}~ww xY w|S )zÚSend a Matrix reaction-based choice picker (/reasoning, /fast).

        Generic single-level companion to ``send_model_picker``. Each choice
        dict: ``{"value": str, "label": str, "is_current": bool}``.
        Fr(  rx  r]   rq   ÚlabelÚ
is_currentu    â†� currentÚ z
No choiceszReact to choose.rÉ   rÆ  NrL  r   )rJ  rK  rI  rS  r\  rL  rM  z3Matrix: failed to add choice picker reaction %s: %s)r"  rK   r|  r‡   Ú_MATRIX_CHOICE_PICKER_REACTIONSrx   rc  r‹   r‡  rÌ   rt  rK  r[  rH  r*  rŠ   r°  r²  r,  rP  r   r€   r�   )rÿ   rJ  rF  rS  rI  r\  r�   Úemoji_choicesrÖ   rÝ   Úchoicer0  rq   rH  rŽ   r  rD  rã  s                     r)   Úsend_choice_pickerz MatrixAdapter.send_choice_pickerË
  sÃ  è è € ð Œ|ð 	DÝ e°?ÐCÑCÔCÐCà(*ˆØ˜�ˆÝ" 7Ñ+Ô+ð 		-ð 		-‰IˆAˆvØ•CÕ7Ñ8Ô8Ò8Ð8Ø�Ý3°AÔ6ˆEÝ˜Ÿ
š
 7Ñ+Ô+Ð1¨rÑ2Ô2ˆEÝ˜Ÿ
š
 7Ñ+Ô+Ð4¨uÑ5Ô5ˆEØ�zŠz˜,Ñ'Ô'ð /Ø Ð.Ð.Ð.�Ø#(ˆM˜%Ñ Ø�LŠL˜EÐ+Ð+ EÐ+Ð+Ñ,Ô,Ð,Ð,àð 	AÝ e°<Ð@Ñ@Ô@Ð@à�Š�RÑÔÐØ�ŠÐ'Ñ(Ô(Ð(Ø—y’y ¨$¯)ª)°EÑ*:Ô*:ÀX�yÑNÔNÐNÐNÐNÐNÐNÐNˆØŒ~ð 	 VÔ%6ð 	ØˆMå*ØØÔ(Ø#Ø!Ø1Ý! 8 >¨r×"6Ò"6Ð7JÑ"KÔ"KÐ"QÈrÑRÔRÐZÐVZÝ”~Ñ'Ô'­#¨dÔ.LÈaÑ*PÔ*PÑPð
ñ 
ô 
ˆð CIˆÔ,¨VÔ->Ñ?à"ð 	`ð 	`ˆEð`Ø*.×*=Ò*=¸gÀvÔGXÐZ_Ñ*`Ô*`Ð$`Ð$`Ð$`Ð$`Ð$`Ð$`Ð!Ø$ð OÝ8;Ð<MÑ8NÔ8N�FÔ.¨uÑ5øøÝð `ð `ð `Ý—’ÐRÐTYÐ[^Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_øøøøð`øøøð ˆs   Ç;HÈ
IÈH?È?Ic                ó2   — t          j        dd|¦  «        }|S )u<   Pass-through â€” Matrix supports standard Markdown natively.z!\[([^\]]*)\]\(([^)]+)\)z\2rü  )rÿ   rÐ   s     r)   rz  zMatrixAdapter.format_message  s   € õ ”&Ð4°e¸WÑEÔEˆØˆr(   r:  r#  rû  Úfilenamer×  r·  r  Úvoice_metadatac              ƒ  ó  K  — t          |¦  «        | j        k    r*t          ddt          |¦  «        › d| j        › d�¬¦  «        S |}d}| j        rßt	          | j        dd¦  «        rÉt	          | j        dd¦  «        }|r±	 t          |                     t          |¦  «        ¦  «        ƒ d{V —†¦  «        }n# t          $ r d}Y nw xY w|rf	 d	d
l
m}  ||¦  «        \  }}nP# t          $ rC}t                               d|¦  «         t          dt          |¦  «        ¬¦  «        cY d}~S d}~ww xY w	 | j                             |||t          |¦  «        ¬¦  «        ƒ d{V —†}nP# t          $ rC}t                               d|¦  «         t          dt          |¦  «        ¬¦  «        cY d}~S d}~ww xY w||p||t          |¦  «        dœdœ}|�,|                     ¦   «         }t          |¦  «        |d<   ||d<   nt          |¦  «        |d<   |	rYi |d<   |
pi                      d¦  «        }|
pi                      d¦  «        }|�||d         d<   |€|�i }|�||d<   |�||d<   ||d<   |                      |||¬¦  «         	 | j                             t          |¦  «        t(          j        |¦  «        ƒ d{V —†}t          dt          |¦  «        ¬¦  «        S # t          $ r(}t          dt          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)z3Upload bytes to Matrix and send as a media message.Fú!Media file exceeds Matrix limit (rÓ  rÔ  rx  Nr-  r  r   )Úencrypt_attachmentz(Matrix: attachment encryption failed: %s)Ú	mime_typerP  rÕ  zMatrix: upload failed: %s)ÚmimetyperÕ  )r·  rÄ   r2  rô  Úfileúorg.matrix.msc3245.voicer_   rs   r2  zorg.matrix.msc1767.audioru  Try  )r‡   r§  rK   r�  rb  r"  r@  r(  r   r   Úmautrix.crypto.attachmentsrT  r€   rW   rx   Úupload_mediar+  rc  r~  r€  r   r#   )rÿ   r:  r#  rP  r×  r·  rÂ  rr  r�   r  rQ  Úupload_dataÚencrypted_filer  Úroom_encryptedrT  rã  Úmxc_urlr…  Úfile_payloadr_   rs   Úaudio_metadatarÀ  s                           r)   rË  zMatrixAdapter._upload_and_send  s  è è € õ ˆt‰9Œ9�tÔ,Ò,Ð,ÝØØf½#¸d¹)¼)ÐfÐfÈÔH]ÐfÐfÐfðñ ô ð ð
 ˆØˆØÔð 	I¥¨¬°hÀÑ EÔ Eð 	IÝ! $¤,°¸tÑDÔDˆKØð Ið+Ý%)°×0HÒ0HÍÐPWÉÌÑ0YÔ0YÐ*YÐ*YÐ*YÐ*YÐ*YÐ*YÑ%ZÔ%Z�N�NøÝ ð +ð +ð +Ø%*�N�N�Nð+øøøà!ð IðIØQÐQÐQÐQÐQÐQØ6HÐ6HÈÑ6NÔ6NÑ3˜ ^ ^øÝ$ð Ið Ið IÝŸšÐ%OÐQTÑUÔUÐUÝ)°%½sÀ3¹x¼xÐHÑHÔHÐHÐHÐHÐHÐHÐHøøøøðIøøøð
		=Ø œL×5Ò5ØØ&Ø!Ý˜Ñ%Ô%ð	 6ñ ô ð ð ð ð ð ð ˆGˆGøõ ð 	=ð 	=ð 	=Ý�LŠLÐ4°cÑ:Ô:Ð:Ý eµ3°s±8´8Ð<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøð ØÐ'˜xà(Ý˜D™	œ	ðð ð'
ð '
ˆð Ð%Ø)×3Ò3Ñ5Ô5ˆLÝ"% g¡,¤,ˆL˜ÑØ".ˆK˜ÑÐå!$ W¡¤ˆK˜Ñð ð 	IØ68ˆKÐ2Ñ3Ø&Ð,¨"×1Ò1°*Ñ=Ô=ˆHØ&Ð,¨"×1Ò1°*Ñ=Ô=ˆHØÐ#Ø2:�˜FÔ# JÑ/ØÐ# xÐ';Ø13�ØÐ'Ø19�N :Ñ.ØÐ'Ø19�N :Ñ.Ø:H�Ð6Ñ7à×%Ò% k¸HÈxÐ%ÑXÔXÐXð	=Ø!œ\×<Ò<Ý�w‘”ÝÔ&Øñô ð ð ð ð ð ð ˆHõ
  dµs¸8±}´}ÐEÑEÔEÐEøÝð 	=ð 	=ð 	=Ý eµ3°s±8´8Ð<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøsm   Á?5B5 Â5CÃCÃ
C Ã
D,Ã)8D'Ä!D,Ä'D,Ä01E" Å"
F/Å,8F*Æ$F/Æ*F/É>AK Ë
LËLË<LÌLc	              ƒ  óª  K  — t          |¦  «                             ¦   «         }	|	                     ¦   «         sGt                               d| j        |¦  «         |r|› d�nd}
|                      ||
|¦  «        ƒ d{V —†S 	 |	                     ¦   «         j        }n# t          $ r d}Y nw xY w|| j
        k    rt          dd|› d| j
        › d	�¬
¦  «        S |p|	j        }t          j        |¦  «        d         pd}|	                     ¦   «         }|r t          j        t"          |	¦  «        ƒ d{V —†nd}|                      ||||||||||¦
  «
        ƒ d{V —†S )z Read a local file and upload it.z1[%s] upload fallback: media file not found for %su(   
âš ï¸� Couldn't deliver the attachment.u'   âš ï¸� Couldn't deliver the attachment.Nr   FrS  rÓ  rÔ  rx  rì  )r   rÒ  râ  r€   r¥  r«   r‡  ÚstatÚst_sizer§   r§  rK   r‹  rŒ  Ú
read_bytesrQ  r  r•   rË  )rÿ   r:  r  r·  rÂ  rr  r  r�   r  rÞ   rZ   Ú	file_sizerÍ  rÌ  r#  rQ  s                   r)   r  zMatrixAdapter._send_local_filem  sØ  è è € õ �‰OŒO×&Ò&Ñ(Ô(ˆØ�xŠx‰zŒzð 	<å�NŠNØCØ”	˜9ñô ð ð MTð ?�gÐHÐHÐHÐHØ>ð àŸš 7¨D°(Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ð	ØŸš™œÔ(ˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøà�tÔ,Ò,Ð,ÝØØf¸)ÐfÐfÈÔH]ÐfÐfÐfðñ ô ð ð
 Ð#˜QœVˆÝÔ! %Ñ(Ô(¨Ô+ÐIÐ/IˆØ�|Š|‰~Œ~ˆð
 ð•'Ô#Õ$CÀQÑGÔGÐGÐGÐGÐGÐGÐGÐGàð 	ð ×*Ò*ØØØØØØØØØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
s   Â B ÂB)Â(B)c              ƒ  óø  K  — | j         }|j                             ¦   «         ƒ d{V —†}| j        �sÉ	 t	          j        |                     |d¬¦  «        d¬¦  «        ƒ d{V —†}t          |dd¦  «        }|rNt          |t          ¦  «        r9| 
                    ¦   «         }d|v sd|v rt                               d	|¦  «         dS t          |t          ¦  «        �rYt          j        ¦   «         | _        |                     d
i ¦  «                             di ¦  «        }|r^| j                             |                     ¦   «         ¦  «         | j                             ¦   «          | j                             ¦   «          |                     d¦  «        }|r"|}|j                             |¦  «        ƒ d{V —† 	 |                      |¦  «        ƒ d{V —† n2# t2          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|                      |¦  «         t	          j        d¦  «        ƒ d{V —† n¼# t          j        $ r Y dS t2          $ rž}| j        rY d}~dS t          |¦  «         
                    ¦   «         }	d|	v sd|	v sd|	v sd|	v r!t                               d|¦  «         Y d}~dS t                               d|¦  «         t	          j        d¦  «        ƒ d{V —† Y d}~nd}~ww xY w| j        �¯ÇdS dS )z&Continuously sync with the homeserver.Nr­  )Úsincer[   ç     €F@rw  ÚmessageÚm_unknown_tokenÚunknown_tokenu7   Matrix: permanent auth error from sync: %s â€” stoppingr+  rÌ   r,  z%Matrix: sync event dispatch error: %sr   Ú401Ú403ÚunauthorizedÚ	forbiddenu2   Matrix: permanent auth error: %s â€” stopping syncu)   Matrix: sync error: %s â€” retrying in 5sro  )r"  r  Úget_next_batchr‡  rQ  r  rI  rb  r0  rx   r²   r€   rW   rY  rH  rŒ  rc  r!  rK  rÎ  rŽ  rJ  r�  rL  rN  r   r¥  rO  r
  rl  )
rÿ   r$  r,  rd  Ú	_sync_msgÚ_lowerre  rf  rã  Úerr_strs
             r)   rS  zMatrixAdapter._sync_loop©  sÈ  è è € à”ˆà!Ô,×;Ò;Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆ
Ø”-ñ F	'ðE'õ #*Ô"2Ø—K’KØ(Ø %ð  ñ ô ð !ð#ñ #ô #ð ð ð ð ð ð �	õ $ I¨y¸$Ñ?Ô?�	Øð ¥¨IµsÑ!;Ô!;ð Ø&Ÿ_š_Ñ.Ô.�FØ(¨FÐ2Ð2°oÈÐ6OÐ6OÝŸšØUØ%ñô ð ð ˜å˜i­Ñ.Ô.ñ +Ý)-¬©¬�DÔ&à!*§¢¨w¸Ñ!;Ô!;×!?Ò!?ÀÈÑ!KÔ!K�JØ!ð >ØÔ*×1Ò1°*·/²/Ñ2CÔ2CÑDÔDÐDØÔ-×3Ò3Ñ5Ô5Ð5ØÔ5×;Ò;Ñ=Ô=Ð=ð #Ÿš |Ñ4Ô4�BØð CØ%'˜
Ø$Ô/×>Ò>¸rÑBÔBÐBÐBÐBÐBÐBÐBÐBðUØ"×1Ò1°)Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<øÝ$ð Uð Uð UÝŸšÐ'NÐPSÑTÔTÐTÐTÐTÐTÐTÐTøøøøðUøøøà×7Ò7¸	ÑBÔBÐBõ "œ-¨Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øøåÔ)ð ð ð Ø��Ýð 'ð 'ð 'Ø”=ð Ø�F�F�F�F�Få˜c™(œ(Ÿ.š.Ñ*Ô*�à˜WÐ$Ð$Ø Ð'Ð'Ø%¨Ð0Ð0Ø" gÐ-Ð-å—L’LØLÈcñô ð ð �F�F�F�F�FÝ—’ÐJÈCÑPÔPÐPÝ”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøð!'øøøðm ”-ñ F	'ð F	'ð F	'ð F	'ð F	's\   ²BH4 ÃC1H4 Æ6G ÇH4 Ç
HÇG<Ç7H4 Ç<HÈ2H4 È4K-É	K-ÉK(ÉAK(Ê.5K(Ë(K-rd  c              ƒ  óB  K  — | j         }|rt          |d¦  «        sdS |                     |¦  «        }t          j        |¦  «        r|ƒ d{V —†}|rLt          j        |ddiŽƒ d{V —†}|D ]4}t          |t          ¦  «        rt           
                    d|¦  «         Œ3dS dS )z=Dispatch a sync response through the mautrix event machinery.Úhandle_syncNri  Tz5Matrix: event handler failed during sync dispatch: %s)r"  r-  ru  ÚinspectÚisawaitablerQ  rn  r0  r   r€   r¥  )rÿ   rd  r$  ÚtasksÚresultsrŽ   s         r)   rN  zMatrixAdapter._dispatch_syncú  sä   è è € à”ˆØð 	�W V¨]Ñ;Ô;ð 	ØˆFØ×"Ò" 9Ñ-Ô-ˆÝÔ˜uÑ%Ô%ð 	 Ø�K�K�K�K�K�KˆEØð 	õ $œN¨EÐJÀTÐJÐJÐJÐJÐJÐJÐJÐJˆGØ!ð ð �Ý˜f¥iÑ0Ô0ð Ý—N’NØOØñô ð øð	ð 	ðð r(   Úsenderc                ó¸   — | j         pd                     ¦   «                              ¦   «         }|sdS |                     ¦   «                              ¦   «         |k    S )u¼  Return True if the sender refers to the bot's own account.

        Matrix user IDs are byte-compared after trimming whitespace and
        lowercasing â€” some homeservers normalize the localpart case
        differently at different API surfaces, and the reply-loop tail
        of the "hall of mirrors" bug (#15763) has been observed with the
        bot's own account bypassing a case-sensitive equality check.

        When ``self._user_id`` is empty (whoami hasn't resolved yet, or
        login failed), we cannot prove a sender is NOT us, so we return
        True defensively â€” an unidentified bot dropping its own events
        is always preferable to falling into an echo loop.
        r]   T)r~  r}   r²   )rÿ   rz  Úowns      r)   Ú_is_self_senderzMatrixAdapter._is_self_sender  sT   € ð Œ}Ð" ×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØð 	Ø�4Ø�|Š|‰~Œ~×#Ò#Ñ%Ô%¨Ò,Ð,r(   c                óæ   — | pd                      ¦   «         }|sdS |                     d¦  «        r
|dd…         }d|v r|                     d¦  «        \  }}}n|}|sdS |                     d¦  «        S )u$  Return True if the sender looks like a system / bridge / appservice
        identity rather than a real user.

        Appservice namespaces on Matrix conventionally prefix bot / puppet
        user IDs with an underscore (e.g. ``@_telegram_12345:server``,
        ``@_discord_999:server``, ``@_slack_...:server``).  Server-notices
        bots and bridge-controller bots on many homeservers use the same
        pattern.

        We treat these as system identities for pairing purposes: they
        should never be offered a pairing code, because an operator
        approving the code would hand the bridge itself permanent
        authorization â€” and every outbound message relayed by the bridge
        would then loop back into the agent as an "authorized user
        message", which is the root of issue #15763.

        Matches:
            ``@_something:server``   â€” appservice namespace convention
            ``@:server``             â€” malformed / empty localpart
            ``:server``              â€” malformed, no leading ``@``
        r]   Tú@rB   Nr%  r®   )r}   r¾   Ú	partition)rz  rß   Ú	localpartr®   s       r)   Ú_is_system_or_bridge_senderz)MatrixAdapter._is_system_or_bridge_sender#  s�   € ð. ˆ\�r× Ò Ñ"Ô"ˆØð 	Ø�4à�<Š<˜ÑÔð 	Ø�!�"�"”ˆAØ�!ˆ8ˆ8ØŸkšk¨#Ñ.Ô.‰OˆI�q˜!˜!àˆIØð 	Ø�4Ø×#Ò# CÑ(Ô(Ð(r(   c                óD   ‡— t          ˆfd„| j        D ¦   «         ¦  «        S )zBReturn True when sender matches configured Matrix ignore patterns.c              3  óF   •K  — | ]}|                      ‰pd ¦  «        V — ŒdS )r]   N)Úsearch)rp   r¼  rz  s     €r)   rr   z>MatrixAdapter._matches_ignored_user_pattern.<locals>.<genexpr>J  s3   øè è € Ð[Ð[°G�7—>’> & ,¨BÑ/Ô/Ð[Ð[Ð[Ð[Ð[Ð[r(   )Úanyrµ  )rÿ   rz  s    `r)   Ú_matches_ignored_user_patternz+MatrixAdapter._matches_ignored_user_patternH  s)   ø€ åÐ[Ð[Ð[Ð[¸tÔ?ZÐ[Ñ[Ô[Ñ[Ô[Ð[r(   c                ó$   — | j          p|| j         v S )z7Return True when MATRIX_ALLOWED_ROOMS permits the room.)r´  r'  s     r)   Ú_is_allowed_matrix_roomz%MatrixAdapter._is_allowed_matrix_roomL  s   € àÔ)Ð)ÐN¨W¸Ô8NÐ-NÐNr(   c              ƒ  óÔ   K  — |                       |¦  «        rdS 	 |                      |¦  «        ƒ d{V —†S # t          $ r'}t                               d||¦  «         Y d}~dS d}~ww xY w)zøReturn True when a room event may proceed past intake filters.

        MATRIX_ALLOWED_ROOMS constrains shared rooms. Matrix DMs are exempt so
        personal chats still work when operators use a room allowlist for
        project rooms.
        TNzEMatrix: could not resolve room identity for allowlist check in %s: %sF)r‰  Ú_is_dm_roomr   r€   r�   )rÿ   r:  rã  s      r)   Ú_is_allowed_matrix_room_eventz+MatrixAdapter._is_allowed_matrix_room_eventP  s›   è è € ð ×'Ò'¨Ñ0Ô0ð 	Ø�4ð	Ø×)Ò)¨'Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2øÝð 	ð 	ð 	Ý�LŠLØWØØñô ð ð
 �5�5�5�5�5øøøøð	øøøs   ›6 ¶
A'Á A"Á"A'r�  c           	   ƒ  óô  K  — t          t          |dd¦  «        ¦  «        }t          t          |dd¦  «        ¦  «        }t                               dt          |dd¦  «        ||¦  «         |                      |¦  «        rdS |                      |¦  «        rt                               d||¦  «         dS |                      |¦  «        rt                               d	||¦  «         dS |                      |¦  «        ƒ d{V —†st                               d
|¦  «         dS t          t          |dd¦  «        ¦  «        }|  	                    |¦  «        rdS t          |¦  «        }|rÜ|| j        t          z
  k     rÉ| j        sÀt          j        ¦   «         | j        z
  dk    r¡| j        |z
  }d|cxk     rdk     rŠn n‡| j        dk    r|| _        d| _        n:t#          || j        z
  ¦  «        dk     r| xj        dz  c_        n|| _        d| _        | j        dk    r(t                               d| j        |¦  «         d| _        dS t          |dd¦  «        }|€dS t'          |d¦  «        rt          |j        ¦  «        }n.t+          |t,          ¦  «        r|                     dd¦  «        }nd}t+          |t,          ¦  «        r|}	n't'          |d¦  «        r|                     ¦   «         }	ni }	|	                     di ¦  «        }
|
                     d¦  «        dk    rdS |dk    r	| j        sdS d}||v r#|                      |||||	|
|¦  «        ƒ d{V —† dS |dv r"|                      |||||	|
¦  «        ƒ d{V —† dS dS )z2Handle incoming room message events (text, media).r:  r]   rz  u1   Matrix: callback fired â€” event %s from %s in %srÀ  rö  Nz.Matrix: ignoring system/bridge sender %s in %szAMatrix: ignoring sender %s in %s due to configured ignore patternz2Matrix: ignoring message from unauthorized room %srP   ro  i€Q r   rB   é<   é   u1  Matrix: dropped %d consecutive live events as 'too old' more than 30s after startup (skew â‰ˆ %.0fs). The host system clock is likely set ahead of real time, which causes the startup grace filter to silently discard every incoming message. Run `timedatectl set-ntp true` (or sync NTP) and restart the bot.TrÐ   r·  r+  r¾  r½  r¼  úm.notice)rÇ  r  r  r  )r¶  r�  )rx   rb  r€   r�   r}  r‚  r‡  rŒ  r2  rÂ  r—  rˆ  Ú_STARTUP_GRACE_SECONDSr‹  rH  r‰  rŠ  ro   r¥  r-  r·  r0  rY  rc  r+  r¡  Ú_handle_media_messageÚ_handle_text_message)rÿ   r�  r:  rz  rÀ  Úevent_tsÚskewrÐ   r·  Úsource_contentÚ
relates_toÚmedia_msgtypess               r)   rD  zMatrixAdapter._on_room_messagec  so  è è € å•g˜e Y°Ñ3Ô3Ñ4Ô4ˆÝ•W˜U H¨bÑ1Ô1Ñ2Ô2ˆõ 	�ŠØ?Ý�E˜: sÑ+Ô+ØØñ		
ô 	
ð 	
ð ×Ò Ñ'Ô'ð 	ØˆFð ×+Ò+¨FÑ3Ô3ð 	Ý�LŠLØ@ØØñô ð ð
 ˆFØ×-Ò-¨fÑ5Ô5ð 	Ý�LŠLØSØØñô ð ð
 ˆFØ×7Ò7¸Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@ð 	Ý�KŠKØDØñô ð ð ˆFõ •w˜u j°"Ñ5Ô5Ñ6Ô6ˆØ×#Ò# HÑ-Ô-ð 	ØˆFõ 3°5Ñ9Ô9ˆØð ,	˜ 4Ô#3Õ6LÑ#LÒLÐLð Ô*ð 7Ý”	‘”˜dÔ.Ñ.°Ò3Ð3àÔ'¨(Ñ2�ð �tÐ#Ð#Ò#Ð#˜eÒ#Ð#Ð#Ð#Ð#ØÔ-°Ò2Ð2Ø04˜Ô-Ø12˜Ô.Ð.Ý˜T DÔ$9Ñ9Ñ:Ô:¸RÒ?Ð?àÐ.Ô.°!Ñ3Ð.Ô.Ð.ð 15˜Ô-Ø12˜Ô.ØÔ-°Ò2Ð2ÝŸšð=ð !Ô2Ø ñ
ô 
ð 
ð 37˜Ô/ØˆFõ ˜% ¨DÑ1Ô1ˆØˆ?ØˆFõ �7˜IÑ&Ô&ð 	Ý˜'œ/Ñ*Ô*ˆGˆGÝ˜¥Ñ&Ô&ð 	Ø—k’k )¨RÑ0Ô0ˆGˆGàˆGõ �g�tÑ$Ô$ð 	 Ø$ˆNˆNÝ�W˜kÑ*Ô*ð 	 Ø$×.Ò.Ñ0Ô0ˆNˆNàˆNà#×'Ò'¨¸Ñ;Ô;ˆ
ð �>Š>˜*Ñ%Ô%¨Ò4Ð4ØˆFð �jÒ Ð ¨Ô)>Ð ØˆFð EˆØ�nÐ$Ð$Ø×,Ò,Ø˜ ¨8°^ÀZÐQXñô ð ð ð ð ð ð ð ð ð ð Ð.Ð.Ð.Ø×+Ò+Ø˜ ¨8°^ÀZñô ð ð ð ð ð ð ð ð ð ð /Ð.r(   rÀ  rÄ   r–  rY  r—  úOptional[tuple]c              ƒ  óÚ  K  — |                       |¦  «        ƒ d{V —†}|                      |¦  «        ƒ d{V —†}|rdnd}	d}
|                     d¦  «        dk    r|                     d¦  «        }
|                     d¦  «        }|                     d¦  «        pi }t          |t          ¦  «        r|                     d	¦  «        nd}|                      |||¦  «        }|s½| j        r'|| j        vrt                               d
||¦  «         dS || j	        v }t          |
o|
| j        v ¦  «        }|                     d¦  «        }| j        r'|s%|s#|s |st                               d||¦  «         dS n+| j        r$|r"|s |st                               d||
¦  «         dS |r'|
s%| j        r|r|}
| j                             |
¦  «         |r| j        r|                      |¦  «        }|
s|r$| j        r|}
| j                             |
¦  «         nY| j        dk    rd}
nK| j        dk    r|}
| j                             |
¦  «         n#| j        r|}
| j                             |
¦  «         |                      ||¦  «        ƒ d{V —†}|                      ||j        |	|||
|j        |j        |
r|nd|¬¦
  «
        }|
r| j                             |
¦  «         |                      ||¦  «         |||	|
||fS )zÓShared mention/thread/DM gating for text and media handlers.

        Returns (body, is_dm, chat_type, thread_id, display_name, source)
        or None if the message should be dropped (mention gating).
        Nr‰  rÁ   r½  úm.threadrÀ  r¹  r¸  Úuser_idsuP   Matrix: ignoring message %s in %s â€” room not in MATRIX_ALLOWED_ROOMS whitelistr±   u_   Matrix: ignoring message %s in %s â€” no @mention (set MATRIX_REQUIRE_MENTION=false to disable)uV   Matrix: ignoring message %s in thread %s â€” no @mention (thread_require_mention=true)r[  r\  )
rJ  Ú	chat_namerD  r6  Ú	user_nameÚ	thread_idÚ
chat_topicÚguild_idÚparent_chat_idrK  )rŠ  r‹  rc  r0  rY  Ú_is_bot_mentionedr›  r€   r�   rš  r@  r•  r¾   r—  r™  rŸ  ÚmarkÚ_strip_mentionrž  r   r�  Ú_get_display_nameÚbuild_sourcerB  r<  r>  Ú_background_read_receipt)rÿ   r:  rz  rÀ  rÄ   r–  r—  r‹  Úis_dmrD  rŸ  r¹  Úmentions_blockÚmention_user_idsÚis_mentionedÚis_free_roomÚin_bot_threadÚ
is_commandrB  Úsources                       r)   Ú_resolve_message_contextz&MatrixAdapter._resolve_message_contextð  sÞ  è è € ð ×4Ò4°WÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØ×&Ò& wÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/ˆØ!Ð.�D�D wˆ	àˆ	Ø�>Š>˜*Ñ%Ô%¨Ò3Ð3Ø"Ÿš zÑ2Ô2ˆIà'×+Ò+Ð,<Ñ=Ô=ˆà'×+Ò+¨LÑ9Ô9Ð?¸Rˆå.8¸ÍÑ.NÔ.NÐXˆN×Ò˜zÑ*Ô*Ð*ÐTXð 	ð ×-Ò-¨d°NÐDTÑUÔUˆð ð '	 ð Ô"ð  w°dÔ6IÐ'IÐ'IÝ—’ð5àØñ	ô ð ð �tà" dÔ&6Ð6ˆLÝ  Ð!I¨y¸D¼MÐ/IÑJÔJˆMØŸš¨Ñ-Ô-ˆJØÔ$ð  ¨\ð  À-ð  Ø#ð  ¨Jð  Ý—L’LðHà Øñ	ô ð ð  ˜4øð Ô.ð 	 °=ð 	 Ø&ð	 à#ð  Ý—L’LðDà Ø!ñ	ô ð ð  ˜4ð ð 	*˜ð 	* tÔ'?ð 	*ÀLð 	*Ø ˆIØŒM×Ò˜yÑ)Ô)Ð)ð ð 	-˜DÔ1ð 	-Ø×&Ò& tÑ,Ô,ˆDð ð 	.Øð .ØÔ'ð 2Ø (�IØ”M×&Ò& yÑ1Ô1Ð1øØÔ+¨vÒ5Ð5Ø �	�	ØÔ+¨xÒ7Ð7Ø$�	Ø”×"Ò" 9Ñ-Ô-Ð-Ð-ØÔ"ð .Ø$�	Ø”×"Ò" 9Ñ-Ô-Ð-à!×3Ò3°G¸VÑDÔDÐDÐDÐDÐDÐDÐDˆØ×"Ò"ØØÔ+ØØØ"ØØÔ*ØÔ)Ø&/Ð9˜7˜7°TØð #ñ 
ô 
ˆð ð 	*ØŒM×Ò˜yÑ)Ô)Ð)à×%Ò% g¨xÑ8Ô8Ð8à�U˜I y°,ÀÐFÐFr(   r”  c              ƒ  ó  K  — |                      dd¦  «        pd}|sdS t          |¦  «        }|                      ||||||¦  «        ƒ d{V —†}|€dS |\  }}	}
}}}d}|                      di ¦  «        }|r|                      d¦  «        }d}d}d}|rT|                     d¦  «        r?t	          |¦  «        \  }}t          |¦  «        }|r|                      ||¦  «        ƒ d{V —†}t          |¦  «        }t          j        }|                     d¦  «        rt          j	        }t          |||||||||||¬¦  «        }|t          j        k    r"| j        d	k    r|                      |¦  «         dS |                      |¦  «        ƒ d{V —† dS )
zProcess a text message event.rÄ   r]   Núm.in_reply_torÀ  rÇ   r±   )rZ   Úmessage_typer°  Úraw_messagerK  Úreply_to_message_idÚreply_to_textÚreply_to_author_idÚreply_to_author_namer6  rž  r   )rc  rÃ   r±  r¾   rÓ   rÙ   r¦  rI   ÚTEXTÚCOMMANDrH   r¨  Ú_enqueue_text_eventÚhandle_message)rÿ   r:  rz  rÀ  r”  r–  r—  rÄ   Úctxr©  rD  rŸ  rB  r°  rr  Úin_reply_tor·  r¸  r¹  Úmsg_typeÚ	msg_events                        r)   r“  z"MatrixAdapter._handle_text_messagef  s1  è è € ð ×!Ò! &¨"Ñ-Ô-Ð3°ˆØð 	ØˆFÝ-¨dÑ3Ô3ˆà×1Ò1ØØØØØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ˆ;ØˆFØBEÑ?ˆˆe�Y 	¨<¸ð ˆØ —n’n _°bÑ9Ô9ˆØð 	3Ø"—’ zÑ2Ô2ˆHð (,ˆØ,0ÐØ.2ÐØð 		˜Ÿš¨Ñ-Ô-ð 		Ý0GÈÑ0MÔ0MÑ-ˆMÐ-Ý(¨Ñ.Ô.ˆDð "ð Ø-1×-CÒ-CØÐ/ñ.ô .ð (ð (ð (ð (ð (ð (Ð$õ .¨dÑ3Ô3ˆåÔ#ˆØ�?Š?˜3ÑÔð 	+Ý"Ô*ˆHå ØØ!ØØ&ØØ (Ø'Ø1Ø!5ð
 Ø"ð
ñ 
ô 
ˆ	ð$ •{Ô'Ò'Ð'¨DÔ,JÈQÒ,NÐ,NØ×$Ò$ YÑ/Ô/Ð/Ð/Ð/à×%Ò% iÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r(   c              ƒ  óÒ  K  — |                      dd¦  «        pd}|                      dd¦  «        }	|	r?t          |	¦  «                             d¦  «        st                               d|¦  «         dS d}
|	r*|	                     d¦  «        r|                      |	¦  «        }
|                      di ¦  «        }t          |t          ¦  «        si }|                      dd¦  «        }|                      d	¦  «        }	 |�t          |¦  «        nd
}n# t          t          f$ r d
}Y nw xY w|r/|| j        k    r$t                               d||| j        ¦  «         dS |                      di ¦  «        }|	sšt          |t          ¦  «        r…|                      dd¦  «        pd}	|	r?t          |	¦  «                             d¦  «        st                               d|¦  «         dS |	r*|	                     d¦  «        r|                      |	¦  «        }
t          |o)t          |t          ¦  «        o|                      d¦  «        ¦  «        }d}t          j        }d}|dk    rt          j        }|pd}nV|dk    r5|                      d¦  «        �d}t          j        }nt          j        }|pd}n|dk    rt          j        }|pd}n|r|}d}|t          j        t          j        t          j        t          j        hv p|p|}|�rD|	�rA	 | j                             t+          |	¦  «        ¦  «        ƒ d{V —†}|��Ý|�rd
dlm} t          |t          ¦  «        r|                      d¦  «        nd}t          |t          ¦  «        r|                      d¦  «        nd}t          |t          ¦  «        r|                      d¦  «        nd}t          |t          ¦  «        r|                      d¦  «        }t          |t          ¦  «        r|                      d¦  «        nd}|r|r|r |||||¦  «        }nt                               d|¦  «         d}|�Æd
dlm}m}m} |t          j        k    rFd d!d"d#d$œ}|                      |d ¦  «        }  ||| ¬%¦  «        }t                               d&|¦  «         nf|t          j        t          j        hv r*t;          |p|rd'nd(¦  «        j        pd)}  ||| ¬%¦  «        }n"|p|t          j        k    rd*nd+}! |||!¦  «        }n2# t>          $ r%}"t                               d,|"¦  «         Y d}"~"nd}"~"ww xY w|                       ||||||¦  «        ƒ d{V —†}#|#€dS |#\  }}$}%}&}'}(d})|                      d-i ¦  «        }*|*r|*                      d.¦  «        })d}+d},d}-|)rT|                     d/¦  «        r?tC          |¦  «        \  }+},tE          |¦  «        }|,r|  #                    ||,¦  «        ƒ d{V —†}-|dk    rtI          |¦  «        rd}t          |
¦  «        o| }.|r|gn|.r|
gnd}/|/r|gnd}0tK          |||(|||/|0|)|+|,|-||'¬0¦  «        }1|  &                    |1¦  «        ƒ d{V —† dS )1z:Process a media message event (image, audio, video, file).rÄ   r]   rô  úmxc://z4[Matrix] Rejecting inbound media %s with non-MXC URLNr2  rV  rÕ  r   z=[Matrix] Rejecting oversized inbound media %s (%d > %d bytes)rW  z>[Matrix] Rejecting inbound encrypted media %s with non-MXC URLrì  FrÇ  ú	image/pngr  rX  Tz	audio/oggr  z	video/mp4)Údecrypt_attachmentÚhashesÚsha256r  ÚkÚivzA[Matrix] Encrypted media event missing decryption metadata for %s)Úcache_audio_from_bytesÚcache_document_from_bytesÚcache_image_from_bytesrw  rx  rv  ry  )z
image/jpegrÄ  z	image/gifz
image/webp)Úextz [Matrix] Cached user image at %sz	voice.oggz	audio.oggr™   z	video.mp4Údocumentz"[Matrix] Failed to cache media: %sr³  rÀ  rÇ   )rZ   r´  r°  rµ  rK  Ú
media_urlsÚmedia_typesr¶  r·  r¸  r¹  r6  rž  )'rc  rx   r¾   r€   r¥  Ú_mxc_to_httpr0  rY  r~   rg  rh  r§  r@  rI   ÚDOCUMENTÚPHOTOÚVOICEÚAUDIOÚVIDEOr"  Údownload_mediar   rY  rÅ  Úgateway.platforms.baserÊ  rË  rÌ  r2  r   r›   r   r±  rÓ   rÙ   r¦  r�  rH   r½  )2rÿ   r:  rz  rÀ  r”  r–  r—  r·  rÄ   rô  Úhttp_urlÚcontent_infoÚevent_mimetypeÚ
event_sizeÚevent_size_intÚfile_contentÚis_encrypted_mediaÚ
media_typerÀ  Úis_voice_messageÚcached_pathÚshould_cache_locallyÚ
file_bytesrÅ  Úhashes_valueÚ
hash_valueÚ	key_valueÚiv_valuerÊ  rË  rÌ  Úext_maprÍ  rP  Úer¾  r©  rD  rŸ  rB  r°  rr  r¿  r·  r¸  r¹  Úallow_http_fallbackrÏ  rÐ  rÁ  s2                                                     r)   r’  z#MatrixAdapter._handle_media_messageº  s’  è è € ð ×!Ò! &¨"Ñ-Ô-Ð3°ˆØ× Ò  ¨Ñ+Ô+ˆØð 	•s˜3‘x”x×*Ò*¨8Ñ4Ô4ð 	Ý�NŠNØFØñô ð ð ˆFð ˆØð 	.�3—>’> (Ñ+Ô+ð 	.Ø×(Ò(¨Ñ-Ô-ˆHð &×)Ò)¨&°"Ñ5Ô5ˆÝ˜,­Ñ-Ô-ð 	ØˆLØ%×)Ò)¨*°bÑ9Ô9ˆØ!×%Ò% fÑ-Ô-ˆ
ð	Ø0:Ð0F�S ™_œ_˜_ÈAˆNˆNøÝ�:Ð&ð 	ð 	ð 	ØˆNˆNˆNð	øøøàð 	˜n¨tÔ/DÒDÐDÝ�NŠNØOØØØÔ%ñ	ô ð ð ˆFð &×)Ò)¨&°"Ñ5Ô5ˆØð 		2•z ,µÑ5Ô5ð 		2Ø×"Ò" 5¨"Ñ-Ô-Ð3°ˆCØð �3˜s™8œ8×.Ò.¨xÑ8Ô8ð Ý—’ØTØñô ð ð �Øð 2�s—~’~ hÑ/Ô/ð 2Ø×,Ò,¨SÑ1Ô1�å!ØÐW�Z¨µdÑ;Ô;ÐWÀ×@PÒ@PÐQVÑ@WÔ@Wñ
ô 
Ðð 0ˆ
ÝÔ'ˆØ Ðà�iÒÐÝ"Ô(ˆHØ'Ð6¨;ˆJˆJØ˜	Ò!Ð!Ø×!Ò!Ð"<Ñ=Ô=ÐIØ#'Ð Ý&Ô,��å&Ô,�Ø'Ð6¨;ˆJˆJØ˜	Ò!Ð!Ý"Ô(ˆHØ'Ð6¨;ˆJˆJØð 	(Ø'ˆJð ˆØ'ÝÔ�{Ô0µ+Ô2CÅ[ÔEYð,
ð  
ð  4àð 4à!3ð 	ð  ñ Q	H Cñ Q	HðPHØ#'¤<×#>Ò#>½zÈ#¹¼Ñ#OÔ#OÐOÐOÐOÐOÐOÐO�
ØÑ)Ø)ñ %.ØQÐQÐQÐQÐQÐQõ  *¨,½Ñ=Ô=ð&˜L×,Ò,¨XÑ6Ô6Ð6à!%ð %õ  *¨,½Ñ=Ô=ð&˜L×,Ò,¨XÑ6Ô6Ð6à!%ð #õ  *¨,½Ñ=Ô=ð&˜L×,Ò,¨UÑ3Ô3Ð3à!%ð "õ
 & iµÑ6Ô6ð ;Ø(1¯ª°cÑ(:Ô(:˜Iõ  *¨,½Ñ=Ô=ð&˜L×,Ò,¨TÑ2Ô2Ð2à!%ð !ð %ð 	.¨ð 	.¸ð 	.Ø);Ð);Ø *¨I°zÀ8ñ*ô *˜J˜Jõ #ŸNšNØ cØ (ñô ð ð *.˜Jà!Ð-ðð ð ð ð ð ð ð ð ð ð $¥{Ô'8Ò8Ð8à.4Ø-3Ø-3Ø.5ð	'ð '˜Gð #*§+¢+¨j¸&Ñ"AÔ"A˜CØ*@Ð*@ÀÐQTÐ*UÑ*UÔ*U˜KÝ"ŸKšKÐ(JÈKÑXÔXÐXÐXØ%­+Ô*;½[Ô=NÐ)OÐOÐOå $Ø$(ð %&à7GÐ(X¨¨È[ñ!"ô !"ô
 #)ð!*ð $*ð  ð +AÐ*@ÀÐQTÐ*UÑ*UÔ*U˜K˜Kà'+ð (à#+­{Ô/@Ò#@Ð#@ð !, à%/ð %ð
 +DÐ*CØ *¨Hñ+ô +˜Køøõ ð Hð Hð HÝ—’ÐCÀQÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøð ×1Ò1ØØØØØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ˆ;ØˆFØBEÑ?ˆˆe�Y 	¨<¸ð ˆØ —n’n _°bÑ9Ô9ˆØð 	3Ø"—’ zÑ2Ô2ˆHà'+ˆØ,0ÐØ.2ÐØð 	˜Ÿš¨Ñ-Ô-ð 	Ý0GÈÑ0MÔ0MÑ-ˆMÐ-Ý(¨Ñ.Ô.ˆDà!ð Ø-1×-CÒ-CØÐ/ñ.ô .ð (ð (ð (ð (ð (ð (Ð$ð �iÒÐÕ$EÀdÑ$KÔ$KÐØˆDå" 8™nœnÐGÐ5GÐ1GÐð ð?ˆ[ˆMˆMà 3Ð=�8�*�*¸ð 	ð
 '1Ð:�z�l�l°dˆå ØØ!ØØ&ØØ!Ø#Ø (Ø'Ø1Ø!5ØØ"ð
ñ 
ô 
ˆ	ð  ×!Ò! )Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,s+   Ã9D ÄD#Ä"D#Ë<HT
 Ô

T9ÔT4Ô4T9c              ƒ  ó  K  — t          t          |dd¦  «        ¦  «        }t          |dd¦  «        }t          t          |dd¦  «        ¦  «        }t          t          |dd¦  «        ¦  «        }t          j        dd¦  «                             ¦   «         d	v }|s.| j        r	|| j        v st                               d
||¦  «         dS t           	                    d||¦  «         |  
                    ||ot          |¦  «        |¬¦  «         dS )z=Auto-join rooms when invited, recording DM rooms in m.direct.r:  r]   rÐ   NÚ	is_directFrz  ÚGATEWAY_ALLOW_ALL_USERS>   re   rz  rµ  z8Matrix: rejecting invite to %s from unauthorized user %su0   Matrix: invited to %s â€” joining (is_direct=%s)©rí  Úinviter)rx   rb  r@  r£   rd  r²   r³  r€   r¥  r2  Ú_schedule_invite_join)rÿ   r�  r:  rÐ   rí  rð  Ú	allow_alls          r)   rG  zMatrixAdapter._on_invitež  s4  è è € õ •g˜e Y°Ñ3Ô3Ñ4Ô4ˆÝ˜% ¨DÑ1Ô1ˆÝ� ¨+°uÑ=Ô=Ñ>Ô>ˆ	Ý•g˜e X¨rÑ2Ô2Ñ3Ô3ˆõ ”IÐ7¸Ñ<Ô<×BÒBÑDÔDð I
ð 
ˆ	ð
 ð 	ØÔ"ð	Ø'.°$Ô2HÐ'HÐ'Hå�NŠNØJØØñô ð ð
 ˆFå�ŠØ>ØØñ	
ô 	
ð 	
ð 	×"Ò"ØØÐ1¥D¨¡M¤MØð 	#ñ 	
ô 	
ð 	
ð 	
ð 	
r(   c              ƒ  óü  K  — |sdS || j         v rdS 	 | j                             t          |¦  «        ¦  «        ƒ d{V —† | j                              |¦  «         | j                             |d¦  «         | j                             |d¦  «         t           	                    d|¦  «         |  
                    ¦   «         ƒ d{V —† dS # t          $ rª}t                               d||¦  «         t          |¦  «                             ¦   «         }d|v sd|v rZ	 | j                             t          |¦  «        ¦  «        ƒ d{V —† t           	                    d|¦  «         n# t          $ r Y nw xY wY d}~dS d}~ww xY w)	z6Join a room by ID and refresh local caches on success.FTNzMatrix: joined %szMatrix: error joining %s: %sz
no serverszroom not foundz"Matrix: declined dead invite to %s)r!  r"  Ú	join_roomr   r¿  rŽ  r+  r�  r€   r2  rM  r   r¥  rx   r²   Ú
leave_room)rÿ   r:  rã  Úmsgs       r)   Ú_join_room_by_idzMatrixAdapter._join_room_by_idÈ  s»  è è € àð 	Ø�5Ø�dÔ(Ð(Ð(Ø�4ð	Ø”,×(Ò(­°©¬Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØÔ×"Ò" 7Ñ+Ô+Ð+ØÔ!×%Ò% g¨tÑ4Ô4Ð4ØÔ)×-Ò-¨g°tÑ<Ô<Ð<Ý�KŠKÐ+¨WÑ5Ô5Ð5Ø×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø�4øÝð 	ð 	ð 	Ý�NŠNÐ9¸7ÀCÑHÔHÐHõ �c‘(”(—.’.Ñ"Ô"ˆCØ Ð#Ð#Ð)9¸SÐ)@Ð)@ðØœ,×1Ò1µ&¸±/´/ÑBÔBÐBÐBÐBÐBÐBÐBÐBÝ—K’KÐ DÀgÑNÔNÐNÐNøÝ ð ð ð Ø�Dðøøøà�5�5�5�5�5øøøøð	øøøs>   “B2C Ã
E;ÃAE6ÄAE ÅE6Å 
E-Å*E6Å,E-Å-E6Å6E;r]   rï  rí  rð  c               óæ   ‡ ‡‡‡— ‰r	‰‰ j         v rdS ‰ j                             ‰¦  «        }|r|                     ¦   «         sdS dˆˆˆˆ fd„}t	          j         |¦   «         ¦  «        ‰ j        ‰<   dS )zCSchedule an invite join without blocking sync or gateway readiness.NrR   rø   c               “  óˆ  •K  — 	 t          j        ‰                     ‰¦  «        d¬¦  «        ƒ d {V —†} | r ‰r‰r‰                     ‰‰¦  «        ƒ d {V —† n0# t           j        $ r t
                               d‰¦  «         Y nw xY w‰j                             ‰d ¦  «         d S # ‰j                             ‰d ¦  «         w xY w)Nrh  rw  z#Matrix: timed out joining invite %s)	rQ  r  r÷  Ú_record_dm_roomÚTimeoutErrorr€   r¥  r†  r+  )Újoinedrð  rí  r:  rÿ   s    €€€€r)   Ú_join_invitez9MatrixAdapter._schedule_invite_join.<locals>._join_inviteõ  s  øè è € ð;Ý&Ô/Ø×)Ò)¨'Ñ2Ô2¸Dð ñ  ô  ð ð ð ð ð ð �ð
 ð A˜ið A¨Gð AØ×.Ò.¨w¸Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@øøÝÔ'ð Oð Oð OÝ—’ÐDÀgÑNÔNÐNÐNÐNðOøøøð Ô'×+Ò+¨G°TÑ:Ô:Ð:Ð:Ð:ø�Ô'×+Ò+¨G°TÑ:Ô:Ð:Ð:øøøs*   …AA ÁB$ Á*BÂB$ ÂBÂB$ Â$Cr1  )r!  r†  rc  rj  rQ  rR  )rÿ   r:  rí  rð  Úexistingrý  s   ````  r)   rñ  z#MatrixAdapter._schedule_invite_joinç  s§   øøøø€ ð ð 	˜' TÔ%7Ð7Ð7ØˆFØÔ*×.Ò.¨wÑ7Ô7ˆØð 	˜HŸMšM™OœOð 	ØˆFð	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;õ ,3Ô+>¸|¸|¹~¼~Ñ+NÔ+NˆÔ Ñ(Ð(Ð(r(   c                óR  — t          |t          ¦  «        r|                     di ¦  «        ni }|                     di ¦  «        }t          |t          ¦  «        sdS |D ]I}|| j        v rŒt                               d|¦  «         |                      t          |¦  «        ¦  «         ŒJdS )z?Join rooms still present in rooms.invite after sync processing.r+  ÚinviteNz)Matrix: reconciling pending invite for %s)r0  rY  rc  r!  r€   r2  rñ  rx   )rÿ   rd  r+  Úinvitesr:  s        r)   rO  z,MatrixAdapter._schedule_pending_invite_joins  s¯   € å.8¸ÅDÑ.IÔ.IÐQ�	—’˜g rÑ*Ô*Ð*ÈrˆØ—)’)˜H bÑ)Ô)ˆÝ˜'¥4Ñ(Ô(ð 	ØˆFØð 	5ð 	5ˆGØ˜$Ô,Ð,Ð,ØÝ�KŠKÐCÀWÑMÔMÐMØ×&Ò&¥s¨7¡|¤|Ñ4Ô4Ð4Ð4ð		5ð 	5r(   r0  c              ƒ  óX  K  — | j         sdS dd||dœi}	 | j                              t          |¦  «        t          j        |¦  «        ƒ d{V —†}t
                               d||¦  «         t          |¦  «        S # t          $ r&}t
                               d|¦  «         Y d}~dS d}~ww xY w)zzSend an emoji reaction to a message in a room.
        Returns the reaction event_id on success, None on failure.
        Nr¾  zm.annotation)r½  rÀ  r  zMatrix: sent reaction %s to %szMatrix: reaction send error: %s)	r"  r€  r   r   r$   r€   r�   rx   r   )rÿ   r:  rÀ  r0  rÐ   Úresp_event_idrã  s          r)   r,  zMatrixAdapter._send_reaction  sè   è è € ð Œ|ð 	Ø�4àØ*Ø$Øðð ð
ˆð
	Ø"&¤,×"AÒ"AÝ�w‘”ÝÔ"Øñ#ô #ð ð ð ð ð ð ˆMõ
 �LŠLÐ9¸5À(ÑKÔKÐKÝ�}Ñ%Ô%Ð%øÝð 	ð 	ð 	Ý�LŠLÐ:¸CÑ@Ô@Ð@Ø�4�4�4�4�4øøøøð	øøøs   •A#A9 Á9
B)ÂB$Â$B)rD  Úreasonc              ƒ  ó@   K  — |                       |||¦  «        ƒ d{V —†S )z)Remove a reaction by redacting its event.N)Úredact_message)rÿ   r:  rD  r  s       r)   Ú_redact_reactionzMatrixAdapter._redact_reaction4  s3   è è € ð ×(Ò(¨Ð2CÀVÑLÔLÐLÐLÐLÐLÐLÐLÐLr(   c                óÊ   ‡ ‡‡‡— dˆˆˆˆ fd„}t          j         |¦   «         ¦  «        }‰ j                             |¦  «         |                     ‰ j        j        ¦  «         dS )zBRedact a reaction after a short delay so message delivery settles.rR   rø   c               “  óT  •K  — 	 ‰j         rt          j        ‰j         ¦  «        ƒ d {V —† ‰                     ‰‰‰¦  «        ƒ d {V —†st                               d‰¦  «         d S d S # t          j        $ r ‚ t          $ r'} t                               d‰| ¦  «         Y d } ~ d S d } ~ ww xY w)Nz$Matrix: failed to redact reaction %sz4Matrix: delayed reaction redaction failed for %s: %s)r¤  rQ  r
  r  r€   r�   rl  r   )rã  rD  r  r:  rÿ   s    €€€€r)   Ú_redact_laterzAMatrixAdapter._schedule_reaction_redaction.<locals>._redact_laterE  s  øè è € ðØÔ9ð PÝ!œ-¨Ô(NÑOÔOÐOÐOÐOÐOÐOÐOÐOØ!×2Ò2°7Ð<MÈvÑVÔVÐVÐVÐVÐVÐVÐVð Ý—L’LØ>Ð@Qñô ð ð ð ðð øõ Ô)ð ð ð ØÝð ð ð Ý—’ØJØ%Øñô ð ð ð ð ð ð ð øøøøðøøøs   …AA' Á'B'Â B"Â"B'Nr1  )rQ  rR  r¥  r¿  Úadd_done_callbackr¾  )rÿ   r:  rD  r  r
  rp  s   ````  r)   Ú_schedule_reaction_redactionz*MatrixAdapter._schedule_reaction_redaction=  s‚   øøøø€ ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ" Ô" = =¡?¤?Ñ3Ô3ˆØÔ&×*Ò*¨4Ñ0Ô0Ð0Ø×Ò˜tÔ=ÔEÑFÔFÐFÐFÐFr(   rH   c              ƒ  ó¬   K  — | j         sdS |j        }|j        j        }|r/|r/|                      ||d¦  «        ƒ d{V —†}|r|| j        ||f<   dS dS dS dS )z=Add eyes reaction when the agent starts processing a message.Nu   ðŸ‘€)r¢  rK  r°  rJ  r,  r£  )rÿ   r�  Úmsg_idr:  rD  s        r)   Úon_processing_startz!MatrixAdapter.on_processing_startZ  s¨   è è € àÔ&ð 	ØˆFØÔ!ˆØ”,Ô&ˆØð 	O�gð 	OØ&*×&9Ò&9¸'À6È<Ñ&XÔ&XÐ XÐ XÐ XÐ XÐ XÐ XÐØ ð OØ=N�Ô'¨°&Ð(9Ñ:Ð:Ð:ð	Oð 	Oð 	Oð 	OðOð Or(   ÚoutcomerJ   c              ƒ  óL  K  — | j         sdS |j        }|j        j        }|r|sdS |t          j        k    rdS ||f}|| j        v r1| j                             |¦  «        }|                      ||d¦  «         |  	                    |||t          j
        k    rdnd¦  «        ƒ d{V —† dS )z9Replace eyes with checkmark (success) or cross (failure).Nzprocessing completerj  rn  )r¢  rK  r°  rJ  rJ   Ú	CANCELLEDr£  r+  r  r,  ÚSUCCESS)rÿ   r�  r  r  r:  Úreaction_keyÚeyes_event_ids          r)   Úon_processing_completez$MatrixAdapter.on_processing_completee  sþ   è è € ð Ô&ð 	ØˆFØÔ!ˆØ”,Ô&ˆØð 	˜Wð 	ØˆFØÕ'Ô1Ò1Ð1ØˆFØ Ð(ˆØ˜4Ô2Ð2Ð2Ø Ô3×7Ò7¸ÑEÔEˆMØ×-Ò-ØØØ%ñô ð ð
 ×!Ò!ØØØÕ#4Ô#<Ò<Ð<ˆHˆHÀ(ñ
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r(   c              ƒ  ób  K  — t          t          |dd¦  «        ¦  «        }|                      |¦  «        rdS t          t          |dd¦  «        ¦  «        }|                      |¦  «        rdS t          t          |dd¦  «        ¦  «        }t          |dd¦  «        }|�rŒt	          |t
          ¦  «        r|                     di ¦  «        nt          |di ¦  «        }d}d}t	          |t
          ¦  «        r-|                     dd¦  «        }|                     d	d¦  «        }nLt          |d¦  «        r<t          t          |dd¦  «        ¦  «        }t          t          |d	d¦  «        ¦  «        }t           	                    d
||||¦  «         | j
                             |¦  «        }	|	�ru|	j        �sm||	j        k    rdS |                      |	¦  «        r|                      |||	¦  «        ƒ d{V —† dS |                      ||||	d¦  «        ƒ d{V —†sdS | j                             |¦  «        }
|
s|                      ||d¦  «        ƒ d{V —† dS 	 ddlm}  ||	j        |
¦  «        }|r�d|	_        | j
                             |d¦  «         | j                             |	j        d¦  «         t           	                    d||	j        |
|¦  «         |                      ||	¦  «        ƒ d{V —† n2# t0          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wdS | j                             |¦  «        }|�r||j        �st||j        k    rdS |                      |¦  «        r|                      |||¦  «        ƒ d{V —† dS |                      ||||d¦  «        ƒ d{V —†sdS |j                             |¦  «        }|s|                      ||d¦  «        ƒ d{V —† dS d|_        | j                             |d¦  «         |\  }}	 |                     |||¦  «        ƒ d{V —†}|                      ||¦  «        ƒ d{V —† |r|                      |||¬¦  «        ƒ d{V —† nS# t0          $ rF}t                               d|¦  «         |                      |d|› �|¬¦  «        ƒ d{V —† Y d}~nd}~ww xY wdS | j                              |¦  «        }|�rZ|j        �sT||j        k    rdS |                      |¦  «        r| j                              |d¦  «         dS |                      ||||d¦  «        ƒ d{V —†sdS |j                             |¦  «        }|€|                      ||d¦  «        ƒ d{V —† dS d|_        | j                              |d¦  «         	 | !                    ||¦  «        ƒ d{V —†}|r|                      |||¬¦  «        ƒ d{V —† nS# t0          $ rF}t                               d|¦  «         |                      |d|› �|¬¦  «        ƒ d{V —† Y d}~nd}~ww xY wdS dS dS dS )z Handle incoming reaction events.rz  r]   NrÀ  r:  rÐ   r¾  r—  r  z'Matrix: reaction %s from %s on %s in %sÚapprovalz4That reaction is not valid for this approval prompt.r   )Úresolve_gateway_approvalTzKMatrix reaction resolved %d approval(s) for session %s (choice=%s, user=%s)z;Failed to resolve gateway approval from Matrix reaction: %sr~  z8That reaction is not one of the available model choices.©rr  z/Failed to switch model from Matrix reaction: %szFailed to switch model: zchoice pickerz2That reaction is not one of the available choices.z/Failed to apply choice from Matrix reaction: %szFailed to apply selection: )"rx   rb  r}  rÂ  r0  rY  rc  r-  r€   r2  r­  rÂ   rJ  Ú_matrix_prompt_expiredÚ_expire_matrix_approval_promptÚ_validate_matrix_prompt_reactorr¬  Ú_send_invalid_reaction_feedbackÚtools.approvalr  rI  r+  r®  Ú_redact_bot_approval_reactionsr   rW   r±  Ú"_expire_matrix_model_picker_promptrS  rT  Ú"_redact_bot_model_picker_reactionsr‡  r²  r\  )rÿ   r�  rz  rÀ  r:  rÐ   r—  Ú	reacts_tor  r  rM  r  r�   rã  Úmodel_promptÚ	selectionrB  r@  ÚconfirmationÚchoice_promptrq   s                        r)   rE  zMatrixAdapter._on_reaction�  s¹  è è € å•W˜U H¨bÑ1Ô1Ñ2Ô2ˆØ×Ò Ñ'Ô'ð 	ØˆFÝ•w˜u j°"Ñ5Ô5Ñ6Ô6ˆØ×#Ò# HÑ-Ô-ð 	ØˆFå•g˜e Y°Ñ3Ô3Ñ4Ô4ˆÝ˜% ¨DÑ1Ô1ˆØñ C	õ ˜g¥tÑ,Ô,ð8�—’˜N¨BÑ/Ô/Ð/å˜W l°BÑ7Ô7ð ð
 ˆIØˆCÝ˜*¥dÑ+Ô+ð :Ø&ŸNšN¨:°rÑ:Ô:�	Ø —n’n U¨BÑ/Ô/��Ý˜ ZÑ0Ô0ð :Ý¥¨
°JÀÑ CÔ CÑDÔD�	Ý�' *¨e°RÑ8Ô8Ñ9Ô9�Ý�KŠKØ9ØØØØñô ð ð Ô4×8Ò8¸ÑCÔCˆFØñ #˜fœoñ #Ø˜fœnÒ,Ð,Ø�FØ×.Ò.¨vÑ6Ô6ð Ø×=Ò=¸gÀyÐRXÑYÔYÐYÐYÐYÐYÐYÐYÐYØ�FØ!×AÒAØ˜Y¨°¸
ñô ð ð ð ð ð ð ð ð �FØÔ4×8Ò8¸Ñ=Ô=�Øð Ø×>Ò>ØØ!ØNñô ð ð ð ð ð ð ð ð
 �FðeØGÐGÐGÐGÐGÐGà4Ð4°VÔ5GÈÑPÔP�EØð 
SØ*.˜œØÔ7×;Ò;¸IÀtÑLÔLÐLØÔ8×<Ò<¸VÔ=OÐQUÑVÔVÐVÝŸšð3à! 6Ô#5°v¸vñô ð ð #×AÒAÀ'È6ÑRÔRÐRÐRÐRÐRÐRÐRÐRøøÝ ð eð eð eÝ—L’LÐ!^Ð`cÑdÔdÐdÐdÐdÐdÐdÐdøøøøðeøøøà�àÔ>×BÒBÀ9ÑMÔMˆLØñ # LÔ$9ñ #Ø˜lÔ2Ò2Ð2Ø�FØ×.Ò.¨|Ñ<Ô<ð Ø×AÒAÀ'È9ÐVbÑcÔcÐcÐcÐcÐcÐcÐcÐcØ�FØ!×AÒAØ˜Y¨°¸nñô ð ð ð ð ð ð ð ð �FØ(Ô0×4Ò4°SÑ9Ô9�	Ø ð Ø×>Ò>ØØ!ØRñô ð ð ð ð ð ð ð ð
 �FØ(,�Ô%ØÔ3×7Ò7¸	À4ÑHÔHÐHØ*3Ñ'�˜-ðØ)5×)GÒ)GØ ¨=ñ*ô *ð $ð $ð $ð $ð $ð $�Lð ×AÒAÀ'È<ÑXÔXÐXÐXÐXÐXÐXÐXÐXØ#ð SØ"Ÿiši¨°È	˜iÑRÔRÐRÐRÐRÐRÐRÐRÐRøøÝ ð ð ð Ý—L’LÐ!RÐTWÑXÔXÐXØŸ)š)ØØ8°3Ð8Ð8Ø!*ð $ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øøøøðøøøð �à Ô@×DÒDÀYÑOÔOˆMØñ  ]Ô%;ñ Ø˜mÔ3Ò3Ð3Ø�FØ×.Ò.¨}Ñ=Ô=ð ØÔ8×<Ò<¸YÈÑMÔMÐMØ�FØ!×AÒAØ˜Y¨°¸ñô ð ð ð ð ð ð ð ð �FØ%Ô-×1Ò1°#Ñ6Ô6�Ø�=Ø×>Ò>ØØ!ØLñô ð ð ð ð ð ð ð ð
 �FØ)-�Ô&ØÔ4×8Ò8¸ÀDÑIÔIÐIð
Ø)6×)IÒ)IÈ'ÐSXÑ)YÔ)YÐ#YÐ#YÐ#YÐ#YÐ#YÐ#Y�LØ#ð SØ"Ÿiši¨°È	˜iÑRÔRÐRÐRÐRÐRÐRÐRÐRøøÝ ð ð ð Ý—L’LÐ!RÐTWÑXÔXÐXØŸ)š)ØØ;°cÐ;Ð;Ø!*ð $ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øøøøðøøøð �ðGC	ð C	ðHð ð ð sJ   ÉBK) Ë)
LË3LÌLÐAQ! Ñ!
R1Ñ+<R,Ò,R1Ö<W ×
X&× <X!Ø!X&r  c                ót   — t          |dd ¦  «        }|d uo#t          j        ¦   «         t          |¦  «        k    S )NrM  )rb  rH  r*  r{   )rÿ   r  rM  s      r)   r  z$MatrixAdapter._matrix_prompt_expired  s8   € Ý˜V \°4Ñ8Ô8ˆ
Ø Ð%ÐN­$¬.Ñ*:Ô*:½UÀ:Ñ=NÔ=NÒ*NÐNr(   Útarget_event_idÚprompt_labelc              ƒ  óÈ  K  — t          j        dd¦  «                             ¦   «         dv }|sL| j        r	|| j        v s<t                               d|||¦  «         |                      ||d¦  «        ƒ d {V —† dS t          |dd ¦  «        }t          | dd	¦  «        }|rD|rB||k    r<t                               d
|||¦  «         |                      ||d¦  «        ƒ d {V —† dS d	S )Nrî  r]   >   re   rz  rµ  z<Matrix: ignoring %s reaction from unauthorized user %s on %sz6Only an authorized Matrix user can use these controls.FrL  r¯  Tz5Matrix: ignoring %s reaction from %s; requester is %sz?Only the user who requested this action can use these controls.)r£   rd  r²   r³  r€   r2  r  rb  )	rÿ   r:  r)  rz  r  r*  rò  Ú	requesterÚapproval_require_senders	            r)   r  z-MatrixAdapter._validate_matrix_prompt_reactor  sg  è è € õ ”IÐ7¸Ñ<Ô<×BÒBÑDÔDð I
ð 
ˆ	ð
 ð 	ØÔ"ð	Ø'-°Ô1GÐ'GÐ'Gå�KŠKØNØ˜f oñô ð ð ×6Ò6ØØØHñô ð ð ð ð ð ð ð ð
 �5å˜FÐ$7¸Ñ>Ô>ˆ	Ý")¨$Ð0JÈDÑ"QÔ"QÐØ"ð 
	 yð 
	°V¸yÒ5HÐ5HÝ�KŠKØGØ˜f iñô ð ð ×6Ò6ØØØQñô ð ð ð ð ð ð ð ð
 �5Øˆtr(   rZ   c              ƒ  ó®   K  — 	 |                       |||¬¦  «        ƒ d {V —† d S # t          $ r&}t                               d|¦  «         Y d }~d S d }~ww xY w)Nr  z4Matrix: failed to send invalid reaction feedback: %s)r‡  r   r€   r�   )rÿ   r:  r)  rZ   rã  s        r)   r  z-MatrixAdapter._send_invalid_reaction_feedback?  s‡   è è € ð	VØ—)’)˜G T°O�)ÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDøÝð 	Vð 	Vð 	VÝ�LŠLÐOÐQTÑUÔUÐUÐUÐUÐUÐUÐUÐUøøøøð	Vøøøs   „$ ¤
A®AÁAú'_MatrixApprovalPrompt'c              ƒ  ó   K  — d|_         | j                             |d ¦  «         | j                             |j        d ¦  «         |                      ||¦  «        ƒ d {V —† |                      ||d¦  «        ƒ d {V —† d S )NTzXThis approval prompt has expired. Run the command again if you still want to approve it.)rÂ   r­  r+  r®  rI  r   r  ©rÿ   r:  r)  r  s       r)   r  z,MatrixAdapter._expire_matrix_approval_promptJ  sµ   è è € ð ˆŒØÔ'×+Ò+¨O¸TÑBÔBÐBØÔ(×,Ò,¨VÔ-?ÀÑFÔFÐFØ×1Ò1°'¸6ÑBÔBÐBÐBÐBÐBÐBÐBÐBØ×2Ò2ØØØfñ
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r(   ú'_MatrixModelPickerPrompt'c              ƒ  óÀ   K  — d|_         | j                             |d ¦  «         |                      ||¦  «        ƒ d {V —† |                      ||d¦  «        ƒ d {V —† d S )NTzDThis model picker has expired. Run `/model` again to choose a model.)rÂ   r±  r+  r"  r  r1  s       r)   r!  z0MatrixAdapter._expire_matrix_model_picker_promptZ  s™   è è € ð ˆŒØÔ+×/Ò/°ÀÑFÔFÐFØ×5Ò5°g¸vÑFÔFÐFÐFÐFÐFÐFÐFÐFØ×2Ò2ØØØRñ
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r(   c              ƒ  ó®   K  — |j                              ¦   «         D ]8\  }}|                      ||d¦  «         t                               d||¦  «         Œ9dS )zMRedact the bot's seeded approval reactions, leaving only the user's reaction.zapproval resolvedz0Matrix: scheduled bot reaction redaction %s (%s)N)rP  rÏ  r  r€   r�   )rÿ   r:  r  r0  Úevt_ids        r)   r   z,MatrixAdapter._redact_bot_approval_reactionsi  sl   è è € ð $Ô7×=Ò=Ñ?Ô?ð 	\ð 	\‰MˆE�6Ø×-Ò-¨g°vÐ?RÑSÔSÐSÝ�LŠLÐKÈUÐTZÑ[Ô[Ð[Ð[ð	\ð 	\r(   c              ƒ  ó"  K  — |j                              ¦   «         D ]r\  }}	 |                      ||d¦  «        ƒ d{V —† t                               d||¦  «         Œ@# t
          $ r&}t                               d||¦  «         Y d}~Œkd}~ww xY wdS )z/Redact the bot's seeded model picker reactions.zmodel picker resolvedNz.Matrix: redacted model picker reaction %s (%s)z5Matrix: failed to redact model picker reaction %s: %s)rP  rÏ  r  r€   r�   r   )rÿ   r:  r  r0  r5  rã  s         r)   r"  z0MatrixAdapter._redact_bot_model_picker_reactionss  sÏ   è è € ð $Ô7×=Ò=Ñ?Ô?ð 	bð 	b‰MˆE�6ðbØ×)Ò)¨'°6Ð;RÑSÔSÐSÐSÐSÐSÐSÐSÐSÝ—’ÐMÈuÐV\Ñ]Ô]Ð]Ð]øÝð bð bð bÝ—’ÐTÐV[Ð]`ÑaÔaÐaÐaÐaÐaÐaÐaøøøøðbøøøð		bð 	bs   ¢9AÁ
BÁ&BÂBc                óÂ   — ddl m}  ||j        | j        j                             dd¦  «        | j        j                             dd¦  «        |j        j        ¬¦  «        S )z-Session-scoped key for text message batching.r   )Úbuild_session_keyÚgroup_sessions_per_userTÚthread_sessions_per_userF)r9  r:  Úprofile)Úgateway.sessionr8  r°  rj  r^  rc  r;  )rÿ   r�  r8  s      r)   Ú_text_batch_keyzMatrixAdapter._text_batch_key„  sy   € à5Ð5Ð5Ð5Ð5Ð5à Ð ØŒLØ$(¤KÔ$5×$9Ò$9Ø)¨4ñ%ô %ð &*¤[Ô%6×%:Ò%:Ø*¨Eñ&ô &ð ”LÔ(ð	
ñ 	
ô 	
ð 		
r(   c                óŒ  — |                       |¦  «        }| j                             |¦  «        }t          |j        pd¦  «        }|€||_        || j        |<   nw|j        r$|j        r|j        › d|j        › �n|j        |_        ||_        |j        r>|j                             |j        ¦  «         |j                             |j        ¦  «         | j	                             |¦  «        }|r(| 
                    ¦   «         s|                     ¦   «          t          j        |                      |¦  «        ¦  «        | j	        |<   dS )z.Buffer a text event and reset the flush timer.r]   NrÉ   )r=  rª  rc  r‡   rZ   Ú_last_chunk_lenrÏ  ÚextendrÐ  r«  rj  rk  rQ  rR  Ú_flush_text_batch)rÿ   r�  r  rþ  Ú	chunk_lenÚ
prior_tasks         r)   r¼  z!MatrixAdapter._enqueue_text_event“  sL  € à×"Ò" 5Ñ)Ô)ˆØÔ-×1Ò1°#Ñ6Ô6ˆÝ˜œ
Ð( bÑ)Ô)ˆ	ØÐØ$-ˆEÔ!Ø.3ˆDÔ& sÑ+Ð+àŒzð à8@¼ÐU�x”}Ð4Ð4¨¬
Ð4Ð4Ð4È5Ì:ð ”ð (1ˆHÔ$ØÔð ?ØÔ#×*Ò*¨5Ô+;Ñ<Ô<Ð<ØÔ$×+Ò+¨EÔ,=Ñ>Ô>Ð>àÔ3×7Ò7¸Ñ<Ô<ˆ
Øð 	 ˜jŸošoÑ/Ô/ð 	 Ø×ÒÑÔÐÝ.5Ô.AØ×"Ò" 3Ñ'Ô'ñ/
ô /
ˆÔ& sÑ+Ð+Ð+r(   r  c              ƒ  ó,  K  — t          j        ¦   «         }	 | j                             |¦  «        }|rt	          |dd¦  «        nd}|| j        k    r| j        }n| j        }t          j        |¦  «        ƒ d{V —† | j         	                    |d¦  «        }|s<	 | j
                             |¦  «        |u r| j
         	                    |d¦  «         dS dS t                               d|t          |j        pd¦  «        ¦  «         |                      |¦  «        ƒ d{V —† | j
                             |¦  «        |u r| j
         	                    |d¦  «         dS dS # | j
                             |¦  «        |u r| j
         	                    |d¦  «         w w xY w)z<Wait for the quiet period then dispatch the aggregated text.r?  r   Nz*[Matrix] Flushing text batch %s (%d chars)r]   )rQ  Úcurrent_taskrª  rc  rb  rz  r©  r¨  r
  r+  r«  r€   r2  r‡   rZ   r½  )rÿ   r  rE  ÚpendingÚlast_lenÚdelayr�  s          r)   rA  zMatrixAdapter._flush_text_batch¬  sÓ  è è € åÔ+Ñ-Ô-ˆð	>ØÔ0×4Ò4°SÑ9Ô9ˆGØAHÐO•w˜wÐ(9¸1Ñ=Ô=Ð=ÈaˆHØ˜4Ô0Ò0Ð0ØÔ<��àÔ6�Ý”- Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ.×2Ò2°3¸Ñ=Ô=ˆEØð Øð Ô-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFõ �KŠKØ<ØÝ�E”JÐ$ "Ñ%Ô%ñô ð ð
 ×%Ò% eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,àÔ-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFøˆtÔ-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=ð Gøøøs   —B E ÃAE Å:Fc                óT   ‡ ‡‡— dˆˆˆ fd„}t          j         |¦   «         ¦  «         dS )z0Fire-and-forget read receipt with error logging.rR   rø   c               “  ó¬   •K  — 	 ‰                      ‰‰¦  «        ƒ d {V —† d S # t          $ r&} t                               d| ¦  «         Y d } ~ d S d } ~ ww xY w)Nz*Matrix: background read receipt failed: %s)Úsend_read_receiptr   r€   r�   )rã  rÀ  r:  rÿ   s    €€€r)   Ú_sendz5MatrixAdapter._background_read_receipt.<locals>._sendË  s…   øè è € ðPØ×,Ò,¨W°hÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?øÝð Pð Pð PÝ—’ÐIÈ3ÑOÔOÐOÐOÐOÐOÐOÐOÐOøøøøðPøøøs   …# £
A­AÁANr1  )rQ  Úensure_future)rÿ   r:  rÀ  rL  s   ``` r)   r¨  z&MatrixAdapter._background_read_receiptÈ  sT   øøø€ ð	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Põ 	Ô˜e˜e™gœgÑ&Ô&Ð&Ð&Ð&r(   c              ƒ  ó€  K  — | j         sdS 	 t          |¦  «        }t          |¦  «        }t          | j         d¦  «        r#| j                              |||¦  «        ƒ d{V —† nŒt          | j         d¦  «        r"| j                              ||¦  «        ƒ d{V —† nUt          | j         d¦  «        r$| j                              |||¬¦  «        ƒ d{V —† nt                               d¦  «         dS t                               d||¦  «         d	S # t          $ r&}t                               d
|¦  «         Y d}~dS d}~ww xY w)z*Send a read receipt (m.read) for an event.FÚset_fully_read_markerNÚsend_receiptÚset_read_markers)Úfully_read_eventÚread_receiptz)Matrix: client has no read receipt methodz&Matrix: sent read receipt for %s in %sTzMatrix: read receipt failed: %s)
r"  r   r   r-  rO  rP  rQ  r€   r�   r   )rÿ   r:  rÀ  r[  r�  rã  s         r)   rK  zMatrixAdapter.send_read_receiptÓ  sŽ  è è € àŒ|ð 	Ø�5ð	Ý˜'‘?”?ˆDÝ˜HÑ%Ô%ˆEÝ�t”|Ð%<Ñ=Ô=ð Ø”l×8Ò8¸¸uÀeÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÝ˜œ ~Ñ6Ô6ð 
Ø”l×/Ò/°°eÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ý˜œÐ'9Ñ:Ô:ð Ø”l×3Ò3ØØ%*Ø!&ð 4ñ ô ð ð ð ð ð ð ð ð õ —’ÐHÑIÔIÐIØ�uÝ�LŠLÐAÀ8ÈWÑUÔUÐUØ�4øÝð 	ð 	ð 	Ý�LŠLÐ:¸CÑ@Ô@Ð@Ø�5�5�5�5�5øøøøð	øøøs   �C D Ã/D Ä
D=ÄD8Ä8D=c              ƒ  ó:  K  — | j         sdS 	 | j                              t          |¦  «        t          |¦  «        |pd¬¦  «        ƒ d{V —† t                               d||¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)z/Redact (delete) a message or event from a room.FN)r  zMatrix: redacted %s in %sTzMatrix: redact error: %s)r"  Úredactr   r   r€   r2  r   r¥  )rÿ   r:  rÀ  r  rã  s        r)   r  zMatrixAdapter.redact_messageñ  sÓ   è è € ð Œ|ð 	Ø�5ð
	Ø”,×%Ò%Ý�w‘”Ý˜Ñ!Ô!Ø�~ ð &ñ ô ð ð ð ð ð ð ð õ
 �KŠKÐ3°X¸wÑGÔGÐGØ�4øÝð 	ð 	ð 	Ý�NŠNÐ5°sÑ;Ô;Ð;Ø�5�5�5�5�5øøøøð	øøøs   �AA* Á*
BÁ4BÂBr:   r«   Útopicr   úOptional[list]Úpresetc              ƒ  óš  K  — | j         sdS |dk    rEt          j        dd¦  «                             ¦   «         dvrt                               d¦  «         dS 	 t          j        t          j        t          j	        dœ 
                    |t          j        ¦  «        }d„ |pg D ¦   «         }| j                              |pd|pd|||¬	¦  «        ƒ d{V —†}t          |¦  «        }	| j                             |	¦  «         t                               d
|	|pd¦  «         |	S # t           $ r&}
t                               d|
¦  «         Y d}
~
dS d}
~
ww xY w)zCreate a new Matrix room.Nr;   r›  r]   rÁ  zMMatrix: refusing to create public room without MATRIX_ALLOW_PUBLIC_ROOMS=true)r:   r;   r<   c                ó,   — g | ]}t          |¦  «        ‘ŒS r'   )r   rt  s     r)   ú
<listcomp>z-MatrixAdapter.create_room.<locals>.<listcomp>"  s   € Ð:Ð:Ð: a�˜q™	œ	Ð:Ð:Ð:r(   )r«   rV  Úinviteesrí  rX  zMatrix: created room %s (%s)ÚunnamedzMatrix: create_room error: %s)r"  r£   rd  r²   r€   r¥  r   r=   r>   r?   rc  Úcreate_roomrx   r!  r¿  r2  r   )rÿ   r«   rV  r   rí  rX  Úpreset_enumr\  r:  Úroom_id_strrã  s              r)   r^  zMatrixAdapter.create_room
  s“  è è € ð Œ|ð 	Ø�4Ø�]Ò"Ð"¥r¤yÐ1LÈbÑ'QÔ'Q×'WÒ'WÑ'YÔ'Yð b
ð (
ð (
õ
 �NŠNÐjÑkÔkÐkØ�4ð	å 0Ô 8Ý/Ô6Ý(8Ô(Hðð ÷ Šc�&Õ*Ô2Ñ3Ô3ð	 ð
 ;Ð:¨F¨L°bÐ:Ñ:Ô:ˆHØ œL×4Ò4Ø�\˜TØ�m˜tØ!Ø#Ø"ð 5ñ ô ð ð ð ð ð ð ˆGõ ˜g™,œ,ˆKØÔ×"Ò" ;Ñ/Ô/Ð/Ý�KŠKÐ6¸ÀTÐEVÈYÑWÔWÐWØÐøÝð 	ð 	ð 	Ý�NŠNÐ:¸CÑ@Ô@Ð@Ø�4�4�4�4�4øøøøð	øøøs   ÁCD Ä
E
Ä$EÅE
r6  c              ƒ  ó2  K  — | j         sdS 	 | j                              t          |¦  «        t          |¦  «        ¦  «        ƒ d{V —† t                               d||¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)zInvite a user to a room.FNzMatrix: invited %s to %sTzMatrix: invite error: %s)r"  Úinvite_userr   r   r€   r2  r   r¥  )rÿ   r:  r6  rã  s       r)   rb  zMatrixAdapter.invite_user2  s­   è è € àŒ|ð 	Ø�5ð	Ø”,×*Ò*­6°'©?¬?½FÀ7¹O¼OÑLÔLÐLÐLÐLÐLÐLÐLÐLÝ�KŠKÐ2°G¸WÑEÔEÐEØ�4øÝð 	ð 	ð 	Ý�NŠNÐ5°sÑ;Ô;Ð;Ø�5�5�5�5�5øøøøð	øøøs   �AA& Á&
BÁ0BÂBrä  Úlimitr~   Ú
from_tokenúlist[dict[str, Any]]c              ƒ  ó<  ‡ K  — ‰ j         sg S t          dt          t          |pd¦  «        d¦  «        ¦  «        }	 t	          t
          dd¦  «        }t          ‰ j         d¦  «        rC‰ j                              t          |¦  «        |rt          |¦  «        nd||¬¦  «        ƒ d{V —†}ntt          ‰ j         d	¦  «        rC‰ j          
                    t          |¦  «        |rt          |¦  «        nd||¬
¦  «        ƒ d{V —†}nt                               d¦  «         g S t	          |dd¦  «        }|€*t          |t          ¦  «        r|                     d¦  «        }ˆ fd„|pg D ¦   «         S # t           $ r'}t                               d|¦  «         g cY d}~S d}~ww xY w)z7Fetch recent Matrix room history using the live client.rB   rä  r=  r.   r,   ÚmessagesN)rd  Ú	directionrc  Úget_messages)r’   rh  rc  z2Matrix: client has no messages/get_messages methodr„  c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r'   )Ú_serialize_history_event)rp   Úevtrÿ   s     €r)   r[  z/MatrixAdapter.fetch_history.<locals>.<listcomp>^  s'   ø€ ÐPÐPÐP¸3�D×1Ò1°#Ñ6Ô6ÐPÐPÐPr(   zMatrix: fetch history error: %s)r"  rŠ   rŒ   r~   rb  r   r-  rg  r   r   ri  r€   r�   r0  rY  rc  r   r¥  )rÿ   r:  rc  rd  rh  rî  r„  rã  s   `       r)   Úfetch_historyzMatrixAdapter.fetch_history>  sî  øè è € ð Œ|ð 	ØˆIÝ�A•s�3˜u˜{¨Ñ+Ô+¨SÑ1Ô1Ñ2Ô2ˆð	ÝÕ 3°ZÀÑEÔEˆIÝ�t”| ZÑ0Ô0ð Ø!%¤×!6Ò!6Ý˜7‘O”OØ8BÐL�y¨Ñ4Ô4Ð4ÈØ'Øð	 "7ñ "ô "ð ð ð ð ð ð ��õ ˜œ ~Ñ6Ô6ð 	Ø!%¤×!:Ò!:Ý˜7‘O”OØ3=ÐG�) JÑ/Ô/Ð/À4Ø'Øð	 ";ñ "ô "ð ð ð ð ð ð ��õ —’ÐQÑRÔRÐRØ�	Ý˜H g¨tÑ4Ô4ˆEØˆ}¥¨HµdÑ!;Ô!;ˆ}Ø Ÿš WÑ-Ô-�ØPÐPÐPÐPÀ5À;ÈBÐPÑPÔPÐPøÝð 	ð 	ð 	Ý�NŠNÐ<¸cÑBÔBÐBØˆIˆIˆIˆIˆIˆIøøøøð	øøøs%   »C!E* ÄAE* Å*
FÅ4FÆFÆFúdict[str, Any]c           
     ó¼  — t          |dd ¦  «        }|€+t          |t          ¦  «        r|                     di ¦  «        }t          |t          ¦  «        s!t	          |d¦  «        rt          |¦  «        ni }t          t          |dd¦  «        p,t          |t          ¦  «        r|                     dd¦  «        nd¦  «        t          t          |dd¦  «        p,t          |t          ¦  «        r|                     dd¦  «        nd¦  «        t          |¦  «        t          |                     dd¦  «        ¦  «        t          |                     dd¦  «        ¦  «        dœS )	NrÐ   rÏ  rÀ  r]   rz  r·  rÄ   )rÀ  rz  r’  r·  rÄ   )rb  r0  rY  rc  r-  rx   r—  )rÿ   r�  rÐ   s      r)   rk  z&MatrixAdapter._serialize_history_eventc  sH  € Ý˜% ¨DÑ1Ô1ˆØˆ?�z¨%µÑ6Ô6ˆ?Ø—i’i 	¨2Ñ.Ô.ˆGÝ˜'¥4Ñ(Ô(ð 	IÝ'.¨w¸Ñ'@Ô'@ÐH•d˜7‘m”m�mÀbˆGåÝ˜˜z¨2Ñ.Ô.ð RÝ1;¸EÅ4Ñ1HÔ1HÐP�E—I’I˜j¨"Ñ-Ô-Ð-Èbñô õ Ý˜˜x¨Ñ,Ô,ð PÝ/9¸%ÅÑ/FÔ/FÐN�E—I’I˜h¨Ñ+Ô+Ð+ÈBñô õ 9¸Ñ?Ô?Ý˜7Ÿ;š; y°"Ñ5Ô5Ñ6Ô6Ý˜Ÿš F¨BÑ/Ô/Ñ0Ô0ð
ð 
ð 	
r(   ©r2   r3   r4   r2   ÚstateÚ
status_msgc              ƒ  ó¢  K  — | j         sdS || j        vrt                               d|¦  «         dS 	 t          j        t          j        t          j        dœ}| j                              ||         |pd¬¦  «        ƒ d{V —† t           	                    d|¦  «         dS # t          $ r&}t           	                    d|¦  «         Y d}~dS d}~ww xY w)	zSet the bot's presence status.Fz!Matrix: invalid presence state %rrp  N)Úpresencerô  zMatrix: presence set to %sTzMatrix: set_presence failed: %s)r"  Ú_VALID_PRESENCE_STATESr€   r¥  r   r5   r6   r7   Úset_presencer�   r   )rÿ   rq  rr  Úpresence_maprã  s        r)   rv  zMatrixAdapter.set_presence}  s  è è € àŒ|ð 	Ø�5Ø˜Ô3Ð3Ð3Ý�NŠNÐ>ÀÑFÔFÐFØ�5ð	å'Ô.Ý(Ô0Ý,Ô8ðð ˆLð
 ”,×+Ò+Ø% eÔ,Ø!Ð) Tð ,ñ ô ð ð ð ð ð ð ð õ �LŠLÐ5°uÑ=Ô=Ð=Ø�4øÝð 	ð 	ð 	Ý�LŠLÐ:¸CÑ@Ô@Ð@Ø�5�5�5�5�5øøøøð	øøøs   ³A)B Â
CÂ(C	Ã	Cc              ƒ  ó‚  K  — | j         r|st          dd¬¦  «        S |                      ||¬¦  «        }	 | j                              t	          |¦  «        t
          j        |¦  «        ƒ d{V —†}t          dt          |¦  «        ¬¦  «        S # t          $ r(}t          dt          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)zDSend a simple message (emote, notice) with optional HTML formatting.FzNo client or empty textrx  )r·  NTry  )	r"  rK   r}  r€  r   r   r#   rx   r   )rÿ   rJ  rZ   r·  r…  rÀ  rã  s          r)   Ú_send_simple_messagez"MatrixAdapter._send_simple_message˜  sõ   è è € ð Œ|ð 	N 4ð 	NÝ eÐ3LÐMÑMÔMÐMà×6Ò6°tÀWÐ6ÑMÔMˆð	=Ø!œ\×<Ò<Ý�w‘”ÝÔ&Øñô ð ð ð ð ð ð ˆHõ
  dµs¸8±}´}ÐEÑEÔEÐEøÝð 	=ð 	=ð 	=Ý eµ3°s±8´8Ð<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð	=øøøs   µAB Â
B>ÂB9Â3B>Â9B>c                óx  — | €dS t          | |d¦  «        }|rt          |¦  «        S t          | t          ¦  «        r~|                      |¦  «        rt          | |         ¦  «        S |                      d¦  «        }t          |t          ¦  «        r*|                     |¦  «        rt          ||         ¦  «        S t          | dd¦  «        }t          |t          ¦  «        r*|                     |¦  «        rt          ||         ¦  «        S |�.t          ||d¦  «        rt          t          ||¦  «        ¦  «        S dS )z@Extract a simple value from a Matrix state event object or dict.NrÐ   )rb  rx   r0  rY  rc  )r�  r  rq   rÐ   s       r)   Ú_state_event_valuez MatrixAdapter._state_event_value²  s+  € ð ˆ=Ø�4Ý˜˜s DÑ)Ô)ˆØð 	Ý�u‘:”:ÐÝ�e�TÑ"Ô"ð 	)Ø�yŠy˜‰~Œ~ð 'Ý˜5 œ:‘”Ð&Ø—i’i 	Ñ*Ô*ˆGÝ˜'¥4Ñ(Ô(ð )¨W¯[ª[¸Ñ-=Ô-=ð )Ý˜7 3œ<Ñ(Ô(Ð(Ý˜% ¨DÑ1Ô1ˆÝ�g�tÑ$Ô$ð 	%¨¯ª°SÑ)9Ô)9ð 	%Ý�w˜s”|Ñ$Ô$Ð$ØÐ¥7¨7°C¸Ñ#>Ô#>ÐÝ•w˜w¨Ñ,Ô,Ñ-Ô-Ð-Øˆtr(   úOptional[int]c              ƒ  ó²  K  — | j         rt          | j         dd ¦  «        nd }|r>	 |                     |¦  «        ƒ d {V —†}|�t          |¦  «        S n# t          $ r Y nw xY wt          | dd ¦  «        }|�bt          |d¦  «        rR	 |                     |¦  «        ƒ d {V —†}t          |dd ¦  «        �t          |j        ¦  «        S n# t          $ r Y nw xY wd S )Nr  r"  Újoined_membersÚmembers)r"  rb  Úget_membersr‡   r   r-  r~  r  )rÿ   r:  r  r  r$  r×  s         r)   Ú_get_room_member_countz$MatrixAdapter._get_room_member_countÇ  s6  è è € ð ;?¼,ÐP�G�D”L -°Ñ6Ô6Ð6ÈDð 	ð ð 	ðØ +× 7Ò 7¸Ñ @Ô @Ð@Ð@Ð@Ð@Ð@Ð@�ØÐ&Ý˜w™<œ<Ð'ð 'øåð ð ð Ø�ðøøøõ ˜˜y¨$Ñ/Ô/ˆØÐ¥'¨&Ð2BÑ"CÔ"CÐðØ#×2Ò2°7Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;�Ý˜4 ¨DÑ1Ô1Ð=Ý˜tœ|Ñ,Ô,Ð,ð >øåð ð ð Ø�ðøøøð ˆts#   ¥+A Á
AÁAÂ?C Ã
CÃCc              ƒ  óH  K  — | j         rt          | j         d¦  «        sd S 	 | j                              t          |¦  «        d¦  «        ƒ d {V —†}n# t          $ r Y d S w xY w|                      |d¦  «        }|r(|                     ¦   «         r|                     ¦   «         nd S )Nr.  r   r«   ©r"  r-  r.  r   r   r{  r}   ©rÿ   r:  r�  rq   s       r)   Ú_get_room_namezMatrixAdapter._get_room_nameà  sÎ   è è € ØŒ|ð 	¥7¨4¬<Ð9JÑ#KÔ#Kð 	Ø�4ð	Øœ,×6Ò6Ý�w‘”Øñô ð ð ð ð ð ð ˆEˆEøõ ð 	ð 	ð 	Ø�4�4ð	øøøà×'Ò'¨¨vÑ6Ô6ˆØ %ÐA¨%¯+ª+©-¬-ÐAˆu�{Š{‰}Œ}ˆ}¸TÐAó   ¢.A Á
AÁAc              ƒ  óH  K  — | j         rt          | j         d¦  «        sd S 	 | j                              t          |¦  «        d¦  «        ƒ d {V —†}n# t          $ r Y d S w xY w|                      |d¦  «        }|r(|                     ¦   «         r|                     ¦   «         nd S )Nr.  zm.room.canonical_aliasÚaliasrƒ  r„  s       r)   Ú_get_room_canonical_aliasz'MatrixAdapter._get_room_canonical_aliasí  sÎ   è è € ØŒ|ð 	¥7¨4¬<Ð9JÑ#KÔ#Kð 	Ø�4ð	Øœ,×6Ò6Ý�w‘”Ø(ñô ð ð ð ð ð ð ˆEˆEøõ ð 	ð 	ð 	Ø�4�4ð	øøøà×'Ò'¨¨wÑ7Ô7ˆØ %ÐA¨%¯+ª+©-¬-ÐAˆu�{Š{‰}Œ}ˆ}¸TÐAr†  c              ƒ  óH  K  — | j         rt          | j         d¦  «        sd S 	 | j                              t          |¦  «        d¦  «        ƒ d {V —†}n# t          $ r Y d S w xY w|                      |d¦  «        }|r(|                     ¦   «         r|                     ¦   «         nd S )Nr.  zm.room.topicrV  rƒ  r„  s       r)   Ú_get_room_topiczMatrixAdapter._get_room_topicú  sÎ   è è € ØŒ|ð 	¥7¨4¬<Ð9JÑ#KÔ#Kð 	Ø�4ð	Øœ,×6Ò6Ý�w‘”Øñô ð ð ð ð ð ð ˆEˆEøõ ð 	ð 	ð 	Ø�4�4ð	øøøà×'Ò'¨¨wÑ7Ô7ˆØ %ÐA¨%¯+ª+©-¬-ÐAˆu�{Š{‰}Œ}ˆ}¸TÐAr†  c                ór   — d| vrd S |                       dd¦  «        d                              ¦   «         }|pd S )Nr%  rB   rÞ  )rò  r}   )r:  Úservers     r)   Ú_room_server_namezMatrixAdapter._room_server_name  s@   € à�gÐÐØ�4Ø—’  QÑ'Ô'¨Ô+×1Ò1Ñ3Ô3ˆØˆ~˜Ðr(   r‹  r9  c                ó<  — t          | j        ¦  «        | j        k    rYt          | j        | j        j        d ¬¦  «        }|r6| j                             |d ¦  «         | j                             |d ¦  «         || j        |<   t          j        ¦   «         | j        |<   d S )N)r  r&  )	r‡   rŽ  r‘  rŒ   r�  rc  r+  rH  r*  )rÿ   r:  r‹  Úoldests       r)   Ú_cache_room_identityz"MatrixAdapter._cache_room_identity  s¦   € ÝˆtÔ$Ñ%Ô%¨Ô)FÒFÐFÝØÔ-ØÔ1Ô5Øðñ ô ˆFð
 ð @ØÔ%×)Ò)¨&°$Ñ7Ô7Ð7ØÔ-×1Ò1°&¸$Ñ?Ô?Ð?Ø)1ˆÔ˜gÑ&Ý15´Ñ1AÔ1AˆÔ% gÑ.Ð.Ð.r(   )Úforce_refreshr’  c             ƒ  ó  K  — | j                              |¦  «        }| j                             |d¦  «        }| j        dk    pt	          j        ¦   «         |z
  | j        k    }|�|r|s|S |                      |¦  «        ƒ d{V —†}|                      |¦  «        ƒ d{V —†}|                      |¦  «        ƒ d{V —†}|  	                    |¦  «        ƒ d{V —†}	t          |¦  «        }
t          | j                             |d¦  «        ¦  «        }|	dur|	dk    p|o|
 }t          |o|
o	|	du p|	dk    ¦  «        }|rdnd}|p|p|}t          |||||                      |¦  «        |	|||
||¬¦  «        }|                      ||¦  «         |S )	zâResolve Matrix room identity without member-count DM heuristics.

        Matrix ``m.direct`` account data is the authoritative DM signal, but
        explicitly named rooms win over stale/conflicting DM account data.
        r”  r   NFr½   r‰  r[  )r:  r;  r<  r=  r>  r?  rA  rB  rC  rD  rE  )rŽ  rc  r�  r�  rH  r*  r…  r‹  r‰  r�  r@  r�  r9  rŽ  r‘  )rÿ   r:  r’  ÚcachedÚ	cached_atÚcache_freshr;  r<  r=  Úmember_countrC  rí  Úis_likely_dmrE  rD  rB  r‹  s                    r)   rŠ  z$MatrixAdapter._resolve_room_identity  s  è è € ð Ô&×*Ò*¨7Ñ3Ô3ˆØÔ1×5Ò5°g¸sÑCÔCˆ	àÔ+¨qÒ0ð OÝŒ~ÑÔ )Ñ+¨tÔ/NÒNð 	ð Ð +Ð°mÐØˆMà×-Ò-¨gÑ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6ˆ	Ø×/Ò/°Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆ
Ø $× >Ò >¸wÑ GÔ GÐGÐGÐGÐGÐGÐGˆØ!×8Ò8¸ÑAÔAÐAÐAÐAÐAÐAÐAˆÝ  ™OœOÐÝ˜œ×+Ò+¨G°UÑ;Ô;Ñ<Ô<ˆ	ð %¨DÐ0ÐF°\ÀQÒ5Fð 
ØÐ/Ð/Ð/ð 	õ Øð ;Ø!ð;à Ð%Ð9¨¸Ò)9ñ
ô 
ˆð
 )Ð4�D�D¨fˆ	Ø Ð> OÐ>°wˆå%ØØØ!Ø+Ø×.Ò.¨wÑ7Ô7Ø ,Ø#,Ø%Ø/ØØð
ñ 
ô 
ˆð 	×!Ò! '¨8Ñ4Ô4Ð4Øˆr(   c              ƒ  óN   K  — |                       |¦  «        ƒ d{V —†j        dk    S )zCheck if a room is a DM.Nr‰  )rŠ  rD  r'  s     r)   r‹  zMatrixAdapter._is_dm_roomX  s4   è è € à×1Ò1°'Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ÔEÈÒMÐMr(   c              ƒ  ó|  ‡K  — | j         sdS d}	 | j                              d¦  «        ƒ d{V —†}t          |d¦  «        r|j        }nt	          |t
          ¦  «        r|}n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|€dS t          ¦   «         Š| 
                    ¦   «         D ]9\  }}t	          |t          ¦  «        r‰                     d„ |D ¦   «         ¦  «         Œ:ˆfd„| j        D ¦   «         | _        | j                             ¦   «          | j                             ¦   «          dS )z5Refresh the DM room cache from m.direct account data.Núm.directrÐ   z/Matrix: get_account_data('m.direct') failed: %sc              3  ó^   K  — | ](}t          |t          ¦  «        ¯t          |¦  «        V — Œ)d S rn   )r0  rx   rJ  s     r)   rr   z2MatrixAdapter._refresh_dm_cache.<locals>.<genexpr>r  s7   è è € Ð"OÐ"O¨a½JÀqÍ#Ñ<NÔ<NÐ"O¥3 q¡6¤6Ð"OÐ"OÐ"OÐ"OÐ"OÐ"Or(   c                ó   •— i | ]}||‰v “ŒS r'   r'   )rp   ÚridÚdm_room_idss     €r)   ú
<dictcomp>z3MatrixAdapter._refresh_dm_cache.<locals>.<dictcomp>t  s    ø€ ÐRÐRÐR¸˜#  {Ð 2ÐRÐRÐRr(   )r"  Úget_account_datar-  rÐ   r0  rY  r   r€   r�   r  rÏ  r7  rK  r!  r�  rŽ  rJ  r�  )rÿ   Údm_datar×  rã  r6  r+  rŸ  s         @r)   rM  zMatrixAdapter._refresh_dm_cache\  sy  øè è € àŒ|ð 	ØˆFà"&ˆð	QØœ×6Ò6°zÑBÔBÐBÐBÐBÐBÐBÐBˆDÝ�t˜YÑ'Ô'ð Øœ,��Ý˜D¥$Ñ'Ô'ð Ø�øøÝð 	Qð 	Qð 	QÝ�LŠLÐJÈCÑPÔPÐPÐPÐPÐPÐPÐPøøøøð	Qøøøð ˆ?ØˆFå #¡¤ˆØ%Ÿmšm™oœoð 	Pð 	P‰NˆG�UÝ˜%¥Ñ&Ô&ð PØ×"Ò"Ð"OÐ"O°5Ð"OÑ"OÔ"OÑOÔOÐOøàRÐRÐRÐR¸tÔ?QÐRÑRÔRˆŒØÔ×#Ò#Ñ%Ô%Ð%ØÔ%×+Ò+Ñ-Ô-Ð-Ð-Ð-s   �AA  Á 
BÁ*B
Â
Bc              ƒ  ó  K  — | j         sdS i }	 | j                              d¦  «        ƒ d{V —†}t          |d¦  «        r"t          |j        t
          ¦  «        r|j        }nt          |t
          ¦  «        r|}n# t          $ r Y nw xY w|                     |g ¦  «        }t          |t          ¦  «        sg }||vr‹| 	                    |¦  «         |||<   	 | j          
                    d|¦  «        ƒ d{V —† t                               d||¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wd| j        |<   | j                             |d¦  «         | j                             |d¦  «         dS )a¨  Persist a room as DM in m.direct account data after an invite.

        When the bot account has never been used for DMs, ``m.direct`` is
        absent (404).  This method fetches the current mapping (if any),
        appends *room_id* under the *inviter*'s entry, and writes it back
        so that subsequent ``_refresh_dm_cache`` calls treat the room as a
        DM without requiring manual ``m.direct`` setup.
        Nr›  rÐ   z+Matrix: recorded %s as DM room (inviter=%s)z%Matrix: failed to update m.direct: %sT)r"  r¡  r-  r0  rÐ   rY  r   rc  r7  r‹   Úset_account_datar€   r2  r¥  r�  rŽ  r+  r�  )rÿ   r:  rð  r¢  r×  Úrooms_for_userrã  s          r)   rú  zMatrixAdapter._record_dm_roomx  sä  è è € ð Œ|ð 	ØˆFà#%ˆð	Øœ×6Ò6°zÑBÔBÐBÐBÐBÐBÐBÐBˆDÝ�t˜YÑ'Ô'ð ­J°t´|ÅTÑ,JÔ,Jð Øœ,��Ý˜D¥$Ñ'Ô'ð Ø�øøÝð 	ð 	ð 	ØˆDð	øøøð !Ÿš W¨bÑ1Ô1ˆÝ˜.­$Ñ/Ô/ð 	 ØˆNØ˜.Ð(Ð(Ø×!Ò! 'Ñ*Ô*Ð*Ø-ˆG�GÑðMØ”l×3Ò3°JÀÑHÔHÐHÐHÐHÐHÐHÐHÐHÝ—’ØAÀ7ÈGñô ð ð øõ ð Mð Mð MÝ—’ÐFÈÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð #'ˆŒ�wÑØÔ×!Ò! '¨4Ñ0Ô0Ð0ØÔ%×)Ò)¨'°4Ñ8Ô8Ð8Ð8Ð8s*   �A)A9 Á9
BÂBÃ=D Ä
EÄD=Ä=Er¶  c                ó2  — ||dœ}|                       |¦  «        }| j        o|                      |¦  «        }|rd|i|d<   |rd|                     di ¦  «        d<   |                      |¦  «        }|                      |¦  «        }|r||k    r
d|d<   ||d<   |S )	zBBuild Matrix text content with HTML and outbound mention metadata.©r·  rÄ   rœ  r¸  Tr[  rº  r»  r¹  )Ú_extract_outbound_mentionsrœ  Ú_has_outbound_room_mentionÚ
setdefaultÚ_inject_outbound_mention_linksÚ_markdown_to_html)rÿ   rZ   r·  r…  r«  Úroom_mentionedÚhtml_sourcerï  s           r)   r}  z)MatrixAdapter._build_text_message_content¥  sÌ   € à29À4Ð&HÐ&HˆØ×:Ò:¸4Ñ@Ô@ÐØÔ2Ð\°t×7VÒ7VÐW[Ñ7\Ô7\ˆØð 	GØ)3Ð5EÐ(FˆK˜Ñ%Øð 	DØ?CˆK×"Ò" <°Ñ4Ô4°VÑ<à×9Ò9¸$Ñ?Ô?ˆØ×%Ò% kÑ2Ô2ˆØð 	1�D˜D’L�LØ$<ˆK˜Ñ!Ø,0ˆKÐ(Ñ)àÐr(   ru  r…  c               óø   — t          |pi                      d¦  «        pd¦  «        }|r	dd|ii|d<   |rF|                     di ¦  «        }d|d<   ||d<   d|d	<   |                     dd|p|i¦  «         ||d<   d
S d
S )zCApply Matrix reply/thread relation metadata to an outbound payload.rŸ  r]   r³  rÀ  r¾  r›  r½  TÚis_falling_backN)rx   rc  rª  )rÿ   r…  rr  r�   rŸ  r—  s         r)   r~  z&MatrixAdapter._apply_relation_metadata·  sÅ   € õ ˜˜ R×,Ò,¨[Ñ9Ô9Ð?¸RÑ@Ô@ˆ	Øð 	TØ+:¸ZÈÐ<RÐ*SˆK˜Ñ'Øð 	5Ø$Ÿš¨¸Ñ<Ô<ˆJØ%/ˆJ�zÑ"Ø%.ˆJ�zÑ"Ø,0ˆJÐ(Ñ)ð ×!Ò!ØØ˜XÐ2¨Ð3ñô ð ð +5ˆK˜Ñ'Ð'Ð'ð	5ð 	5r(   ú	list[str]c                ó  — |                       |¦  «        \  }}t          ¦   «         }g }t                               |¦  «        D ]E}|                     d¦  «        }||vr*|                     |¦  «         |                     |¦  «         ŒF|S )z9Return unique Matrix user IDs mentioned in outbound text.rB   )Ú!_protect_outbound_mention_regionsr  Ú_OUTBOUND_MENTION_REÚfinditerrÁ   r¿  r‹   )rÿ   rZ   Ú	protectedr®   ÚseenÚmentionsrÀ   r6  s           r)   r¨  z(MatrixAdapter._extract_outbound_mentionsÐ  sˆ   € à×=Ò=¸dÑCÔC‰ˆ	�1Ý™œˆØ ˆÝ)×2Ò2°9Ñ=Ô=ð 	)ð 	)ˆEØ—k’k !‘n”nˆGØ˜dÐ"Ð"Ø—’˜Ñ!Ô!Ð!Ø—’ Ñ(Ô(Ð(øØˆr(   c                óv   — |                       |¦  «        \  }}t          t          j        d|¦  «        ¦  «        S )zFReturn True when outbound text contains @room outside protected spans.z(?<![\w/])@room(?![\w:.-]))r³  r@  r  r…  )rÿ   rZ   r¶  r®   s       r)   r©  z(MatrixAdapter._has_outbound_room_mentionÜ  s4   € à×=Ò=¸dÑCÔC‰ˆ	�1Ý•B”IÐ;¸YÑGÔGÑHÔHÐHr(   c                óÔ   — |s|S |                       |¦  «        \  }}t                               d„ |¦  «        }t          |¦  «        D ]\  }}|                     d|› d�|¦  «        }Œ |S )zCWrap outbound Matrix mentions in markdown links outside code spans.c                ó`   — d|                       d¦  «        › d|                       d¦  «        › d�S )NÚ[rB   z](https://matrix.to/#/r  ©rÁ   )rÀ   s    r)   ú<lambda>z>MatrixAdapter._inject_outbound_mention_links.<locals>.<lambda>é  s/   € ÐU˜eŸkšk¨!™nœnÐUÐUÀEÇKÂKÐPQÁNÄNÐUÐUÐU€ r(   ú MENTION_PROTECTEDú )r³  r´  r  r|  r³   )rÿ   rZ   r¶  ÚplaceholdersÚlinkedr‘   Úoriginals          r)   r«  z,MatrixAdapter._inject_outbound_mention_linksá  sŠ   € àð 	ØˆKà"&×"HÒ"HÈÑ"NÔ"NÑˆ	�<å%×)Ò)ØUÐUØñ
ô 
ˆõ
 ' |Ñ4Ô4ð 	Qð 	Q‰MˆC�Ø—^’^Ð$E¸CÐ$EÐ$EÐ$EÀxÑPÔPˆFˆFàˆr(   útuple[str, list[str]]c                ó¸   ‡‡— g Šdˆfd„Št          j        dˆfd„|pd¦  «        }t          j        dˆfd	„|¦  «        }t          j        d
ˆfd„|¦  «        }|‰fS )zEProtect markdown regions where outbound mentions should stay literal.Úfragmentrx   rR   c                óX   •— t          ‰¦  «        }‰                     | ¦  «         d|› d�S )Nr¿  rÀ  ©r‡   r‹   )rÆ  r‘   rÁ  s     €r)   Ú_protectzAMatrixAdapter._protect_outbound_mention_regions.<locals>._protectö  s5   ø€ Ý�lÑ#Ô#ˆCØ×Ò Ñ)Ô)Ð)Ø4¨3Ð4Ð4Ð4Ð4r(   z```[\s\S]*?```c                ó@   •—  ‰|                       d¦  «        ¦  «        S ©Nr   r½  ©rÀ   rÉ  s    €r)   r¾  zAMatrixAdapter._protect_outbound_mention_regions.<locals>.<lambda>ý  ó   ø€ ˜(˜( 5§;¢;¨q¡>¤>Ñ2Ô2€ r(   r]   z	`[^`\n]+`c                ó@   •—  ‰|                       d¦  «        ¦  «        S rË  r½  rÌ  s    €r)   r¾  zAMatrixAdapter._protect_outbound_mention_regions.<locals>.<lambda>  rÍ  r(   z\[[^\]]+\]\([^)]+\)c                ó@   •—  ‰|                       d¦  «        ¦  «        S rË  r½  rÌ  s    €r)   r¾  zAMatrixAdapter._protect_outbound_mention_regions.<locals>.<lambda>  rÍ  r(   )rÆ  rx   rR   rx   rü  )rÿ   rZ   r¶  rÉ  rÁ  s      @@r)   r³  z/MatrixAdapter._protect_outbound_mention_regionsò  s§   øø€ à"$ˆð	5ð 	5ð 	5ð 	5ð 	5ð 	5õ
 ”FØØ2Ð2Ð2Ð2ØˆJ�Bñ
ô 
ˆ	õ
 ”FØØ2Ð2Ð2Ð2Øñ
ô 
ˆ	õ
 ”FØ"Ø2Ð2Ð2Ð2Øñ
ô 
ˆ	ð ˜,Ð&Ð&r(   r¹  r«  c                óŠ  — |r| j         r| j         |v rdS |s|sdS | j         r| j         |v rdS | j         rxd| j         v ro| j                              d¦  «        d                              d¦  «        }|r:t          j        dt          j        |¦  «        z   dz   |t          j        ¦  «        rdS |r| j         rd| j         › �|v rdS dS )uÅ  Return True if the bot is mentioned in the message.

        Per MSC3952, ``m.mentions.user_ids`` is the authoritative mention
        signal in the Matrix spec.  When the sender's client populates that
        field with the bot's user-id, we trust it â€” even when the visible
        body text does not contain an explicit ``@bot`` string (some clients
        only render mention "pills" in ``formatted_body`` or use display
        names).
        TFr%  r   r  ú\bzmatrix.to/#/)r~  rÊ   Úlstripr  r…  r	   Ú
IGNORECASE)rÿ   rÄ   r¹  r«  r�  s        r)   r£  zMatrixAdapter._is_bot_mentioned  s  € ð  ð 	 ¤ð 	°$´-ÐCSÐ2SÐ2SØ�4Øð 	˜Nð 	Ø�5ØŒ=ð 	˜Tœ]¨dÐ2Ð2Ø�4ØŒ=ð 	˜S D¤MÐ1Ð1Øœ×+Ò+¨CÑ0Ô0°Ô3×:Ò:¸3Ñ?Ô?ˆIØð �RœYØ�œ	 )Ñ,Ô,Ñ,¨uÑ4°d½B¼Mñô ð ð �tØð 	˜dœmð 	Ø-˜dœmÐ-Ð-°Ð?Ð?Ø�tØˆur(   c                óÌ  — |sdS | j         r|                     | j         d¦  «        }| j         rxd| j         v ro| j                              d¦  «        d                              d¦  «        }|r:t	          j        dt	          j        |¦  «        z   dz   d|t          j        ¬¦  «        }t	          j        dd	|¦  «        }t	          j        d
d|¦  «        }|                     ¦   «         S )a  Remove explicit bot mentions from message body.

        Important: only strip explicit mention tokens (``@user:server`` or
        ``@localpart``). Do NOT strip bare words matching the bot localpart,
        otherwise normal phrases like "Hermes Agent" become "Agent".
        r]   r%  r   r  z
(?<![\w])@rÑ  ©rÜ  z	[ \t]{2,}rJ  z\s+([,.;:!?])ú\1)	r~  r³   rÊ   rÒ  r  r  r	   rÓ  r}   )rÿ   rÄ   r�  s      r)   r¥  zMatrixAdapter._strip_mention.  sé   € ð ð 	Ø�2ð Œ=ð 	3Ø—<’< ¤¨rÑ2Ô2ˆDð Œ=ð 	˜S D¤MÐ1Ð1Øœ×+Ò+¨CÑ0Ô0°Ô3×:Ò:¸3Ñ?Ô?ˆIØð Ý”vØ!¥B¤I¨iÑ$8Ô$8Ñ8¸5Ñ@ØØÝœ-ð	ñ ô �õ Œv�l C¨Ñ.Ô.ˆÝŒvÐ&¨¨tÑ4Ô4ˆØ�zŠz‰|Œ|Ðr(   c              ƒ  óT  K  — | j         rt          | j         dd¦  «        nd}|rH	 |                     ||¦  «        ƒ d{V —†}|rt          |dd¦  «        r|j        S n# t          $ r Y nw xY w|                     d¦  «        r'd|v r#|dd…                              d¦  «        d         S |S )z=Get a user's display name in a room, falling back to user_id.r  NÚdisplaynamer  r%  rB   r   )r"  rb  Ú
get_memberrØ  r   r¾   rÊ   )rÿ   r:  r6  r  Úmembers        r)   r¦  zMatrixAdapter._get_display_nameL  së   è è € ð ;?¼,ÐP�G�D”L -°Ñ6Ô6Ð6ÈDð 	ð ð 	ðØ*×5Ò5°g¸wÑGÔGÐGÐGÐGÐGÐGÐG�Øð .�g f¨m¸TÑBÔBð .Ø!Ô-Ð-øøÝð ð ð Ø�ðøøøð ×Ò˜cÑ"Ô"ð 	- s¨g ~ ~Ø˜1˜2˜2”;×$Ò$ SÑ)Ô)¨!Ô,Ð,Øˆs   ¥5A Á
A)Á(A)r^  c                ó\   — |                      d¦  «        s|S |dd…         }| j        › d|› �S )z6Convert mxc://server/media_id to an HTTP download URL.rÃ  é   Nz"/_matrix/client/v1/media/download/)r¾   r|  )rÿ   r^  rù  s      r)   rÑ  zMatrixAdapter._mxc_to_http]  sA   € à×!Ò! (Ñ+Ô+ð 	ØˆNØ˜˜˜”ˆØÔ"ÐMÐMÀeÐMÐMÐMr(   c                óú  — t          |¦  «        }	 ddl}|                     g d¢¬¦  «        }d|j        v r|j                             d¦  «         |                     |¦  «        }|                     ¦   «          |                     d¦  «        dk    r*|                     dd¦  «                             d	d¦  «        }t          |¦  «        S # t          $ r Y nw xY wt          |                      |¦  «        ¦  «        S )
u–  Convert Markdown to Matrix-compatible HTML (org.matrix.custom.html).

        Uses the ``markdown`` library (a core dependency) when available.
        Falls back to a comprehensive regex converter that handles fenced
        code blocks, inline code, headers, bold, italic, strikethrough,
        links, blockquotes, lists, and horizontal rules â€” everything the
        Matrix HTML spec allows.
        r   N)Úfenced_coder   Únl2brÚ
sane_lists©Ú
extensionsÚ
html_blockz<p>rB   r]   z</p>)rý  ÚmarkdownÚMarkdownÚpreprocessorsÚ
deregisterÚconvertÚresetr�   r³   ró  r¤  Ú_markdown_to_html_fallback)rÿ   rZ   Ú_mdÚmdrï  s        r)   r¬  zMatrixAdapter._markdown_to_htmld  s  € õ -¨TÑ2Ô2ˆð	Ø"Ð"Ð"Ð"à—’ØKÐKÐKð ñ ô ˆBð ˜rÔ/Ð/Ð/ØÔ ×+Ò+¨LÑ9Ô9Ð9à—:’:˜dÑ#Ô#ˆDØ�HŠH‰JŒJˆJà�zŠz˜%Ñ Ô  AÒ%Ð%Ø—|’| E¨2Ñ.Ô.×6Ò6°v¸rÑBÔB�Ý(¨Ñ.Ô.Ð.øÝð 	ð 	ð 	ØˆDð	øøøõ % T×%DÒ%DÀTÑ%JÔ%JÑKÔKÐKs   ‘B9C Ã
CÃCc                óî   — |                       ¦   «         }d|v r@|                     dd¦  «        d                              ¦   «                               ¦   «         nd}|dv rdS |                     dd¦  «        S )z,Sanitize a URL for use in an href attribute.r%  rB   r   r]   >   r#  ÚvbscriptÚ
javascriptr  z&quot;)r}   rÊ   r²   r³   )rô  r×   r  s      r)   Ú_sanitize_link_urlz MatrixAdapter._sanitize_link_url†  sv   € ð —9’9‘;”;ˆØ>AÀX¸o¸o�—’  QÑ'Ô'¨Ô*×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:Ð:ÐSUˆØÐ7Ð7Ð7Ø�2Ø×Ò  XÑ.Ô.Ð.r(   c           	     óX  ‡‡— g Šd8ˆfd„Št          j        dˆfd„| t           j        ¬¦  «        }t          j        dˆfd	„|¦  «        }t          j        d
ˆfd„|¦  «        }t          j        d|¦  «        }t	          |¦  «        D ],\  }}|                     d¦  «        st          |¦  «        ||<   Œ-d                     |¦  «        }|                     d¦  «        }g }d}|t          |¦  «        k     �r…||         }t          j	        d|¦  «        r| 
                    d¦  «         |dz  }ŒLt          j	        d|¦  «        }	|	rlt          |	                     d¦  «        ¦  «        }
| 
                    d|
› d|	                     d¦  «                             ¦   «         › d|
› d�¦  «         |dz  }ŒÏ|                     d¦  «        s"|dk    s|                     d¦  «        s|dk    �r{g }|t          |¦  «        k     �r7||                              d¦  «        s3||         dk    s'||                              d¦  «        s||         dk    ré||         }|                     d¦  «        r| 
                    |dd…         ¦  «         nH|                     d¦  «        r| 
                    |dd…         ¦  «         n| 
                    d¦  «         |dz  }|t          |¦  «        k     rN||                              d¦  «        °¶||         dk    °Â||                              d¦  «        °Ý||         dk    °é| 
                    dd                     |¦  «        › d �¦  «         �Œ�t          j	        d!|¦  «        }|rÞg }|t          |¦  «        k     r�t          j	        d!||         ¦  «        rt| 
                    t          j	        d!||         ¦  «                             d¦  «        ¦  «         |dz  }|t          |¦  «        k     rt          j	        d!||         ¦  «        °td                     d"„ |D ¦   «         ¦  «        }| 
                    d#|› d$�¦  «         �Œvt          j	        d%|¦  «        }|rÞg }|t          |¦  «        k     r�t          j	        d%||         ¦  «        rt| 
                    t          j	        d%||         ¦  «                             d¦  «        ¦  «         |dz  }|t          |¦  «        k     rt          j	        d%||         ¦  «        °td                     d&„ |D ¦   «         ¦  «        }| 
                    d'|› d(�¦  «         �Œk| 
                    |¦  «         |dz  }|t          |¦  «        k     �°…d                     |¦  «        }t          j        d)d*|t           j        ¬¦  «        }t          j        d+d*|t           j        ¬¦  «        }t          j        d,d-|t           j        ¬¦  «        }t          j        d.d-|t           j        ¬¦  «        }t          j        d/d0|t           j        ¬¦  «        }t          j        d1d2|¦  «        }t          j        d3d4|¦  «        }t          j        d5d6|¦  «        }t	          ‰¦  «        D ]\  }}|                     d|› d7�|¦  «        }Œ |S )9z0Comprehensive regex Markdown-to-HTML for Matrix.Úhtml_fragmentrx   rR   c                óX   •— t          ‰¦  «        }‰                     | ¦  «         d|› d�S )Nú
 PROTECTEDrÀ  rÈ  )rò  r‘   rÁ  s     €r)   Ú_protect_htmlz?MatrixAdapter._markdown_to_html_fallback.<locals>._protect_html”  s5   ø€ Ý�lÑ#Ô#ˆCØ×Ò Ñ.Ô.Ð.Ø, 3Ð,Ð,Ð,Ð,r(   z```(\w*)\n(.*?)```c           
     ó  •—  ‰|                       d¦  «        rIdt          |                       d¦  «        ¦  «        › dt          |                       d¦  «        ¦  «        › d�n%dt          |                       d¦  «        ¦  «        › d�¦  «        S )NrB   z<pre><code class="language-z">r½   z</code></pre>z<pre><code>)rÁ   r  ©Úmrõ  s    €r)   r¾  z:MatrixAdapter._markdown_to_html_fallback.<locals>.<lambda>œ  s—   ø€ �m�mð —7’7˜1‘:”:ðKð ;­l¸1¿7º7À1¹:¼:Ñ.FÔ.Fð ;ð ;Ý §¢¨¡
¤
Ñ+Ô+ð;ð ;ð ;ð ;ð K¥<°·²¸±
´
Ñ#;Ô#;ÐJÐJÐJñ	ô € r(   rÕ  z`([^`\n]+)`c                ób   •—  ‰dt          |                      d¦  «        ¦  «        › d�¦  «        S )Nz<code>rB   z</code>)r  rÁ   r÷  s    €r)   r¾  z:MatrixAdapter._markdown_to_html_fallback.<locals>.<lambda>©  s/   ø€ �m�mÐ$N­\¸!¿'º'À!¹*¼*Ñ-EÔ-EÐ$NÐ$NÐ$NÑOÔO€ r(   z\[([^\]]+)\]\(([^)]+)\)c           
     óØ   •—  ‰d                      t                               |                      d¦  «        ¦  «        t	          |                      d¦  «        ¦  «        ¦  «        ¦  «        S )Nz<a href="{}">{}</a>r½   rB   )r»  r<  rð  rÁ   r  r÷  s    €r)   r¾  z:MatrixAdapter._markdown_to_html_fallback.<locals>.<lambda>°  sV   ø€ �m�mØ%×,Ò,Ý!×4Ò4°Q·W²W¸Q±Z´ZÑ@Ô@Ý  §¢¨¡¤Ñ,Ô,ñô ñô € r(   z(\x00PROTECTED\d+\x00)rô  r]   rÉ   r   z!^[\s]*([-*_])\s*\1\s*\1[\s\-*_]*$z<hr>rB   z^(#{1,6})\s+(.+)$z<hrÕ   r½   z</hz&gt; z&gt;rÇ   ro  Nz<blockquote>z<br>z</blockquote>z^[\s]*[-*+]\s+(.+)$c              3  ó"   K  — | ]
}d |› d�V — ŒdS ©z<li>z</li>Nr'   ©rp   Úitems     r)   rr   z;MatrixAdapter._markdown_to_html_fallback.<locals>.<genexpr>õ  ó.   è è € ÐBÐB°DÐ/ DÐ/Ð/Ð/ÐBÐBÐBÐBÐBÐBr(   z<ul>z</ul>z^[\s]*\d+[.)]\s+(.+)$c              3  ó"   K  — | ]
}d |› d�V — ŒdS rü  r'   rý  s     r)   rr   z;MatrixAdapter._markdown_to_html_fallback.<locals>.<genexpr>   rÿ  r(   z<ol>z</ol>z\*\*(.+?)\*\*ú<strong>\1</strong>z	__(.+?)__z	\*(.+?)\*z<em>\1</em>z(?<!\w)_(.+?)_(?!\w)z	~~(.+?)~~z<del>\1</del>z\nz<br>
z0<br>\n(</?(?:pre|blockquote|h[1-6]|ul|ol|li|hr))z\n\1z+(</(?:pre|blockquote|h[1-6]|ul|ol|li)>)<br>rÖ  rÀ  )rò  rx   rR   rx   )r  r  ÚDOTALLrÊ   r|  r¾   r  rÌ   r‡   rÀ   r‹   rÁ   r}   r³   )rZ   rŽ   rù  r‘   ÚpartrÖ   Ú	out_linesrÝ   rÏ   ÚhdrÚlevelÚbq_linesÚlnÚul_matchrÏ  ré   Úol_matchrÃ  rõ  rÁ  s                     @@r)   rê  z(MatrixAdapter._markdown_to_html_fallback�  sÿ  øø€ ð  ˆð	-ð 	-ð 	-ð 	-ð 	-ð 	-õ ”Ø!ðð ð ð ð Ý”)ð

ñ 

ô 

ˆõ ”ØØOÐOÐOÐOØñ
ô 
ˆõ ”Ø&ðð ð ð ð ñ	
ô 	
ˆõ ”Ð2°FÑ;Ô;ˆÝ" 5Ñ)Ô)ð 	0ð 	0‰IˆC�Ø—?’? ?Ñ3Ô3ð 0Ý)¨$Ñ/Ô/��c‘
øØ—’˜‘”ˆð —’˜TÑ"Ô"ˆØˆ	ØˆØ•#�e‘*”*Šn‰nØ˜”8ˆDõ ŒxÐ<¸dÑCÔCð Ø× Ò  Ñ(Ô(Ð(Ø�Q‘�Øõ ”(Ð/°Ñ6Ô6ˆCØð Ý˜CŸIšI a™LœLÑ)Ô)�Ø× Ò Ð!O eÐ!OÐ!O¨c¯iªi¸©l¬l×.@Ò.@Ñ.BÔ.BÐ!OÐ!OÀuÐ!OÐ!OÐ!OÑPÔPÐPØ�Q‘�Øð —’ Ñ(Ô(ðà˜6’>�>Ø—?’? 4Ñ(Ô(ð "à˜3’;‘;à�Ø�#˜e™*œ*’n‘nØ˜!”H×'Ò'¨Ñ0Ô0ð %à˜Q”x 6Ò)Ð)Ø˜Q”x×*Ò*¨4Ñ0Ô0ð *à˜Q”x 3’�à˜qœ�BØ—}’} WÑ-Ô-ð ,Ø Ÿš¨¨1¨2¨2¬Ñ/Ô/Ð/Ð/ØŸš tÑ,Ô,ð ,Ø Ÿš¨¨1¨2¨2¬Ñ/Ô/Ð/Ð/à Ÿš¨Ñ+Ô+Ð+Ø˜‘F�Að �#˜e™*œ*’n�nØ˜!”H×'Ò'¨Ñ0Ô0ð %à˜Q”x 6Ò)Ð)Ø˜Q”x×*Ò*¨4Ñ0Ô0ð *à˜Q”x 3’�ð × Ò Ð!T°·²¸HÑ0EÔ0EÐ!TÐ!TÐ!TÑUÔUÐUÙõ ”xÐ 6¸Ñ=Ô=ˆHØð Ø�Ø�#˜e™*œ*’n�n­¬Ð2HÈ%ÐPQÌ(Ñ)SÔ)S�nØ—L’L¥¤Ð*@À%ÈÄ(Ñ!KÔ!K×!QÒ!QÐRSÑ!TÔ!TÑUÔUÐUØ˜‘F�Að �#˜e™*œ*’n�n­¬Ð2HÈ%ÐPQÌ(Ñ)SÔ)S�nð —W’WÐBÐB¸EÐBÑBÔBÑBÔB�Ø× Ò Ð!1¨Ð!1Ð!1Ð!1Ñ2Ô2Ð2Ùõ ”xÐ 8¸$Ñ?Ô?ˆHØð Ø�Ø�#˜e™*œ*’n�n­¬Ð2JÈEÐRSÌHÑ)UÔ)U�nØ—L’L¥¤Ð*BÀEÈ!ÄHÑ!MÔ!M×!SÒ!SÐTUÑ!VÔ!VÑWÔWÐWØ˜‘F�Að �#˜e™*œ*’n�n­¬Ð2JÈEÐRSÌHÑ)UÔ)U�nð —W’WÐBÐB¸EÐBÑBÔBÑBÔB�Ø× Ò Ð!1¨Ð!1Ð!1Ð!1Ñ2Ô2Ð2Ùà×Ò˜TÑ"Ô"Ð"Ø�‰FˆAðC •#�e‘*”*Šn‰nðF —’˜9Ñ%Ô%ˆõ ”ØÐ4°fÅBÄIð
ñ 
ô 
ˆõ ”˜Ð&<¸fÍBÌIÐVÑVÔVˆÝ”˜ n°fÅBÄIÐNÑNÔNˆÝ”Ø# ^°VÅ2Ä9ð
ñ 
ô 
ˆõ ”˜Ð&6¸ÅbÄiÐPÑPÔPˆÝ”˜˜x¨Ñ0Ô0ˆÝ”Ø?ÀÈ&ñ
ô 
ˆõ ”ÐFÈÈvÑVÔVˆõ ' |Ñ4Ô4ð 	Ið 	I‰MˆC�Ø—^’^Ð$=°CÐ$=Ð$=Ð$=¸xÑHÔHˆFˆFàˆr(   )rj  rF   ©rR   r@  )rÌ  r   rR   r–   )r$  r   rÓ  rx   rR   r@  )rÝ  r   r@  rx   rR   r@  )
rÝ  r   rã  r   rä  rx   rå  rx   rR   r@  )
rã  r   rä  rx   rí  rx   rå  rx   rR   rø   )r$  r   rö  r   rR   r@  )r  r@  rR   r@  r1  rÈ   )
rJ  rx   rÐ   rx   rr  r–   r�   r»  rR   rK   )rJ  rx   rR   rS   )rR   rS   rn   )rJ  rx   r�   r»  rR   rø   )rJ  rx   rR   rø   )
rJ  rx   rK  rx   rÐ   rx   r´  r@  rR   rK   )NNN)rJ  rx   rÁ  rx   rÂ  r–   rr  r–   r�   r»  rR   rK   )rô  rx   rR   rÏ  )rJ  rx   rþ  rx   rÂ  r–   rr  r–   r�   r»  rR   rK   )Nr”  )
rJ  rx   r  r  r�   r»  r  r{   rR   rø   )NNNN)rJ  rx   r  rx   rÂ  r–   r  r–   rr  r–   r�   r»  rR   rK   )rJ  rx   r  rx   rÂ  r–   rr  r–   r�   r»  rR   rK   )rJ  rx   r  rx   rÂ  r–   rr  r–   r�   r»  rR   rK   )r   NTTF)rJ  rx   r!  rx   rI  rx   r"  rx   r�   r#  r$  r@  r%  r@  r&  r@  rR   rK   )rJ  rx   r3  r7  r4  rx   r5  rx   rI  rx   r�   r»  rR   rK   )rJ  rx   rF  rx   rS  r7  rI  rx   r�   r»  rR   rK   )rÐ   rx   rR   rx   )NNNFN)r:  rx   r#  rû  rP  rx   r×  rx   r·  rx   rÂ  r–   rr  r–   r�   r»  r  r@  rQ  r»  rR   rK   )NNNNF)r:  rx   r  rx   r·  rx   rÂ  r–   rr  r–   r  r–   r�   r»  r  r@  rR   rK   )rd  rS   rR   rø   )rz  rx   rR   r@  r:  )r�  r   rR   rø   )r:  rx   rz  rx   rÀ  rx   rÄ   rx   r–  rY  r—  rY  rR   r™  )r:  rx   rz  rx   rÀ  rx   r”  r{   r–  rY  r—  rY  rR   rø   )r:  rx   rz  rx   rÀ  rx   r”  r{   r–  rY  r—  rY  r·  rx   rR   rø   )r:  rx   rí  r@  rð  rx   rR   rø   )r:  rx   rÀ  rx   r0  rx   rR   r–   )r]   )r:  rx   rD  rx   r  rx   rR   r@  )r:  rx   rD  rx   r  rx   rR   rø   )r�  rH   rR   rø   )r�  rH   r  rJ   rR   rø   )r  r   rR   r@  )r:  rx   r)  rx   rz  rx   r  r   r*  rx   rR   r@  )r:  rx   r)  rx   rZ   rx   rR   rø   )r:  rx   r)  rx   r  r/  rR   rø   )r:  rx   r)  rx   r  r2  rR   rø   )r:  rx   r  r/  rR   rø   )r:  rx   r  r2  rR   rø   )r�  rH   rR   rx   )r  rx   rR   rø   )r:  rx   rÀ  rx   rR   rø   )r:  rx   rÀ  rx   rR   r@  )r:  rx   rÀ  rx   r  rx   rR   r@  )r]   r]   NFr:   )r«   rx   rV  rx   r   rW  rí  r@  rX  rx   rR   r–   )r:  rx   r6  rx   rR   r@  )rä  r]   )r:  rx   rc  r~   rd  rx   rR   re  )r�  r   rR   rn  )r2   r]   )rq  rx   rr  rx   rR   r@  )rJ  rx   rZ   rx   r·  rx   rR   rK   )r�  r   r  rx   rR   r–   )r:  rx   rR   r|  )r:  rx   rR   r–   )r:  rx   r‹  r9  rR   rø   )r:  rx   r’  r@  rR   r9  )r:  rx   rð  rx   rR   rø   )r¶  )rZ   rx   r·  rx   rR   rS   )r…  rS   rr  r–   r�   r»  rR   rø   )rZ   rx   rR   r±  ©rZ   rx   rR   r@  ©rZ   rx   rR   rx   )rZ   rx   rR   rÄ  )rÄ   rx   r¹  r–   r«  rW  rR   r@  ©rÄ   rx   rR   rx   )r:  rx   r6  rx   rR   rx   )r^  rx   rR   rx   ©rô  rx   rR   rx   )or    r!   r"   r3  Úsupports_code_blocksÚsplits_long_messagesÚtyped_command_prefixrf  r_  rz  rü   rÂ  r4  r–  r˜  rÒ  rÜ  râ  rð  rë  r  rg  r.  r‡  rŒ  r«  r°  r³  rÀ  rÉ  rÊ  r  r  r  r  r  Ú
_EA_HEADERÚ_EA_CMD_BUDGETr2  rE  rN  rz  rË  r  rS  rN  r}  r‚  r‡  r‰  rŒ  rD  r±  r“  r’  rG  r÷  rñ  rO  r,  r  r  r  r  rE  r  r  r  r  r!  r   r"  r=  r¼  rA  r¨  rK  r  r^  rb  rm  rk  Ú	frozensetru  rv  ry  r{  r�  r…  r‰  r‹  rŽ  r‘  rŠ  r‹  rM  rú  r}  r~  r¨  r©  r«  r³  r£  r¥  r¦  rÑ  r¬  rð  rê  r5  r6  s   @r)   r<  r<  p  s�
  ø€ € € € € Ø6Ð6àÐØÐð
 Ðð
 4ÐØ1°CÑ7Ððð ð ð ð ð ðBð ð ð ð ð5ð 5ð 5ñ „\ð5ð$ ð0ð 0ð 0ñ „\ð0ð0 ðð ð ñ „\ððð ð ð ð<ð ð ð ð>@ð @ð @ð @ðD5ð 5ð 5ð 5ðnNð Nð Nð Nðh 5:ð oð oð oð oð oð oðb),ð ),ð ),ð ),ð^ #'Ø-1ð>Bð >Bð >Bð >Bð >Bð@Bð Bð Bð Bð/
ð /
ð /
ð /
ðl BFðð ð ð ð ðð ð ð ð PUð=ð =ð =ð =ð =ð =ðH "&Ø"&Ø-1ð'
ð '
ð '
ð '
ð '
ð '
ð '
ðRl6ð l6ð l6ð l6ðd "&Ø"&Ø-1ð
ð 
ð 
ð 
ð 
ð" .2Ø ð"cð "cð "cð "cð "cðP "&Ø#'Ø"&Ø-1ð
ð 
ð 
ð 
ð 
ð$ "&Ø"&Ø-1ð0ð 0ð 0ð 0ð 0ðl "&Ø"&Ø-1ð
ð 
ð 
ð 
ð 
ð  D€JØ€Nð /Ø#'Ø $Ø"Ø"ðFñ Fð Fð Fð Fð` .2ðOñ Oð Oð Oð Oðp .2ð:ñ :ð :ð :ð :ñxð ð ð ð" "&Ø"&Ø-1ØØ37ñZ=ñ Z=ð Z=ð Z=ð Z=ðB "&Ø"&Ø#'Ø-1Øñ6
ñ 6
ð 6
ð 6
ð 6
ðxK'ð K'ð K'ð K'ñbð ð ð ñ,-ð -ð -ð -ð& ñ")ð ")ð ")ñ „\ð")ñH\ð \ð \ð \ñOð Oð Oð Oñð ð ð ñ&Kð Kð Kð KñZtGð tGð tGð tGñlR1ð R1ð R1ð R1ñhb-ð b-ð b-ð b-ñH(
ð (
ð (
ð (
ñTð ð ð ðF  ØðOð Oñ Oð Oð Oð Oñ<
5ð 
5ð 
5ð 
5ñ ð ð ð ðF ñ	Mñ Mð Mð Mð Mð ñ	Gñ Gð Gð Gð Gñ:	Oð 	Oð 	Oð 	Oñ
ð 
ð 
ð 
ñ8Nð Nð Nð Nñ`Oð Oð Oð Oñ(ð (ð (ð (ñT	Vð 	Vð 	Vð 	Vñ
ð 
ð 
ð 
ñ 
ð 
ð 
ð 
ñ\ð \ð \ð \ñbð bð bð bñ"
ð 
ð 
ð 
ñ
ð 
ð 
ð 
ñ2>ð >ð >ð >ñ8	'ð 	'ð 	'ð 	'ñð ð ð ðD ñ	ñ ð ð ð ð6 ØØ!%ØØ$ñ&ñ &ð &ð &ð &ñP
ð 
ð 
ð 
ð Øñ	#ñ #ð #ð #ð #ñJ
ð 
ð 
ð 
ð0 '˜YÐ'KÑLÔLÐññ ð ð ð ñ6=ð =ð =ð =ð4 ñð ð ñ „\ðñ(ð ð ð ñ2Bð Bð Bð BñBð Bð Bð BñBð Bð Bð Bð ñð ð ñ „\ðñBð Bð Bð Bð" $ð	;ð ;ñ ;ð ;ð ;ð ;ñzNð Nð Nð Nð.ð .ð .ð .ñ8'9ð '9ð '9ð '9ñZñ ð ð ð ð, #'Ø-1ð5ð 5ñ 5ð 5ð 5ð 5ñ2
ð 
ð 
ð 
ñIð Ið Ið Iñ
ð ð ð ñ"'ð 'ð 'ð 'ð< )-Ø+/ð	ñ ð ð ð ñBð ð ð ñ<ð ð ð ñ"Nð Nð Nð NñLð Lð Lð LðD ñ/ð /ð /ñ „\ð/ð ñMð Mð Mñ „\ðMð Mð Mð Mð Mr(   r<  F)rŸ  Úmedia_filesÚforce_documentc             ƒ  ó<  ‡‡‡‡‡K  — t          | di ¦  «        pi }t          | dd¦  «        }	 ddl}n# t          $ r ddicY S w xY w	 |                     d¦  «        pt	          j        dd	¦  «                             d
¦  «        }	|pt          dd	¦  «        pd	}|	r|sddiS dt          t          j	        ¦   «         dz  ¦  «        › dt	          j
        d¦  «                             ¦   «         › �}
ddlm}  |‰d	¬¦  «        }|	› d|› d|
› �Šd|› �ddœŠd|dœŠ	 ddl}|                     |ddg¬¦  «        }t          j        dd|¦  «        }d‰d <   |‰d!<   n# t          $ r Y nw xY w|                     ¦   «         4 ƒd{V —†Šˆˆˆˆˆfd"„}	 t%          j         |¦   «         d#¬$¦  «        ƒ d{V —†	 cddd¦  «        ƒd{V —† S # t$          j        $ r dd%icY cddd¦  «        ƒd{V —† S w xY w# 1 ƒd{V —†swxY w Y   dS # t*          $ r}dd&|› �icY d}~S d}~ww xY w)'ac  Out-of-process Matrix delivery via the Client-Server API.

    Implements the standalone_sender_fn contract so deliver=matrix cron jobs
    succeed when cron runs separately from the gateway. Converts markdown to
    HTML for rich rendering, falling back to plain text when the markdown
    library is absent. Replaces the legacy _send_matrix helper.
    r^  r  Nr   rW   z/aiohttp not installed. Run: pip install aiohttpr  r	  r]   r±   r  zGMatrix not configured (MATRIX_HOMESERVER, MATRIX_ACCESS_TOKEN required)Úhermes_r^   r®   é   r  )r  z/_matrix/client/v3/rooms/z/send/m.room.message/zBearer zapplication/json)ÚAuthorizationzContent-Typer¶  r§  rÞ  r   rá  z<h[1-6]>(.*?)</h[1-6]>r  rº  r»  r¹  c               “  ó€  •K  — ‰                      ‰‰‰¬¦  «        4 ƒd {V —†} | j        dvr;|                      ¦   «         ƒ d {V —†}dd| j        › d|› �icd d d ¦  «        ƒd {V —† S |                      ¦   «         ƒ d {V —†}dd‰|                     d¦  «        d	œcd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S )
N)rÑ  Újson>   éÈ   éÉ   rW   zMatrix API error (z): Tr  rÀ  )rt  r¤  rJ  rK  )Úputrô  rZ   r  rc  )r×  rÄ   r#  rJ  rÑ  Úpayloadrg  rô  s      €€€€€r)   Ú_do_sendz"_standalone_send.<locals>._do_send`  sÚ  øè è € Ø"Ÿ;š; s°GÀ'˜;ÑJÔJð {ð {ð {ð {ð {ð {ð {ÈdØ”{¨*Ð4Ð4Ø%)§Y¢Y¡[¤[Ð0Ð0Ð0Ð0Ð0Ð0˜Ø 'Ð)T¸d¼kÐ)TÐ)TÈdÐ)TÐ)TÐUð{ð {ð {ð {ñ {ô {ð {ð {ð {ð {ð {ð {ð {ð {ð "&§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DØ'+¸ÈgÐei×emÒemÐnxÑeyÔeyÐzÐzð{ð {ð {ð {ñ {ô {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {ð {øøøð {ð {ð {ð {ð {ð {s   ¢2B-Á'3B-Â-
B7Â:B7rP   rw  zMatrix API timeout (30s)zMatrix send failed: )rb  r   r¤  rc  r£   rd  r{  r   r~   rH  ÚurandomÚhexr	  r  rä  r  r  r¡  rQ  r  rû  r   )ÚpconfigrJ  ri  rŸ  r  r  r^  r  r   r  Útxn_idr  Úencoded_roomrë  rï  r"  rê  rÑ  r!  rg  rô  s    `               @@@@r)   Ú_standalone_sendr(  .  sñ  øøøøøè è € õ  �G˜W bÑ)Ô)Ð/¨R€EÝ�G˜W dÑ+Ô+€EðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð(5Ø—i’i Ñ-Ô-ÐSµ´Ð;NÐPRÑ1SÔ1S×[Ò[Ð\_Ñ`Ô`ˆ
ð ÐD�Ð$9¸2Ñ>Ô>ÐDÀ"ˆØð 	h ð 	hØÐfÐgÐgØJ�3�tœy™{œ{¨TÑ1Ñ2Ô2ÐJÐJµR´ZÀ±]´]×5FÒ5FÑ5HÔ5HÐJÐJˆØ&Ð&Ð&Ð&Ð&Ð&Ø�u˜W¨2Ð.Ñ.Ô.ˆØÐaÐa°lÐaÐaÐY_ÐaÐaˆØ$5¨eÐ$5Ð$5ÐGYÐZÐZˆà&°Ð8Ð8ˆð	Ø"Ð"Ð"Ð"Ø—<’< °]ÀHÐ4M�<ÑNÔNˆDÝ”6Ð3Ð5KÈTÑRÔRˆDØ 8ˆG�HÑØ(,ˆGÐ$Ñ%Ð%øÝð 	ð 	ð 	ØˆDð	øøøð ×(Ò(Ñ*Ô*ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=¨gð{ð {ð {ð {ð {ð {ð {ð {ð {ð=Ý$Ô-¨h¨h©j¬jÀ"ÐEÑEÔEÐEÐEÐEÐEÐEÐEÐEð	=ð 	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øõ Ô'ð =ð =ð =ØÐ!;Ð<Ð<Ð<ð	=ð 	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð=øøøð	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øõ ð 5ð 5ð 5ØÐ3°Ð3Ð3Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøs¡   ­2 ²AÁAÁAH  Â A7H  Ä=E ÅH  Å
E#Å H  Å"E#Å#H  Æ 
G-Æ#GÆ/H  ÇG*ÇG-ÇH  Ç)G*Ç*G-Ç-
G7Ç7H  Ç:G7Ç;H  È 
HÈ
HÈHÈHc                 óx  — ddl } ddl}ddlm}m}m} ddlm}m}m	}m
}m}	m}
  |d¦  «          |d¦  «        p
 |d¦  «        }|r |d¦  «          |d	d
¦  «        sdS  |d¦  «          |d¦  «          |d¦  «          |d¦  «        }|r |d|                     d¦  «        ¦  «          |d¦  «          |dd¬¦  «        }|r1 |d|¦  «          |d¦  «        }|r |d|¦  «          |	d¦  «         n? |d¦  «        }|r |d|¦  «          |dd¬¦  «        }|r |d|¦  «          |	d¦  «         |s |d¦  «        �rô |dd
¦  «        }|r |dd¦  «          |	d¦  «         |rdnd }	 dd!lm}m}  |d"¦  «        }|rl |d#|› d$t#          |¦  «        › d%�¦  «         	  |d"d
¬&¦  «          |	|› d'�¦  «         n0# t$          $ r#} |
d(¦  «          |d)|› �¦  «         Y d}~nd}~ww xY wn{# t&          $ rn 	 t)          d ¦  «         nZ# t&          $ rM  |d#|› d*�¦  «         dd+lm}  ||g¦  «        }|j        dk    r |	|› d'�¦  «         n |
d,|› d-�¦  «         Y nw xY wY nw xY w |d.¦  «          |d/¦  «          |d0¦  «        }|r, |d1|                     d2d3¦  «        ¦  «          |	d4¦  «         n |d5¦  «          |d6¦  «          |d7¦  «          |d8¦  «          |d9¦  «          |d:¦  «                             ¦   «         }|r |d;|¦  «         dS  |d;¦  «        r |d<¦  «         dS dS dS )=z–Configure Matrix credentials. Replaces hermes_cli/setup.py::_setup_matrix
    and the static _PLATFORMS["matrix"] dict. CLI helpers are lazy-imported.r   N)Úget_env_valueÚremove_env_valueÚsave_env_value)r  Úprompt_yes_noÚprint_headerÚ
print_infoÚprint_successÚprint_warningÚMatrixr  r  zMatrix: already configuredzReconfigure Matrix?FzMWorks with any Matrix homeserver (Synapse, Conduit, Dendrite, or matrix.org).zC   1. Create a bot user on your homeserver, or use your own accountzE   2. Get an access token from Element, or provide user ID + passwordz0Homeserver URL (e.g. https://matrix.example.org)r	  r±   zCAuth: provide an access token (recommended), or user ID + password.z-Access token (leave empty for password login)T)r  u9   User ID (@bot:server â€” optional, will be auto-detected)r?  zMatrix access token savedzUser ID (@bot:server)ÚPasswordzMatrix credentials savedz$Enable end-to-end encryption (E2EE)?rÀ  rµ  zE2EE enabledzmautrix[encryption]Úmautrix)Úensurer  r  zInstalling z (+ z runtime deps)...r  z
 installeduk   Install failed â€” run manually: pip install 'mautrix[encryption]' asyncpg aiosqlite Markdown aiohttp-socksz	  Error: z...)Ú_pip_installu1   Install failed â€” run manually: uv pip install 'z*' asyncpg aiosqlite Markdown aiohttp-socksu,   ðŸ”’ Security: Restrict who can use your botz-   Matrix user IDs look like @username:serverz?Allowed user IDs (comma-separated, leave empty for open access)rr  rJ  r]   zMatrix allowlist configureduE   âš ï¸�  No allowlist set - anyone who can message the bot can use it!uI   ðŸ“¬ Home Room: where Hermes delivers cron job results and notifications.zE   Room IDs look like !abc123:server (shown in Element room settings)zD   You can also set this later by typing /set-home in a Matrix room.zILeave blank to clear a previously saved home room (cron / notifications).z6Home room ID (leave empty to set later with /set-home)ÚMATRIX_HOME_ROOMzHome room cleared.)rt   r„   Úhermes_cli.configr*  r+  r,  Úhermes_cli.cli_outputr  r-  r.  r/  r0  r1  r{  r  r5  r  r‡   r   r¤  Ú
__import__Úhermes_cli.tools_configr6  rz   r³   r}   )rt   Ú_sysr*  r+  r,  r  r-  r.  r/  r0  r1  rþ  r  r  r6  r  Ú	want_e2eeÚ
matrix_pkgÚ_lazy_ensurer  Ú_missing_beforerã  r6  rŽ   Úallowed_usersÚ	home_rooms                             r)   Úinteractive_setuprC  o  sØ  € ð €M€M€MØÐÐÐØQÐQÐQÐQÐQÐQÐQÐQÐQÐQðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð €L�ÑÔÐØˆ}Ð2Ñ3Ô3ÐW°}°}ÐEVÑ7WÔ7W€HØð Øˆ
Ð/Ñ0Ô0Ð0Øˆ}Ð2°EÑ:Ô:ð 	ØˆFà€JÐ^Ñ_Ô_Ð_Ø€JÐTÑUÔUÐUØ€JÐVÑWÔWÐWØ�ÐJÑKÔK€JØð DØˆÐ*¨J×,=Ò,=¸cÑ,BÔ,BÑCÔCÐCà€JÐTÑUÔUÐUØˆFÐBÈTÐRÑRÔR€EØð 6ØˆÐ,¨eÑ4Ô4Ð4Ø�&ÐTÑUÔUˆØð 	6ØˆNÐ+¨WÑ5Ô5Ð5ØˆÐ1Ñ2Ô2Ð2Ð2à�&Ð0Ñ1Ô1ˆØð 	6ØˆNÐ+¨WÑ5Ô5Ð5Ø�6˜*¨tÐ4Ñ4Ô4ˆØð 	6ØˆNÐ,¨hÑ7Ô7Ð7ØˆMÐ4Ñ5Ô5Ð5àð 71��Ð/Ñ0Ô0ñ 71Ø!�MÐ"HÈ%ÑPÔPˆ	Øð 	*ØˆNÐ.°Ñ7Ô7Ð7ØˆM˜.Ñ)Ô)Ð)à.7ÐFÐ*Ð*¸Yˆ
ð	ØOÐOÐOÐOÐOÐOÐOÐOØ-˜oÐ.?Ñ@Ô@ˆOØð 
2Ø�
Ð`¨Ð`Ð`½¸_Ñ9MÔ9MÐ`Ð`Ð`ÑaÔaÐað2Ø �LÐ!2¸5ÐAÑAÔAÐAØ!�M ZÐ";Ð";Ð";Ñ<Ô<Ð<Ð<øÝ ð 2ð 2ð 2Ø!�MðYñô ð ð �JÐ0¨3Ð0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøøøõ ð 	ð 	ð 	ðÝ˜9Ñ%Ô%Ð%Ð%øÝð ð ð Ø�
Ð8¨Ð8Ð8Ð8Ñ9Ô9Ð9Ø@Ð@Ð@Ð@Ð@Ð@à%˜ z lÑ3Ô3�ØÔ$¨Ò)Ð)Ø!�M ZÐ";Ð";Ð";Ñ<Ô<Ð<Ð<à!�MðSØ&ðSð Sð Sñô ð øøðøøøøøð	øøøð  	ˆ
ÐAÑBÔBÐBØˆ
ÐBÑCÔCÐCØ˜Ð`ÑaÔaˆØð 	`ØˆNÐ1°=×3HÒ3HÈÈbÑ3QÔ3QÑRÔRÐRØˆMÐ7Ñ8Ô8Ð8Ð8àˆJÐ^Ñ_Ô_Ð_àˆ
Ð^Ñ_Ô_Ð_Øˆ
ÐZÑ[Ô[Ð[Øˆ
ÐYÑZÔZÐZØˆ
Ð^Ñ_Ô_Ð_Ø�FÐSÑTÔT×ZÒZÑ\Ô\ˆ	Øð 	1ØˆNÐ-¨yÑ9Ô9Ð9Ð9Ð9àÐÐ 2Ñ3Ô3ð 1Ø�
Ð/Ñ0Ô0Ð0Ð0Ð0ðo71ð 71ðl1ð 1sa   Å04G2 Æ%G Ç G2 Ç
G.ÇG)Ç$G2 Ç)G.Ç.G2 Ç2
I*Ç=HÈI*ÈAI$É!I*É#I$É$I*É)I*Úyaml_cfgrY  Ú
matrix_cfgúdict | Nonec                óJ  — d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t           j        d<   |                     d¦  «        }|�dt          j        d¦  «        sPt          |t          ¦  «        rd                     d„ |D ¦   «         ¦  «        }t          |¦  «        t           j        d<   |                     d¦  «        }|�dt          j        d	¦  «        sPt          |t          ¦  «        rd                     d
„ |D ¦   «         ¦  «        }t          |¦  «        t           j        d	<   |                     d¦  «        }|�dt          j        d¦  «        sPt          |t          ¦  «        rd                     d„ |D ¦   «         ¦  «        }t          |¦  «        t           j        d<   |                     d¦  «        }|�dt          j        d¦  «        sPt          |t          ¦  «        rd                     d„ |D ¦   «         ¦  «        }t          |¦  «        t           j        d<   d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t           j        d<   d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t           j        d<   d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t           j        d<   d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t           j        d<   d|v r6t          j        d¦  «        s"t          |d         ¦  «        t           j        d<   dS )u)  Translate config.yaml matrix: keys into MATRIX_* env vars.

    Implements the apply_yaml_config_fn contract (#24849). Mirrors the legacy
    matrix_cfg block from gateway/config.py::load_gateway_config(). Env vars
    take precedence over YAML. Returns None â€” everything flows through env.
    rÄ  rÅ  rA  Nrr  rO  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rn   ©rx   ©rp   Úvs     r)   rr   z%_apply_yaml_config.<locals>.<genexpr>ã  ó(   è è € Ð-Ð- Q�#˜a™&œ&Ð-Ð-Ð-Ð-Ð-Ð-r(   rG  rH  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rn   rI  rJ  s     r)   rr   z%_apply_yaml_config.<locals>.<genexpr>è  s(   è è € Ð/Ð/ a�3˜q™6œ6Ð/Ð/Ð/Ð/Ð/Ð/r(   rP  rQ  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rn   rI  rJ  s     r)   rr   z%_apply_yaml_config.<locals>.<genexpr>í  rL  r(   Úignore_user_patternsrv  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rn   rI  rJ  s     r)   rr   z%_apply_yaml_config.<locals>.<genexpr>ò  s(   è è € Ð&GÐ&G°!¥s¨1¡v¤vÐ&GÐ&GÐ&GÐ&GÐ&GÐ&Gr(   r¡  r]  Úsession_scoperY  Úauto_threadrV  Údm_mention_threadsrX  r_  r`  )	r£   rd  rx   r²   Úenvironrc  r0  r7  rÌ   )rD  rE  ÚauÚfrcÚarÚignore_patternss         r)   Ú_apply_yaml_configrY  ×  s6  € ð ˜JÐ&Ð&­r¬yÐ9QÑ/RÔ/RÐ&Ý/2°:Ð>OÔ3PÑ/QÔ/Q×/WÒ/WÑ/YÔ/Y�Œ
Ð+Ñ,Ø	�Š˜Ñ	(Ô	(€BØ	€~�bœiÐ(>Ñ?Ô?€~Ý�b�$ÑÔð 	.Ø—’Ð-Ð-¨"Ð-Ñ-Ô-Ñ-Ô-ˆBÝ-0°©W¬W�Œ
Ð)Ñ*Ø
�.Š.Ð.Ñ
/Ô
/€CØ
€�rœyÐ)EÑFÔF€Ý�c�4Ñ Ô ð 	0Ø—(’(Ð/Ð/¨3Ð/Ñ/Ô/Ñ/Ô/ˆCÝ36°s±8´8�Œ
Ð/Ñ0Ø	�Š˜Ñ	(Ô	(€BØ	€~�bœiÐ(>Ñ?Ô?€~Ý�b�$ÑÔð 	.Ø—’Ð-Ð-¨"Ð-Ñ-Ô-Ñ-Ô-ˆBÝ-0°©W¬W�Œ
Ð)Ñ*Ø —n’nÐ%;Ñ<Ô<€OØÐ"­2¬9Ð5RÑ+SÔ+SÐ"Ý�o¥tÑ,Ô,ð 	HØ!ŸhšhÐ&GÐ&G°Ð&GÑ&GÔ&GÑGÔGˆOÝ47¸Ñ4HÔ4H�Œ
Ð0Ñ1Ø˜JÐ&Ð&­r¬yÐ9QÑ/RÔ/RÐ&Ý/2°:Ð>OÔ3PÑ/QÔ/Q×/WÒ/WÑ/YÔ/Y�Œ
Ð+Ñ,Ø˜*Ð$Ð$­R¬YÐ7MÑ-NÔ-NÐ$Ý-0°¸OÔ1LÑ-MÔ-M×-SÒ-SÑ-UÔ-U�Œ
Ð)Ñ*Ø˜
Ð"Ð"­2¬9Ð5IÑ+JÔ+JÐ"Ý+.¨z¸-Ô/HÑ+IÔ+I×+OÒ+OÑ+QÔ+Q�Œ
Ð'Ñ(Ø˜zÐ)Ð)µ"´)Ð<WÑ2XÔ2XÐ)Ý25°jÐAUÔ6VÑ2WÔ2W×2]Ò2]Ñ2_Ô2_�Œ
Ð.Ñ/Ø˜zÐ)Ð)µ"´)Ð<WÑ2XÔ2XÐ)Ý25°jÐAUÔ6VÑ2WÔ2W�Œ
Ð.Ñ/Øˆ4r(   c                ó¤  — t          | di ¦  «        pi }ddlm} |                     d¦  «        p|                     d¦  «        pd}t          | dd¦  «        p+|                     d¦  «        p|                     d	¦  «        pd}t          t          |¦  «                             ¦   «         o t          |¦  «                             ¦   «         ¦  «        S )
aì  Matrix is connected when a homeserver + access token (or password) are
    configured. Read via hermes_cli.gateway.get_env_value so setup-status
    callers that patch get_env_value observe the same value, and PlatformConfig
    extras (homeserver) are honored too. As a built-in, Matrix used the generic
    token check; as a plugin it needs an explicit is_connected so
    _platform_status / get_connected_platforms reflect real configuration
    rather than mere SDK presence. #41112.
    r^  r   Nr  r	  r]   r  r  r  )rb  Úhermes_cli.gatewayÚgatewayrc  r*  r@  rx   r}   )rj  r^  Úgateway_modr  r  s        r)   Ú_is_connectedr^    sÜ   € õ �F˜G RÑ(Ô(Ð.¨B€EØ,Ð,Ð,Ð,Ð,Ð,Ø—’˜<Ñ(Ô(Ð`¨K×,EÒ,EÐFYÑ,ZÔ,ZÐ`Ð^`€Jå�˜ Ñ&Ô&ð 	Ø×$Ò$Ð%:Ñ;Ô;ð	à×$Ò$Ð%6Ñ7Ô7ð	ð ð	 
õ •�J‘”×%Ò%Ñ'Ô'Ð>­C°©J¬J×,<Ò,<Ñ,>Ô,>Ñ?Ô?Ð?r(   c                ó    — t          | ¦  «        S )zDFactory wrapper that constructs MatrixAdapter from a PlatformConfig.)r<  )rj  s    r)   Ú_build_adapterr`    s   € å˜Ñ Ô Ð r(   c                ó¦   — |                       ddt          t          t          t          ddgdt
          t          dddt          t          d	d
¬¦  «         dS )u:   Plugin entry point â€” called by the Hermes plugin system.r  r2  r	  r  z!pip install 'mautrix[encryption]'rr  ÚMATRIX_ALLOW_ALL_USERSr7  u   ðŸ”�T)r«   rH  Úadapter_factoryÚcheck_fnÚensure_deps_fnÚis_connectedÚrequired_envÚinstall_hintÚsetup_fnÚapply_yaml_config_fnÚallowed_users_envÚallow_all_envÚcron_deliver_env_varÚstandalone_sender_fnr_  r0  Úallow_update_commandN)	Úregister_platformr`  r  r
  r^  rC  rY  r(  rf  )r¾  s    r)   Úregisterrq    sb   € à×ÒØØÝ&Ý$Ý)Ý"Ø)Ð+@ÐAØ8Ý"Ý/Ø0Ø.Ø/Ý-Ý5ØØ!ð# ñ ô ð ð ð r(   )rQ   r   rR   rS   )rQ   rx   rR   r–   )r«   rx   rR   r¬   r  )rÄ   rx   rR   rÅ   r  )rR   r~   )rR   r„  r  )r�  r   rR   r{   )r˜  r¬   r  )rq   r   rR   rx   rn   )r^  r»  rR   rx   )rÉ  rx   rR   rÊ  )rR   rß  )rå  rx   rÉ  rx   rR   rø   r2  )rï  rx   rR   rx   r  )r«   rx   rR   rx   r1  )rD  rY  rE  rY  rR   rF  )„r3  Ú
__future__r   rQ  r‚   rv  Úloggingr‹  r£   r  rt   rv   r„   rH  r	  r   r   r   Údataclassesr   r   rï  r	   r  Úhtml.parserr
   Úpathlibr   Útypingr   r   r   r   Úagent.secret_scoper   r   r  r   r   r   r   r   r   r   r   r   r   r¤  rx   r   r+   r1   r9   rA   Úgateway.configrE   rF   rØ  rG   rH   rI   rJ   rK   rL   rM   rN   Úgateway.platforms.helpersrO   Ú	getLoggerr    r€   r‰   r•   rª   r¶  r  r¿   rº   rÃ   rË   rÓ   rÙ   rÛ   r9  rH  rR  r[  rf  ri  rm  ry  Úhermes_constantsrn  Ú_get_hermes_dirr2  r  r‘  r´  r  r  r�  r<  rK  r…  rF  r‡  r�  r—  r¦  r±  rº  rÄ  rÈ  rÞ  rä  ré  rí  ró  rú  rý  rÿ  r  r  r
  r  r<  r(  rC  rY  r^  r`  rq  r'   r(   r)   ú<module>r~     sû  ðð1ð 1ð 1ðf #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à >Ð >Ð >Ð >Ð >Ð >Ð >Ð >ð4!ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð øð ð '!ð '!ð '!ð
 :=Ð<€JÐ<�Ð<˜6Ð< I°ð"ð "ð "ð "ð "ñ "ô "ð "ð €Iðð ð ð ð ñ ô ð ð 3Ðð$ð $ð $ð $ð $ñ $ô $ð $ð
 '€Mð1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð
 -Ððð ð ð ð ñ ô ð ð !€J€J€JðO'!øøøðR 4Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð AÐ @Ð @Ð @Ð @Ð @à	ˆÔ	˜8Ñ	$Ô	$€à Ð ðLð Lð Lð Lð\2ð 2ð 2ð 2ðj %˜"œ*Ø.Ø„Iñô Ð ð0ð 0ð 0ð 0ðf
0ð 
0ð 
0ð 
0ð. ", ¤Ð,FÑ!GÔ!GÐ ð"ð "ð "ð "ð<5ð 5ð 5ð 5ð.L$ð L$ð L$ð L$ð L$˜:ñ L$ô L$ð L$ð^ €�$ÐÑÔðð ð ð ð ñ ô ñ Ôðð  ð6ð 6ð 6ð 6ð 6ñ 6ô 6ñ „ð6ð* ðFð Fð Fð Fð Fñ Fô Fñ „ðFð ðFð Fð Fð Fð Fñ Fô Fñ „ðFð" #Ð Ø$)Ð !ðCð Cð Cð Cð2 0Ð ð ?Ð >Ð >Ð >Ð >Ð >àˆ_Ð5°~ÑFÔF€
Ø˜{Ñ*€ð Ð à!�r”zØ=ñô Ð ð
"ð ð
 (˜ið )ð )ð )ñ ô Ð ð"Ð ð  #Að Dñ #Ð ð ØØØØØØØØØØØ'Øð(ð (Ð ð ð ð ñ ð"&ð &ð &ð &ð
1ð 1ð 1ð 1ð2ð ð ð ð(2ð 2ð 2ð 2ðBð ð ð ð.ð ð ð ð
3ð 
3ð 
3ð 
3ð 
3ðð ð ð ðð ð ð ð4ð ð ð ð%
ð %
ð %
ð %
ðP<ð <ð <ð <ð$(ð (ð (ð (ðð ð ð ðð ð ð ð(+ð +ð +ð +ðð ð ð ð ð  ð  ð  ð0Eð Eð Eð EðPA(ð A(ð A(ð A(ð A(ñ A(ô A(ð A(ðHm>ð m>ð m>ð m>ð m>Ð'ñ m>ô m>ð m>ðF~ ØØð>5ð >5ð >5ð >5ð >5ðBe1ð e1ð e1ð e1ðP'ð 'ð 'ð 'ðT@ð @ð @ð @ð*!ð !ð !ð
ð ð ð ð ð s   Á/B ÂAC%Ã$C%