ó
    &ÝNjðÁ  ã                   ó,  • S SK r S SKrS SKrS SK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KJrJrJrJrJrJrJr  SSKJr  SS	KJrJr  SS
KJr  SSKJr  SSKJrJr   S SK J!r!  S\%S\%S\\%\4   4S jr& " S S5      r' " S S\'5      r( " S S\)5      r*S\\%\4   S\\%\4   S\\%\4   4S jr+S\,S\,S\*4S jr-S\,S\%4S  jr.S!\\%\4   S\\%\4   4S" jr/S#\\%\4   S$\\%S%4   SS4S& jr0S\\%\4   S'\\%\4   SS4S( jr1g! \" a	    S SK#J$r!   Nªf = f))é    N)Úspec_from_loader)ÚPathLike)ÚjoinÚsplitextÚ
expanduser)Ú
ModuleType)ÚAnyÚDictÚIteratorÚOptionalÚTupleÚTypeÚUnioné   )ÚEnvironment)ÚUnknownFileTypeÚUnpicklableConfigMember)ÚLocal)ÚWINDOWS)ÚdebugÚyaml)ÚSourceFileLoader)Ú_SourceFileLoaderÚnameÚpathÚreturnc                 óÖ   • [         R                  R                  U5      (       d  0 $ [        SU5      n[	        S5      n[        SU5      Ul        UR                  U5        [        U5      $ )NÚmod)	Úosr   Úexistsr   r   r   Ú__spec__Úexec_moduleÚvars)r   r   Úloaderr   s       ÚJ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/invoke/config.pyÚload_sourcer&      sV   € Ü�7‰7�>‰>˜$×ÑØˆ	Ü˜e TÓ*€FÜ
�UÓ
€CÜ# E¨6Ó2€C„LØ
×Ñ�sÔÜ�‹9Ðó    c            
       ó‚  ^ • \ rS rSrSr\" SR                  5       5      \" S SR                  5        5       5      -   r\S\" 5       4S\	\
\4   S\S    S	\\
S
4   SS 4S jj5       rS\
S\4S jrS\
S\SS4U 4S jjrS\\	\
\4      4S jrS\S\4S jrS\4S jrS\
S\
SS4S jrS\
S\4S jrS\
S\4S jrS\S\SS4S jrS\
4S jrS\
S\4S jr\S\4S j5       r\S\4S j5       r S\
SS4S jr!S\
S\
SS4S  jr"S\
SS4S! jr#S"\
SS4S# jr$S*S$ jr%S\S\4S% jr&S\4S& jr'S\S\4S' jr(S\S\SS4S( jr)S)r*U =r+$ )+Ú	DataProxyé$   a‹  
Helper class implementing nested dict+attr access for `.Config`.

Specifically, is used both for `.Config` itself, and to wrap any other
dicts assigned as config values (recursively).

.. warning::
    All methods (of this object or in subclasses) must take care to
    initialize new attributes via ``self._set(name='value')``, or they'll
    run into recursion errors!

.. versionadded:: 1.0
z�
        get
        has_key
        items
        iteritems
        iterkeys
        itervalues
        keys
        values
    c              #   óD   #   • U  H  nS R                  U5      v •  M     g7f)z__{}__N)Úformat)Ú.0Úxs     r%   Ú	<genexpr>ÚDataProxy.<genexpr>A   s'   é € ð 
ò�ð �O‰O˜A×Ðòùs   ‚ z>
        cmp
        contains
        iter
        sizeof
    NÚdataÚrootÚkeypath.r   c                 ón   • U " 5       nUR                  US9  UR                  US9  UR                  US9  U$ )aŒ  
Alternate constructor for 'baby' DataProxies used as sub-dict values.

Allows creating standalone DataProxy objects while also letting
subclasses like `.Config` define their own ``__init__`` without
muddling the two.

:param dict data:
    This particular DataProxy's personal data. Required, it's the Data
    being Proxied.

:param root:
    Optional handle on a root DataProxy/Config which needs notification
    on data updates.

:param tuple keypath:
    Optional tuple describing the path of keys leading to this
    DataProxy's location inside the ``root`` structure. Required if
    ``root`` was given (and vice versa.)

.. versionadded:: 1.0
©Ú_config)Ú_root)Ú_keypath©Ú_set)Úclsr1   r2   r3   Úobjs        r%   Ú	from_dataÚDataProxy.from_dataL   s:   € ñ: ‹eˆØ�‰˜ˆÑØ�‰�tˆÑØ�‰˜'ˆÑ"Øˆ
r'   Úkeyc           
      óð  •  U R                  U5      $ ! [         aØ    XR                  ;   a  [        U R                  U5      s $ SR                  U5      n[        U R                  5       Vs/ s H  o3R                  S5      (       a  M  UPM     Os  snf nnUSR                  [        [        U R                  R                  5       5      5      5      -  nUSR                  U5      -  n[        U5      ef = f)Nz)No attribute or config key found for {!r}Ú_z

Valid keys: {!r}z

Valid real attributes: {!r})Ú_getÚKeyErrorÚ_proxiesÚgetattrr6   r,   ÚdirÚ	__class__Ú
startswithÚsortedÚlistÚkeysÚAttributeError)Úselfr?   Úerrr.   Úattrss        r%   Ú__getattr__ÚDataProxy.__getattr__o   sÏ   € ð
	&Ø—9‘9˜S“>Ð!øÜó 	&à—m‘mÓ#Ü˜tŸ|™|¨SÓ1Ò1à=×DÑDÀSÓIˆCÜ # D§N¡NÔ 3ÓMÒ 3˜1¿<¹<È×;L—QÒ 3ùÒMˆEÐMØÐ)×0Ñ0Ü”t˜DŸL™L×-Ñ-Ó/Ó0Ó1óñ ˆCð Ð4×;Ñ;¸EÓBÑBˆCÜ  Ó%Ð%ð	&ús"   ‚ “/C5Á(C5Á,BÂ	BÂA&C5Úvaluec                 óX   >• U[        U 5      ;   nU(       d  X U'   g [        TU ]	  X5        g ©N)rF   ÚsuperÚ__setattr__)rM   r?   rR   Úhas_real_attrrG   s       €r%   rV   ÚDataProxy.__setattr__ƒ   s,   ø€ ð œs 4›yÑ(ˆÞð �ŠIä‰GÑ Õ+r'   c                 ó,   • [        U R                  5      $ rT   )Úiterr6   ©rM   s    r%   Ú__iter__ÚDataProxy.__iter__Ž   s   € ô �D—L‘LÓ!Ð!r'   Úotherc                 óz   • [        USS 5      n[        U[        5      (       a  Un[        U R                  U:H  5      $ )Nr6   )rE   Ú
isinstanceÚdictÚboolr6   )rM   r^   Ú	other_vals      r%   Ú__eq__ÚDataProxy.__eq__“   s:   € ô ˜E 9¨dÓ3ˆ	ô �eœT×"Ñ"ØˆIÜ�D—L‘L IÑ-Ó.Ð.r'   c                 ó,   • [        U R                  5      $ rT   )Úlenr6   r[   s    r%   Ú__len__ÚDataProxy.__len__    s   € Ü�4—<‘<Ó Ð r'   c                 óB   • X R                   U'   U R                  X5        g rT   )r6   Ú_track_modification_of)rM   r?   rR   s      r%   Ú__setitem__ÚDataProxy.__setitem__£   s   € Ø!�‰�SÑØ×#Ñ# CÕ/r'   c                 ó$   • U R                  U5      $ rT   )rB   ©rM   r?   s     r%   Ú__getitem__ÚDataProxy.__getitem__§   s   € Ø�y‰y˜‹~Ðr'   c                 óø   • US;   a  [        U5      eU R                  U   n[        U[        5      (       aD  U4n[	        U S5      (       a  U R
                  U-   n[        U SU 5      n[        R                  X$US9nU$ )N)Ú__setstate__r8   r7   )r1   r2   r3   )	rL   r6   r`   ra   Úhasattrr8   rE   r)   r=   )rM   r?   rR   r3   r2   s        r%   rB   ÚDataProxy._getª   s�   € ð Ð#Ó#Ü  Ó%Ð%à—‘˜SÑ!ˆÜ�eœT×"Ñ"ð �fˆGÜ�t˜Z×(Ñ(ØŸ-™-¨'Ñ1�ô ˜4 ¨$Ó/ˆDÜ×'Ñ'¨UÀwÐ'ÐOˆEØˆr'   ÚargsÚkwargsc                 óž   • U(       a  [         R                  " U /UQ76   UR                  5        H  u  p4[         R                  XU5        M     g)a|  
Convenience workaround of default 'attrs are config keys' behavior.

Uses `object.__setattr__` to work around the class' normal proxying
behavior, but is less verbose than using that directly.

Has two modes (which may be combined if you really want):

- ``self._set('attrname', value)``, just like ``__setattr__``
- ``self._set(attname=value)`` (i.e. kwargs), even less typing.
N)ÚobjectrV   Úitems)rM   rv   rw   r?   rR   s        r%   r:   ÚDataProxy._set¾   s<   € ö Ü×Ò˜tÐ+ dÓ+Ø Ÿ,™,ž.‰JˆCÜ×Ñ˜t¨%Ö0ò )r'   c                 ób   • SR                  U R                  R                  U R                  5      $ )Nz<{}: {}>)r,   rG   Ú__name__r6   r[   s    r%   Ú__repr__ÚDataProxy.__repr__Ï   s#   € Ø× Ñ  §¡×!8Ñ!8¸$¿,¹,ÓGÐGr'   c                 ó   • XR                   ;   $ rT   r5   ro   s     r%   Ú__contains__ÚDataProxy.__contains__Ò   s   € Ø—l‘lÑ"Ð"r'   c                 ó   • [        U S5      $ )Nr7   ©rt   r[   s    r%   Ú_is_leafÚDataProxy._is_leafÕ   s   € ä�t˜WÓ%Ð%r'   c                 ó   • [        U S5      $ )NÚ_modifyr„   r[   s    r%   Ú_is_rootÚDataProxy._is_rootÙ   s   € ä�t˜YÓ'Ð'r'   c                 ó¼   • S nU R                   (       a  U R                  nOU R                  (       a  U nUb&  UR                  [	        U S[        5       5      U5        g g ©Nr8   )r…   r7   r‰   Ú_removerE   Útuple)rM   r?   Útargets      r%   Ú_track_removal_ofÚDataProxy._track_removal_ofÝ   sI   € ð
 ˆØ�=�=Ø—Z‘Z‰FØ�]�]ØˆFØÑØ�N‰Nœ7 4¨´U³WÓ=¸sÕCð r'   c                 ó¼   • S nU R                   (       a  U R                  nOU R                  (       a  U nUb&  UR                  [	        U S[        5       5      X5        g g rŒ   )r…   r7   r‰   rˆ   rE   rŽ   )rM   r?   rR   r�   s       r%   rk   Ú DataProxy._track_modification_ofê   sG   € ØˆØ�=�=Ø—Z‘Z‰FØ�]�]ØˆFØÑØ�N‰Nœ7 4¨´U³WÓ=¸sÕJð r'   c                 ó@   • U R                   U	 U R                  U5        g rT   )r6   r�   ro   s     r%   Ú__delitem__ÚDataProxy.__delitem__ó   s   € Ø�L‰L˜ÐØ×Ñ˜sÕ#r'   r   c                 ó>   • X;   a  X	 g [         R                  X5        g rT   )ry   Ú__delattr__)rM   r   s     r%   r˜   ÚDataProxy.__delattr__÷   s   € ð ‹<Ø‘
ä×Ñ˜tÕ*r'   c                 óL   • [        U R                  5       5      nU H  nX	 M     g rT   )rJ   rK   )rM   rK   r?   s      r%   ÚclearÚDataProxy.clearÿ   s!   € Ü�D—I‘I“KÓ ˆÛˆCØ’	ò r'   c                 ó¨   • U=(       a    US   U R                   ;   nU R                   R                  " U6 nU(       d  U$ U R                  US   5        U$ ©Nr   )r6   Úpopr�   )rM   rv   Úkey_existedÚrets       r%   rŸ   ÚDataProxy.pop  sP   € à×6˜t A™w¨$¯,©,Ñ6ˆð �l‰l×Ò Ð%ˆö ØˆJà×Ñ˜t A™wÔ'àˆ
r'   c                 ób   • U R                   R                  5       nU R                  US   5        U$ rž   )r6   Úpopitemr�   )rM   r¡   s     r%   r¤   ÚDataProxy.popitem  s+   € Ø�l‰l×"Ñ"Ó$ˆØ×Ñ˜s 1™vÔ&Øˆ
r'   c                 óª   • U=(       a    US   U R                   ;   nU R                   R                  " U6 nU(       a  U$ Uu  pEU R                  XE5        U$ rž   )r6   Ú
setdefaultrk   )rM   rv   r    r¡   r?   Údefaults         r%   r§   ÚDataProxy.setdefault  sQ   € à×6˜t A™w¨$¯,©,Ñ6ˆà�l‰l×%Ò% tÐ,ˆæØˆJð ‰ˆØ×#Ñ# CÔ1Øˆ
r'   c                 óØ   • U(       a  UR                  5        H	  u  p4X@U'   M     g U(       a>  US   n[        U[        5      (       a  U H	  nXS   X'   M     g U H  nUS   XS   '   M     g g )Nr   r   )rz   r`   ra   )rM   rv   rw   r?   rR   ÚargÚpairs          r%   ÚupdateÚDataProxy.update)  sj   € ÞØ$Ÿl™lžn‘
�Ø!�S“	ò -æà�q‘'ˆCÜ˜#œt×$Ñ$Û�CØ #¡�D“Iò ó  �DØ$(¨¡G�D˜a™“Mò  ð r'   © ©r   N),r}   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rŽ   ÚsplitrD   Úclassmethodr
   Ústrr	   r   r   r=   rP   rV   r   r\   ry   rb   rd   Úintrh   rl   rp   rB   r:   r~   r�   Úpropertyr…   r‰   r�   rk   r•   r˜   r›   rŸ   r¤   r§   r­   Ú__static_attributes__Ú__classcell__)rG   s   @r%   r)   r)   $   sq  ø† ññ  	ð	÷ 	‰‹ó	
ñ ñ 
ð÷
 	‰‹ðó
ó 
ñ	
ð ð0 ð '+Ù#(£7ñ	 à�3˜�8‰nð ð �{Ñ#ð ð �s˜C�x‘ð	 ð
 
ô ó ð ðD&˜sð & sô &ð(	,˜sð 	,¨3ð 	,°4÷ 	,ð"˜( 4¨¨S¨¡>Ñ2ô "ð
/˜Fð / tô /ð!˜ô !ð0˜sð 0¨3ð 0°4ô 0ð˜sð  sô ð˜ð  ô ð(1˜#ð 1¨ð 1°ô 1ð"H˜#ô Hð# ð #¨ô #ð ð&˜$ó &ó ð&ð ð(˜$ó (ó ð(ðD Sð D¨Tô DðK¨#ð K°cð K¸dô Kð$˜sð $ tô $ð+ ð +¨ô +ôð
˜ð  ô ð"˜ô ð
 ð ¨ô ð,˜Cð ,¨3ð ,°4÷ ,ò ,r'   r)   c                   óÞ  • \ rS rSrSrSrSrSr\S\	\
\4   4S j5       r       S1S\\	\
\4      S\\	\
\4      S	\\
   S
\\
   S\\   S\\   S\4S jjrS2S jrS3S\	\
\4   S\SS4S jjrS3S\	\
\4   S\SS4S jjrS3S\SS4S jjrS3S\SS4S jjrS3S\SS4S jjrS\\   SS4S jrS3S\SS4S jjrS2S jr S3S\	\
\4   S\SS4S jjrS\\\
S4   SS4S jr S4S\
S\S\SS4S jjrS\S\4S  jr\rS\S\4S! jr S\
S\	\
\4   4S" jr!S2S# jr"S$\
S%\
SS4S& jr#S5S'\\$S       SS 4S( jjr% S5S'\\$S       S\	\
\4   4S) jjr&S*\'\
S+4   S,\
S-\
SS4S. jr(S*\'\
S+4   S,\
SS4S/ jr)S0r*g)6ÚConfigi9  a  
Invoke's primary configuration handling class.

See :doc:`/concepts/configuration` for details on the configuration system
this class implements, including the :ref:`configuration hierarchy
<config-hierarchy>`. The rest of this class' documentation assumes
familiarity with that document.

**Access**

Configuration values may be accessed and/or updated using dict syntax::

    config['foo']

or attribute syntax::

    config.foo

Nesting works the same way - dict config values are turned into objects
which honor both the dictionary protocol and the attribute-access method::

   config['foo']['bar']
   config.foo.bar

**A note about attribute access and methods**

This class implements the entire dictionary protocol: methods such as
``keys``, ``values``, ``items``, ``pop`` and so forth should all function
as they do on regular dicts. It also implements new config-specific methods
such as `load_system`, `load_collection`, `merge`, `clone`, etc.

.. warning::
    Accordingly, this means that if you have configuration options sharing
    names with these methods, you **must** use dictionary syntax (e.g.
    ``myconfig['keys']``) to access the configuration data.

**Lifecycle**

At initialization time, `.Config`:

- creates per-level data structures;
- stores any levels supplied to `__init__`, such as defaults or overrides,
  as well as the various config file paths/filename patterns;
- and loads config files, if found (though typically this just means system
  and user-level files, as project and runtime files need more info before
  they can be found and loaded.)

    - This step can be skipped by specifying ``lazy=True``.

At this point, `.Config` is fully usable - and because it pre-emptively
loads some config files, those config files can affect anything that
comes after, like CLI parsing or loading of task collections.

In the CLI use case, further processing is done after instantiation, using
the ``load_*`` methods such as `load_overrides`, `load_project`, etc:

- the result of argument/option parsing is applied to the overrides level;
- a project-level config file is loaded, as it's dependent on a loaded
  tasks collection;
- a runtime config file is loaded, if its flag was supplied;
- then, for each task being executed:

    - per-collection data is loaded (only possible now that we have
      collection & task in hand);
    - shell environment data is loaded (must be done at end of process due
      to using the rest of the config as a guide for interpreting env var
      names.)

At this point, the config object is handed to the task being executed, as
part of its execution `.Context`.

Any modifications made directly to the `.Config` itself after this point
end up stored in their own (topmost) config level, making it easier to
debug final values.

Finally, any *deletions* made to the `.Config` (e.g. applications of
dict-style mutators like ``pop``, ``clear`` etc) are also tracked in their
own structure, allowing the config object to honor such method calls
without mutating the underlying source data.

**Special class attributes**

The following class-level attributes are used for low-level configuration
of the config system itself, such as which file paths to load. They are
primarily intended for overriding by subclasses.

- ``prefix``: Supplies the default value for ``file_prefix`` (directly) and
  ``env_prefix`` (uppercased). See their descriptions for details. Its
  default value is ``"invoke"``.
- ``file_prefix``: The config file 'basename' default (though it is not a
  literal basename; it can contain path parts if desired) which is appended
  to the configured values of ``system_prefix``, ``user_prefix``, etc, to
  arrive at the final (pre-extension) file paths.

  Thus, by default, a system-level config file path concatenates the
  ``system_prefix`` of ``/etc/`` with the ``file_prefix`` of ``invoke`` to
  arrive at paths like ``/etc/invoke.json``.

  Defaults to ``None``, meaning to use the value of ``prefix``.

- ``env_prefix``: A prefix used (along with a joining underscore) to
  determine which environment variables are loaded as the env var
  configuration level. Since its default is the value of ``prefix``
  capitalized, this means env vars like ``INVOKE_RUN_ECHO`` are sought by
  default.

  Defaults to ``None``, meaning to use the value of ``prefix``.

.. versionadded:: 1.0
ÚinvokeNr   c            
      ó  • [         (       a!  [        R                  R                  SS5      n OSn 0 SS_SS_SS_SS_S	S
_SS
_S0 _SS
_SS_SS
_SS
_SS
_SS_SS_SS_SU _SS_S/ 0ES[        0S
SS
S.SSSS
SS
S.SS
0S .$ )!aR  
Return the core default settings for Invoke.

Generally only for use by `.Config` internals. For descriptions of
these values, see :ref:`default-values`.

Subclasses may choose to override this method, calling
``Config.global_defaults`` and applying `.merge_dicts` to the result,
to add to or modify these values.

.. versionadded:: 1.0
ÚCOMSPECzcmd.exeÚbashÚasynchronousFÚdisownÚdryÚechoÚ
echo_stdinNÚencodingÚenvÚ
err_streamÚfallbackTÚhideÚ	in_streamÚ
out_streamÚecho_formatz[1;37m{command}[0mÚptyÚreplace_envÚshellÚwarnÚwatchersÚlocalz[sudo] password: )ÚpasswordÚpromptÚuserÚtasks)Úauto_dash_namesÚcollection_nameÚdedupeÚexecutor_classÚignore_unknown_helpÚsearch_rootÚcommand)ÚrunÚrunnersÚsudorØ   Útimeouts)r   r   ÚenvironÚgetr   )rÑ   s    r%   Úglobal_defaultsÚConfig.global_defaults­  sD  € ÷" Š7Ü—J‘J—N‘N 9¨iÓ8‰Eð
 ˆEð(Ø ðà˜%ðð �uðð ˜ð	ð
 ˜dðð ˜Dðð �rðð ˜dðð ˜Dðð ˜ðð ˜Tðð ˜dðð Ð;ðð �uðð ˜uðð  ˜ð!ð" ˜ð#ð$ ˜Bñ%ð.  ¤Ð'à Ø-Øñð $(Ø#*ØØ"&Ø',Ø#ñð # DÐ)ño8
ð 8	
r'   Ú	overridesÚdefaultsÚsystem_prefixÚuser_prefixÚproject_locationÚruntime_pathÚlazyc                 ót  • U R                  0 S9  U R                  SS9  Uc  [        U R                  5       5      nU R                  US9  U R                  0 S9  Uc  [        (       d  SnU R                  US9  U R                  SS	9  U R                  SS
9  U R                  0 S9  Uc  SnU R                  US9  U R                  SS9  U R                  SS9  U R                  0 S9  U R	                  U5        U R
                  nUc  U R                  nSR                  UR                  5       5      nU R                  US9  U R                  0 S9  U R                  U5        Uc  0 nU R                  US9  U R                  0 S9  U R                  0 S9  U(       d  U R                  5         U R                  5         g)ao  
Creates a new config object.

:param dict defaults:
    A dict containing default (lowest level) config data. Default:
    `global_defaults`.

:param dict overrides:
    A dict containing override-level config data. Default: ``{}``.

:param str system_prefix:
    Base path for the global config file location; combined with the
    prefix and file suffixes to arrive at final file path candidates.

    Default: ``/etc/`` (thus e.g. ``/etc/invoke.yaml`` or
    ``/etc/invoke.json``).

:param str user_prefix:
    Like ``system_prefix`` but for the per-user config file. These
    variables are joined as strings, not via path-style joins, so they
    may contain partial file paths; for the per-user config file this
    often means a leading dot, to make the final result a hidden file
    on most systems.

    Default: ``~/.`` (e.g. ``~/.invoke.yaml``).

:param str project_location:
    Optional directory path of the currently loaded `.Collection` (as
    loaded by `.Loader`). When non-empty, will trigger seeking of
    per-project config files in this directory.

:param str runtime_path:
    Optional file path to a runtime configuration file.

    Used to fill the penultimate slot in the config hierarchy. Should
    be a full file path to an existing file, not a directory path or a
    prefix.

:param bool lazy:
    Whether to automatically load some of the lower config levels.

    By default (``lazy=False``), ``__init__`` automatically calls
    `load_system` and `load_user` to load system and user config files,
    respectively.

    For more control over what is loaded when, you can say
    ``lazy=True``, and no automatic loading is done.

    .. note::
        If you give ``defaults`` and/or ``overrides`` as ``__init__``
        kwargs instead of waiting to use `load_defaults` or
        `load_overrides` afterwards, those *will* still end up 'loaded'
        immediately.
r5   )r   ÚymlÚjsonÚpy)Ú_file_suffixesN©Ú	_defaults©Ú_collectionz/etc/)Ú_system_prefix)Ú_system_path)Ú_system_found)Ú_systemz~/.)Ú_user_prefix)Ú
_user_path)Ú_user_found)Ú_userz{}_)Ú_env_prefix©Ú_env©Ú
_overrides)Ú_modifications)Ú
_deletions)r:   Ú	copy_dictræ   r   Úset_project_locationÚ
env_prefixÚprefixr,   ÚupperÚset_runtime_pathÚload_base_conf_filesÚmerge)	rM   rè   ré   rê   rë   rì   rí   rî   r	  s	            r%   Ú__init__ÚConfig.__init__   s´  € ðD 	�	‰	˜"ˆ	Ñð 	�	‰	Ð!>ˆ	Ñ?ð ÑÜ  ×!5Ñ!5Ó!7Ó8ˆHØ�	‰	˜Hˆ	Ñ%ð 	�	‰	˜bˆ	Ñ!ð Ñ ¯ªØ#ˆMØ�	‰	 ˆ	Ñ/à�	‰	˜tˆ	Ñ$ð 	�	‰	 ˆ	Ñ%à�	‰	˜"ˆ	Ñð ÑØˆKØ�	‰	˜{ˆ	Ñ+à�	‰	˜Tˆ	Ñ"ð 	�	‰	˜dˆ	Ñ#à�	‰	˜ˆ	Ñð 	×!Ñ!Ð"2Ô3ð —_‘_ˆ
ØÑØŸ™ˆJØ—\‘\ *×"2Ñ"2Ó"4Ó5ˆ
Ø�	‰	˜jˆ	Ñ)à�	‰	�rˆ	Ñð 	×Ñ˜lÔ+ð ÑØˆIØ�	‰	˜Yˆ	Ñ'ð 	�	‰	 ˆ	Ñ$ð 	�	‰	˜Rˆ	Ñ ö Ø×%Ñ%Ô'ð 	�
‰
�r'   c                 ó@   • U R                  SS9  U R                  SS9  g )NF)r  )Úload_systemÚ	load_userr[   s    r%   r  ÚConfig.load_base_conf_files‘  s!   € à×Ñ˜uÐÑ%Ø�‰˜UˆÒ#r'   r1   r  c                 óR   • U R                  US9  U(       a  U R                  5         gg)a  
Set or replace the 'defaults' configuration level, from ``data``.

:param dict data: The config data to load as the defaults level.

:param bool merge:
    Whether to merge the loaded data into the central config. Default:
    ``True``.

:returns: ``None``.

.. versionadded:: 1.0
rô   N©r:   r  ©rM   r1   r  s      r%   Úload_defaultsÚConfig.load_defaults–  s#   € ð 	�	‰	˜Dˆ	Ñ!ÞØ�J‰J�Lð r'   c                 óR   • U R                  US9  U(       a  U R                  5         gg)a  
Set or replace the 'overrides' configuration level, from ``data``.

:param dict data: The config data to load as the overrides level.

:param bool merge:
    Whether to merge the loaded data into the central config. Default:
    ``True``.

:returns: ``None``.

.. versionadded:: 1.0
r  Nr  r  s      r%   Úload_overridesÚConfig.load_overrides¨  s#   € ð 	�	‰	˜Tˆ	Ñ"ÞØ�J‰J�Lð r'   c                 ó$   • U R                  SUS9  g)aC  
Load a system-level config file, if possible.

Checks the configured ``_system_prefix`` path, which defaults to
``/etc``, and will thus load files like ``/etc/invoke.yml``.

:param bool merge:
    Whether to merge the loaded data into the central config. Default:
    ``True``.

:returns: ``None``.

.. versionadded:: 1.0
Úsystem©r
  r  N©Ú
_load_file©rM   r  s     r%   r  ÚConfig.load_systemº  s   € ð 	�‰˜x¨uˆÒ5r'   c                 ó$   • U R                  SUS9  g)a<  
Load a user-level config file, if possible.

Checks the configured ``_user_prefix`` path, which defaults to ``~/.``,
and will thus load files like ``~/.invoke.yml``.

:param bool merge:
    Whether to merge the loaded data into the central config. Default:
    ``True``.

:returns: ``None``.

.. versionadded:: 1.0
r×   r  Nr   r"  s     r%   r  ÚConfig.load_userË  s   € ð 	�‰˜v¨UˆÒ3r'   c                 ó$   • U R                  SUS9  g)a)  
Load a project-level config file, if possible.

Checks the configured ``_project_prefix`` value derived from the path
given to `set_project_location`, which is typically set to the
directory containing the loaded task collection.

Thus, if one were to run the CLI tool against a tasks collection
``/home/myuser/code/tasks.py``, `load_project` would seek out files
like ``/home/myuser/code/invoke.yml``.

:param bool merge:
    Whether to merge the loaded data into the central config. Default:
    ``True``.

:returns: ``None``.

.. versionadded:: 1.0
Úprojectr  Nr   r"  s     r%   Úload_projectÚConfig.load_projectÜ  s   € ð( 	�‰˜y°ˆÒ6r'   r   c                 ó^   • U R                  US9  U R                  0 S9  U R                  SS9  g)z:
Set the runtime config file path.

.. versionadded:: 1.0
)Ú_runtime_path)Ú_runtimeN)Ú_runtime_foundr9   )rM   r   s     r%   r  ÚConfig.set_runtime_pathò  s0   € ð 	�	‰	 ˆ	Ñ%à�	‰	˜2ˆ	Ñð 	�	‰	 ˆ	Ò&r'   c                 ó&   • U R                  SSUS9  g)ap  
Load a runtime-level config file, if one was specified.

When the CLI framework creates a `Config`, it sets ``_runtime_path``,
which is a full path to the requested config file. This method attempts
to load that file.

:param bool merge:
    Whether to merge the loaded data into the central config. Default:
    ``True``.

:returns: ``None``.

.. versionadded:: 1.0
ÚruntimeT)r
  Úabsoluter  Nr   r"  s     r%   Úload_runtimeÚConfig.load_runtime   s   € ð  	�‰˜y°4¸uˆÒEr'   c                 óü   • [        S5        U R                  5         [        S5        [        U R                  U R                  S9nU R                  UR                  5       S9  [        S5        U R                  5         g)a9  
Load values from the shell environment.

`.load_shell_env` is intended for execution late in a `.Config`
object's lifecycle, once all other sources (such as a runtime config
file or per-collection configurations) have been loaded. Loading from
the shell is not terrifically expensive, but must be done at a specific
point in time to ensure the "only known config keys are loaded from the
env" behavior works correctly.

See :ref:`env-vars` for details on this design decision and other info
re: how environment variables are scanned and loaded.

.. versionadded:: 1.0
z*Running pre-merge for shell env loading...zDone with pre-merge.)Úconfigr
  r  z0Loaded shell environment, triggering final mergeN)r   r  r   r6   r   r:   Úload)rM   r$   s     r%   Úload_shell_envÚConfig.load_shell_env  s[   € ô" 	Ð:Ô;Ø�
‰
ŒÜÐ$Ô%Ü D§L¡L¸×9IÑ9IÑJˆØ�	‰	�v—{‘{“}ˆ	Ñ%ÜÐ@ÔAØ�
‰
�r'   c                 óh   • [        S5        U R                  US9  U(       a  U R                  5         gg)zø
Update collection-driven config data.

`.load_collection` is intended for use by the core task execution
machinery, which is responsible for obtaining collection-driven data.
See :ref:`collection-configuration` for details.

.. versionadded:: 1.0
z Loading collection configurationrö   N)r   r:   r  r  s      r%   Úload_collectionÚConfig.load_collection+  s,   € ô 	Ð0Ô1Ø�	‰	˜dˆ	Ñ#ÞØ�J‰J�Lð r'   c                 óž   • SnUb  [        US5      nU R                  US9  U R                  SS9  U R                  SS9  U R                  0 S9  g)z§
Set the directory path where a project-level config file may be found.

Does not do any file loading on its own; for that, see `load_project`.

.. versionadded:: 1.0
NÚ )Ú_project_prefix)Ú_project_path)Ú_project_found)Ú_project)r   r:   )rM   r   Úproject_prefixs      r%   r  ÚConfig.set_project_location<  sT   € ð ˆØÑä! $¨›^ˆNØ�	‰	 .ˆ	Ñ1à�	‰	 ˆ	Ñ%ð 	�	‰	 ˆ	Ñ&à�	‰	˜2ˆ	Òr'   r
  r1  c           	      ó  • SR                  U5      nSR                  U5      nSR                  U5      nU R                  nUc  U R                  n[        X5      b  g U(       a  [        X5      nUc  g U/n	ON[        U SR                  U5      5      n
U
c  g U R                   Vs/ s H  nSR                  X§-   U45      PM     n	nU	 H‚  n[        U5      n  [        U5      S   R                  S5      n[        U SR                  U5      5      nU R                  Xn" U5      5        U R                  X\5        U R                  US	5          O   [        X5      c  U R                  US5        g U(       a  U R                  5         g g s  snf ! [         a(    Sn[        UR                  WXÀR                  5      5      ef = f! [         a9  nUR                  S
:X  a#  Sn[        UR                  U5      5         S nAGM5  e S nAff = f)Nú	_{}_foundú_{}_pathú_{}z
_{}_prefixÚ.r   z_load_{}zUConfig files of type {!r} (from file {!r}) are not supported! Please use one of: {!r}Té   zDidn't see any {}, skipping.F)r,   Úfile_prefixr
  rE   ró   r   r   r   ÚlstriprL   r   r:   ÚIOErrorÚerrnor   r  )rM   r
  r1  r  Úfoundr   r1   ÚmidfixÚabsolute_pathÚpathsÚpath_prefixr.   ÚfilepathÚtype_r$   ÚmsgÚerN   s                     r%   r!  ÚConfig._load_fileR  sõ  € ð ×"Ñ" 6Ó*ˆØ× Ñ  Ó(ˆØ�|‰|˜FÓ#ˆØ×!Ñ!ˆØ‰>Ø—[‘[ˆFä�4ÓÑ+ØæÜ# DÓ/ˆMàÑ$ØØ"�O‰Eä! $¨×(;Ñ(;¸FÓ(CÓDˆKð Ñ"Øð ×,Ò,óâ,�Að —‘˜+Ñ.°Ð2Ö3Ù,ð ð ó
 ˆHä! (Ó+ˆHððÜ$ XÓ.¨qÑ1×8Ñ8¸Ó=�EÜ$ T¨:×+<Ñ+<¸UÓ+CÓD�Fð —	‘	˜$  xÓ 0Ô1Ø—	‘	˜$Ô)Ø—	‘	˜% Ô&Ùñ# ô4 �4ÓÑ&Ø�I‰I�e˜UÕ#æØ�J‰J�Lð ùòEøô &ó Øq�CÜ)ØŸ
™
 5¨(×4GÑ4GÓHóð ðûô ó Ø—7‘7˜a“<Ø8�CÜ˜#Ÿ*™* XÓ.×/Ó/àûðús6   Â#FÃ8F	Ä:F>Æ	2F;Æ;F>Æ>
HÇ,G<Ç;G<Ç<Hc                 óz   • [        U5       n[        R                  " U5      sS S S 5        $ ! , (       d  f       g = frT   )Úopenr   Ú	safe_load©rM   r   Úfds      r%   Ú
_load_yamlÚConfig._load_yaml‘  s!   € Ü�$ŒZ˜2Ü—>’> "Ó%÷ �Z�Zúó   Œ,¬
:c                 óz   • [        U5       n[        R                  " U5      sS S S 5        $ ! , (       d  f       g = frT   )rY  rñ   r6  r[  s      r%   Ú
_load_jsonÚConfig._load_json—  s    € Ü�$ŒZ˜2Ü—9’9˜R“=÷ �Z�Zúr_  c                 óþ   • 0 n[        SU5      R                  5        H\  u  p4UR                  S5      (       a  M  [        U[        R
                  5      (       a  Sn[        UR                  U5      5      eXBU'   M^     U$ )Nr   Ú__zƒ'{}' is a module, which can't be used as a config value. (Are you perhaps giving a tasks file instead of a config file by mistake?))r&   rz   rH   r`   Útypesr   r   r,   )rM   r   r1   r?   rR   rN   s         r%   Ú_load_pyÚConfig._load_py›  su   € ØˆÜ& u¨dÓ3×:Ñ:Ö<‰JˆCð �~‰~˜d×#Ñ#Ùô ˜%¤×!1Ñ!1×2Ñ2ð \�Ü-¨c¯j©j¸«oÓ>Ð>Ø�‹Iñ =ð ˆr'   c                 óø  • [        S5        U R                  0 S9  [        SR                  U R                  5      5        [	        U R
                  U R                  5        [        SR                  U R                  5      5        [	        U R
                  U R                  5        U R                  SS5        U R                  SS5        U R                  S	S
5        [        SR                  U R                  5      5        [	        U R
                  U R                  5        U R                  SS5        [        SR                  U R                  5      5        [	        U R
                  U R                  5        [        SR                  U R                  5      5        [	        U R
                  U R                  5        [        SR                  U R                  5      5        [        U R
                  U R                  5        g)z<
Merge all config sources, in order.

.. versionadded:: 1.0
z9Merging config sources in order onto new empty _config...r5   zDefaults: {!r}zCollection-driven: {!r}r  zSystem-wider×   zPer-userr'  zPer-projectz!Environment variable config: {!r}r0  ÚRuntimezOverrides: {!r}zModifications: {!r}zDeletions: {!r}N)r   r:   r,   rõ   Úmerge_dictsr6   r÷   Ú_merge_filer  r  r  r  Ú
obliterater[   s    r%   r  ÚConfig.merge­  s_  € ô 	ÐIÔJØ�	‰	˜"ˆ	ÑÜÐ×%Ñ% d§n¡nÓ5Ô6Ü�D—L‘L $§.¡.Ô1ÜÐ'×.Ñ.¨t×/?Ñ/?Ó@ÔAÜ�D—L‘L $×"2Ñ"2Ô3Ø×Ñ˜ =Ô1Ø×Ñ˜ Ô,Ø×Ñ˜ MÔ2ÜÐ1×8Ñ8¸¿¹ÓCÔDÜ�D—L‘L $§)¡)Ô,Ø×Ñ˜ IÔ.ÜÐ×&Ñ& t§¡Ó7Ô8Ü�D—L‘L $§/¡/Ô2ÜÐ#×*Ñ*¨4×+>Ñ+>Ó?Ô@Ü�D—L‘L $×"5Ñ"5Ô6ÜÐ×&Ñ& t§¡Ó7Ô8Ü�4—<‘< §¡Õ1r'   r   Údescc                 ó’  • US-  n[        U SR                  U5      5      n[        U SR                  U5      5      n[        U SR                  U5      5      nUc  [        SR                  U5      5        g U(       a2  [        SR                  X$U5      5        [        U R                  U5        g [        SR                  U5      5        g )Nz config filerE  rF  rG  z${} has not been loaded yet, skippingz{} ({}): {!r}z{} not found, skipping)rE   r,   r   rj  r6   )rM   r   rn  rN  r   r1   s         r%   rk  ÚConfig._merge_fileÆ  s¤   € à�ÑˆÜ˜˜k×0Ñ0°Ó6Ó7ˆÜ�t˜Z×.Ñ.¨tÓ4Ó5ˆÜ�t˜UŸ\™\¨$Ó/Ó0ˆà‰=ÜÐ8×?Ñ?ÀÓEÕFæÜ�/×(Ñ(¨°TÓ:Ô;Ü˜Ÿ™ dÕ+ô
 Ð*×1Ñ1°$Ó7Õ8r'   Úintoc                 óœ  • Uc  U R                   OUnU" S0 U R                  US9D6nSR                  5        Hq  nSR                  U5      n[	        X5      n[        U[        5      (       d(  UR                  U[        R                  " U5      5        M\  [        [	        X45      U5        Ms     UR                  5         UR                  5         U$ )a	  
Return a copy of this configuration object.

The new object will be identical in terms of configured sources and any
loaded (or user-manipulated) data, but will be a distinct object with
as little shared mutable state as possible.

Specifically, all `dict` values within the config are recursively
recreated, with non-dict leaf values subjected to `copy.copy` (note:
*not* `copy.deepcopy`, as this can cause issues with various objects
such as compiled regexen or threading locks, often found buried deep
within rich aggregates like API or DB clients).

The only remaining config values that may end up shared between a
config and its clone are thus those 'rich' objects that do not
`copy.copy` cleanly, or compound non-dict objects (such as lists or
tuples).

:param into:
    A `.Config` subclass that the new clone should be "upgraded" to.

    Used by client libraries which have their own `.Config` subclasses
    that e.g. define additional defaults; cloning "into" one of these
    subclasses ensures that any new keys/subtrees are added gracefully,
    without overwriting anything that may have been pre-defined.

    Default: ``None`` (just clone into another regular `.Config`).

:returns:
    A `.Config`, or an instance of the class given to ``into``.

.. versionadded:: 1.0
)rq  aÔ  
            collection
            system_prefix
            system_path
            system_found
            system
            user_prefix
            user_path
            user_found
            user
            project_prefix
            project_path
            project_found
            project
            env_prefix
            env
            runtime_path
            runtime_found
            runtime
            overrides
            modifications
        rG  r¯   )rG   Ú_clone_init_kwargsrµ   r,   rE   r`   ra   r:   Úcopyrj  r  r  )rM   rq  ÚklassÚnewr   Úmy_datas         r%   ÚcloneÚConfig.cloneÙ  s¼   € ðF #'¡,�—’°Dˆñ Ñ9�d×-Ñ-°4Ð-Ð8Ñ9ˆð÷* ‰E‹Gò+ˆDð, —<‘< Ó%ˆDÜ˜dÓ)ˆGô ˜g¤t×,Ñ,Ø—‘˜œtŸyšy¨Ó1Ö2ô œG CÓ.°Ö8ñAðF 	× Ñ Ô"ð 	�	‰	ŒØˆ
r'   c                 óx   • [        U R                  5      nUb  [        X!R                  5       5        [	        USS9$ )ai  
Supply kwargs suitable for initializing a new clone of this object.

Note that most of the `.clone` process involves copying data between
two instances instead of passing init kwargs; however, sometimes you
really do want init kwargs, which is why this method exists.

:param into: The value of ``into`` as passed to the calling `.clone`.

:returns: A `dict`.
T)ré   rî   )r  rõ   rj  ræ   ra   )rM   rq  Únew_defaultss      r%   rs  ÚConfig._clone_init_kwargs1  s>   € ô" ! §¡Ó0ˆØÑÜ˜×&:Ñ&:Ó&<Ô=äØ!ð ñ
ð 	
r'   r3   .r?   rR   c                 óè   • [        U R                  X4-   5        U R                  n[        U5      nU(       a'  UR	                  S5      nXd;  a  0 XF'   XF   nU(       a  M'  X4U'   U R                  5         g)a;  
Update our user-modifications config level with new data.

:param tuple keypath:
    The key path identifying the sub-dict being updated. May be an
    empty tuple if the update is occurring at the topmost level.

:param str key:
    The actual key receiving an update.

:param value:
    The value being written.
r   N)Úexciser  r  rJ   rŸ   r  )rM   r3   r?   rR   r1   Úkeypath_listÚsubkeys          r%   rˆ   ÚConfig._modifyN  sk   € ô  	ˆt�‰ ¨&Ñ 0Ô1à×"Ñ"ˆÜ˜G“}ˆÞØ!×%Ñ% aÓ(ˆFàÓ!à!�‘Ø‘<ˆD÷ ˆlð ˆS‰	Ø�
‰
�r'   c                 óÈ   • U R                   n[        U5      nU(       a0  UR                  S5      nXS;   a	  X5   nUc  gO0 X5'   X5   nU(       a  M0  SX2'   U R                  5         g)z#
Like `._modify`, but for removal.
r   N)r  rJ   rŸ   r  )rM   r3   r?   r1   r  r€  s         r%   r�   ÚConfig._removel  sm   € ð �‰ˆÜ˜G“}ˆÞØ!×%Ñ% aÓ(ˆFØ‹~Ø‘|�ð ‘<Øð  ð  "�‘à‘|�÷ ˆlð$ ˆ‰	Ø�
‰
�r'   r¯   )NNNNNNFr°   )T)FTrT   )+r}   r±   r²   r³   r´   r
  rJ  r	  Ústaticmethodr
   r·   r	   ræ   r   r   rb   r  r  r  r  r  r  r(  r  r2  r7  r:  r   r  r!  r]  Ú	_load_ymlra  rf  r  rk  r   rx  rs  r   rˆ   r�   rº   r¯   r'   r%   r½   r½   9  sü  † ñmð^ €FØ€KØ€JàðP
˜T # s (™^ó P
ó ðP
ðh /3Ø-1Ø'+Ø%)Ø/3Ø+/ØñOà˜D  c ™NÑ+ðOð ˜4  S ™>Ñ*ðOð   ‘}ð	Oð
 ˜c‘]ðOð # 8Ñ,ðOð ˜xÑ(ðOð õOôb$ñ
 $ s¨C x¡.ð ¸ð Èõ ñ$ 4¨¨S¨¡>ð ¸$ð È$õ ñ$6 ð 6°õ 6ñ"4˜tð 4¨tõ 4ñ"7 $ð 7°$õ 7ð,' X¨hÑ%7ð '¸Dô 'ñF $ð F°$õ Fô$ð4 37ñØ˜˜c˜‘NðØ+/ðà	õð"¨¨x¸¸dÐ/BÑ)Cð Èô ð. BFñ=Øð=Ø%)ð=Ø:>ð=à	õ=ð~&˜xð &¨Cô &ð €Ið!˜xð !¨Cô !ð˜Sð  T¨#¨s¨(¡^ô ô$2ð29 ð 9¨3ð 9°4ô 9ñ&V˜( 4¨¡>Ñ2ð V¸hõ Vðr 04ñ
Ø˜T (™^Ñ,ð
à	ˆc�3ˆh‰õ
ð:˜u S¨# X™ð °Sð Àð Èô ð<˜u S¨# X™ð °Sð ¸T÷ r'   r½   c                   ó   • \ rS rSrSrg)ÚAmbiguousMergeErroriŒ  r¯   N)r}   r±   r²   r³   rº   r¯   r'   r%   r‡  r‡  Œ  s   † Úr'   r‡  ÚbaseÚupdatesc                 ó:  • U=(       d    0 R                  5        Hý  u  p#X ;   a   [        U[        5      (       a5  [        X   [        5      (       a  [        X   U5        MF  [	        X   U5      e[        X   [        5      (       a  [	        X   U5      e[        US5      (       a  X0U'   M�  [        R                  " U5      X'   Mª  [        U[        5      (       a  [        U5      X'   MÎ  [        US5      (       a  X0U'   Må  [        R                  " U5      X'   Mÿ     U $ )a  
Recursively merge dict ``updates`` into dict ``base`` (mutating ``base``.)

* Values which are themselves dicts will be recursed into.
* Values which are a dict in one input and *not* a dict in the other input
  (e.g. if our inputs were ``{'foo': 5}`` and ``{'foo': {'bar': 5}}``) are
  irreconciliable and will generate an exception.
* Non-dict leaf values are run through `copy.copy` to avoid state bleed.

.. note::
    This is effectively a lightweight `copy.deepcopy` which offers
    protection from mismatched types (dict vs non-dict) and avoids some
    core deepcopy problems (such as how it explodes on certain object
    types).

:returns:
    The value of ``base``, which is mostly useful for wrapper functions
    like `copy_dict`.

.. versionadded:: 1.0
Úfileno)rz   r`   ra   rj  Ú_merge_errorrt   rt  r  )rˆ  r‰  r?   rR   s       r%   rj  rj  �  sé   € ð2 —} "×+Ñ+Ö-‰
ˆð ‹;Ü˜%¤×&Ñ&Ü˜d™i¬×.Ñ.Ü ¡	¨5Ö1ä& t¡y°%Ó8Ð8ä˜d™i¬×.Ñ.Ü& t¡y°%Ó8Ð8ô ˜U H×-Ñ-Ø %˜“Iä $§	¢	¨%Ó 0�D“Iô
 ˜%¤×&Ñ&Ü% eÓ,�“	ô ˜ ×)Ñ)Ø!�S“	ô !ŸIšI eÓ,�“	ñ= .ð> €Kr'   Úorigrv  c                 ó\   • [        SR                  [        U 5      [        U5      5      5      $ )NzCan't cleanly merge {} with {})r‡  r,   Ú_format_mismatch)r�  rv  s     r%   rŒ  rŒ  Ë  s-   € ÜØ(×/Ñ/Ü˜TÓ"Ô$4°SÓ$9ó	
óð r'   r.   c                 ó8   • SR                  [        U 5      U 5      $ )Nz	{} ({!r}))r,   Útype)r.   s    r%   r�  r�  Ó  s   € Ø×Ñœd 1›g qÓ)Ð)r'   Úsourcec                 ó   • [        0 U 5      $ )zÓ
Return a fresh copy of ``source`` with as little shared state as possible.

Uses `merge_dicts` under the hood, with an empty ``base`` dict; see its
documentation for details on behavior.

.. versionadded:: 1.0
)rj  )r’  s    r%   r  r  ×  s   € ô �r˜6Ó"Ð"r'   Údict_r3   .c                 ó¤   • U n[        U5      nUR                  5       nU(       a$  UR                  S5      nXR;  a  gX%   nU(       a  M$  XB;   a  X$	 gg)zd
Remove key pointed at by ``keypath`` from nested dict ``dict_``, if exists.

.. versionadded:: 1.0
r   N)rJ   rŸ   )r”  r3   r1   r  Úleaf_keyr?   s         r%   r~  r~  ã  s[   € ð €DÜ˜“=€LØ×ÑÓ!€HÞ
Ø×Ñ˜qÓ!ˆØ‹?àØ‰yˆ÷ ˆ,ð ÓØ‰Nð r'   Ú	deletionsc                 óˆ   • UR                  5        H.  u  p#[        U[        5      (       a  [        X   X   5        M,  X	 M0     g)z\
Remove all (nested) keys mentioned in ``deletions``, from ``base``.

.. versionadded:: 1.0
N)rz   r`   ra   rl  )rˆ  r—  r?   rR   s       r%   rl  rl  ö  s9   € ð  —o‘oÖ'‰
ˆÜ�eœT×"Ñ"ô �t‘y )¡.Ö1à’	ò (r'   )2rt  rñ   r   re  Úimportlib.utilr   r   Úos.pathr   r   r   r   Útypingr	   r
   r   r   r   r   r   rÈ   r   Ú
exceptionsr   r   rá   r   Ú	terminalsr   Úutilr   r   Úimportlib.machineryr   ÚImportErrorÚimportlib._bootstrapr   r·   r&   r)   r½   Ú
ValueErrorr‡  rj  ry   rŒ  r�  r  r~  rl  r¯   r'   r%   Ú<module>r£     s|  ðÛ Û Û 	Û Ý +Ý ß .Ñ .Ý ß D× DÑ Då ß @Ý Ý ß ðÝ4ð�cð  ð ¨¨c°3¨h©ô ÷R,ñ R,ôjPˆYô Pôf	˜*ô 	ð8Ø
ˆs�Cˆx‰.ð8Ø#'¨¨S¨¡>ð8à	ˆ#ˆsˆ(�^ô8ðv�vð  Fð Ð/Bô ð*˜ð * 3ô *ð	#�d˜3 ˜8‘nð 	#¨¨c°3¨h©ô 	#ð�$�s˜C�x‘.ð ¨5°°c°©?ð ¸tô ð&�T˜#˜s˜(‘^ð °°S¸#°X±ð À4õ øðE' ó ÷ðús   Á"D ÄDÄD