Files
boc/rust-service/target/debug/deps/libtower_http-64f18962b038616b.rmeta
T

1916 lines
380 KiB
Plaintext
Raw Normal View History

rust
Þì#rustc 1.96.0 (ac68faa20 2026-05-25)ÁÀ뉊]!ÜÛê(¹Þ—šên-5be7b69c3ff7b5b8ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁ¤²XctÔ'ÐÓ©z¨ɽÓ-a4945860e1c53b00Á¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁòÖÀH•‘PIÓHã#£-055f30b747f859b6Árustc_std_workspace_coreÁ­Cçß^ò½èÝ$­Çÿ+Cé-c4878ee60b2242c9ÁŸÃï+Ñ]ŠqB<ÏïW#-8dd1dd90e70d0b6aÁ miniz_oxideÁ€š»J(P>àö÷g\K-1eb618da2918ab7fÁadler2ÁÆ;+Þ®5¥Ìýݰ¦ÛLˆ-f7919172d268e069Á hashbrownÁPäV9ÒÆèÜ"ÊÖVŽ\-0fc2184a5da6723aÁrustc_std_workspace_allocÁs&ØòØy¯s•bæ!‰ýŠ-97e4bf30be240674Á
std_detectÁhŠBîÙºÌI®ËÅš-9dbbf8346ba7ac8bÁrustc_demangleÁûë9´Ç×@Œ’ùXFº-f33013f239bf9f14Ácfg_ifÁÜLhž§Œaã¯>­-0a71c8f33a838301Á addr2lineÁ׎Þ!]8V$É@@-e618e6be60e87ba2ÁgimliÁ¸
°µ~Î1‹Ñt ðÁ€w-1f7768a68858f670ÁobjectÁ
áPÃ?­À¶¼QHJ¥-914cd6a4dbe590d1ÁmemchrÁ›º«8Ór­2Ù $¨ûib-cf21ca6f2bb15dcdÁë
‹ás«LÖ€îâƒ×ɯŒ-ee6f3747e38367f0ÁhttpÁÿSdÆ=³öîÝ,9ÅÛïU-784715a8774637a2ÁbytesÁz"ˆ9äš
2s÷ "X"“-f60c5f60586b21edÁitoaÁrLpèòÐ
ݽ‚AéGT'-7ba5a7b63f68a66bÁ futures_utilÁ¿—‰ ˆÝ!4_ò/"™I-c0d3c2c1cc8a32daÁ futures_coreÁÍ©û4ù†ŽNx¼ -a28fb4b6ab5a68eeÁ futures_taskÁ¡™£!€34¢è¸Zbå3-a6639629ff41f298Ápin_project_liteÁ·x¼+Ä`·á¨›t—¸Íœ-2dc344ecc91b59efÁ http_bodyÁë×Lry|bSò?žçCq-db37162dcd37cf91ÁtowerÁiVió¿ÝÆ'òñ–ÎËÝÂ-db580f69ad467185ÁtokioÁâYH+ÄS£ü4§…>ˆº$-886576ce57e45364Á parking_lotÁ,kÞÖGϹ˾ϷxwOÜ-5fc2c3fdec45feedÁlock_apiÁEcÓŽ/ÅS}sw‡A$P-0e8055cd433fa267Á
scopeguardÁ’‰‘p ÒÞa¢ßöéqÓB-29f0bdb2ea82739eÁparking_lot_coreÁªôqu´<Üb3 Èn~É-385dbf21a0d1611bÁsmallvecÁØNôCt€ïAGV­Â–-97fd81655f68edefÁ®f©¾/ô)c§{õa“â‘-a3906971a93fd1b8Á?A©ú¡E2¯ëäu-8e0657b9e365f274ÁmioÁU»"‘¦Ï¹Ç8³<u½-325017fc6dce34b0Á tokio_macrosÁ€§)£Í‰ÔœxðÁŠ–ü´-a4c6e56303f3349dÁsocket2Áüß<ÁyðUe-fe803a4340fa19d8Ásignal_hook_registryÁ{lz…<Bžš;ë®
å-cb4f4a08e32ec862ÁerrnoÁðšÿçNš&^
:Ón­-ef17a36a98ab2a47Á
tower_serviceÁ:`¡{¶aÛ¬í"aô-3b2010b03e380b78Á tower_layerÁX*ø6êWHNᕈf§-ee72e88a461fccddÁ sync_wrapperÁžEÖsPÍÿ
"<„:Ay-5431a0c56a16c6a2ÁurlÁ—"æûO¼ÐÞs7¾Ÿ-ec90da11ab73506cÁform_urlencodedÁg
¥N`ù®”b§³‚ŽŠ-8b8228a5928ce2f9Ápercent_encodingÁ¼Ë¥"Iý¹é·Aµ†gãä-bde46fa019ba58c1ÁidnaÁ¯‚‡twɆ²¹‰¶Àw-a0431d49917270f7Á idna_adapterÁ²å>;üI ÃB`œþuöo†-327351a033df5ec3Áicu_normalizerÁi´¢ê¹áÑÚô›ùV-c078c7840d42734cÁ icu_providerÁ3W~¯¯edµÀÁ-ê]^-a7eb6b9990d86254ÁzerotrieÁ>÷ÕõëC°^ã§,¼9²-7d7cb11c83136884Á
displaydocÁÿÙ𫆠§Ó¹÷ô -b8d6ab8742ea8990ÁzerofromÁŠö‘JÁ¯G™è](^Ø”o-dcafde80b60b6e04Ázerofrom_deriveÁ¨ 8ïlÌfOµ— ˆ´-2ea7b665324646a9ÁyokeÁõhŸÂM¾Šp>báf6Ì-d3327e9ee0391076Ástable_deref_traitÁ½ÊTýö÷n˜TóQ-á†-771635b0451f799dÁ yoke_deriveÁº‰ñyåÁðÕCáŠʘÃ-1f6bb0ffd13f0264ÁzerovecÁ®6ÁGÞzFß~†ò¢Ã -4472b0057d74fe55Ázerovec_deriveÁGôMjmO6ãžË˜}…œ-cb226320172b7a66Á writeableÁ²é´‘¥1§%‚ý uÈ%-735c33932dd69842Áicu_locale_coreÁ®¶ •UÝÕÇAaígm-afff73ae055cdd60ÁlitemapÁÎ xj+Þ*`²ÔtJ²-5054981e83d0528aÁtinystrÁÓAúÑç+Ù;ØÆƒÃ>?…-f00c4ce36d46c954Áicu_collectionsÁ ß Â?Ü–Ÿó79-3fcbb3b5e230fce7Á
potential_utfÁËÿ¸Ðλrë‚?šõò -c3f5c8cd65117d54Á utf8_iterÁ‚×úÐ'œÌx G¤Ä^-6f20145e2e3e1c24Áicu_normalizer_dataÁÈÙãµ§ù»/ô#\“ï-4d42ceae66c85c80Áicu_propertiesÁ:VÈÌfÓ/—²’õÖ
-3affad9190a2bb98Áicu_properties_dataÁTˆ{Z3Ñnþ&H¶=_?3-8894fd72e4000317ÁbitflagsÁŽ¡mMÇ3@…EDZqTL-10ed8b3efd511271Á test_helpersÁd±6$¦6authÁ$á6»Æ„Æ6
set_headerÁT7»
set-headerÁ´î6propagate_headerÁ„É7»propagate-headerÁä¢7 compressionÁ\ü8»compression-brÁÔë7»compression-deflateÁü‹8»compression-gzipÁä°8»compression-zstdÁäÒ8üå7Œ
add_extensionÁl´9»
add-extensionÁÌ9sensitive_headersÁŒò9»sensitive-headersÁìÊ9
decompressionÁl®;»decompression-brÁä•:»decompression-deflateÁü·:!»decompression-gzipÁôÞ:»decompression-zstdÁô‚;ü:”content_encodingÁ„µ> »ÙÔÍ;»óüí;»ä’<»¯ä´<»ÒäÖ<»îüø<!» ôŸ=»® ôÃ=»fsÁtç=üÇ;çcompression_utilsÁŒõ@»ÙÔ×>»óü÷>»äœ?»¯ä¾?»Òäà?»îü‚@!» ô©@»® ôÍ@üÑ>CompressionLevelÁ„ÍC»ÙÔ˜A»óü¸A»äÝA»¯äÿA»Òä¡B»îüÃB!» ôêB»® ôŽCü’Amap_response_bodyÁŒŽD»map-response-bodyÁìæCmap_request_bodyÁ„ÏD»map-request-bodyÁä¨DtraceÁ,„E»Ù$ŒèD testsÁ,š$0ô$,â$×Kô$,«$ Xô$,$~ô$,ùô$,ŸA$”Aô$,üb$ñblimitÁ,ìE»þ%ŒÐEmetricsÁ<˜F»™&œúEcorsÁ$ÃF»¶&„¨F
request_idÁTñF»
request-idÁ´ÐF catch_panicÁ\¦G» catch-panicÁ¼„G
set_statusÁTÛG»
set-statusÁ´ºGtimeoutÁ<ŒH»Ð'œîGnormalize_pathÁtÁH»normalize-pathÁÔœH
on_early_dropÁlüH»
on-early-dropÁÌØHÀô$,âY$×Yô$,™  usable_for_retriesÁ”Øe
$Íe
ëredirectÁDÿ »ž)¤à ëRedirectÁDÎ »ž)¤ ëÐ!ø »Ð!tß ëServeDirÁD¶ »Ð!tƒ ë ServeFileÁLÀ »Ð! "builderÁ<ÎI»utilÁ„·I service_extÁ\ôI»Â*„ÝIServiceBuilderExtÁŒÂJ»Â*„ˆJ
ServiceExtÁTâJ»Â* "validate_requestÁ„K»validate-requestÁäöJbodyÁ$ M»'¼¿K»ÒäÜK»îüþK!» ô¥L»® ôÉL»Ð!tíL»þ%ŒMü¹KÜÀmacrosÁdefine_inner_service_accessorsÁ opaque_bodyÁ
opaque_futureÁfollow_redirectÁpolicyÁµ      æ BdÁ –.ž)
on_requestÁ
clone_bodyÁ 
clone_body_fnÁ$$×''''ž)'Þ.ó.--filter_credentialsÁ0000000000 0 BLOCKLISTÁ0<æ <block_cross_originÁ< block_anyÁ<
block_noneÁ<remove_blocklistedÁ<
remove_allÁ< remove_noneÁ0D>0FFFž)FÍ.limitedÁKKKKKPæ KR>KTTTž)
XXXXXX^^^æ a.aXd.ddddž)dÍ.dÞ.k  redirect_fnÁmmmmmmss×mvvvvž)m¬3{{ same_originÁ~~~~~~~æ ~×~ž) 
  
PolicyÁŸŸŸž)ŸÍ.ŸÞ.¥¥¥¡¥ž)¥Í.¥Þ.¬¬¬¡¬ž)¬Í.¬Þ. PolicyExtÁ³µ´¡´´³
¸¡¸¸¼¥¼µ¾¡¾¾¼
¡ÂÂStandardÁAttemptÁÇ'aÁÇstatusÁÇmethodÁÇlocationÁÇprevious_methodÁÇpreviousÁÎ8Π8ή8μ8ÎÌ8Îã8Õ is_followÁÕis_stopÁØØØž)ÜÜÜž) eq_originÁ 
  
 !"#æ ¡ with_policyÁФСŠServiceÁŠlayerÁ¤æ ñ;¤¡»;layer_with_policyÁ˜ReqBodyÁ˜ResBodyÁ˜¤˜¡˜ResponseÁ˜ErrorÁ˜FutureÁ˜
poll_readyÁ˜Ñ¢¤¢Ó<¢â<¢¡¢°¢Š ¨ ¨ ««takeÁ«try_clone_fromÁ®¡®Þ.±¡±± resolve_uriÁclassifyÁgrpc_errors_as_failuresÁÀÀÀÀÀÀÀÀÀÀ À
À ÀÍ into_bitmaskÁÀÏ÷ÀÑ÷ÀÓ try_from_u32ÁÀÕ>À׿ × with_successÁ×make_classifierÁÀÛ FailureClassÁÛ ClassifyEosÁÛclassify_responseÁÞÛclassify_errorÁàÀâŸAâ classify_eosÁâçAåÀç×Àclassify_grpc_metadataÁéor_elseÁé map_failure_classÁìììììììììõõõæ ìùùù×ìýýýNewClassÁýŸAý³AýÆAƒýçAì…DŸA’BçAstatus_in_range_is_errorÁæ  new_for_client_and_server_errorsÁinto_make_classifierÁŸA³AÆA çA¢¤× 
  
MakeClassifierÁ°
ClassifierÁ°ŸA°³A°ƒA´æ ¹¹ŸA¹³A¹ªG¹ƒA¾ClassifyResponseÁÀŸAÀ³AÀÆAÃÀçAÅÀõBÇÇ…D³AÊŸAÊ’BÊçAÍÊõBÏÏ…DNeverClassifyEosÁÒ¥Ò
_output_tyÁÒ_neverÁÖ¥ÖŸAÖ’BÖçAÚÜ¥Ü×ßæ ߃AâŸAâ³AâÆAåâçAçé×servicesÁBoxErrorÁ AndÁííí¬í­ òòòƒ öö ùùù× ýýý> CloneBodyFnÁ±ƒ0FilterCredentialsÁÅ0Þ0ÿ0˜1blockedÁ0ƒ0×KLimitedÁ remainingÁKKƒKK×XOrÁ¬­X   ƒX¤¤X§§§×X«««>m
RedirectFnÁ¯¯±m²²ƒmµ~
SameOriginÁ·_privÁ~~ºƒ~~½>ActionÁ¿FollowÁÀ
¿StopÁÂ
Ń 
È×FollowRedirectLayerÁÊ¡ÊÕ-̓͡ С
Ò¡Ò× Õ¡Õ>FollowRedirectÁؤءØinnerÁØÕ- ݤݡ݃
á¤á¡ä¤ä¡ä×get_refÁget_mutÁ
into_innerÁResponseFutureÁë¤ëë¡ëfutureÁëserviceÁëÕ-ë®8ëuriÁëÄëheadersÁëì+÷¤÷÷¡÷×üý¤ýý¡ü__assert_not_repr_packedÁ¤¡ü
ProjectionÁ'__pinÁ¤¡áSïSÕ-®8ŽTÄ¡Tì+ü
ProjectionRefÁÉU¤¡áSïSÕ-®8ŽTÄ¡Tì+ýprojectÁŸÉUý project_refÁ¡ÉUü__OriginÁ£ÉU£¤££¡£__dummy_lifetimeÁ£áS£ïS£Õ-£®8£ŽT£Ä£¡T£ì+ü±ÉU±¤±±¡üMustNotImplDropÁü·¥ü¹¤¹¹¡
RequestUriÁ½
½ˆÀƒBodyReprÁÂÂÛÄ
ĈÂEmptyÁÇ
婃
ËË×ÀGrpcCodeÁΫÏ
Î CancelledÁÑ
ÎUnknownÁÓ
ÎInvalidArgumentÁÕ
ÎDeadlineExceededÁ×
ÎNotFoundÁÙ
Î
AlreadyExistsÁÛ
ÎPermissionDeniedÁÝ
ÎResourceExhaustedÁß
ÎFailedPreconditionÁá
ÎAbortedÁã
Î
OutOfRangeÁå
Î
UnimplementedÁç
ÎInternalÁé
Î UnavailableÁë
ÎDataLossÁí
ÎUnauthenticatedÁï
À À
òƒÀ À õ×ÀÀGrpcCodeBitmaskÁø
øˆÀ
û×ÀÀþƒÀ÷InternalBitFlagsÁ
ˆ÷÷ƒ÷÷÷÷Ö÷ï
÷÷§ù÷ ÷
FLAGSÁ__bitflags_flag_namesÁBitsÁ´from_bits_retainÁ all_namedÁœ ALL_NAMEDÁOKÁ CANCELLEDÁUNKNOWNÁINVALID_ARGUMENTÁDEADLINE_EXCEEDEDÁ NOT_FOUNDÁALREADY_EXISTSÁPERMISSION_DENIEDÁRESOURCE_EXHAUSTEDÁFAILED_PRECONDITIONÁABORTEDÁ OUT_OF_RANGEÁ
UNIMPLEMENTEDÁINTERNALÁ UNAVAILABLEÁ DATA_LOSSÁUNAUTHENTICATEDÁý`‡a˜a§a¿aØaéaÿa˜b²bÍbÜbðb…c•c¨c¹c÷ À PrimitiveÁÀ]÷ Ã>÷
Å×÷Ç×÷ÉÉþË ÷ÍÉ÷Ï÷÷Ñbits_mutÁ÷ÓemptyÁÓ£ÕALLÁÓ´Ó from_bitsÁÓfrom_bits_truncateÁÓÃ`Ó from_nameÁÛ`ÜÓis_emptyÁÓis_allÁÓ
intersectsÁÓcontainsÁÓinsertÁÓremoveÁÓtoggleÁÓsetÁÓ intersectionÁÓCÓ
differenceÁÓsymmetric_differenceÁÓ
complementÁÜý`܇aܘaܧaÜ¿aÜØaÜéaÜÿaܘbܲbÜÍbÜÜbÜðbÜ…cÜ•cܨcܹc÷ü×÷þ×÷×÷×÷°±÷²÷°µ÷Œ÷ްޝ÷°÷°Ú÷Û÷ ˜°˜
÷!extendÁœ¥÷"žùŸ¥Ÿ÷#¢ù¢
iter_namesÁ÷$¥¥IntoIterÁ¥ê÷%©ée©£©´©‘f©¢f©Ã`©Äf©âf©òf©€g©’g©¢g©°g©¾g©Ìg©×g©C©òg©„h© h÷&¾×÷'À×÷(Â×÷)Ä×÷*ưƱ÷+ɲ÷,˰˵÷-Î÷.аЯ÷/Ó°÷0Õ°ÕÚ÷1ØÛ÷2Ú°Ú
÷3ÝkÞ¥÷4àùá¥á÷5äùäÍk÷6ççìkçêÀGrpcErrorsAsFailuresÁë
success_codesÁÀí×ÀïƒÀGrpcEosErrorsAsFailuresÁñöoÀó×ÀõƒÀGrpcFailureClassÁ÷CodeÁø
øˆ÷‘=û
ûˆÀþ×ÀParsedGrpcStatusÁSuccessÁ

NonSuccessÁƒ
ƒˆGrpcStatusHeaderMissingÁ
HeaderNotStringÁˆ
 HeaderNotIntÁŠ
ÀŒ×ÀÀÀÖìMapFailureClassÁ£R±ì˜˜˜ƒìœœStatusInRangeAsFailuresÁŸrangeÁ¡×£ƒStatusInRangeFailureClassÁ¥
StatusCodeÁ¦
¦ˆ¥‘=©
©ˆ¬×SharedClassifierÁ®®
classifierÁ±±×´´ƒClassifiedResponseÁ·ŸA·³A·Èº
ºˆ· RequiresEosÁ½
½ˆ ÀŸAÀ³AÀ×ServerErrorsAsFailuresÁÄP
ƃ È× Ê>ServerErrorsFailureClassÁÌÙtÍ
͈̑=Ð
Ј
Ó× LatencyUnitÁÕSecondsÁÖ
ÕMillisÁØ
ÕMicrosÁÚ
ÕNanosÁÜ
àƒâ×






&
&
&
'
+
+
+
,
,
-
I
I
I
J
J
W
W
W
i
i
i
j
j
k
k
u
u
u
v
v
z
z
z
{
{
ˆ
ˆ
ˆ
Œ
Œ
Œ
¢
¢
¢
£
£
¤
¤
¥
©
©
©
ª
ª
«
«
°
°
°
±
±
²
²
Ð
Ñ
Ò
Ó
Ô
Ö
×
Û
Û
Û
ß
ß
ß
à
à
Ž
 
 
 
¡
¨
¨
¨
¨
­
®
®
®
±
±
µ
µ
Þ
à
ä
å
è
è
è
é
ü
ü
ü
ƒ

Œ

 
¢
¥
¥
¥
´
´
¾
¾
Ã
Å
Ì
Í
Ù
Ú
Þ
Þ
Þ
å
ç
ê
ê
ê
õ
ü
ü
ü






š
š
š
£
ª
ª
ª
´
»
Æ
É
É
É
Ï
Ô
Ô
Ô
à
ç
ç
ç
è
é
û
û
û

Á
Í
Í
Í
ó
ö
ö
ö
ü
ü
ü
ÿ

Š
Š
Œ
Ž
Ž




š
Æ
Æ
Æ
È
È
È
Ë
Î
Ò
×
Û
Þ
ß
à
á
â
ã
ä
å
ý
ý
ý
ÿ
ÿ
ÿ



ƒ
ƒ
ƒ
ˆ



œ
£
¤
¬
°
±
²
³
´
µ

·
¸
¿
¿
¿
Á
Á
Á
Ã
Ã
Ã
Å
Å
Å
Ê
Ï
Ô
Ù
Þ
å
æ
î
î
î
ð
ô
ô
ô
ö
ÿ
ÿ
ÿ







¢
¢
¢
¤
­
­
­
³
³
³

Ã
Ã
Ã
Ç
É
É
É
Ô
Ô
Ô
á
ã
ã
ã
Ÿ³°ÀÊØíí¼Kð¬ ñ­ ð­s\
Tvአƒ†¿cƒ†³ƒ†Ÿíí¼Kð¬ ñ­ ð­s\
Tvá–.ØÍLƒ±²t˜ˆ p­Š Ƈ¿cƇŸƇÁ†ØMŠÅ00Þ00Œÿ00˜10ŽÈM0È ¨áÈ¿c«ˆ³«ˆŸ«ˆ¹‡ÛîMýMK§]L[0…OØØ¶‰Š ¶‰¿c¶‰³¶‰Ÿ¶‰¥‰¹‡Ø­Nž¬XŸ­XøŒþñeÆ»†Á†Š ©Š¿c©Š³©ŠŸ­Nž¬XŸ­XøŒþñeƧ‡­‡³‡¹‡Ø¯¯½O±±mDx—ÔV6ó‡Š à‹¿cà‹Ÿ¯¯½O±±mDx—ÔV6¥‰¹‡Û··þO¸P~äÿÅk;ØðŒŠ ðŒ³ðŒ¿cðŒŸðŒ¥‰¹‡Ÿ 8¡Á†žˆŸžBoxÁ¡ˆˆ¢ˆl }.xÏ¡çEçEèEGlobalÁ ¿±‡§í#¥‰¹‡³¥Û¿ÀÁÉPÂÃÜP+Ì7$<!{ôØŠ ¿cŸ¥‰¹‡ŸÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
¹‡¥‰¹‡ØÊÊŒQÌÕ-Ït<˜ùRG ¡Š ã¿cã³ãÊÊŒQÌÕ-Ït<˜ùRG ¡¤ØØØýQÛ£RÜÕ-Gt²¡}
ñ‘둊 þ‘¿cþ‘*ØØýQÛ£RÜÕ-Gt²¡}
¤èôôRequestÁöheadÁ¦÷ì+¦¯:ðû„à¢Ó<¿cëë³SïáSðïSñÕ-ò®8óŽTôÄõ¡Töì+fËî¼Éü=Åñ‘Á†¿Ž“íëë³SïáSðïSñÕ-ò®8óŽTôÄõ¡Töì+fËî¼Éü=Ťèî“‚Øëë³SïáSðïSñÕ-ò®8óŽTôÄõ¡Töì+fËî¼Éü=Åñ‘Ó<èØ½½¾ÃY¿ˆ ¹ƒÃ0c¿cÂÄÅÛÆˆÇÈšZÉÊ©d—MˆÚ4Õ¥‰ÛÎÏЫÑÒêZÓÔ€[ÕÖ”[ר°[ÙÚÍ[ÛÜâ[ÝÞü[ßà™\áâ·\ ã
åæê\ çè] éê›]
ëì°]íîÈ]ïðÝ]ˆ*ñžqY%„ØŘŠ Ř¿cŘéŘéŘô ô õ ¨÷ ˆÐ  mjçítoé¿cøøù¤^úˆÀ ™E„GqNÛá›Øá›Š á›Ûì^ƒˆÀ gß‚>Ø»œŠ »œÐ컜µß»œ»œ»œíß»œ»œº»œše»œG{á›á›³»œ¿c»œÄc»œïy»œà»œé»œÈc»œÆc»œÊc»œÌc»œ–ú»œ»œ•˜»œ»œ¶û»œ»œ̘»œ»œöø»œ»œÞ—»œ»œï»œ»œœö»œ»œ•!»œÐL»œ»œÃL»œ»œÇL»œÈcá›Æcá›Êcá›Ìcá›–úá›á›•˜á›á›¶ûá›á›̘á›á›öøá›á›Þ—á›á›ïá›á›œöá›á›•!á›ÐLá›á›ÃLá›á›ÇL᛿cëëÚoìöoÀ¿fž4òòF4Øô¡³ô¡Àô¡¿cññ¥pòöoÀd§ª4íÏÐëØÊ¢ÊÊ¢¿c÷øùþpúˆûü‘=ýˆòÜÓõùY>Äc•£¿cÑqƒåqˆ„rˆ¨rŠÄržÑiåÙ—JÐìßï£ï£ï£Ø‰s£Rì±ìÊ…ªùPiþ·Š Ž¥¿cŽ¥ÀŽ¥ÊŽ¥¿cŸŸòs ‘tãp5jÂB|؇¦À‡¦¿c¥¦§Ùt¨ˆ©ª‘=«ˆÁü¥Ó»-0ÄcÒ¦¿c®®šu°ºu¡°íÙ©Ù)¤È¥Ø¬§°¬§¿c·º»È¼ˆ½¾µv¿ˆ'PÂc ()ŸA³AÊÒÒÆIÔæIÕøI¬Äë䂊än¿cÖ¨ØÄÄòvÅP´ŸXà³æŒ¿c¦©³¦©À¦©¿cÌÍÎÙtψÐÑ‘=Òˆ0#ÎÄ©ÓjBÄcü©Š ÕÖ×§xØÙ»xÚÛÎxÜÝáxWÑ0 ¨ŒëÛÖªØÖª¿cÖªòí ²¯º·Å¿ÍÊÝØÀ½òÎþøïëõñ˜£Ÿ´®ÆÄàÕö혤µ¯¼·Ç¿ÐÊáØôÎøœÞÕùí$§s¯·È¿ÒÊäØ÷ëËÂõÎûøÅíëóñþ÷Œù¡Ÿ¬¥±®À·ÜÒÈÄÓÌâÕýíDR«½·ÕÊÃÕëÊÄí'FTdv¯·¥
¬Ø¿ÜÖ¿¹·Ä¿ñÎýøßÕ¼ŠÊ˜Ø±ë·¹ë¢ëÏÎÑÎÏˆŽøÀøÇç÷¤¥éÌÉÍü¾øþÀøÂøÄøÆøÉøËøŒÎøŽÐøÓøÕøØø˜ÚøÝøžàø¥çøÛëýŸâÄâñÖÒ¹®Ø¸Š ¿cb³ Ÿ =ÛF³1+Ú*“í‚Ø
éÐìµßíߺšeG{ÄcïyàÈcÆcÊcÌc–ú•˜¶û̘öøÞ—ïœö•!ÐLÃLÇLÀʰü˜T ; ëë
HeaderNameÁì£RÇÀZ}}HÚivƒ 
‘¶ ëü÷v;þ¶޶ÎŽ¶Öü™S‘¶¬Ÿ‘¶‘¶ÜÎ޶g*Á‘¶,Ï‘¶.ä‘¶^fÁ‘¶iqÏ‘¶t|ä‘¶¨ ‘¶œ«;޶Çò‘¶ï‘¶í‘¶ëï Á‘¶Ï‘¶ä‘¶ñxÕG
 ±xÕG
¯œ˜9ùx½7Gžá›!xÎG,
zÀºœÑ¬sŸá›mç
îâÀºœŠ Ü êá›ÖýP
XMÀºœÃ H¡Wá›DlÀ
ȽÀºœü ð¸¢Çá›´Ü0
8-Àºœµ! `(£7á›$L 
¨Àºœî!@И¤§á›¼

Àºœ§"@¥á›,
ˆ}Àºœà"°x¦á›tœð
øíÀºœ™# è§÷á›ä `
h]ÀºœÒ#X¨gá›T|Ð
ØÍÀºœ‹$È©×á›Äì@
H=ÀºœÄ$p8ªGá›4\°
¸­Àºœý$ ਫ·á›¤Ì 
(Àºœ¶%@P¬'á›<
˜Àºœï%Àˆ­á›¬
ýÀºœ¨&0ø®á›ôùxí’ûG
 FlagÁÐ Gf»GfÐnÆù"kEá›vƒ 
½É xçšG xõšGùxç G²Êùxô(GºÉìºÉô¼Éùxî’úG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêG½ÉšêGºÉùD#©xé•G¯ yx‡–Gžá›#°©ÍŸá›;±©Í5 á›S²©ÍM¡á›k³©Íe¢á›ƒ´©Í}£á›µ©Í¤á›³©Í­¥á›Ë·©ÍŦá›ã¸©Íݧá›û¹©Íõ¨á›º©Í©á›-»©Í(ªá›G¼©ÍB«á›a½©Í\¬á›{¾©Ív­á›¿©Í®á›µºÉùxוGG‰xוG
Gvá›ï¯©Íüîžá›ûGMG€Ñ,°©Í9+Ÿá›8Š€Ñi±©Ívh á›uÁÇÁ€Ñ¦²©Í³¥¡á›²þÿ€Ñ䳩Íñã¢á›ð<C>€Ñ$´©Í1#£á›0|ƒ~€Ñdµ©Íqc¤á›p¼Ã¾€Ñ¤©Í±£¥á›° üþ€Ñä·©Íñã¦á›ð
 <C> €Ñ$¸©Í1#§á›0 
|ƒ~
€Ñd¹©Íqc¨á›p  ¼Ã¾ €Ñ¤º©Í±£©á›°
 üþ €Ñ仩Íñãªá›ð
<C>
€Ñ$¼©Í1#«á›0|ƒ~€Ñd½©Íqc¬á›p¼Ã¾€Ñ¤¾©Í±£­á›°üþ€Ñä¿©Íñã®á›ð< ½É 
  
Wf¹ºÉƒ¼É½ÉнɽɽÉ{½Év½Éq½Él½Ég½Éb½É]½ÉX½ÉS½ÉN½ÉI½ÉD½É?½É:- ",¯©Í'žá›F°©ÍAŸá›`±©Í[ á›z²©Íu¡á›³©Í¢á›®´©Í©£á›Èµ©Íäá›â©ÍÝ¥á›ü·©Í÷¦á›¸©Í§á›0¹©Í+¨á›Jº©ÍE©á›d»©Í_ªá›~¼©Íy«á›˜½©Í¬á›²¾©Í­­á›Ì¿©ÍǮᛩÍ"OK"Á ©Í "CANCELLED"Á©Í "UNKNOWN"Á©Í"INVALID_ARGUMENT"Á©Í"DEADLINE_EXCEEDED"Á ©Í "NOT_FOUND"Á©Í"ALREADY_EXISTS"Á©Í"PERMISSION_DENIED"Á©Í"RESOURCE_EXHAUSTED"Á ©Í"FAILED_PRECONDITION"Á
©Í "ABORTED"Á ©Í"OUT_OF_RANGE"Á
©Í"UNIMPLEMENTED"Á
©Í
"INTERNAL"Á ©Í
"UNAVAILABLE"Á ©Í "DATA_LOSS"Á©Í"UNAUTHENTICATED"Á‰ ixêGÙxúG
)x¯žG x·žG
šêG!x† GùxŽ )G G|á›²Ê x¸ G ùxŽ ,G# ùx -G xº GùxÝ G yxà G
!xà G   #
*Axå G
Gyá› :
Qxå GX
 xî G Ix¢¡G   ™x®¡G
ax®¡G !x®¡G )
0)x³¡G
Gxá›:9x³¡G\ x¹¡G
!x»¡G
¬
1x»¡G xÀ¡Gùx–¡+G
 
 
& xÁ¡Gùxð tG ' xä¡G 
¸ xã¡G
  1x†¢G x‹¢G* *
PùxàŸËG xª¢G  ñŸêGšêG G|á›²Ê    þùõïëò 
êå
â6 ßÛâØÔÛÑØ÷
ÿЙæ È Å@
HÃäæP
¾º
ÑØ³¯¸=Ò«´`¨¯¥ ¡Ç  È
ï  ©¢ óŸêGšêG!£"Ÿ#¦#¯G|ᛲʜ$£$%#¦&$%¸ &%$"#$$'(ƒ)Š)"£
«å)³(zÎ( w)s*z*p+l,s-i.p."
h™æ.-`¸,-].Ø
à[äæ,è+VR,N
*+i+p*K-G'PÕj)C'Lø@(G'=/9_ /`
/8!A3#:" õŸêG!šêG0;172>2GG|ᛲÊ43;3142>534P 543.123)3%678"81;
Cå8K7f7 8 99:; <==1'
/™æ=1<øP;<õ=p
xóäæ;:îê;æ
9::9ã<ß6èm  8Û6ä Ø7ß6Õ>Ñ÷ >ø
>Ð0ÙË2Ò1 ÷ŸêG0šêG?Ó
@Ï
AÖ
Aß
G|ᛲÊÌ
BÓ
BÉ
CAÖ
DBCè
 DCB!Æ
@ABÁ
B½
E·
F³
Gº
G@Ó

Û
²
åGã
F"ª
þ
F&# §
G£
Hª
H 
Iœ
J£
K
L 
L@¿

Ç
˜
™æLÉ
K$
è
JK
L 
 
äæJ I%

J~

HI
I 
H{
Kw
E
 'š Gs
E|
( 'p
Fw
Em
Mi

 M
(
·
Mh
?q
c
Aj
@ ùŸêG?šêGNk
Og
Pn
Pw
G|ᛲÊd
Qk
Qa
RPn
SQR
 SRQ)^
OPQY
QU
TO
UK
VR
VOk

s
J
åV{
U*B

U.+ ?
V;
WB
W8
X4
Y;
Z1
[8
[OW

_
0
™æ[a
Z,(

YZ%
[ 

¨
#
äæY°
X-

Y

WX1
X8
W
Z
T
/2V
T
À/
U
T
\
'
 \(
0
O
\
N
û P
O ûŸêGNšêG]^ÿ__G|ᛲÊü``ùa_b`a ba`1ö^_`ñ`í cç dã eê e^
  âåed2Ú. d63 × eÓ fÚ fÐ gÌ hÓ iÉ jÐ j^ï
÷ È™æjùi4À hi½ j8
@ »äæhHg5² h® 
fgÉ gÐ f« i§ c°5 7Ê e£ c¬X 7  d§ c k¿ kÀ8
ç k˜]¡_š^ ýŸêG]1ÿšêGlmnžn§G|ᛲÊoopnžqop° qpo9Žmnoo
r
s{
t
tm
£
zåt«s:rÆ
s>; o
tk
ur
uh
vd
wk
xa
yh
ym

`™æyx<X°
wxU
yÐ
Ø
Säæwàv=NJ
wF

uva
vh
uC
x?
rHÍ
?b
t;
rDð
?8
s?
r5
z1W
zX@

z0l9+n2m ÿŸêGl1šêG{3|/}6}?G|ᛲÊ,~3~)}6~I ~A(|}~#~   ƒ ƒ|9
A åƒJBf FC  ƒ
        ˆ ˆ|0
8  ™æˆ;D[  ˆ~
 äæEþú ÷ 
  ø õ ÿ G ƒó ý© Gñ ù ð í H
< î{÷é}ð| ŸêG{šêGŠòïŒ÷ŒG|ᛲÊîö펌üŽ ŽIòŒðí è å í 
 çåJá5 NK ß Ü ä Û Ø à × ß 
 Ù™æ LÓ+ Ò N
V Ñäæ_MÎÊ Ç 
ä ì È Å ÏT Oé à Íy OÁ É À ˜½ã ˜åP
  ˜¾ŠÈºŒÂ ƒŸêGŠ1…šêGÆšÃËÕG|ᛲÊœʜÁОœå žœQÆšœÄœÁ
Ÿ¼
 ¹
¡Á
¡šÜ
ä
»å¡í Rµ 
 VS ³
¡°
¢¸
¢¯
£¬
¤´
¥«
¦³
¦šÔ
Ü
­™æ¦ß¥T§ÿ
¤¥¦
¦"
*
¥äæ¤3£U¢ž
¤

¢£¸
£À
¢œ
¥
Ÿ£(
W½
¡
Ÿ¡M
W
 
Ÿ
§·
§¹X
à
§œŽšŸêG1‡šêG¨š©ªŸª©G|ᛲʫž«¬ª¤­«¬¹ ­¬«Yš©ª«˜«®¯°°©°
¸å°Á¯Zݯ^[ °±Œ±ƒ²³ˆ´µµ©¨
°™æµ³´\{Ó³´zµö
þyäæ³²]vr³o
±²Œ²±p´m®wü_°k®u!_i¯q®he `
´f¨pbªj©ŸêG¨1‰šêG·n ¸k ¹s ¹} G|ᛲÊj ºr ºi »¹x ¼º»  ¼»ºan ¸¹ºl ºi ½d ¾a ¿i ¿¸
Œ c å¿• ¾b] ± ¾fc [ ¿X À` ÀW ÁT Â\ ÃS Ä[ ĸ| 
U ™æÄ‡ ÃdO § ÂÃN ÄÊ 
Ò M äæÂÛ ÁeJ F ÂC 
ÀÁ` Áh ÀD ÃA ½K Ð!ge!¿? ½I õ!g= ¾E ½< Å9 _  Åa h
ˆ Å: ·D 6 ¹> ¸ŸêG·1‹šêGÆB#Ç?#ÈG#ÈQ#G|ᛲÊ>#ÉF#É=#ÊÈL#ËÉÊa# ËÊÉiB#ÇÈÉ@#É=#Ì8#Í5#Î=#ÎÇX#
`#7#åÎi#Íj1#…#Ínk /#Î,#Ï4#Ï+#Ð(#Ñ0#Ò'#Ó/#ÓÇP#
X#)#™æÓ[#Òl##{#ÑÒ"#Óž#
¦#!#äæÑ¯#Ðm##Ñ#
ÏÐ4#Ð<#Ï#Ò#Ì#¤$o9$Î#Ì#É$o#Í#Ì#Ô
#3# Ô5#p
\#Ô#Æ#
#È#ÇŸêGÆ1šêGÕ&Ö&×&×%&G|ᛲÊ&Ø&Ø&Ù× &ÚØÙ5& ÚÙØq&Öר&Ø&Û &Ü &Ý&ÝÖ,&
4& &åÝ=&Ür&Y&Üvs &Ý&Þ&Þÿ%ßü%à&áû%â&âÖ$&
,&ý%™æâ/&át÷%O&àáö%âr&
z&õ%äæàƒ&ßuò%î%àë%
Þß&ß&Þì%áé%Ûó%x'w
'Ýç%Ûñ%'wå%Üí%Ûä%ãá%& ã &x
0&ãâ%Õì%Þ%׿%Ö ŸêGÕ1šêGäê(åç(æï(æù(G|á›²Êæ(çî(çå(èæô(éçè ) éèçyê(åæçè(çå(êà(ëÝ(ìå(ìå)
)ß(åìzÙ(-)ë~{ ×(ìÔ(íÜ(íÓ(îÐ(ïØ(ðÏ(ñ×(ñåø(
)Ñ(™æñ|Ë(#)ïðÊ(ñF)
N)É(äæïW)î}Æ(Â(ï¿(
íîÜ(îä(íÀ(ð½(êÇ(L*á)ì»(êÅ(q*¹(ëÁ(ê¸(òµ(Û( òÝ(
)ò·(äÁ(³(æ»(å ŸêGä1‘šêGó¿+ô¼+õÄ+õÎ+G|ᛲʻ+öÃ+öº+÷õÉ+øö÷Þ+ ø÷öÀ+ôõö¾+ö»+ù¶+ú³+û»+ûôÖ+
Þ+µ+åûç+ú°+,úƒ °+û­+üµ+ü¬+ý©+þ±+ÿ¨+°+ôÑ+
Ù+ª+™æÜ+ÿ¥+ý+þÿ¤+ ,
(,£+äæþ1,ý¡++þš+
üý·+ý¿+ü›+ÿ˜+ù¢+'-½,û—+ù¡+M-–+úž+ù•+’+¸+ º+ˆâ+”+óž++õ˜+ôŸêGóIx“£G x­£G ùxºõGùxæÈGùx«žƒGùx‚ ©G
%+17=CIOU[agùxô¢:GîÌ/­/´, ½É‹/²Ê‰/m/_/f///¤Â/².¤. ᛥ.øÂ®.¤Â¦.-9-¤Â
0²Ê 0ï/á/è/š/”/¤Â/4/&/øÂ$/øÂ-/¤Â%/–Ã
.¶-¤ÂŠ0²Êˆ0l0^0e000¤Â0±/£/øÂ¡/øÂª/¤Â¢/–Ê.3.¤Â1²Ê1é0Û0â0”0Ž0¤ÂŒ0.0 0øÂ0øÂ'0¤Â0–Ã/°.¤Â„1²Ê‚1f1X1_11 1¤Â 1«00øÂ›0øÂ¤0¤Âœ0–Ä/-/¤Â2²Êÿ1ã1Õ1Ü1Ž1ˆ1¤Â†1(11øÂ1øÂ!1¤Â1–Ã0ª/¤Â~2²Ê|2`2R2Y2 22¤Â2¥1—1øÂ•1øÂž1¤Â–1–Ã~0'0¤Âû2²Êù2Ý2Ï2Ö2ˆ22¤Â€2"22øÂ2øÂ2¤Â2–Ãû0¤0¤Âx3²Êv3Z3L3S33ÿ2¤Âý2Ÿ2‘2øÂ2øÂ˜2¤Â2–Ãx1!1¤Âõ3²Êó3×3É3Ð33|3¤Âz333øÂ 3øÂ3¤Â
3–Ãõ1ž1¤Âr4²Êp4T4F4M4ÿ3ù3¤Â÷3™3‹3øÂ‰3øÂ’3¤ÂŠ3–Ãr22¤Âï4²Êí4Ñ4Ã4Ê4|4v4¤Ât444øÂ4øÂ4¤Â4–Ãï2˜2¤Âl5²Êj5N5@5G5ù4ó4¤Âñ4“4…4øÂƒ4øÂŒ4¤Â„4–Ãl33¤Âé5²Êç5Ë5½5Ä5v5p5¤Ân555øÂ5øÂ 5¤Â5–Ãé3’3¤Âf6²Êd6H6:6A6ó5í5¤Âë555øÂ}5øÂ†5¤Â~5–Ãf44¤Âã6²Êá6Å6·6¾6p6j6¤Âh6
6ü5øÂú5øÂ6¤Âû5–Ãã4Œ4¤Â`7²Ê^7B747;7í6ç6¤Âå6‡6y6øÂw6øÂ€6¤Âx6–Ã`5 truncatedÁ=8´"8flagÁü7–Ò 8–Ò8"–Ò#81–Ò08@–Ò=8O–ÒJ8 ^–ÒW8
m–Òd8 |–Òq8 –Ò8
š–Ò8©–Ò›8¸–Ò©8Ç–Ò·8Ö–ÒÅ8å–ÒÓ8ô+
49æ8G|ᛲÊö8G|ᛲÊ9G|ᛲÊ9G|ᛲÊ&9G|ᛲÊ69G|ᛲÊF9G|ᛲÊV9G|ᛲÊf9G|ᛲÊv9G|ᛲʆ9G|ᛲʖ9G|ᛲʦ9G|ᛲʶ9G|á›²ÊÆ9G|ᛲÊÖ9G|á›²Êæ9G|ᛲÊù•×$!G Ù•Ü$Gó’GÔù–»’8G»œ!–Ó’G Nù*G
Ö»œ†”GÕù–Ò“4G»œ!–è“G TÖ»œEi•ð%GÙ•€&G
1•¹&GÂ&G
šêGù•®(eGù•®(^G ù•®(-Gù•®()G G|á›²ÊØ(G   F
R 
c  
v 
ž)•…)G™æ¢9•…)GÅ)Gé
ð!•)Gäæú1•)G)Gù•¡(rG
 “)G  9•¹)G ¿)G*  *P ù•û'èG ˜ŸêGšêG
âÝäÙÔÛäG|ᛲÊÑØ!3 Gi
qÔ™ærÑγ
»ÌäæÂÉÅÁ
ܽÄË»·Ý Þ
¿ šŸêG
šêGŽŠŒG|ᛲÊÅÒä  ø
"™æ#
Cd
l}äæs zvr
nu|l hŽ    gp œŸêGšêG!D"?#F$;%6&=&FG|ᛲÊ3':'v(&ƒ)'( )('
©%&'Ë
Ó6™æ%Ô$3ô#$0%
.äæ#$"+'##
">"'&&-$*? *@g*!! žŸêG!šêG+õ,ð-÷.ì/ç0î0÷G|ᛲÊä1ë1'204312F 321Z/01|
ç™æ/.ä¥-.á/Æ
Îßäæ-Õ,ÜØ-Ô
,ï,Ð1×0Þ.Î4Êð 4ñ4É+Ò  ŸêG+šêG5¦6¡7¨89˜:Ÿ:¨G|ᛲÊ;œ;Ø<:å=;<÷ =<; 9:;- 
5 ˜™æ96 8V 789w 
 äæ7† 67
6 6;ˆ:8>{¡ >¢É>z5ƒ ¢ŸêG5šêG?W
@R
AY
BN
CI
DP
DY
G|ᛲÊF
EM
E
FD
GEF¨
 GFE¼
CDEÞ

æ
I
™æCç
BF
 ABC
C( 
0 A
äæA7 @>
:
A6

@Q
@2
E9
D@
B0
H,
R
 HS
z
H+
?4
 ¤ŸêG?šêGI J K
Lÿ Mú N N
G|ᛲÊ÷ Oþ O: PNG QOPY  QPOm MNO 
 ú ™æM˜ L÷ ¸ KLô MÙ 
á ò äæKè Jï ë Kç 
J Jã Oê Nñ Lá RÝ   R  + RÜ Iå  ¦ŸêGIšêGS¹
T´
U»
V°
W«
X²
X»
G|ᛲʨ
Y¯
Yë
ZXø
[YZ
 [ZY!WXY@
H«
™æWIV"¨
iUV¥
WŠ
£
äæUT# 
œ
U˜

T³
T
Y
X¢
V
\Ž
´
 \µ
$Ü
\
S
 ¨ŸêGSšêG]j^e_l`aa\bcblG|ᛲÊYc`cœdb©ecd» edc%Ïabcñ
ù\™æaú`&Y_`Va;
CTäæ_J^'QM_I
^d^EcLbS`Cf?e ff(f>]G ªŸêG]šêGghijk
llG|ᛲÊ
mmMnlZomnl onm)klm¢
ª
™æk«j*
Ëijkì
ôäæiûh+þiú
hhömýljôpð p,>pïgø ¬ŸêGgšêGqÌrÇsÎtÃu¾vÅvÎG|ᛲʻwÂwþxv ywx yxw-1uvwS
[¾™æu\t.»|st¸u
¥äæs¬r/³¯s«
rÆr§w®vµt¥z¡Ç zÈ0ïz q© ®ŸêGqšêG{}|x}~towG|ᛲÊnv³Âƒ× ƒ1î
}™æ~2z;}~w\
duäæ}k|3rn}j
||fnv~fc 4²d{m °ŸêG{šêGB>Fˆ<8Š@ŠJG|ᛲÊ7?|ŒŠŒ  Œ5·ŠÜ
äG™ææˆ6FˆE+
3Däæ;7C?<
X:BŠJˆ;Ž8^ Ž`8Ž9C ²ŸêGšêG!G|ᛲÊSbw 9޳
»™æ½:Þ

äæ;
/!˜5 ˜7<^˜ ´ŸêGšêGðšìôœêæžîžøG|ᛲÊåŸíŸ* ž9¡Ÿ N ¡ Ÿ=ežŸŠ
õ™æœ>ôµœóÙ
áòäæéš?ñíê
ššèŸðžøœé¢æ  ¢@5¢çñŸêGšêG£Ç¤Ã¥Ë¦Á§½¨Å¨ÏG|ᛲʼ©Ä©ª¨«©ª% «ª©A<§¨©a
iÌ™æ§k¦BËŒ¥¦Ê§°
¸É俥À¤CÈÄ¥Á
¤Ý¤¿©Ç¨Ï¦À¬½ã ¬åD  ¬¾£È ¸ŸêG£I•Â*G­ ­¡•¸*G ­Ë*G­á*G ù•»%¨GÖù•ì%öGù•µ&­G®»œI•Æ%GhBøÂ?øÂH¤Â?²Ê< X_–Ã2ÛøÂøÂœ¤Â²Êt¬³–Ã/êøÂçøÂð¤Âç²ÊäÈ–ÃÚƒ>øÂ;øÂD¤Â;²Ê8T[–Ã.×øÂøÂ˜¤Â²ÊŒp¨¯–Ã+æøÂãøÂì¤Âã²ÊàÄü –ÃÖ: øÂ7 øÂ@ ¤Â7 ²Ê4  P W –Ã*ÓŽ øÂøÂ¤Â²Êˆ l ¤ « –Ã~'â øÂß øÂè ¤Âß ²ÊÜ À ø ÿ –ÃÒ{6!øÂ3!øÂ<!¤Â3!²Ê0!!L!S!–Ã& ÏŠ!øÂ‡!øÂ!¤Â‡!²Ê„!h! !§!–Ãz # Þ!øÂÛ!øÂä!¤ÂÛ!²ÊØ!¼!ô!û!–ÃÎ w 2"øÂ/"øÂ8"¤Â/"²Ê,""H"O"–Ã"!Ë †"øÂƒ"øÂŒ"¤Âƒ"²Ê€"d"œ"£"–Ãv!!Ú"øÂ×"øÂà"¤Â×"²ÊÔ"¸"ð"÷"–ÃÊ!s!.#øÂ+#øÂ4#¤Â+#²Ê(# #D#K#–Ã"Ç!#øÂ#øÂˆ#¤Â#²Ê|#`#˜#Ÿ#–Ãr"=õÑ7$_iÁ$H$Û#G|ᛲÊë#G|ᛲÊû#G|á›²Ê $G|ᛲÊ$G|ᛲÊ+$G|ᛲÊ;$G|ᛲÊK$G|ᛲÊ[$G|ᛲÊk$G|ᛲÊ{$G|ᛲʋ$G|ᛲʛ$G|ᛲʫ$G|ᛲʻ$G|ᛲÊË$G|ᛲÊÛ$G|ᛲÊ1•Å+Gó•G×ù–¹•:GO1 »œ1–Ë•G7I•œ,Gñ•¨,G!•Á,G !
(祬,G
Ù5HÅ,Gù•¨, GÈ,G‰•â,GI•â,G !•ï,G 7Hò,G Q•¼-G!•Á-G   !  Å-G ù•Ž-9G Û¼»œÆ-Gù•ß,áGù•ý--G Û¼»œ8¿.GÑ.G˜GØù–ž—rGù•˜,ºG
Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ»œù–×-G)–µ—G@»œ>;ÖÓÅ»œˆ´QõÑÛ¡•›/G!•/G i•¢/GY•¢/G
I•¢/G
Õ-<l ®/G Ñ•/G ¯/GÁ/GÖ™GÙù–û˜[G»œ!–©™G)–›™Gþú뻜è´-W!•‰0G Q•„0G 0G„›GÚù–­šWG»œ!–ÙšG)–ËšG}´A©Í"OK"Á ©Í "CANCELLED"Á©Í "UNKNOWN"Á©Í"INVALID_ARGUMENT"Á©Í"DEADLINE_EXCEEDED"Á ©Í "NOT_FOUND"Á©Í"ALREADY_EXISTS"Á©Í"PERMISSION_DENIED"Á©Í"RESOURCE_EXHAUSTED"Á ©Í"FAILED_PRECONDITION"Á
©Í "ABORTED"Á ©Í"OUT_OF_RANGE"Á
©Í"UNIMPLEMENTED"Á
©Í
"INTERNAL"Á ©Í
"UNAVAILABLE"Á ©Í "DATA_LOSS"Á©Í"UNAUTHENTICATED"Á1•ù:G ù•ù:%GÙ•ƒ;G;G’ŸGÞù–ΞDG!–ïžGÚ¤ù–Ì•ž GAz±•ˆ=Gi•ˆ=GY•ˆ=G
I•ˆ=Güª+ :1•˜=G o
=G 1•¢=G ù•ˆ= G§=G ¹=Gº Gßù–úŸ@G!–™ GÚ¤ù–Ì•È
G»œä°8a
þ=G1•þ=G 9•‡>G @ >G ù•þ=/GÙ•>G¬>Gü¡Gàù–¦¡VG!–סGÚ¤ù–Ì•ø G»œ1–Æ¡GãßË4¹
1j£
?G1•?G 9•Š?G @ ?G 9••?G Ù•?G?G º£Gáù–è¢RG!–—£GÚ¤ù–Ì•¸
G»œ1–†£GñíÙ¦;¹
8q
ãDG1•ãDG 9•ìDG ? òDG ±•ÞDG óDGƬGæù–í«YG»œ!–Ÿ¬G»œù–Ì•ÀG»œ1–ެG×ÓÀ4¹
1l
ÉEG1•ÉEG 9•ÒEG ?
ØEG ±•ÄEG ÙEG•®Gçù–Ê­KG»œ!–õ­G»œù–Ì•G»œ1–ä­G×ÓÀ4¹
1l
‰•´FG1•´FG A•½FG9•¾FG %ÄFGa  ¹•¯FG ÅFG¼±Gèù–ç°UG»œ!–—±G»œù–Ì•¸G»œ1–†±GôðÝÙ;¹
8s
ªGG1•ªGG 9•³GG ? ¹GG ±•¥GG ºGG³³Géù–ʲiG»œ!–„³G»œù–Ì•¥G»œ1–ó²G×ÓÀ4¹
1l9•¢HG1•£HG %¨HGù•‰H!G

Á•‰HGÉ¥_+©HGµGêù–È´GG»œ!–ê´G»œù–Ì•G¼¸JùØN.GYúNG!úNG #
*!ÿNG
×71ÿNG „OGj
qùØN!GÀº| …OGùœO.GY¾OG!¾OG #
*!ÃOGËÅ51ÃOG ÈOGh
oùœO!GÀºzŽ ÉOGùÜMG
ùÜM'G
Gá›ù™N)GG|á›²ÊæQ ÜOG ëOG£ùŠMáGG G IterÁG
£RGGdoneÁGa2²8ŸÓá›ù¦M#GÚ¤)œMGá›!ڤᛜ˜Ú¤B©ÿG|ᛲÊùT.GY¯TG!¯TG #
*!´TGËÅ51´TG ¹TGh
oùT!GÀºzŽ ºTGùÑT.GYóTG!óTG #
*!øTGËÅ51øTG ýTGh
oùÑT!GÀºzŽ þTGùŒS†G
ùŒS,G
G$á›ùÎS)GG|ᛲÊ}æQ UG  UG¤ù¯RñGGG IterNamesÁGflagsÁGGidxÁGGsourceÁGGýMG^öÀšWcá›ùÑR(GÚ¤)ÇRGá›B>Ú¤<᛿»Ú¤¹BÌ"G|ᛲÊÑ‘Ê G
Á‘Ê G
Ô-ù‘Å G øä Gó’Gªù’»’8Gá›!’Ó’G»œ(Á‘­
G
±‘­
Güª+ñ‘¨
G ø Å
G†”G«ù’Ò“4Gá›!’è“G»œŠ(1 G »œi‘ G
 !‘ GËÅ?1‘ G Gó•G¬ù’¹•:G\HøÂ1’Ë•GÚ¤š<ù‘ï "G!Œ G "
)á‘ï G
Ø5I  GXù‘é (G|ù‘ç
-G Û¼á›
!‘Ú G Û»œQ‘
G!
G ! ø š
Gù‘ã 9G Û¼á›
G ¼G˜G­ù’ž—rGù‘¬ pGÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙá›ù’×-G)’µ—Gã¨âÞù‘¬ 3G»œYá›A»œ?´I´ƒÑù‘+G!‘¬G "
)ù‘%GÉ¥4H°Gù‘1G ø±GÖ™G®ù’û˜[Gá›!’©™G)’›™G»œÀ»´Iù‘)G!‘¯G "
)ù‘#G
Ú6J³Gù‘/G ø´G„›G¯ù’­šWGá›!’ÙšG)’ËšG»œÂ½´I1G »œ‰‘G
 A˜G
ÞAQ‘˜G¡G’ŸG±ù’ΞDG!’ïžGøÂù’Ì•ž GÚ¤¢B1íG »œy‘íG
 1ôG
ßAA‘ôGûGº G²ù’úŸ@G!’™ GøÂù’Ì•È
GÚ¤¢B1ÒG »œ9‘äG »œÑ‘ÒG
 QÙG
à\D™‘ÙGëG ü¡G³ù’¦¡VG!’סGøÂù’Ì•ø Gá›1’Æ¡GÚ¤Ö»œÁ/¹
,e1ÀG »œ9‘ÐG »œÁ‘ÀG
 AÇG
á\D‰‘ÇG×G º£G´ù’è¢RG!’—£GøÂù’Ì•¸
Gá›1’†£GÚ¤Ö»œÁ/¹
,eá‘ìG1‘ìG »œ9‘G »œA
HaóG
æU?©‘óGG ù‘ç"G øˆGƬG¹ù’í«YGá›!’Ÿ¬Gá›ù’Ì•ÀGá›1’ެG»œ»œÿ»œì8¹
5p©‘ÞG1‘ÞG »œ9‘ëG »œA
H)åG
çU?qåGòG Ù‘ÙG øóG•®Gºù’Ê­KGá›!’õ­Gá›ù’Ì•Gá›1’ä­G»œ»œþ»œë8¹
5pÑ‘ÎG1‘ÎG »œ9‘àG »œA
HQÕG
èU?™‘ÕGçG ù‘É G øèG¼±G»ù’ç°UGá›!’—±Gá›ù’Ì•¸Gá›1’†±G»œ»œÿ»œì8¹
5pù‘Í$G1‘ÍG »œ9‘éG »œB
I¡‘ÔG
éU?é‘ÔGðG ù‘È*G øñG³³G¼ù’ʲiGá›!’„³Gá›ù’Ì•¥Gá›1’ó²G»œ»œÿ»œì8¹
5p™‘ÅG1‘ÅG »œ&
-QÌG
ê:a‘ÌG×GÉ‘ÀG øØGµG½ù’È´GGá›!’ê´Gá›ù’Ì•G»œÌ»œÉ!Lù”ØN.GY”úNG!”úNG #
*!”ÿNGäæ51”ÿNG„OGh
où”ØN!GÀºzŽ…OGù”œO.GY”¾OG!”¾OG #
*!”ÃOGäæ51”ÃOGÈOGh
où”œO!GÀºzŽÉOGù”ÜMG
ù”ÜM'GáÇù”™N)GG|ᛲÊxáLÜOG ëOGåù”ŠMáGÌÈù”¦M#GøÂ)”œMGá›ÞÚøÂØá›[WøÂUBmÃG|ᛲÊù”T.GY”¯TG!”¯TG #
*!”´TGäæ51”´TG¹TGh
où”T!GÀºzŽºTGù”ÑT.GY”óTG!”óTG #
*!”øTGäæ51”øTGýTGh
où”ÑT!GÀºzŽþTGù”ŒS†G
ù”ŒS,GÛÌù”ÎS)GG|ᛲÊxáLUG  UGæù”¯RñGÆÍù”ÑR(GøÂ)”ÇRGá›ÞÚøÂØá›[WøÂUBmÃG|ᛲʬ“X ½¾%³—1¸¸UriÁ¹schemeÁŒ º authorityÁŒ »path_and_queryÁŒ ?¾*È~ñ¼¸¢$ÜX Â¥‰Å)é—5¥‰=Dùl‰[G øù(á›4»œ<CùpÅ"G (»œ4;B$N ÷ù%•£1¥›9@,ÿN ÷ü%•£1úHúHßûHÁ‘4Ý­f‰úM÷cjTªX %ï£1¥›9@ ¥§%Ò¦1œÙtˆÖ =OzÇìï?xgn ¥ª%Ò¦1Íû9@,”L
·èɨ »-û§9Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
è\‡M
·èɨ ¾-û§9ɨAHTÀa
ÌÎ%ü©1“ý9@,´b
ÌÑ%ü©1Íû9@ëìÕÀü¥Pü:7 `async fn(HttpRequest) -> Result<HttpResponse, Error>`Á;út? # OverviewÁNúüR`] tower-http is a library that provides HTTP-specific middleware and utilities built on top ofÁ [tower].ÁÀúüÄ^[ All middleware uses the [http] and [http-body] crates as the HTTP abstractions. That meansÁü£YV they're compatible with any library or framework that also uses those crates, such asÁüý! [hyper], [tonic], and [warp].ÁŸú¤£ # Example serverÁ¸úü¼^[ This example shows how to apply middleware from `tower-http` to a [`Service`] and then runÁü›0- that service using [hyper] and [hyper-util].ÁÌú”Ð ```rust,no_runÁ¬ã use tower_http::{Áüù&# compression::CompressionLayer,ÁÔ  trace::TraceLayer,Á };ÁüÂ63 use tower::{ServiceBuilder, service_fn, BoxError};Áüù" use http::{Request, Response};Áüœ)& use std::net::{SocketAddr, Ipv6Addr};Á¬Æ use bytes::Bytes;ÁìÜ use http_body_util::Full;Áüú1. use hyper_util::rt::{TokioIo, TokioExecutor};Áü¬1. use hyper_util::service::TowerToHyperService;ÁÞúüâfc # async fn handler(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, BoxError> {ÁüÉ<9 # Ok(Response::new(Full::new(Bytes::from("hello"))))Á<†  # }ÁŽ ú”’  #[tokio::main]Áü¥ -* async fn main() -> Result<(), BoxError> {ÁüÓ A> let addr = SocketAddr::from((Ipv6Addr::LOCALHOST, 8000));Áü•
B? let listener = tokio::net::TcpListener::bind(addr).await?;矯
1. println!("Listening on http://{}", addr);ÁŠ ú loop {Áü 74 let (socket, _) = listener.accept().await?;ÁÕ úüÙ %" tokio::spawn(async move {Áüÿ 2/ let socket = TokioIo::new(socket);Á² úü¶ -* // Build our middleware stackÁüä 30 let service = ServiceBuilder::new()Áü˜
63 .layer(TraceLayer::new_for_http())ÁüÏ
30 .layer(CompressionLayer::new())Áüƒ)& .service_fn(handler);Á­úü±$! // Wrap it for hyperÁüÖFC let hyper_service = TowerToHyperService::new(service);Áúü¡da if let Err(err) = hyper_util::server::conn::auto::Builder::new(TokioExecutor::new())Áü†<9 .serve_connection(socket, hyper_service)ÁÔà .awaitÁŒÞüðEB eprintln!("failed to serve connection: {err:#}");ÁŒ¶ });Á ```ÁðúüôSP Keep in mind that while this example uses [hyper], tower-http supports any HTTPÁüÈMJ client/server implementation that uses the [http] and [http-body] crates.Áú¤š # Example clientÁ¯úü³>; tower-http middleware can also be applied to HTTP clients:Áòú”öº†¬‰Õ†üŸ*' decompression::DecompressionLayer,ÁüÊ*' set_header::SetRequestHeaderLayer,ÁÔõ£‡ü*' classify::StatusInRangeAsFailures,ÁƇüÂ52 use tower::{ServiceBuilder, Service, ServiceExt};Áüø@= use hyper_util::{rt::TokioExecutor, client::legacy::Client};Áì¹’‰¬×ôˆüí96 use http::{Request, HeaderValue, header::USER_AGENT};Á§ú”«ŒŒ¬¾ async fn main() {ÁüÔDA let client = Client::builder(TokioExecutor::new()).build_http();Áü™.+ let mut client = ServiceBuilder::new()ÁüÈ@= // Add tracing and consider server errors and clientÁü‰" // errors as failures.Áü¬# .layer(TraceLayer::new(ÁüÐNK StatusInRangeAsFailures::new(400..=599).into_make_classifier()Á ))Áü®96 // Set a `User-Agent` header on all requests.Áüè52 .layer(SetRequestHeaderLayer::overriding(ÁÜž USER_AGENT,Áüº;8 HeaderValue::from_static("tower-http demo")Áª ü…)& // Decompress response bodiesÁü¯-* .layer(DecompressionLayer::new())ÁüÝ74 // Wrap a `Client` in our middleware stack.Áü•;8 // This is possible because `Client` implementsÁüÑ  // `tower::Service`.Áìò .service(client);ÁúÌ” // Make a requestÁü®(% let request = Request::builder()Áü×&# .uri("http://example.com")Áüþ+( .body(Full::<Bytes>::default())Á´ª .unwrap();ÁÁúìÅ let response = clientÁ¤ã .ready()Á”ø .awaitÁ¬‹  .unwrap()ÁÔ¡  .call(request)Á”¼ ¬§´Ï ¾¦Õ–ã–ô úœø  # Feature FlagsÁŒ!úü!UR All middleware are disabled by default and can be enabled using [cargo features].Áæ!úüê!TQ For example, to enable the [`Trace`] middleware, add the "trace" feature flag inÁ´¿" your `Cargo.toml`:ÁÖ"ú\Ú" ```tomlÁüæ":7 tower-http = { version = "0.1", features = ["trace"] }Á<¡#ã–©#úü­#.+ You can use `"full"` to enable everything:ÁÜ#ú\à#äªüì#96 tower-http = { version = "0.1", features = ["full"] }Á<¦$ã–®$ú”²$ # Getting HelpÁÅ$úüÉ$a^ If you're new to tower its [guides] might help. In the tower-http repo
 8¦  © ¯ 8 8£R &  , ¸ 8‚¾ 8  å , æ  ç î , è 8¶Á $ ï 
ð  ñ , ó 8Ð   ø , ù  ú  , û 8¶Á $  
ƒ     õ 8    8,˜ 8 Ÿ 8æ ¢  ¥ ´ 8£R & « , ­ 8‚¾ ( 8  ¾ ë 8  Õ Ý 8£R,× 8$€  ,  , 8¶Á,ˆ $ Ž 
 8¤
L ' 8BodyÁ$ 8
¢ , ¦ 8Ð  « , ¬  ­ ´ , ® 8¶Á $ µ 
 ·  ¹  M8! 8DataÁ Ñ  Ó , Ô 8‚¾ 8Ü 8¤
'è 8ÂÈ  î 'ï 8ÇÉ % õ 8!
8=,ˆ
Ž

,
8‚¾4
8
8¤
'¥
8ÂÈ
 «
'¬
8=
% ³
+ Â
 Ã
Ê
8Ý
8 Ø
8
poll_frameÁ
 å
Ô 8
& û
8Àý
' 8ÿ
 ' 8PinÁ  Š  8Œ 8$  $ 8cxÁ§ & ©  « 8¬ 8À° '³ 8taskÁ '¹ 8k   :8à  Å $ Æ (Ö 8ÀÙ 'Ü 8³Í 'â 8·  è 8¬  ï 8Í  ö 8¤
' 8FrameÁ,  8$ˆ 'Œ 8ÇÉ  $ 8$• ' 8=,    ¢  ¤ æ  8  º 8¤W   à  Ä 8£R  Ê 8çË  Õ Ø 8üÌÖ + õ  ö ý 8Ý 8 
8
is_end_streamÁ

¡
 œ
8$
(£
8º
 «
õ
8¤
'Æ
8ÂÈ
'Ì
8ïÐ
 Û
ç
 Ü
8
 á
8£R
+    Œ 8Ý4† 8 š 8 size_hintÁL  ¦ ¬  § 8 (® 8¤
 'º 8SizeHintÁ  Å  8¤
L× 'à 8ÂÈ 'æ 8ÎÒ  ñ ý  ò 8  ÷ 8£R % œ Ô¹   Ô Ë  Ú Ÿ , Û  Ü ç + Ý  Þ æ , ß 8¸ à & á 8û 
è 8ê 8! , ó 8Ð  & ø 8¼  þ , ÿ    ,  8¶Á, &  8¼,ˆ $ Ž      ,  8‚¾4• &  8´œ % ž *¡  ¤ É K8ë „® '¾ 8ÆÂ  Ë  Í Ý , Û  Ü â + Ý  Þ á , ß 8¸ à 
ã 8ñ 8 , ü 8Ð    ,   ƒ Š ,  8¶Á,… $   Œ     Ó + ¡  ¢ ¦ 8ÿ
£ 8£R,¸ & ½ , ¿ 8‚¾ 8  ì , í  î õ , ï 8¶Á $ ö  ÷  ø , ú 8Ð   ÿ ,    ˆ ,  8¶Á $   Š       8  ž ¤ 8 8 ¦ 8æ ©  ¬ » 8£R,­ & ² , ´ 8‚¾ (½ 8  Å  8  Ü ˆ 8£R 8  ¯ , °  ± ¸ , ² 8¶Á $ ¹  º  » 8À½ 'À 8× 'Å 8p 8
Í , Ñ 8Ð   Ö , ×  Ø ß , Ù 8¶Á $ à  á  â  ä £ 
8 ò 8×õ  ø Ÿ  ù 8 $ þ 8±  &   ƒ 8 8Àˆ ' 8× ' 8ˆL   :8œ  ž (¡ 8À¤ '§ 8ש '¬ 8Í  µ  
8± Ç  È 8 debug_tupleÁ  Ô æ 8Ô  Þ  ß å , à 8Ð   ç 8Â  í   î 8ë  ú  û  7...Á  ƒ 8finishÁ4„  Š  8  ² , ³  ´ » , µ 8¶Á $ ¼  ½  ¾ 8ÀÀ 'Ã 8áS 'Ë 8ž= 8
Ô , Ø 8Ð   Ý , Þ  ß æ , à 8¶Á $ ç  è  é 8$ ,  8‚¾4† & Œ 8ÀŽ ' 8áS4“ ' 8ž=4 $ ¡  « à !8! 8° Å  Ç , È 8‚¾ 8Ð 8ÀÓ 'Ö 8áS 'Þ 8ž=  æ 'ç 8° % ï + ý  þ  8Ý4ÿ 8  8Š $–  š Ú 8$ & Ÿ 8À¡ '¤ 8ÿ
¦ '© 8¾Ì«  ®  ¯ 8° 8  ¸ $ ¹ 8üÌ» & ½  ¿ 8À 8ÀÄ 'Ç 8³Í 'Í 8k  Ö :8×  Ù (Ü 8Àß 'â 8³Í 'è 8·  î 8 'ó 8°  û  ý ¹  8$   8¤W<”   œ   8£R  £ 8Š   ¨ « 8üÌ© ¼°Eü*' Middleware for following redirections.Á+út/µ>úüB`] The [`FollowRedirect`] middleware retries requests with the inner [`Service`] to follow HTTPÁŒ£ redirections.Áµúü¹\Y The middleware tries to clone the original [`Request`] when making a redirected request.Áü–]Z However, since [`Extensions`][http::Extensions] are `!Clone`, any extensions set by outerÁüôZW middleware will be discarded. Also, the request body cannot always be cloned. When theÁüÏ\Y original body is known to be empty by [`Body::size_hint`], the middleware uses `Default`Áü¬b_ implementation of the body type to create a new request body. If you know that the body can beÁü\Y cloned in some way, you can tell the middleware to clone it by configuring a [`policy`].Áìú # ExamplesÁÿú”ƒ ## Basic usageÁúã–ü¢"–ˆ¬ÅôˆìÛ’‰üù52 use tower::{Service, ServiceBuilder, ServiceExt};Áü¯GD use tower_http::follow_redirect::{FollowRedirectLayer, RequestUri};Á÷ú¤û # #[tokio::main]Áü?< # async fn main() -> Result<(), std::convert::Infallible> {ÁüÐHE # let http_client = tower::service_fn(|req: Request<_>| async move {Áü™ 2/ # let dest = "https://www.rust-lang.org/";ÁüÌ 2/ # let mut res = http::Response::builder();Áüÿ  # if req.uri() != dest {Á¼ 
 # res = resÁü¸
>; # .status(http::StatusCode::MOVED_PERMANENTLY)Áü÷
85 # .header(http::header::LOCATION, dest);Á  # }Áü¼ XU # Ok::<_, std::convert::Infallible>(res.body(Full::<Bytes>::default()).unwrap())ÁL•  # });ÁüŸ *' let mut client = ServiceBuilder::new()ÁüÊ *' .layer(FollowRedirectLayer::new())Áôõ  .service(http_client);Á
úü˜
$! let request = Request::builder()Áü½
&# .uri("https://rust-lang.org/")Áüä
'$ .body(Full::<Bytes>::default())Á”Œ .unwrap();ÁŸúü£>; let response = client.ready().await?.call(request).await?;Áüâ! // Get the final request URI.Áü„c` assert_eq!(response.extensions().get::<RequestUri>().unwrap().0, "https://www.rust-lang.org/");Á # Ok(())Áð‹ã–úü‰ ## Customizing the `Policy`Á©úü­XU You can use a [`Policy`] value to customize how the middleware handles redirections.Áúã–ü’"–ˆìµ’‰¬Óôˆüé5ÀðüŸ&# use tower_http::follow_redirect::{ÁüÆ" policy::{self, PolicyExt},Áäé FollowRedirectLayer,Á4†Ƈú¤‘ #[derive(Debug)]Á”¦ enum MyError {Á̹ TooManyRedirects,ÁüÓ Other(tower::BoxError),ÁÕ–ùú¤ýÛñü’.+ # async fn main() -> Result<(), MyError> {Á¼Á # let http_client =ÁüÙmj # tower::service_fn(|_: Request<Full<Bytes>>| async { Ok(Response::new(Full::<Bytes>::default())) });ÁüÇZW let policy = policy::Limited::new(10) // Set the maximum number of redirections to 10.Áü¢63 // Return an error when the limit was reached.ÁüÙPM .or::<_, (), _>(policy::redirect_fn(|_| Err(MyError::TooManyRedirects)))Áüª_\ // Do not follow cross-origin redirections, and return the redirection responses as-is.ÁüŠ41 .and::<_, (), _>(policy::SameOrigin::new());Á¿úüÃ*èöüî85 .layer(FollowRedirectLayer::with_policy(policy))Áü§  .map_err(MyError::Other)ÁôÈÏ÷çú // ...ÁüöDA # let _ = client.ready().await?.call(Request::default()).await?;Á˜ûð‹ã–»follow-redirectÁÜ’EüŒE#|¸E±µÊØëü½¾Â»P4ý¿â‡8<…Çã¿54ŽŸäø7D–ÆåEitherÁ4»†5æCONTENT_ENCODINGÁ„Û ÇèCONTENT_LENGTHÁtõ Éé CONTENT_TYPEÁd ÎêLOCATIONÁD£ ßëTRANSFER_ENCODINGÁŒ¹ öì HeaderMapÁLÌæ
í HeaderValueÁ\׺îMethodÁ4ä¥ï¦’ôð=DõˆñÙtTÿòæö¸óVersionÁ<”óôÂÈ.õÆÂöíðøž=4…‚Øùíëú¾ÌŸ„¾ûɨ™3üreadyÁ,¸¥‚þk<¿Ìÿ·œØOneshotÁ<ãèLayerÁ,ýâ;<—*ƒUrlÁ©-…üa^ Tools for customizing the behavior of a [`FollowRedirect`][super::FollowRedirect] middleware.Á 0KXm~Ÿ³ÆÇ࿼KèíŽó.l -ÍL\MŒ¶îM<Ö­Nç¬3\ý {½OTНþOT¨·˜SchemeÁ4ÈšŠ¥¦’ôœÙtTáæöí¸ž<cgí»P4 ¿  ‡8<Ç  ¿54Ÿ 
¦’<0ô ,IK;=-/l*!¤ Í컆 ¥ÍìÁ† ¨ƒ†ü»jÉ»†Á†ƒ†–.Íì–.ÍÍì ÑŸ»†œ”¯”ŸÁ†œ”¯”l—
»†Á†œ”¯”¬ Ô­ ÚkmegüÊ_–.Í쳇ÏÍ칇 ÓÍ짇
 `£cbufÁ `àB¤GS
íÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ È‘= O˜éBL$ 
$
&ó‡
± 
ü»O
()**()îó‡ îÁ†˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÁ†L€
 Ã
Í있 Æ
î"ó‡é¡œö
Íž À
Ƈ+,¢¤,+Y[UWü‘<
D”
ïðñ ïƇ ðÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8ñÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
žˆ' 
'
+ó‡Á†žˆ
 ¨
üö+

òó òƇ óÁ†ü¡' 
'
,ó‡Á†žˆ$…
ì+$
üÒT
üÄP
M Create a new redirection [`Policy`] from a closure `F: Fn(&B) -> Option<B>`.Á
úü™_
\ [`clone_body`][Policy::clone_body] method of the returned `Policy` delegates to the wrappedÁüùX
U closure and [`redirect`][Policy::redirect] method always returns [`Action::Follow`].ÁlÙ
ó‡Ƈ././Íž ç
 ê
ô"ó‡ ôÁ†œ’
ô󇇪˜"ü¡
-ó‡Á†± í
acfh´”ƒ;‰‚:L  à02»P4¿03‡8<Ç04¿54(Ÿ05headerÁ$J08›µTPë09¦’<aô0:,wyik[]$5”5M4A@B13ô÷0 €·´ï«ˆ=>?@ABC¤†üŒ_\ Create a new [`FilterCredentials`] that removes blocklisted request headers in cross-originÁŒð¥ê«ˆ<<
=ü¼9üóDA Configure `self` to mark cross-origin redirections as "blocked".Á”눫ˆ<<
>ýüû"üº<9 Configure `self` to mark every redirection as "blocked".ÁL «ˆ«ˆ<<
?$ ü–
#ü× :7 Configure `self` to mark no redirections as "blocked".ÁT
«ˆ«ˆ<<
@
üó 9üŽ MJ Configure `self` to remove blocklisted headers in "blocked" redirections.Áà úüè 1. The blocklist includes the following headers:Áž ú¬¦  - `Authorization`Á  - `Cookie`ÁÜÓ  - `Proxy-Authorization`Á”ú «ˆ«ˆ<<
A$
ý4—
ü»#üñ
EB Configure `self` to remove all headers in "blocked" redirections.ÁT«ˆ«ˆ<<
Büâ$ü™DA Configure `self` to remove no headers in "blocked" redirections.Á\髈«ˆ<<
CüÚ"«ˆE´E¤ƒ<†«ˆDD
Eü·-GHHGÍ쥉 ¼ü• ¿«ˆIJ¢£JI"$')üëBõö÷ õ«ˆ öÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8÷þF ÷F
I¥‰¹‡Ž˜<‚üÜ2øù ø«ˆ ùôô¦’ö¶’¦÷ì+¦¯:ðû„ࢥ‰F êF
J¥‰¹‡Й\—<»P4 ¿KM‡8<ÇKN¿54ŸKO,68(*¶‰Qô›üÖ@= Create a new [`Limited`] with a limit of `max` redirections.Á¢¶‰PP
QmaxÁ¦Ä趉S´S¤Òü‡FC Returns the default [`Limited`] with a limit of `20` redirections.Á<Õ¶‰RR
Sü#UVVUþ¶ ü• ˜¶‰W¢W üº<úûü ú¶‰ ûÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8üþT ÆT
W¥‰¹‡ Ѩ»P4 ¿XZ‡8<ÇX[¿54ŸX\¦’<0ôX],IK;=-/l*_``_ü’ ¢ ¥©Šaü·jÅ»†Á†©Š^–.bcbc^””ɧ” ͺ”Ò”l“
a»†Á†œ”¯”¬ Э Ö@BEGüÅ^–.efghgehfë•Êü• Î Ñž– Ô¯–lÿÇ–l•‘‹ijk¢£¤ikjKMPRUWZ\üªBD­ýþÿ ý‘‹ þÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8ÿþd d
i³‡¹‡§‡­‡Ž˜ü„3T‡  € ‘‹  Þ™d d
j³‡¹‡§‡­‡$—Й<ü-Tƒ  ‚ ‘‹ ƒ ³‡¤›d d
k³‡¹‡§‡­‡ì+$¢åk¿›l×›lô›llkl³‡¹‡§‡­‡§  ‘‹¾»P4 ¿mo‡8<Çmp¿54Ÿmq×/¤,mr,HJ:<,.D*!ü×$ttÍž Üà‹uÀcuü‚8 „ à‹  c cˆ¢cµ
 `£cÛž `àB¤GS
‚ s s
uó‡± ü¶cwxyxywˆ ÛŒ ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8ˆ ˜"þŒ‡ü• ¾ÍìÛŒ Áˆ “"ÛŒÕÌüð(þ¶ »®Œz¢zVXRTü BŠ  ‰ ®Œ Š ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8 þv ¬v
z¥‰¹‡ÛŒŽ˜üßfüˆ63 Create a new redirection [`Policy`] from a closureÁü¿2/ `F: FnMut(&Attempt<'_>) -> Result<Action, E>`.ÁòúüöOL [`redirect`][Policy::redirect] method of the returned `Policy` delegates toÁÄÆ the wrapped closure.Á\æó‡à‹|}|}Íž òü• õŒ  “"ó‡ Œ ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8 üœ(Œ  ó‡”Ó˜"þŒ³
{󇹇± øÊÌÏÑ·‚:L  à~»P4¿~‡8<Ç~¿54(Ÿ~ƒ×:¤,~,_aPRAC24D5&|ÍðŒ¤ˆüã  Create a new [`SameOrigin`].ÁðŒ
ôÀðŒˆÀcˆüå8èŽ    Ž ðŒ   c cˆ¢cµ
 `£cÛž `àB¤GS
 ‚  ì
ˆ± óü×&ŠŠþ¶ Üü• ßðŒŒ¢Œ "ü„BD‡ ‘ ðŒ ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8þ 
Œ¥‰¹‡$•Ž˜<$×%ü×'ƒ%†%x%{%ü¢%q%„Íf%4ã[%ü×£R%U%G%J%¼›?%$¼2% %#%%%%%ô$÷$´§
üô;8 Trait for the policy on handling redirection responses.Á°ú
# ExampleÁÂúüÆ# Detecting a cyclic redirection:Áêúã–üö%" use http::{Method, Request, Uri};Áüœ" use std::collections::HashSet;Áü¿GD use tower_http::follow_redirect::policy::{Action, Attempt, Policy};Áú¤‹ #[derive(Clone)]Áä  pub struct DetectCycle {Áü½%" uris: HashSet<(Method, Uri)>,ÁÕ–éúüí-* impl<B, E> Policy<B, E> for DetectCycle {Áü›LI fn redirect(&mut self, attempt: &Attempt<'_>) -> Result<Action, E> {Áüè\Y if self.uris.contains(&(attempt.method().clone(), attempt.location().clone())) {ÁüÅ  Ok(Action::Stop)Á¤æ } else {Áüûb_ self.uris.insert((attempt.previous_method().clone(), attempt.previous().clone()));ÁüÞ " Ok(Action::Follow)Ál

L
Ö,™
Õ–
ã–
Ÿ ¡Ÿ ¡Îìü§
ø ¸
Ñ¢ »
Ÿä*䣤¢£¤¢£¤DFIKüž CüÄ
XU Invoked when the service received a response with a redirection status code (`3xx`).Á¡ úü© WT This method returns an [`Action`] which indicates whether the service should followÁ¤…  the redirection.ÁD¡  ” ¥ä ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8褟 ª Ÿ
¢¥äÁ†žˆ Ž˜ ü™3üç \Y Invoked right before the service makes a request, regardless of whether it is redirectedÁ
 or not.ÁØ
úüà
MJ This can for example be used to remove sensitive headers from the requestÁü²)& or prepare the request in other ways.Áàúüè,) The default implementation does nothing.ÁTœ˜  — ¥ä ˜ ôô¦’ö¶’¦÷ì+¦¯:ðû„à¢Á†Ÿ §Ÿ
£¥äÁ†žˆ_requestÁD²üÜ,üÕNK Try to clone a request body before the service makes a redirected request.Á¨úü°85 If the request body cannot be cloned, return `None`.ÁíúüõWT This is not invoked when [`B::size_hint`][http_body::Body::size_hint] returns zero,ÁüÑKH in which case `B::default()` will be used to create a new request body.Á¡úü©.+ The default implementation returns `None`.ÁTßš  ™ ¥ä š Á†ü¡Ÿ êŸ
¤¥äÁ†žˆ_bodyÁ,ñü¡I8¦§¡¨§¨¦ ¦Ñ¢ ©Îìè ¬ŸèÁ†žˆã©ª«¢£¤«©ªZ\_a[]üñBœ  ž  œ ã  ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8ž 褥 ý¥
©8Á†žˆè$‚Ž˜üä2Ÿ    Ÿ ã   ôë¥ ò¥
ª8Á†žˆèЙüÉ+¡ ¢  ¡ ã ¢ Á†ü¡¥ ×¥
«8Á†žˆèì+$Þü¢I­®¡¯®­¯þ¶ §ü• ªÎ쿎 ­Ÿ¿Ž¥‰¹‡þ°±²¢£¤±²°Z\_a[]üòB£ ¤ ¥  £ þ ¤ ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8¥ þ¬ þ¬
°¥‰¹‡¿ŽŽ˜<‰üå2¦ §  ¦ þ § Ṭ ó¬
±¥‰¹‡¿ŽЙüÊ+¨ ©  ¨ þ © ¥‰Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¥‰¬ ج
²¥‰¹‡¿Žì+$ßœêü£FC An extension trait for `Policy` that provides additional adapters.Á³³äüê¡
³ää ´¸´¸¸´ü´ vü„[X Create a new `Policy` that returns [`Action::Follow`] only if `self` and `other` returnÁ¬ä `Action::Follow`.Áþúü†^[ [`clone_body`][Policy::clone_body] method of the returned `Policy` tries to clone the bodyÁ¼é with both policies.Áúl²ÛŸúã–¬³ôˆìÍ’‰üïWT use tower_http::follow_redirect::policy::{self, clone_body_fn, Limited, PolicyExt};ÁËúŒÓ enum MyBody {Á¬é Bytes(Bytes),ÁÔƒ Full(Full<Bytes>),ÁÕ–¬úü´JG let policy = Limited::default().and::<_, _, ()>(clone_body_fn(|body| {Áüƒ*' if let MyBody::Bytes(buf) = body {Áü²,) Some(MyBody::Bytes(buf.clone()))Á„ã
} else {Á„ø
NoneÁL ÖD  }));Áã–· ¥äë‘íí¼Kð¬ ñ­ 
~ƒü•&tü°!]Z Create a new `Policy` that returns [`Action::Follow`] if either `self` or `other` returnsÁ¬’"áý¬"úü´"^Œþ¼—#óþ³#úl»#²ÛÍ#ú<Õ#ã–üá#PM use tower_http::follow_redirect::policy::{self, Action, Limited, PolicyExt};Á¶$ú¤¾$ÒÝ”×$ðþÌî$‹ÿtŒ% // ...Á,Ÿ%Õ–©%úü±%SP let policy = Limited::default().or::<_, (), _>(Err(MyError::TooManyRedirects));Á<‰&ã–˜&¥äë‘­Nž¬XŸ­XøŒþñeÆ¥ä둳¡¹º»¹º»³ó… &„† ž&§” ¡&,ê&®†dÛ&Ɔdü&
¸¥äë‘ü•¯”$¤&¹
,ª&PRUWZ\ü',¥½½Îì ’'¾Â´¸Â¾ üÀ'vÃ'ë‘íí¼Kð¬ ñ­ ð­s\
Tvá둼¡¿ÀÁÁ¿À¼ó… Ç'„† Ê'§” Í'Íì,—(Ÿü•¯”dˆ(Ɔd©(
¾ë‘ü•¯”$Ð'¹
,Ö'iknpsuüæ(té(ë‘­Nž¬XŸ­XøŒþñeÆë‘¼¡ÃÄÅÅÃļó… ì(„† ï(§” ò(Ò,»)ãd¬)ƆdÍ)
Âë‘ü•¯”$õ(¹
,û(PRUWZ\Œÿ+ü‡*HE A redirection [`Policy`] with a reasonable set of standard behavior.ÁÐ*úüÔ*JG This policy limits the number of successive redirections ([`Limited`])ÁüŸ+_\ and removes credentials from requests in cross-origin redirections ([`FilterCredentials`]).ÁDˆ,íí¼Kð¬ ñ­ ð­s\
Tvᶉ«ˆ´ñ,üµ,;8 A type that holds information on a redirection attempt.Á<ü,8ÈÈÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-88¹)Hï-8ÉÊËÌÍ„-ìŽ-4™-ÇÇ“ýì±-4¼-ÇÇ –8¥¥¦Š§ˆÔ "1éµsåväÔ-Dß-ÇÇ 8Ü÷üö-&|.ÇÇõ—ä¢.D­.ÇÇƘ¤Ã.–8ÏÏ¿–ÐÑÒÓÔÈ.üˆ/"üÞ.%" Returns the redirection response.Á4/ª  ª ¿–“ýÎ –/Î
Ð8$—/ü‡0"üÌ/63 Returns the destination method of the redirection.Á4Ž0«  « ¿–õ—Î •0Î
Ñ–8$0üƒ1!üË030 Returns the destination URI of the redirection.ÁDŠ1¬  ¬ ¿–ƘÎ “1Î
Ò–8$”1ü‘2+üÈ1DA Returns the method for the previous request, before redirection.Á|˜2­  ­ ¿–õ—Î ¨2Î
Ó–8$©2ü˜3!üç2,) Returns the URI of the original request.ÁDŸ3®  ® ¿–ƘÎ ¨3Î
Ô8$©3\´6Ö×ü‚7üÆ674 Returns `true` if the `Action` is a `Follow` value.ÁL‰7¯  ¯ Õ “7Õ
Ö$”7ìÎ8ü”852 Returns `true` if the `Action` is a `Stop` value.Á<Õ8°  ° Õ Ý8Õ
×$Þ8üÚ9"ÙÚÚÙþ¶ ß9ü• â9Û¢Û "üƒ:<D†:± ² ³  ±  ² ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8³ þØ :Ø
Û¥‰¹‡$”: š:üÝ:AÝÞÝÞþ¶ â:ü• å:ع‡,˜;þߢß+-02ü¥;<D¨;´ µ  ´ þ µ ÇLJ8É 8Ê®8˼8ÌÌ8Íã8¹)Hï-8þÜ ±;Ü
ߥ‰¹‡$¶; ¼;üÎ<*LÑ<· ¸  · Ü÷ ¸ Ü÷ à<
àÛ<rhsÁæ<©O¬OOžOOOOOä¥oO$ÇÄÓVO´í:O¤… O„›
O̱ëNÐNÓN·NºN£N¦N”N—N†N‰NxN{NiNlNTNWN|¤INì¹<NÜ„ç3Ntý&NNNDš N÷MúMüÜYéMìMÚMÝMËMÎM¤Ö¹M”ð§M´ˆšMD¤‹MÄ¥!ÊÊŒQÌÕ-Ït<˜ùRG 𕤙"üÄ!PM Create a new [`FollowRedirectLayer`] with a [`Standard`] redirection policy.Á "à©
ôÑ"¡ˆˆÍì Ö"ã 
üÊ#%üö"OL Create a new [`FollowRedirectLayer`] with the given redirection [`Policy`].Á\Ñ#ã
Õ-4Ý#ü¢$P¤¡ŒŒÍìñ‘ §$ó… ª$Øñ‘,Þ$Øë‘,ì$¾‘ŽŽBDGIdù$<þ$ŠŠþ‘ü£%*,¦%¹  ¹ ¾‘ñ‘¾‘ñ‘Š ¬%Š
Žñ‘ë‘$­%£R,³%Ì“(¤¶­ ˜(ØØýQÛ£RÜÕ-Gt²¡}
ñ‘š•JLäƒ)ü³(KH Create a new [`FollowRedirect`] with a [`Standard`] redirection policy.ÁŠ)ñ‘Ò¯
ñ‘£R,Ž)üé*%üã)SP Returns a new [`Layer`] that wraps services with a `FollowRedirect` middleware.Á»*úüÃ*! [`Layer`]: tower_layer::LayerÁ,ð*à©
ñ‘ü½+3¤¡¶­ Â+ó… Å+ß­,ê+þ‘èéê'),.üÆ,/ü÷+JG Create a new [`FollowRedirect`] with the given redirection [`Policy`].Á\Í,ñ‘ë‘þ‘
ñ‘ë‘£R,Ù,Õ-4ã,üà.=ü¬-RO Returns a new [`Layer`] that wraps services with a `FollowRedirect` middlewareÁüƒ.*' with the given redirection [`Policy`].Á².úüº.!º±Œç.둾‘
ñ‘ë‘Õ-4ù.ü‚0äÓ<â<š¤¡œœš ’“œ“* ˆˆ=ж’ì+w­õÂ; µ8â<äù0Í콸<0Íì’“ ™0Íìè œ0*’“œ“üß07Íìá“<‡0Ø’“,™1.á“$­1³á“<´1Ÿèá“’“œ“*
ÌÄ1Øè,à1Ú’žŸ ¡* *
* * *
 ¡ãåßáÛÝlí1Dò1˜˜‚¸T”2,™2˜˜ݹ\¯24´2˜˜ëë³SïáSðïSñÕ-ò®8óŽTôÄõ¡Töì+fËî¼Éü=Å’“á“èüá2OTä2º » ¼  º Ú’ » ÌÌkÎwakerÁ¸Ï local_wakerÁ¸ÐextÁ¸Ñ_markerÁ¸Ò_marker2Á¸f'EwÚ]¾å¼ œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤ÃÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ú’œ“*
˜ ï2˜
 á“½¸’“è$ô2üÌú2üà3=$ã3½  ½ Ú’œ“Ú’œ“* ˜ è3˜
¡á“½¸’“è$í3reqÁ÷3üŸ<Ò¤£Ó<¤â<¥¡¦£¥¦¤
ñ‘ôô¦’ö¶’¦÷ì+¦¯:ðû„ࢢ—* ˆˆ=ж’ì+w­õÂ; µ8â<äŒ=Í좗<§<Íì¹Â<°<é¸ ¹<*ñ‘¼Áüò<7¶­ ¤<Ï­,¬=.¢—$À=³¢—<Ç=Ÿè¢—ñ‘¼Á*
Ì×=¤–§¨ƒØ„بeg§©£¥¨ª\ø=4ý=¢¢Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
þÁ¿Ãü°>I$³>¿ À Á „¾„¾¾Ì†¾ ˜X$]È=„kt• ¿ ¤– À ÌÌkÎм¸Ï¼¸Ð¶¼¸ÑǼ¸Òܼ¸f'EwÚ]¾åÁ œØžØŸØÈ Øˆ¡Ø¢Ø´‰‰Nµý¤Ã¤–ƒØ¢ Â>¢
¨ñ‘¢—¹Âè$¸>üÌÎ>Ìû@¨¿›©×›©ô›©©¨©ñ‘¢—¹Âè¾  ¾ æ
æ
á‰è
maskÁé
indicesÁê
entriesÁë
extra_valuesÁì
dangerÁ}º?*™
cººþ‰»£R¾¼ is_sensitiveÁ¾©¡yð<Ôcª,ÄL¨¿›ª×›ªô›ªª¨ªñ‘¢—¹Âè ûÉÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙÜ÷ ·UŠáSïSŒÕ-®8ŽŽTÄ¡Tì+¶B[³0À€ñ‘¢—èüýX0¬¬þ¶ ‚Y.¥‰$žY³¥‰<¥Yé—­®-/ü´Y$·Y   é—Æû« ¼Y«
­¥‰$ÁYüí[[tð[à Ä Å  à é— Ä ¥‰ Å ë‘«¡¯°¯° …\«ó… ÿ[Ñ¢ ‚\Ÿë‘¥‰žˆd»\
®¥‰ë‘žˆ$Š\ì+$\Õ-4š\LNQSüÞ^kTá^Æ Ç  Æ  Ç Á†ü¡¡²³´³´² ý^ë ì^ ï^Ñ¢ ò^ŸÁ†žˆd¥_.Á†$º_³Á†<Á_
±Á†žˆÕ-4õ^ì+$_lnqsvxü“a9\aÈ É  È  É Ü÷»Ë ¬a
µrelativeÁD¢abaseÁ$²a„ŒIüA
> Tools for classifying responses as either success or failure.ÁD”IÀì°ÀÊÒ·®ÄÌá‰LN
æ
¸¦’<Y
ô¹=Db
ˆºÙtTl
»
InfallibleÁTŒ
ˆê½×˜
¤,¾ PhantomDataÁ\¥
¿ÇÔ¿ÍZDÉ
Ψ¥p¼Ó
ñ©Úo¤ì
ëªæp„‚
÷«‰s|²
¬òs¼â
Ÿ®¸tÌû
¥¯$G
:=+. }
œƒ
þêìœ
Òü´&
¼Ã
éÎñë÷÷øùöu” ·À³A\ ÊÀæH„-ÀÀÄšu„?®ÀÅõD`ÀÆá‰Luæ
ÀÈ=D€ˆÀÉפ,ÀË
NonZeroI32ÁTŸÌ—ÀÌ,ÄÆ´¤¦–”V‡$nvxfhY[|šBl  ŘÎü´ 3 Řá›ÍÍ
Î ÜÛü×;8 Converts an `i32` gRPC status code into a [`GrpcCode`].Áúü—C@ Unrecognized codes (outside 0-16) map to [`GrpcCode::Unknown`].ÁŘÐëÐÜý$€ŘÏÏ
л,…üž"ŘÒëÒüÇ"¥›ŘÑÑ
Ò»¤Æ&á›Ôüá&*dä&À–ÖÓÓ
ÔcodeÁ$ñ&üƒ2%ô¡Ö´Ö¤¯2<²2ô¡ÕÕ
ÖÌã2ô¡ØÙÚ¤²3üƒ3*' Create a new [`GrpcErrorsAsFailures`].Á¹3ô¡××
Øüÿ85ü430 Change which gRPC codes are considered success.ÁÕ4úüÝ41. Defaults to only considering `Ok` as success.Á“5úü›5-* `Ok` will always be considered a success.ÁÍ5úlÕ5²Ûç5úüï5ZW Servers might not want to consider `Invalid Argument` or `Not Found` as failures sinceÁüÎ6# thats likely the clients fault:Áö6ú\þ6 ```rustÁüŽ7?< use tower_http::classify::{GrpcErrorsAsFailures, GrpcCode};ÁÒ7úüÚ70- let classifier = GrpcErrorsAsFailures::new()Áü80- .with_success(GrpcCode::InvalidArgument)ÁüÄ8*' .with_success(GrpcCode::NotFound);Á<ó8ã–d†9ô¡Řô¡××
Ù$—9ÄÜ$9ü¾;2ü‚:]Z Returns a [`MakeClassifier`](super::MakeClassifier) that produces `GrpcErrorsAsFailures`.Áä:úüì:MJ This is a convenience function that simply calls `SharedClassifier::new`.Á|Å;®®šu°ºu¡°íÙ©Ù)¤ô¡××
Úü§<.ô¡ÜÝÞàÁÂÃÅÞàŒÜ<dá<ÛÛ•£„†=\‹=ÛÛÊ¢ü·=„Œº=Ê ô¡ Ê ˆˆ=ж’ì+w­õÂ; µ8¥‰·º»È¼ˆ½¾µv¿ˆ'PÂc ()ô¡Áô¡ÂÛßß ë=Ûþ¶ Ì=
Þ¥‰$Ø=resÁæ=!ü¶Cht¹CË ô¡ Ë òéÛáá ØCÛÍìŒë ÈCÄcŒëd‡DŒë<D
àŒë$ËCerrorÁ,ÑC<>üûE,Ê¢ãäåËÌÍä匮Fd³Fââ•£üÙFUdÜFÌ Ê¢Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ Ì ýÈÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ê¢Ëâ €Gâ
ä$éFtrailersÁDïFüŸKht¢KÍ Ê¢ Í Œë£îâææ ÁKâºë ±KËëdðKÛë<ÿK
åŒë$´K÷ê,ºK-/ü‘O&•£èÅcèü¾O4ÁOÎ Ï Ð  Î •£ Ï  c cˆ¢cµ
 `£cÛž `àB¤GS
Ð ‚ ç ÅOç
è$ÆO± ÌOü›Qx´©QÑ  Ñ ýÈá›ï£ ÎQ
é¡T<ÅQöolÞQ¤šR<§R ¯R ûS ¹R ÒR , ºR8$»R& ¿R8$ÀR$ ÄR, ÆR8¹
,ÇR& ÌR8¼,ÍR*ÔR ×R ôS
8åR8èR8Û$ìR ðR öR8»,ñR øR, úR8$ûR €S ¤S8»,S8$¦S «S êS84½S8¹q„ÄS'ÔS, ÖS8¹
,×S% ÜS% õS4˜Vé¿›ë×›ëô›ëëéë á›øÂ¬Ü
Έ
öu” ·ìî³A\ Êìï¦H„-Àìðá‰LKæ
ìò=DVˆìó×j¤,ìô,y{ikY[$DKM;=De.ü… ö÷ö÷ÍìÈ¥ ŠÍìÎ¥ Ž¥øü¬,ºÈ¥Î¥Ž¥õõ
øÈ¥Î¥ò>D¾± ËüˆHúûûú«÷ ¼÷ ¿cÈ¥Ž¥üÀcü+-02ü×8ÚÒ Ó Ô  Ò Ž¥ Ó  c cˆ¢cµ
 `£cÛž `àB¤GS
Ô ‚ ù Þù
üȥΥ± åüÍŠþÿ…DþÿΥȥÁ˜"…DDμ÷ ÕÍìÑûÀÈ¥„š–"Î¥Áûü³#«÷ ÒŽ¥ƒÁÂÃŃ,.wysuŒÞýýÑû„€\…ýý‰s£Rì±ìÊ…ªùPiþ·È¥ÂÎ¥ü¼Œ¿Õ Ž¥ Õ ˆˆ=ж’ì+w­õÂ; µ8­‡·º»È¼ˆ½¾µv¿ˆ'PÂc ()Ž¥ÁŽ¥Âý ðýž– Ñ
ƒÈ¥Î¥Ñû­‡Åéë)+üÖ m Ö Ž¥ Ö ¯”¤ÿý ø ý§” è Äc¯”Œ§
¯”

ȥΥÑû¯” ÷ê DFü†ˆ…DŠŠˆÎ¥È¥Ë˜"Ñû¼÷ ŽãûD‘ÊÈ¥–"Î¥‘‚üâ#«÷ Ž¥ŒËÌÍŒ%'gilnŒd’Ñûü°U× Ž¥Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ × ýÈÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ž¥Ë ×
ŒÈ¥Î¥ÑûÐíüÍmØ Ž¥ Ø ¯””…ŽŽ ï§” ßÿ€Œž
ȥΥÑû¯”÷ê9;äó
Ä÷
Ÿ¥öu” ·¦H„ ÀÆI„2 Òšu„D ®ÙtTa ×w ¤,¾t ½£˜, Ž~np^`„[ Qq BDœ| 5äÆ
‡¦šœü¯
. üé
, ) Creates a new `StatusInRangeAsFailures`.Áš ú # PanicsÁ³ úü» T Q Panics if the start or end of `range` aren't valid status codes as determined byÁì”  [`StatusCode::from_u16`].Á úü¾ l i [`StatusCode::from_u16`]: https://docs.rs/http/latest/http/status/struct.StatusCode.html#method.from_u16Á
½£½£¾¿£¹À£þÁ£ exhaustedÁ1¥œMu7·P‡¦
št,º
üÙ1 ü“Z W Creates a new `StatusInRangeAsFailures` that classifies client and server responses asÁ
failures.Á úüŒH E This is a convenience for `StatusInRangeAsFailures::new(400..=599)`.Áüà ‡¦
ü¹; üµE B Convert this `StatusInRangeAsFailures` into a [`MakeClassifier`].Áÿ úü‡- * [`MakeClassifier`]: super::MakeClassifierÁ¤À ‡¦®®šu°ºu¡°íÙ©Ù)¤‡¦
œ ü¤1 ‡¦žŸ ¢ÁÂÃÅ¢ ŒÜ Ò¦ \” ÒÒÆIÔæIÕøI¬Äë䂊än‡¦ÁüÍŠ ŒÐ Ù ‡¦ Ù ëè·º»È¼ˆ½¾µv¿ˆ'PÂc ()Œ’‡¦Â¡¡  þ¶ â
 ¥‰ Åéü üæm té Ú ‡¦ Ú ŒëŒ’££ ˆ ºë ø Ë댷 Ûë
¢Œë ÷ê, -/üä/ Ò¦¥Åc¥üš8  Û Ü Ý  Û Ò¦ Ü  c cˆ¢cµ
 `£cÛž `àB¤GS
Ý ‚ ¤ ¡ ¤
¥ ± ¨
üš#
j m ^ a R U F I üŸ"
? üšÅ
6 9 * - Ää
ü›<
9 Trait for producing response classifiers from a request.ÁØ
úüÜ^
[ This is useful when a classifier depends on data from the request. For example, this couldÁü»#
include the URI or HTTP method.Áß
úüã]
Z This trait is generic over the [`Error` type] of the `Service`s used with the classifier.ÁüÁ?
< This is necessary for [`ClassifyResponse::classify_error`].Á
úü…^
[ [`Error` type]: https://docs.rs/tower/latest/tower/trait.Service.html#associatedtype.ErrorÁ
°°äüäÙ
°ää ±²³´±²³´Íì¥ä±ü­}
À“œü¾k
“œÁ¥ä²üØ!
“œÂ¥ä³üƒ 
‹œP¤œEµœ0МÍìÀœ”ž
ÍìÛœüú A
ÊÛœüŒ .
ÛœËÀœü˜ !
œ.®#¿´ü­|
üƒ%
" The response classifier produced.ÁT²
°°Œž
ü° (
% The type of failure classifications.ÁÝ
úüå F
C This might include additional information about the error, such asÁü°
H
E whether it was a client or server error, or whether or not it shouldÁäý
 be considered retryable.Ád£
°°üú @
ü¶ ?
< The type used to classify the response end of stream (EOS).Á\ÿ
°°üø C
üÁ 2
/ Returns a response classifier for this requestÁ|û
Þ ß  Þ ¥ä ß ô드°µµ Ž
°
´¥äÁ†$
Þ¿
!#Üž
··«÷ £
¬§¸ 
üƒP
üÀ>
; Create a new `SharedClassifier` from the given classifier.ÁŠ
È¥¬§ôû„º
ØÈ¥
¸È¥ºuTŽ
üÿU
ºº«÷ 
ôû„»
ɤ
¬§»¼½¾²³±´¾8:ŒÛ

¹¹Ãû„„
\‰
¹¹Úý

¹¹È¥üÅC

à á  à ¬§ á ô묧±¹¿¿ Û
¹ Ø
¾È¥Á†
_reqÁ$â
$&Ô½%
ü´`
] Trait for classifying responses as either success or failure. Designed to support both unaryÁü• S
P requests (single request for a single response) as well as streaming responses.Áé
úüí N
K Response classifiers are used in cases where middleware needs to determineÁü¼!N
K whether a response completed successfully or failed. For example, they mayÁü‹"K
H be used by logging or metrics middleware to record failures differentlyÁœ×"
 from successes.Áë"
úüï"I
F Furthermore, when a response fails, a response classifier may provideÁü¹#O
L additional information about the failure. This can, for example, be used toÁü‰$O
L build [retry policies] by indicating whether or not a particular failure isÁtÙ$
retryable.Áè$
úüì$P
M [retry policies]: https://docs.rs/tower/latest/tower/retry/trait.Policy.htmlÁ„Ç%
ÀÀäü½%½
Àää ÁÂÃÅÇÁÂÃÅÇÍì¥äÁ”ø'
¥¯Íì¥äÂüÔ(A
Ê̯üæ(.
̯Ë­¯üò(!
į.ݯ#î¯ÇÅÃŒø'
üÞ%A
> The type returned when a response is classified as a failure.Á¤&
úü¬&B
? Depending on the classifier, this may simply indicate that theÁüó&C
@ request failed, or it may contain additional information aboutÁü»'8
5 the failure, such as whether or not it is retryable.Ádý'
ÀÀüÔ(@
ü(?
ÝŸ\Ù(
ÀÀü¡1…
ü›)4
1 Attempt to classify the beginning of a response.ÁÔ)
úüÜ)F
C In some cases, the response can be classified immediately, withoutÁü§*5
2 waiting for a body to complete. This may include:Áá*
úüé*1
. - When the response has an error status code.ÁüŸ+@
= - When a successful response does not have a streaming body.Áüä+?
< - When the classifier does not care about streaming bodies.Á¨,
úü°,H
E When the response can be classified immediately, `classify_response`Áüý,G
D returns a [`ClassifiedResponse::Ready`] which indicates whether the矃-!
 response succeeded or failed.Áï-
úü÷-F
C In other cases, however, the classifier may need to wait until theÁüÂ.G
D response body stream completes before it can classify the response.ÁüŽ/D
A For example, gRPC indicates RPC failures using the `grpc-status`Áü×/8
5 trailer. In this case, `classify_response` returns aÁü”0D
A [`ClassifiedResponse::RequiresEos`] containing a type which willÁüÝ0?
< be used to classify the response when the body stream ends.ÁŒ¤1
â ¥ä â ˆˆ=ж’ì+w­õÂ; µ8Á†·º»È¼ˆ½¾µv¿ˆ'PÂc ()­¯̯ÀÄÄ Õ1
À ¶1
Ã¥äÁ†$Â1
ÅéÐ1
!#üƒ4h
´¬2
 Classify an error.ÁÇ2
úüÏ2_
\ Errors are always errors (doh) but sometimes it might be useful to have multiple classes ofÁü³3K
H errors. A retry policy might allow retrying some errors and not others.Át†4
ã ¥ä ã ¹‡­¯ÀÆÆ ¥4
Àü• •4
Äc¹‡dÔ4
¹‡<ã4
ť乇$˜4
÷ê,ž4
<>ü«A
üñ4:
7 Transform the failure classification using a function.Á°5
úl¸5
²ÛÊ5
ú<Ò5
ã–üÞ5
 use tower_http::classify::{Áü‚69
6 ServerErrorsAsFailures, ServerErrorsFailureClass,ÁüÀ6,
) ClassifyResponse, ClassifiedResponseÁ4ñ6
Ƈüü6%
" use http::{Response, StatusCode};Áô¦7
 use http_body_util::Empty;Á¬É7
ôˆã7
úüë7T
Q fn transform_failure_class(class: ServerErrorsFailureClass) -> NewFailureClass {Á¬Ä8
 match class {ÁüÞ8,
) // Convert status codes into u16Áü9=
: ServerErrorsFailureClass::StatusCode(status) => {矄98
5 NewFailureClass::Status(status.as_u16())ÁlŽ:
®âü :#
// Don't change errors.ÁüÈ:7
4 ServerErrorsFailureClass::Error(error) => {Áü„;-
* NewFailureClass::Error(error)Ál¶;
®âLÈ;
Ö,Ö;
Õ–à;
úÔè;
 enum NewFailureClass {Á¤‡<
 Status(u16),Á´ <
 Error(String),Á,»<
Õ–Å<
úüÍ<_
\ // Create a classifier who's failure class will be transformed by `transform_failure_class`Áü±=^
[ let classifier = ServerErrorsAsFailures::new().map_failure_class(transform_failure_class);Á”>
úüœ>&
# let response = Response::builder()矂>2
/ .status(StatusCode::INTERNAL_SERVER_ERROR)Áüþ>$
! .body(Empty::<Bytes>::new())Á”§?
‘ù¾?
úüÆ?A
> let classification = classifier.classify_response(&response);ÁŒ@
ú¬”@
 assert!(matches!(Á¼®@
 classification,ÁüÊ@D
A ClassifiedResponse::Ready(Err(NewFailureClass::Status(500)))Á<“A
 ));Á<ŸA
ã–Œ®A
¥äÎ¥‰s£Rì±ìÊ…ªùPiþ·¥äÎ¥ÀÈ…DÉÈÉÀ¼÷ ÀA
ãûDÃA
,B
–"Î¥­¯üŸB&
Î¥–И"ÑûD½B
Ç¥äÎ¥Ñû$ÍA
± ÓA
bdgiƒC
üüBL
I Trait for classifying end of streams (EOS) as either success or failure.Á\ÓC
ÊÊäüÉC™
Êää ËÌÍÏËÌÍÏÍì¥äË”’D
¡ÒÏÍÌŒ’D
üåC(
Àd—D
ÊÊüåDV
üªD6
3 Perform the classification from response trailers.ÁdèD
ä ¥äÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ä ýÈÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
©ÒÊ ŒE
Ê
Ì¥ä$õD
ÐíDûD
ü˜Gh
´ÁE
™½ÜE
úüäE_
ŽüÈFK
®¾tG
å ¥ä å ¹‡©ÒÊÎÎ ºG
Êü• ªG
ÙÀdéG
éÀ<øG
ͥ乇$­G
÷ê,³G
13ü“I
ü†H:
®ÀÅH
úüÍHA
> See [`ClassifyResponse::map_failure_class`] for more details.ÁŒ–I
¥äÎ¥‚ÏÊÐ…DÑÐÑʼ÷ ¨I
ãûD«I
,õI
–"Î¥©Òü‡J&
Î¥çØ˜"ÑûD¥J
Ï¥äÎ¥Ñû$µI
± »I
bdgiôO
ü¤Mc
` A [`ClassifyEos`] type that can be used in [`ClassifyResponse`] implementations that never haveÁüˆN$
! to classify streaming responses.Á­N
úü±N]
Z `NeverClassifyEos` exists only as type. `NeverClassifyEos` values cannot be constructed.Á„šO
¥ÓÓÒ «O
Ö¨¬Äë䂊änÔÕ "ü´O"
T´O
ÒÒÇÔFu\»Ÿ”ÜO
4ÜO
ÒÒˆê)?ÈXM´­üóO+
¥××Ò øO
Ö¨ØÙÚËÌÍÙÚ%'Œ¥P
dªP
ÖÖüÁPV
dÄP
æ Ö¨Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ æ ýÈÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Ö¨ËÖ éP
Ö
Ù$ÑP
 _trailersÁL×P
ü’Ri
t•R
ç Ö¨ ç ¹‡×ßÖÛÛ µR
Öü• ¤R
ÙÀdäR
éÀ<óR
Ú¹‡$§R
_errorÁ4­R
68üøS*
¥ÝÝÒ ýS
Ö¨ÞÀcÞü©T8
¬T
è é ê  è Ö¨ é  c cˆ¢cµ
 `£cÛž `àB¤GS
ê ‚ Ü °T
Ü
Þ$±T
± ·T
Ü W
¦©àá¤óW
üÂW,
) Create a new [`ServerErrorsAsFailures`].ÁúW
¦©ßß
àüÔY2
ü­XH
E Returns a [`MakeClassifier`] that produces `ServerErrorsAsFailures`.ÁúX
úü‚YM
¡å|ÛY
®®šu°ºu¡°íÙ©Ù)¤¦©ßß
áü½Z0
¦©ãäåçÁÂÃÅçåŒôZ
dùZ
ââü©„¦[
\«[
ââÒÒÆIÔæIÕøI¬Äë䂊änü©üê[„
Β[
ë ¦© ë ëè·º»È¼ˆ½¾µv¿ˆ'PÂc ()¦©Á¦©Ââææ ž\
âþ¶ ÿ[
奉$\
Åé™\
üÐ^h
tÓ^
ì ¦© ì Œë°èâèè ò^
âºë â^
Ëëd¡_
Ûë<°_
çŒë$å^
÷ê,ë^
-/üÆb.
ü©êÅcêüûb8
þb
í î ï  í ü© î  c cˆ¢cµ
 `£cÛž `àB¤GS
ï ‚ é ‚c
é
ê$ƒc
± ‰c
„žIüK H [`Service`]s that return responses without wrapping other [`Service`]s.ÁL úüPc ` These kinds of services are also referred to as "leaf services" since they sit at the leaves ofÁÌ´  a [tree] of services.ÁÎ úüÒF Ê´ü™? < [tree]: https://en.wikipedia.org/wiki/Tree_(data_structure)ÁD¦IŒèOüÀO'$ Alias for a type-erased error type.ÁDñOžŒ¡ˆˆ¢ˆl }.xϾ ÌìÅŽ¤òü:HE A redirection [`Policy`] that combines the results of two `Policy`s.Áƒúü‡C@ See [`PolicyExt::and`][super::PolicyExt::and] for more details.Áýîïïîü’  ƒ†ð­s\
Tváðñ(*-/$  íí»†$—  ííÁ†(
Ô-óôóôü’­«Ø»†
ØÁ†
ƒ†õÙõæèë툊ð  𠃆ƒ†ò
Ôò
õ»†Á†ß Û.÷ø÷øü’ŽŠ »†Š Á†ƒ†¾ÁÅÈ(á/úûûúü’¿c»†¿cÁ†ƒ†üÀcüLOSVŽñ ò ó  ñ ƒ† ò  c cˆ¢cµ
 `£cÛž `àB¤GS
ó ‚ ùáù
ü»†Á†<±C8è0þÿÿþü’WV³»†ˆÒƒ†´Šˆƒ†ýý
»†Á†̱
ü54
1 A redirection [`Policy`] created from a closure.Áj
úün+
( See [`clone_body_fn`] for more details.Á
Íž È
Ƈ²t˜ˆ p­ƒ 
Ñ
ó‡(£
1ÍžlØó‡È
ƇÙŽUWô  ô ƇƇ£

ó‡§ ª
2ˆˆÍžŠ ó‡È
Ƈ-0äÛünTQ A redirection [`Policy`] that removes credentials from requests in redirections.ÁŒæ«ˆÈ ¨áÈŠŒŽÄþ”þ00ı”±0„Ï00(Ì3«ˆÙ"$õ  õ «ˆ«ˆÌ
o(Ó4«ˆÀc"$ö ÷ ø  ö «ˆ ÷  c cˆ¢cµ
 `£cÛž `àB¤GS
ø ‚ Ó
Ʊ̔•ü'OL A redirection [`Policy`] that limits the number of successive redirections.Á< ¶‰§]L[0…OØ„®K(
5¶‰045¶‰ÙOQù  ù ¶‰¶‰
œ 6¶‰(7¶‰šÀcš"$ú û ü  ú ¶‰ û  c cˆ¢cµ
 `£cÛž `àB¤GS
ü ‚ 
šÆ±Ìœðü:H…ïƒúü‡A> See [`PolicyExt::or`][super::PolicyExt::or] for more details.Áûœœü’ þ ©ŠøŒþñeÆžŸ(*-/ ŠX»†$” XÁ†(Ò8¡¢¢¡ü’­«ŽóþŸó©Š£Ù£ÖØÛÝxzý  ý ©Š©Š Ò 
£»†Á†Ï Ù9¥¦¥¦ü’~}ñôþ‚õ©Šž¡¥¨(ß:¨©©¨ü’ñðôõþ…ö©ŠªÀcª#&~þ ÿ 
 þ ©Š ÿ  c cˆ¢cµ
 `£cÛž `àB¤GS

‚ §ß§
ª»†Á†,±38æ;¬­¬­ü’'&ºøþˆÒ©Š®´®RUY\~©Š««
®»†Á†įü54Ëøjúün)& See [`redirect_fn`] for more details.Á°°Íž Åà‹Dx—ÔV6±  Îm¯¯ó‡(¡<³³ÍžlÏûÅà‹´Ù´ˆMO
 
à‹à‹²¡²
´ó‡Ÿ ¨=Íž
ùüÅà‹ ¬£ü@B? A redirection [`Policy`] that stops cross-origin redirections.ÁðŒäÿÅk;¸L¿,¿~··(Œ
>ðŒ04>ðŒ»Ù»OQ
 
ðŒðŒºŒº
»œ ?ðŒ8 ™@ðŒ¾´¾"$ðŒ½½
¾|—5üÛ3GD A value returned by [`Policy::redirect`] which indicates the actionÁü£4UR [`FollowRedirect`][super::FollowRedirect] should take for a redirection response.Á 4 5+Ì7$<!{ôÀÁÂÃÁÃ4Í5Ü­5 Follow the redirection.Á *¿¿>@¿¿$«6üÙ5MJ Do not follow the redirection, and return the redirection response as-is.Á ]¿¿qs¿¿(!5
A04AÆÙÆOQƒ
 ƒ
Å!‚5Å
Æœ "‰5B(#5CÉÀcÉ"$


 
 
 c cˆ¢cµ
 `£cÛž `àB¤GS

‚ È#5È
ÉÆ±Ìüä ,ü¯WT [`Layer`] for retrying requests with a [`Service`] to follow redirection responses.Áúü‹ 1. See the [module docs](self) for more details.Á
œï ¡ËËëdƒ!ãÏt<˜ùRG Ì ƒ!š•L—!4—!ÊÊ($Æ D¡ÎÎëQØ$ƒ!ãÏÙÏsuUW
 
ããÍÍ
ϧ %Í E¡ÑÑëúŠ %ƒ!ã(&Ó F¡ÓÓëF¿c&ƒ!ãÔÀcÔilXZˆ

Š
 ˆ
ã 
 c cˆ¢cµ
 `£cÛž `àB¤GS
Š
 ÒÒ
Ô±8'Ú G¡ÖÖëQ³'ƒ!ã×´×twXZãÕÕ
×üÆ'*ü™&XU Middleware that retries requests with a [`Service`] to follow redirection responses.Áò&úüö&1ø› tÑ'¤Ù¡ÚÚÙ¶­ à'ó…dã'þ‘Gt²¡}
ÛÜ(*- ã'š•D÷',÷'ØØñ‘L…(4…(ØØë‘((±'H¤Þ¡ßÞß¶­²ó…Ï­(à'ß­(ã'þ‘àÙàÛݱ³xz
 
þ‘þ‘Ý(±'Ý
àñ‘ë‘Ï )¸'I¤â¡ãâã¶­ƒó…SŠ ñ‘)à'Š ë‘)ã'þ‘³Ž(*¾'J¤å¡ææå¶­ó…Ö¿cñ‘*à'¿cë‘*ã'þ‘çÀcçADŽŒ

Ž
 Œ
þ‘ 
 c cˆ¢cµ
 `£cÛž `àB¤GS
Ž
‚ ä*¾'ä
çñ‘ë‘<±CØ+ ø+Z/ ï·8+™ 
 
þ‘ 
ñ‘ 
èñ‘ë‘ ø+›# ø+Û7 ­¹8+¢ 
 
þ‘ 
ñ‘ 
éñ‘ë‘ à+¯ ø+ð6 ’»P+¶ þ‘ñ‘
êñ‘ë‘ ù2•º´ü…9+I2º( Response future for [`FollowRedirect`].ÁUtÕ9¤ìí¡îìíî¶­ ä9 ç9Í쿎 ê9*ñ‘ôë™0ó§î“fËî¼Éü=Åïðñòóôõö[]`b\^á2“»4´:ëë†5‰5Š5LeftÁ5ˆŒ55RightÁŽ5ˆÛÊÑãÚ Æñ‘ôë* èèøŒëº¼K¿RPø„hñ‘ôë°<ï:ëëñ‘É4ƒ;ë뿎â4–;ëëû—û®;ëëÜ÷<À;ëëóóô‰‹õˆ²  $ »ÊŠKVp]<Ú;ëëýÈw$ƒ<ëëÂÄÅÛÆˆÇÈšZÉÊ©d—MˆÚ4ÕÁ†(3¾9V¤øù¡úøùú¶­¨§Ø®ë¨3ä9…ö3ç9¿c¿Ž3ê9é®´¿c¹°‹î“ûÀcû
ÉË


 
î“ 
 c cˆ¢cµ
 `£cÛž `àB¤GS

‚ ÷3¾9÷
ûñ‘Á†¿Ž|±ƒY4ös 4üsù4¸{FT¤þÿ¡þÿ¶­DCØ®9é®-¡fimpkn4Ú•Á4Ý•
 
ƒ¡ƒ 4’–¶­Ø®é®û
ñ‘Á†¿ŽthisÁ!4Œ–JMQTORù6¨ÝÕ16¨Õ^Q4ÝtÉU¤ˆ¡ˆÍìö•û„†úé¸ðü”ÉU16¤Þ*ö•ôô¦’ö¶’¦÷ì+¦¯:ðû„à¢ü•=ö•ôº* ÉUù5ÿÈö•ÉUü•ÉU èÉU-·UŠáSïSŒÕ-®8ŽŽTÄ¡Tì+¶B[³0À€ÉUö•ü•è¶B[³0À€ŠŒŽ16ÓÝilpsnq„¾„¾¾Ì†¾ ˜X$]È=„kt• ÉU†5‰5Š5ö®‹5ˆŒ55“¯Ž5ˆÛÊÑãÚ Æº»èèøŒëº¼K¿RPø„hö•ôºè8 ÉUö•? ÉUè(F ÉUû—HM ÉUÜ÷hS ÉUø±ˆ* ÉUýȨ0 ÉUÂÄÅÛÆˆÇÈšZÉÊ©d—MˆÚ4Õü•ù@¨ÝÕ1@¨Õgi4®xÉU¤¡ºº
„†
é¸
غ1@¤Þêº
¸»ù?ÿÈÕ» â»ï»¯VáS˜ïSÕ-š®8ŽTœÄ¡Tžì+rÌkA¨ÉUö•ü•èrÌkA¨˜šœž1@ÓÝ      
„¾„¾¾Ì†¾ ˜X$]È=„kt• ÉU¯¾R]
 ÉUö•rd
 ÉUèk
 ÉUû—²r
 ÉUÜ÷Òx
 ÉUø±òO
 ÉUýÈU
 ÉUÁùI•‡1Iù…94Ü} „¾„¾¾Ì†¾ ˜X$]È=„kt•  î“·UŠáSïSŒÕ-®8ŽŽTÄ¡Tì+¶B[³0À€ ñ‘Á†¿Žý1I°‡ý
Ÿñ‘Á†¿Ž!IŇ')ùR•‡1Rù…Y4¢„¾„¾¾Ì†¾ ˜X$]È=„kt• ¢î“¯VáS˜ïSÕ-š®8ŽTœÄ¡Tžì+rÌkA¨¢ñ‘Á†¿Žý1R°‡ý
¡ñ‘Á†¿Ž!RŇ')ù[å½0\A[ñ½ÉU¤¤¥¦¡§¦¤§¥ººk„†jé¸`êºT££ÖW ¨†X©áSªïS«Õ-¬®8­ŽT®Ä¯¡T°ì+#AçøÇ«ÉUö•ü•è#AçøÇ«¨©ª«¬­®¯°1[ú½ILPSNQù[ܾ<[ܾ££ÇÔFu\»Ÿ ÉUù4݈tD££¯¾±££001 AlwaysUnpinÁ3ˆ ‰4ä\’ÎMö•n裣001ÎÏ3ˆ ‰4ä\’ÎMè´££001ÎÏ3ˆ ‰4ä\’ÎMû—úB££001ÎÏ3ˆ ‰4ä\’ÎMÜ÷@o££001ÎÏ3ˆ ‰4ä\’ÎMø±m££001ÎÏ3ˆ ‰4ä\’ÎMýÈΚ££001ÎÏ3ˆ ‰4ä\’ÎMÁù[ÿe\ÉU²¤³´¡µ³²´µºº*„†)鸓í))*PinnedFieldsOfHelperStructÁ,ˆ Úˆ3ClœÎÍ(Á[ŒÁêºtü”1[È¿°³·ºµ¸©dûé]ydêäÁdûéää!ùdÏê6]¥¸¸Ò dÔêŒ"¹d×ê ùd‘ëV]¤º»¡¼»º¼¶­À¿Ø®µé®©î“ÜßãæáäüðU`] Response [`Extensions`][http::Extensions] value that represents the effective request URI ofÁüÑV;8 a response returned by a [`FollowRedirect`] middleware.ÁWúü‘W^[ The value differs from the original request's effective URI if the middleware has followedÁŒðW¥êTžX³—¹ƒÃ0c¾¿Ü÷³—7Ü÷³—½½
¾<©X½½Ü÷(f‹Xˆ³—ÁÙÁ#%
 
³—³—Àf‹XÀ
Áp„ÅXDÊXÃÃþ¶ ÓXé—d—MˆÚ4ÕÄÅÇÈÉÊÅÆ¥‰é—ÈÊHJ×û×ûÂÂ
Å¥‰×û×û¥‰é—ÂÂ•Þ áXÂÂ¥‰,éXÂÂé—ÂÂé—$ôXÂÂé—ÂÂé—(g½XÌÌþ¶|¿c¥‰gÓXé—ÍÀcÍŸ¢Y[

˜
 
é— 
 c cˆ¢cµ
 `£cÛž `àB¤GS
˜
‚ Ëg½XË
Í¥‰± Œ”´­ gRPC status codes.ÁÄúüÈ1. These variants match the [gRPC status codes].Áúúüþwt [gRPC status codes]: https://github.com/grpc/grpc/blob/master/doc/statuscodes.md#status-codes-and-their-use-in-grpcÁDŘˆ*ñžqY%„ÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðÐÒÔÖØÚÜÞà  â

ä  æ  è

êìîðÚü¬)& The operation completed successfully.Á9ÎÎŘMOÎÎŘL‡üâ  The operation was cancelled.Á0ÎÎŘDFÎÎŘ<­”– Unknown error.Á!ÎÎŘ57ÎÎŘüº)& Client specified an invalid argument.Á9ÎÎŘMOÎÎŘ„·üý52 Deadline expired before operation could complete.ÁEÎÎŘY[ÎÎŘüÍ(% Some requested entity was not found.Á8ÎÎŘLNÎÎŘüˆ;8 Some entity that we attempted to create already exists.ÁKÎÎŘ_aÎÎŘ„«üÛKH The caller does not have permission to execute the specified operation.Á[ÎÎŘoqÎÎŘŒëüÁ%" Some resource has been exhausted.Á5ÎÎŘIKÎÎŘ”Ïü‚HE The system is not in a state required for the operation's execution.ÁXÎÎŘlnÎÎŘôç The operation was aborted.Á-ÎÎŘACÎÎŘü— 1. Operation was attempted past the valid range.ÁAÎÎŘUWÎÎŘl”
üÝ 2/ Operation is not implemented or not supported.ÁBÎÎŘVXÎÎŘD¿
Ϥ
 Internal error.Á"ÎÎŘ68ÎÎŘ
üÍ
)& The service is currently unavailable.Á9ÎÎŘMOÎÎŘ üŒ *' Unrecoverable data loss or corruption.Á:ÎÎŘNPÎÎŘ üÉ >; The request does not have valid authentication credentialsÁNÎÎŘbdÎÎŘ(hÿ
ŠŘ15ŠŘóÙóQS
 
ŘŘòhÿò
óž i†Ř(jŒŒŘöÀcö#%š

œ
 š
Ř 
 c cˆ¢cµ
 `£cÛž `àB¤GS
œ
‚ õõ
öDZÍYkälG kêlGÀá›™E„GqNùúá›á›?ÀÒùá›øø
ùùl¥=GÀøøÒù(m²á›üÀcü#%
ž
Ÿ
 
á› ž
 c cˆ¢cµ
 `£cÛž `àB¤GS
Ÿ
‚ ûû
üDZÍ(n¹
˜á›15˜á›ÿÙÿQS 
  
á›á›þþ
ÿž oÀᛚkÌnG»œgß‚>ƒ»œ9À»œ
GÀ)qìG»œ26»œÙRT¡
 ¡
»œ»œG
 !róGœ»œIsùG»œ»œŠ·ßŠ:<¢
£
 ¢
»œ £
»œG
Š˜¹
žt„Gž»œŒŒ$*?¤
 ¤
»œ t„G
ŒŠQuˆGŸ»œŽïߎ%'¥
¦
 ¥
»œ ¦
»œÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ¿ßÀßÁßLessÁÂßÃßÄß~Å߯ßÇßGreaterÁÈßåºÝÈnûê7 uˆG
Ž)¹
0v”G »œ»$&§
¨
 §
»œ ¨
»œრ v”G
¹
Š!w™G¡»œe$&©
ª
 ©
»œ ª
ùù w™GÍì׆ š¢e׆ ¨
׆ º¼¾À¡xÿŠGᛞŸ ¡¢£¤¥¦§¨©ª«¬­®ùx²&GᛚœG|G}G†G‰G€šœùxç5G)xíG ´ÊÉx±G©xµGÀ¯°±²³´µ·¸¹º»¼½¾¿öu㘷˜Â³Aç˜Ê˜Ã¦Hë˜À˜Äšu˜Åõó˜˜Æá‰÷˜æ
˜È=û˜ˆ˜É×þ˜¤,˜Ëì×ø˜Ì—˜ÌÃBºŒ é˜ÍZžšÎ˜¥p šñ˜Úo¢šë˜æp¤š÷˜_ ÷˜¤^[ ø˜¤^o ù˜¹q„†X˜)xåGIx…›G!xŠ›G¡x¢›G!x¥›G«
 «
á› xª›G
š!x«›Gùx€œ0GxƒœGá›
´!x”œGùx†!GIx‰Gá›
œÒŸIxÀGÀ©x½Gá›á›5<ôá›M„­ á›eŒæ á›}LŸ!ᛕtØ!á›­Œ‘"á›Å”Ê"á›Ýœƒ#á›õ<¼#á›
dõ#á›&l®$á›?Dç$á›X\ %á›qLÙ%ᛊ|’&á›ùœ!G¥À ùŸ!G¨Àœ’ ù¢!GªÀœ’ ù¥!G¬Àœ’ ù¨!G®Àœ’ ù«!G°Àœ’ ù®!G²Àœ’ ù±!G´Àœ’ ù´!GÀœ’ ù·!G¸Àœ’ ùº!GºÀœ’ ù½!G»Àœ’ ùÀ!G¼Àœ’ ùÃ!G½Àœ’ ùÆ!G¾Àœ’ ùÉ!G¿Àœ’ ùÌ!GÀÀœ’ ù’ì 7Gá›ÁÂq’²
GI·
GÀÀi’Ó
GAØ
GÀÀ»œù’DG»œÄ´Ä¡’òG9’õG»œÃÃ
Äù’Õ>G»œÆÀcÆù’¢jG¥G¬
­
®
 ¬
»œ ­
 c cˆ¢cµ
 `£cÛž `àB¤GS
®
‚ Å©GÅ
Æ!’ªG±°Gù’Ø@G»œÈÅcÈù’§jGªG¯
°
±
 ¯
»œ °
 c cˆ¢cµ
 `£cÛž `àB¤GS
±
‚ Ç®GÇ
È!’¯G±µGù’û@G»œÊËðyñyËA’ÊGÏGÉÉ
ParseErrorÁˆG@ >fÏ}ù’þPGAG²
 ²
Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
»œ»œðyÉGÉ
˾ŠG9’GË¿›Ì×›Ìô›ÌÌËÌá›»œù’ÆFG»œÎâι’G1’žG³
 ³
»œ ³
Í¥GÍ
Î!’¦Gù’îEG»œÐëÐÉ’ÂG!’ÅG»œÏÏ
д!’ÊG±’¯#G»œÒù’Æ$%GA’Í$G´
 ´
»œ ´
ÑÖ$GÑ
Ò!’Û$G¡–Ë‘G⻜ÔÕרÙÚÛÞßàáâãäåæçèéêá–»’G)–È’G»œÓÓÁÏÑ–Ò“Gß“G»œÓÓüª¡•»%GÁ%GÀ»œù–¹•G!–Æ•Gµ
 µ
»œÓË•GÓËÅ!•Ð#Gù–ž—RGI–«—Gã¨ÓÓÑÓ´!•Ö#Gù–û˜2G‘–ˆ™G»œÓÓÉ¥´Mù–­š0GºšG»œÓÓúÙ´•ù–NGI–G
 
ã¨ÓžGÓ
ÛÐ !•Ü#GÉ•Û0Gâ©•ß0GÀëìíîïðñòóôõö÷øùúûöu·ÜݳAÊÜÝæHÀÜÝÄšu®ÜÝÅõÜÝÆá‰æ
ÜÝÈ=§ˆÜÝÉׄ§¤,ÜÝËì×Ì—ÜÝÌÃB@› éÜÝÍZÎÜÝ¥pñÜÝÚoëÜÝæp÷ÜÝå ÷Üݤ^áøÜݤ^õùÜݹqÜÝ)•“1Gù–Ξ%GA–ÛžG·
 ·
»œÓÌ•GÓãÛqù–úŸ#G1–‡ G¸
 ¸
»œÓ^Ó¥ÝÉù–¦¡5GQ–³¡G¹
 ¹
»œ»œÓ¹Ó‚ß$¹
)•â#Gù–è¢3GA–õ¢Gº
 º
»œ»œÓÓá¹
gù–¦¤'G1­¤G»
 »