ó
    x[h—˜  ã                   óà  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	J
r
Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJrJrJrJrJrJr  S S	K J!r!J"r"J#r#J$r$  S SK%r%S S
K%J&r&  S SK'J(r(J)r)J*r*  \RV                  " \,5      r-Sr.\\S/\/4      r0S r1S r2S\34S jr4SKS\5S\6S\7SS4S jjr8S\5SS4S jr9S\S   4S jr: " S S5      r; " S S\;5      r< " S S\;5      r= " S  S!5      r> " S" S\?5      r@S# rAS$\5S\64S% jrBSS&.S'\@S(\0S\\6   4S) jjrCSSS S*SSSSS+S+SSS,S+S-S,S..S(\0S/\/S\>4S0 jjrD SLS1\S2\4   S3\5S\3S4\RŠ                  S5\\6   S\4S6 jjrF  SMS1\S2\4   S8\\5   S9\6S\3S\\\5   \\>   4   4
S: jjrG " S; S<\5      rH\6" S=5      S\-R’                  SSSSSS-S+S7S>.S?\6S\\6   S@\SA\\   SB\\6   S(\0SC\\\\6/\64      SD\5SE\/SF\64SG jjrJ " SH SI5      rK SLSJ jrLg)Né    N)ÚThreadPoolExecutorÚTimeoutErrorÚas_completed)Ú	parsedate)Úpartial)Ú	NOT_FOUND)Úcount)Úcreate_default_context)	ÚAnyÚCallableÚIteratorÚListÚMappingÚ
NamedTupleÚOptionalÚTupleÚUnion)ÚquoteÚurlparseÚurlsplitÚ
urlunparse)Ú
exceptions)ÚperformanceÚutilÚversionÚREDACTEDÚUrlErrorc                 ó€   • [        [        U SS95      nUS   (       d  US   (       a  US   US'   SUS'   [        U5      $ )NÚhttp)Úschemeé   é   Ú )Úlistr   r   )ÚurlÚ
parsed_urls     Ú6/usr/lib/python3/dist-packages/cloudinit/url_helper.pyÚ	_cleanurlr(   1   sC   € Ü”h˜s¨6Ñ2Ó3€JØ�a�=˜Z¨Ÿ]ð # 1™ˆ
�1‰Øˆ
�1‰Ü�jÓ!Ð!ó    c                 ó2   • S nU nU H  nU" X45      nM     U$ )Nc                 óÂ   • [        [        U 5      5      nUS   nU(       a  UR                  S5      (       d  US-  nU[        [	        U5      SS9-  nX2S'   [        U5      $ )Nr"   Ú/z/:)Úsafe)r$   r   Úendswithr   Ústrr   )r%   Úadd_onÚ
url_parsedÚpaths       r'   Úcombine_singleÚ#combine_url.<locals>.combine_single<   sZ   € Üœ( 3›-Ó(ˆ
Ø˜!‰}ˆÞ˜Ÿ™ c×*Ñ*Ø�C‰KˆDØ””c˜&“k¨Ñ-Ñ-ˆØ�1‰Ü˜*Ó%Ð%r)   © )ÚbaseÚadd_onsr3   r%   r0   s        r'   Úcombine_urlr8   ;   s'   € ò&ð €CÛˆÙ˜SÓ)Šñ à€Jr)   Úreturnc           
      óL  • [         R                  S[         R                  S[         R                  S[         R                  S[
        S0nUR                  [        U 5      5      nU(       d:  [        U [        5      (       a  U R                  nU$ [        R                  S5        SnU$ )z4helper for read_ftps to map return codes to a numberé,  é�  éô  iX  i¼  z9Unexpected exception type while connecting to ftp server.i�ÿÿÿ)ÚftplibÚerror_replyÚ
error_tempÚ
error_permÚerror_protoÚEOFErrorÚgetÚtypeÚ
isinstanceÚOSErrorÚerrnoÚLOGÚwarning)ÚexcÚftp_error_codesÚcodes      r'   Ú"ftp_get_return_code_from_exceptionrN   K   s�   € ô 	×Ñ˜CÜ×Ñ˜3Ü×Ñ˜3Ü×Ñ˜CÜ�#ð€Oð ×Ñœt C›yÓ)€DÞÜ�cœ7×#Ñ#Ø—9‘9ˆDð €Kô	 �K‰KØKôð ˆDØ€Kr)   r%   ÚtimeoutÚkwargsÚFtpResponsec           	      ób  • [        U 5      nUR                  (       d  [        S[        SU S9e[        R
                  " 5        nUR                  =(       d    SnUR                  =(       d    SnSUR                  :X  GaG   [        R                  " [        5       S9n[        R                  SU U5        UR                  UR                  UU=(       d    S	S
9  [        R                  SU5         UR#                  UUR$                  =(       d    SS9  [        R                  S5        UR'                  5          [        R                  SUR,                  5        UR/                  SUR,                   3UR0                  S9  [3        UR5                  5       U 5      [        R                  S5        UR7                  5         sSSS5        $  [        R8                  " 5       n
[        R                  SX5        U
R                  UR                  UU=(       d    S	S
9  [        R                  SU5        U
R#                  UUR$                  =(       d    SS9  [        R                  SUR,                  5        U
R/                  SUR,                   3UR0                  S9  [3        UR5                  5       U 5      [        R                  S5        U
R7                  5         sSSS5        $ ! [        R                   a$  n[!        U5      n	[        SU  SU	 S3U	SU S9UeSnAff = f! [        R(                   a'  n[        R+                  S5        [        SSSU S9UeSnAff = f! [        R                   a$  n[!        U5      n	[        SU  SU	 S3U	SU S9UeSnAff = f! [        R                  S5        UR7                  5         f = f! [        R                   a$  n[!        U5      n	[        SU  SU	 S3U	SU S9UeSnAff = f! [        R                  S5        W
R7                  5         f = f! , (       d  f       g= f)aN  connect to URL using ftp over TLS and read a file

when using strict mode (ftps://), raise exception in event of failure
when not using strict mode (ftp://), fall back to using unencrypted ftp

url: string containing the desination to read a file from. The url is
    parsed with urllib.urlsplit to identify username, password, host,
    path, and port in the following format:
        ftps://[username:password@]host[:port]/[path]
    host is the only required component
timeout: maximum time for the connection to take
kwargs: unused, for compatibility with read_url
returns: UrlResponse
zInvalid url providedN©ÚcauserM   Úheadersr%   é   Ú	anonymousÚftps)Úcontextz3Attempting to connect to %s via port [%s] over tls.ç      @)ÚhostÚportrO   z1Reading file from server over tls failed for url z [Ú]z"Attempting to login with user [%s]r#   )ÚuserÚpasswdzCreating a secure connectionzšAttempted to connect to an insecure ftp server but used a scheme of ftps://, which is not allowed. Use ftp:// to allow connecting to insecure ftp servers.r=   zReading file: %szRETR )ÚcallbackzClosing connectionz,Reading file from ftp server failed for url z(Attempting to connect to %s via port %s.)r   Úhostnamer   r   ÚioÚBytesIOr\   Úusernamer    r>   ÚFTP_TLSr
   rI   ÚdebugÚconnectÚ
all_errorsrN   ÚloginÚpasswordÚprot_prA   rJ   r2   Ú
retrbinaryÚwriterQ   ÚgetvalueÚcloseÚFTP)r%   rO   rP   Ú	url_partsÚbufferr\   r^   Úftp_tlsÚerM   Úftps              r'   Ú	read_ftpsrv   b   sé  € ô  ˜“€IØ××ÜØ(¬yÀ$ÈCñ
ð 	
ô 
�ŠŒ˜Ø�~‰~×# ˆØ×!Ñ!×0 [ˆØ�Y×%Ñ%Ô%ðÜ Ÿ.š.Ü2Ó4ñ�ô —	‘	ØIØØôð
 —‘Ø"×+Ñ+ØØ#ŸN sð  ñ ô  �I‰IÐ:¸DÔAðØ—‘ØØ$×-Ñ-×3°ð ñ ô —	‘	Ð8Ô9Ø—‘Ô ð" Ü—	‘	Ð,¨i¯n©nÔ=Ø×"Ñ"Ø˜IŸN™NÐ+Ð,°v·|±|ð #ñ ô # 6§?¡?Ó#4°cÓ:ô —	‘	Ð.Ô/Ø—‘”÷S 
‰ðVÜ—j’j“l�Ü—	‘	Ø>Àôð —‘Ø"×+Ñ+ØØ#ŸN sð ñ ô
 —	‘	Ð>ÀÔEØ—	‘	ØØ$×-Ñ-×3°ð ñ ô —	‘	Ð,¨i¯n©nÔ=Ø—‘  y§~¡~Ð&6Ð7À&Ç,Á,�ÑOÜ" 6§?¡?Ó#4°cÓ:ô —	‘	Ð.Ô/Ø—	‘	”÷U 
‰øô$ ×$Ñ$ó 
Ü9¸!Ó<�Üð*Ø*-¨¨b°°°að9ð Ø Øñð ðûð
ûô& ×$Ñ$ó Ü—‘ðCôô
 ðNð Ø Øñ	ð ð	ûðûô. ×$Ñ$ó 
Ü9¸!Ó<�Üð+Ø+.¨%¨r°$°°qð:ð Ø Øñð ðûð
ûô —	‘	Ð.Ô/Ø—‘•ûô( ×$Ñ$ó 
Ü9¸!Ó<�Üð+Ø+.¨%¨r°$°°qð:ð Ø Øñð ðûð
ûô —	‘	Ð.Ô/Ø—	‘	•ú÷U 
�ús²   Á<P Á?AKÃP Ã-ALÄ6A MÆ%P ÇC(N;Ê.%P ËLË1LÌLÌP ÌMÌ,"MÍMÍP ÍNÍ*N	Î	NÎNÎ'N8Î8P Î;O3ÏO.Ï.O3Ï3O6Ï6'PÐP Ð 
P.r2   ÚFileResponsec                 ó*  • UR                  S5      (       a  [        R                  SU 5         [        R                  " U 5      n[        X 5      $ ! [         a  n[        U[        SU S9UeSnAf[         a  n[        X3R                  SU S9UeSnAff = f)zeread a binary file and return a FileResponse

matches function signature with read_ftps and read_url
Údataz'Unable to post data to file resource %sNrS   )rD   rI   rJ   r   Úload_binary_filerw   ÚFileNotFoundErrorr   r   ÚIOErrorrH   )r2   rP   Úcontentsrt   s       r'   Ú
_read_filer~   ä   s‡   € ð
 ‡z�z�&×ÑÜ�‰Ð=¸tÔDðMÜ×(Ò(¨Ó.ˆÜ˜HÓ+Ð+øÜó OÜ˜Q¤Y¸À$ÑGÈQÐNûÜó MÜ˜Q§W¡W°dÀÑEÈ1ÐLûðMús#   ® A Á
BÁA*Á*BÁ7BÂB)rw   ÚUrlResponserQ   c                 ón  • U R                  5       n  [        U 5      nUR                  nUS:X  d  U (       a  SU S   :X  a  [        UR                  40 UD6$ US;   a  [        U 40 UD6$ US;   a  [        U 40 UD6$ [        R                  SU5        [        U 40 UD6$ ! [         a  n[        X0S9UeSnAff = f)	a   Wrapper function around readurl to allow passing a file path as url.

When url is not a local file path, passthrough any kwargs to readurl.

In the case of parameter passthrough to readurl, default values for some
parameters. See: call-signature of readurl in this module for param docs.
)rT   r%   NÚfiler,   r   )ru   rX   )r   ÚhttpszAttempting unknown protocol %s)Úlstripr   Ú
ValueErrorr   r    r~   r2   rv   ÚreadurlrI   rJ   )r%   rP   Úparsedrt   r    s        r'   Úread_file_or_urlr‡   ô   s¿   € ð �*‰*‹,€Cð0Ü˜#“ˆð �]‰]€FØ�ÓžC C¨3¨q©6£MÜ˜&Ÿ+™+Ñ0¨Ñ0Ð0Ø	�?Ó	"Ü˜Ñ' Ñ'Ð'Ø	Ð$Ó	$Ü�sÑ%˜fÑ%Ð%ä�‰Ð4°fÔ=Ü�sÑ%˜fÑ%Ð%øô ó 0Ü˜QÑ(¨aÐ/ûð0ús   ’B Â
B4Â%
B/Â/B4c                   ó*   • \ rS rSrSS jrS rS rSrg)ÚStringResponsei  c                 ó6   • X0l         0 U l        Xl        X l        g ©N)rM   rU   r}   r%   )Úselfr}   r%   rM   s       r'   Ú__init__ÚStringResponse.__init__  s   € ØŒ	ØˆŒØ ŒØ�r)   c                 ó    • U R                   S:H  $ )NéÈ   ©rM   ©rŒ   ÚargsrP   s      r'   ÚokÚStringResponse.ok  s   € Ø�y‰y˜CÑÐr)   c                 ó8   • U R                   R                  S5      $ )Nzutf-8)r}   Údecode©rŒ   s    r'   Ú__str__ÚStringResponse.__str__  s   € Ø�}‰}×#Ñ# GÓ,Ð,r)   )rM   r}   rU   r%   N©r�   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r�   r”   r™   Ú__static_attributes__r5   r)   r'   r‰   r‰     s   † ôò õ-r)   r‰   c                   ó8   ^ • \ rS rSrSS\S\4U 4S jjjrSrU =r$ )rw   i   r}   r%   c                 ó"   >• [         TU ]  XUS9  g )Nr‘   ©Úsuperr�   )rŒ   r}   r%   rM   Ú	__class__s       €r'   r�   ÚFileResponse.__init__!  s   ø€ Ü‰Ñ˜¨TÐÒ2r)   r5   r›   ©	rœ   r�   rž   rŸ   Úbytesr/   r�   r    Ú__classcell__©r¥   s   @r'   rw   rw      s   ø† ñ3 ð 3¨S÷ 3ö 3r)   c                   ó4   ^ • \ rS rSrS\S\4U 4S jjrSrU =r$ )rQ   i%  r}   r%   c                 ó$   >• [         TU ]  X5        g r‹   r£   )rŒ   r}   r%   r¥   s      €r'   r�   ÚFtpResponse.__init__&  s   ø€ Ü‰Ñ˜Õ'r)   r5   r§   rª   s   @r'   rQ   rQ   %  s   ø† ð( ð (¨S÷ (õ (r)   c                   óÎ   • \ rS rSrS\R
                  4S jr\S\4S j5       r	\S\
4S j5       rSS\4S jjr\S 5       r\S\4S	 j5       rS
 r SS\\   S\S\\   4S jjrSrg)r   i*  Úresponsec                 ó   • Xl         g r‹   ©Ú	_response)rŒ   r¯   s     r'   r�   ÚUrlResponse.__init__+  s   € Ø!�r)   r9   c                 ó^   • U R                   R                  c  gU R                   R                  $ )Nr)   )r²   Úcontentr˜   s    r'   r}   ÚUrlResponse.contents.  s%   € à�>‰>×!Ñ!Ñ)ØØ�~‰~×%Ñ%Ð%r)   c                 ó.   • U R                   R                  $ r‹   )r²   r%   r˜   s    r'   r%   ÚUrlResponse.url4  s   € à�~‰~×!Ñ!Ð!r)   c                 óP   • SnU(       a  SnSU R                   s=::  a  U:  a   g  gg)Nr;   r<   r�   TFr‘   )rŒ   Úredirects_okÚuppers      r'   r”   ÚUrlResponse.ok8  s-   € ØˆÞØˆEØ�$—)‘)Õ#˜eÔ#Øð $ñ r)   c                 ó.   • U R                   R                  $ r‹   )r²   rU   r˜   s    r'   rU   ÚUrlResponse.headersA  s   € à�~‰~×%Ñ%Ð%r)   c                 ó.   • U R                   R                  $ r‹   )r²   Ústatus_coder˜   s    r'   rM   ÚUrlResponse.codeE  s   € à�~‰~×)Ñ)Ð)r)   c                 ó.   • U R                   R                  $ r‹   )r²   Útextr˜   s    r'   r™   ÚUrlResponse.__str__I  s   € Ø�~‰~×"Ñ"Ð"r)   Ú
chunk_sizeÚdecode_unicodec              #   óV   #   • U R                   R                  X5       Sh  v•N   g N7f)aD  Iterates over the response data.

When stream=True is set on the request, this avoids reading the content
at once into memory for large responses.

:param chunk_size: Number of bytes it should read into memory.
:param decode_unicode: If True, content will be decoded using the best
available encoding based on the response.
N)r²   Úiter_content)rŒ   rÅ   rÆ   s      r'   rÈ   ÚUrlResponse.iter_contentL  s   é € ð —>‘>×.Ñ.¨zÓJ×JÓJùs   ‚)¡'¢)r±   N)F)r!   F)rœ   r�   rž   rŸ   ÚrequestsÚResponser�   Úpropertyr¨   r}   r/   r%   Úboolr”   rU   ÚintrM   r™   r   r   rÈ   r    r5   r)   r'   r   r   *  sÀ   † ð" ×!2Ñ!2ô "ð ð&˜%ó &ó ð&ð
 ð"�Só "ó ð"ñ¨õ ð ñ&ó ð&ð ð*�có *ó ð*ò#ð EJñKØ" 3™-ðKØ=AðKà	�%‰÷Kð Kr)   r   c            
       óJ   • \ rS rSr   S	S\S\\   S\\   S\\   4S jjr	Sr
g)
r   i[  NrT   rM   rU   r%   c                 ó~   • [         R                  U [        U5      5        Xl        X l        Uc  0 OUU l        X@l        g r‹   )r|   r�   r/   rT   rM   rU   r%   )rŒ   rT   rM   rU   r%   s        r'   r�   ÚUrlError.__init__\  s4   € ô 	×Ñ˜œs 5›zÔ*ØŒ
ØŒ	Ø&-¡o¡¸7ˆŒØ�r)   rS   )NNN)rœ   r�   rž   rŸ   r   r   rÎ   r   r/   r�   r    r5   r)   r'   r   r   [  sJ   † ð #Ø%)Ø!ñàðð �s‰mðð ˜'Ñ"ð	ð
 �c‰]÷ð r)   c                 óî   • 0 n[        U 5      R                  nUS:X  aW  U(       aP  SU;   a  US   (       a	  US   US'   OSUS'   SU;   a  SU;   a  US   US   /US'   U$ SU;   a  [        US   5      US'   U$ )Nr‚   Úca_certsÚverifyTÚ	cert_fileÚkey_fileÚcert)r   r    r/   )r%   Ússl_detailsÚssl_argsr    s       r'   Ú_get_ssl_argsrÚ   j  s�   € Ø€HÜ�c‹]×!Ñ!€FØ�Óž[Ø˜Ó$¨°Z×)@Ø!,¨ZÑ!8ˆH�XÒà!%ˆH�XÑØ˜+Ó%¨*¸Ó*Cà˜KÑ(Ø˜JÑ'ð ˆH�VÑð €Oð ˜KÓ'Ü" ;¨{Ñ#;Ó<ˆH�VÑØ€Or)   Úretry_afterc                 ór  •  [        U 5      nU$ ! [         a�     [        U 5      nU(       d  [        S5      e[        [        R                  " U5      [        R                  " 5       -
  5      nO(! [         a    [
        R                  SU 5        Sn Of = fUS:  a  [
        R                  S5        Sn U$ f = f)a(  Parse a Retry-After header value into an integer.

: param retry_after: The value of the Retry-After header.
    https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.3
    https://www.rfc-editor.org/rfc/rfc2616#section-3.3
: return: The number of seconds to wait before retrying the request.
z(Failed to parse Retry-After header valuezGFailed to parse Retry-After header value: %s. Waiting 1 second instead.r!   r   zBRetry-After header value is in the past. Waiting 1 second instead.)Úfloatr„   r   ÚtimeÚmktimerI   Úinfo)rÛ   Úto_waitÚ
time_tuples      r'   Ú_get_retry_afterrã   |  s¶   € ðÜ˜Ó$ˆð, €Nøô+ ó ð	Ü" ;Ó/ˆJÞÜ Ð!KÓLÐLÜœDŸKšK¨
Ó3´d·i²i³kÑAÓB‰GøÜó 	Ü�H‰Hð,àôð
 ŠGð	úð �Q‹;Ü�H‰Hð,ôð ˆGøØ€Nð+ús3   ‚ �
B6šAA-Á,B6Á-"BÂB6ÂBÂ B6Â5B6©Úexception_cbÚerrorrå   c                óD  • U(       a  U" U 5      (       a  gU R                   (       aq  U R                   S:X  aa  [        R                  S5        U R                  (       a%  [	        U R                  R                  SS5      5      $ [        R                  S5        gU(       d  gU e)a¶  Handle exceptions raised during request processing.

If we have no exception callback or the callback handled the error or we
got a 503, return with an optional timeout so the request can be retried.
Otherwise, raise the error.

:param error: The exception raised during the request.
:param response: The response object.
:param exception_cb: Callable to handle the exception.

:return: Optional time to wait before retrying the request.
Ni÷  zEEndpoint returned a 503 error. HTTP endpoint is overloaded. Retrying.zRetry-AfterÚ1z7Unable to introspect response header. Waiting 1 second.r!   )rM   rI   rJ   rU   rã   rD   rà   )ræ   rå   s     r'   Ú_handle_errorré   ž  sw   € ö" ™ U×+Ñ+ØØ‡z‡z�e—j‘j CÓ'Ü�‰ð5ô	
ð �=�=Ü# E§M¡M×$5Ñ$5°mÀSÓ$IÓJÐJÜ�‰ÐJÔKØÞØà
€Kr)   r!   TFr#   )ry   rO   ÚretriesÚsec_betweenrU   Ú
headers_cbÚheaders_redactrØ   Úcheck_statusÚallow_redirectsrå   ÚsessionÚinfiniteÚlog_req_respÚrequest_methodÚstreamrô   c          	      ó  • [        U 5      n U US.nUR                  [        X5      5        U
US'   U(       d  U(       a  SOSnUUS'   Ub3  [        U[        5      (       a  UUS'   O[        [        U5      S5      US'   Uc  / nS	nU(       a  [        [        U5      S	-   S	5      nS
[        R                  " 5       -  nUb  UR                  5       nO0 nU(       a  UUS'   Uc  SnUc  [        R                  " 5       n[        5        GHR  nU(       a  U" U 5      nSU;  a  UUS'   UUS'   0 nUR                  5        Hƒ  u  nnUS:X  a  M  US:X  aj  U(       ac  U Vs/ s H  nUR                  U5      (       d  M  UPM     nnU(       a0  [        R                   " U5      UW'   U H  n["        UU   U'   M     M|  M~  UUU'   M…      U(       a"  [$        R'                  SUU(       a  SOUU U5        UR(                  " S0 UD6nU	(       a  UR+                  5         [$        R'                  SU UR,                  [/        UR0                  5      US	-   5        [3        U5      s  $    [I        S5      es  snf ! [4        R6                   a  n[9        UU S9UeSnAf[4        R:                   a@  n[9        UUR<                  R,                  UR<                  R>                  U S9nUn SnAO2SnAf[4        R@                   a  n[9        UU S9nUnSn SnAOSnAff = f[C        UUS9nU(       d  U=(       d    US	-   U:  nU(       d  UUeU=(       d    Un US:”  d  GMJ  U(       a  [$        R'                  SU5        [D        RF                  " U 5        GM€  )aä  Wrapper around requests.Session to read the url and retry if necessary

:param url: Mandatory url to request.
:param data: Optional form data to post the URL. Will set request_method
    to 'POST' if present.
:param timeout: Timeout in seconds to wait for a response. May be a tuple
    if specifying (connection timeout, read timeout).
:param retries: Number of times to retry on exception if exception_cb is
    None or exception_cb returns True for the exception caught. Default is
    to fail with 0 retries on exception.
:param sec_between: Default 1: amount of seconds passed to time.sleep
    between retries. None or -1 means don't sleep.
:param headers: Optional dict of headers to send during request
:param headers_cb: Optional callable returning a dict of values to send as
    headers during request
:param headers_redact: Optional list of header names to redact from the log
:param ssl_details: Optional dict providing key_file, ca_certs, and
    cert_file keys for use on in ssl connections.
:param check_status: Optional boolean set True to raise when HTTPError
    occurs. Default: True.
:param allow_redirects: Optional boolean passed straight to Session.request
    as 'allow_redirects'. Default: True.
:param exception_cb: Optional callable to handle exception and returns
    True if retries are permitted.
:param session: Optional exiting requests.Session instance to reuse.
:param infinite: Bool, set True to retry indefinitely. Default: False.
:param log_req_resp: Set False to turn off verbose debug messages.
:param request_method: String passed as 'method' to Session.request.
    Typically GET, or POST. Default: POST if data is provided, GET
    otherwise.
:param stream: if False, the response content will be immediately
downloaded.
)r%   rô   rï   ÚPOSTÚGETÚmethodNrO   r   r!   zCloud-Init/%sry   éÿÿÿÿz
User-AgentrU   z'[%s/%s] open '%s' with %s configurationrñ   z(Read from %s (%s, %sb) after %s attempts)r%   ©rM   rU   r%   rä   ú1Please wait %s seconds while we wait to try againz"This path should be unreachable...r5   )%r(   ÚupdaterÚ   rF   ÚtupleÚmaxrÝ   rÎ   r   Úversion_stringÚcopyrÊ   ÚSessionr	   ÚitemsrD   Údeepcopyr   rI   rf   ÚrequestÚraise_for_statusrÀ   Úlenrµ   r   r   ÚSSLErrorr   Ú	HTTPErrorr¯   rU   ÚRequestExceptionré   rÞ   ÚsleepÚRuntimeError)!r%   ry   rO   rê   rë   rU   rì   rí   rØ   rî   rï   rå   rð   rñ   rò   ró   rô   Úreq_argsÚmanual_triesÚ
user_agentÚiÚfiltered_req_argsÚkÚvÚmatched_headersÚkeyr¯   rt   Ú	url_errorÚraised_exceptionÚresponse_sleep_timeÚ
will_retryÚ
sleep_times!                                    r'   r…   r…   À  s[  € ôj �C‹.€CàØñ€Hð ‡O�O”M #Ó3Ô4Ø"1€HÐÑÞÞ#'™¨UˆØ'€HˆXÑØÑÜ�gœu×%Ñ%Ø")ˆH�YÒä"%¤e¨G£n°aÓ"8ˆH�YÑØÑØˆØ€LÞÜœ3˜w›<¨!Ñ+¨QÓ/ˆà ¤G×$:Ò$:Ó$<Ñ=€JØÑØ—,‘,“.‰àˆæØˆ�ÑØÑØˆà�Ü×"Ò"Ó$ˆô �WˆÞÙ  “oˆGà˜wÓ&Ø$.ˆG�LÑ!à%ˆ�ÑØÐØ—N‘NÖ$‰DˆAˆqØ�F‹{ÙØ�I‹~¦.Ù.<Ó"Iªn¨ÀÇÁÀaÇ§1©n�Ð"IÞ"Ü+/¯=ª=¸Ó+;Ð% aÑ(Û.˜Ü4<Ð)¨!Ñ,¨SÓ1ó  /ñ #ð
 ()Ð! !Ó$ñ %ð(	ÞÜ—	‘	Ø=ØÞ"*‘J°ØØ%ôð —’Ñ2¨Ñ2ˆHæØ×)Ñ)Ô+Ü�I‰IØ:ØØ×$Ñ$Ü�H×$Ñ$Ó%Ø�Q‘ôô ˜xÓ(Ò(ñ[ ôf Ð;Ó
<Ð<ùòM #JøôB ×"Ñ"ó 	.ô ˜1 #Ñ&¨AÐ-ûÜ×#Ñ#ó 	!Ü ØØ—Z‘Z×+Ñ+ØŸ
™
×*Ñ*Øñ	ˆIð  !ÕûÜ×*Ñ*ó 	Ü  ¨Ñ,ˆIØ ÐØ�Hûð	úô
 ,ØØ%ñ
Ðö #Ø!×; a¨!¡e¨lÑ&:ˆJÞØÐ%5Ð5Ø(×7¨Kˆ
à˜Ž?ÞÜ—	‘	ØGØôô �JŠJ�z×"s=   ÅI&Å6I&ÇBI+É+LÉ?J
Ê
LÊ!6KËLË3LÌLÚfunc.ÚaddrÚeventÚdelayc                 óJ   • U(       a  UR                  US9(       a  gU " X5      $ )z Execute func with optional delay©rO   N©Úwait©r  r  rO   r  r  s        r'   Ú_run_func_with_delayr#  p  s%   € ö ð
 �:‰:˜eˆ:Ö$ØÙ�ÓÐr)   ç333333Ã?Ú	addressesÚstagger_delayc                 óL  • SnSnSn/ n[         R                  " 5       n[        [        U5      S9n	 [	        U5       V
Vs0 s H   u  p«U	R                  [        U UUUX¢-  S9U_M"     nn
n[        XÃS9 Ho  nXÍ   nUR                  5       nU(       a  UnUR                  " U5        M4  UR                  5       nU(       d  MM  UR                  5         XT4s  U	R                  SS9  $    U(       a  [        R                  SUU5        Ue[        R                  SU5        [!        S	5      es  snn
f ! ["         aF    [        R                  S
SR%                  U5      SR%                  ['        [(        U5      5      5         Of = f U	R                  SS9  XT4$ ! U	R                  SS9  f = f)a  execute multiple callbacks in parallel

Run blocking func against two different addresses staggered with a
delay. The first call to return successfully is returned from this
function and remaining unfinished calls are cancelled if they have not
yet started
N)Úmax_workersr"  r  Fr   z<Exception(s) %s during request to %s, raising last exceptionzEmpty result for address %szNo result returnedzJTimed out waiting for addresses: %s, exception(s) raised while waiting: %sÚ )Ú	threadingÚEventr   r  Ú	enumerateÚsubmitr#  r   Ú	exceptionÚappendÚresultÚsetÚshutdownrI   rf   ræ   r„   r   ÚjoinÚmapr/   )r  r%  r&  rO   Úreturn_resultÚreturned_addressÚlast_exceptionr   Úis_doneÚexecutorr  r  ÚfuturesÚfutureÚreturn_exceptions                  r'   Ú
dual_stackr=  ‚  sÈ  € ð €MØÐØ.2€NØ€JÜ�oŠoÓ€Gô "¬c°)«nÑ=€Hð5&ô % YÔ/ô

ò 0‘�ð �O‰OÜ$ØØØØØÑ(ð ð ð òñ 0ð 	ñ 

ô # 7Ô<ˆFà&™ÐØ%×/Ñ/Ó1ÐÞØ!1�Ø×!Ò! .Ö1à &§¡£�ß �=ð —K‘K”MØ,Ð<Ñ<ð2 	×Ñ˜uÐÒ%ñO =ö$ Ü�I‰Ið-àØ ô	ð !Ð ä�I‰IÐ3Ð5EÔFÜÐ1Ó2Ð2ùóS

øôX ó 
Ü�	‰	ð4à�H‰H�YÓØ�H‰H”Sœ˜jÓ)Ó*ö		
ð
úð	
ð 	×Ñ˜uÐÑ%àÐ,Ð,øð 	×Ñ˜uÐÒ%ús=   ±D, ¿'D&Á&AD, Â?D, Ã#A	D, Ä,AE<Å9F Å;E<Å<F ÆF#c                   óF   • \ rS rSr% \\   \S'   \\   \S'   \\   \S'   Sr	g)ÚHandledResponseiÕ  r%   r¯   Ú	wait_timer5   N)
rœ   r�   rž   rŸ   r   r/   Ú__annotations__r   rÝ   r    r5   r)   r'   r?  r?  Õ  s#   ‡ à	�#‰ÓØ�{Ñ#Ó#ð ˜‰Ör)   r?  Úinf)Úmax_waitrO   Ú	status_cbrì   rí   r  rå   Úsleep_time_cbró   Úconnect_synchronouslyÚasync_delayrC  rD  rì   r  rE  ró   rF  rG  c                óÊ  ^ ^^^^^	^^^^^^^• S[         S[        4U4S jjnSS[        S[        S[        4S jjmS	[        [           S
[        [           S[
        [        [           [        4   4S jmS[        [        /[
        [        [           [        [           4   4   S[        [        [        [           4   S[         S[        S[        S[        4UU4S jjmS
[        S[         S[        4UUU	4S jjmS[        4UUUUUUU 4S jjnS[        4UUUU 4S jjn[        R                  " 5       nT(       a  U(       a  [        S5      eU
(       a  UOUnU=(       d    UnSmSn U" XòXs5      nSmUR                   (       a"  UR"                  UR                   R$                  4$ UR&                  (       a)  [        R(                  " UR&                  5        TS-   mSmMy  U" UT5      nT" TUU5      (       a   gTS-   m[*        R-                  SU5        [        R(                  " U5        [        R                  " 5       nU(       a  UU-   UT-   :”  a  TUU-
  -
  nUS::  a   gMý  )a¡  Wait for a response from one of the urls provided.

:param urls: List of urls to try
:param max_wait: Roughly the maximum time to wait before giving up
    The max time is *actually* len(urls)*timeout as each url will
    be tried once and given the timeout provided.
    a number <= 0 will always result in only one try
:param timeout: Timeout provided to urlopen
:param status_cb: Callable with string message when a url is not available
:param headers_cb: Callable with single argument of url to get headers
    for request.
:param headers_redact: List of header names to redact from the log
:param sleep_time: Amount of time to sleep between retries. If this and
    sleep_time_cb are None, the default sleep time defaults to 1 second
    and increases by 1 seconds every 5 tries. Cannot be specified along
    with `sleep_time_cb`.
:param exception_cb: Callable to handle exception and returns True if
    retries are permitted.
:param sleep_time_cb: Callable with 2 arguments (response, loop_n) that
    generates the next sleep time. Cannot be specified
    along with 'sleep_time`.
:param request_method: Indicates the type of HTTP request:
    GET, PUT, or POST
:param connect_synchronously: If false, enables executing requests
    in parallel
:param async_delay: Delay before parallel metadata requests, see RFC 6555

:return: tuple of (url, response contents), on failure, (False, None)

:raises: UrlError on unrecoverable error
Úloop_numberr9   c                 ó   >• Tb  T$ US-  S-   $ )Né   r!   r5   )Ú_rI  r  s     €r'   Údefault_sleep_timeÚ(wait_for_url.<locals>.default_sleep_time  s   ø€ Ø'Ñ3ˆzÐM¸ÈÑ9IÈAÑ9MÐMr)   r   rC  Ú
start_timer  c                 óz   • U [        S5      S4;   a  gU S:*  =(       d    [        R                  " 5       U-
  U-   U :„  $ )z4Check if time is up based on start time and max waitrB  NFr   )rÝ   rÞ   Ú	monotonic)rC  rO  r  s      r'   ÚtimeupÚwait_for_url.<locals>.timeup  s@   € àœ˜e› dÐ+Ó+ØØ˜A‘÷ 
Ü�NŠNÓ˜zÑ)¨JÑ6¸ÑAð	
r)   r¯   r%   c                 óž  • SnSnU (       a  U(       d  Sn[        [        U5      5      nX24$  U R                  R                  5         U R                  (       d;  SU R                  -  n[        [        U5      U R                  U R                  US9nX24$ U R                  5       (       d8  SU R                  -  n[        [        U5      U R                  U R                  US9nX24$ ! [        R
                  R                   aK  n[        UUR                  R                  UR                  R                  US9nU[        U5      4s SnA$ SnAff = f)z?Map requests response code/contents to internal "UrlError" typer#   NzRequest timed outrú   zempty response [%s]zbad status code [%s])r   r„   r²   r  rÊ   r   r  r¯   rÀ   rU   r/   r}   rM   r”   )r¯   r%   ÚreasonÚurl_excrt   s        r'   Úhandle_url_responseÚ)wait_for_url.<locals>.handle_url_response  s4  € ð ˆØˆÞžSØ(ˆFÜœz¨&Ó1Ó2ˆGØ�?Ð"ð	#ð ×Ñ×/Ñ/Ô1ð × × Ø*¨h¯m©mÑ<ˆFÜÜ˜6Ó"Ø—]‘]Ø ×(Ñ(Øñ	ˆGð Ð Ð ð —‘—‘à+¨x¯}©}Ñ=ˆFÜÜ˜6Ó"Ø—]‘]Ø ×(Ñ(Øñ	ˆGð Ð Ð øô3 ×"Ñ"×,Ñ,ó 	#ÜØØ—Z‘Z×+Ñ+ØŸ
™
×*Ñ*Øñ	ˆGð œC ›F�?Õ"ûð	#ús   ­C# Ã#EÄA EÅEÅEÚurl_reader_cbÚurlsÚexc_cbÚlog_cbc           	      óØ  >• SnSn U " U5      u  pgT" Xv5      u  p…U(       d
  [        XgSS9$  [        [        R
                  " 5       U-
  5      n
T(       a  ST-  OSnSU=(       d    [        US	S	5      < S
U
< SU< SU< 3nU" U5        [        SS[        U[        5      (       a  [        XƒS9S9$ SS9$ ! [         a  n	SU	-  nU	n Sn	A	NžSn	A	f[         a  n	SU	-  nU	n Sn	A	N·Sn	A	ff = f)z:Execute request, handle response, optionally log exceptionr#   N)r@  zrequest error [%s]zunexpected error [%s]z%ssÚ	unlimitedz	Calling 'r%   z
' failed [r,   z]: rä   ©r%   r¯   r@  )	r?  r   Ú	ExceptionrÎ   rÞ   rQ  ÚgetattrrF   ré   )rY  rZ  rO  r[  r\  rU  r%   r¯   rV  rt   Ú
time_takenÚmax_wait_strÚ
status_msgrW  rC  s                €€r'   Úread_url_handle_exceptionsÚ0wait_for_url.<locals>.read_url_handle_exceptionsA  s	  ø€ ð ˆØˆð
	Ù)¨$Ó/‰MˆCÙ1°(Ó@‰OˆGÞÜ& sÀÑEÐEð ô œŸšÓ)¨JÑ6Ó7ˆ
Þ+3�u˜xÒ'¸‰à×1”7˜7 E¨5Ó1Ò1ÛÛÚð	
ˆ
ñ 	ˆzÔäØØô ˜g¤x×0Ñ0ô ˜gÑ;ñ	
ð 	
ð ñ
ð 	
øô! ó 	Ø)¨AÑ-ˆFØ�GûÜó 	Ø,¨qÑ0ˆFØ�Gûð	ús#   ‡$B5 Â5
C)Â?CÃC)ÃC$Ã$C)rO   c           	      ó6   >• [        U Tc  0 OT" U 5      TUSTS9$ )NF)rU   rí   rO   rî   ró   )r…   )r%   rO   rì   rí   ró   s     €€€r'   Úread_url_cbÚ!wait_for_url.<locals>.read_url_cbm  s-   ø€ ÜØØ$Ñ,‘B±*¸S³/Ø)ØØØ)ñ
ð 	
r)   c                 óÚ  >^• S[         4UU4S jjn/ nT H´  n[        R                  " 5       nT
S:w  aI  T(       dB  T" TU 5      (       a  [        SSSS9s  $ Tb$  T(       a  UT-   U T-   :”  a  [	        U T-   U-
  5      mT" XFXU5      nUR
                  (       a  Us  $ UR                  (       d  M™  UR                  UR                  5        M¶     U(       a  [        U5      OSn	[        SSU	S9$ )zliterate over list of urls, request each one and handle responses
and thrown exceptions individually per url
r%   c                 ó   >• U T" U T5      4$ r‹   r5   )r%   rh  rO   s    €€r'   Úurl_reader_serialÚ@wait_for_url.<locals>.read_url_serial.<locals>.url_reader_serial~  s   ø€ Ø™ S¨'Ó2Ð3Ð3r)   r   Nr_  )	r/   rÞ   rQ  r?  rÎ   r¯   r@  r/  rþ   )rO  rO   r[  r\  rl  Ú
wait_timesr%   ÚnowÚoutr@  Úloop_nrC  Úmust_try_againrh  re  rR  rZ  s    `        €€€€€€€r'   Úread_url_serialÚ%wait_for_url.<locals>.read_url_serialw  så   ù€ ð	4¤3÷ 	4ð 	4ð ˆ
ÛˆCÜ—.’.Ó"ˆCØ˜‹{¦>Ù˜( J×/Ñ/Ü*Ø ¨4¸4ñò ð Ñ(ÞØ˜w™¨*°xÑ*?Ó@ô " :°Ñ#8¸CÑ"?Ó@�Gá,Ø!¨
¸FóˆCð �|�|Ø’
Ø——‘Ø×!Ñ! #§-¡-Ö0ñ+ ö, (2”C˜
”O°tˆ	Ü 4°$À)ÑLÐLr)   c                 ó:   >• [        [        TTUS9nT" UTXU5      $ )z�pass list of urls to dual_stack which sends requests in parallel
handle response and exceptions of the first endpoint to respond
)r&  rO   )r   r=  )	rO  rO   r[  r\  Úurl_reader_parallelrG  rh  re  rZ  s	        €€€€r'   Úread_url_parallelÚ'wait_for_url.<locals>.read_url_parallel›  s4   ø€ ô &ÜØØ%Øñ	
Ðñ *Ø  z¸6ó
ð 	
r)   z3sleep_time and sleep_time_cb are mutually exclusiveNTFr!   rû   )FN)r   )rÎ   rÝ   r   r   r/   r   r   r   r   r   r   ÚExceptionCallbackr?  rÞ   rQ  r„   r¯   r%   r}   r@  r
  rI   rf   )rZ  rC  rO   rD  rì   rí   r  rå   rE  ró   rF  rG  rM  rs  rw  rO  Údo_read_urlÚcalculate_sleep_timer¯   ÚrespÚcurrent_sleep_timeÚcurrent_timerW  rq  rr  rh  re  rR  s   ``  ```  ` `          @@@@@@r'   Úwait_for_urlr  Þ  s\  ÿü€ ð^N¬3ð N´5÷ Nñ
œð 
¬Eð 
¼uõ 
ð'!Üœ;Ñ'ð'!Ü.6´s©mð'!ä	ŒxœÑ!¤3Ð&Ñ	'ô'!ðR*
ÜÜˆE”5œ¤#™¬´Ñ(=Ð=Ñ>Ð>ñ
ð*
ô ”Cœœc™�NÑ#ð	*
ô
 ð*
ô "ð*
ô ð*
ô 
÷*
ð *
ðX
œð 
¤sð 
¬{÷ 
ñ 
ð"Mä	÷"Mõ "MðH
ä	÷
ò 
ô  —’Ó!€JÞ–mÜÐNÓOÐOö 1‰Ð6Gð ð )×>Ð,>Ðà€FØ€HØ
Ù˜:°ÓHˆØˆØ�=�=Ø—8‘8˜TŸ]™]×3Ñ3Ð3Ð3Ø�^�^Ü�JŠJ�t—~‘~Ô&Ø˜a‘ZˆFØ!ˆNÙá1°(¸FÓCÐÙ�(˜JÐ(:×;Ñ;Øð" ð ˜!‘ˆÜ�	‰	Ø?Øô	
ô 	�
Š
Ð%Ô&ô —~’~Ó'ˆÞ�| gÑ-°
¸XÑ0EÓEØ ,°Ñ";Ñ<ˆGØ˜!‹|ààñ= r)   c                   ó^   • \ rS rSr     SS jrS rS rS rS rS r	S	 r
S
 rS rS rSrg)ÚOauthUrlHelperiÝ  Nc                 ó\  • Xl         U=(       d    SU l        X l        X0l        XPl        SU l        SU l        U R                  U R                  U R                   4n[        U5      (       d  SU l        O[        U5      (       d  [        S5      eU R                  5       nU=(       d    0 U l        g )Nr#   TrK  FzBall or none of token_key, token_secret, or consumer_key can be set)Úconsumer_keyÚconsumer_secretÚ	token_keyÚtoken_secretÚskew_data_fileÚ	_do_oauthÚskew_change_limitÚanyÚallr„   Úread_skew_fileÚ	skew_data)rŒ   rƒ  r…  r†  r„  r‡  ÚrequiredÚolds           r'   r�   ÚOauthUrlHelper.__init__Þ  s™   € ð )ÔØ.×4°"ˆÔØ"ŒØ(ÔØ,ÔØˆŒØ!"ˆÔØ—N‘N D×$5Ñ$5°t×7HÑ7HÐIˆÜ�8�}‰}Ø"ˆD�NÜ�X—‘Üð*óð ð
 ×!Ñ!Ó#ˆØŸ ˆ�r)   c                 óš  • U R                   (       a�  [        R                  R                  U R                   5      (       aa  [        R
                  " SU R                    35         [        U R                   SS9 n[        R                  " U5      sS S S 5        sS S S 5        $ g ! , (       d  f       O= fS S S 5        g ! , (       d  f       g = f)NzReading Úr©Úmode)	r‡  Úosr2   Úisfiler   ÚTimedÚopenÚjsonÚload)rŒ   Úfps     r'   rŒ  ÚOauthUrlHelper.read_skew_fileù  s›   € Ø××¤2§7¡7§>¡>°$×2EÑ2E×#FÑ#FÜ×"Ò" X¨d×.AÑ.AÐ-BÐ#CÕDÄdØ×#Ñ#¨#òGàÜ—y’y “}÷Gð G×DÑDð ÷	Gõ Gú×Dð ÷	 EÔDð ús$   Á#B<Á8B"Â	B<Â"
B0	Â,B<Â<
C
c                 óz  • U R                   (       d  g U R                  5       nUc  0 nX#U'   [        R                  " SU R                    35         [	        U R                   SS9 nUR                  [        R                  " U5      5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NzWriting Úwr“  )r‡  rŒ  r   r—  r˜  rm   r™  Údumps)rŒ   r[   ÚvalueÚcurr›  s        r'   Úupdate_skew_fileÚOauthUrlHelper.update_skew_file  s“   € à×"×"ØØ×!Ñ!Ó#ˆØ‰;ØˆCØˆD‰	Ü×Ò ¨$×*=Ñ*=Ð)>Ð?Õ@Ä$Ø×Ñ còC
àØ�H‰H”T—Z’Z “_Ô%÷C
×@Ð@÷ C
õ C
ú×@Õ@ús$   ÁB,Á$&BÂ
B,Â
B)	Â%B,Â,
B:c                 óâ  • [        U[        5      (       a   UR                  S:X  d  UR                  S:X  d  g SUR                  ;  a!  [        R                  SUR                  5        g UR                  S   n [        R                  " [        U5      5      n[        U[        R                  " 5       -
  5      n[        UR                  5      R                  nU R                  R                  US5      n[!        Xu-
  5      U R"                  :”  a'  U R%                  Xe5        [        R                  SXe5        XPR                  U'   g ! [         a   n[        R                  SX$5         S nAg S nAff = f)Ni“  i‘  Údatez$Missing header 'date' in %s responsez#Failed to convert datetime '%s': %sr   z$Setting oauth clockskew for %s to %d)rF   r   rM   rU   rI   rJ   rÞ   rß   r   r`  rÎ   r   r%   Únetlocr�  rD   Úabsr‰  r¢  )rŒ   r.  r¥  Úremote_timert   Úskewr[   Úold_skews           r'   rå   ÚOauthUrlHelper.exception_cb  s  € ä�y¤(×+Ñ+Ø—‘ 3Ó&¨)¯.©.¸CÓ*?àà˜×*Ñ*Ó*Ü�K‰KÐ>À	ÇÁÔOØà× Ñ  Ñ(ˆð	ÜŸ+š+¤i°£oÓ6ˆKô
 �;¤§¢£Ñ,Ó-ˆÜ˜	Ÿ™Ó&×-Ñ-ˆØ—>‘>×%Ñ% d¨AÓ.ˆÜˆx‰Ó $×"8Ñ"8Ó8Ø×!Ñ! $Ô-Ü�K‰KÐ>ÀÔKØ#�‰�tÑàøô ó 	Ü�K‰KÐ=¸tÔGÜûð	ús   Á8E Å
E.ÅE)Å)E.c           	      ó^  • U R                   (       d  0 $ S n[        U5      R                  nU R                  (       a=  X0R                  ;   a.  [	        [
        R
                  " 5       5      U R                  U   -   n[        UU R                  U R                  U R                  U R                  US9$ )N)r%   rƒ  r…  r†  r„  Ú	timestamp)rˆ  r   r¦  r�  rÎ   rÞ   Úoauth_headersrƒ  r…  r†  r„  )rŒ   r%   r­  r[   s       r'   rì   ÚOauthUrlHelper.headers_cb*  s…   € Ø�~�~ØˆIàˆ	Ü˜‹}×#Ñ#ˆØ�>�>˜d§n¡nÓ4ÜœDŸIšI›KÓ(¨4¯>©>¸$Ñ+?Ñ?ˆIäØØ×*Ñ*Ø—n‘nØ×*Ñ*Ø ×0Ñ0Øñ
ð 	
r)   c                 ó²   • [        U R                  UR                  S5      5      US'   [        U R                  UR                  S5      5      US'   U" U0 UD6$ )Nrì   rå   )r   Ú_headers_cbrD   Ú_exception_cb)rŒ   Úwrapped_funcr“   rP   s       r'   Ú_wrappedÚOauthUrlHelper._wrapped<  s\   € Ü&Ø×Ñ˜fŸj™j¨Ó6ó 
ˆˆ|Ñô ")Ø×Ñ §
¡
¨>Ó :ó"
ˆˆ~Ññ ˜TÐ, VÑ,Ð,r)   c                 ó.   • U R                  [        X5      $ r‹   )r´  r  r’   s      r'   r  ÚOauthUrlHelper.wait_for_urlE  s   € Ø�}‰}œ\¨4Ó8Ð8r)   c                 ó.   • U R                  [        X5      $ r‹   )r´  r…   r’   s      r'   r…   ÚOauthUrlHelper.readurlH  s   € Ø�}‰}œW dÓ3Ð3r)   c                 óx   • Sn U(       a  U" U5      nU R                  U5        U$ ! U R                  U5        f = f)NTrä   )rŒ   Úextra_exception_cbr.  Úrets       r'   r²  ÚOauthUrlHelper._exception_cbK  s>   € Øˆð	)Þ!Ù(¨Ó3�à×Ñ˜iÔ(Øˆ
øð ×Ñ˜iÕ(ús   „& ¦9c                 óh   • 0 nU(       a  U" U5      nUR                  U R                  U5      5        U$ r‹   )rü   rì   )rŒ   Úextra_headers_cbr%   rU   s       r'   r±  ÚOauthUrlHelper._headers_cbT  s.   € ØˆÞÙ& sÓ+ˆGØ�‰�t—‘ sÓ+Ô,Øˆr)   )rˆ  rƒ  r„  r‰  r�  r‡  r…  r†  )NNNNz/run/oauth_skew.json)rœ   r�   rž   rŸ   r�   rŒ  r¢  rå   rì   r´  r  r…   r²  r±  r    r5   r)   r'   r�  r�  Ý  sE   † ð ØØØØ-ô#ò6ò&òò8
ò$-ò9ò4òõr)   r�  c           	      óÞ   •  SS K Jn  U(       a  [	        U5      nOS nUR                  UUUUUR                  US9nUR                  U 5      u  pšnU
$ ! [         a  n[        S5      UeS nAff = f)Nr   zoauth support is not available)Úclient_secretÚresource_owner_keyÚresource_owner_secretÚsignature_methodr­  )Úoauthlib.oauth1Úoauth1ÚImportErrorÚNotImplementedErrorr/   ÚClientÚSIGNATURE_PLAINTEXTÚsign)r%   rƒ  r…  r†  r„  r­  rÇ  rt   ÚclientÚ_uriÚsigned_headersÚ_bodys               r'   r®  r®  \  s†   € ðKÝ(ö Ü˜	“N‰	àˆ	à�]‰]ØØ%Ø$Ø*Ø×3Ñ3Øð ð €Fð #)§+¡+¨cÓ"2Ñ€D˜%ØÐøô# ó KÜ!Ð"BÓCÈÐJûðKús   ‚A Á
A,ÁA'Á'A,)rZ   r‹   )r$  é
   )Mr   r>   rb   r™  Úloggingr•  r*  rÞ   Úconcurrent.futuresr   r   r   Úemail.utilsr   Ú	functoolsr   Úhttp.clientr   Ú	itertoolsr	   Ússlr
   Útypingr   r   r   r   r   r   r   r   r   Úurllib.parser   r   r   r   rÊ   r   Ú	cloudinitr   r   r   Ú	getLoggerrœ   rI   r   rÍ   ry  r(   r8   rÎ   rN   r/   rÝ   Údictrv   r~   r‡   r‰   rw   rQ   r   r|   r   rÚ   rã   ré   r…   r+  r#  r=  r?  rf   r  r�  r®  r5   r)   r'   Ú<module>rÞ     s\  ðó Û Û 	Û Û Û 	Û Û ß MÑ MÝ !Ý Ý !Ý Ý &÷
÷ 
õ 
÷ ?Ó >ã Ý ç 0Ñ 0à×Ò˜Ó!€à€Ø˜X z l°DÐ&8Ñ9Ñ:Ð ò"òð ¨sô ñ.�3ð  ð ¸ð Àõ ðDM�Sð M ~ô Mð &à
Ð7Ñ8ô&÷<-ñ -ô3�>ô 3ô
(�.ô (÷
.Kñ .Kôbˆwô òð$ #ð ¨%ô ðJ '+òØðð $ðð ˆe�_õ	ðJ 
ØØØØØØØØØØ&*ØØØØØò%m=ð $ðm=ð$ ð%m=ð& õ'm=ðj "ñØ
�3˜�8Ñ
ðà
ðð ðð �?‰?ð	ð
 �E‰?ðð 	õð* !Øñ	P-Ø
�3˜�8Ñ
ðP-à�C‰yðP-ð ðP-ð ð	P-ð
 ˆ8�C‰=˜( ;Ñ/Ð/Ñ0õP-ôf�jô ñ ˜E“lØ#ØŸ)™)Ø%)ØØ"&Ø&*Ø=AØØ"&Øò|ð ð|ð �e‰_ð	|ð
 ð|ð ˜Ñ"ð|ð ˜‘ð|ð $ð|ð ˜H c¨5 \°5Ð%8Ñ9Ñ:ð|ð ð|ð  ð|ð õ|÷~|ñ |ð@ LPõr)   