+
    ‡)Ùjz%  ã                   ón  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ]! R4      tRt ! R	 R
]4      t ! R R]4      tR tR tR tR tR$R ltR tR%R ltR%R ltRRRR/R ltR&R lt ! R R4      t RR] R3R lt!RR] RR3R lt" ! R  R!4      t# ! R" R#]#4      t$R# )'a_  
Functions for creating and restoring url-safe signed JSON objects.

The format used looks like this:

>>> signing.dumps("hello")
'ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk'

There are two components here, separated by a ':'. The first component is a
URLsafe base64 encoded JSON of the object passed to dumps(). The second
component is a base64 encoded hmac/SHA-256 hash of "$first_component:$secret"

signing.loads(s) checks the signature and returns the deserialized object.
If the signature fails, a BadSignature exception is raised.

>>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv422nZA4sgmk")
'hello'
>>> signing.loads("ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv42-modified")
...
BadSignature: Signature "ImhlbGxvIg:1QaUZC:YIye-ze3TTx7gtSv42-modified" does not match

You can optionally compress the JSON prior to base64 encoding it to save
space, using the compress=True argument. This checks if compression actually
helps and only applies compression if the result is a shorter string:

>>> signing.dumps(list(range(1, 20)), compress=True)
'.eJwFwcERACAIwLCF-rCiILN47r-GyZVJsNgkxaFxoDgxcOHGxMKD_T7vhAml:1QaUaL:BA0thEZrp4FQVXIXuOvYJtLJSrQ'

The fact that the string is compressed is signalled by the prefixed '.' at the
start of the base64 JSON.

There are 65 url-safe characters: the 64 used by url-safe base64 and the ':'.
These functions make use of all of them.
N)Úsettings)Úconstant_time_compareÚsalted_hmac©Úforce_bytes)Úimport_string)Ú_lazy_re_compilez^[A-z0-9-_=]*$Ú>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzc                   ó   € ] tR t^4tRtRtR# )ÚBadSignaturezSignature does not match.© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   ó    ÚL/var/www/eggtrainer/venv/lib/python3.14/site-packages/django/core/signing.pyr   r   4   s   † Ù#ãr   r   c                   ó   € ] tR t^:tRtRtR# )ÚSignatureExpiredz3Signature timestamp is older than required max_age.r   Nr   r   r   r   r   r   :   s   † Ù=ãr   r   c                 óª   € V ^ 8X  d   R# V ^ 8  d   RMRp\        V 4      p RpV ^ 8”  d%   \        V ^>4      w  r\        V,          V,           pK+  W,           # )é    Ú0Ú-Ú )ÚabsÚdivmodÚBASE62_ALPHABET)ÚsÚsignÚencodedÚ	remainders   &   r   Ú
b62_encoder$   @   sR   € ØˆA„vÙØ�a”%‰3˜R€DÜˆA‹€AØ€GØ
ˆaŒ%Ü˜a “}‰ˆÜ! )Õ,¨wÕ6ŠØ�>Ðr   c                 ó¶   € V R 8X  d   ^ # ^pV ^ ,          R8X  d   V R,          p Rp^ pV  F&  pV^>,          \         P                  V4      ,           pK(  	  W,          # )r   r   ºé   NNéÿÿÿÿ)r   Úindex)r    r!   ÚdecodedÚdigits   &   r   Ú
b62_decoder,   L   sZ   € ØˆC„xÙØ€DØˆ…tˆs„{Øˆb�EˆØˆØ€GÛˆØ˜B•,¤×!6Ñ!6°uÓ!=Õ=Šñ à�>Ðr   c                 óL   € \         P                  ! V 4      P                  R 4      # ©ó   =)Úbase64Úurlsafe_b64encodeÚstrip)r    s   &r   Ú
b64_encoder3   Y   s   € Ü×#Ò# AÓ&×,Ñ,¨TÓ2Ð2r   c                 ón   € R \        V 4      ) ^,          ,          p\        P                  ! W,           4      # r.   )Úlenr0   Úurlsafe_b64decode)r    Úpads   & r   Ú
b64_decoder8   ]   s)   € Ø
”3�q“6�'˜A•+Õ
€CÜ×#Ò# A¥GÓ,Ð,r   c           	      óf   € \        \        WW#R 7      P                  4       4      P                  4       # )©Ú	algorithm)r3   r   ÚdigestÚdecode)ÚsaltÚvalueÚkeyr;   s   &&&&r   Úbase64_hmacrA   b   s)   € ÜÜ�D Ô:×AÑAÓCóç�fƒhðr   c                 ó&   € R \        V 4      ,           # )s   django.http.cookiesr   )r@   s   &r   Ú_cookie_signer_keyrC   h   s   € à!¤K°Ó$4Õ4Ð4r   r   c                 ó(   € R \        V4       RV V  2# )zdjango.http.cookies.v2:Ú:)r5   ©Úcookie_namer>   s   &&r   Ú_cookie_signer_saltrH   m   s   € à$¤S¨£Y K¨q°°°{°mÐDÐDr   c                 ó   € W,           # ©Nr   rF   s   &&r   Ú_cookie_signer_legacy_saltrK   r   s   € ØÕÐr   r>   Úmax_agec                ó"  €  \        \        W4      R 7      P                  WR7      #   \         d]   p\        P
                  '       dA   \        T\        4      '       g+   \        \        Y4      R 7      P                  YR7      u Rp?# h Rp?ii ; i))r>   )rL   N)	Úget_cookie_signerrH   Úunsignr   r   Ú"SIGNED_COOKIE_LEGACY_SALT_FALLBACKÚ
isinstancer   rK   )Úsigned_valuerG   r>   rL   Úexcs   &$$$ r   Ú_unsign_cookierT   v   sˆ   € ðÜ Ô&9¸+Ó&LÔM×TÑTØð Uó 
ð 	
øô ô Ü×6×6Ð6¼zØÔ!÷@
ò @
ô %Ü/°ÓBôç‰f�\ˆfÓ3õ4ð 	ûðús!   ‚$' §B²AB	ÂBÂB	Â	Bc                 ó°   € \        \        P                  4      pV! \        \        P                  4      \        \        \        P                  4      V R 7      # ))r@   Úfallback_keysr>   )r   r   ÚSIGNING_BACKENDrC   Ú
SECRET_KEYÚmapÚSECRET_KEY_FALLBACKS)r>   ÚSigners   & r   rN   rN   …   sA   € Üœ8×3Ñ3Ó4€FÙÜœx×2Ñ2Ó3ÜÔ,¬h×.KÑ.KÓLØôð r   c                   ó0   a € ] tR t^Žt o RtR tR tRtV tR# )ÚJSONSerializerzK
Simple wrapper around json to be used in signing.dumps and
signing.loads.
c                óP   € \         P                  ! VRR7      P                  R4      # )Ú,)Ú
separatorsúlatin-1)r_   rE   )ÚjsonÚdumpsÚencode)ÚselfÚobjs   &&r   rc   ÚJSONSerializer.dumps”   s   € Ü�zŠz˜#¨*Ô5×<Ñ<¸YÓGÐGr   c                óL   € \         P                  ! VP                  R 4      4      # )ra   )rb   Úloadsr=   )re   Údatas   &&r   ri   ÚJSONSerializer.loads—   s   € Ü�zŠz˜$Ÿ+™+ iÓ0Ó1Ð1r   r   N)	r   r   r   r   r   rc   ri   r   Ú__classdictcell__©Ú__classdict__s   @r   r]   r]   Ž   s   ø‡ € ñò
H÷2ð 2r   r]   zdjango.core.signingFc                ó<   € \        WR7      P                  WVR7      # )a�  
Return URL-safe, hmac signed base64 compressed JSON string. If key is
None, use settings.SECRET_KEY instead. The hmac algorithm is the default
Signer algorithm.

If compress is True (not the default), check if compressing using zlib can
save some space. Prepend a '.' to signify compression. This is included
in the signature, to protect against zip bombs.

Salt can be used to namespace the hash, so that a signed string is
only valid for a given namespace. Leaving this at the default
value or re-using a salt value across different parts of your
application without good cause is a security risk.

The serializer is expected to return a bytestring.
)r@   r>   )Ú
serializerÚcompress)ÚTimestampSignerÚsign_object)rf   r@   r>   rp   rq   s   &&&&&r   rc   rc   ›   s&   € ô& ˜sÔ.×:Ñ:Ø¨Xð ;ó ð r   c                ó@   € \        WVR7      P                  V VVR7      # )zp
Reverse of dumps(), raise BadSignature if signature fails.

The serializer is expected to accept a bytestring.
)r@   r>   rV   )rp   rL   )rr   Úunsign_object)r    r@   r>   rp   rL   rV   s   &&&&&&r   ri   ri   ³   s.   € ô Ø¨-ôç�mØ	ØØð ó ðr   c            
       ón   a € ] tR t^Ét o RRRRRRRRRR/R ltRR	 ltR
 tR t]R3R lt	]3R lt
RtV tR# )r[   r@   NÚseprE   r>   r;   rV   c               ó–  € T;'       g    \         P                  V n        Ve   TM\         P                  V n        W n        T;'       g2    V P                  P                  : RV P                  P                  : 2V n	        T;'       g    RV n
        \        P                  V P
                  4      '       d   \        RV,          4      hR # )NÚ.Úsha256zJUnsafe Signer separator: %r (cannot be empty or consist of only A-z0-9-_=))r   rX   r@   rZ   rV   rw   Ú	__class__r   r   r>   r;   Ú_SEP_UNSAFEÚmatchÚ
ValueError)re   r@   rw   r>   r;   rV   s   &$$$$$r   Ú__init__ÚSigner.__init__Ê   s³   € ð ×-Ð-œ(×-Ñ-ˆŒð Ò(ñ ä×.Ñ.ð 	Ôð
 ŒØ÷ 
ð 
Ø�N‰N×%Ô%Ø�N‰N×#Ó#ð
ˆŒ	ð #×.Ð. hˆŒÜ×Ñ˜TŸX™X×&Ò&Üð"Ø$'õ(óð ñ 'r   c                ó€   € T;'       g    V P                   p\        V P                  R ,           WV P                  R7      # )Úsignerr:   )r@   rA   r>   r;   )re   r?   r@   s   &&&r   Ú	signatureÚSigner.signatureß   s-   € Ø�oˆo�T—X‘XˆÜ˜4Ÿ9™9 xÕ/°ÀtÇ~Á~ÔVÐVr   c                óJ   € V: V P                   : V P                  V4      : 2# rJ   )rw   rƒ   )re   r?   s   &&r   r!   ÚSigner.signã   s   € Ú  $§(£(¨D¯N©N¸5Õ,AÐBÐBr   c                óD  € V P                   V9  d   \        R V P                   ,          4      hVP                  V P                   ^4      w  r#V P                  .V P                  O F'  p\        W0P                  W$4      4      '       g   K%  Vu # 	  \        RV,          4      h)zNo "%s" found in valuezSignature "%s" does not match)rw   r   Úrsplitr@   rV   r   rƒ   )re   rR   r?   Úsigr@   s   &&   r   rO   ÚSigner.unsignæ   sƒ   € Ø�8‰8˜<Ô'ÜÐ7¸$¿(¹(ÕBÓCÐCØ!×(Ñ(¨¯©°1Ó5‰
ˆØ—H‘HÐ2˜t×1Ñ1Ó2ˆCÜ$ S¯.©.¸Ó*D×EÔEØ’ñ 3ô Ð:¸SÕ@ÓAÐAr   Fc                ó,  € V! 4       P                  V4      pRpV'       d;   \        P                  ! V4      p\        V4      \        V4      ^,
          8  d   TpRp\	        V4      P                  4       pV'       d
   RV,           pV P                  V4      # )a5  
Return URL-safe, hmac signed base64 compressed JSON string.

If compress is True (not the default), check if compressing using zlib
can save some space. Prepend a '.' to signify compression. This is
included in the signature, to protect against zip bombs.

The serializer is expected to return a bytestring.
FTry   )rc   Úzlibrq   r5   r3   r=   r!   )re   rf   rp   rq   rj   Úis_compressedÚ
compressedÚbase64ds   &&&&    r   rs   ÚSigner.sign_objectï   sx   € ñ ‹|×!Ñ! #Ó&ˆàˆçäŸš tÓ,ˆJÜ�:‹¤# d£)¨a¥-Ô0Ø!�Ø $�Ü˜TÓ"×)Ñ)Ó+ˆßØ˜G•mˆGØ�y‰y˜Ó!Ð!r   c                óü   € V P                   ! V3/ VB P                  4       pVR ,          R8H  pV'       d
   VR,          p\        V4      pV'       d   \        P                  ! V4      pV! 4       P                  V4      # ):Nr'   Nó   .r&   )rO   rd   r8   rŒ   Ú
decompressri   )re   Ú
signed_objrp   Úkwargsr�   r“   rj   s   &&&,   r   ru   ÚSigner.unsign_object  sh   € ð —+’+˜jÑ3¨FÑ3×:Ñ:Ó<ˆØ˜R•[ DÑ(ˆ
ßà˜b•kˆGÜ˜'Ó"ˆßÜ—?’? 4Ó(ˆDÙ‹|×!Ñ! $Ó'Ð'r   )r;   rV   r@   r>   rw   rJ   )r   r   r   r   r   rƒ   r!   rO   r]   rs   ru   r   rl   rm   s   @r   r[   r[   É   s`   ø‡ € ðØðØ"ðØ)-ðØ9=ðØMQôô*WòCòBð +9À5ô "ð2 4B÷ (ò (r   r[   c                   óH   a a€ ] tR tRt oR tV 3R ltRV 3R lltRtVtV ;t	# )rr   i  c                óP   € \        \        \        P                  ! 4       4      4      # rJ   )r$   ÚintÚtime)re   s   &r   Ú	timestampÚTimestampSigner.timestamp  s   € Üœ#œdŸiši›kÓ*Ó+Ð+r   c                óh   <€ V: V P                   : V P                  4       : 2p\        SV `  V4      # rJ   )rw   r›   Úsuperr!   )re   r?   r{   s   &&€r   r!   ÚTimestampSigner.sign  s)   ø€ Ú! 4§8£8¨T¯^©^Õ-=Ð>ˆÜ‰w‰|˜EÓ"Ð"r   c                óL  <€ \         SV `  V4      pVP                  V P                  ^4      w  r\	        V4      pVeg   \        V\        P                  4      '       d   VP                  4       p\        P                  ! 4       V,
          pWR8”  d   \        RV: RV: R24      hV# )zS
Retrieve original value and check it wasn't signed more
than max_age seconds ago.
zSignature age z > z seconds)rž   rO   rˆ   rw   r,   rQ   ÚdatetimeÚ	timedeltaÚtotal_secondsrš   r   )re   r?   rL   Úresultr›   Úager{   s   &&&   €r   rO   ÚTimestampSigner.unsign  s…   ø€ ô
 ‘‘ Ó&ˆØ!Ÿ=™=¨¯©°1Ó5ÑˆÜ˜yÓ)ˆ	ØÒÜ˜'¤8×#5Ñ#5×6Ò6Ø!×/Ñ/Ó1�ä—)’)“+ 	Õ)ˆCØŒ}Ý&Ë#ËwÐ'WÓXÐXØˆr   r   rJ   )
r   r   r   r   r›   r!   rO   r   rl   Ú__classcell__)r{   rn   s   @@r   rr   rr     s   ù‡ € ò,õ#÷÷ r   rr   )Úsha1)r   )z%django.core.signing.get_cookie_signer)%r   r0   r¡   rb   rš   rŒ   Údjango.confr   Údjango.utils.cryptor   r   Údjango.utils.encodingr   Údjango.utils.module_loadingr   Údjango.utils.regex_helperr   r|   r   Ú	Exceptionr   r   r$   r,   r3   r8   rA   rC   rH   rK   rT   rN   r]   rc   ri   r[   rr   r   r   r   Ú<module>r¯      sß   ðñ!óF Û Û Û Û å  ß BÝ -Ý 5Ý 6áÐ0Ó1€ØR€ô	�9ô 	ô	�|ô 	ò	ò
ò3ò-ô
ò5ô
Eô
ð°bð À$ô ô÷
2ñ 
2ð Ð-¸.ÐSXôð4 	Ø	ØØØô÷,J(ñ J(ôZ�fö r   