+
    kHàjg:  ã                  óž  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
 ^ RIt^ RIHt ]P                  ! ]4      tRtR R lt^t^
t^tR R	 ltR
tRRRR]RR/R/ /RRRR]RR/RRR//.tR]R&   RR.tR]R&   ]! 4       tR-R R llt ! R R]P<                  4      tR R  lt R! R" lt!R# R$ lt"R% R& lt#R' R( lt$R) R* lt%R+ R, lt&R# ).z¨Telegram network helpers: a hostname-preserving fallback transport (Host + SNI stay
api.telegram.org while TCP retries known IPv4 literals) plus DoH-based IP discovery.)ÚannotationsN)ÚIterableÚOptional)Úplatform_ssl_contextúapi.telegram.orgc               ó    € V ^8„  d   QhRRRR/# )é   ÚerrorÚ	ExceptionÚreturnÚstr© )Úformats   "ÚP/home/ubuntu/.hermes/hermes-agent/plugins/platforms/telegram/telegram_network.pyÚ__annotate__r      s   € ÷ $ñ $ Yð $°3ñ $ó    c                ó‚   €  ^ RI Hp V! \        V 4      RR7      #   \         d    \	        T 4      P
                  u # i ; i)zIReturn a non-empty, secret-safe exception representation for diagnostics.)Úredact_sensitive_textT)Úforce)Úagent.redactr   Úreprr
   ÚtypeÚ__name__)r	   r   s   & r   Ú_describe_transport_errorr      s:   € ð$Ý6á$¤T¨%£[¸Ô=Ð=øÜô $Ü�E‹{×#Ñ#Ò#ð$ús   ‚ › >½>c               ó   € V ^8„  d   QhRR/# )r   r   zlist[tuple[int, int, int]]r   )r   s   "r   r   r   '   s   € ÷ 	ñ 	Ð&@ñ 	r   c                 óh  € \         P                  \         P                  ^3.p \        \         RR4      ;'       g    \        \         RR4      pV\        3\        \         RR4      \
        3\        \         RR4      \        33 F,  w  r#Vf   K  V P                  \         P                  W#34       K.  	  V # )z’``setsockopt`` tuples for httpx ``socket_options``: always SO_KEEPALIVE, plus idle/interval/count
when the interpreter exposes those option names.ÚTCP_KEEPIDLENÚTCP_KEEPALIVEÚTCP_KEEPINTVLÚTCP_KEEPCNT)	ÚsocketÚ
SOL_SOCKETÚSO_KEEPALIVEÚgetattrÚ_TCP_KEEPALIVE_IDLE_SÚ_TCP_KEEPALIVE_INTERVAL_SÚ_TCP_KEEPALIVE_COUNTÚappendÚIPPROTO_TCP)ÚoptionsÚidleÚoptÚvalues       r   Útcp_keepalive_socket_optionsr-   '   s    € ô -3×,=Ñ,=¼v×?RÑ?RÐTUÐ+VÐ*W€GÜ”6˜>¨4Ó0×ZÐZ´G¼FÀOÐUYÓ4Z€DØÔ3Ð4´w¼vÀÐX\Ó7]Ô_xÐ6yÜ¤¨°tÓ<Ô>RÐSóU‰
ˆàŒ?Ø�N‰NœF×.Ñ.°Ð;Ö<ñUð €Nr   g      @Úurlzhttps://dns.google/resolveÚparamsÚnamer   ÚAÚheadersz$https://cloudflare-dns.com/dns-queryÚAcceptzapplication/dns-jsonz
list[dict]Ú_DOH_PROVIDERSz149.154.166.110z149.154.167.220ú	list[str]ÚSEED_FALLBACK_IPSc               ó   € V ^8„  d   QhRR/# )r   r   ú
str | Noner   )r   s   "r   r   r   A   s   € ÷ Jñ J¨Zñ Jr   c                ó"   € ^ RI Hp V! RV R7      # )é    )Úresolve_proxy_urlÚTELEGRAM_PROXY©Útarget_hosts)Úgateway.platforms.baser;   )r>   r;   s   & r   Ú_resolve_proxy_urlr@   A   s   € Ý8ÙÐ-¸LÔIÐIr   c                  ó–   € ] tR t^FtRt]P                  ! ^^R7      tR R ltR R lt	R R lt
R	 R
 ltR R ltR R ltR R ltRtR# )ÚTelegramFallbackTransportzºReach the Bot API via known IPv4 literals first, dual-stack hostname last. Host + SNI stay on
api.telegram.org (like ``curl --resolve``) so a blackholed IPv6 AAAA can't pin initialize().)Úmax_connectionsÚmax_keepalive_connectionsc               ó   € V ^8„  d   QhRR/# )r   Úfallback_ipsúIterable[str]r   )r   s   "r   r   Ú&TelegramFallbackTransport.__annotate__N   s   € ÷ :ñ : ]ñ :r   c                	óH  € \        \        P                  \        V4      4      4      V n        \        \        .V P                  OR 7      pV'       d   RV9  d   W2R&   VP                  RV P                  4       VP                  R\        4       4       W n
        \        P                  ! R/ VB V n        \        P                  ! 4       V n        RV n        / V n        \        P                  ! 4       V n        \(        V n        \        P                  ! 4       V n        RV n        R# )r=   ÚproxyÚlimitsÚsocket_optionsFNr   )ÚlistÚdictÚfromkeysÚ_normalize_fallback_ipsÚ_fallback_ipsr@   Ú_TELEGRAM_API_HOSTÚ
setdefaultÚ_POOL_LIMITSr-   Ú_transport_kwargsÚhttpxÚAsyncHTTPTransportÚ_primaryÚasyncioÚLockÚ_primary_lockÚ_primary_closedÚ
_fallbacksÚ_fallback_lockÚ_UNSETÚ
_sticky_ipÚ_sticky_lockÚ_last_failure)ÚselfrF   Útransport_kwargsÚ	proxy_urls   &&, r   Ú__init__Ú"TelegramFallbackTransport.__init__N   sÙ   € Ü!¤$§-¡-Ô0GÈÓ0UÓ"VÓWˆÔÜ&Ô5GÐ4]È$×J\ÑJ\Ð4]Ô^ˆ	ß˜Ð(8Ô8Ø(1˜WÑ%Ø×#Ñ# H¨d×.?Ñ.?Ô@Ø×#Ñ#Ð$4Ô6RÓ6TÔUØ!1ÔÜ×0Ò0ÑDÐ3CÑDˆŒÜ$Ÿ\š\›^ˆÔØ$ˆÔà?AˆŒÜ%Ÿlšl›nˆÔä"(ˆŒÜ#ŸLšL›NˆÔØ59ˆÖr   c               ó    € V ^8„  d   QhRRRR/# )r   Úipr   r   úhttpx.AsyncHTTPTransportr   )r   s   "r   r   rH   a   s   € ÷ ñ  cð Ð.Fñ r   c              ƒ  	óH  "  € V P                   ;_uu_4       GR j  x€L
  V P                  P                  V4      pVf/   \        P                  ! R/ V P
                  B pW P                  V&   TuuR R R 4      GR j  x€L
  #  Le L  + GR j  x€L 
 '       g   i     R # ; i5i)Nr   )r^   r]   ÚgetrV   rW   rU   )rc   ri   Ú	transports   && r   Ú_get_fallbackÚ'TelegramFallbackTransport._get_fallbacka   sm   é € Ø×&×&×&Ó&ØŸ™×+Ñ+¨BÓ/ˆIØÒ Ü!×4Ò4ÑN°t×7MÑ7MÑN�	Ø&/—‘ Ñ#Ø÷ '×&×&×&×&×&Ð&üsK   ‚B"›BœB"ŸABÁ.B"Á;BÁ<B"ÂB"ÂB	ÂBÂ
B	ÂB	Â	B"c               ó    € V ^8„  d   QhRRRR/# )r   rm   rj   r   ÚNoner   )r   s   "r   r   rH   i   s   € ÷ 	Pñ 	PÐ.Fð 	PÈ4ñ 	Pr   c              ƒ  	óò  "  € V P                   ;_uu_4       GR j  x€L
  V P                  '       g   WP                  Jd    R R R 4      GR j  x€L
  R # \        P                  ! R/ V P
                  B V n        R R R 4      GR j  x€L
   VP                  4       G R j  x€L
  R #  Lˆ LX L#  + GR j  x€L 
 '       g   i     L:; i L(  \         d"   p\        P                  RT4        R p?R # R p?ii ; i5i)Nz.[Telegram] Error closing primary transport: %sr   )
r[   r\   rX   rV   rW   rU   Úacloser
   ÚloggerÚdebug)rc   rm   Úexcs   && r   Ú_reset_primaryÚ(TelegramFallbackTransport._reset_primaryi   s«   é € à×%×%×%Ó%Ø×#×#Ð# y¿¹Ó'EØ÷ &×%Ñ%ô "×4Ò4ÑN°t×7MÑ7MÑNˆDŒM÷ &×%ð	PØ×"Ñ"Ó$×$Ò$÷ &×%×%Ö%úñ
 %øÜô 	PÜ�L‰LÐIÈ3×OÒOûð	Püs¤   ‚C7›B$œC7Ÿ#B*ÁC7ÁB&ÁC7Á%B*Á9C7ÂB(ÂC7Â
C ÂCÂC Â"C7Â&C7Â(C7Â*C	Â0B3Â1
C	Â<C	Â>C7ÃC ÃC4ÃC/Ã)C7Ã/C4Ã4C7c               ó    € V ^8„  d   QhRRRR/# )r   ri   r   r   rq   r   )r   s   "r   r   rH   t   s   € ÷ Xñ X¨ð X°ñ Xr   c              ƒ  ó€  "  € V P                   ;_uu_4       GRj  x€L
  V P                  P                  VR4      pRRR4      GRj  x€L
  Xf   R#  VP                  4       G Rj  x€L
  R#  LQ L'  + GRj  x€L 
 '       g   i     L>; i L&  \         d"   p\
        P                  RY4        Rp?R# Rp?ii ; i5i)a+  Discard a failed fallback pool: a peer-closed connect leaves a CLOSE_WAIT socket in it, and the
poisoned pool would leak one fd per retry.

Retaining the poisoned pool leaks one descriptor per retry until the process hits its file limit and
can no longer accept connections or resolve DNS (#63311).
Nz2[Telegram] Error closing fallback transport %s: %s)r^   r]   Úpoprs   r
   rt   ru   )rc   ri   rm   rv   s   &&  r   Ú_reset_fallbackÚ)TelegramFallbackTransport._reset_fallbackt   sŒ   é € ð ×&×&×&Ó&ØŸ™×+Ñ+¨B°Ó5ˆI÷ '×&àÒÙð	XØ×"Ñ"Ó$×$Ò$÷ '×&×&Ô&úñ
 %øÜô 	XÜ�L‰LÐMÈr×WÒWûð	Xüs…   ‚B>›A-œB>ŸA1¼B>ÁA/Á
B>ÁB Á&BÁ'B Á+B>Á/B>Á1B
	Á7A:Á8
B
	ÂB
	ÂB>ÂB ÂB;ÂB6Â0B>Â6B;Â;B>c               ó   € V ^8„  d   QhRR/# )r   r   zlist[Optional[str]]r   )r   s   "r   r   rH   „   s   € ÷ 	ñ 	Ð 3ñ 	r   c                ó  a€ . oV P                   \        Jd5   SP                  V P                   f   RM\        V P                   4      4       SP	                  V3R lV P
                   4       4       RS9  d   SP                  R4       S# )uµ   Sticky path first, then IPv4 literals, dual-stack hostname last (a blackholed IPv6 path never
errors â€” Happy Eyeballs waits on AAAA until the OS TCP timeout and can pin the loop).Nc              3  ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5i©Nr   )Ú.0ri   Úorders   & €r   Ú	<genexpr>Ú;TelegramFallbackTransport._attempt_order.<locals>.<genexpr>Š   s   øé € ÐHÑ"4˜BÀ%¹—R’RÓ"4ùs   ƒ�
)r`   r_   r'   r   ÚextendrQ   )rc   rƒ   s   &@r   Ú_attempt_orderÚ(TelegramFallbackTransport._attempt_order„   sg   ø€ ð &(ˆØ�?‰?¤&Ó(Ø�L‰L §¡Ò!8™¼cÀ$Ç/Á/Ó>RÔSØ�‰ÔH $×"4Ò"4ÓHÔHØ�uÔØ�L‰L˜ÔØˆr   c               ó    € V ^8„  d   QhRRRR/# )r   Úrequestúhttpx.Requestr   zhttpx.Responser   )r   s   "r   r   rH   �   s   € ÷ 1ñ 1°-ð 1ÀNñ 1r   c           
   ƒ  	óæ  "  € VP                   P                  \        8w  g   V P                  '       g$   V P                  P                  V4      G R j  x€L
 # R pV P                  4        EFP  pVf   TM
\        W4      pVf   V P                  MV P                  V4      G R j  x€L
 p VP                  V4      G R j  x€L
 pV P                  e<   V P                  w  rxR V n	        \        P                  RT;'       g    \        VV4       V P                  \        J g   V P                  V8w  dŠ   V P                  ;_uu_4       GR j  x€L
  V P                  \        J g   V P                  V8w  d8   W0n        Ve.   Ve   \        P                  M\        P                  p	V	! RV4       R R R 4      GR j  x€L
  Vu # 	  Vf   \+        R4      hVh EL} EL0 EL L� L&  + GR j  x€L 
 '       g   i     L=; i  \          Edk   p
T
p\#        T
4      '       g   h T;'       g    \        p\%        T
4      pY¸3T n	        T P                  \        Jd©   Y0P                  8X  d™   T P                  ;_uu_4       GR j  x€L 
  T P                  \        Jd9   T P                  T8X  d(   \        T n        \        P                  RTe   TMR4       R R R 4      GR j  x€L 
  M  + GR j  x€L 
 '       g   i     M; iTf8   T P'                  T4      G R j  x€L 
  \        P                  RT4        R p
?
EKÉ  \        P                  RY84       T P)                  T4      G R j  x€L 
   R p
?
EK   R p
?
ii ; i5i)NzF[Telegram] Telegram API transport recovered via %s after %s failed: %su]   [Telegram] Using sticky IPv4 Telegram API path %s (dual-stack hostname tried last â€” #87015)zW[Telegram] Sticky Telegram path %s failed; re-walking IPv4 literals before the hostnamer   z7[Telegram] Dual-stack api.telegram.org path failed (%s)z-[Telegram] IPv4 Telegram API IP %s failed: %sz=All Telegram fallback IPs exhausted but no error was recorded)r.   ÚhostrR   rQ   rX   Úhandle_async_requestr‡   Ú_rewrite_request_for_iprn   rb   rt   Úinfor`   r_   ra   Úwarningr
   Ú_is_retryable_connect_errorr   rw   r|   ÚRuntimeError)rc   rŠ   Ú
last_errorri   Ú	candidaterm   ÚresponseÚfailed_pathÚfailureÚlogrv   Úpaths   &&          r   rŽ   Ú.TelegramFallbackTransport.handle_async_request�   s¨  é € Ø�;‰;×ÑÔ1Ô1¸×9K×9KÐ9KØŸ™×;Ñ;¸GÓD×DÐDØ'+ˆ
Ø×%Ñ%×'ˆBØ#%¢:™Ô3JÈ7Ó3WˆIØ)+ª˜Ÿš¸t×?QÑ?QÐRTÓ?U×9UˆIð'Ø!*×!?Ñ!?À	Ó!J×J�Ø×%Ñ%Ò1Ø+/×+=Ñ+=Ñ(�KØ)-�DÔ&Ü—K‘KØ`Ø×0Ð0Ô0Ø#Øô	ð —?‘?¤fÓ,°·±À2Ô0EØ#×0×0×0Ó0ØŸ?™?¬fÓ4¸¿¹È2Ô8MØ.0œOØ!š~Ø8BÒ8N¤f§n¢nÔTZ×T_ÑT_ Ù #ð  %Dð  FHô  !I÷  1×0ð  ’ñ+ (ðV ÒÜÐ^Ó_Ð_ØÐò_ Eò :VâJ÷  1×0×0Ô0ûô õ Ø �
Ü2°3×7Ò7ØØ×/Ð/Ô/�Ü3°CÓ8�Ø&* _�Ô"Ø—?‘?¬&Ó0°R¿?¹?Ô5JØ#×0×0×0Ô0ØŸ?™?´&Ó8¸T¿_¹_ÐPRÔ=RÜ.4˜DœOÜ"ŸN™NØ yØ&(¢n¡Ð:LôN÷  1×0×0×0×0Ò0úð ’:Ø×-Ñ-¨iÓ8×8Ñ8Ü—N‘NÐ#\Ð^eÔfÞÜ—‘ÐNÐPRÔ\Ø×*Ñ*¨2Ó.×.Ñ.Þûð)üs)  ‚1M1´M1ÁGÁAM1Â"GÂ#M1Â(G8Â<GÂ=?G8Ã=A
G8ÅG
ÅG8ÅAGÆ(G8Æ3GÆ4G8Æ9M1ÇM1ÇG8ÇG8ÇG8ÇG5Ç"G%Ç#
G5Ç.G5Ç0G8Ç8M.ÈM)È!AM)É7I:É8M)É<AK	Ë	M)ËKËM)ËK4Ë!K$Ë"
K4Ë-K4Ë/ M)ÌLÌM)Ì+M1Ì2*M)ÍMÍM)Í"M1Í)M.Í.M1c               ó   € V ^8„  d   QhRR/# )r   r   rq   r   )r   s   "r   r   rH   Â   s   € ÷ 	%ñ 	%˜dñ 	%r   c              ƒ  	ó\  "  € V P                   ;_uu_4       GR j  x€L
  RV n        V P                  pR R R 4      GR j  x€L
  XP                  4       G R j  x€L
  V P                  ;_uu_4       GR j  x€L
  \        V P                  P                  4       4      pV P                  P                  4        R R R 4      GR j  x€L
  X F  pVP                  4       G R j  x€L
  K  	  R #  LÌ L«  + GR j  x€L 
 '       g   i     LÂ; i L± L– LK  + GR j  x€L 
 '       g   i     Lb; i LL5i)NT)	r[   r\   rX   rs   r^   rM   r]   ÚvaluesÚclear)rc   ÚprimaryÚ
transportsrm   s   &   r   rs   Ú TelegramFallbackTransport.acloseÂ   sÁ   é € Ø×%×%×%Ó%Ø#'ˆDÔ Ø—m‘mˆG÷ &×%ð �n‰nÓ×ÐØ×&×&×&Ó&Ü˜dŸo™o×4Ñ4Ó6Ó7ˆJØ�O‰O×!Ñ!Ô#÷ '×&ó $ˆIØ×"Ñ"Ó$×$Ò$ó $÷ &×%×%Ô%úñ 	ß&×&×&Ô&úñ %ùs­   ‚D,›C(œD,ŸC,³D,¾C*¿D,ÁDÁD,Á3D
Á4D,Á7>DÂ5D,Ã DÃD,ÃD*ÃD,Ã*D,Ã,D	Ã2C5Ã3
D	Ã>D	Ä 	D,Ä
D,ÄD,ÄD'	ÄDÄ
D'	Ä D'	Ä"	D,)
rQ   r^   r]   rb   rX   r\   r[   r`   ra   rU   N)r   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rV   ÚLimitsrT   rf   rn   rw   r|   r‡   rŽ   rs   Ú__static_attributes__r   r   r   rB   rB   F   sE   † ñdð
 —<’<°ÈQÔO€Lõ:õ&õ	PõXõ 	õ1÷f	%ñ 	%r   rB   c               ó    € V ^8„  d   QhRRRR/# )r   rž   rG   r   r5   r   )r   s   "r   r   r   Î   s   € ÷ ñ  Mð °iñ r   c                ó(  € . pV  Fà  p\        V4      P                  4       pV'       g   K&   \        P                  ! V4      pTP                  ^8w  d   \
        P                  RT4       Kf  TP                  '       g7   TP                  '       g%   TP                  '       g   TP                  '       d   \
        P                  RT4       KÆ  TP                  \        T4      4       Kâ  	  V#   \         d    \
        P                  R T4        EK  i ; i)z)Ignoring invalid Telegram fallback IP: %rz*Ignoring non-IPv4 Telegram fallback IP: %sz2Ignoring private/internal Telegram fallback IP: %s)r   ÚstripÚ	ipaddressÚ
ip_addressÚ
ValueErrorrt   r‘   ÚversionÚ
is_privateÚis_loopbackÚis_link_localÚis_unspecifiedr'   )rž   Ú
normalizedr,   ÚrawÚaddrs   &    r   rP   rP   Î   sÒ   € Ø€JÛˆÜ�%‹j×ÑÓ ˆßÙð	Ü×'Ò'¨Ó,ˆDð �<‰<˜1ÔÜ�N‰NÐGÈÖMØ�_�_ˆ_ × 0× 0Ð 0°D×4F×4FÐ4FÈ$×J]×J]ÐJ]Ü�N‰NÐOÐQTÖUà×Ñœc $›iÖ(ñ ð Ðøô ô 	Ü�N‰NÐFÈÔLÛð	ús   ¬C+Ã+!DÄDc               ó    € V ^8„  d   QhRRRR/# )r   r,   r8   r   r5   r   )r   s   "r   r   r   â   s   € ÷ _ñ _ ð _°	ñ _r   c                óX   € V '       d"   \        R  V P                  R4       4       4      # . # )c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5ir�   )r«   )r‚   Úparts   & r   r„   Ú(parse_fallback_ip_env.<locals>.<genexpr>ã   s   é € Ð"MÑ<L°D§:¡:§< <Ó<Lùs   ‚Ú,)rP   Úsplit)r,   s   &r   Úparse_fallback_ip_envr¾   â   s%   € ßQVÔ"Ñ"M¸E¿K¹KÈÔ<LÓ"MÓMÐ^Ð\^Ð^r   c               ó   € V ^8„  d   QhRR/# )r   r   zset[str]r   )r   s   "r   r   r   æ   s   € ÷ ñ ˜Xñ r   c                 óÖ   €  \         P                  ! \        R\         P                  4      p V  Uu0 uF  q^,          ^ ,          kK  	  up# u upi   \         d    \        4       u # i ; i)zJReturn the IPv4 addresses that the OS resolver gives for api.telegram.org.i»  )r    ÚgetaddrinforR   ÚAF_INETr
   Úset)Úresultsr¶   s     r   Ú_resolve_system_dnsrÅ   æ   sV   € ðÜ×$Ò$Ô%7¸¼f¿n¹nÓMˆÙ'.Ó/¡w˜t�Q•˜—
�
¡wÑ/Ð/ùÒ/øÜô Ü‹uŠðús"   ‚.A °AÁA ÁA ÁA(Á'A(c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úclientzhttpx.AsyncClientÚproviderrN   r   r5   r   )r   s   "r   r   r   ï   s"   € ÷ ñ Ð&7ð À4ð ÈIñ r   c              ƒ  ó@  "  €  V P                  VR,          VR,          VR,          R7      G Rj  x€L
 pVP                  4        VP                  4       p. pVP                  R. 4       Fc  pVP                  R4      ^8w  d   K  VP                  RR	4      P                  4       p \        P
                  ! V4       TP                  T4       Ke  	  V#  L¡  \         d     Ky  i ; i  \         d+   p\        P                  R
TR,          T4       . u Rp?# Rp?ii ; i5i)z/Query one DoH provider and return A-record IPs.r.   r/   r2   )r/   r2   NÚAnswerr   ÚdataÚ zDoH query to %s failed: %s)rl   Úraise_for_statusÚjsonr«   r¬   r­   r®   r'   r
   rt   ru   )rÇ   rÈ   ÚresprË   ÚipsÚanswerrµ   rv   s   &&      r   Ú_query_doh_providerrÒ   ï   sú   é € ðØ—Z‘Z ¨¥¸ÀÕ8JÐT\Ð]fÕTg�ZÓh×hˆØ×ÑÔØ�y‰y‹{ˆØˆØ—h‘h˜x¨Ö,ˆFØ�z‰z˜&Ó! QÔ&ÙØ—*‘*˜V RÓ(×.Ñ.Ó0ˆCðÜ×$Ò$ SÔ)ð �J‰J�sŽOñ -ð ˆ
ñ iøô ô Úðûô ô Ü�‰Ð1°8¸Eµ?ÀCÔHØ�	ûðüsi   ‚D„,C& °C±A3C& Â%CÂ;C& ÃDÃC& ÃC#ÃC& Ã"C#Ã#C& Ã&DÃ1DÄDÄDÄDÄDc               ó   € V ^8„  d   QhRR/# )r   r   r5   r   )r   s   "r   r   r     s   € ÷  #ñ  # Yñ  #r   c               ƒ  ó’  "  € \         P                  ! \         P                  ! \        4      \	        4       R7      ;_uu_4       GRj  x€L
 p \
        P                  ! \
        P                  ! \        4      4      p\
        P                  ! \         Uu. uF  p\        W4      NK  	  upRR/ G Rj  x€L
 pRRR4      GRj  x€L
  \        4       p \
        P                  ! X\        R7      G Rj  x€L
 p\        V\        4      '       d   TpX UUu. uF%  p\        T\&        4      '       g   K  T F  qwNK  	  K'  	  ppp\)        \'        \*        P-                  T4      4      4      p	T	'       d(   \         P#                  RRP/                  T	4      4       T	# \         P1                  R	RP/                  T4      ;'       g    R
RP/                  \2        4      4       \'        \2        4      #  EL u upi  EL? EL2  + GRj  x€L 
 '       g   i     ELJ; i EL#  \         d    \         P#                  R\$        4        EL1i ; iu uppi 5i)a   Resolve api.telegram.org via Google + Cloudflare DoH; unique A records, in order. IPs matching the
system resolver are deliberately KEPT (often the most reliable path). Falls back to
``SEED_FALLBACK_IPS`` only when DoH yields nothing usable.

IPs that match the local system resolver are kept rather than excluded: in many networks the system-DNS
IP is the most reliable path to api.telegram.org and a transient primary-path failure should be retried
against the same address via the IP-rewrite path before the seed list is consulted (#14520).
)ÚtimeoutÚverifyNÚreturn_exceptionsT)rÕ   z5System-DNS resolution for %s did not complete in timez,Discovered Telegram fallback IPs via DoH: %sz, zPDoH discovery yielded no usable IPs (system DNS: %s); using seed fallback IPs %sÚunknown)rV   ÚAsyncClientÚTimeoutÚ_DOH_TIMEOUTr   rY   Úensure_futureÚ	to_threadrÅ   Úgatherr4   rÒ   rÃ   Úwait_forÚ
isinstancer
   rt   ru   rR   rM   rP   rN   rO   Újoinr�   r6   )
rÇ   Úsystem_dns_taskÚprÄ   Ú
system_ipsÚsystem_resultÚrri   Údoh_ipsÚ	validateds
             r   Údiscover_fallback_ipsré     sž  é € ô × Ò ¬¯ª´|Ó)DÔMaÓMc×d×dÕdÐhnÜ!×/Ò/´×0AÒ0AÔBUÓ0VÓWˆÜŸšÕQ_Ó(`ÑQ_ÈAÔ)<¸VÖ)GÑQ_Ñ(`ÐyÐtxÑy×yˆ÷ e×dô ›5€JðbÜ%×.Ò.¨ÌÔU×UˆÜ�m¤S×)Ò)Ø&ˆJñ #ÔF™7�a¤j°´D×&9ŒrÃA¸bŠrÁA‰r™7€GÑFÜ'¬¬T¯]©]¸7Ó-CÓ(DÓE€IßÜ�‰ÐCÀTÇYÁYÈyÓEYÔZØÐÜ
‡K�KØZØ�	‰	�*Ó×*Ð* ¨D¯I©IÔ6GÓ,HôJô Ô!Ó"Ð"ò/ eùâ(`Òy÷ e×d×dÔdúò Vøô ô bÜ�‰ÐLÔN`×aðbüãFùs¼   ‚AIÁG'ÁIÁAG5ÂG*Â&
G5Â0G/Â1G5Â5IÃ G2ÃIÃH Ã/HÃ0H ÄIÄIÄ.IÄ<B IÆ=+IÇ*G5Ç2IÇ5H	Ç;G>Ç<
H	ÈH	È		IÈH È%H>È:IÈ=H>È>	Ic               ó$   € V ^8„  d   QhRRRRRR/# )r   rŠ   r‹   ri   r   r   r   )r   s   "r   r   r   (  s&   € ÷ xñ x ]ð x¸ð xÀñ xr   c                óL  € V P                   P                  ;'       g    \        pV P                   P                  VR 7      pV P                  P                  4       pW$R&   \        V P                  4      pW%R&   \        P                  ! V P                  W4V P                  VR7      # ))r�   r�   Úsni_hostname)Úmethodr.   r2   ÚstreamÚ
extensions)r.   r�   rR   Ú	copy_withr2   ÚcopyrN   rï   rV   ÚRequestrí   rî   )rŠ   ri   Úoriginal_hostr.   r2   rï   s   &&    r   r�   r�   (  sƒ   € Ø—K‘K×$Ñ$×:Ð:Ô(:€MØ
�+‰+×
Ñ
 RÐ
Ó
(€CØ�o‰o×"Ñ"Ó$€GØ#ˆF�OÜ�g×(Ñ(Ó)€JØ!.ˆ~ÑÜ�=Š= §¡°CÐQX×Q_ÑQ_ÐlvÔwÐwr   c               ó    € V ^8„  d   QhRRRR/# )r   rv   r
   r   Úboolr   )r   s   "r   r   r   2  s   € ÷ Gñ G Yð G°4ñ Gr   c                óV   € \        V \        P                  \        P                  34      # r�   )rà   rV   ÚConnectTimeoutÚConnectError)rv   s   &r   r’   r’   2  s    € Ü�cœE×0Ñ0´%×2DÑ2DÐEÓFÐFr   r�   )'Ú__conditional_annotations__r¦   Ú
__future__r   rY   r¬   Úloggingr    Útypingr   r   rV   Úagent.ssl_verifyr   Ú	getLoggerr   rt   rR   r   r$   r%   r&   r-   rÛ   r4   Ú__annotations__r6   Úobjectr_   r@   ÚAsyncBaseTransportrB   rP   r¾   rÅ   rÒ   ré   r�   r’   )rù   s   @r   Ú<module>r     s  øðôXõ #ã Û Û Û ß %ã å 1à	×	Ò	˜8Ó	$€à'Ð õ$ð Ð ØÐ ØÐ õ	ð €à
Ð(¨(°VÐ=OÐQWÐY\Ð4]Ð_hÐjlÐmàÐ5°xÀ&ÐJ\Ð^dÐfiÐAjØ�HÐ4Ð5ð7ð€�
ó ð !2Ð3DÐEÐ �9Ó EÙ	‹€÷Jô
E% × 8Ñ 8ô E%õPõ(_õõõ, #õFx÷Gr   