Ë
    £ªðio´  ã                   ó”  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZm Z m!Z! d dl"m#Z#m$Z$m%Z%  ejL                  e'«      Z(d	Z)d
Z*dZ+dZ,g d¢Z-dZ.dZ/d„ Z0d„ Z1 G d„ d«      Z2 G d„ de2«      Z3 G d„ de2«      Z4 G d„ de2«      Z5 G d„ de2«      Z6 G d„ de6«      Z7 G d„ de7«      Z8 G d „ d!e8«      Z9 G d"„ d#e8«      Z: G d$„ d%e6«      Z; G d&„ d'e;«      Z< G d(„ d)e6«      Z= G d*„ d+e2«      Z> G d,„ d-e>«      Z? G d.„ d/e>«      Z@ G d0„ d1e3«      ZAd2„ ZBd3„ ZCe4e5e5e>e?e@e=e8e:e9eAd4œZDerd d5lEmFZF eDj�                  eF«       neDj�                  e6e;e7e<d6œ«       d7d8d9d:d;œZHeHj“                  «       D � �ci c]  \  } }| j•                  d<«      d=   |“Œ c}} ZKyc c}} w )>é    N)ÚMapping©Ú
formatdate)Úsha1Úsha256)Ú
itemgetter)ÚHAS_CRTÚMD5_AVAILABLEÚHTTPHeadersÚencodebytesÚensure_unicodeÚget_current_datetimeÚparse_qsÚquoteÚunquoteÚurlsplitÚ
urlunsplit)ÚNoAuthTokenErrorÚNoCredentialsErrorÚUnknownSignatureVersionErrorÚ UnsupportedSignatureVersionError)Úis_valid_ipv6_endpoint_urlÚnormalize_url_pathÚpercent_encode_sequenceÚ@e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855i   z%Y-%m-%dT%H:%M:%SZz%Y%m%dT%H%M%SZ)Ú
connectionÚexpectz
keep-alivezproxy-authenticatezproxy-authorizationÚteÚtrailerztransfer-encodingÚupgradez
user-agentzx-amzn-trace-idzUNSIGNED-PAYLOADz"STREAMING-UNSIGNED-PAYLOAD-TRAILERc                 óê   — t        | «      }|j                  }t        | «      rd|› d�}dddœ}|j                  �9|j                  |j	                  |j
                  «      k7  r|› d|j                  › �}|S )Nú[ú]éP   i»  )ÚhttpÚhttpsú:)r   Úhostnamer   ÚportÚgetÚscheme)ÚurlÚ	url_partsÚhostÚdefault_portss       úd/var/www/acinvestment.org/public_html/aci/backend/venv/lib/python3.12/site-packages/botocore/auth.pyÚ_host_from_urlr1   Q   s}   € ô
 ˜“€IØ×Ñ€DÜ! #Ô&Ø�4�&˜ˆ{ˆàØñ€Mð ‡~�~Ð!Ø�>‰>˜]×.Ñ.¨y×/?Ñ/?Ó@Ò@Ø�V˜1˜YŸ^™^Ð,Ð-ˆDØ€Kó    c                 óÔ   — | j                   }t        |t        «      r&t        j                  |j                  d«      «      }|S t        |t        «      rt        j                  |«      }|S ©Núutf-8)ÚdataÚ
isinstanceÚbytesÚjsonÚloadsÚdecodeÚstr)Úrequestr6   s     r0   Ú_get_body_as_dictr>   d   sT   € ð
 �<‰<€DÜ�$œÔÜ�z‰z˜$Ÿ+™+ gÓ.Ó/ˆð €Kô 
�Dœ#Ô	Ü�z‰z˜$ÓˆØ€Kr2   c                   ó   — e Zd ZdZdZd„ Zy)Ú
BaseSignerFc                 ó   — t        d«      ‚)NÚadd_auth)ÚNotImplementedError©Úselfr=   s     r0   rB   zBaseSigner.add_authu   s   € Ü! *Ó-Ð-r2   N)Ú__name__Ú
__module__Ú__qualname__ÚREQUIRES_REGIONÚREQUIRES_TOKENrB   © r2   r0   r@   r@   q   s   „ Ø€OØ€Nó.r2   r@   c                   ó   — e Zd ZdZ	 d„ Zy)ÚTokenSignerTc                 ó   — || _         y ©N)Ú
auth_token)rE   rP   s     r0   Ú__init__zTokenSigner.__init__   s	   € Ø$ˆ�r2   N)rF   rG   rH   rJ   rQ   rK   r2   r0   rM   rM   y   s   „ Ø€Nðó%r2   rM   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)Ú	SigV2Authz+
    Sign a request with Signature V2.
    c                 ó   — || _         y rO   ©Úcredentials©rE   rV   s     r0   rQ   zSigV2Auth.__init__ˆ   ó
   € Ø&ˆÕr2   c                 óP  — t         j                  d«       t        |j                  «      }|j                  }t        |«      dk(  rd}|j                  › d|j                  › d|› d�}t        j                  | j                  j                  j                  d«      t        ¬«      }g }t        |«      D ]d  }|dk(  rŒ	t        ||   «      }	t!        |j                  d«      d¬	«      }
t!        |	j                  d«      d
¬	«      }|j#                  |
› d|› �«       Œf dj%                  |«      }||z  }t         j                  d|«       |j'                  |j                  d«      «       t)        j*                  |j-                  «       «      j/                  «       j1                  d«      }||fS )Nz$Calculating signature using v2 auth.r   ú/ú
r5   ©Ú	digestmodÚ	SignatureÚ ©Úsafez-_~ú=ú&zString to sign: %s)ÚloggerÚdebugr   r,   ÚpathÚlenÚmethodÚnetlocÚhmacÚnewrV   Ú
secret_keyÚencoder   Úsortedr<   r   ÚappendÚjoinÚupdateÚbase64Ú	b64encodeÚdigestÚstripr;   )rE   r=   ÚparamsÚsplitrf   Ústring_to_signÚlhmacÚpairsÚkeyÚvalueÚ
quoted_keyÚquoted_valueÚqsÚb64s                 r0   Úcalc_signaturezSigV2Auth.calc_signature‹   sj  € Ü�‰Ð;Ô<Ü˜Ÿ™Ó%ˆØ�z‰zˆÜˆt‹9˜Š>ØˆDØ#ŸN™NÐ+¨2¨e¯l©l¨^¸2¸d¸VÀ2ÐFˆÜ—‘Ø×Ñ×'Ñ'×.Ñ.¨wÓ7Ä6ô
ˆð ˆÜ˜&“>ò 		9ˆCð �kÒ!ØÜ˜˜s™Ó$ˆEÜ˜sŸz™z¨'Ó2¸Ô<ˆJÜ  §¡¨gÓ!6¸UÔCˆLØ�L‰L˜J˜< q¨¨Ð7Õ8ð		9ð �X‰X�e‹_ˆØ˜"ÑˆÜ�‰Ð)¨>Ô:Ø�‰�^×*Ñ*¨7Ó3Ô4Ü×Ñ˜uŸ|™|›~Ó.×4Ñ4Ó6×=Ñ=¸gÓFˆØ�CˆyÐr2   c                 ó²  — | j                   €
t        «       ‚|j                  r|j                  }n|j                  }| j                   j                  |d<   d|d<   d|d<   t        j                  t        t        j                  «       «      |d<   | j                   j                  r| j                   j                  |d<   | j                  ||«      \  }}||d<   |S )	NÚAWSAccessKeyIdÚ2ÚSignatureVersionÚ
HmacSHA256ÚSignatureMethodÚ	TimestampÚSecurityTokenr^   )rV   r   r6   rv   Ú
access_keyÚtimeÚstrftimeÚISO8601ÚgmtimeÚtokenr�   )rE   r=   rv   r   Ú	signatures        r0   rB   zSigV2Auth.add_auth§   sÆ   € ð ×ÑÐ#Ü$Ó&Ð&Ø�<Š<à—\‘\‰Fð —^‘^ˆFØ#'×#3Ñ#3×#>Ñ#>ˆÐÑ Ø%(ˆÐ!Ñ"Ø$0ˆÐ Ñ!Ü"Ÿm™m¬G´T·[±[³]ÓCˆˆ{ÑØ×Ñ×!Ò!Ø&*×&6Ñ&6×&<Ñ&<ˆF�?Ñ#Ø×+Ñ+¨G°VÓ<‰ˆˆIØ'ˆˆ{ÑØˆr2   N)rF   rG   rH   Ú__doc__rQ   r�   rB   rK   r2   r0   rS   rS   ƒ   s   „ ñò'òó8r2   rS   c                   ó   — e Zd Zd„ Zd„ Zy)Ú	SigV3Authc                 ó   — || _         y rO   rU   rW   s     r0   rQ   zSigV3Auth.__init__Á   rX   r2   c                 ó  — | j                   €
t        «       ‚d|j                  v r|j                  d= t        d¬«      |j                  d<   | j                   j                  r>d|j                  v r|j                  d= | j                   j                  |j                  d<   t        j                  | j                   j                  j                  d«      t        ¬«      }|j                  |j                  d   j                  d«      «       t        |j                  «       «      j                  «       }d| j                   j                  › d|j                  d«      › �}d	|j                  v r|j                  d	= ||j                  d	<   y )
NÚDateT©ÚusegmtúX-Amz-Security-Tokenr5   r\   zAWS3-HTTPS AWSAccessKeyId=z ,Algorithm=HmacSHA256,Signature=zX-Amzn-Authorization)rV   r   Úheadersr   r�   rj   rk   rl   rm   r   rq   r   rt   ru   rŠ   r;   )rE   r=   Únew_hmacÚencoded_signaturer�   s        r0   rB   zSigV3Auth.add_authÄ   sL  € Ø×ÑÐ#Ü$Ó&Ð&Ø�W—_‘_Ñ$Ø—‘ Ð'Ü",°DÔ"9ˆ�‰˜ÑØ×Ñ×!Ò!Ø%¨¯©Ñ8Ø—O‘OÐ$:Ð;Ø6:×6FÑ6F×6LÑ6LˆG�O‰OÐ2Ñ3Ü—8‘8Ø×Ñ×'Ñ'×.Ñ.¨wÓ7Ä6ô
ˆð 	�‰˜Ÿ™¨Ñ/×6Ñ6°wÓ?Ô@Ü'¨¯©Ó(9Ó:×@Ñ@ÓBÐà(¨×)9Ñ)9×)DÑ)DÐ(Eð F.Ø.?×.FÑ.FÀwÓ.OÐ-PðRð 	ð " W§_¡_Ñ4Ø—‘Ð 6Ð7Ø2;ˆ�‰Ð.Ò/r2   N)rF   rG   rH   rQ   rB   rK   r2   r0   r“   r“   À   s   „ ò'ó<r2   r“   c                   óš   — e Zd ZdZdZd„ Zdd„Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)Ú	SigV4Authz+
    Sign a request with Signature V4.
    Tc                 ó.   — || _         || _        || _        y rO   )rV   Ú_region_nameÚ_service_name©rE   rV   Úservice_nameÚregion_names       r0   rQ   zSigV4Auth.__init__ã   s   € Ø&ˆÔð (ˆÔØ)ˆÕr2   c                 óî   — |r:t        j                  ||j                  d«      t        «      j	                  «       }|S t        j                  ||j                  d«      t        «      j                  «       }|S r4   )rj   rk   rm   r   Ú	hexdigestrt   )rE   r{   ÚmsgÚhexÚsigs        r0   Ú_signzSigV4Auth._signë   s[   € ÙÜ—(‘(˜3 §
¡
¨7Ó 3´VÓ<×FÑFÓHˆCð ˆ
ô —(‘(˜3 §
¡
¨7Ó 3´VÓ<×CÑCÓEˆCØˆ
r2   c                 óÒ   — t        «       }|j                  j                  «       D ]#  \  }}|j                  «       }|t        vsŒ|||<   Œ% d|vrt        |j                  «      |d<   |S )zk
        Select the headers from the request that need to be included
        in the StringToSign.
        r.   )r   rš   ÚitemsÚlowerÚSIGNED_HEADERS_BLACKLISTr1   r,   )rE   r=   Ú
header_mapÚnamer|   Úlnames         r0   Úheaders_to_signzSigV4Auth.headers_to_signò   sn   € ô
 !“]ˆ
Ø"Ÿ?™?×0Ñ0Ó2ò 	*‰KˆD�%Ø—J‘J“LˆEØÔ4Ò4Ø$)�
˜5Ò!ð	*ð ˜Ñ#ô "0°·±Ó!<ˆJ�vÑØÐr2   c                 ó˜   — |j                   r| j                  |j                   «      S | j                  t        |j                  «      «      S rO   )rv   Ú_canonical_query_string_paramsÚ_canonical_query_string_urlr   r,   rD   s     r0   Úcanonical_query_stringz SigV4Auth.canonical_query_string  s:   € ð
 �>Š>Ø×6Ñ6°w·~±~ÓFÐFà×3Ñ3´H¸W¿[¹[Ó4IÓJÐJr2   c           	      ó:  — g }t        |t        «      r|j                  «       }|D ]7  \  }}|j                  t	        |d¬«      t	        t        |«      d¬«      f«       Œ9 g }t        |«      D ]  \  }}|j                  |› d|› �«       Œ dj                  |«      }|S )Nz-_.~r`   rb   rc   )r7   r   r¬   ro   r   r<   rn   rp   )rE   rv   Úkey_val_pairsr{   r|   Úsorted_key_valsr¶   s          r0   r´   z(SigV4Auth._canonical_query_string_params  s¦   € àˆÜ�fœgÔ&Ø—\‘\“^ˆFØ ò 	‰JˆC�Ø× Ñ Ü�s Ô(¬%´°E³
ÀÔ*HÐIõð	ð ˆô ! Ó/ò 	5‰JˆC�Ø×"Ñ" c U¨!¨E¨7Ð#3Õ4ð	5à!$§¡¨/Ó!:ÐØ%Ð%r2   c                 ó.  — d}|j                   r†g }|j                   j                  d«      D ]*  }|j                  d«      \  }}}|j                  ||f«       Œ, g }t	        |«      D ]  \  }}|j                  |› d|› �«       Œ dj                  |«      }|S )Nr_   rc   rb   )Úqueryrw   Ú	partitionro   rn   rp   )	rE   Úpartsr¶   r¸   Úpairr{   Ú_r|   r¹   s	            r0   rµ   z%SigV4Auth._canonical_query_string_url  s§   € Ø!#ÐØ�;Š;àˆMØŸ™×)Ñ)¨#Ó.ò 3�Ø $§¡¨sÓ 3‘��Q˜Ø×$Ñ$ c¨5 \Õ2ð3ð !ˆOô % ]Ó3ò 9‘
��UØ×&Ñ&¨#¨¨a°¨wÐ'7Õ8ð9à%(§X¡X¨oÓ%>Ð"Ø%Ð%r2   c                 óð   ‡ — g }t        t        |«      «      }|D ]J  }dj                  ˆ fd„|j                  |«      D «       «      }|j	                  |› dt        |«      › �«       ŒL dj                  |«      S )a  
        Return the headers that need to be included in the StringToSign
        in their canonical form by converting all header keys to lower
        case, sorting them in alphabetical order and then joining
        them into a string, separated by newlines.
        ú,c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrO   )Ú_header_value)Ú.0ÚvrE   s     €r0   ú	<genexpr>z.SigV4Auth.canonical_headers.<locals>.<genexpr>7  s!   øè ø€ ò Ø*+�×"Ñ" 1×%ñùs   ƒr'   r[   )rn   Úsetrp   Úget_allro   r   )rE   r²   rš   Úsorted_header_namesr{   r|   s   `     r0   Úcanonical_headerszSigV4Auth.canonical_headers-  s   ø€ ð ˆÜ$¤S¨Ó%9Ó:ÐØ&ò 	=ˆCØ—H‘Hó Ø/>×/FÑ/FÀsÓ/Kôó ˆEð �N‰N˜c˜U !¤N°5Ó$9Ð#:Ð;Õ<ð		=ð
 �y‰y˜Ó!Ð!r2   c                 ó@   — dj                  |j                  «       «      S )Nú )rp   rw   )rE   r|   s     r0   rÃ   zSigV4Auth._header_value=  s   € ð �x‰x˜Ÿ™›Ó&Ð&r2   c                 óZ   — t        d„ t        |«      D «       «      }dj                  |«      S )Nc              3   óX   K  — | ]"  }|j                  «       j                  «       –— Œ$ y ­wrO   )r­   ru   )rÄ   Úns     r0   rÆ   z+SigV4Auth.signed_headers.<locals>.<genexpr>F  s   è ø€ ÒI¨q˜Ÿ™›Ÿ™×*ÑIùs   ‚(*ú;)rn   rÇ   rp   )rE   r²   rš   s      r0   Úsigned_headerszSigV4Auth.signed_headersE  s&   € ÜÑI´C¸Ó4HÔIÓIˆØ�x‰x˜Ó Ð r2   c                 ó¨   — |j                   j                  di «      }|j                  d«      }t        |t        «      xr |j                  d«      dk(  S )NÚchecksumÚrequest_algorithmÚinr   )Úcontextr*   r7   Údict)rE   r=   Úchecksum_contextÚ	algorithms       r0   Ú_is_streaming_checksum_payloadz(SigV4Auth._is_streaming_checksum_payloadI  sJ   € Ø"Ÿ?™?×.Ñ.¨z¸2Ó>ÐØ$×(Ñ(Ð)<Ó=ˆ	Ü˜)¤TÓ*ÒO¨y¯}©}¸TÓ/BÀiÑ/OÐOr2   c                 óÚ  — | j                  |«      rt        S | j                  |«      st        S |j                  }|r�t        |d«      rƒ|j                  «       }t        j                  |j                  t        «      }t        «       }t        |d«      D ]  }|j                  |«       Œ |j                  «       }|j                  |«       |S |rt        |«      j                  «       S t         S )NÚseekr2   )rÚ   Ú"STREAMING_UNSIGNED_PAYLOAD_TRAILERÚ_should_sha256_sign_payloadÚUNSIGNED_PAYLOADÚbodyÚhasattrÚtellÚ	functoolsÚpartialÚreadÚPAYLOAD_BUFFERr   Úiterrq   r¦   rÜ   ÚEMPTY_SHA256_HASH)rE   r=   Úrequest_bodyÚpositionÚread_chunksizerÓ   ÚchunkÚhex_checksums           r0   ÚpayloadzSigV4Auth.payloadN  sÖ   € Ø×.Ñ.¨wÔ7Ü5Ð5Ø×1Ñ1°'Ô:ô $Ð#Ø—|‘|ˆÙœG L°&Ô9Ø#×(Ñ(Ó*ˆHÜ&×.Ñ.Ø×!Ñ!¤>óˆNô “xˆHÜ˜n¨cÓ2ò '�Ø—‘ Õ&ð'à#×-Ñ-Ó/ˆLØ×Ñ˜hÔ'ØÐÙô ˜,Ó'×1Ñ1Ó3Ð3ä$Ð$r2   c                 ór   — |j                   j                  d«      sy|j                  j                  dd«      S )Nr&   TÚpayload_signing_enabled)r,   Ú
startswithrÖ   r*   rD   s     r0   rÞ   z%SigV4Auth._should_sha256_sign_payloadh  s1   € à�{‰{×%Ñ% gÔ.Øð
 �‰×"Ñ"Ð#<¸dÓCÐCr2   c                 ó@  — |j                   j                  «       g}| j                  t        |j                  «      j
                  «      }|j                  |«       |j                  | j                  |«      «       | j                  |«      }|j                  | j                  |«      dz   «       |j                  | j                  |«      «       d|j                  v r|j                  d   }n| j                  |«      }|j                  |«       dj                  |«      S )Nr[   úX-Amz-Content-SHA256)rh   ÚupperÚ_normalize_url_pathr   r,   rf   ro   r¶   r²   rÊ   rÑ   rš   rî   rp   )rE   r=   Úcrrf   r²   Úbody_checksums         r0   Úcanonical_requestzSigV4Auth.canonical_requestr  sÞ   € Ø�n‰n×"Ñ"Ó$Ð%ˆØ×'Ñ'¬°·±Ó(=×(BÑ(BÓCˆØ
�	‰	�$ŒØ
�	‰	�$×-Ñ-¨gÓ6Ô7Ø×.Ñ.¨wÓ7ˆØ
�	‰	�$×(Ñ(¨Ó9¸DÑ@ÔAØ
�	‰	�$×%Ñ% oÓ6Ô7Ø! W§_¡_Ñ4Ø#ŸO™OÐ,BÑC‰Mà ŸL™L¨Ó1ˆMØ
�	‰	�-Ô Ø�y‰y˜‹}Ðr2   c                 ó2   — t        t        |«      d¬«      }|S )Nz/~r`   )r   r   )rE   rf   Únormalized_paths      r0   rõ   zSigV4Auth._normalize_url_path�  s   € ÜÔ 2°4Ó 8¸tÔDˆØÐr2   c                 ó"  — | j                   j                  g}|j                  |j                  d   dd «       |j                  | j                  «       |j                  | j
                  «       |j                  d«       dj                  |«      S ©NÚ	timestampr   é   Úaws4_requestrZ   )rV   rŠ   ro   rÖ   r    r¡   rp   ©rE   r=   Úscopes      r0   r  zSigV4Auth.scope…  sp   € Ø×!Ñ!×,Ñ,Ð-ˆØ�‰�W—_‘_ [Ñ1°!°AÐ6Ô7Ø�‰�T×&Ñ&Ô'Ø�‰�T×'Ñ'Ô(Ø�‰�^Ô$Ø�x‰x˜‹Ðr2   c                 óø   — g }|j                  |j                  d   dd «       |j                  | j                  «       |j                  | j                  «       |j                  d«       dj	                  |«      S rü   )ro   rÖ   r    r¡   rp   r   s      r0   Úcredential_scopezSigV4Auth.credential_scope�  sa   € ØˆØ�‰�W—_‘_ [Ñ1°!°AÐ6Ô7Ø�‰�T×&Ñ&Ô'Ø�‰�T×'Ñ'Ô(Ø�‰�^Ô$Ø�x‰x˜‹Ðr2   c                 ó  — dg}|j                  |j                  d   «       |j                  | j                  |«      «       |j                  t        |j	                  d«      «      j                  «       «       dj                  |«      S )z¬
        Return the canonical StringToSign as well as a dict
        containing the original version of all headers that
        were included in the StringToSign.
        úAWS4-HMAC-SHA256rý   r5   r[   )ro   rÖ   r  r   rm   r¦   rp   )rE   r=   rø   Ústss       r0   rx   zSigV4Auth.string_to_sign•  sl   € ð "Ð"ˆØ�
‰
�7—?‘? ;Ñ/Ô0Ø�
‰
�4×(Ñ(¨Ó1Ô2Ø�
‰
”6Ð+×2Ñ2°7Ó;Ó<×FÑFÓHÔIØ�y‰y˜‹~Ðr2   c                 óP  — | j                   j                  }| j                  d|› �j                  «       |j                  d   dd «      }| j                  || j
                  «      }| j                  || j                  «      }| j                  |d«      }| j                  ||d¬«      S )NÚAWS4rý   r   rþ   rÿ   T)r¨   )rV   rl   rª   rm   rÖ   r    r¡   )rE   rx   r=   r{   Úk_dateÚk_regionÚ	k_serviceÚ	k_signings           r0   r�   zSigV4Auth.signature¡  s˜   € Ø×Ñ×)Ñ)ˆØ—‘Ø�C�5ˆ\×!Ñ!Ó# W§_¡_°[Ñ%AÀ!ÀAÐ%Fó
ˆð —:‘:˜f d×&7Ñ&7Ó8ˆØ—J‘J˜x¨×);Ñ);Ó<ˆ	Ø—J‘J˜y¨.Ó9ˆ	Ø�z‰z˜) ^¸ˆzÓ>Ð>r2   c                 óæ  — | j                   €
t        «       ‚t        «       }|j                  t        «      |j
                  d<   | j                  |«       | j                  |«      }t        j                  d«       t        j                  d|«       | j                  ||«      }t        j                  d|«       | j                  ||«      }t        j                  d|«       | j                  ||«       y )Nrý   z$Calculating signature using v4 auth.zCanonicalRequest:
%súStringToSign:
%szSignature:
%s)rV   r   r   rŒ   ÚSIGV4_TIMESTAMPrÖ   Ú_modify_request_before_signingrø   rd   re   rx   r�   Ú_inject_signature_to_request)rE   r=   Údatetime_nowrø   rx   r�   s         r0   rB   zSigV4Auth.add_auth«  sÇ   € Ø×ÑÐ#Ü$Ó&Ð&Ü+Ó-ˆØ'3×'<Ñ'<¼_Ó'Mˆ�‰˜Ñ$ð 	×+Ñ+¨GÔ4Ø ×2Ñ2°7Ó;ÐÜ�‰Ð;Ô<Ü�‰Ð,Ð.?Ô@Ø×,Ñ,¨WÐ6GÓHˆÜ�‰Ð(¨.Ô9Ø—N‘N >°7Ó;ˆ	Ü�‰Ð% yÔ1à×)Ñ)¨'°9Õ=r2   c                 óü   — d| j                  |«      › �g}| j                  |«      }|j                  d| j                  |«      › �«       |j                  d|› �«       dj	                  |«      |j
                  d<   |S )NzAWS4-HMAC-SHA256 Credential=zSignedHeaders=z
Signature=ú, ÚAuthorization)r  r²   ro   rÑ   rp   rš   )rE   r=   r�   Úauth_strr²   s        r0   r  z&SigV4Auth._inject_signature_to_request½  s~   € Ø2°4·:±:¸gÓ3FÐ2GÐHÐIˆØ×.Ñ.¨wÓ7ˆØ�‰Ø˜T×0Ñ0°ÓAÐBÐCô	
ð 	�‰˜* Y KÐ0Ô1Ø+/¯9©9°XÓ+>ˆ�‰˜Ñ(Øˆr2   c                 óš  — d|j                   v r|j                   d= | j                  |«       | j                  j                  r>d|j                   v r|j                   d= | j                  j                  |j                   d<   |j                  j                  dd«      s/d|j                   v r|j                   d= t        |j                   d<   y y )Nr  r™   rð   Tró   )rš   Ú_set_necessary_date_headersrV   r�   rÖ   r*   rß   rD   s     r0   r  z(SigV4Auth._modify_request_before_signingÇ  s®   € Ø˜gŸo™oÑ-Ø—‘ Ð0Ø×(Ñ(¨Ô1Ø×Ñ×!Ò!Ø%¨¯©Ñ8Ø—O‘OÐ$:Ð;Ø6:×6FÑ6F×6LÑ6LˆG�O‰OÐ2Ñ3à�‰×"Ñ"Ð#<¸dÔCØ%¨¯©Ñ8Ø—O‘OÐ$:Ð;Ü6FˆG�O‰OÐ2Ò3ð Dr2   c                 óÈ  — d|j                   v r�|j                   d= t        j                  j                  |j                  d   t        «      }t        t        t        j                  |j                  «       «      «      «      |j                   d<   d|j                   v r|j                   d= y y d|j                   v r|j                   d= |j                  d   |j                   d<   y )Nr–   rý   ú
X-Amz-Date)
rš   ÚdatetimeÚstrptimerÖ   r  r   ÚintÚcalendarÚtimegmÚ	timetuple)rE   r=   Údatetime_timestamps      r0   r  z%SigV4Auth._set_necessary_date_headersÕ  sÁ   € ð �W—_‘_Ñ$Ø—‘ Ð'Ü!)×!2Ñ!2×!;Ñ!;Ø—‘ Ñ,¬oó"Ðô '1Ü”H—O‘OÐ$6×$@Ñ$@Ó$BÓCÓDó'ˆG�O‰O˜FÑ#ð ˜wŸ™Ñ.Ø—O‘O LÑ1ð /ð ˜wŸ™Ñ.Ø—O‘O LÐ1Ø,3¯O©O¸KÑ,HˆG�O‰O˜LÒ)r2   N)F)rF   rG   rH   r‘   rI   rQ   rª   r²   r¶   r´   rµ   rÊ   rÃ   rÑ   rÚ   rî   rÞ   rø   rõ   r  r  rx   r�   rB   r  r  r  rK   r2   r0   rž   rž   Ü   s�   „ ñð €Oò*óòò Kò&ò"&ò "ò 'ò!òPò
%ò4Dòòòòò
ò?ò>ò$òGóIr2   rž   c                   ó.   ‡ — e Zd Zˆ fd„Zˆ fd„Zd„ Zˆ xZS )ÚS3SigV4Authc                 ó–   •— t         ‰| �  |«       d|j                  v r|j                  d= | j                  |«      |j                  d<   y )Nró   )Úsuperr  rš   rî   ©rE   r=   Ú	__class__s     €r0   r  z*S3SigV4Auth._modify_request_before_signingê  sA   ø€ Ü‰Ñ.¨wÔ7Ø! W§_¡_Ñ4Ø—‘Ð 6Ð7à26·,±,¸wÓ2Gˆ�‰Ð.Ò/r2   c                 óä  •— |j                   j                  d«      }t        |dd «      }|€i }|j                  dd «      }|�|S d}|j                   j                  di «      }|j                  d«      }t        |t        «      r|j                  d«      dk(  r|d	   }|j
                  j                  d
«      r||j                  vry|j                   j                  dd«      ryt        ‰| �%  |«      S )NÚclient_configÚs3rð   zContent-MD5rÓ   rÔ   rÕ   Úheaderr°   r&   TÚhas_streaming_inputF)
rÖ   r*   Úgetattrr7   r×   r,   rñ   rš   r%  rÞ   )	rE   r=   r)  Ú	s3_configÚsign_payloadÚchecksum_headerrØ   rÙ   r'  s	           €r0   rÞ   z'S3SigV4Auth._should_sha256_sign_payloadñ  só   ø€ ð  Ÿ™×+Ñ+¨OÓ<ˆÜ˜M¨4°Ó6ˆ	ð ÐØˆIð !—}‘}Ð%>ÀÓEˆØÐ#ØÐð (ˆØ"Ÿ?™?×.Ñ.¨z¸2Ó>ÐØ$×(Ñ(Ð)<Ó=ˆ	Ü�i¤Ô&¨9¯=©=¸Ó+>À(Ò+JØ'¨Ñ/ˆOà—‘×&Ñ& wÔ/Ø g§o¡oÑ5àð �?‰?×ÑÐ4°eÔ<Øô ‰wÑ2°7Ó;Ð;r2   c                 ó   — |S rO   rK   ©rE   rf   s     r0   rõ   zS3SigV4Auth._normalize_url_path  ó   € àˆr2   )rF   rG   rH   r  rÞ   rõ   Ú__classcell__©r'  s   @r0   r#  r#  é  s   ø„ ôHô'<öRr2   r#  c                   ó6   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ fd„Zˆ xZS )ÚS3ExpressAuthTc                ó6   •— t         ‰| �  |||«       || _        y rO   )r%  rQ   Ú_identity_cache)rE   rV   r£   r¤   Úidentity_cacher'  s        €r0   rQ   zS3ExpressAuth.__init__"  s   ø€ ô 	‰Ñ˜ l°KÔ@Ø-ˆÕr2   c                 ó$   •— t         ‰| �  |«       y rO   )r%  rB   r&  s     €r0   rB   zS3ExpressAuth.add_auth(  s   ø€ Ü‰Ñ˜Õ!r2   c                 ó¾   •— t         ‰| �  |«       d|j                  vr#| j                  j                  |j                  d<   d|j                  v r|j                  d= y y )Nzx-amz-s3session-tokenr™   )r%  r  rš   rV   r�   r&  s     €r0   r  z,S3ExpressAuth._modify_request_before_signing+  sU   ø€ Ü‰Ñ.¨wÔ7Ø"¨'¯/©/Ñ9Ø7;×7GÑ7G×7MÑ7MˆG�O‰OÐ3Ñ4à! W§_¡_Ñ4Ø—‘Ð 6Ñ7ð 5r2   )rF   rG   rH   ÚREQUIRES_IDENTITY_CACHErQ   rB   r  r4  r5  s   @r0   r7  r7    s   ø„ Ø"Ðô.ô"÷8ð 8r2   r7  c                   ó   — e Zd ZdZd„ Zy)ÚS3ExpressPostAuthTc                 óö  — t        «       }|j                  t        «      |j                  d<   i }|j                  j	                  dd «      �|j                  d   }i }g }|j                  j	                  dd «      �&|j                  d   }|j	                  dd «      �|d   }||d<   d|d<   | j                  |«      |d<   |j                  d   |d<   |j                  ddi«       |j                  d| j                  |«      i«       |j                  d|j                  d   i«       | j                  j                  �@| j                  j                  |d	<   |j                  d	| j                  j                  i«       t        j                  t        j                  |«      j                  d
«      «      j                  d
«      |d<   | j                  |d   |«      |d<   ||j                  d<   ||j                  d<   y )Nrý   ús3-presign-post-fieldsús3-presign-post-policyÚ
conditionsr  úx-amz-algorithmúx-amz-credentialú
x-amz-dateúX-Amz-S3session-Tokenr5   Úpolicyúx-amz-signature©r   rŒ   r  rÖ   r*   r  ro   rV   r�   rr   rs   r9   Údumpsrm   r;   r�   ©rE   r=   r  ÚfieldsrH  rC  s         r0   rB   zS3ExpressPostAuth.add_auth7  så  € Ü+Ó-ˆØ'3×'<Ñ'<¼_Ó'Mˆ�‰˜Ñ$àˆØ�?‰?×ÑÐ7¸Ó>ÐJØ—_‘_Ð%=Ñ>ˆFàˆØˆ
Ø�?‰?×ÑÐ7¸Ó>ÐJØ—_‘_Ð%=Ñ>ˆFØ�z‰z˜,¨Ó-Ð9Ø# LÑ1�
à)ˆˆ|Ñà$6ˆÐ Ñ!Ø%)§Z¡Z°Ó%8ˆÐ!Ñ"Ø&Ÿ™¨{Ñ;ˆˆ|Ñà×ÑÐ,Ð.@ÐAÔBØ×ÑÐ-¨t¯z©z¸'Ó/BÐCÔDØ×Ñ˜<¨¯©¸Ñ)EÐFÔGà×Ñ×!Ñ!Ð-Ø.2×.>Ñ.>×.DÑ.DˆFÐ*Ñ+Ø×ÑØ(¨$×*:Ñ*:×*@Ñ*@ÐAôô
 "×+Ñ+Ü�J‰J�vÓ×%Ñ% gÓ.ó
ç
‰&�‹/ð 	ˆxÑð %)§N¡N°6¸(Ñ3CÀWÓ$MˆÐ Ñ!à4:ˆ�‰Ð0Ñ1Ø4:ˆ�‰Ð0Ò1r2   N)rF   rG   rH   r=  rB   rK   r2   r0   r?  r?  4  s   „ Ø"Ðó';r2   r?  c                   óD   ‡ — e Zd ZdZdZedœˆ fd„
Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )	ÚS3ExpressQueryAuthi,  T)Úexpiresc                ó:   •— t         ‰| �  ||||¬«       || _        y )N)r:  ©r%  rQ   Ú_expires)rE   rV   r£   r¤   r:  rP  r'  s         €r0   rQ   zS3ExpressQueryAuth.__init__e  s,   ø€ ô 	‰ÑØØØØ)ð	 	ô 	
ð  ˆ�r2   c                 óN  — |j                   j                  d«      }d}||k(  r|j                   d= | j                  | j                  |«      «      }d| j	                  |«      |j
                  d   | j                  |dœ}| j                  j                  �| j                  j                  |d<   t        |j                  «      }t        |j                  d¬«      }|j                  «       D ��	ci c]  \  }}	||	d	   “Œ }
}}	|j                  r"|
j                  |j                  «       i |_        d
}|j                   r!|
j                  t#        |«      «       d
|_        |
rt%        |
«      dz   }|› t%        |«      › �}|}|d	   |d   |d   ||d   f}t'        |«      |_
        y c c}	}w )Núcontent-typeú0application/x-www-form-urlencoded; charset=utf-8r  rý   ©zX-Amz-AlgorithmzX-Amz-Credentialr  zX-Amz-ExpireszX-Amz-SignedHeadersrG  T©Úkeep_blank_valuesr   r_   rc   é   é   é   ©rš   r*   rÑ   r²   r  rÖ   rS  rV   r�   r   r,   r   r»   r¬   rv   rq   r6   r>   r   r   )rE   r=   Úcontent_typeÚblocklisted_content_typerÑ   Úauth_paramsr-   Úquery_string_partsÚkrÅ   Ú
query_dictÚoperation_paramsÚnew_query_stringÚpÚnew_url_partss                  r0   r  z1S3ExpressQueryAuth._modify_request_before_signingv  s«  € ð —‘×*Ñ*¨>Ó:ˆà>ð 	!ð Ð3Ò3Ø—‘ Ð/ð
 ×,Ñ,¨T×-AÑ-AÀ'Ó-JÓKˆð  2Ø $§
¡
¨7Ó 3Ø!Ÿ/™/¨+Ñ6Ø!Ÿ]™]Ø#1ñ
ˆð ×Ñ×!Ñ!Ð-Ø37×3CÑ3C×3IÑ3IˆKÐ/Ñ0ô ˜WŸ[™[Ó)ˆ	ô & i§o¡oÈÔNÐØ*<×*BÑ*BÓ*D×E¡$ ! Q�a˜˜1™‘gÐEˆ
ÑEà�>Š>Ø×Ñ˜gŸn™nÔ-ØˆGŒNð ÐØ�<Š<ð ×ÑÔ/°Ó8Ô9ØˆGŒLÙÜ6°zÓBÀSÑHÐàÐ Ô!8¸Ó!EÐ FÐGð 	ð ˆØ˜1™˜q ™t Q q¡TÐ+;¸Q¸q¹TÐBˆÜ  Ó/ˆ�ùóA Fó   Ã,F!c                 ó4   — |xj                   d|› �z  c_         y ©Nz&X-Amz-Signature=©r,   ©rE   r=   r�   s      r0   r  z/S3ExpressQueryAuth._inject_signature_to_request·  ó   € ð 	�ŠÐ*¨9¨+Ð6Ñ6Žr2   c                 ó   — |S rO   rK   r2  s     r0   rõ   z&S3ExpressQueryAuth._normalize_url_path½  r3  r2   c                 ó   — t         S rO   ©rß   rD   s     r0   rî   zS3ExpressQueryAuth.payloadÁ  ó
   € ô
  Ðr2   )rF   rG   rH   ÚDEFAULT_EXPIRESr=  rQ   r  r  rõ   rî   r4  r5  s   @r0   rO  rO  a  s-   ø„ Ø€OØ"Ðð  ö ò"?0òB7òö r2   rO  c                   ó2   ‡ — e Zd ZdZefˆ fd„	Zd„ Zd„ Zˆ xZS )ÚSigV4QueryAuthé  c                 ó6   •— t         ‰| �  |||«       || _        y rO   rR  )rE   rV   r£   r¤   rP  r'  s        €r0   rQ   zSigV4QueryAuth.__init__Ì  s   ø€ ô 	‰Ñ˜ l°KÔ@Øˆ�r2   c                 óN  — |j                   j                  d«      }d}||k(  r|j                   d= | j                  | j                  |«      «      }d| j	                  |«      |j
                  d   | j                  |dœ}| j                  j                  �| j                  j                  |d<   t        |j                  «      }t        |j                  d¬«      }|j                  «       D ��	ci c]  \  }}	||	d	   “Œ }
}}	|j                  r"|
j                  |j                  «       i |_        d
}|j                   r!|
j                  t#        |«      «       d
|_        |
rt%        |
«      dz   }|› t%        |«      › �}|}|d	   |d   |d   ||d   f}t'        |«      |_
        y c c}	}w )NrU  rV  r  rý   rW  r™   TrX  r   r_   rc   rZ  r[  r\  r]  )rE   r=   r^  Úblacklisted_content_typerÑ   r`  r-   ra  rb  rÅ   rc  rd  re  rf  rg  s                  r0   r  z-SigV4QueryAuth._modify_request_before_signingÒ  s«  € ð —‘×*Ñ*¨>Ó:ˆà>ð 	!ð Ð3Ò3Ø—‘ Ð/ð
 ×,Ñ,¨T×-AÑ-AÀ'Ó-JÓKˆð  2Ø $§
¡
¨7Ó 3Ø!Ÿ/™/¨+Ñ6Ø!Ÿ]™]Ø#1ñ
ˆð ×Ñ×!Ñ!Ð-Ø26×2BÑ2B×2HÑ2HˆKÐ.Ñ/ô ˜WŸ[™[Ó)ˆ	ô & i§o¡oÈÔNÐØ*<×*BÑ*BÓ*D×E¡$ ! Q�a˜˜1™‘gÐEˆ
ÑEà�>Š>Ø×Ñ˜gŸn™nÔ-ØˆGŒNð ÐØ�<Š<ð ×ÑÔ/°Ó8Ô9ØˆGŒLÙÜ6°zÓBÀSÑHÐàÐ Ô!8¸Ó!EÐ FÐGð 	ð ˆØ˜1™˜q ™t Q q¡TÐ+;¸Q¸q¹TÐBˆÜ  Ó/ˆ�ùóA Frh  c                 ó4   — |xj                   d|› �z  c_         y rj  rk  rl  s      r0   r  z+SigV4QueryAuth._inject_signature_to_request  rm  r2   )rF   rG   rH   rr  rQ   r  r  r4  r5  s   @r0   rt  rt  É  s   ø„ Ø€Oð ?Nõ ò?0öB7r2   rt  c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚS3SigV4QueryAutha  S3 SigV4 auth using query parameters.

    This signer will sign a request using query parameters and signature
    version 4, i.e a "presigned url" signer.

    Based off of:

    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

    c                 ó   — |S rO   rK   r2  s     r0   rõ   z$S3SigV4QueryAuth._normalize_url_path&  r3  r2   c                 ó   — t         S rO   rp  rD   s     r0   rî   zS3SigV4QueryAuth.payload*  rq  r2   N)rF   rG   rH   r‘   rõ   rî   rK   r2   r0   r{  r{    s   „ ñ	òó r2   r{  c                   ó   — e Zd ZdZd„ Zy)ÚS3SigV4PostAuthz†
    Presigns a s3 post

    Implementation doc here:
    http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html
    c                 óö  — t        «       }|j                  t        «      |j                  d<   i }|j                  j	                  dd «      �|j                  d   }i }g }|j                  j	                  dd «      �&|j                  d   }|j	                  dd «      �|d   }||d<   d|d<   | j                  |«      |d<   |j                  d   |d<   |j                  ddi«       |j                  d| j                  |«      i«       |j                  d|j                  d   i«       | j                  j                  �@| j                  j                  |d	<   |j                  d	| j                  j                  i«       t        j                  t        j                  |«      j                  d
«      «      j                  d
«      |d<   | j                  |d   |«      |d<   ||j                  d<   ||j                  d<   y )Nrý   rA  rB  rC  r  rD  rE  rF  úx-amz-security-tokenr5   rH  rI  rJ  rL  s         r0   rB   zS3SigV4PostAuth.add_auth:  sã  € Ü+Ó-ˆØ'3×'<Ñ'<¼_Ó'Mˆ�‰˜Ñ$àˆØ�?‰?×ÑÐ7¸Ó>ÐJØ—_‘_Ð%=Ñ>ˆFàˆØˆ
Ø�?‰?×ÑÐ7¸Ó>ÐJØ—_‘_Ð%=Ñ>ˆFØ�z‰z˜,¨Ó-Ð9Ø# LÑ1�
à)ˆˆ|Ñà$6ˆÐ Ñ!Ø%)§Z¡Z°Ó%8ˆÐ!Ñ"Ø&Ÿ™¨{Ñ;ˆˆ|Ñà×ÑÐ,Ð.@ÐAÔBØ×ÑÐ-¨t¯z©z¸'Ó/BÐCÔDØ×Ñ˜<¨¯©¸Ñ)EÐFÔGà×Ñ×!Ñ!Ð-Ø-1×-=Ñ-=×-CÑ-CˆFÐ)Ñ*Ø×ÑÐ5°t×7GÑ7G×7MÑ7MÐNÔOô "×+Ñ+Ü�J‰J�vÓ×%Ñ% gÓ.ó
ç
‰&�‹/ð 	ˆxÑð %)§N¡N°6¸(Ñ3CÀWÓ$MˆÐ Ñ!à4:ˆ�‰Ð0Ñ1Ø4:ˆ�‰Ð0Ò1r2   N©rF   rG   rH   r‘   rB   rK   r2   r0   r  r  2  s   „ ñó%;r2   r  c                   ób   — e Zd Zg d¢Zdd„Zd„ Zd„ Zd„ Zd„ Zdd„Z		 dd	„Z
	 dd
„Zd„ Zd„ Zd„ Zy)Ú
HmacV1Auth)$Ú
accelerateÚaclÚcorsÚdefaultObjectAclÚlocationÚloggingÚ
partNumberrH  ÚrequestPaymentÚtorrentÚ
versioningÚ	versionIdÚversionsÚwebsiteÚuploadsÚuploadIdzresponse-content-typezresponse-content-languagezresponse-expireszresponse-cache-controlzresponse-content-dispositionzresponse-content-encodingÚdeleteÚ	lifecycleÚtaggingÚrestoreÚstorageClassÚnotificationÚreplicationrŒ  Ú	analyticsÚmetricsÚ	inventoryÚselectzselect-typezobject-lockNc                 ó   — || _         y rO   rU   r¢   s       r0   rQ   zHmacV1Auth.__init__‹  rX   r2   c                 ó*  — t        j                  | j                  j                  j	                  d«      t
        ¬«      }|j                  |j	                  d«      «       t        |j                  «       «      j                  «       j                  d«      S )Nr5   r\   )rj   rk   rV   rl   rm   r   rq   r   rt   ru   r;   )rE   rx   r›   s      r0   Úsign_stringzHmacV1Auth.sign_stringŽ  sk   € Ü—8‘8Ø×Ñ×'Ñ'×.Ñ.¨wÓ7Ä4ô
ˆð 	�‰˜×-Ñ-¨gÓ6Ô7Ü˜8Ÿ?™?Ó,Ó-×3Ñ3Ó5×<Ñ<¸WÓEÐEr2   c                 ó,  — g d¢}g }d|v r|d= | j                  «       |d<   |D ]_  }d}|D ]B  }|j                  «       }||   €Œ||k(  sŒ|j                  ||   j                  «       «       d}ŒD |rŒO|j                  d«       Œa dj	                  |«      S )N)úcontent-md5rU  Údater–   FTr_   r[   )Ú	_get_dater­   ro   ru   rp   )rE   rš   Úinteresting_headersÚhoiÚihÚfoundr{   Úlks           r0   Úcanonical_standard_headersz%HmacV1Auth.canonical_standard_headers•  s¨   € ÚEÐØˆØ�WÑØ˜�ØŸ.™.Ó*ˆ�‰Ø%ò 	ˆBØˆEØò !�Ø—Y‘Y“[�Ø˜3‘<Ñ+°°b³Ø—J‘J˜w s™|×1Ñ1Ó3Ô4Ø ‘Eð	!ò
 Ø—
‘
˜2•ð	ð �y‰y˜‹~Ðr2   c                 óP  — g }i }|D ]T  }|j                  «       }||   €Œ|j                  d«      sŒ+dj                  d„ |j                  |«      D «       «      ||<   ŒV t	        |j                  «       «      }|D ]  }|j                  |› d||   › �«       Œ dj                  |«      S )Núx-amz-rÁ   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrO   )ru   )rÄ   rÅ   s     r0   rÆ   z6HmacV1Auth.canonical_custom_headers.<locals>.<genexpr>­  s   è ø€ ò 2Ø&'˜Ÿ™Ÿ	ñ2ùs   ‚r'   r[   )r­   rñ   rp   rÈ   rn   Úkeysro   )rE   rš   r§  Úcustom_headersr{   rª  Úsorted_header_keyss          r0   Úcanonical_custom_headersz#HmacV1Auth.canonical_custom_headers¦  sµ   € ØˆØˆØò 	ˆCØ—‘“ˆBØ�s‰|Ñ'Ø—=‘= Õ*Ø),¯©ñ 2Ø+2¯?©?¸3Ó+?ô2ó *�N 2Ò&ð		ô $ N×$7Ñ$7Ó$9Ó:ÐØ%ò 	7ˆCØ�J‰J˜#˜˜a ¨sÑ 3Ð4Ð5Õ6ð	7à�y‰y˜‹~Ðr2   c                 óH   — t        |«      dk(  r|S |d   t        |d   «      fS )z(
        TODO: Do we need this?
        rZ  r   )rg   r   )rE   Únvs     r0   Ú	unquote_vzHmacV1Auth.unquote_vµ  s+   € ô ˆr‹7�aŠ<ØˆIà�q‘Eœ7 2 a¡5›>Ð*Ð*r2   c                 óò  — |�|}n|j                   }|j                  rÊ|j                  j                  d«      }|D �cg c]  }|j                  dd«      ‘Œ }}|D �cg c]%  }|d   | j                  v sŒ| j	                  |«      ‘Œ' }}t        |«      dkD  rR|j                  t        d«      ¬«       |D �cg c]  }dj                  |«      ‘Œ }}|dz  }|dj                  |«      z  }|S c c}w c c}w c c}w )Nrc   rb   rZ  r   )r{   ú?)	rf   r»   rw   ÚQSAOfInterestrµ  rg   Úsortr   rp   )rE   rw   Ú	auth_pathÚbufÚqsaÚas         r0   Úcanonical_resourcezHmacV1Auth.canonical_resource¾  sí   € ð Ð Ø‰Cà—*‘*ˆCØ�;Š;Ø—+‘+×#Ñ# CÓ(ˆCØ,/Ö0 q�1—7‘7˜3 •?Ð0ˆCÐ0à+.öØ&'°!°A±$¸$×:LÑ:LÒ2L�—‘˜qÕ!ðˆCð ô �3‹x˜!Š|Ø—‘œZ¨›]�Ô+Ø,/Ö0 q�s—x‘x •{Ð0�Ð0Ø�s‘
�Ø�s—x‘x “}Ñ$�Øˆ
ùò 1ùòùò
 1s   ½C*ÁC/Á3C/Â5C4c                 ó¼   — |j                  «       dz   }|| j                  |«      dz   z  }| j                  |«      }|r||dz   z  }|| j                  ||¬«      z  }|S )Nr[   ©rº  )rô   r«  r²  r¾  )rE   rh   rw   rš   rP  rº  Úcsr°  s           r0   Úcanonical_stringzHmacV1Auth.canonical_stringØ  so   € ð �\‰\‹^˜dÑ"ˆØ
ˆd×-Ñ-¨gÓ6¸Ñ=Ñ=ˆØ×6Ñ6°wÓ?ˆÙØ�. 4Ñ'Ñ'ˆBØ
ˆd×%Ñ% e°yÐ%ÓAÑAˆØˆ	r2   c                 óÞ   — | j                   j                  r|d= | j                   j                  |d<   | j                  ||||¬«      }t        j	                  d|«       | j                  |«      S )Nr�  rÀ  r  )rV   r�   rÂ  rd   re   r¡  )rE   rh   rw   rš   rP  rº  rx   s          r0   Úget_signaturezHmacV1Auth.get_signatureã  ss   € ð ×Ñ×!Ò!ØÐ.Ð/Ø.2×.>Ñ.>×.DÑ.DˆGÐ*Ñ+Ø×.Ñ.Ø�E˜7¨ið /ó 
ˆô 	�‰Ð(¨.Ô9Ø×Ñ Ó/Ð/r2   c                 óF  — | j                   €t        ‚t        j                  d«       t	        |j
                  «      }t        j                  d|j                  «       | j                  |j                  ||j                  |j                  ¬«      }| j                  ||«       y )Nz(Calculating signature using hmacv1 auth.zHTTP request method: %srÀ  )rV   r   rd   re   r   r,   rh   rÄ  rš   rº  Ú_inject_signature)rE   r=   rw   r�   s       r0   rB   zHmacV1Auth.add_authï  s€   € Ø×ÑÐ#Ü$Ð$Ü�‰Ð?Ô@Ü˜Ÿ™Ó%ˆÜ�‰Ð.°·±Ô?Ø×&Ñ&Ø�N‰N˜E 7§?¡?¸g×>OÑ>Oð 'ó 
ˆ	ð 	×Ñ˜w¨	Õ2r2   c                 ó   — t        d¬«      S )NTr—   r   ©rE   s    r0   r¥  zHmacV1Auth._get_dateú  s   € Ü Ô&Ð&r2   c                 ó�   — d|j                   v r|j                   d= d| j                  j                  › d|› �}||j                   d<   y )Nr  zAWS r'   )rš   rV   rŠ   )rE   r=   r�   Úauth_headers       r0   rÆ  zHmacV1Auth._inject_signatureý  sI   € Ø˜gŸo™oÑ-ð —‘ Ð0à˜T×-Ñ-×8Ñ8Ð9¸¸9¸+ÐFˆØ+6ˆ�‰˜Ò(r2   )NNrO   )rF   rG   rH   r¸  rQ   r¡  r«  r²  rµ  r¾  rÂ  rÄ  rB   r¥  rÆ  rK   r2   r0   r„  r„  b  sN   „ ò%€MóN'òFòò"ò+óð6 ?Có	ð ?Có
0ò	3ò'ó7r2   r„  c                   ó*   — e Zd ZdZdZefd„Zd„ Zd„ Zy)ÚHmacV1QueryAuthzÁ
    Generates a presigned request for s3.

    Spec from this document:

    http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
    #RESTAuthenticationQueryStringAuth

    ru  c                 ó    — || _         || _        y rO   )rV   rS  )rE   rV   rP  s      r0   rQ   zHmacV1QueryAuth.__init__  s   € Ø&ˆÔØˆ�r2   c                 óz   — t        t        t        j                  «       t        | j                  «      z   «      «      S rO   )r<   r  r‹   rS  rÈ  s    r0   r¥  zHmacV1QueryAuth._get_date  s&   € Ü”3”t—y‘y“{¤S¨¯©Ó%7Ñ7Ó8Ó9Ð9r2   c                 óª  — i }| j                   j                  |d<   ||d<   |j                  D ]R  }|j                  «       }|dk(  r|j                  d   |d<   Œ+|j	                  d«      s|dv sŒA|j                  |   ||<   ŒT t        |«      }t        |j                  «      }|d   r
|d   › d|› �}|d	   |d
   |d   ||d   f}t        |«      |_        y )Nrƒ   r^   r–   ÚExpiresr­  )r£  rU  é   rc   r   rZ  r[  r\  )	rV   rŠ   rš   r­   rñ   r   r   r,   r   )	rE   r=   r�   rc  Ú
header_keyrª  re  rf  rg  s	            r0   rÆ  z!HmacV1QueryAuth._inject_signature  sþ   € Øˆ
Ø'+×'7Ñ'7×'BÑ'Bˆ
Ð#Ñ$Ø"+ˆ
�;Ñà!Ÿ/™/ò 	5ˆJØ×!Ñ!Ó#ˆBð ˜VÒ#Ø(/¯©¸Ñ(?�
˜9Ò%ð —‘˜xÔ(¨Bð 3ò -ð ")§¡°Ñ!4�
˜2’ð	5ô  3°:Ó>Ðô �W—[‘[Ó!ˆØˆQŠ4ð #$ A¡$  qÐ)9Ð(:Ð;ÐØ˜1™˜q ™t Q q¡TÐ+;¸Q¸q¹TÐBˆÜ  Ó/ˆ�r2   N)rF   rG   rH   r‘   rr  rQ   r¥  rÆ  rK   r2   r0   rÌ  rÌ    s    „ ñð €Oà,;ó  ò:ó0r2   rÌ  c                   ó   — e Zd ZdZd„ Zy)ÚHmacV1PostAuthz‘
    Generates a presigned post for s3.

    Spec from this document:

    http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
    c                 óÎ  — i }|j                   j                  dd «      �|j                   d   }i }g }|j                   j                  dd «      �&|j                   d   }|j                  dd «      �|d   }||d<   | j                  j                  |d<   | j                  j                  �@| j                  j                  |d<   |j                  d| j                  j                  i«       t        j                  t        j                  |«      j                  d«      «      j                  d«      |d<   | j                  |d   «      |d<   ||j                   d<   ||j                   d<   y )	NrA  rB  rC  rƒ   r�  r5   rH  r�   )rÖ   r*   rV   rŠ   r�   ro   rr   rs   r9   rK  rm   r;   r¡  )rE   r=   rM  rH  rC  s        r0   rB   zHmacV1PostAuth.add_authI  sX  € ØˆØ�?‰?×ÑÐ7¸Ó>ÐJØ—_‘_Ð%=Ñ>ˆFàˆØˆ
Ø�?‰?×ÑÐ7¸Ó>ÐJØ—_‘_Ð%=Ñ>ˆFØ�z‰z˜,¨Ó-Ð9Ø# LÑ1�
à)ˆˆ|Ñà#'×#3Ñ#3×#>Ñ#>ˆÐÑ à×Ñ×!Ñ!Ð-Ø-1×-=Ñ-=×-CÑ-CˆFÐ)Ñ*Ø×ÑÐ5°t×7GÑ7G×7MÑ7MÐNÔOô "×+Ñ+Ü�J‰J�vÓ×%Ñ% gÓ.ó
ç
‰&�‹/ð 	ˆxÑð #×.Ñ.¨v°hÑ/?Ó@ˆˆ{Ñà4:ˆ�‰Ð0Ñ1Ø4:ˆ�‰Ð0Ò1r2   Nr‚  rK   r2   r0   rÔ  rÔ  @  s   „ ñó;r2   rÔ  c                   ó   — e Zd ZdZd„ Zy)Ú
BearerAuthzÑ
    Performs bearer token authorization by placing the bearer token in the
    Authorization header as specified by Section 2.1 of RFC 6750.

    https://datatracker.ietf.org/doc/html/rfc6750#section-2.1
    c                 ó¶   — | j                   €
t        «       ‚d| j                   j                  › �}d|j                  v r|j                  d= ||j                  d<   y )NzBearer r  )rP   r   r�   rš   )rE   r=   rÊ  s      r0   rB   zBearerAuth.add_authp  sR   € Ø�?‰?Ð"Ü"Ó$Ð$à §¡× 5Ñ 5Ð6Ð7ˆØ˜gŸo™oÑ-Ø—‘ Ð0Ø+6ˆ�‰˜Ò(r2   Nr‚  rK   r2   r0   r×  r×  h  s   „ ñó7r2   r×  c                 óš   — | D ];  }|dk(  rt         |   c S |t         v rt         |   }|t        v sŒ-|c S t        |¬«      ‚ t        | ¬«      ‚)Núsmithy.api#noAuth©Úsignature_version)ÚAUTH_TYPE_TO_SIGNATURE_VERSIONÚAUTH_TYPE_MAPSr   r   )Ú
auth_traitÚ	auth_typerÜ  s      r0   Úresolve_auth_typerá  z  sa   € Øò Lˆ	ØÐ+Ò+Ü1°)Ñ<Ò<ØÔ8Ñ8Ü >¸yÑ IÐØ ¤NÒ2Ø(Ò(ä.ÀÔKÐKðLô +¸ZÔ
HÐHr2   c                 óÎ  — |D �cg c]  }|j                  d«      d   ‘Œ }}| D �cg c]  }|t        vr|‘Œ }}|rt        j                  d|«       | |z   }t        j                  |«      D �cg c]  }||v r|‘Œ
 }}|D ]3  }|dk(  rt        |   c S t        j                  |«      }|t        v sŒ1|c S  t        dj                  t        |«      «      ¬«      ‚c c}w c c}w c c}w )Nú#éÿÿÿÿz/Unsupported auth schemes in preference list: %rÚnoAuthr  rÛ  )rw   ÚAUTH_PREF_TO_SIGNATURE_VERSIONrd   re   r×   Úfromkeysr*   rÞ  r   rp   rn   )Úpreference_listÚauth_optionsr+   Úservice_supportedÚunsupportedÚcombinedÚprioritized_schemesÚsig_versions           r0   Úresolve_auth_scheme_preferencerï  ‡  s  € Ø=IÖJ°6˜Ÿ™ cÓ*¨2Ó.ÐJÐÐJð &öàØÔ7Ñ7ò 	ð€Kð ñ
 Ü�‰Ø=¸{ô	
ð Ð!2Ñ2€Hô —m‘m HÓ-öàØÐ&Ñ&ò 	ðÐð ð &ò ˆØ�XÒÜ1°&Ñ9Ò9Ü4×8Ñ8¸Ó@ˆØœ.Ò(ØÒðô +ØŸ)™)¤FÐ+<Ó$=Ó>ôð ùò5 Kùòùòs   …C¦CÁ-C")Úv2Úv3Úv3httpsr*  zs3-queryzs3-presign-postzs3v4-presign-postzv4-s3expresszv4-s3express-queryzv4-s3express-presign-postÚbearer)ÚCRT_AUTH_TYPE_MAPS)Úv4zv4-queryÚs3v4z
s3v4-queryrõ  Úv4aró  Únone)zaws.auth#sigv4zaws.auth#sigv4azsmithy.api#httpBearerAuthrÚ  rã  rä  )Lrr   r  r  rã   rj   r9   rŠ  r‹   Úcollections.abcr   Úemail.utilsr   Úhashlibr   r   Úoperatorr   Úbotocore.compatr	   r
   r   r   r   r   r   r   r   r   r   Úbotocore.exceptionsr   r   r   r   Úbotocore.utilsr   r   r   Ú	getLoggerrF   rd   rè   ræ   r�   r  r®   rß   rÝ   r1   r>   r@   rM   rS   r“   rž   r#  r7  r?  rO  rt  r{  r  r„  rÌ  rÔ  r×  rá  rï  rÞ  Úbotocore.crt.authrô  rq   rÝ  r¬   rw   ræ  )Úauth_schemerî  s   00r0   ú<module>r     s:  ðó Û Û Û Û Û Û Û Ý #Ý "ß  Ý ÷÷ ÷ ñ ÷ó ÷ñ ð 
ˆ×	Ñ	˜8Ó	$€ð Gð ð €Ø
€Ø"€òÐ ð &Ð Ø%IÐ "òò&
÷.ñ .ô%�*ô %ô:�
ô :ôz<�
ô <ô8JI�
ô JIôZ3�)ô 3ôl8�Kô 8ô**;˜ô *;ôZe ˜ô e ôPN7�Yô N7ôb �~ô  ô0-;�iô -;ô`f7�ô f7ôR20�jô 20ôj%;�Zô %;ôP7�ô 7ò$
IòðB Ø
ØØ
ØØ%Ø(Ø!Ø,Ø!2Øñ€ñ Ý4à×ÑÐ,Õ-à×ÑàØ&ØØ*ñ		
ôð ØØ!)Øñ	"Ð ð %C×$HÑ$HÓ$J÷"á ˆ�[ð ×Ñ�cÓ˜2Ñ Ñ+ó"Ñ ùó "s   Æ G