+
    ‡)ÙjŸ%  ã                   óT  € ^ RI t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
HtHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ R	IHt ^ R
IHt ] P2                  R 4       tR tRR ltRR ltRR ltRR lt]! ]] 4      t! ! R R4      t"R t# ! R R4      t$ ! R R4      t% ! R R4      t&R# )é    N)ÚSequenceMatcher)ÚPath)Úsettings)ÚFieldDoesNotExistÚImproperlyConfiguredÚValidationError)Úcached_propertyÚlazy)Úformat_htmlÚformat_html_join)Úimport_string)Úgettext)Úngettextc                  ó4   € \        \        P                  4      # ©N)Úget_password_validatorsr   ÚAUTH_PASSWORD_VALIDATORS© ó    Ú`/var/www/eggtrainer/venv/lib/python3.14/site-packages/django/contrib/auth/password_validation.pyÚget_default_password_validatorsr      s   € ä"¤8×#DÑ#DÓEÐEr   c                 óâ   € . pV  F=  p \        VR ,          4      pTP                  T! R/ TP	                  R/ 4      B 4       K?  	  V#   \         d    Rp\        YBR ,          ,          4      hi ; i)ÚNAMEzZThe module in NAME could not be imported: %s. Check your AUTH_PASSWORD_VALIDATORS setting.ÚOPTIONSr   )r   ÚImportErrorr   ÚappendÚget)Úvalidator_configÚ
validatorsÚ	validatorÚklassÚmsgs   &    r   r   r      sƒ   € Ø€JÛ%ˆ	ð	@Ü! )¨FÕ"3Ó4ˆEð 	×Ñ™%Ñ? )§-¡-°	¸2Ó">Ñ?Ö@ñ &ð Ðøô ô 	@ð4ð ô ' s°vÕ->Õ'>Ó?Ð?ð	@ús   ‰AÁ&A.c                óÖ   € . pVf   \        4       pV F  p VP                  W4       K  	  V'       d   \        V4      hR#   \         d   pTP                  T4        Rp?KP  Rp?ii ; i)zµ
Validate that the password meets all validator requirements.

If the password is valid, return ``None``.
If the password is invalid, raise ValidationError with all error messages.
N)r   Úvalidater   r   )ÚpasswordÚuserÚpassword_validatorsÚerrorsr    Úerrors   &&&   r   Úvalidate_passwordr*   )   sk   € ð €FØÒ"Ü=Ó?ÐÛ(ˆ	ð	!Ø×Ñ˜xÖ.ñ )÷
 Ü˜fÓ%Ð%ñ øô ô 	!Ø�M‰M˜%× Ò ûð	!ús   —AÁA(ÁA#Á#A(c                ó`   € Vf   \        4       pV F  p\        VRR 4      pV! W4       K  	  R# )zm
Inform all validators that have implemented a password_changed() method
that the password has been changed.
NÚpassword_changedc                  ó   € R # r   r   )Úas   *r   Ú<lambda>Ú"password_changed.<locals>.<lambda>D   s   € ÉTr   )r   Úgetattr)r%   r&   r'   r    r,   s   &&&  r   r,   r,   <   s5   € ð
 Ò"Ü=Ó?ÐÛ(ˆ	Ü" 9Ð.@Á/ÓRÐÙ˜Ö(ó )r   c                óv   € . pV f   \        4       p V  F"  pVP                  VP                  4       4       K$  	  V# )z?
Return a list of all help texts of all configured validators.
)r   r   Úget_help_text)r'   Ú
help_textsr    s   &  r   Úpassword_validators_help_textsr5   H   s?   € ð €JØÒ"Ü=Ó?ÐÛ(ˆ	Ø×Ñ˜)×1Ñ1Ó3Ö4ñ )àÐr   c                ól   € \        V 4      p\        RRR V 4       4      pV'       d   \        RV4      # R# )zT
Return an HTML string with all help texts of all configured validators
in an <ul>.
Ú z<li>{}</li>c              3   ó&   "  € T F  q3x € K	  	  R # 5ir   r   )Ú.0Ú	help_texts   & r   Ú	<genexpr>Ú6_password_validators_help_text_html.<locals>.<genexpr>[   s   é € ÐE¹*¨Y�L»*ùs   ‚z<ul>{}</ul>)r5   r   r   )r'   r4   Ú
help_itemss   &  r   Ú#_password_validators_help_text_htmlr>   T   s=   € ô
 0Ð0CÓD€JÜ!Ø
ˆMÑE¹*ÓEó€J÷ 6@Œ;�} jÓ1ÐGÀRÐGr   c                   óD   a € ] tR t^ct o RtRR ltR	R ltR tR tRt	V t
R# )
ÚMinimumLengthValidatorz4
Validate that the password is of a minimum length.
c                ó   € Wn         R # r   ©Ú
min_length)ÚselfrC   s   &&r   Ú__init__ÚMinimumLengthValidator.__init__h   s   € Ø$Žr   Nc                óŠ   € \        V4      V P                  8  d)   \        V P                  4       R RV P                  /R7      hR# )Úpassword_too_shortrC   ©ÚcodeÚparamsN)ÚlenrC   r   Úget_error_message©rD   r%   r&   s   &&&r   r$   ÚMinimumLengthValidator.validatek   s?   € Üˆx‹=˜4Ÿ?™?Ô*Ü!Ø×&Ñ&Ó(Ø)Ø$ d§o¡oÐ6ôð ñ +r   c                óR   € \        R RV P                  4      V P                  ,          # )zBThis password is too short. It must contain at least %d character.zCThis password is too short. It must contain at least %d characters.©r   rC   ©rD   s   &r   rM   Ú(MinimumLengthValidator.get_error_messages   s*   € äØTØUØ—‘óð
 �o‰oõð	
r   c                óV   € \        R RV P                  4      RV P                  /,          # )z=Your password must contain at least %(min_length)d character.z>Your password must contain at least %(min_length)d characters.rC   rQ   rR   s   &r   r3   Ú$MinimumLengthValidator.get_help_text}   s/   € ÜØKØLØ�O‰Oó
ð ˜4Ÿ?™?Ð+õ	,ð 	,r   rB   )é   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rE   r$   rM   r3   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r@   r@   c   s#   ø‡ € ñô%ôò
÷,ð ,r   r@   c                ó~   € \        V 4      pV^,          V,          p\        V4      pV^
V,          8¬  ;'       d    WT8  # )ay  
Test that value is within a reasonable range of password.

The following ratio calculations are based on testing SequenceMatcher like
this:

for i in range(0,6):
  print(10**i, SequenceMatcher(a='A', b='A'*(10**i)).quick_ratio())

which yields:

1 1.0
10 0.18181818181818182
100 0.019801980198019802
1000 0.001998001998001998
10000 0.00019998000199980003
100000 1.999980000199998e-05

This means a length_ratio of 10 should never yield a similarity higher than
0.2, for 100 this is down to 0.02 and for 1000 it is 0.002. This can be
calculated via 2 / length_ratio. As a result we avoid the potentially
expensive sequence matching.
)rL   )r%   Úmax_similarityÚvalueÚpwd_lenÚlength_bound_similarityÚ	value_lens   &&&   r   Úexceeds_maximum_length_ratiorf   …   s@   € ô0 �(‹m€GØ,¨qÕ0°7Õ:ÐÜ�E“
€IØ�b˜9•nÑ$×LÐL¨Ñ)LÐLr   c                   óL   a € ] tR t^£t o RtR	t]R3R ltR
R ltR tR t	Rt
V tR# )Ú UserAttributeSimilarityValidatora�  
Validate that the password is sufficiently different from the user's
attributes.

If no specific attributes are provided, look at a sensible list of
defaults. Attributes that don't exist are ignored. Comparison is made to
not only the full attribute value, but also its components, so that, for
example, a password is validated against either part of an email address,
as well as the full address.
gffffffæ?c                óB   € Wn         VR 8  d   \        R4      hW n        R# )gš™™™™™¹?z#max_similarity must be at least 0.1N)Úuser_attributesÚ
ValueErrorra   )rD   rj   ra   s   &&&r   rE   Ú)UserAttributeSimilarityValidator.__init__±   s"   € Ø.ÔØ˜CÔÜÐBÓCÐCØ,Ör   Nc                óv  € V'       g   R # VP                  4       pV P                   Fû  p\        W#R 4      pV'       d   \        V\        4      '       g   K/  VP                  4       p\
        P                  ! RV4      V.,           pV F—  p\        WP                  V4      '       d   K!  \        WR7      P                  4       V P                  8¼  g   KL   \	        VP                  P                  V4      P                  4      p\        V P!                  4       RRV/R7      h	  Ký  	  R #   \         d    Tp L5i ; i)Nz\W+)r.   ÚbÚpassword_too_similarÚverbose_namerI   )Úlowerrj   r1   Ú
isinstanceÚstrÚreÚsplitrf   ra   r   Úquick_ratioÚ_metaÚ	get_fieldrp   r   r   rM   )	rD   r%   r&   Úattribute_namerb   Úvalue_lowerÚvalue_partsÚ
value_partrp   s	   &&&      r   r$   Ú)UserAttributeSimilarityValidator.validate·   s  € ßÙà—>‘>Ó#ˆØ"×2Ô2ˆNÜ˜D°$Ó7ˆEß¤
¨5´#× 6Ò 6ÙØŸ+™+›-ˆKÜŸ(š( 6¨;Ó7¸;¸-ÕGˆKÛ)�
Ü/Ø×1Ñ1°:÷ò ñ ä# hÔ=×IÑIÓKØ×*Ñ*ö+ð6Ü'*Ø ŸJ™J×0Ñ0°Ó@×MÑMó(˜ô
 *Ø×.Ñ.Ó0Ø3Ø .°Ð=ôð ó *ó 3øô& -ô 6Ø'5šð6ús   Ã.D(Ä(D8Ä7D8c                ó   € \        R 4      # )z4The password is too similar to the %(verbose_name)s.©Ú_rR   s   &r   rM   Ú2UserAttributeSimilarityValidator.get_error_message×   s   € ÜÐGÓHÐHr   c                ó   € \        R 4      # )uH   Your password canâ€™t be too similar to your other personal information.r   rR   s   &r   r3   Ú.UserAttributeSimilarityValidator.get_help_textÚ   s   € ÜØVó
ð 	
r   )ra   rj   )ÚusernameÚ
first_nameÚ	last_nameÚemailr   )rW   rX   rY   rZ   r[   ÚDEFAULT_USER_ATTRIBUTESrE   r$   rM   r3   r\   r]   r^   s   @r   rh   rh   £   s3   ø‡ € ñ	ð OÐà'>Èsô -ôò@I÷
ð 
r   rh   c                   óV   a € ] tR t^àt o Rt]R 4       t]3R ltR	R ltR t	R t
RtV tR# )
ÚCommonPasswordValidatora¥  
Validate that the password is not a common password.

The password is rejected if it occurs in a provided list of passwords,
which may be gzipped. The list Django ships with contains 20000 common
passwords (unhexed, lowercased and deduplicated), created by Royce Williams:
https://gist.github.com/roycewilliams/226886fd01572964e1431ac8afc999ce
The password list must be lowercased to match the comparison in validate().
c                ó^   € \        \        4      P                  4       P                  R ,          # )zcommon-passwords.txt.gz)r   Ú__file__ÚresolveÚparentrR   s   &r   ÚDEFAULT_PASSWORD_LIST_PATHÚ2CommonPasswordValidator.DEFAULT_PASSWORD_LIST_PATHë   s!   € ä”H‹~×%Ñ%Ó'×.Ñ.Ð1JÕJÐJr   c                óð  € V\         P                  J d   V P                  p \        P                  ! VR RR7      ;_uu_ 4       pV Uu0 uF  q3P	                  4       kK  	  upV n        RRR4       R# u upi   + '       g   i     R# ; i  \         d`    \        T4      ;_uu_ 4       pT Uu0 uF  q3P	                  4       kK  	  Mu upi upT n        RRR4        R#   + '       g   i      R# ; ii ; i)Úrtzutf-8)ÚencodingN)rŠ   r�   ÚgzipÚopenÚstripÚ	passwordsÚOSError)rD   Úpassword_list_pathÚfÚxs   &&  r   rE   Ú CommonPasswordValidator.__init__ï   s°   € ØÔ!8×!SÑ!SÓSØ!%×!@Ñ!@Ðð	8Ü—’Ð-¨t¸g×FÕFÈ!Ù56Ó!7±Q°§'¡'¦)±QÑ!7�”÷ GÑFùÚ!7÷ G×FÐFûäô 	8ÜÐ(×)Ô)¨QÙ56Ó!7±Q°§'¡'¦)²QùÔ!7�”÷ *×)×)Ô)úð	8úse   ¢!B ÁA7ÁA2Á A7Á(B Á2A7Á7B	ÂB ÂB ÂC5Â)CÂ.C
ÃCÃC5ÃC1Ã*C5Ã1C5Nc                ó–   € VP                  4       P                  4       V P                  9   d   \        V P	                  4       R R7      hR# )Úpassword_too_common©rJ   N)rq   r–   r—   r   rM   rN   s   &&&r   r$   Ú CommonPasswordValidator.validateù   s?   € Ø�>‰>Ó×!Ñ!Ó# t§~¡~Ô5Ü!Ø×&Ñ&Ó(Ø*ôð ñ 6r   c                ó   € \        R 4      # )zThis password is too common.r   rR   s   &r   rM   Ú)CommonPasswordValidator.get_error_message   s   € ÜÐ/Ó0Ð0r   c                ó   € \        R 4      # )u2   Your password canâ€™t be a commonly used password.r   rR   s   &r   r3   Ú%CommonPasswordValidator.get_help_text  s   € ÜÐEÓFÐFr   )r—   r   )rW   rX   rY   rZ   r[   r	   r�   rE   r$   rM   r3   r\   r]   r^   s   @r   rŠ   rŠ   à   sA   ø‡ € ñð ñKó ðKð +Eô 8ôò1÷Gð Gr   rŠ   c                   ó:   a € ] tR tRt o RtRR ltR tR tRtV t	R# )	ÚNumericPasswordValidatori  z5
Validate that the password is not entirely numeric.
Nc                óh   € VP                  4       '       d   \        V P                  4       R R7      hR# )Úpassword_entirely_numericrŸ   N)Úisdigitr   rM   rN   s   &&&r   r$   Ú!NumericPasswordValidator.validate  s2   € Ø×Ñ×ÒÜ!Ø×&Ñ&Ó(Ø0ôð ñ r   c                ó   € \        R 4      # )z"This password is entirely numeric.r   rR   s   &r   rM   Ú*NumericPasswordValidator.get_error_message  s   € ÜÐ5Ó6Ð6r   c                ó   € \        R 4      # )u*   Your password canâ€™t be entirely numeric.r   rR   s   &r   r3   Ú&NumericPasswordValidator.get_help_text  s   € ÜÐ=Ó>Ð>r   r   r   )
rW   rX   rY   rZ   r[   r$   rM   r3   r\   r]   r^   s   @r   r¦   r¦     s   ø‡ € ñôò7÷?ð ?r   r¦   )NNr   )'Ú	functoolsr”   rt   Údifflibr   Úpathlibr   Údjango.confr   Údjango.core.exceptionsr   r   r   Údjango.utils.functionalr	   r
   Údjango.utils.htmlr   r   Údjango.utils.module_loadingr   Údjango.utils.translationr   r€   r   Úcacher   r   r*   r,   r5   r>   rs   Ú"password_validators_help_text_htmlr@   rf   rh   rŠ   r¦   r   r   r   Ú<module>rº      s©   ðÛ Û Û 	Ý #Ý å  ÷ñ ÷
 :ß ;Ý 5Ý 1Ý -ð ‡�ñFó ðFòô &ô&	)ô	ô	Hñ &*Ð*MÈsÓ%SÐ "÷,ñ ,òDM÷<:
ñ :
÷z$Gñ $G÷N?ó ?r   