Ë
    ùi¯eB8 ã                   ó´   — d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZmZ  G d„ d«      Zy)é    N)Údefaultdict)ÚTopologicalSorter)Úchain)Úsettings)Úmodels)Ú
operations)Ú	Migration)ÚAlterModelOptions)ÚMigrationOptimizer)ÚMigrationQuestioner)ÚCOMPILED_REGEX_TYPEÚRegexObjectÚresolve_relationc                   óf  — e Zd ZdZd5d„Zd6d„Zd„ Zd„ Zd7d„Zd„ Z	d	„ Z
ed
„ «       Zd5d„Zd„ Zd„ Zd„ Zd8d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%ed$„ «       Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d1„ Z3d5d2„Z4d3„ Z5e6d4„ «       Z7y)9ÚMigrationAutodetectora  
    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s
 t        «       | _        |j                  D ��ch c]  \  }}|’Œ	 c}}| _        y c c}}w ©N)Ú
from_stateÚto_stater   Ú
questionerr   Úexisting_apps)Úselfr   r   r   ÚappÚmodels         úJE:\TRUCKING_PROJECT\Lib\site-packages\django/db/migrations/autodetector.pyÚ__init__zMigrationAutodetector.__init__"   s@   € Ø$ˆŒØ ˆŒØ$Ò=Ô(;Ó(=ˆŒØ4>×4EÑ4E×F¡j c¨5šcÓFˆÕùÓFs   ±Ac                 óx   — | j                  ||«      }| j                  |||«      }|r| j                  ||«      }|S )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%   zMigrationAutodetector.changes(   sD   € ð ×&Ñ& |°UÓ;ˆØ×(Ñ(¨°%¸ÓHˆÙØ×(Ñ(¨°,Ó?ˆGØˆó    c           
      ó˜  ‡ — t        |t        «      r|D �cg c]  }‰ j                  |«      ‘Œ c}S t        |t        «      rt        ˆ fd„|D «       «      S t        |t        «      r3|j                  «       D ��ci c]  \  }}|‰ j                  |«      “Œ c}}S t        |t        j                  «      rA|j                  ‰ j                  |j                  «      ‰ j                  |j                  «      fS t        |t        «      rt        |«      S t        |t        «      r|S t        |d«      rˆ|j                  «       }t        |t         j"                  «      r|dd }|\  }}}||D �cg c]  }‰ j                  |«      ‘Œ c}|j                  «       D ��ci c]  \  }}|‰ j                  |«      “Œ c}}fS |S c c}w c c}}w c c}w c c}}w )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   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )Údeep_deconstruct)Ú.0Úvaluer   s     €r   ú	<genexpr>z9MigrationAutodetector.deep_deconstruct.<locals>.<genexpr>=   s   øè ø€ ÒG¸%˜×.Ñ.¨u×5ÑGùs   ƒÚdeconstructé   N)Ú
isinstanceÚlistr)   ÚtupleÚdictÚitemsÚ	functoolsÚpartialÚfuncÚargsÚkeywordsr   r   ÚtypeÚhasattrr-   r   ÚField)r   Úobjr+   ÚkeyÚdeconstructedÚpathr7   Úkwargss   `       r   r)   z&MigrationAutodetector.deep_deconstruct4   s�  ø€ ô �cœ4Ô Ø>AÖB°U�D×)Ñ)¨%Õ0ÒBÐBÜ˜œUÔ#ÜÓGÀ3ÔGÓGÐGÜ˜œTÔ"ØHKÏ	É	Ë×T¹*¸#¸u�C˜×.Ñ.¨uÓ5Ñ5ÓTÐTÜ˜œY×.Ñ.Ô/à—‘Ø×%Ñ% c§h¡hÓ/Ø×%Ñ% c§l¡lÓ3ðð ô
 ˜Ô0Ô1Ü˜sÓ#Ð#Ü˜œTÔ"ð ˆJÜ�S˜-Ô(ØŸO™OÓ-ˆMÜ˜#œvŸ|™|Ô,à -¨a¨bÐ 1�Ø!.ÑˆD�$˜àØ;?Ö@°%�×&Ñ& uÕ-Ò@ØEKÇ\Á\Ã^×T±z°s¸E��d×+Ñ+¨EÓ2Ñ2ÓTðð ð ˆJùò; Cùó Uùò* AùÛTs   –F6Á8F;Å&GÆG
c                 óþ   — g }t        |j                  «       «      D ]^  \  }}| j                  |«      }|j                  r+|j                  j                  r|d   j                  dd«       |j                  |«       Œ` |S )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)Úsortedr3   r)   Úremote_fieldr   ÚpopÚappend)r   ÚfieldsÚ
fields_defÚnameÚfieldÚdeconstructions         r   Úonly_relation_agnostic_fieldsz3MigrationAutodetector.only_relation_agnostic_fieldsZ   sy   € ð ˆ
Ü! &§,¡,£.Ó1ò 	.‰KˆD�%Ø!×2Ñ2°5Ó9ˆNØ×!Ò! e×&8Ñ&8×&>Ò&>Ø˜qÑ!×%Ñ% d¨DÔ1Ø×Ñ˜nÕ-ð		.ð
 Ðr&   c                 ó¾  — i | _         i | _        i | _        i | _        t	        «       | _        t	        «       | _        t	        «       | _        t	        «       | _        t	        «       | _	        t	        «       | _
        | j                  j                  j                  «       D ]±  \  \  }}}|j                  j                  dd«      s| j                  j!                  ||f«       ŒC|| j                  j"                  vsŒ\|j                  j                  d«      r| j                  j!                  ||f«       Œ•| j
                  j!                  ||f«       Œ³ | j$                  j                  j                  «       D ]¸  \  \  }}}|j                  j                  dd«      s| j                  j!                  ||f«       ŒC|| j                  j"                  vs|sŒ^||v sŒc|j                  j                  d«      r| j                  j!                  ||f«       Œœ| j                  j!                  ||f«       Œº | j                  j'                  «        | j$                  j'                  «        | j)                  «        | j+                  «        | j-                  «        | j/                  «        | j1                  «        | j3                  «        | j5                  «        | j7                  «        | j9                  «        | j;                  «        | j=                  «        | j?                  «        | jA                  «        | jC                  «        | jE                  «        | jG                  «        | jI                  «        | jK                  «        | jM                  «        | jO                  «        | jQ                  «        | jS                  «        | jU                  «        | jW                  «        | jY                  «        | j[                  «        | j]                  «        | j_                  «        | ja                  «        | jc                  |«       | je                  «        | jf                  S )aX  
        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   r3   Ú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   z%MigrationAutodetector._detect_changesh   s„  € ð& %'ˆÔ!Ø!ˆÔØ#%ˆÔ Ø ˆÔô "›eˆÔÜ!›eˆÔÜ"%£%ˆÔÜ!›eˆÔÜ!›eˆÔÜ"%£%ˆÔØ48·O±O×4JÑ4J×4PÑ4PÓ4Rò 	EÑ0Ñ#ˆY˜
 [Ø×&Ñ&×*Ñ*¨9°dÔ;Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDØ $§/¡/×";Ñ";Ò;Ø×&Ñ&×*Ñ*¨7Ô3Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDà×'Ñ'×+Ñ+¨Y¸
Ð,CÕDð	Eð 59·M±M×4HÑ4H×4NÑ4NÓ4Pò 		EÑ0Ñ#ˆY˜
 [Ø×&Ñ&×*Ñ*¨9°dÔ;Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDØ $§/¡/×";Ñ";Ñ;Ú ¨lÒ!:à×&Ñ&×*Ñ*¨7Ô3Ø×'Ñ'×+Ñ+¨Y¸
Ð,CÕDà×'Ñ'×+Ñ+¨Y¸
Ð,CÕDð		Eð 	�‰×4Ñ4Ô6Ø�‰×2Ñ2Ô4ð 	×$Ñ$Ô&ð 	×!Ñ!Ô#Ø×(Ñ(Ô*ð 	×$Ñ$Ô&Ø×$Ñ$Ô&Ø×%Ñ%Ô'Ø×%Ñ%Ô'Ø×%Ñ%Ô'Ø×&Ñ&Ô(Ø×.Ñ.Ô0ð 	×"Ñ"Ô$ð 	×#Ñ#Ô%Ø×'Ñ'Ô)à×)Ñ)Ô+Ø×%Ñ%Ô'à×$Ñ$Ô&Ø×%Ñ%Ô'à×5Ñ5Ô7Ø×4Ñ4Ô6à×$Ñ$Ô&Ø×"Ñ"Ô$Ø×$Ñ$Ô&Ø×3Ñ3Ô5Ø×-Ñ-Ô/Ø×,Ñ,Ô.Ø×#Ñ#Ô%Ø×'Ñ'Ô)Ø×&Ñ&Ô(à×ÑÔØ×"Ñ" 5Ô)Ø×!Ñ!Ô#à�‰Ðr&   c                 óf  — | j                   | j                  z  | _        | j                  | j                  z  | _        | j                  | j                  z  | _        i | _	        | j                  D ���ch c]P  \  }}| j                  j                  || j                  j                  ||f|«      f   j                  D ]  }|||f’Œ	 ŒR c}}}| _        | j                  D ���ch c]4  \  }}| j                   j                  ||f   j                  D ]  }|||f’Œ	 Œ6 c}}}| _        yc c}}}w c c}}}w )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)rV   rY   Úkept_model_keysrW   rZ   Úkept_proxy_keysrX   r[   Úkept_unmanaged_keysÚthrough_usersr   r   Úrenamed_modelsr]   rH   Úold_field_keysr   Únew_field_keys©r   r�   r‚   Ú
field_names       r   rb   z*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Ø˜4×.Ñ.×2Ñ2°I¸zÐ3JÈJÓWÐWñç‰fò
ð ð ˜
 JÒ/ð
Ø/ô
ˆÔð *.×)=Ñ)=÷
ð 
á%�	˜:Ø"Ÿm™m×2Ñ2°9¸jÐ3HÑI×PÑPò
ð ð ˜
 JÒ/ð
Ø/ô
ˆÕùô
ùô
s   Á2AD%Ã!9D,c                 ó¤  — t        | j                  «      D ]¸  \  }}| j                  j                  ||f|«      }| j                  j
                  ||f   }|j                  j                  «       D ]]  \  }}t        |d«      sŒt        |j                  dd«      sŒ+t        |j                  j                  ||«      }|||f| j                  |<   Œ_ Œº y)zThrough model map generation.rE   ÚthroughN)rD   rV   r‰   r]   r   r   rH   r3   r:   ÚgetattrrE   r   r�   rˆ   )r   r�   r‚   Úold_model_nameÚold_model_stater�   rK   Úthrough_keys           r   rc   z1MigrationAutodetector._generate_through_model_mapê   sÙ   € ä%+¨D×,?Ñ,?Ó%@ò 	Ñ!ˆI�zØ!×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð #Ÿo™o×4Ñ4°YÀÐ5NÑOˆOØ%4×%;Ñ%;×%AÑ%AÓ%Cò Ñ!�
˜EÜ˜5 .Õ1´gØ×&Ñ&¨	°4õ7ô #3Ø×*Ñ*×2Ñ2°I¸zó#�Kð "Ø&Ø"ð7�D×&Ñ& {Ò3ññ	r&   c                 ó˜   — | d   dk7  r| dfS t        t        | d   «      j                  d«      \  }}||j                  «       f| dd z   dfS )	zp
        Return the resolved dependency and a boolean denoting whether or not
        it was swappable.
        r   Ú__setting__Fr.   ú.rB   NT)r�   r   ÚsplitÚlower)Ú
dependencyÚresolved_app_labelÚresolved_object_names      r   Ú_resolve_dependencyz)MigrationAutodetector._resolve_dependencyþ   sh   € ð �a‰=˜MÒ)Ø˜uÐ$Ð$Ü3:Ü�j ‘mó4
ç
‰%�‹*ñ 	1ÐÐ0ð #Ð$8×$>Ñ$>Ó$@ÐAÀJÈqÈrÀNÑRÐTXÐXÐXr&   c           
      ó*  — i | _         t        d„ | j                  j                  «       D «       «      }d}|�rÝt	        | j                  «      D �]q  }g }t        «       }t        | j                  |   «      D �]p  }d}t        «       }	|j                  D �]  }
|
}| j                  |
«      \  }
}|
d   |k7  sŒ#| j                  j                  |
d   g «      D ]  }| j                  ||
«      sŒd} n |s n¾|r|	j                  |d   |d   f«       Œ}|
d   | j                   v r4|	j                  |
d   | j                   |
d      d   j                  f«       ŒÂ|rV|r<|j                  |
d   «      r(|	j                  |j                  |
d   «      d   «       �Œ|	j                  |
d   df«       �Œd}�Œ |r4|j                  |«       |j                  |	«       | j                  |   d= �Œq n |s|s�Œ¢| j                  |   r|r t!        dt"        fg g d	œ«      } |d
t%        | j                   j                  |g «      «      dz   z  |«      }t        |«      |_        ||_        || j*                  v|_        | j                   j/                  |g «      j                  |«       d}�ŒS|| j                  |   z   | j                  |<   �Œt t        d„ | j                  j                  «       D «       «      }||k(  r|sd}nt1        d| j                  z  «      ‚|}|r�ŒÜyy)ag  
        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   ó2   K  — | ]  }t        |«      –— Œ y ­wr   ©Úlen©r*   Úxs     r   r,   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>  s   è ø€ ÒI ”c˜!—fÑIùó   ‚FTr   r.   éÿÿÿÿÚ	__first__r	   )r   Údependencieszauto_%ic              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   rŸ   r¡   s     r   r,   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>r  s   è ø€ ÒQ¨œc !ŸfÑQùr£   z)Cannot resolve operation dependencies: %rN)r€   ÚsumrQ   ÚvaluesrD   rU   r0   Ú
_auto_depsrœ   r]   Úcheck_dependencyr^   rJ   Ú
leaf_nodesrG   Úupdater9   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~   z+MigrationAutodetector._build_migration_list  sK  € ð ˆŒÜÑI d×&?Ñ&?×&FÑ&FÓ&HÔIÓIˆØˆ	Úô $ D×$=Ñ$=Ó>ó Q�	Ø�Ü"›u�Ü!% d×&?Ñ&?À	Ñ&JÓ!Kó 9�IØ%)�NÜ-0«UÐ*Ø(×3Ñ3ó 0?˜ð
 (+˜Ø04×0HÑ0HÈÓ0MÑ-˜Ð-Ø˜q™6 YÓ.ð 48×3LÑ3L×3PÑ3PØ # A¡¨ó4ò * ð $(×#8Ñ#8¸È#Õ#NØ5: NÙ$)ð*ñ $2Ù %á#3Ø$:×$>Ñ$>Ø)5°a©¸,Àq¹/Ð(Jõ%&ð &)¨¡V¨t¯©Ñ%>Ø$:×$>Ñ$>Ø),¨Q©°·±ÀÀQÁÑ1HÈÑ1L×1QÑ1QÐ(Rõ%&ñ (1ñ ,1°U×5EÑ5EÀcÈ!ÁfÔ5MØ,B×,FÑ,FØ05×0@Ñ0@ÀÀQÁÓ0HÈÑ0Kö-.ð -C×,FÑ,FØ14°Q±¸Ð0Eö-.ð :?ªða0?ñb &ØŸ™ yÔ1Ø$×+Ñ+Ð,BÔCØ ×5Ñ5°iÑ@ÀÒCáðs9ñv  £7Ø×4Ñ4°YÒ?Á9Ü#'Ø'Ü&˜LØ+-¸rÑBó$˜ñ
 $,Ø%¬¨T¯_©_×-@Ñ-@ÀÈBÓ-OÓ)PÐSTÑ)TÑUØ%ó$˜ô 15°\Ó0B˜Ô-Ø.5˜Ô+Ø+4¸D×<NÑ<NÐ+N˜Ô(ØŸ™×2Ñ2°9¸bÓA×HÑHÈÔRØ$)š	ð $ d×&?Ñ&?À	Ñ&JÑJð ×1Ñ1°)Ó<ð_Qôd ÑQ¨d×.GÑ.G×.NÑ.NÓ.PÔQÓQˆKØ˜gÒ%Ù Ø $‘Iä$ØCØ×3Ñ3ñ4óð ð "ˆGõE r&   c                 ó„  ‡ ‡— t        ‰ j                  j                  «       «      D ]˜  \  }}t        «       }|D ]^  }|j	                  |«       |j
                  D ]<  Š‰ j                  ‰«      d   Š‰d   |k7  rŒ  |j                  |gˆˆ fd„|D «       ¢­Ž  Œ> Œ` t        |j                  «       «      ‰ j                  |<   Œš y)z{
        Reorder to make things possible. Reordering may be needed so FKs work
        nicely inside the same app.
        r   c              3   óH   •K  — | ]  }‰j                  |‰«      sŒ|–— Œ y ­wr   )r«   )r*   r¢   r·   r   s     €€r   r,   z9MigrationAutodetector._sort_migrations.<locals>.<genexpr>Œ  s    øè ø€ Ò Q q°4×3HÑ3HÈÈCÕ3P¤Ñ Qùs   ƒ"›"N)	rD   rQ   r3   r   r^   rª   rœ   r0   Ústatic_order)r   r�   ÚopsÚtsÚopr·   s   `    @r   r}   z&MigrationAutodetector._sort_migrations}  sÄ   ù€ ô
 % T×%>Ñ%>×%DÑ%DÓ%FÓGò 	K‰NˆI�sÜ"Ó$ˆBØò S�Ø—‘�r”
ØŸ=™=ò S�Cð ×2Ñ2°3Ó7¸Ñ:�CØ˜1‘v Ò*Ø Ø�B—F‘F˜2ÐRÔ Q¨CÔ QÔRñSðSô 48¸¿¹Ó8IÓ3JˆD×%Ñ% iÒ0ñ	Kr&   c                 óú  — | j                   j                  «       D ]C  \  }}t        ||dd  «      D ],  \  }}|j                  j	                  ||j
                  f«       Œ. ŒE | j                   j                  «       D ],  }|D ]%  }t        t        |j                  «      «      |_        Œ' Œ. | j                   j                  «       D ]5  \  }}|D ]+  }t        «       j                  |j                  |«      |_        Œ- Œ7 y )Nr.   )r€   r3   Úzipr¦   rG   rJ   r©   r0   rU   r   Úoptimizer   )r   r�   r€   Úm1Úm2Ú	migrations         r   r   z*MigrationAutodetector._optimize_migrations�  sú   € à%)§_¡_×%:Ñ%:Ó%<ò 	=Ñ!ˆI�zÜ˜j¨*°Q°R¨.Ó9ò =‘��BØ—‘×&Ñ&¨	°2·7±7Ð';Õ<ñ=ð	=ð
 Ÿ/™/×0Ñ0Ó2ò 	KˆJØ'ò K�	Ü)-¬c°)×2HÑ2HÓ.IÓ)J�	Õ&ñKð	Kð
 &*§_¡_×%:Ñ%:Ó%<ò 	Ñ!ˆI�zØ'ò �	Ü'9Ó';×'DÑ'DØ×(Ñ(¨)ó(�	Õ$ññ	r&   c                 ó&  ‡— ‰d   €C‰d   du r<t        |t        j                  «      xr  |j                  ‰d   j	                  «       k(  S ‰d   �Ã‰d   du r¼t        |t        j                  «      xr@ |j                  ‰d   j	                  «       k(  xr t        ˆfd„|j                  D «       «      xs^ t        |t        j                  «      xrB |j                  ‰d   j	                  «       k(  xr  |j                  ‰d   j	                  «       k(  S ‰d   �e‰d   du r^t        |t        j                  «      xrB |j                  ‰d   j	                  «       k(  xr  |j                  ‰d   j	                  «       k(  S ‰d   €C‰d   du r<t        |t        j                  «      xr  |j                  ‰d   j	                  «       k(  S ‰d   �f‰d   dk(  r^t        |t        j                  «      xrB |j                  ‰d   j	                  «       k(  xr  |j                  ‰d   j	                  «       k(  S ‰d   �x‰d   dk(  rpt        |t        j                  «      xrT |j                  ‰d   j	                  «       k(  xr2 |j                  xs d	j	                  «       ‰d   j	                  «       k7  S ‰d   �T‰d   d
k(  rLt        |t        j                  t        j                  f«      xr  |j                  ‰d   j	                  «       k(  S t!        d‰›�«      ‚)zn
        Return True if the given operation depends on the given dependency,
        False otherwise.
        rB   é   Tr.   c              3   ó4   •K  — | ]  \  }}‰d    |k(  –— Œ y­w)rB   N© )r*   r¢   Úyr™   s      €r   r,   z9MigrationAutodetector.check_dependency.<locals>.<genexpr>±  s   øè ø€ ÒH©t¨q°!˜
 1™¨Õ*ÑHùs   ƒFÚalterÚorder_wrt_unsetÚ Úfoo_together_changezCan't handle dependency )r/   r   ÚCreateModelÚ
name_lowerr˜   ÚanyrH   ÚAddFieldÚmodel_name_lowerÚRemoveFieldÚDeleteModelÚ
AlterFieldÚAlterOrderWithRespectToÚorder_with_respect_toÚAlterUniqueTogetherÚAlterIndexTogetherr°   )r   r´   r™   s     `r   r«   z&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                 óÎ   — |xs g |_         |r-| j                  j                  |g «      j                  d|«       y | j                  j                  |g «      j	                  |«       y )Nr   )rª   rQ   r¯   ÚinsertrG   )r   r�   r´   r¦   Ú	beginnings        r   Úadd_operationz#MigrationAutodetector.add_operationà  sX   € ð  ,Ò1¨rˆ	ÔÙØ×%Ñ%×0Ñ0°¸BÓ?×FÑFÀqÈ)ÕTà×%Ñ%×0Ñ0°¸BÓ?×FÑFÀyÕQr&   c                 ó®  — 	 | j                   j                  |   }|j                  D �ch c]   }t        |t        «      r|n|j
                  ’Œ" }}|d   ›d|d   ›�}|j                  j                  d«      s7d|v s3d|v s/t        j                  j                  «       |j                  «       k(  rd|d   z   d|d   z   fS 	 |S c c}w # t        $ r Y |S w xY w)z|
        Place potential swappable models first in lists of created models (only
        real way to solve #22783).
        r   r–   r.   Ú	swappableÚAbstractUserÚAbstractBaseUserÚ___)r   r   Úbasesr/   ÚstrÚ__name__r\   r]   r   ÚAUTH_USER_MODELr˜   ÚLookupError)r   Úitemrƒ   ÚbaseÚ
base_namesÚstring_versions         r   Úswappable_first_keyz)MigrationAutodetector.swappable_first_keyé  sð   € ð
	ØŸ-™-×.Ñ.¨tÑ4ˆKð (×-Ñ-öàô # 4¬Ô-‘°4·=±=Ñ@ðˆJð ð )-¨Q«°°a²Ð9ˆNà×#Ñ#×'Ñ'¨Ô4Ø! ZÑ/Ø%¨Ñ3Ü×+Ñ+×1Ñ1Ó3°~×7KÑ7KÓ7MÒMà  Q¡™¨°°a±©Ð9Ð9ð Nð
 ˆùòøô ò 	ØØˆð	ús#   ‚'C ©%CÁA0C ÃC Ã	CÃCc                 ó  — i | _         i | _        | j                  | j                  z
  }t	        |«      D �]K  \  }}| j
                  j                  ||f   }| j                  |j                  «      }| j                  | j                  z
  }|D �]ð  \  }}||k(  sŒ| j                  j                  ||f   }	| j                  |	j                  «      }
||
k(  sŒI| j                  j                  |	|«      sŒfg }t        |j                  j                  «       «      | j
                  j                  ||f   j                  «       D ��cg c]#  }|j                  «       D ]  }|j                  ‘Œ Œ% c}}z   }|D ]<  }|j                   sŒ|j#                  | j%                  |||| j
                  «      «       Œ> | j'                  |t)        j*                  |	j,                  |j,                  ¬«      |¬«       || j                   ||f<   |	j.                  ›d|	j0                  ›�}|j.                  ›d|j0                  ›�| j                  |<   | j                  j3                  ||f«       | j                  j5                  ||f«        �ŒK �ŒN yc c}}w )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_relrY   rV   rD   r   r   rM   rH   r   r   Úask_rename_modelr0   r©   Ú	relationsrE   Úis_relationÚextendÚ!_get_dependencies_for_foreign_keyrâ   r   ÚRenameModelrJ   r�   rÔ   Úremover^   )r   Úadded_modelsr�   r‚   rƒ   Úmodel_fields_defÚremoved_modelsÚrem_app_labelÚrem_model_nameÚrem_model_stateÚrem_model_fields_defr¦   rø   rK   rH   Úrenamed_models_rel_keys                   r   ra   z-MigrationAutodetector.generate_renamed_models   s¢  € ð !ˆÔØ"$ˆÔØ×*Ñ*¨T×-@Ñ-@Ñ@ˆÜ%+¨LÓ%9ó 8	"Ñ!ˆI�zØŸ-™-×.Ñ.¨y¸*Ð/DÑEˆKØ#×AÑAÀ+×BTÑBTÓUÐà!×0Ñ0°4×3FÑ3FÑFˆNØ1?ó 3"Ñ-�˜~Ø  IÓ-Ø&*§o¡o×&<Ñ&<Ø% ~Ð5ñ'�Oð ,0×+MÑ+MØ'×.Ñ.ó,Ð(ð (Ð+?Ó?ØŸ?™?×;Ñ;Ø+¨[õð ,.˜LÜ%)¨+×*<Ñ*<×*CÑ*CÓ*EÓ%Fà15·±×1HÑ1HØ$-¨zÐ$9ñ2"ç"(¡&£(÷	Jà$-ð .7×-=Ñ-=Ó-?òJð
 %*ð	 !&× 2Ó 2ðJØ 2óJñ &˜Fð *0ò 	& Ø#(×#4Ó#4Ø$0×$7Ñ$7Ø(,×(NÑ(NØ,5Ø,6Ø,1Ø,0¯M©Mó	)*õ%&ð	&ð !×.Ñ.Ø )Ü *× 6Ñ 6Ø-<×-AÑ-AØ-8×-=Ñ-=ô!"ð .:ð /ô ð JX˜D×/Ñ/°	¸:Ð0EÑFà /× 9Ó 9Ø /× :Ò :ð6Ð2ð !,× 5Ó 5Ø +× 6Ò 6ð!ð !×3Ñ3Ø 6ñð !×/Ñ/×6Ñ6¸À~Ð7VÔWØ ×/Ñ/×3Ñ3°YÀ
Ð4KÔLÚ!òg3"ñ8	"ùó$Js   Å(Jc                 ó
  — | j                   | j                  z  }| j                  |z
  }| j                  |z
  }t	        t        || j                  d¬«      t        || j                  d¬«      «      }|D �]„  \  }}| j                  j                  ||f   }i }d}	|j                  j                  «       D ]ƒ  \  }
}|j                  sŒ|j                  j                  r>|j                  r|j                  j                  }	n|j                  j                  s|||
<   t        |j                  dd«      sŒ|||
<   Œ… |j                   j#                  d«      }|j                   j#                  d«      }|j                   j#                  dd«      }|j                   j#                  dd«      }|j                   j#                  d	d«      }||dd
fg}|j$                  D ]ù  }t'        |t(        «      sŒd|v sŒ|j+                  dd«      \  }}|j-                  ||ddf«       | j.                  j                  j1                  ||f«      }| j                  j                  j1                  ||f«      }|sŒ”|sŒ—t3        |j                  «      j5                  |j                  «      j7                  |j                  «      }|D ]  }|j-                  |||d
f«       Œ Œû |	r|j-                  t9        |	||«      dz   «       | j;                  |t=        j>                  |j@                  |j                  j                  «       D �cg c]  }|d   |vr|‘Œ c}|j                   |j$                  |jB                  ¬«      |d¬«       |j                   j1                  dd«      s�Œ t        |j                  «       «      D ]t  \  }}| jE                  |||| j                  «      }|j-                  ||ddf«       | j;                  |t=        jF                  |||¬«      tI        t3        |«      «      ¬«       Œv |r3| j;                  |t=        jJ                  ||¬«      |||df||ddfg¬«       t        |«      D �cg c]  }|||df‘Œ
 }}|j-                  ||ddf«       |D ]+  }| j;                  |t=        jL                  ||¬«      |¬«       Œ- |D ]+  }| j;                  |t=        jN                  ||¬«      |¬«       Œ- |r)| j;                  |t=        jP                  ||¬«      |¬«       |r)| j;                  |t=        jR                  ||¬«      |¬«       | j                  jT                  }||f| jV                  v s�Œô|||f   j                  «       D ]y  \  }}| j                  j                  |   } |j                  «       D ]H  \  }!}"| j;                  | jX                  t=        jZ                  | j@                  |!|"¬«      ||ddfg¬«       ŒJ Œ{ �Œ‡ yc c}w c c}w )a‚  
        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)r=   ÚreverseNr�   ÚindexesÚconstraintsÚunique_togetherÚindex_togetherrÜ   Fr–   r.   )NTr   ©rJ   rH   r\   rè   Úmanagers)r¦   rá   rO   ©r‚   rJ   rK   rõ   ©rJ   rÜ   ©r‚   Úindex©r‚   Ú
constraint©rJ   r
  ©rJ   r  ).rV   rX   rY   r[   r   rD   rñ   r   r   rH   r3   rE   r   Úprimary_keyÚparent_linkr�   r\   rF   rè   r/   ré   r—   rG   r   r]   rU   Ú
differenceÚintersectionr   râ   r   rÓ   rJ   r  rû   rÖ   r0   rÛ   ÚAddIndexÚAddConstraintrÝ   rÞ   rø   rW   r�   rÚ   )#r   Úold_keysrþ   Úadded_unmanaged_modelsÚall_added_modelsr�   r‚   rƒ   Úrelated_fieldsÚprimary_key_relr�   rK   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ÚdrJ   Úrelated_dependenciesr  r  rø   Úrelated_model_keyÚrelated_model_stateÚrelated_field_nameÚrelated_fields#                                      r   re   z-MigrationAutodetector.generate_created_modelsC  sŒ  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×*Ñ*¨XÑ5ˆØ!%×!8Ñ!8¸8Ñ!CÐÜ Ü�< T×%=Ñ%=ÀtÔLÜÐ)¨t×/GÑ/GÐQUÔVó
Ðð &6ó p	Ñ!ˆI�zØŸ-™-×.Ñ.¨y¸*Ð/DÑEˆKàˆNØ"ˆOØ%0×%7Ñ%7×%=Ñ%=Ó%?ò ;Ñ!�
˜EØ×%Ó%Ø×)Ñ)×/Ò/Ø ×,Ò,Ø.3×.@Ñ.@×.FÑ.F™OØ!&×!3Ñ!3×!?Ò!?Ø9>˜N¨:Ñ6Ü˜u×1Ñ1°9¸dÕ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×$;Ñ$;Ø'¨ó%Ð!ð
 ˜J¨¨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äÐ 4× ;Ñ ;Ó<ß'™ZØ 4× ;Ñ ;ó÷ *™\¨+×*<Ñ*<Ó=ð ,ð 3Fò Ð.Ø(×/Ñ/Ø!/°Ð<NÐPUÐ Võñð)ñ2 Ø×#Ñ#Ü$Ø'Ø!Ø"óð
 #ñ#ôð ×ÑØÜ×&Ñ&Ø$×)Ñ)ð "-×!3Ñ!3×!9Ñ!9Ó!;öàØ˜Q™4 ~Ñ5ò òð
 (×/Ñ/Ø%×+Ñ+Ø(×1Ñ1ô
ð *Øð ô ð$ ×&Ñ&×*Ñ*¨9°dÔ;Ùô  & n×&:Ñ&:Ó&<Ó=ò ‘��eØ#×EÑEØØØØ—M‘Mó	 �ð ×#Ñ# Y°
¸DÀ$Ð$GÔHà×"Ñ"ØÜ×'Ñ'Ø#-Ø!Ø#ôô
 "&¤c¨,Ó&7Ó!8ð #õ ðñ( %Ø×"Ñ"ØÜ×6Ñ6Ø'Ø.Côð
 # JÐ0EÀtÐLØ" J°°dÐ;ð"ð #ô 
ô AGÀ~Ó@Vö$Ø8<�˜J¨¨dÒ3ð$Ð ð $ð !×'Ñ'¨°JÀÀdÐ(KÔLØ ò �Ø×"Ñ"ØÜ×'Ñ'Ø#-Ø#ôð "6ð #õ ðð *ò �
Ø×"Ñ"ØÜ×,Ñ,Ø#-Ø#-ôð "6ð #õ ðñ Ø×"Ñ"ØÜ×2Ñ2Ø'Ø(7ôð "6ð #ô ñ Ø×"Ñ"ØÜ×1Ñ1Ø'Ø'5ôð "6ð #ô ð Ÿ™×/Ñ/ˆIØ˜:Ð&¨$×*=Ñ*=Ó=Ø9BØ˜zÐ)ñ:ç‘%“'òÑ5Ð% ~ð +/¯-©-×*>Ñ*>Ð?PÑ*QÐ'Ø=K×=QÑ=QÓ=Sò 	Ñ9Ð*¨MØ×*Ñ*Ø/×9Ñ9Ü&×1Ñ1Ø+>×+CÑ+CØ%7Ø&3ôð
 ,5°jÀ$ÈÐ*MÐ)Nð +õ ñ	ò	ñGp	ùòHùòd$s   Ì4W;Ñ$X c                 ó$  — | j                   | j                  z
  }t        |«      D ]é  \  }}| j                  j                  ||f   }|j
                  j                  d«      sJ ‚||ddfg}|j                  D ]B  }t        |t        «      sŒd|v sŒ|j                  dd«      \  }}|j                  ||ddf«       ŒD | j                  |t        j                  |j                  g |j
                  |j                  |j                   ¬«      |¬«       Œë y)	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.
        rP   NFr–   r.   Tr  rõ   )rZ   rW   rD   r   r   r\   r]   rè   r/   ré   r—   rG   râ   r   rÓ   rJ   r  )	r   Úaddedr�   r‚   rƒ   r¦   rî   r!  r"  s	            r   rg   z.MigrationAutodetector.generate_created_proxies  s  € ð ×#Ñ# d×&9Ñ&9Ñ9ˆÜ%+¨E£]ò 	Ñ!ˆI�zØŸ-™-×.Ñ.¨y¸*Ð/DÑEˆKØ×&Ñ&×*Ñ*¨7Ô3Ñ3ð ˜J¨¨eÐ4ðˆLð $×)Ñ)ò Q�Ü˜d¤CÕ(¨S°Dª[Ø04·
±
¸3ÀÓ0BÑ-�N IØ ×'Ñ'¨¸ÀDÈ$Ð(OÕPðQð
 ×ÑØÜ×&Ñ&Ø$×)Ñ)ØØ'×/Ñ/Ø%×+Ñ+Ø(×1Ñ1ôð *ð õ ñ	r&   c           
      ó¾  — | j                   | j                  z  }| j                  |z
  }| j                  |z
  }t	        t        |«      t        |«      «      }|D �]‚  \  }}| j                  j                  ||f   }i }|j                  j                  «       D ]J  \  }	}
|
j                  sŒ|
j                  j                  r|
||	<   t        |
j                  dd«      sŒF|
||	<   ŒL |j                  j                  dd«      }|j                  j                  dd«      }|r'| j                  |t!        j"                  |d¬«      «       |r'| j                  |t!        j$                  |d¬«      «       t        |«      D ])  }| j                  |t!        j&                  ||¬«      «       Œ+ g }| j                  j(                  }|||f   j                  «       D ]W  \  \  }}}|j                  «       D ]<  \  }	}
|j+                  |||	df«       |
j,                  rŒ(|j+                  |||	d	f«       Œ> ŒY t        |«      D ]  }|j+                  |||df«       Œ | j.                  j1                  ||j2                  f«      }|r|j+                  |d
   |d   |d   df«       | j                  |t!        j4                  |j6                  ¬«      t9        t;        |«      «      ¬«       �Œ… y)a†  
        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‚   rJ   FrÏ   r   r.   rB   ©rJ   rõ   )rY   r[   rV   rX   r   rD   r   r   rH   r3   rE   r   r�   r\   rF   râ   r   rÝ   rÞ   rØ   rø   rG   Úmany_to_manyrˆ   r]   rÔ   rÙ   rJ   r0   rU   )r   Únew_keysÚdeleted_modelsÚdeleted_unmanaged_modelsÚall_deleted_modelsr�   r‚   rƒ   r  r�   rK   r
  r  rJ   r¦   rø   Úrelated_object_app_labelÚobject_nameÚrelation_related_fieldsÚthrough_users                       r   rd   z-MigrationAutodetector.generate_deleted_models'  s  € ð ×&Ñ&¨×)@Ñ)@Ñ@ˆØ×,Ñ,¨xÑ7ˆØ#'×#:Ñ#:¸XÑ#EÐ Ü"Ü�>Ó"¤FÐ+CÓ$Dó
Ðð &8ó O	Ñ!ˆI�zØŸ/™/×0Ñ0°¸JÐ1FÑGˆKàˆNØ%0×%7Ñ%7×%=Ñ%=Ó%?ò ;Ñ!�
˜EØ×%Ó%Ø×)Ñ)×/Ò/Ø5:˜ zÑ2Ü˜u×1Ñ1°9¸dÕ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°I¸zÐ4IÑ*J×*PÑ*PÓ*Ròñ 'ñ Ø(ØØ&Ø)@×)FÑ)FÓ)Hò Ñ%�J Ø ×'Ñ'Ø1°;À
ÈEÐRôð !×-Ó-Ø$×+Ñ+à 8Ø +Ø *Ø 'ð	õñð	ô$ ˜~Ó.ò J�Ø×#Ñ# Y°
¸DÀ%Ð$HÕIðJð  ×-Ñ-×1Ñ1°9¸k×>TÑ>TÐ2UÓVˆLÙØ×#Ñ#Ø! !‘_ l°1¡o°|ÀA±ÈÐNôð ×ÑØÜ×&Ñ&Ø$×)Ñ)ôô "¤# lÓ"3Ó4ð ö ñSO	r&   c                 ó,  — | j                   | j                  z
  }t        |«      D ]m  \  }}| j                  j                  ||f   }|j
                  j                  d«      sJ ‚| j                  |t        j                  |j                  ¬«      «       Œo y)z*Make DeleteModel options for proxy models.rP   r1  N)rW   rZ   rD   r   r   r\   r]   râ   r   rÙ   rJ   )r   Údeletedr�   r‚   rƒ   s        r   rf   z.MigrationAutodetector.generate_deleted_proxiesˆ  sˆ   € à×%Ñ%¨×(;Ñ(;Ñ;ˆÜ%+¨G£_ò 	Ñ!ˆI�zØŸ/™/×0Ñ0°¸JÐ1FÑGˆKØ×&Ñ&×*Ñ*¨7Ô3Ñ3Ø×ÑØÜ×&Ñ&Ø$×)Ñ)ôõñ	r&   c                 óh  — g | _         | j                  j                  «       }t        | j                  |z
  «      D �]õ  \  }}}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |«      }| j                  |«      }	t        || j                  z
  «      D �]\  \  }
}}|
|k(  sŒ||k(  sŒ|j                  |«      }| j                  |«      }|j                  rH|j                  j                  r2d|d   v r+|d   d   }|| j                  v r| j                  |   |d   d<   |j                  |«       |j!                  «       d   }||	k(  s#|dd |	dd k(  sŒ¿t#        |d   |¬«      |	d   k(  sŒÖ| j$                  j'                  ||||«      sŒõ| j                   j)                  |
||j*                  |||||f«       |j-                  |
||f«       |j/                  |||f«       || j0                  |||f<    �Œõ �Œø y)zWork out renamed fields.rC   rB   r.   r   )Ú	db_columnN)Úrenamed_operationsrŠ   ÚcopyrD   r‹   r‰   r]   r   r   r   Ú	get_fieldr)   rE   r   rö   Úset_attributes_from_nameÚget_attname_columnr2   r   Ú
ask_renamerG   r>  rý   r^   rT   )r   rŠ   r�   r‚   r�   r‘   r’   Únew_model_staterK   Ú	field_decr  r  Úrem_field_nameÚ	old_fieldÚold_field_decÚ
old_rel_toÚold_db_columns                    r   rk   z+MigrationAutodetector.create_renamed_fields•  s{  € à"$ˆÔØ×,Ñ,×1Ñ1Ó3ˆÜ17Ø×Ñ .Ñ0ó2
ó 8	"Ñ-ˆ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Ø#×-Ñ-¨jÓ9ˆEà×-Ñ-¨eÓ4ˆIÜAGØ ×!4Ñ!4Ñ4óBó -"Ñ=�˜~¨~ð ! IÓ-°.ÀJÓ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Ø&¨¸
ÀEõð !×3Ñ3×:Ñ:à$1Ø$2Ø$-×$7Ñ$7Ø$2Ø$-Ø$.Ø$)Ø$.ð	!"ôð +×1Ñ1Ø!.°ÀÐ Oôð +×.Ñ.°	¸:ÀzÐ/RÔSð !/ð !×/Ñ/Ø )¨:°zÐ Añò "ò[-"ñ8	"r&   c           	      óœ  — | j                   D ]½  \  }}}}}}}}||j                  k7  r?|j                  «       }	||	_        | j	                  |t        j                  |||	¬«      «       | j	                  |t        j                  |||¬«      «       | j                  j                  |||f«       | j                  j                  |||f«       Œ¿ y)z Generate RenameField operations.r  )r‚   ró   rô   N)r?  r>  ÚclonerJ   râ   r   rÚ   ÚRenameFieldrŠ   rý   r^   )
r   r  r  Úrem_db_columnrG  r�   r‚   rK   r�   Úaltered_fields
             r   rp   z-MigrationAutodetector.generate_renamed_fieldsÓ  sâ   € ð ×$Ñ$ò!	Iñ 	
ØØØØØØØØð
  §¡Ò/Ø %§¡£�Ø%3�Ô"Ø×"Ñ"ØÜ×)Ñ)Ø#-Ø+Ø+ôôð ×ÑØÜ×&Ñ&Ø)Ø+Ø'ôôð ×Ñ×&Ñ&¨°~À~Ð'VÔWØ×Ñ×#Ñ# Y°
¸JÐ$GÕHñC!	Ir&   c                 ó€   — t        | j                  | j                  z
  «      D ]  \  }}}| j                  |||«       Œ y)zMake AddField operations.N)rD   r‹   rŠ   Ú_generate_added_fieldrŒ   s       r   ru   z+MigrationAutodetector.generate_added_fieldsø  sG   € ä17Ø×Ñ $×"5Ñ"5Ñ5ó2
ò 	JÑ-ˆI�z :ð ×&Ñ& y°*¸jÕIñ	Jr&   c           	      óH  — | j                   j                  ||f   j                  |«      }|||dfg}|j                  rC|j                  j                  r-|j                  | j                  |||| j                   «      «       t        j                  t        j                  t        j                  f}|j                  xst |j                  «       xsb |j                  t        j                  uxsD |j                  xs6 |j                  xr |j                   xs t#        ||«      xr |j$                  }|sk|j'                  «       }t#        ||«      r.|j(                  r"| j*                  j-                  ||«      |_        n!| j*                  j1                  ||«      |_        |j2                  rM|j.                  t        j                  ur1t5        |j.                  «      r| j*                  j7                  ||«       | j9                  |t;        j<                  ||||¬«      |¬«       y )NF©r‚   rJ   rK   Úpreserve_defaultrõ   )r   r   rA  rE   r   rú   rû   Ú	DateFieldÚDateTimeFieldÚ	TimeFieldÚnullÚhas_defaultÚ
db_defaultÚNOT_PROVIDEDr2  ÚblankÚempty_strings_allowedr/   Úauto_nowrM  Úauto_now_addr   Úask_auto_now_add_additionÚdefaultÚask_not_null_additionÚuniqueÚcallableÚ$ask_unique_callable_default_additionrâ   r   rÖ   )r   r�   r‚   r�   rK   r¦   Útime_fieldsrU  s           r   rR  z+MigrationAutodetector._generate_added_fieldÿ  sâ  € Ø—‘×$Ñ$ Y°
Ð%:Ñ;×EÑEÀjÓQˆà" J°
¸EÐBÐCˆà×Ò %×"4Ñ"4×":Ò":Ø×ÑØ×6Ñ6ØØØØ—M‘Mó	ôô ×'Ñ'¬×)=Ñ)=¼v×?OÑ?OÐPˆà�J‰Jò CØ× Ñ Ó"òCà×Ñ¤v×':Ñ':Ð:òCð ×!Ñ!òCð —‘Ò; × ;Ñ ;ò	Cô
 ˜5 +Ó.ÒA°5·>±>ð 	ñ  Ø—K‘K“MˆEÜ˜% Ô-°%×2DÒ2DØ $§¡× IÑ IØ 
ó!�•ð !%§¡× EÑ EØ 
ó!�”ð �LŠLØ—‘¤V×%8Ñ%8Ñ8Ü˜Ÿ™Ô'à�O‰O×@Ñ@ÀÈZÔXØ×ÑØÜ×ÑØ%ØØØ!1ô	ð &ð 	õ 		
r&   c                 ó€   — t        | j                  | j                  z
  «      D ]  \  }}}| j                  |||«       Œ y)zMake RemoveField operations.N)rD   rŠ   r‹   Ú_generate_removed_fieldrŒ   s       r   rt   z-MigrationAutodetector.generate_removed_fields3  sG   € ä17Ø×Ñ $×"5Ñ"5Ñ5ó2
ò 	LÑ-ˆI�z :ð ×(Ñ(¨°JÀ
ÕKñ	Lr&   c           	      ój   — | j                  |t        j                  ||¬«      |||df|||dfg¬«       y )Nr0  rÐ   rÒ   rõ   )râ   r   rØ   rŒ   s       r   ri  z-MigrationAutodetector._generate_removed_field:  sM   € Ø×ÑØÜ×"Ñ"Ø%Øôð ˜J¨
Ð4EÐFØ˜J¨
Ð4IÐJðð 	õ 	
r&   c           
      ó	  — t        | j                  | j                  z  «      D �]U  \  }}}| j                  j	                  ||f|«      }| j
                  j	                  |||f|«      }| j                  j                  ||f   j                  |«      }| j                  j                  ||f   j                  |«      }g }t        |d«      �rÞt        |j                  dd«      �rÆt        |j                  j                  ||«      }	|	| j                  v r%|j                  j                  |j                  _        t        |j                  dd«      }
|
r^|	|
fz   }|| j
                  v rJ|j                  j                  |j                  _        |j                  j                  |j                  _        t        |dd«      }|r¿||f}t!        |D �cg c]"  }| j
                  j	                  ||fz   |«      ‘Œ$ c}«      |_        t!        |j$                  D �cg c]"  }| j
                  j	                  |	|fz   |«      ‘Œ$ c}«      |_        t        |dd«      x}r*t!        |«      |_        t!        |j$                  «      |_        |j'                  | j)                  |||| j                  «      «       t        |d«      rkt        |j                  dd«      rTt        |j                  j*                  ||«      }	|	| j                  v r%|j                  j*                  |j                  _        | j-                  |«      }| j-                  |«      }||k7  s�Œ&||k(  s�Œ-|j.                  xr |j.                  }|j.                   xr |j.                   }|s|rÉd}|j0                  rŒ|j0                  s€|j3                  «       sp|j4                  t        j6                  u rT|j.                  sH|j9                  «       }| j:                  j=                  ||«      }|t        j6                  ur||_        d}n|}| jA                  |tC        jD                  ||||¬	«      |¬
«       �Œ0| jG                  |||«       | jI                  |||«       �ŒX yc c}w c c}w )zp
        Make AlterField operations, or possibly RemovedField/AddField if alter
        isn't possible.
        rE   r   Nr�   Úfrom_fieldsr�   TFrT  rõ   )%rD   rŠ   r‹   r‰   r]   rT   r   r   rA  r   r:   r�   rE   r   r   r�   r1   rl  Ú	to_fieldsrú   rû   r�   r)   r2  rY  rZ  r[  r\  rM  r   Úask_not_null_alterationrb  râ   r   rÚ   ri  rR  )r   r�   r‚   r�   r‘   Úold_field_namerH  Ú	new_fieldr¦   Ú
rename_keyÚremote_field_nameÚto_field_rename_keyrl  Úfrom_rename_keyÚ
from_fieldÚto_fieldÚold_from_fieldsrI  Únew_field_decÚboth_m2mÚneither_m2mrU  rK   Únew_defaults                           r   rv   z-MigrationAutodetector.generate_altered_fieldsJ  su  € ô
 28Ø×Ñ $×"5Ñ"5Ñ5ó2
ó t	RÑ-ˆI�z :ð "×0Ñ0×4Ñ4Ø˜JÐ'¨óˆNð "×0Ñ0×4Ñ4Ø˜J¨
Ð3°ZóˆNð Ÿ™×.Ñ.¨y¸.Ð/HÑI×SÑSØóˆIð Ÿ™×,Ñ,¨Y¸
Ð-BÑC×MÑMØóˆIð ˆLô �y .Õ1´gØ×&Ñ&¨°õ7ô .Ø×*Ñ*×0Ñ0°)¸Zó�
ð  ×!4Ñ!4Ñ4Ø3<×3IÑ3I×3OÑ3O�I×*Ñ*Ô0ä$+¨I×,BÑ,BÀLÐRVÓ$WÐ!Ù$Ø*4Ð8IÐ7KÑ*KÐ'Ø*¨d×.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Ô'ô +2°)¸]ÈDÓ*QÐQ�ÐQÜ05°oÓ0F˜	Ô-Ü.3°I×4GÑ4GÓ.H˜	Ô+Ø×#Ñ#Ø×:Ñ:Ø!Ø"Ø!ØŸ™ó	ôô �y .Ô1´gØ×&Ñ&¨	°4ô7ô .Ø×*Ñ*×2Ñ2°I¸zó�
ð  ×!4Ñ!4Ñ4Ø5>×5KÑ5K×5SÑ5S�I×*Ñ*Ô2Ø ×1Ñ1°)Ó<ˆMØ ×1Ñ1°)Ó<ˆMð  Ô-°.ÀJÔ2NØ$×1Ñ1ÒL°i×6LÑ6L�Ø"+×"8Ñ"8Ð8ÒWÀ×AWÑAWÐ=W�Ù™{à'+Ð$à!ŸšØ )§¢Ø )× 5Ñ 5Ô 7Ø%×0Ñ0´F×4GÑ4GÑGØ )× 6Ò 6à )§¡Ó 1˜Ø&*§o¡o×&MÑ&MØ&¨
ó'˜ð '¬f×.AÑ.AÑAØ,7˜EœMØ/4Ñ,à )˜Ø×&Ñ&Ø!Ü"×-Ñ-Ø'1Ø!+Ø"'Ø-=ô	ð &2ð 'ö 	ð ×0Ñ0°¸JÈ
ÔSØ×.Ñ.¨y¸*ÀjÖQñit	RùòXùòs   Ç
'Q=
È'R
c                 óö  — t         j                  j                  }t        t        «      | _        t        | j                  «      D �]ž  \  }}| j                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |   }|j                  |   }|D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	g }g }g }|
D ]“  }|j                  «       }|d   j                  d«      }|D ]h  }|j                  «       }|d   j                  d«      }||k(  sŒ-||k7  sŒ3|j!                  ||d f«       |j!                  |«       |j!                  |«       Œj Œ• | j#                  t         j$                  j                  «      D ]é  \  }}}}}||k7  s||k7  rŒ|j'                  |«      }|D ]À  }g }|
D ]T  }|j                  «       \  }}}|rŒ|j(                  t	        |«      k(  sŒ3t+        |«      ddhk(  sŒD|j!                  |«       ŒV t-        |«      dk(  sŒm|d   } |j!                  | «       |j!                  d | j.                  |f«       | j
                  ||f   j!                  |«       ŒÂ Œë |
D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	| j0                  j3                  ||f|
||dœi«       �Œ¡ y c c}	w c c}	w c c}	w c c}	w )NrB   rJ   rH   r.   r   )Úadded_indexesÚremoved_indexesÚrenamed_indexes)r   r  Úoption_namer   r0   Úrenamed_index_together_valuesrD   r…   r‰   r]   r   r   r   r\   r-   rF   rG   Ú$_get_altered_foo_together_operationsrÞ   r  rH   rU   r    rJ   rR   r­   )!r   r€  r�   r‚   r‘   r’   rE  Ú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Ú_r7   r@   Úrenamed_indexs!                                    r   rl   z,MigrationAutodetector.create_altered_indexesÅ  ss  € Ü ×)Ñ)×5Ñ5ˆÜ-8¼Ó->ˆÔ*ä%+¨D×,@Ñ,@Ó%Aó S	Ñ!ˆ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à)×1Ñ1°+Ñ>ˆKØ)×1Ñ1°+Ñ>ˆKØ,7ÖR S¸3ÀkÒ;QšSÐRˆMÐRØ.9ÖT s¸SÈÒ=SšsÐTˆ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Õ=ñ
>ð>ð* ×:Ñ:Ü×-Ñ-×9Ñ9óò#9ñ ØØØ(Ø)Øð
 Ð!9Ò9Ø!Ð%>Ò>àØ!*×!5Ñ!5°iÓ!@�Ø.<ò 9Ð*Ø57Ð2Ø%2ò M˜	Ø*3×*?Ñ*?Ó*A™˜˜4 ò !%Ø )× 0Ñ 0´DÐ9OÓ4PÓ PÜ # F£°¸Ð/AÓ Aà:×AÑAÀ)ÕLðMô Ð9Ó:¸aÓ?Ø(FÀqÑ(I˜Ø)×0Ñ0°Ô?Ø'×.Ñ.Ø! =×#5Ñ#5Ð7MÐNôð ×:Ñ:Ø4Ð6OÐOñç ™&Ð!7Õ8ñ)9ð#9ðN  -öØ°Ð;LÒ0L’ðˆMð ð  /öØ°#Ð=PÒ2P’ðˆOð ð × Ñ ×'Ñ'à 
Ð+Ø)6Ø+:Ø+:ñ.ðöñWS	ùò SùÚTùòtùòs0   Ã	K'ÃK'Ã	K,ÃK,Ê	K1Ê&K1Ê0	K6Ê:K6c           	      óØ   — | j                   j                  «       D ]M  \  \  }}}| j                  ||«      }|d   D ]+  }| j                  |t	        j
                  ||¬«      |¬«       Œ- ŒO y )Nr}  r  rõ   )rR   r3   Ú_get_dependencies_for_modelrâ   r   r  )r   r�   r‚   Úalt_indexesr¦   r  s         r   rz   z,MigrationAutodetector.generate_added_indexes  s   € Ø48×4HÑ4H×4NÑ4NÓ4Pò 
	Ñ0Ñ#ˆY˜
 [Ø×;Ñ;¸IÀzÓRˆLØ$ _Ñ5ò �Ø×"Ñ"ØÜ×'Ñ'Ø#-Ø#ôð ".ð #õ ññ
	r&   c           	      óÄ   — | j                   j                  «       D ]C  \  \  }}}|d   D ]3  }| j                  |t        j                  ||j
                  ¬«      «       Œ5 ŒE y )Nr~  r0  )rR   r3   râ   r   ÚRemoveIndexrJ   )r   r�   r‚   r™  r  s        r   ro   z.MigrationAutodetector.generate_removed_indexes+  sh   € Ø48×4HÑ4H×4NÑ4NÓ4Pò 	Ñ0Ñ#ˆY˜
 [Ø$Ð%6Ñ7ò �Ø×"Ñ"ØÜ×*Ñ*Ø#-Ø"ŸZ™Zôõññ	r&   c                 ó¼   — | j                   j                  «       D ]?  \  \  }}}|d   D ]/  \  }}}| j                  |t        j                  ||||¬«      «       Œ1 ŒA y )Nr  )r‚   rô   ró   Ú
old_fields)rR   r3   râ   r   ÚRenameIndex)r   r�   r‚   r™  r�  rŠ  r�  s          r   rq   z.MigrationAutodetector.generate_renamed_indexes6  su   € Ø48×4HÑ4H×4NÑ4NÓ4Pò 	Ñ0Ñ#ˆY˜
 [Ø>IØ!ñ?ò Ñ:� °
ð ×"Ñ"ØÜ×*Ñ*Ø#-Ø!/Ø!/Ø#-ô	õññ	r&   c                 óþ  — t         j                  j                  }t        | j                  «      D ]Á  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  |   }|j                  |   }|D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	| j                  j                  ||f|
|dœi«       ŒÃ y c c}	w c c}	w )N)Úadded_constraintsÚremoved_constraints)r   r  r€  rD   r…   r‰   r]   r   r   r   r\   rS   r­   )r   r€  r�   r‚   r‘   r’   rE  Úold_constraintsÚnew_constraintsÚcÚadd_constraintsÚrem_constraintss               r   rm   z0MigrationAutodetector.create_altered_constraintsE  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à-×5Ñ5°kÑBˆOØ-×5Ñ5°kÑBˆOØ*9ÖV Q¸QÀoÒ=UšqÐVˆOÐVØ*9ÖV Q¸QÀoÒ=UšqÐVˆOÐVà×$Ñ$×+Ñ+à 
Ð+Ø-<Ø/>ñ.ðõñ	ùò WùÚVs   Â,	C5Â6C5Ã 	C:Ã
C:c           	      óØ   — | j                   j                  «       D ]M  \  \  }}}| j                  ||«      }|d   D ]+  }| j                  |t	        j
                  ||¬«      |¬«       Œ- ŒO y )Nr   r  rõ   )rS   r3   r˜  râ   r   r  )r   r�   r‚   Úalt_constraintsr¦   r  s         r   r{   z0MigrationAutodetector.generate_added_constraints\  s‰   € ð #×6Ñ6×<Ñ<Ó>ò	ñ ñ 
ØØØØ×;Ñ;¸IÀzÓRˆLØ-Ð.AÑBò �
Ø×"Ñ"ØÜ×,Ñ,Ø#-Ø#-ôð ".ð #õ ññ	r&   c           	      óÄ   — | j                   j                  «       D ]C  \  \  }}}|d   D ]3  }| j                  |t        j                  ||j
                  ¬«      «       Œ5 ŒE y )Nr¡  r0  )rS   r3   râ   r   ÚRemoveConstraintrJ   )r   r�   r‚   r¨  r  s        r   rn   z2MigrationAutodetector.generate_removed_constraintsl  sq   € ð #×6Ñ6×<Ñ<Ó>ò	ñ ñ 
ØØØØ-Ð.CÑDò �
Ø×"Ñ"ØÜ×/Ñ/Ø#-Ø'Ÿ_™_ôõññ		r&   c                 ó
  ‡— d }t        ‰j                  d«      r‰j                  j                  }nW|j                  | |f   }|j	                  «       D ]3  \  \  }}}t        ˆfd„|j                  «       D «       «      sŒ,|› d|› �} n t        ‰dd «      }	|	�d}
|	}nt        || |«      \  }
}|
|d dfg}t        ‰j                  dd «      r9t        ‰j                  j                  | |«      \  }}|j                  ||d df«       |S )Nr   c              3   ó<   •K  — | ]  }‰|j                   k(  –— Œ y ­wr   )rE   )r*   r,  rK   s     €r   r,   zJMigrationAutodetector._get_dependencies_for_foreign_key.<locals>.<genexpr>‚  s$   øè ø€ ò à%ð ˜]×7Ñ7Õ7ñùs   ƒr–   Úswappable_settingr•   Tr�   )r:   rE   r   rø   r3   rÕ   r©   r�   r   r�   rG   )r�   r‚   rK   Úproject_stateÚremote_field_modelrø   Úremote_app_labelÚremote_model_namerH   r­  Údep_app_labelÚdep_object_namer¦   Úthrough_app_labelÚthrough_object_names     `            r   rû   z7MigrationAutodetector._get_dependencies_for_foreign_keyz  s<  ø€ à!ÐÜ�5×%Ñ% wÔ/Ø!&×!3Ñ!3×!9Ñ!9Ñà%×/Ñ/°	¸:Ð0EÑFˆIØAJÇÁÓARò Ñ=Ñ5Ð!Ð#4°vÜó à)/¯©«ôõ ð -=Ð+=¸QÐ?PÐ>QÐ)RÐ&Ùðô $ EÐ+>ÀÓEÐØÐ(Ø)ˆMØ/‰Oä-=Ø"ØØó.Ñ*ˆM˜?ð
 '¨¸¸tÐDÐEˆÜ�5×%Ñ% y°$Ô7Ü5EØ×"Ñ"×*Ñ*ØØó6Ñ2ÐÐ2ð
 ×ÑÐ!2Ð4GÈÈtÐ TÔUØÐr&   c           	      óò   — g }| j                   j                  ||f   }|j                  j                  «       D ]<  }|j                  sŒ|j                  | j                  |||| j                   «      «       Œ> |S )z3Return foreign key dependencies of the given model.)r   r   rH   r©   rù   rú   rû   )r   r�   r‚   r¦   rƒ   rK   s         r   r˜  z1MigrationAutodetector._get_dependencies_for_model�  s{   € àˆØ—m‘m×*Ñ*¨9°jÐ+@ÑAˆØ ×'Ñ'×.Ñ.Ó0ò 		ˆEØ× Ó Ø×#Ñ#Ø×:Ñ:Ø!Ø"ØØŸ™ó	õð		ð Ðr&   c              #   óþ  ‡ ‡‡K  — t        ‰ j                  «      D �]X  \  ŠŠ‰ j                  j                  ‰‰f‰«      }‰ j                  j
                  ‰|f   }‰ j                  j
                  ‰‰f   }|j                  j                  |«      }|r$|D �ch c]  }t        ˆˆˆ fd„|D «       «      ’Œ c}n	t        «       }|j                  j                  |«      }|rt        |«      n	t        «       }||k7  sŒÞg }|D ]k  }	|	D ]d  }
|j                  |
«      }|j                  sŒ!|j                  j                  sŒ8|j                  ‰ j                  ‰‰|‰ j                  «      «       Œf Œm ||‰‰|f–— �Œ[ y c c}w ­w)Nc              3   ó\   •K  — | ]#  }‰j                   j                  ‰‰|f|«      –— Œ% y ­wr   )rT   r]   )r*   Únr�   r‚   r   s     €€€r   r,   zMMigrationAutodetector._get_altered_foo_together_operations.<locals>.<genexpr>¹  s3   øè ø€ ò àð ×+Ñ+×/Ñ/°¸JÈÐ0JÈA×Nñùs   ƒ),)rD   r…   r‰   r]   r   r   r   r\   r1   rU   rA  rE   r   rú   rû   )r   r€  r‘   r’   rE  rŽ  rd  r�  r¦   Úfoo_togethersr�   rK   r�   r‚   s   `           @@r   r‚  z: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à˜IÓ%Ø!�Ø%.ò �MØ&3ò 
˜
Ø /× 9Ñ 9¸*Ó E˜Ø ×-Ó-°%×2DÑ2D×2JÓ2JØ(×/Ñ/Ø $× FÑ FØ$-Ø$.Ø$)Ø$(§M¡Mó	!"õñ
ðð ØØØØ ðô ñM,	ùòùs&   …BE=ÂE8Â4AE=Ã9)E=Ä#E=Ä:AE=c           
      ó@  — | j                  |j                  «      D ]{  \  }}}}}|t        j                  k(  r"|D �ch c]  }|| j                  ||f   vr|’Œ }}|j                  |«      }|s|sŒT| j                  | |dd|i|j                  |i¤Ž|¬«       Œ} y c c}w ©NrJ   rõ   rÍ   )r‚  r€  r   rÞ   r�  r  râ   )	r   r´   rŽ  r�  r�   r‚   r¦   r+   Úremoval_values	            r   Ú&_generate_removed_altered_foo_togetherz<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ñð ".ð #õ ñ!	ùòs   ¼Bc                 óB   — | j                  t        j                  «       y r   )r¾  r   rÝ   ©r   s    r   rr   z>MigrationAutodetector.generate_removed_altered_unique_togetherõ  s   € Ø×3Ñ3´J×4RÑ4RÕSr&   c                 óB   — | j                  t        j                  «       y r   )r¾  r   rÞ   rÀ  s    r   rs   z=MigrationAutodetector.generate_removed_altered_index_togetherù  s   € Ø×3Ñ3´J×4QÑ4QÕRr&   c           
      óÎ   — | j                  |j                  «      D ]G  \  }}}}}|j                  |«      }||k7  sŒ | j                  | |dd|i|j                  |i¤Ž|¬«       ŒI y r¼  )r‚  r€  r  râ   )r   r´   rŽ  r�  r�   r‚   r¦   r½  s           r   Ú_generate_altered_foo_togetherz4MigrationAutodetector._generate_altered_foo_togetherü  s‚   € ð ×6Ñ6°y×7LÑ7LÓMò	ñ 
ØØØØØà%×2Ñ2°9Ó=ˆMØ˜MÓ)Ø×"Ñ"ØÙÑT :ÐT°)×2GÑ2GÈÐ1SÑTØ!-ð #õ ñ	r&   c                 óB   — | j                  t        j                  «       y r   )rÃ  r   rÝ   rÀ  s    r   rx   z6MigrationAutodetector.generate_altered_unique_together  s   € Ø×+Ñ+¬J×,JÑ,JÕKr&   c                 óB   — | j                  t        j                  «       y r   )rÃ  r   rÞ   rÀ  s    r   ry   z5MigrationAutodetector.generate_altered_index_together  s   € Ø×+Ñ+¬J×,IÑ,IÕJr&   c                 óø  — | j                   j                  | j                  | j                  «      }t	        |«      D ]¼  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  j                  d«      }|j                  j                  d«      }||k7  sŒ–| j                  |t        j                  ||¬«      «       Œ¾ y )NÚdb_table)rJ   Útable)r…   Úunionr†   r‡   rD   r‰   r]   r   r   r   r\   râ   r   ÚAlterModelTable)	r   Úmodels_to_checkr�   r‚   r‘   r’   rE  Úold_db_table_nameÚnew_db_table_names	            r   r|   z/MigrationAutodetector.generate_altered_db_table  sô   € Ø×.Ñ.×4Ñ4Ø× Ñ  $×":Ñ":ó
ˆô &,¨OÓ%<ò 	Ñ!ˆ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Ø /× 7Ñ 7× ;Ñ ;¸JÓ GÐØ /× 7Ñ 7× ;Ñ ;¸JÓ GÐØ Ð$5Ó5Ø×"Ñ"ØÜ×.Ñ.Ø'Ø/ôõñ	r&   c                 óø  — | j                   j                  | j                  | j                  «      }t	        |«      D ]¼  \  }}| j
                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  j                  d«      }|j                  j                  d«      }||k7  sŒ–| j                  |t        j                  ||¬«      «       Œ¾ y )NÚdb_table_comment)rJ   Útable_comment)r…   rÉ  r†   r‡   rD   r‰   r]   r   r   r   r\   râ   r   ÚAlterModelTableComment)	r   rË  r�   r‚   r‘   r’   rE  Úold_db_table_commentÚnew_db_table_comments	            r   rj   z7MigrationAutodetector.generate_altered_db_table_comment(  sö   € Ø×.Ñ.×4Ñ4Ø× Ñ  $×":Ñ":ó
ˆô &,¨OÓ%<ò 	Ñ!ˆ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à#2×#:Ñ#:×#>Ñ#>Ð?QÓ#RÐ Ø#2×#:Ñ#:×#>Ñ#>Ð?QÓ#RÐ Ø#Ð';Ó;Ø×"Ñ"ØÜ×5Ñ5Ø'Ø&:ôõñ	r&   c                 ó  — | j                   j                  | j                  | j                  | j                  | j
                  z  | j                  | j                  z  «      }t        |«      D �]  \  }}| j                  j                  ||f|«      }| j                  j                  ||f   }| j                  j                  ||f   }|j                  j                  «       D ��ci c]  \  }}|t         j"                  v r||“Œ }	}}|j                  j                  «       D ��ci c]  \  }}|t         j"                  v r||“Œ }
}}|	|
k7  sŒß| j%                  |t'        j                   ||
¬«      «       �Œ yc c}}w c c}}w )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).
        )rJ   r\   N)r…   rÉ  r†   r‡   rX   rY   rV   r[   rD   r‰   r]   r   r   r   r\   r3   r
   ÚALTER_OPTION_KEYSrâ   r   )r   rË  r�   r‚   r‘   r’   rE  r=   r+   Úold_optionsÚnew_optionss              r   rh   z.MigrationAutodetector.generate_altered_options>  s†  € ð ×.Ñ.×4Ñ4Ø× Ñ Ø×$Ñ$à×#Ñ# d×&9Ñ&9Ñ9à×Ñ $×"9Ñ"9Ñ9ó
ˆô &,¨OÓ%<ó 	Ñ!ˆ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ð #2×"9Ñ"9×"?Ñ"?Ó"A÷á�C˜ØÔ+×=Ñ=Ñ=ð �U‘
ðˆKñ ð #2×"9Ñ"9×"?Ñ"?Ó"A÷á�C˜ØÔ+×=Ñ=Ñ=ð �U‘
ðˆKñ ð
 ˜kÓ)Ø×"Ñ"ØÜ×0Ñ0Ø'Ø +ôöñ#	ùóùó
s   Ã$E6Ä#E<c           
      ó\  — t        | j                  «      D �]  \  }}| j                  j                  ||f|«      }| j                  j
                  ||f   }| j                  j
                  ||f   }|j                  j                  d«      |j                  j                  d«      k7  sŒ“g }|j                  j                  d«      r"|j                  |||j                  d   df«       | j                  |t        j                  ||j                  j                  d«      ¬«      |¬«       �Œ y )NrÜ   Tr  rõ   )rD   r…   r‰   r]   r   r   r   r\   rG   râ   r   rÛ   )r   r�   r‚   r‘   r’   rE  r¦   s          r   rw   z<MigrationAutodetector.generate_altered_order_with_respect_tof  s3  € Ü%+¨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Ø×&Ñ&×*Ñ*Ø'óà ×(Ñ(×,Ñ,Ð-DÓEóFð
  "�Ø"×*Ñ*×.Ñ.Ð/FÔGØ ×'Ñ'à%Ø&Ø+×3Ñ3Ð4KÑLØ ð	ôð ×"Ñ"ØÜ×6Ñ6Ø'Ø.=×.EÑ.E×.IÑ.IØ3ó/ôð ".ð #ö 	ñ-	r&   c                 ó|  — t        | j                  «      D ]¤  \  }}| j                  j                  ||f|«      }| j                  j
                  ||f   }| j                  j
                  ||f   }|j                  |j                  k7  sŒt| j                  |t        j                  ||j                  ¬«      «       Œ¦ y )N)rJ   r  )rD   r…   r‰   r]   r   r   r   r  râ   r   ÚAlterModelManagers)r   r�   r‚   r‘   r’   rE  s         r   ri   z/MigrationAutodetector.generate_altered_managersˆ  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Ø×'Ñ'¨?×+CÑ+CÓCØ×"Ñ"ØÜ×1Ñ1Ø'Ø!0×!9Ñ!9ôõñ	r&   c           	      ój  — |j                  «       }i }t        |j                  «       «      D �]3  \  }}|sŒ
d}|D ]  }	|	d   |k(  sŒ|	} n |€9| j                  j	                  |«      s|D ]  }
|df|||
j
                  f<   Œ ||= ŒZ|€d}n| j                  |d   «      xs ddz   }t        |«      D ]¬  \  }}
|dk(  r|r|
j                  j                  |«       d|z  g}|r|j                  |«       n;|dk(  r|s|j                  d«       n"|j                  |
j                  «       dd «       dj                  |«      }||f|||
j
                  f<   |dz  }||
_        Œ® �Œ6 |j                  «       D ]8  }|D ]1  }
|
j                  D �cg c]  }|j                  ||«      ‘Œ c}|
_        Œ3 Œ: |S c c}w )	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¥   r.   z%04ir®   éd   r•  )r¬   r0   r3   r   Úask_initialrJ   Úparse_numberÚ	enumerater¦   rG   Úsuggest_nameÚjoinr©   r]   )r   r%   r!   r$   ÚleavesÚname_mapr�   r€   Úapp_leafÚleafrÉ   Únext_numberÚiÚnew_name_partsrô   r'  s                   r   r   z'MigrationAutodetector.arrange_for_graph˜  sö  € ð ×!Ñ!Ó#ˆØˆÜ%)¨'¯-©-«/Ó%:ó #	*Ñ!ˆI�zÙØàˆHØò �Ø˜‘7˜iÓ'Ø#�HÙðð
 Ð¨¯©×(CÑ(CÀIÔ(Nà!+ò U�IØ=FÈÐ<T�H˜i¨¯©Ð8Ò9ðUà˜IÐ&ØàÐØ‘à#×0Ñ0°¸!±Ó=ÒBÀÀaÑG�ä )¨*Ó 5ò *‘��9Ø˜’6™hØ×*Ñ*×1Ñ1°(Ô;Ø"(¨;Ñ"6Ð!7�Ù!Ø"×)Ñ)¨.Õ9Ø˜!’V¡HØ"×)Ñ)¨)Õ4à"×)Ñ)¨)×*@Ñ*@Ó*BÀ4ÀCÐ*HÔIØŸ8™8 NÓ3�Ø9BÀHÐ8M�˜) Y§^¡^Ð4Ñ5Ø˜qÑ �Ø!)�	•ò*ð-#	*ðJ "Ÿ.™.Ó*ò 	ˆJØ'ò �	à09×0FÑ0Fö*Ø+,�H—L‘L  AÕ&ò*�	Õ&ñð	ð
 ˆùò*s   Æ	F0c           	      óœ  — i }|j                  «       D ]I  \  }}|D ]?  }|j                  D ].  \  }}|j                  |t        «       «      j	                  |«       Œ0 ŒA ŒK t        |«      }	d}
|
|	k7  r>t        |	«      }
 |	j
                  |	D �cg c]  }|j                  |d«      ‘Œ c}Ž  |
|	k7  rŒ>t        |«      D ]
  }||	vsŒ||= Œ |S c c}w )a1  
        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Í   )r3   r¦   r¯   rU   r^   r­   r]   r0   )r   r%   Ú
app_labelsÚapp_dependenciesr�   r€   rÉ   r²  rJ   Úrequired_appsÚold_required_appss              r   r    z#MigrationAutodetector._trim_to_appsÌ  sü   € ð ÐØ%,§]¡]£_ò 	UÑ!ˆI�zØ'ò U�	Ø+4×+AÑ+Aò UÑ'�M 4Ø$×/Ñ/°	¼3»5ÓA×EÑEÀmÕTñUñUð	Uô ˜J›ˆà ÐØ =Ò0Ü # MÓ 2ÐØ ˆM× Ñ ØGTÖU¸)Ð"×&Ñ& y°"Õ5ÒUñð   =Ó0ô ˜g›ò 	'ˆIØ Ò-Ø˜IÑ&ð	'ð ˆùò Vs   ÂC	c                 óœ   — t        j                  d|«      x}rt        |d   «      S t        j                  d|«      }|rt        |d   «      S y)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+)r.   z^\d+r   N)ÚreÚsearchÚintÚmatch)ÚclsrJ   Úsquashed_matchrò  s       r   rÞ  z"MigrationAutodetector.parse_numberç  sO   € ô  ŸY™YÐ';¸TÓBÐBˆ>ÐBÜ�~ aÑ(Ó)Ð)Ü—‘˜ $Ó'ˆÙÜ�u˜Q‘x“=Ð Ør&   r   )NNN)NN)NF)8rê   Ú
__module__Ú__qualname__Ú__doc__r   r%   r)   rM   r   rb   rc   Ústaticmethodrœ   r~   r}   r   r«   râ   rñ   ra   re   rg   rd   rf   rk   rp   ru   rR  rt   ri  rv   rl   rz   ro   rq   rm   r{   rn   rû   r˜  r‚  r¾  rr   rs   rÃ  rx   ry   r|   rj   rh   rw   ri   r   r    ÚclassmethodrÞ  rÍ   r&   r   r   r      sU  „ ñ
óGó
ò$òLóiòV
ò.ð( ñ
Yó ð
Yóp"òdKò$ò$=Kó~Ròò.A"òFAòFòB_òBò<"ò|#IòJJò2
òhLò
ò yRòvWòrò	òòò.ò ð ñ ó ð òDò -ò^ò2TòSòò LòKòò*ò,&òP òDó 2òhð6 ñó ñr&   r   )r4   rï  Úcollectionsr   Úgraphlibr   Ú	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   r   rÍ   r&   r   ú<module>r     s?   ðÛ Û 	Ý #Ý &Ý å  Ý Ý +Ý 4Ý DÝ =Ý ?÷ñ ÷^ò ^r&   