ó
    ¼Rj�4 ã                   ó´   • S SK r S SK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  S SKJr  S S	KJr  S S
KJr  S SKJrJrJr  S SKJr   " S S5      rg)é    N)Údefaultdict)Úchain)Úsettings)Úmodels)Ú
operations)Ú	Migration)ÚAlterModelOptions)ÚMigrationOptimizer)ÚMigrationQuestioner)ÚCOMPILED_REGEX_TYPEÚRegexObjectÚresolve_relation)Ústable_topological_sortc                   ót  • \ rS rSrSrS6S jrS7S jrS rS rS8S jr	S	 r
S
 r\S 5       rS6S jrS rS rS rS9S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&\S% 5       r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1S0 r2S1 r3S6S2 jr4S3 r5\6S4 5       r7S5r8g):ÚMigrationAutodetectoré   aé  
Take a pair of ProjectStates and compare them to see what the first would
need doing to make it match the second (the second usually being the
project's current state).

Note that this naturally operates on entire projects at a time,
as it's likely that changes interact (for example, you can't
add a ForeignKey without having a migration to add the table it
depends on first). A user interface may offer single-app usage
if it wishes, with the caveat that it may not always be possible.
Nc                 ó¤   • Xl         X l        U=(       d
    [        5       U l        UR                   VVs1 s H  u  pEUiM	     snnU l        g s  snnf ©N)Ú
from_stateÚto_stater   Ú
questionerr   Úexisting_apps)Úselfr   r   r   ÚappÚmodels         ÚMD:\diplom_project\venv\Lib\site-packages\django/db/migrations/autodetector.pyÚ__init__ÚMigrationAutodetector.__init__"   s@   € Ø$ŒØ ŒØ$×=Ô(;Ó(=ˆŒØ4>×4EÒ4EÔFÒ4E¡j c›cÑ4EÒFˆÕùÓFs   ´Ac                 ó|   • U R                  X15      nU R                  XQU5      nU(       a  U R                  XR5      nU$ )z¬
Main entry point to produce a list of applicable changes.
Take a graph to base names on and an optional set of apps
to try and restrict to (restriction is not guaranteed)
)Ú_detect_changesÚarrange_for_graphÚ_trim_to_apps)r   ÚgraphÚtrim_to_appsÚconvert_appsÚmigration_nameÚchangess         r   r'   ÚMigrationAutodetector.changes(   s>   € ð ×&Ñ& |Ó;ˆØ×(Ñ(¨¸ÓHˆÞØ×(Ñ(¨Ó?ˆGØˆó    c           
      óü  ^ • [        U[        5      (       a"  U Vs/ s H  nT R                  U5      PM     sn$ [        U[        5      (       a  [        U 4S jU 5       5      $ [        U[        5      (       a5  UR                  5        VVs0 s H  u  p2UT R                  U5      _M     snn$ [        U[        R                  5      (       aA  UR                  T R                  UR                  5      T R                  UR                  5      4$ [        U[        5      (       a  [        U5      $ [        U[        5      (       a  U$ [        US5      (       a‘  UR                  5       n[        U[         R"                  5      (       a  USS nUu  pVnUU Vs/ s H  nT R                  U5      PM     snUR                  5        VVs0 s H  u  p2UT R                  U5      _M     snn4$ U$ s  snf s  snnf s  snf s  snnf )z¨
Recursive deconstruction for a field and its arguments.
Used for full comparison for rename/alter; sometimes a single-level
deconstruction will not compare correctly.
c              3   óF   >#   • U  H  nTR                  U5      v •  M     g 7fr   )Údeep_deconstruct)Ú.0Úvaluer   s     €r   Ú	<genexpr>Ú9MigrationAutodetector.deep_deconstruct.<locals>.<genexpr>=   s   øé € ÐGÂ3¸%˜×.Ñ.¨u×5Ð5Â3ùs   ƒ!Údeconstructé   N)Ú
isinstanceÚlistr,   ÚtupleÚdictÚitemsÚ	functoolsÚpartialÚfuncÚargsÚkeywordsr   r   ÚtypeÚhasattrr1   r   ÚField)r   Úobjr.   ÚkeyÚdeconstructedÚpathr;   Úkwargss   `       r   r,   Ú&MigrationAutodetector.deep_deconstruct4   s±  ø€ ô �cœ4× Ñ Ù>AÓBºc°U�D×)Ñ)¨%Ö0¹cÑBÐBÜ˜œU×#Ñ#ÜÔGÁ3ÓGÓGÐGÜ˜œT×"Ñ"ØHKÏ	É	ÌÔTÊ¹*¸#�C˜×.Ñ.¨uÓ5Ò5ÉÒTÐTÜ˜œY×.Ñ.×/Ñ/à—‘Ø×%Ñ% c§h¡hÓ/Ø×%Ñ% c§l¡lÓ3ðð ô
 ˜Ô0×1Ñ1Ü˜sÓ#Ð#Ü˜œT×"Ñ"ð ˆJÜ�S˜-×(Ñ(ØŸO™OÓ-ˆMÜ˜#œvŸ|™|×,Ñ,à -¨a¨bÐ 1�Ø!.ÑˆD˜àÙ;?Ó@º4°%�×&Ñ& uÖ-¹4Ñ@ØEKÇ\Á\Ä^ÔTÂ^±z°s��d×+Ñ+¨EÓ2Ò2Á^ÒTðð ð ˆJùò; Cùó Uùò* AùÛTs   ›G(ÂG-ÆG3ÇG8
c                 ó  • / n[        UR                  5       5       Hh  u  p4U R                  U5      nUR                  (       a0  UR                  R                  (       a  US   R                  SS5        UR                  U5        Mj     U$ )z²
Return a definition of the fields that ignores field names and
what related fields actually relate to. Used for detecting renames (as
the related fields change during renames).
é   ÚtoN)Úsortedr7   r,   Úremote_fieldr   ÚpopÚappend)r   ÚfieldsÚ
fields_defÚnameÚfieldÚdeconstructions         r   Úonly_relation_agnostic_fieldsÚ3MigrationAutodetector.only_relation_agnostic_fieldsZ   sr   € ð ˆ
Ü! &§,¡,£.Ö1‰KˆDØ!×2Ñ2°5Ó9ˆNØ×!×! e×&8Ñ&8×&>×&>Ø˜qÑ!×%Ñ% d¨DÔ1Ø×Ñ˜nÖ-ñ	 2ð
 Ðr)   c                 óü  • 0 U l         0 U l        0 U l        0 U l        [	        5       U l        [	        5       U l        [	        5       U l        [	        5       U l        [	        5       U l	        [	        5       U l
        U R                  R                  R                  5        H¼  u  u  p4nUR                  R                  SS5      (       d  U R                  R!                  X445        MG  X0R                  R"                  ;  d  Mb  UR                  R                  S5      (       a  U R                  R!                  X445        M   U R
                  R!                  X445        M¾     U R$                  R                  R                  5        HÊ  u  u  p4nUR                  R                  SS5      (       d  U R                  R!                  X445        MG  X0R                  R"                  ;  d  U(       d  Mi  X1;   d  Mp  UR                  R                  S5      (       a  U R                  R!                  X445        M®  U R                  R!                  X445        MÌ     U R                  R'                  5         U R$                  R'                  5         U R)                  5         U R+                  5         U R-                  5         U R/                  5         U R1                  5         U R3                  5         U R5                  5         U R7                  5         U R9                  5         U R;                  5         U R=                  5         U R?                  5         U RA                  5         U RC                  5         U RE                  5         U RG                  5         U RI                  5         U RK                  5         U RM                  5         U RO                  5         U RQ                  5         U RS                  5         U RU                  5         U RW                  5         U RY                  5         U R[                  5         U R]                  5         U R_                  5         U Ra                  5         U Rc                  U5        U Re                  5         U Rf                  $ )a  
Return a dict of migration plans which will achieve the
change from from_state to to_state. The dict has app labels
as keys and a list of migrations as values.

The resulting migrations aren't specially named, but the names
do matter for dependencies inside the set.

convert_apps is the list of apps to convert to use migrations
(i.e. to make initial migrations for, in the usual case)

graph is an optional argument that, if provided, can help improve
dependency generation and avoid potential circular dependencies.
ÚmanagedTÚproxy)4Úgenerated_operationsÚaltered_indexesÚaltered_constraintsÚrenamed_fieldsÚsetÚold_model_keysÚold_proxy_keysÚold_unmanaged_keysÚnew_model_keysÚnew_proxy_keysÚnew_unmanaged_keysr   r   r7   ÚoptionsÚgetÚaddÚ	real_appsr   Úresolve_fields_and_relationsÚgenerate_renamed_modelsÚ_prepare_field_listsÚ_generate_through_model_mapÚgenerate_deleted_modelsÚgenerate_created_modelsÚgenerate_deleted_proxiesÚgenerate_created_proxiesÚgenerate_altered_optionsÚgenerate_altered_managersÚ!generate_altered_db_table_commentÚcreate_renamed_fieldsÚcreate_altered_indexesÚcreate_altered_constraintsÚgenerate_removed_constraintsÚgenerate_removed_indexesÚgenerate_renamed_fieldsÚgenerate_renamed_indexesÚ(generate_removed_altered_unique_togetherÚ'generate_removed_altered_index_togetherÚgenerate_removed_fieldsÚgenerate_added_fieldsÚgenerate_altered_fieldsÚ&generate_altered_order_with_respect_toÚ generate_altered_unique_togetherÚgenerate_altered_index_togetherÚgenerate_added_indexesÚgenerate_added_constraintsÚgenerate_altered_db_tableÚ_sort_migrationsÚ_build_migration_listÚ_optimize_migrationsÚ
migrations)r   r%   r#   Ú	app_labelÚ
model_nameÚmodel_states         r   r    Ú%MigrationAutodetector._detect_changesh   sp  € ð& %'ˆÔ!Ø!ˆÔØ#%ˆÔ Ø ˆÔô "›eˆÔÜ!›eˆÔÜ"%£%ˆÔÜ!›eˆÔÜ!›eˆÔÜ"%£%ˆÔØ48·O±O×4JÑ4J×4PÑ4PÖ4RÑ0Ñ#ˆY [Ø×&Ñ&×*Ñ*¨9°d×;Ñ;Ø×'Ñ'×+Ñ+¨YÐ,CÖDØ§/¡/×";Ñ";Õ;Ø×&Ñ&×*Ñ*¨7×3Ñ3Ø×'Ñ'×+Ñ+¨YÐ,CÖDà×'Ñ'×+Ñ+¨YÐ,CÖDñ 5Sð 59·M±M×4HÑ4H×4NÑ4NÖ4PÑ0Ñ#ˆY [Ø×&Ñ&×*Ñ*¨9°d×;Ñ;Ø×'Ñ'×+Ñ+¨YÐ,CÖDØ§/¡/×";Ñ";Ó;ß� Õ!:à×&Ñ&×*Ñ*¨7×3Ñ3Ø×'Ñ'×+Ñ+¨YÐ,CÖDà×'Ñ'×+Ñ+¨YÐ,CÖDñ 5Qð 	�‰×4Ñ4Ô6Ø�‰×2Ñ2Ô4ð 	×$Ñ$Ô&ð 	×!Ñ!Ô#Ø×(Ñ(Ô*ð 	×$Ñ$Ô&Ø×$Ñ$Ô&Ø×%Ñ%Ô'Ø×%Ñ%Ô'Ø×%Ñ%Ô'Ø×&Ñ&Ô(Ø×.Ñ.Ô0ð 	×"Ñ"Ô$ð 	×#Ñ#Ô%Ø×'Ñ'Ô)à×)Ñ)Ô+Ø×%Ñ%Ô'à×$Ñ$Ô&Ø×%Ñ%Ô'à×5Ñ5Ô7Ø×4Ñ4Ô6à×$Ñ$Ô&Ø×"Ñ"Ô$Ø×$Ñ$Ô&Ø×3Ñ3Ô5Ø×-Ñ-Ô/Ø×,Ñ,Ô.Ø×#Ñ#Ô%Ø×'Ñ'Ô)Ø×&Ñ&Ô(à×ÑÔØ×"Ñ" 5Ô)Ø×!Ñ!Ô#à�‰Ðr)   c                 óp  • U R                   U R                  -  U l        U R                  U R                  -  U l        U R                  U R                  -  U l        0 U l	        U R                   VVVs1 s HP  u  pU R                  R                  XR                  R                  X4U5      4   R                    H  nXU4iM	     MR     snnnU l        U R                   VVVs1 s H5  u  pU R                   R                  X4   R                    H  nXU4iM	     M7     snnnU l        gs  snnnf s  snnnf )z¯
Prepare field lists and a list of the fields that used through models
in the old state so dependencies can be made from the through model
deletion to the field that uses it.
N)r\   r_   Úkept_model_keysr]   r`   Úkept_proxy_keysr^   ra   Úkept_unmanaged_keysÚthrough_usersr   r   Úrenamed_modelsrc   rM   Úold_field_keysr   Únew_field_keys©r   r‡   rˆ   Ú
field_names       r   rh   Ú*MigrationAutodetector._prepare_field_listsÓ   s*  € ð  $×2Ñ2°T×5HÑ5HÑHˆÔØ#×2Ñ2°T×5HÑ5HÑHˆÔØ#'×#:Ñ#:¸T×=TÑ=TÑ#TˆÔ ØˆÔð *.×)=Ò)=õ
â)=Ñ%�	Ø"Ÿo™o×4Ñ4Ø×.Ñ.×2Ñ2°IÐ3JÈJÓWÐWñç‰fó�
ð  JÓ/ññ 0Ù)=ó
ˆÔð *.×)=Ò)=õ
â)=Ñ%�	Ø"Ÿm™m×2Ñ2°9Ð3HÑI×PÕP�
ð  JÓ/áPñ 0Ù)=ó
ˆÕùô
ùô
s   Á2AD*Ã#<D1c                 óº  • [        U R                  5       HÂ  u  pU R                  R                  X4U5      nU R                  R
                  X4   nUR                  R                  5        Hh  u  pV[        US5      (       d  M  [        UR                  SS5      (       d  M6  [        UR                  R                  X5      nUUU4U R                  U'   Mj     MÄ     g)zThrough model map generation.rJ   ÚthroughN)rI   r\   r�   rc   r   r   rM   r7   r>   ÚgetattrrJ   r   r—   r�   )r   r‡   rˆ   Úold_model_nameÚold_model_stater”   rP   Úthrough_keys           r   ri   Ú1MigrationAutodetector._generate_through_model_mapê   sÏ   € ä%+¨D×,?Ñ,?Ö%@Ñ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ%4×%;Ñ%;×%AÑ%AÖ%CÑ!�
Ü˜5 .×1Ó1´gØ×&Ñ&¨	°4÷7ó 7ô #3Ø×*Ñ*×2Ñ2°Ió#�Kð "Ø&Ø"ð7�D×&Ñ& {Ó3ó &Dò &Ar)   c                 ó–   • U S   S:w  a  U S4$ [        [        U S   5      R                  S5      u  pXR                  5       4U SS -   S4$ )	zX
Return the resolved dependency and a boolean denoting whether or not
it was swappable.
r   Ú__setting__Fr2   Ú.rG   NT)r˜   r   ÚsplitÚlower)Ú
dependencyÚresolved_app_labelÚresolved_object_names      r   Ú_resolve_dependencyÚ)MigrationAutodetector._resolve_dependencyþ   sb   € ð �a‰=˜MÓ)Ø˜uÐ$Ð$Ü3:Ü�j ‘mó4
ç
‰%�‹*ñ 	1Ðð #×$>Ñ$>Ó$@ÐAÀJÈqÈrÀNÑRÐTXÐXÐXr)   c           
      óÖ  • 0 U l         [        S U R                  R                  5        5       5      nSnU(       Ga.  [	        U R                  5       GHµ  n/ n[        5       n[        U R                  U   5       GHž  nSn[        5       n	UR                   GHB  n
U
nU R                  U
5      u  p¬U
S   U:w  d  M$  U R                  R                  U
S   / 5       H  nU R                  XÚ5      (       d  M  Sn  O   U(       d    OÚU(       a  U	R                  US   US   45        M�  U
S   U R                   ;   a5  U	R                  U
S   U R                   U
S      S   R                  45        M×  U(       ab  U(       aB  UR                  U
S   5      (       a)  U	R                  UR                  U
S   5      S   5        GM'  U	R                  U
S   S45        GM@  SnGME     U(       a5  UR                  U5        UR                  U	5        U R                  U   S	 GMŸ    O   U(       d
  U(       d  GMÜ  U R                  U   (       a  U(       a   [!        S["        4/ / S	.5      nU" S
[%        U R                   R                  U/ 5      5      S-   -  U5      n[        U5      Ul        X_l        X@R*                  ;  Ul        U R                   R/                  U/ 5      R                  U5        SnGM—  XPR                  U   -   U R                  U'   GM¸     [        S U R                  R                  5        5       5      nUU:X  a"  U(       d  SnO[1        SU R                  -  5      eUnU(       a  GM-  gg)a  
Chop the lists of operations up into migrations with dependencies on
each other. Do this by going through an app's list of operations until
one is found that has an outgoing dependency that isn't in another
app's migration yet (hasn't been chopped off its list). Then chop off
the operations before it into a migration and move onto the next app.
If the loops completes without doing anything, there's a circular
dependency (which _should_ be impossible as the operations are
all split at this point so they can't depend and be depended on).
c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   ©Úlen©r-   Úxs     r   r/   Ú>MigrationAutodetector._build_migration_list.<locals>.<genexpr>  s   é € ÐIÒ&H ”c˜!—f�fÒ&Hùó   ‚FTr   r2   éÿÿÿÿÚ	__first__r   )r   Údependencieszauto_%ic              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   r©   r«   s     r   r/   r­   r  s   é € ÐQÒ.P¨œc !Ÿf˜fÒ.Pùr®   z)Cannot resolve operation dependencies: %rN)r†   ÚsumrW   ÚvaluesrI   r[   r4   Ú
_auto_depsr¥   rc   Úcheck_dependencyrd   rO   Ú
leaf_nodesrL   Úupdater=   r   rª   r±   r   r   ÚinitialÚ
setdefaultÚ
ValueError)r   r#   Únum_opsÚ	chop_moder‡   Úchoppedr±   Ú	operationÚdeps_satisfiedÚoperation_dependenciesÚdepÚoriginal_depÚis_swappable_depÚother_operationÚsubclassÚinstanceÚnew_num_opss                    r   r„   Ú+MigrationAutodetector._build_migration_list  s5  € ð ˆŒÜÑI d×&?Ñ&?×&FÑ&FÔ&HÓIÓIˆØˆ	ßô $ D×$=Ñ$=×>�	Ø�Ü"›u�Ü!% d×&?Ñ&?À	Ñ&J×!K�IØ%)�NÜ-0«UÐ*Ø(×3Õ3˜ð
 (+˜Ø04×0HÑ0HÈÓ0MÑ-˜Ø˜q™6 YÕ.ð 48×3LÑ3L×3PÑ3PØ # A¡¨ö4 ð $(×#8Ñ#8¸×#NÓ#NØ5: NÙ$)ñ4ö $2Ù %æ#3Ø$:×$>Ñ$>Ø)5°a©¸,Àq¹/Ð(Jö%&ð &)¨¡V¨t¯©Ó%>Ø$:×$>Ñ$>Ø),¨Q©°·±ÀÀQÁÑ1HÈÑ1L×1QÑ1QÐ(Rö%&ö (1ö ,1°U×5EÑ5EÀcÈ!Áf×5MÑ5MØ,B×,FÑ,FØ05×0@Ñ0@ÀÀQÁÓ0HÈÑ0K÷-.ð -C×,FÑ,FØ14°Q±¸Ð0E÷-.ð :?«ña  4öb &ØŸ™ yÔ1Ø$×+Ñ+Ð,BÔCØ ×5Ñ5°iÑ@ÀÓCáñs "Löv  §7¡7Ø×4Ñ4°Y×?Æ9Ü#'Ø'Ü&˜LØ+-¸rÑBó$˜ñ
 $,Ø%¬¨T¯_©_×-@Ñ-@ÀÈBÓ-OÓ)PÐSTÑ)TÑUØ%ó$˜ô 15°\Ó0B˜Ô-Ø.5Ô+Ø+4×<NÑ<NÑ+N˜Ô(ØŸ™×2Ñ2°9¸bÓA×HÑHÈÔRØ$)›	ð $×&?Ñ&?À	Ñ&JÑJð ×1Ñ1°)Ô<ñ_ ?ôd ÑQ¨d×.GÑ.G×.NÑ.NÔ.PÓQÓQˆKØ˜gÓ%Þ Ø $‘Iä$ØCØ×3Ñ3ñ4óð ð "ˆG÷E ‹gr)   c                 ó¨  • [        U R                  R                  5       5       H¦  u  pU Vs0 s H  o3[        5       _M     nnU Hi  nUR                   HV  nU R                  U5      S   nUS   U:X  d  M"  U H.  nU R                  Xe5      (       d  M  XC   R                  U5        M0     MX     Mk     [        X$5      U R                  U'   M¨     gs  snf )zc
Reorder to make things possible. Reordering may be needed so FKs work
nicely inside the same app.
r   N)	rI   rW   r7   r[   rµ   r¥   r¶   rd   r   )r   r‡   ÚopsÚopÚdependency_graphrÂ   Úop2s          r   rƒ   Ú&MigrationAutodetector._sort_migrations}  sÃ   € ô
 % T×%>Ñ%>×%DÑ%DÓ%FÖG‰NˆIá47Ó8²C¨b¤C£E¢	±CÐÐ8Û�ØŸ=œ=�Cð ×2Ñ2°3Ó7¸Ñ:�CØ˜1‘v Õ*Û#&˜CØ#×4Ñ4°S×>Ó>Ø 0Ñ 4× 8Ñ 8¸Ö =ó $'ó )ñ ô 4KØó4ˆD×%Ñ% iÓ0ò Hùâ8s   ­Cc                 ó  • U R                   R                  5        HB  u  p[        X"SS  5       H+  u  p4UR                  R	                  XR
                  45        M-     MD     U R                   R                  5        H/  nU H&  n[        [        UR                  5      5      Ul        M(     M1     U R                   R                  5        H7  u  pU H,  n[        5       R                  UR                  U5      Ul        M.     M9     g )Nr2   )r†   r7   Úzipr±   rL   rO   r´   r4   r[   r
   Úoptimizer   )r   r‡   r†   Úm1Úm2Ú	migrations         r   r…   Ú*MigrationAutodetector._optimize_migrations”  sÎ   € à%)§_¡_×%:Ñ%:Ö%<Ñ!ˆIÜ˜j°Q°R¨.Ö9‘�Ø—‘×&Ñ&¨	·7±7Ð';Ö<ó :ñ &=ð
 Ÿ/™/×0Ñ0Ö2ˆJÛ'�	Ü)-¬c°)×2HÑ2HÓ.IÓ)J�	Ö&ó (ñ 3ð
 &*§_¡_×%:Ñ%:Ö%<Ñ!ˆIÛ'�	Ü'9Ó';×'DÑ'DØ×(Ñ(¨)ó(�	Ö$ó (ò &=r)   c                 óÜ  ^• TS   cI  TS   SL aA  [        U[        R                  5      =(       a     UR                  TS   R	                  5       :H  $ TS   bÞ  TS   SL aÖ  [        U[        R                  5      =(       aF    UR                  TS   R	                  5       :H  =(       a    [        U4S jUR                   5       5      =(       dh    [        U[        R                  5      =(       aG    UR                  TS   R	                  5       :H  =(       a     UR                  TS   R	                  5       :H  $ TS   bp  TS   SL ah  [        U[        R                  5      =(       aG    UR                  TS   R	                  5       :H  =(       a     UR                  TS   R	                  5       :H  $ TS   cI  TS   SL aA  [        U[        R                  5      =(       a     UR                  TS   R	                  5       :H  $ TS   bq  TS   S:X  ah  [        U[        R                  5      =(       aG    UR                  TS   R	                  5       :H  =(       a     UR                  TS   R	                  5       :H  $ TS   bˆ  TS   S:X  a  [        U[        R                  5      =(       a^    UR                  TS   R	                  5       :H  =(       a7    UR                  =(       d    S	R	                  5       TS   R	                  5       :g  $ TS   bZ  TS   S
:X  aQ  [        U[        R                  [        R                  45      =(       a     UR                  TS   R	                  5       :H  $ [!        ST< 35      e)zV
Return True if the given operation depends on the given dependency,
False otherwise.
rG   é   Tr2   c              3   ó8   >#   • U  H  u  pTS    U:H  v •  M     g7f)rG   N© )r-   r¬   Úyr¢   s      €r   r/   Ú9MigrationAutodetector.check_dependency.<locals>.<genexpr>¶  s   øé € ÐHÒ7G©t¨q˜
 1™¨Ö*Ò7Gùs   ƒFÚalterÚorder_wrt_unsetÚ Úfoo_together_changezCan't handle dependency )r3   r   ÚCreateModelÚ
name_lowerr¡   ÚanyrM   ÚAddFieldÚmodel_name_lowerÚRemoveFieldÚDeleteModelÚ
AlterFieldÚAlterOrderWithRespectToÚorder_with_respect_toÚAlterUniqueTogetherÚAlterIndexTogetherr»   )r   r¿   r¢   s     `r   r¶   Ú&MigrationAutodetector.check_dependency¦  s&  ø€ ð �a‰=Ñ  Z°¡]°dÒ%:ä˜9¤j×&<Ñ&<Ó=÷ BØ×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑAðð
 ˜‰]Ñ&¨:°a©=¸DÒ+@ä˜9¤j×&<Ñ&<Ó=÷ IØ×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑA÷IäÔH°y×7GÒ7GÓHÓH÷ô
 ˜9¤j×&9Ñ&9Ó:÷ BØ×.Ñ.°*¸Q±-×2EÑ2EÓ2GÑG÷Bà×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑAðð ˜‰]Ñ&¨:°a©=¸EÒ+Aä˜9¤j×&<Ñ&<Ó=÷ BØ×.Ñ.°*¸Q±-×2EÑ2EÓ2GÑG÷Bà×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑAðð ˜‰]Ñ" z°!¡}¸Ò'=ä˜9¤j×&<Ñ&<Ó=÷ BØ×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑAðð
 ˜‰]Ñ&¨:°a©=¸GÓ+Cä˜9¤j×&;Ñ&;Ó<÷ BØ×.Ñ.°*¸Q±-×2EÑ2EÓ2GÑG÷Bà×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑAðð ˜‰]Ñ&¨:°a©=Ð<MÓ+Mä˜9¤j×&HÑ&HÓI÷ )Ø×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑA÷)à×4Ñ4×:¸×AÑAÓCØ˜a‘=×&Ñ&Ó(ñ)ðð ˜‰]Ñ&¨:°a©=Ð<QÓ+QäØÜ×3Ñ3´Z×5RÑ5RÐSó÷ Bð ×(Ñ(¨J°q©M×,?Ñ,?Ó,AÑAðõ ºZÐIÓJÐJr)   c                 óâ   • U=(       d    / Ul         U(       a-  U R                  R                  U/ 5      R                  SU5        g U R                  R                  U/ 5      R	                  U5        g )Nr   )rµ   rW   rº   ÚinsertrL   )r   r‡   r¿   r±   Ú	beginnings        r   Úadd_operationÚ#MigrationAutodetector.add_operationå  sX   € ð  ,×1¨rˆ	ÔÞØ×%Ñ%×0Ñ0°¸BÓ?×FÑFÀqÈ)ÕTà×%Ñ%×0Ñ0°¸BÓ?×FÑFÀyÕQr)   c                 óØ  •  U R                   R                  U   nUR                   Vs1 s H&  n[        U[        5      (       a  UOUR
                  iM(     nnUS   < SUS   < 3nUR                  R                  S5      (       d<  SU;   d6  SU;   d0  [        R                  R                  5       UR                  5       :X  a  SUS   -   SUS   -   4$  U$ s  snf ! [         a     U$ f = f)zd
Place potential swappable models first in lists of created models (only
real way to solve #22783).
r   rŸ   r2   Ú	swappableÚAbstractUserÚAbstractBaseUserÚ___)r   r   Úbasesr3   ÚstrÚ__name__rb   rc   r   ÚAUTH_USER_MODELr¡   ÚLookupError)r   Úitemr‰   ÚbaseÚ
base_namesÚstring_versions         r   Úswappable_first_keyÚ)MigrationAutodetector.swappable_first_keyî  sù   € ð
	ØŸ-™-×.Ñ.¨tÑ4ˆKð (×-Ò-óâ-�Dô # 4¬×-Ñ-‘°4·=±=Ò@Ù-ð ð ð )-¨Q¬°°a³Ð9ˆNà×#Ñ#×'Ñ'¨×4Ñ4Ø! ZÓ/Ø%¨Ó3Ü×+Ñ+×1Ñ1Ó3°~×7KÑ7KÓ7MÓMà  Q¡™¨°°a±©Ð9Ð9ð Nð
 ˆùòøô ó 	ØØˆð	ús#   ‚'C ©-CÁA<C ÃC Ã
C)Ã(C)c                 ó0  • 0 U l         0 U l        U R                  U R                  -
  n[	        U5       GHY  u  p#U R
                  R                  X#4   nU R                  UR                  5      nU R                  U R                  -
  nU GHþ  u  pxXr:X  d  M  U R                  R                  Xx4   n	U R                  U	R                  5      n
XZ:X  d  MI  U R                  R                  X”5      (       d  Mk  / n[        UR                  R                  5       5      U R
                  R                  X#4   R                  5        VVs/ s H'  nUR                  5         H  nUR                  PM     M)     snn-   nU HC  nUR                   (       d  M  UR#                  U R%                  UUUU R
                  5      5        ME     U R'                  U[(        R*                  " U	R,                  UR,                  S9US9  X€R                   X#4'   U	R.                  < SU	R0                  < 3nUR.                  < SUR0                  < 3U R                  U'   U R                  R3                  Xx45        U R                  R5                  X#45          GMW     GM\     gs  snnf )zœ
Find any renamed models, generate the operations for them, and remove
the old entry from the model lists. Must be run before other
model-level generation.
)Úold_nameÚnew_name©r±   rŸ   N)r�   Úrenamed_models_relr_   r\   rI   r   r   rR   rM   r   r   Úask_rename_modelr4   r´   Ú	relationsrJ   Úis_relationÚextendÚ!_get_dependencies_for_foreign_keyrñ   r   ÚRenameModelrO   r‡   râ   Úremoverd   )r   Úadded_modelsr‡   rˆ   r‰   Úmodel_fields_defÚremoved_modelsÚrem_app_labelÚrem_model_nameÚrem_model_stateÚrem_model_fields_defr±   r	  rP   rM   Úrenamed_models_rel_keys                   r   rg   Ú-MigrationAutodetector.generate_renamed_models  sŠ  € ð !ˆÔØ"$ˆÔØ×*Ñ*¨T×-@Ñ-@Ñ@ˆÜ%+¨L×%9Ñ!ˆIØŸ-™-×.Ñ.¨yÐ/DÑEˆKØ#×AÑAÀ+×BTÑBTÓUÐà!×0Ñ0°4×3FÑ3FÑFˆNÜ1?Ñ-�Ø Õ-Ø&*§o¡o×&<Ñ&<Ø%Ð5ñ'�Oð ,0×+MÑ+MØ'×.Ñ.ó,Ð(ð (Õ?ØŸ?™?×;Ñ;Ø+÷ó ð ,.˜LÜ%)¨+×*<Ñ*<×*CÑ*CÓ*EÓ%Fà15·±×1HÑ1HØ$-Ð$9ñ2"ç"(¡&£(ð2+ôJò2+ Ið .7×-=Ñ-=×-? Eð	 !&× 2Ô 2ñ .@ñ	 !3ñ2+òJñ &˜Fó *0 Ø#(×#4×#4Ñ#4Ø$0×$7Ñ$7Ø(,×(NÑ(NØ,5Ø,6Ø,1Ø,0¯M©Mó	)*ö%&ñ *0ð !×.Ñ.Ø )Ü *× 6Ò 6Ø-<×-AÑ-AØ-8×-=Ñ-=ñ!"ð .:ð /ñ ð JX×/Ñ/°	Ð0EÑFà /× 9Ô 9Ø /× :Ó :ð6Ð2ð !,× 5Ô 5Ø +× 6Ó 6ð!ð !×3Ñ3Ø 6ñð !×/Ñ/×6Ñ6¸Ð7VÔWØ ×/Ñ/×3Ñ3°YÐ4KÔLÛ!ôg 2@ò &:ùó$Js   Å.Jc                 ód  • U R                   U R                  -  nU R                  U-
  nU R                  U-
  n[	        [        X R                  SS9[        X0R                  SS95      nU GH¸  u  pVU R                  R                  XV4   n0 nSn	UR                  R                  5        Hœ  u  p«UR                  (       d  M  UR                  R                  (       aG  UR                  (       a  UR                  R                  n	OUR                  R                  (       d  X¸U
'   [        UR                  SS5      (       d  M˜  X¸U
'   Mž     UR                   R#                  S5      nUR                   R#                  S5      nUR                   R#                  SS5      nUR                   R#                  SS5      nUR                   R#                  S	S5      nXVSS
4/nUR$                   GH  n['        U[(        5      (       d  M  SU;   d  M#  UR+                  SS5      u  nnUR-                  UUSS45        U R.                  R                  R1                  UU45      nU R                  R                  R1                  UU45      nU(       d  M¤  U(       d  M­  [3        UR                  5      R5                  UR                  5      R7                  UR                  5      nU H  nUR-                  UUUS
45        M     GM     U	(       a  UR-                  [9        U	UU5      S-   5        U R;                  U[<        R>                  " UR@                  UR                  R                  5        Vs/ s H  nUS   U;  d  M  UPM     snUR                   UR$                  URB                  S9USS9  UR                   R1                  SS5      (       d  GM_  [        UR                  5       5       Ho  u  nnU RE                  UUUU R                  5      nUR-                  XVSS45        U R;                  U[<        RF                  " UUUS9[I        [3        U5      5      S9  Mq     U(       a,  U R;                  U[<        RJ                  " UUS9XVUS4XVSS4/S9  [        U5       Vs/ s H  nXVUS4PM
     nnUR-                  XVSS45        U H'  nU R;                  U[<        RL                  " UUS9US9  M)     U H'  nU R;                  U[<        RN                  " UUS9US9  M)     U(       a$  U R;                  U[<        RP                  " UUS9US9  U(       a$  U R;                  U[<        RR                  " UUS9US9  U R                  RT                  nXV4U RV                  ;   d  GM*  UXV4   R                  5        Hv  u  nnU R                  R                  U   n UR                  5        HC  u  n!n"U R;                  U RX                  [<        RZ                  " U R@                  U!U"S9XVSS4/S9  ME     Mx     GM»     gs  snf s  snf )aJ  
Find all new models (both managed and unmanaged) and make create
operations for them as well as separate operations to create any
foreign key or M2M relationships (these are optimized later, if
possible).

Defer any model options that refer to collections of fields that might
be deferred (e.g. unique_together, index_together).
T)rA   ÚreverseNr—   ÚindexesÚconstraintsÚunique_togetherÚindex_togetherrê   FrŸ   r2   )NTr   ©rO   rM   rb   rø   Úmanagers)r±   rð   rU   ©rˆ   rO   rP   r  ©rO   rê   ©rˆ   Úindex©rˆ   Ú
constraint©rO   r  ©rO   r  ).r\   r^   r_   ra   r   rI   r  r   r   rM   r7   rJ   r   Úprimary_keyÚparent_linkr˜   rb   rK   rø   r3   rù   r    rL   r   rc   r[   Ú
differenceÚintersectionr   rñ   r   rá   rO   r  r  rä   r4   ré   ÚAddIndexÚAddConstraintrë   rì   r	  r]   r‡   rè   )#r   Úold_keysr  Úadded_unmanaged_modelsÚall_added_modelsr‡   rˆ   r‰   Úrelated_fieldsÚprimary_key_relr”   rP   r  r  r  r  rê   r±   rþ   Úbase_app_labelÚ	base_nameÚold_base_model_stateÚnew_base_model_stateÚremoved_base_fieldsÚremoved_base_fieldÚdrO   Úrelated_dependenciesr#  r%  r	  Úrelated_model_keyÚrelated_model_stateÚrelated_field_nameÚrelated_fields#                                      r   rk   Ú-MigrationAutodetector.generate_created_modelsH  s^  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×*Ñ*¨XÑ5ˆØ!%×!8Ñ!8¸8Ñ!CÐÜ Ü�<×%=Ñ%=ÀtÑLÜÐ)×/GÑ/GÐQUÑVó
Ðô &6Ñ!ˆIØŸ-™-×.Ñ.¨yÐ/DÑEˆKàˆNØ"ˆOØ%0×%7Ñ%7×%=Ñ%=Ö%?Ñ!�
Ø×%×%Ñ%Ø×)Ñ)×/×/Ø ×,×,Ø.3×.@Ñ.@×.FÑ.F™OØ!&×!3Ñ!3×!?×!?Ø9>¨:Ñ6Ü˜u×1Ñ1°9¸d×CÓCØ5: zÓ2ñ &@ð "×)Ñ)×-Ñ-¨iÓ8ˆGØ%×-Ñ-×1Ñ1°-Ó@ˆKØ)×1Ñ1×5Ñ5Ð6GÈÓNˆOà(×0Ñ0×4Ñ4Ð5EÀtÓLˆNØ$/×$7Ñ$7×$;Ñ$;Ø'¨ó%Ð!ð
 ¨¨eÐ4ðˆLð $×)Õ)�Ü˜d¤C×(Ó(¨S°D­[Ø04·
±
¸3ÀÓ0BÑ-�N IØ ×'Ñ'¨¸ÀDÈ$Ð(OÔPð ,0¯?©?×+AÑ+A×+EÑ+EØ'¨Ð3ó,Ð(ð ,0¯=©=×+?Ñ+?×+CÑ+CØ'¨Ð3ó,Ð(÷ ,Ð+×0DÐ0DäÐ 4× ;Ñ ;Ó<ß'™ZØ 4× ;Ñ ;ó÷ *™\¨+×*<Ñ*<Ó=ð ,ó 3FÐ.Ø(×/Ñ/Ø!/°Ð<NÐPUÐ Vöô 3Fñ) *ö2 Ø×#Ñ#Ü$Ø'Ø!Ø"óð
 #ñ#ôð ×ÑØÜ×&Ò&Ø$×)Ñ)ð "-×!3Ñ!3×!9Ñ!9Ô!;óâ!;˜AØ˜Q™4 ~Ñ5÷ Ù!;ñð
 (×/Ñ/Ø%×+Ñ+Ø(×1Ñ1ñ
ð *Øð ñ ð$ ×&Ñ&×*Ñ*¨9°d×;Ñ;Úô  & n×&:Ñ&:Ó&<Ö=‘��eØ#×EÑEØØØØ—M‘Mó	 �ð ×#Ñ# Y¸DÀ$Ð$GÔHà×"Ñ"ØÜ×'Ò'Ø#-Ø!Ø#ñô
 "&¤c¨,Ó&7Ó!8ð #ó ñ  >ö( %Ø×"Ñ"ØÜ×6Ò6Ø'Ø.Cñð
 #Ð0EÀtÐLØ"°°dÐ;ð"ð #ñ 
ô AGÀ~Ô@Vó$Ú@V¸�¨¨dÓ3Ñ@Vð !ð $ð !×'Ñ'¨ÀÀdÐ(KÔLÛ �Ø×"Ñ"ØÜ×'Ò'Ø#-Ø#ñð "6ð #ó ñ !ó *�
Ø×"Ñ"ØÜ×,Ò,Ø#-Ø#-ñð "6ð #ó ñ *ö Ø×"Ñ"ØÜ×2Ò2Ø'Ø(7ñð "6ð #ñ ö Ø×"Ñ"ØÜ×1Ò1Ø'Ø'5ñð "6ð #ñ ð Ÿ™×/Ñ/ˆIØÐ&¨$×*=Ñ*=Ö=Ø9BØÐ)ñ:ç‘%“'ò:Ñ5Ð% ~ð +/¯-©-×*>Ñ*>Ð?PÑ*QÐ'Ø=K×=QÑ=QÖ=SÑ9Ð*¨MØ×*Ñ*Ø/×9Ñ9Ü&×1Ò1Ø+>×+CÑ+CØ%7Ø&3ñð
 ,5À$ÈÐ*MÐ)Nð +ó ó >Tô	:òG &6ùòHùòd$s   Í$X(Í5X(ÒX-c                 ó4  • U R                   U R                  -
  n[        U5       Hð  u  p#U R                  R                  X#4   nUR
                  R                  S5      (       d   eX#SS4/nUR                   HJ  n[        U[        5      (       d  M  SU;   d  M"  UR                  SS5      u  pxUR                  XxSS45        ML     U R                  U[        R                  " UR                  / UR
                  UR                  UR                   S9US9  Mò     g)	zÓ
Make CreateModel statements for proxy models. Use the same statements
as that way there's less code duplication, but for proxy models it's
safe to skip all the pointless field stuff and chuck out an operation.
rV   NFrŸ   r2   Tr  r  )r`   r]   rI   r   r   rb   rc   rø   r3   rù   r    rL   rñ   r   rá   rO   r  )	r   Úaddedr‡   rˆ   r‰   r±   rþ   r3  r4  s	            r   rm   Ú.MigrationAutodetector.generate_created_proxies  s  € ð ×#Ñ# d×&9Ñ&9Ñ9ˆÜ%+¨E¦]Ñ!ˆIØŸ-™-×.Ñ.¨yÐ/DÑEˆKØ×&Ñ&×*Ñ*¨7×3Ñ3Ð3Ð3ð ¨¨eÐ4ðˆLð $×)Ô)�Ü˜d¤C×(Ó(¨S°D­[Ø04·
±
¸3ÀÓ0BÑ-�NØ ×'Ñ'¨ÀDÈ$Ð(OÖPñ *ð
 ×ÑØÜ×&Ò&Ø$×)Ñ)ØØ'×/Ñ/Ø%×+Ñ+Ø(×1Ñ1ñð *ð ó ò &3r)   c           
      óú  • U R                   U R                  -  nU R                  U-
  nU R                  U-
  n[	        [        U5      [        U5      5      nU GHŸ  u  pVU R                  R                  XV4   n0 nUR                  R                  5        HY  u  pšU
R                  (       d  M  U
R                  R                  (       a  X¨U	'   [        U
R                  SS5      (       d  MU  X¨U	'   M[     UR                  R                  SS5      nUR                  R                  SS5      nU(       a%  U R                  U[         R"                  " USS95        U(       a%  U R                  U[         R$                  " USS95        [        U5       H(  nU R                  U[         R&                  " UUS95        M*     / nU R                  R(                  nXõU4   R                  5        H_  u  u  nnnUR                  5        HB  u  pšUR+                  UUU	S45        U
R,                  (       a  M-  UR+                  UUU	S	45        MD     Ma     [        U5       H  nUR+                  XVUS45        M     U R.                  R1                  XWR2                  45      nU(       a  UR+                  US
   US   US   S45        U R                  U[         R4                  " UR6                  S9[9        [;        U5      5      S9  GM¢     g)aN  
Find all deleted models (managed and unmanaged) and make delete
operations for them as well as separate operations to delete any
foreign key or M2M relationships (these are optimized later, if
possible).

Also bring forward removal of any model options that refer to
collections of fields - the inverse of generate_created_models().
r—   Nr  r  r&  r'  ©rˆ   rO   FrÝ   r   r2   rG   ©rO   r  )r_   ra   r\   r^   r   rI   r   r   rM   r7   rJ   r   r˜   rb   rK   rñ   r   rë   rì   ræ   r	  rL   Úmany_to_manyr�   rc   râ   rç   rO   r4   r[   )r   Únew_keysÚdeleted_modelsÚdeleted_unmanaged_modelsÚall_deleted_modelsr‡   rˆ   r‰   r1  r”   rP   r  r  rO   r±   r	  Úrelated_object_app_labelÚobject_nameÚrelation_related_fieldsÚthrough_users                       r   rj   Ú-MigrationAutodetector.generate_deleted_models,  sì  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×,Ñ,¨xÑ7ˆØ#'×#:Ñ#:¸XÑ#EÐ Ü"Ü�>Ó"¤FÐ+CÓ$Dó
Ðô &8Ñ!ˆIØŸ/™/×0Ñ0°Ð1FÑGˆKàˆNØ%0×%7Ñ%7×%=Ñ%=Ö%?Ñ!�
Ø×%×%Ñ%Ø×)Ñ)×/×/Ø5: zÑ2Ü˜u×1Ñ1°9¸d×CÓCØ5: zÓ2ñ &@ð *×1Ñ1×5Ñ5Ð6GÈÓNˆOà(×0Ñ0×4Ñ4Ð5EÀtÓLˆNÞØ×"Ñ"ØÜ×2Ò2Ø'Ø(,ñôö Ø×"Ñ"ØÜ×1Ò1Ø'Ø'+ñôô ˜~Ö.�Ø×"Ñ"ØÜ×*Ò*Ø#-Ø!ñöñ /ð ˆLØŸ™×1Ñ1ˆIð +4¸zÐ4IÑ*J×*PÑ*PÖ*Rñ'ñ Ø(ØØ&Ø)@×)FÑ)FÖ)HÑ%�JØ ×'Ñ'Ø1°;À
ÈEÐRôð !×-×-Ñ-Ø$×+Ñ+à 8Ø +Ø *Ø 'ð	öó *Iñ +Sô ˜~Ö.�Ø×#Ñ# Y¸DÀ%Ð$HÖIñ /ð  ×-Ñ-×1Ñ1°9×>TÑ>TÐ2UÓVˆLÞØ×#Ñ#Ø! !‘_ l°1¡o°|ÀA±ÈÐNôð ×ÑØÜ×&Ò&Ø$×)Ñ)ñô "¤# lÓ"3Ó4ð ô òS &8r)   c                 ó2  • U R                   U R                  -
  n[        U5       Ho  u  p#U R                  R                  X#4   nUR
                  R                  S5      (       d   eU R                  U[        R                  " UR                  S95        Mq     g)z*Make DeleteModel options for proxy models.rV   rE  N)r]   r`   rI   r   r   rb   rc   rñ   r   rç   rO   )r   Údeletedr‡   rˆ   r‰   s        r   rl   Ú.MigrationAutodetector.generate_deleted_proxies�  s…   € à×%Ñ%¨×(;Ñ(;Ñ;ˆÜ%+¨G¦_Ñ!ˆIØŸ/™/×0Ñ0°Ð1FÑGˆKØ×&Ñ&×*Ñ*¨7×3Ñ3Ð3Ð3Ø×ÑØÜ×&Ò&Ø$×)Ñ)ñöò &5r)   c                 óˆ  • / U l         U R                  R                  5       n[        U R                  U-
  5       GH  u  p#nU R
                  R                  X#4U5      nU R                  R                  X%4   nU R                  R                  X#4   nUR                  U5      nU R                  U5      n	[        XR                  -
  5       GHn  u  p«nX¢:X  d  M  X³:X  d  M  UR                  U5      nU R                  U5      nUR                  (       aP  UR                  R                  (       a5  SUS   ;   a,  US   S   nXðR                  ;   a  U R                  U   US   S'   UR                  U5        UR!                  5       S   nXé:X  d$  USS U	SS :X  d  MÏ  [#        US   US9U	S   :X  d  Må  U R$                  R'                  X<XH5      (       d  GM	  U R                   R)                  U
UUR*                  UUUUU45        UR-                  X«U45        UR/                  X#U45        UU R0                  X#U4'     GM     GM     g)zWork out renamed fields.rH   rG   r2   r   )Ú	db_columnN)Úrenamed_operationsr‘   ÚcopyrI   r’   r�   rc   r   r   r   Ú	get_fieldr,   rJ   r   r  Úset_attributes_from_nameÚget_attname_columnr6   r   Ú
ask_renamerL   rT  r  rd   rZ   )r   r‘   r‡   rˆ   r”   r™   rš   Únew_model_staterP   Ú	field_decr  r  Úrem_field_nameÚ	old_fieldÚold_field_decÚ
old_rel_toÚold_db_columns                    r   rq   Ú+MigrationAutodetector.create_renamed_fieldsš  sY  € à"$ˆÔØ×,Ñ,×1Ñ1Ó3ˆÜ17Ø×Ñ .Ñ0÷2
Ñ-ˆI :ð "×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOØ#×-Ñ-¨jÓ9ˆEà×-Ñ-¨eÓ4ˆIÜAGØ×!4Ñ!4Ñ4÷BÑ=�¨~ð !Õ-°.Õ2NØ /× 9Ñ 9¸.Ó I�IØ$(×$9Ñ$9¸)Ó$D�Mà×*×*Ø!×.Ñ.×4×4Ø  M°!Ñ$4Ó4à%2°1Ñ%5°dÑ%;˜
Ø%×)@Ñ)@Ó@Ø59×5LÑ5LÈZÑ5X˜M¨!Ñ,¨TÑ2Ø×6Ñ6°~ÔFØ$-×$@Ñ$@Ó$BÀ1Ñ$E�MØ$Ó1ð & a¨Ð*¨i¸¸!¨nÕ<Ü  ¨qÑ!1¸]ÑKØ$ Q™<õ(ð  Ÿ?™?×5Ñ5Ø&¸
÷ô ð !×3Ñ3×:Ñ:à$1Ø$2Ø$-×$7Ñ$7Ø$2Ø$-Ø$.Ø$)Ø$.ð	!"ôð +×1Ñ1Ø!.ÀÐ Oôð +×.Ñ.°	ÀzÐ/RÔSð !/ð !×/Ñ/Ø )°zÐ Añó "ô[Bò2
r)   c           
      ó’  • U R                    H·  u  nnnnnnnnX7R                  :w  a<  UR                  5       n	XIl        U R	                  U[
        R                  " UUU	S95        U R	                  U[
        R                  " UUUS95        U R                  R                  XU45        U R                  R                  XVU45        M¹     g)z Generate RenameField operations.r   )rˆ   r  r  N)rU  rT  ÚclonerO   rñ   r   rè   ÚRenameFieldr‘   r  rd   )
r   r  r  Úrem_db_columnr]  r‡   rˆ   rP   r”   Úaltered_fields
             r   rv   Ú-MigrationAutodetector.generate_renamed_fieldsØ  sÒ   € ð ×$Ô$ñ	
ØØØØØØØØð
 §¡Ó/Ø %§¡£�Ø%3Ô"Ø×"Ñ"ØÜ×)Ò)Ø#-Ø+Ø+ñôð ×ÑØÜ×&Ò&Ø)Ø+Ø'ñôð ×Ñ×&Ñ&¨À~Ð'VÔWØ×Ñ×#Ñ# Y¸JÐ$GÖHò1 %r)   c                 ó€   • [        U R                  U R                  -
  5       H  u  pnU R                  XU5        M     g)zMake AddField operations.N)rI   r’   r‘   Ú_generate_added_fieldr“   s       r   r{   Ú+MigrationAutodetector.generate_added_fieldsý  s<   € ä17Ø×Ñ $×"5Ñ"5Ñ5ö2
Ñ-ˆI :ð ×&Ñ& y¸jÖIò2
r)   c           
      óx  • U R                   R                  X4   R                  U5      nXUS4/nUR                  (       aH  UR                  R                  (       a-  UR                  U R                  UUUU R                   5      5        [        R                  [        R                  [        R                  4nUR                  =(       dn    UR                  5       =(       dW    UR                  =(       dD    UR                  =(       a    UR                  =(       d    [        XF5      =(       a    UR                   nU(       dr  UR#                  5       n[        XF5      (       a2  UR$                  (       a!  U R&                  R)                  X25      Ul        O U R&                  R-                  X25      Ul        UR.                  (       aR  UR*                  [        R0                  La5  [3        UR*                  5      (       a  U R&                  R5                  X25        U R7                  U[8        R:                  " UUUUS9US9  g )NF©rˆ   rO   rP   Úpreserve_defaultr  )r   r   rW  rJ   r   r  r  Ú	DateFieldÚDateTimeFieldÚ	TimeFieldÚnullÚhas_defaultrF  ÚblankÚempty_strings_allowedr3   Úauto_nowrd  Úauto_now_addr   Úask_auto_now_add_additionÚdefaultÚask_not_null_additionÚuniqueÚNOT_PROVIDEDÚcallableÚ$ask_unique_callable_default_additionrñ   r   rä   )r   r‡   rˆ   r”   rP   r±   Útime_fieldsrn  s           r   rj  Ú+MigrationAutodetector._generate_added_field  s¾  € Ø—‘×$Ñ$ YÐ%:Ñ;×EÑEÀjÓQˆà"°
¸EÐBÐCˆà×× %×"4Ñ"4×":×":Ø×ÑØ×6Ñ6ØØØØ—M‘Mó	ôô ×'Ñ'¬×)=Ñ)=¼v×?OÑ?OÐPˆà�J‰J÷ CØ× Ñ Ó"÷Cà×!Ñ!÷Cð —‘×; × ;Ñ ;÷Cô ˜5Ó.×A°5·>±>ð 	ö  Ø—K‘K“MˆEÜ˜%×-Ñ-°%×2D×2DØ $§¡× IÑ IØó!�•ð !%§¡× EÑ EØó!�”ð �L�LØ—‘¤V×%8Ñ%8Ò8Ü˜Ÿ™×'Ñ'à�O‰O×@Ñ@ÀÔXØ×ÑØÜ×ÒØ%ØØØ!1ñ	ð &ð 	ò 		
r)   c                 ó€   • [        U R                  U R                  -
  5       H  u  pnU R                  XU5        M     g)zMake RemoveField operations.N)rI   r‘   r’   Ú_generate_removed_fieldr“   s       r   rz   Ú-MigrationAutodetector.generate_removed_fields7  s<   € ä17Ø×Ñ $×"5Ñ"5Ñ5ö2
Ñ-ˆI :ð ×(Ñ(¨À
ÖKò2
r)   c           	      ó\   • U R                  U[        R                  " UUS9XUS4XUS4/S9  g )NrD  rÞ   rà   r  )rñ   r   ræ   r“   s       r   r‚  Ú-MigrationAutodetector._generate_removed_field>  sI   € Ø×ÑØÜ×"Ò"Ø%Øñð ¨
Ð4EÐFØ¨
Ð4IÐJðð 	ò 	
r)   c                 óú  • [        U R                  U R                  -  5       GHJ  u  pnU R                  R	                  X4U5      nU R
                  R	                  XU4U5      nU R                  R                  X4   R                  U5      nU R                  R                  X4   R                  U5      n/ n[        US5      (       Ga·  [        UR                  SS5      (       Gaš  [        UR                  R                  X5      n	X�R                  ;   a%  UR                  R                  UR                  l        [        UR                  SS5      n
U
(       a^  Xš4-   nX°R
                  ;   aJ  UR                  R                  UR                  l        UR                  R                  UR                  l        [        USS5      nU(       a‰  X4n[!        U Vs/ s H"  nU R
                  R	                  XÞ4-   U5      PM$     sn5      Ul        [!        UR$                   Vs/ s H"  nU R
                  R	                  XŸ4-   U5      PM$     sn5      Ul        UR'                  U R)                  UUUU R                  5      5        [        US5      (       ap  [        UR                  SS5      (       aT  [        UR                  R*                  X5      n	X�R                  ;   a%  UR                  R*                  UR                  l        U R-                  U5      nU R-                  U5      nUU:w  d  GM  XS:X  d  GM  UR.                  =(       a    UR.                  nUR.                  (       + =(       a    UR.                  (       + nU(       d  U(       a½  SnUR0                  (       a  UR0                  (       dn  UR3                  5       (       dY  UR.                  (       dH  UR5                  5       nU R6                  R9                  X25      nU[        R:                  La	  UUl        SnOUnU R?                  U[@        RB                  " UUUUS	9US
9  GM&  U RE                  XU5        U RG                  XU5        GMM     gs  snf s  snf )zX
Make AlterField operations, or possibly RemovedField/AddField if alter
isn't possible.
rJ   r   Nr”   Úfrom_fieldsr—   TFrm  r  )$rI   r‘   r’   r�   rc   rZ   r   r   rW  r   r>   r˜   rJ   r   r   r”   r5   r‡  Ú	to_fieldsr  r  r—   r,   rF  rr  rs  rd  r   Úask_not_null_alterationr|  ry  rñ   r   rè   r‚  rj  )r   r‡   rˆ   r”   r™   Úold_field_namer^  Ú	new_fieldr±   Ú
rename_keyÚremote_field_nameÚto_field_rename_keyr‡  Úfrom_rename_keyÚ
from_fieldÚto_fieldr_  Únew_field_decÚboth_m2mÚneither_m2mrn  rP   Únew_defaults                          r   r|   Ú-MigrationAutodetector.generate_altered_fieldsN  s  € ô
 28Ø×Ñ $×"5Ñ"5Ñ5÷2
Ñ-ˆI :ð "×0Ñ0×4Ñ4ØÐ'¨óˆNð "×0Ñ0×4Ñ4Ø¨
Ð3°ZóˆNð Ÿ™×.Ñ.¨yÐ/HÑI×SÑSØóˆIð Ÿ™×,Ñ,¨YÐ-BÑC×MÑMØóˆIð ˆLô �y .×1Ò1´gØ×&Ñ&¨°÷7ò 7ô .Ø×*Ñ*×0Ñ0°)ó�
ð ×!4Ñ!4Ó4Ø3<×3IÑ3I×3OÑ3O�I×*Ñ*Ô0ä$+¨I×,BÑ,BÀLÐRVÓ$WÐ!Þ$Ø*4Ð7KÑ*KÐ'Ø*×.AÑ.AÓAð 8A×7MÑ7M×7SÑ7S˜	×.Ñ.Ô4à%×2Ñ2×=Ñ=ð "×.Ñ.Ô9ô & i°ÀÓE�ÞØ'0Ð&=�OÜ,1ñ
 /:ó	ò /: 
ð !×/Ñ/×3Ñ3Ø /°-Ñ ?Àöñ /:ñ	ó-�IÔ)ô +0ð -6×,?Ò,?óâ,? ð !×/Ñ/×3Ñ3°JÀÑ4LÈhÖWÙ,?ñó+�IÔ'ð ×#Ñ#Ø×:Ñ:Ø!Ø"Ø!ØŸ™ó	ôô �y .×1Ñ1´gØ×&Ñ&¨	°4÷7ñ 7ô .Ø×*Ñ*×2Ñ2°Ió�
ð ×!4Ñ!4Ó4Ø5>×5KÑ5K×5SÑ5S�I×*Ñ*Ô2Ø ×1Ñ1°)Ó<ˆMØ ×1Ñ1°)Ó<ˆMð  Ö-°.Ö2NØ$×1Ñ1×L°i×6LÑ6L�Ø"+×"8Ñ"8Ô8×WÀ×AWÑAWÔ=W�Þž{à'+Ð$à!ŸŸØ )§§Ø )× 5Ñ 5× 7Ñ 7Ø )× 6× 6à )§¡Ó 1˜Ø&*§o¡o×&MÑ&MØ&ó'˜ð '¬f×.AÑ.AÒAØ,7˜EœMØ/4Ð,øà )˜Ø×&Ñ&Ø!Ü"×-Ò-Ø'1Ø!+Ø"'Ø-=ñ	ð &2ð 'ô 	ð ×0Ñ0°È
ÔSØ×.Ñ.¨yÀj×Qòa2
ùòXùòs   Ç)Q3
È )Q8
c                 óT  • [         R                  R                  n[        [        5      U l        [        U R                  5       GHÌ  u  p#U R                  R                  X#4U5      nU R                  R                  X$4   nU R                  R                  X#4   nUR                  U   nUR                  U   nU V	s/ s H  o™U;  d  M
  U	PM     n
n	U V	s/ s H  o™U;  d  M
  U	PM     nn	/ n/ n/ nU
 Hš  nUR                  5       nUS   R                  S5      nU Hm  nUR                  5       nUS   R                  S5      nUU:X  d  M/  UU:w  d  M7  UR!                  UUS 45        UR!                  U5        UR!                  U5        Mo     Mœ     U R#                  [         R$                  R                  5       Hþ  u  nnnnnUU:w  d  UU:w  a  M  UR'                  U5      nU HÏ  n/ nU
 H_  nUR                  5       u  nnnU(       a  M   UR(                  [	        U5      :X  d  M;  [+        U5      SS1:X  d  MN  UR!                  U5        Ma     [-        U5      S:X  d  M{  US   n UR!                  U 5        UR!                  S U R.                  U45        U R
                  UU4   R!                  U5        MÑ     GM      U
 V	s/ s H  o™U;  d  M
  U	PM     n
n	U V	s/ s H  o™U;  d  M
  U	PM     nn	U R0                  R3                  X#4U
UUS.05        GMÏ     g s  sn	f s  sn	f s  sn	f s  sn	f )NrG   rO   rM   r2   r   )Úadded_indexesÚremoved_indexesÚrenamed_indexes)r   r,  Úoption_namer   r4   Úrenamed_index_together_valuesrI   rŒ   r�   rc   r   r   r   rb   r1   rK   rL   Ú$_get_altered_foo_together_operationsrì   r*  rM   r[   rª   rO   rX   r¸   )!r   r›  r‡   rˆ   r™   rš   r[  Úold_indexesÚnew_indexesÚidxr˜  r™  rš  Úremove_from_addedÚremove_from_removedÚ	new_indexÚnew_index_decÚnew_index_nameÚ	old_indexÚold_index_decÚold_index_nameÚ	old_valueÚ	new_valueÚindex_together_app_labelÚindex_together_model_namer±   Úremoved_valuesÚremoved_index_togetherÚrenamed_index_together_indexesÚ_r;   rD   Úrenamed_indexs!                                    r   rr   Ú,MigrationAutodetector.create_altered_indexesÅ  sH  € Ü ×)Ñ)×5Ñ5ˆÜ-8¼Ó->ˆÔ*ä%+¨D×,@Ñ,@×%AÑ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOà)×1Ñ1°+Ñ>ˆKØ)×1Ñ1°+Ñ>ˆKÙ,7ÓRªK SÀkÑ;QŸS©KˆMÐRÙ.9ÓTªk sÈÑ=SŸs©kˆOÐTØ ˆOà "ÐØ"$ÐÛ*�	Ø )× 5Ñ 5Ó 7�Ø!.¨qÑ!1×!5Ñ!5°fÓ!=�Û!0�IØ$-×$9Ñ$9Ó$;�MØ%2°1Ñ%5×%9Ñ%9¸&Ó%A�Nð &¨Õ6Ø*¨nÕ<à'×.Ñ.°ÀÐPTÐ/UÔVØ)×0Ñ0°Ô;Ø+×2Ñ2°9Ö=ó "1ñ +ð* ×:Ñ:Ü×-Ñ-×9Ñ9öñØØØ(Ø)Øð
 Ð!9Ó9Ø!Ð%>Ó>áØ!*×!5Ñ!5°iÓ!@�Û.<Ð*Ø57Ð2Û%2˜	Ø*3×*?Ñ*?Ó*A™˜˜4 ÷ !% Ø )× 0Ñ 0´DÐ9OÓ4PÕ PÜ # F£°¸Ð/AÕ Aà:×AÑAÀ)ÖLñ &3ô Ð9Ó:¸aÕ?Ø(FÀqÑ(I˜Ø)×0Ñ0°Ô?Ø'×.Ñ.Ø! =×#5Ñ#5Ð7MÐNôð ×:Ñ:Ø4Ð6OÐOñç ™&Ð!7Ö8ô) /=ññB  -óÚ,˜Ð;LÑ0L—™}ð ð ñ  /óÚ.˜Ð=PÑ2P—™ð ð ð × Ñ ×'Ñ'àÐ+Ø)6Ø+:Ø+:ñ.ð÷òW &Bùò SùÚTùòtùòs0   Â=	LÃ
LÃ	LÃ#LË 	L ËL Ë	L%Ë&L%c           
      ó²   • U R                   R                  5        H9  u  u  pnUS    H(  nU R                  U[        R                  " UUS95        M*     M;     g )Nr˜  r"  )rX   r7   rñ   r   r,  ©r   r‡   rˆ   Úalt_indexesr#  s        r   r€   Ú,MigrationAutodetector.generate_added_indexes  sX   € Ø48×4HÑ4H×4NÑ4NÖ4PÑ0Ñ#ˆY [Ø$ _Ô5�Ø×"Ñ"ØÜ×'Ò'Ø#-Ø#ñöó 6ò 5Qr)   c           
      óÆ   • U R                   R                  5        HC  u  u  pnUS    H2  nU R                  U[        R                  " UUR
                  S95        M4     ME     g )Nr™  rD  )rX   r7   rñ   r   ÚRemoveIndexrO   r´  s        r   ru   Ú.MigrationAutodetector.generate_removed_indexes)  s]   € Ø48×4HÑ4H×4NÑ4NÖ4PÑ0Ñ#ˆY [Ø$Ð%6Ô7�Ø×"Ñ"ØÜ×*Ò*Ø#-Ø"ŸZ™Zñöó 8ò 5Qr)   c                 ó¼   • U R                   R                  5        H>  u  u  pnUS    H-  u  pEnU R                  U[        R                  " UUUUS95        M/     M@     g )Nrš  )rˆ   r  r  Ú
old_fields)rX   r7   rñ   r   ÚRenameIndex)r   r‡   rˆ   rµ  r¨  r¥  r»  s          r   rw   Ú.MigrationAutodetector.generate_renamed_indexes4  sh   € Ø48×4HÑ4H×4NÑ4NÖ4PÑ0Ñ#ˆY [Ø>IØ!ô?Ñ:�°
ð ×"Ñ"ØÜ×*Ò*Ø#-Ø!/Ø!/Ø#-ñ	öó?ò 5Qr)   c                 ó  • [         R                  R                  n[        U R                  5       HÇ  u  p#U R
                  R                  X#4U5      nU R                  R                  X$4   nU R                  R                  X#4   nUR                  U   nUR                  U   nU V	s/ s H  o™U;  d  M
  U	PM     n
n	U V	s/ s H  o™U;  d  M
  U	PM     nn	U R                  R                  X#4U
US.05        MÉ     g s  sn	f s  sn	f )N)Úadded_constraintsÚremoved_constraints)r   r-  r›  rI   rŒ   r�   rc   r   r   r   rb   rY   r¸   )r   r›  r‡   rˆ   r™   rš   r[  Úold_constraintsÚnew_constraintsÚcÚadd_constraintsÚrem_constraintss               r   rs   Ú0MigrationAutodetector.create_altered_constraintsC  sÿ   € Ü ×.Ñ.×:Ñ:ˆÜ%+¨D×,@Ñ,@Ö%AÑ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOà-×5Ñ5°kÑBˆOØ-×5Ñ5°kÑBˆOÙ*9ÓVª/ QÀoÑ=UŸq©/ˆOÐVÙ*9ÓVª/ QÀoÑ=UŸq©/ˆOÐVà×$Ñ$×+Ñ+àÐ+Ø-<Ø/>ñ.ðöò &Bùò WùÚVs   Â(	C<Â5C<Ã	DÃDc           
      ó´   • U R                   R                  5        H:  u  u  nnnUS    H(  nU R                  U[        R                  " UUS95        M*     M<     g )Nr¿  r$  )rY   r7   rñ   r   r-  ©r   r‡   rˆ   Úalt_constraintsr%  s        r   r�   Ú0MigrationAutodetector.generate_added_constraintsZ  sd   € ð #×6Ñ6×<Ñ<Ö>ññ 
ØØØØ-Ð.AÔB�
Ø×"Ñ"ØÜ×,Ò,Ø#-Ø#-ñöó Cò ?r)   c           
      óÈ   • U R                   R                  5        HD  u  u  nnnUS    H2  nU R                  U[        R                  " UUR
                  S95        M4     MF     g )NrÀ  rD  )rY   r7   rñ   r   ÚRemoveConstraintrO   rÈ  s        r   rt   Ú2MigrationAutodetector.generate_removed_constraintsh  sh   € ð #×6Ñ6×<Ñ<Ö>ññ 
ØØØØ-Ð.CÔD�
Ø×"Ñ"ØÜ×/Ò/Ø#-Ø'Ÿ_™_ñöó Eò ?r)   c                 ó$  ^• S n[        TR                  S5      (       a  TR                  R                  nO]UR                  X4   nUR	                  5        H9  u  u  pgn[        U4S jUR                  5        5       5      (       d  M2  U SU 3n  O   [        TSS 5      n	U	b  Sn
U	nO[        UU U5      u  p«X«S S4/n[        TR                  SS 5      (       a7  [        TR                  R                  U U5      u  pÞUR                  XÞS S45        U$ )Nr   c              3   óB   >#   • U  H  nTUR                   :H  v •  M     g 7fr   )rJ   )r-   r>  rP   s     €r   r/   ÚJMigrationAutodetector._get_dependencies_for_foreign_key.<locals>.<genexpr>~  s#   øé € ð â)8˜ð ˜]×7Ñ7Ö7Ú)8ùs   ƒrŸ   Úswappable_settingrž   Tr—   )r>   rJ   r   r	  r7   rã   r´   r˜   r   r—   rL   )r‡   rˆ   rP   Úproject_stateÚremote_field_modelr	  Úremote_app_labelÚremote_model_namerM   rÑ  Údep_app_labelÚdep_object_namer±   Úthrough_app_labelÚthrough_object_names     `            r   r  Ú7MigrationAutodetector._get_dependencies_for_foreign_keyv  s5  ø€ à!ÐÜ�5×%Ñ% w×/Ñ/Ø!&×!3Ñ!3×!9Ñ!9Ñà%×/Ñ/°	Ð0EÑFˆIØAJÇÁÖARÑ=Ñ5Ð!°vÜô à)/¯©¬ó÷ ó ð -=Ð+=¸QÐ?PÐ>QÐ)RÐ&Ùñ BSô $ EÐ+>ÀÓEÐØÑ(Ø)ˆMØ/‰Oä-=Ø"ØØó.Ñ*ˆMð
 '¸¸tÐDÐEˆÜ�5×%Ñ% y°$×7Ñ7Ü5EØ×"Ñ"×*Ñ*ØØó6Ñ2Ðð
 ×ÑÐ!2ÈÈtÐ TÔUØÐr)   c              #   ó@  ^ ^^#   • [        T R                  5       GHx  u  mmT R                  R                  TT4T5      nT R                  R
                  TU4   nT R                  R
                  TT4   nUR                  R                  U5      nU(       a(  U Vs1 s H  n[        UUU 4S jU 5       5      iM     snO	[        5       nUR                  R                  U5      nU(       a  [        U5      O	[        5       nXW:w  d  Mí  / nU Hz  n	U	 Hq  n
UR                  U
5      nUR                  (       d  M'  UR                  R                  (       d  MD  UR                  T R                  TTUT R                  5      5        Ms     M|     UUTTU4v •  GM{     g s  snf 7f)Nc              3   ób   >#   • U  H$  nTR                   R                  TTU4U5      v •  M&     g 7fr   )rZ   rc   )r-   Únr‡   rˆ   r   s     €€€r   r/   ÚMMigrationAutodetector._get_altered_foo_together_operations.<locals>.<genexpr>¥  s5   øé € ð â!'˜Að ×+Ñ+×/Ñ/°¸JÈÐ0JÈA×NÐNÚ!'ùs   ƒ,/)rI   rŒ   r�   rc   r   r   r   rb   r5   r[   rW  rJ   r   r  r  )r   r›  r™   rš   r[  r©  r{  rª  r±   Úfoo_togethersr”   rP   r‡   rˆ   s   `           @@r   r�  Ú:MigrationAutodetector._get_altered_foo_together_operations™  s‘  úé € Ü%+¨D×,@Ñ,@×%AÑ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9¸jÐ3HÑIˆOð (×/Ñ/×3Ñ3°KÓ@ˆIö ñ #,óò
 #,˜ô	 ö á!'óö ñ #,òô “Uð ð (×/Ñ/×3Ñ3°KÓ@ˆIÞ*3œ˜Iœ¼»ˆIàÕ%Ø!�Û%.�MÛ&3˜
Ø /× 9Ñ 9¸*Ó E˜Ø ×-×-Ñ-°%×2DÑ2D×2J×2JÑ2JØ(×/Ñ/Ø $× FÑ FØ$-Ø$.Ø$)Ø$(§M¡Mó	!"öó '4ñ &/ð ØØØØ ðõ òM &Bùòùs&   …BFÂ!FÂ=AFÄ,FÄ8FÅA	Fc           
      ób  • U R                  UR                  5       H‹  u  nnnnnU[        R                  :X  a(  U Vs1 s H  nUU R                  XE4   ;  d  M  UiM     nnUR                  U5      nU(       d	  U(       d  Mf  U R                  UU" SSU0UR                  U0D6US9  M�     g s  snf ©NrO   r  rÚ   )r�  r›  r   rì   rœ  r+  rñ   )	r   r¿   r©  rª  r‡   rˆ   r±   r.   Úremoval_values	            r   Ú&_generate_removed_altered_foo_togetherÚ<MigrationAutodetector._generate_removed_altered_foo_togetherÈ  sØ   € ð ×6Ñ6°y×7LÑ7LÖMñ
ØØØØØàœJ×9Ñ9Ó9ñ "+óâ!*˜ØØ×=Ñ=¸iÐ>SÑTñU÷ Ù!*ð ð ð &×2Ñ2°9Ó=ˆMÞ§	 	Ø×"Ñ"ØÙñ Ø'ðØ,5×,AÑ,AÀ=Ð+Qñð ".ð #ó ò Nùòs   ½B,ÁB,c                 óB   • U R                  [        R                  5        g r   )rä  r   rë   ©r   s    r   rx   Ú>MigrationAutodetector.generate_removed_altered_unique_togetherá  s   € Ø×3Ñ3´J×4RÑ4RÕSr)   c                 óB   • U R                  [        R                  5        g r   )rä  r   rì   rç  s    r   ry   Ú=MigrationAutodetector.generate_removed_altered_index_togetherå  s   € Ø×3Ñ3´J×4QÑ4QÕRr)   c           
      óÎ   • U R                  UR                  5       HF  u  nnnnnUR                  U5      nX7:w  d  M!  U R                  UU" SSU0UR                  U0D6US9  MH     g râ  )r�  r›  r+  rñ   )r   r¿   r©  rª  r‡   rˆ   r±   rã  s           r   Ú_generate_altered_foo_togetherÚ4MigrationAutodetector._generate_altered_foo_togetherè  s|   € ð ×6Ñ6°y×7LÑ7LÖMñ
ØØØØØà%×2Ñ2°9Ó=ˆMØÕ)Ø×"Ñ"ØÙÑT :ÐT°)×2GÑ2GÈÐ1SÑTØ!-ð #ó ò Nr)   c                 óB   • U R                  [        R                  5        g r   )rì  r   rë   rç  s    r   r~   Ú6MigrationAutodetector.generate_altered_unique_togetherø  s   € Ø×+Ñ+¬J×,JÑ,JÕKr)   c                 óB   • U R                  [        R                  5        g r   )rì  r   rì   rç  s    r   r   Ú5MigrationAutodetector.generate_altered_index_togetherü  s   € Ø×+Ñ+¬J×,IÑ,IÕJr)   c           	      óò  • U R                   R                  U R                  U R                  5      n[	        U5       H¸  u  p#U R
                  R                  X#4U5      nU R                  R                  X$4   nU R                  R                  X#4   nUR                  R                  S5      nUR                  R                  S5      nXx:w  d  M“  U R                  U[        R                  " UUS95        Mº     g )NÚdb_table)rO   Útable)rŒ   Úunionr�   rŽ   rI   r�   rc   r   r   r   rb   rñ   r   ÚAlterModelTable)	r   Úmodels_to_checkr‡   rˆ   r™   rš   r[  Úold_db_table_nameÚnew_db_table_names	            r   r‚   Ú/MigrationAutodetector.generate_altered_db_tableÿ  sä   € Ø×.Ñ.×4Ñ4Ø× Ñ  $×":Ñ":ó
ˆô &,¨OÖ%<Ñ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOØ /× 7Ñ 7× ;Ñ ;¸JÓ GÐØ /× 7Ñ 7× ;Ñ ;¸JÓ GÐØ Õ5Ø×"Ñ"ØÜ×.Ò.Ø'Ø/ñöò &=r)   c           	      óò  • U R                   R                  U R                  U R                  5      n[	        U5       H¸  u  p#U R
                  R                  X#4U5      nU R                  R                  X$4   nU R                  R                  X#4   nUR                  R                  S5      nUR                  R                  S5      nXx:w  d  M“  U R                  U[        R                  " UUS95        Mº     g )NÚdb_table_comment)rO   Útable_comment)rŒ   rõ  r�   rŽ   rI   r�   rc   r   r   r   rb   rñ   r   ÚAlterModelTableComment)	r   r÷  r‡   rˆ   r™   rš   r[  Úold_db_table_commentÚnew_db_table_comments	            r   rp   Ú7MigrationAutodetector.generate_altered_db_table_comment  sæ   € Ø×.Ñ.×4Ñ4Ø× Ñ  $×":Ñ":ó
ˆô &,¨OÖ%<Ñ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOà#2×#:Ñ#:×#>Ñ#>Ð?QÓ#RÐ Ø#2×#:Ñ#:×#>Ñ#>Ð?QÓ#RÐ Ø#Õ;Ø×"Ñ"ØÜ×5Ò5Ø'Ø&:ñöò &=r)   c           	      ó  • U R                   R                  U R                  U R                  U R                  U R
                  -  U R                  U R                  -  5      n[        U5       GH  u  p#U R                  R                  X#4U5      nU R                  R                  X$4   nU R                  R                  X#4   nUR                  R                  5        VVs0 s H  u  pxU[         R"                  ;   d  M  Xx_M     n	nnUR                  R                  5        VVs0 s H  u  pxU[         R"                  ;   d  M  Xx_M     n
nnXš:w  d  Mæ  U R%                  U[&        R                   " UU
S95        GM     gs  snnf s  snnf )z¤
Work out if any non-schema-affecting options have changed and make an
operation to represent them in state changes (in case Python code in
migrations needs them).
)rO   rb   N)rŒ   rõ  r�   rŽ   r^   r_   r\   ra   rI   r�   rc   r   r   r   rb   r7   r	   ÚALTER_OPTION_KEYSrñ   r   )r   r÷  r‡   rˆ   r™   rš   r[  rA   r.   Úold_optionsÚnew_optionss              r   rn   Ú.MigrationAutodetector.generate_altered_options*  sy  € ð ×.Ñ.×4Ñ4Ø× Ñ Ø×$Ñ$à×#Ñ# d×&9Ñ&9Ñ9à×Ñ $×"9Ñ"9Ñ9ó
ˆô &,¨O×%<Ñ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOð #2×"9Ñ"9×"?Ñ"?Ô"Aôâ"A‘J�CØÔ+×=Ñ=Ñ=ó �’
Ù"Að ñ ð #2×"9Ñ"9×"?Ñ"?Ô"Aôâ"A‘J�CØÔ+×=Ñ=Ñ=ó �’
Ù"Að ñ ð
 Õ)Ø×"Ñ"ØÜ×0Ò0Ø'Ø +ñ÷ò# &=ùóùó
s   Ã E=Ã>E=Ä$FÅFc           
      ó\  • [        U R                  5       GH  u  pU R                  R                  X4U5      nU R                  R
                  X4   nU R                  R
                  X4   nUR                  R                  S5      UR                  R                  S5      :w  d  M‘  / nUR                  R                  S5      (       a"  UR                  UUUR                  S   S45        U R                  U[        R                  " UUR                  R                  S5      S9US9  GM     g )Nrê   Tr!  r  )rI   rŒ   r�   rc   r   r   r   rb   rL   rñ   r   ré   )r   r‡   rˆ   r™   rš   r[  r±   s          r   r}   Ú<MigrationAutodetector.generate_altered_order_with_respect_toR  s*  € Ü%+¨D×,@Ñ,@×%AÑ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOØ×&Ñ&×*Ñ*Ø'óà ×(Ñ(×,Ñ,Ð-DÓEõFð
  "�Ø"×*Ñ*×.Ñ.Ð/F×GÑGØ ×'Ñ'à%Ø&Ø+×3Ñ3Ð4KÑLØ ð	ôð ×"Ñ"ØÜ×6Ò6Ø'Ø.=×.EÑ.E×.IÑ.IØ3ó/ñð ".ð #ô 	ò- &Br)   c           	      óx  • [        U R                  5       H¡  u  pU R                  R                  X4U5      nU R                  R
                  X4   nU R                  R
                  X4   nUR                  UR                  :w  d  Mr  U R                  U[        R                  " UUR                  S95        M£     g )N)rO   r  )rI   rŒ   r�   rc   r   r   r   r  rñ   r   ÚAlterModelManagers)r   r‡   rˆ   r™   rš   r[  s         r   ro   Ú/MigrationAutodetector.generate_altered_managerst  s¨   € Ü%+¨D×,@Ñ,@Ö%AÑ!ˆIØ!×0Ñ0×4Ñ4ØÐ'¨óˆNð #Ÿo™o×4Ñ4°YÐ5NÑOˆOØ"Ÿm™m×2Ñ2°9Ð3HÑIˆOØ×'Ñ'¨?×+CÑ+CÕCØ×"Ñ"ØÜ×1Ò1Ø'Ø!0×!9Ñ!9ñöò &Br)   c           	      óÀ  • UR                  5       n0 n[        UR                  5       5       GHX  u  pgU(       d  M  SnU H  n	U	S   U:X  d  M  U	n  O   Uc?  U R                  R	                  U5      (       d  U H  n
US4XVU
R
                  4'   M     X	 Mi  Uc  SnO U R                  US   5      =(       d    SS-   n[        U5       Hº  u  pÊUS:X  a"  U(       a  U
R                  R                  U5        SU-  /nU(       a  UR                  U5        OAUS:X  a  U(       d  UR                  S5        O"UR                  U
R                  5       SS 5        SR                  U5      nXn4XVU
R
                  4'   US-  nXêl        M¼     GM[     UR                  5        H<  nU H3  n
U
R                   Vs/ s H  oõR                  Xÿ5      PM     snU
l        M5     M>     U$ s  snf )	z¡
Take a result from changes() and a MigrationGraph, and fix the names
and dependencies of the changes so they extend the graph from the leaf
nodes for each app.
Nr   r°   r2   z%04ir¹   éd   r°  )r·   r4   r7   r   Úask_initialrO   Úparse_numberÚ	enumerater±   rL   Úsuggest_nameÚjoinr´   rc   )r   r'   r#   r&   ÚleavesÚname_mapr‡   r†   Úapp_leafÚleafrÕ   Únext_numberÚiÚnew_name_partsr  r9  s                   r   r!   Ú'MigrationAutodetector.arrange_for_graph„  sÌ  € ð ×!Ñ!Ó#ˆØˆÜ%)¨'¯-©-«/×%:Ñ!ˆIÞÙàˆHÛ�Ø˜‘7˜iÕ'Ø#�HÙñ ð
 Ñ¨¯©×(CÑ(CÀI×(NÑ(Nã!+�IØ=FÈÐ<T�H¨¯©Ð8Ó9ñ ",àÐ&ÙàÑØ‘à#×0Ñ0°¸!±Ó=×BÀÀaÑG�ä )¨*Ö 5‘�Ø˜“6žhØ×*Ñ*×1Ñ1°(Ô;Ø"(¨;Ñ"6Ð!7�Þ!Ø"×)Ñ)¨.Õ9Ø˜!“V¦HØ"×)Ñ)¨)Õ4à"×)Ñ)¨)×*@Ñ*@Ó*BÀ4ÀCÐ*HÔIØŸ8™8 NÓ3�Ø9BÐ8M� Y§^¡^Ð4Ñ5Ø˜qÑ �Ø!)–ô !6ñ- &;ðJ "Ÿ.™.Ö*ˆJÛ'�	à09×0FÒ0Fó*Ú0F¨1—L‘L Ö&Ñ0Fñ*�	Ö&ó (ñ +ð
 ˆùò*s   Æ/Gc           	      ó°  • 0 nUR                  5        HL  u  pEU HA  nUR                   H.  u  pxUR                  U[        5       5      R	                  U5        M0     MC     MN     [        U5      n	Sn
X©:w  aA  [        U	5      n
U	R
                  " U	 Vs/ s H  oCR                  US5      PM     sn6   X©:w  a  MA  [        U5       H  nXI;  d  M
  X	 M     U$ s  snf )a	  
Take changes from arrange_for_graph() and set of app labels, and return
a modified set of changes which trims out as many migrations that are
not in app_labels as possible. Note that some other migrations may
still be present as they may be required dependencies.
NrÚ   )r7   r±   rº   r[   rd   r¸   rc   r4   )r   r'   Ú
app_labelsÚapp_dependenciesr‡   r†   rÕ   rÖ  rO   Úrequired_appsÚold_required_appss              r   r"   Ú#MigrationAutodetector._trim_to_apps¸  sÖ   € ð ÐØ%,§]¡]¦_Ñ!ˆIÛ'�	Ø+4×+AÔ+AÑ'�MØ$×/Ñ/°	¼3»5ÓA×EÑEÀmÖTó ,Bó (ñ &5ô ˜J›ˆà ÐØÓ0Ü # MÓ 2ÐØ× Ò ÙGTÓUÂ}¸)×&Ñ& y°"Ö5Á}ÑUñð  Õ0ô ˜gžˆIØÕ-ØÒ&ñ 'ð ˆùò Vs   ÂCc                 ó´   • [         R                  " SU5      =n(       a  [        US   5      $ [         R                  " SU5      nU(       a  [        US   5      $ g)uÃ   
Given a migration name, try to extract a number from the beginning of
it. For a squashed migration such as '0001_squashed_0004â€¦', return the
second number. If no number is found, return None.
z.*_squashed_(\d+)r2   z^\d+r   N)ÚreÚsearchÚintÚmatch)ÚclsrO   Úsquashed_matchr%  s       r   r  Ú"MigrationAutodetector.parse_numberÓ  sO   € ô  ŸYšYÐ';¸TÓBÐBˆ>ÕBÜ�~ aÑ(Ó)Ð)Ü—’˜ $Ó'ˆÞÜ�u˜Q‘x“=Ð Ør)   )rY   rX   r   r   rW   rŒ   r�   rŽ   r†   r’   r_   r`   ra   r‘   r\   r]   r^   r   rZ   rœ  r�   r  rU  r�   r   r   )NNN)NN)NF)9rú   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r'   r,   rR   r    rh   ri   Ústaticmethodr¥   r„   rƒ   r…   r¶   rñ   r  rg   rk   rm   rj   rl   rq   rv   r{   rj  rz   r‚  r|   rr   r€   ru   rw   rs   r�   rt   r  r�  rä  rx   ry   rì  r~   r   r‚   rp   rn   r}   ro   r!   r"   Úclassmethodr  Ú__static_attributes__rÚ   r)   r   r   r      sO  † ñ
ôGô
ò$òLôiòV
ò.ð( ñ
Yó ð
Yôp"òdò.ò$=Kô~Ròò.A"òFAòFòB_òBò<"ò|#IòJJò1
òfLò
ò uRònWòr	ò	òòò.òð ñ ó ð òD-ò^ò2TòSòò LòKòò*ò,&òP òDô 2òhð6 ñó ór)   r   )r8   r"  Úcollectionsr   Ú	itertoolsr   Údjango.confr   Ú	django.dbr   Údjango.db.migrationsr   Údjango.db.migrations.migrationr   Ú&django.db.migrations.operations.modelsr	   Údjango.db.migrations.optimizerr
   Údjango.db.migrations.questionerr   Údjango.db.migrations.utilsr   r   r   Údjango.utils.topological_sortr   r   rÚ   r)   r   Ú<module>r;     sB   ðÛ Û 	Ý #Ý å  Ý Ý +Ý 4Ý DÝ =Ý ?÷ñ õ
 B÷Jò Jr)   