
    <Bh              	      &   S r SSKJr  SSKrSSK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	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJrJrJr  SSKJ r   SSK!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K0J1r1  SSK2J3r3J4r4  SSK5J6r6J7r7J8r8  SSK9J:r:  SSK;J<r<J=r=J>r>  SSK?J@r@  SSKAJBrBJCrC  SS KDJErE  SS!KFJGrG  \\(" 5       ;  a
  \*" \S" 5        C(C*\"(       a  SS#K
JHrHJIrIJJrJ  SS$KJKrK  SS%K!JLrL  SS&KMJNrN  \" \O5      rP\%" 5       rQSkS' jrRSkS( jrSS) rT " S* S+\35      rU " S, S-\U5      rV " S. S/\U5      rW " S0 S1\W5      rX " S2 S3\W5      rY " S4 S5\W5      rZ " S6 S7\4\U5      r[S8 r\ " S9 S:\5      r] " S; S<\S=9r^ " S> S?\^5      r_ " S@ SA\^5      r` " SB SC\^5      ra " SD SE\^5      rb " SF SG\S=9rc " SH SI\c5      rd " SJ SK\c5      re " SL SM\c5      rf " SN SO\c5      rg " SP SQ5      rh " SR SS\S=9ri " ST SU\i5      rj " SV SW\i5      rk " SX SY\i5      rl " SZ S[\i5      rm " S\ S]5      rn " S^ S_\o5      rpS`rqSarr\" Sb\ R                   Sc\ R                   Sd\ R                   Se3\\-  Sf9rt0 4     SlSg jjru " Sh Si\pS=9rvSmSj jrwg)nz
A generalized application configuration utility.

Features include:
  - lazy eval
  - merges configuration files
  - parameter type validation, with custom validation
  - parameter aliases

Easily extensible to other source formats, e.g. json and ini

    )annotationsN)ABCMetaabstractmethod)defaultdict)Mapping)EnumEnumMetawraps)chain)	getLogger)environ)
expandvars)Path)
IGNORECASEVERBOSEcompile)Template)TYPE_CHECKING)
IndexedSet)
deepfreeze
frozendict)getFreezeConversionMap)register)CommentedMapCommentedSeq)ReaderError)ScannerError   )
CondaErrorCondaMultiError)AttrDictfirstlast)ThisShouldNeverHappenError)TypeCoercionErrortypifytypify_data_structure)unique   )
isiterableprimitive_types)NULL)yaml_round_trip_loadc                    U $ N xs    :lib/python3.13/site-packages/conda/common/configuration.py<lambda>r5   6   s    a    )HashableIterableSequence)Match)Any)	PathsTypec                   ^ [        U 5      (       d  U /n  SR                  U4S jU 5       5      $ ! [         a    [        U /T5      s $ f = f)N
c              3  2   >#    U  H  nT S U 3v   M     g7f)z- Nr1   ).0itempaddings     r4   	<genexpr>pretty_list.<locals>.<genexpr>K   s     C($G9Btf-(s   )r+   join	TypeErrorpretty_list)iterablerB   s    `r4   rG   rG   G   sM    h:0yyC(CCC 0H:w//0s   0 A
	A
c                T   ^ SR                  U4S jU R                  5       5       5      $ )Nr>   c              3  :   >#    U  H  u  pT U S U 3v   M     g7f): Nr1   )r@   keyvaluerB   s      r4   rC   pretty_map.<locals>.<genexpr>Q   s$     UBTJCyRw/BTs   )rE   items)
dictionaryrB   s    `r4   
pretty_maprQ   P   s!    99U*BRBRBTUUUr6   c                R    [        U [        [        45      (       a  [        U 5      $ U $ r0   )
isinstancestrbytesr   )
unexpandeds    r4   expand_environment_variablesrW   T   s$    *sEl++*%%r6   c                      \ rS rSrSrg)ConfigurationError[   r1   N)__name__
__module____qualname____firstlineno____static_attributes__r1   r6   r4   rY   rY   [   s    r6   rY   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )ConfigurationLoadError_   c                4   > Sn[         TU ]  " XB-   4SU0UD6  g )Nz4Unable to load configuration file.
  path: %(path)s
pathsuper__init__)selfrd   message_additionkwargsmessage	__class__s        r4   rg   ConfigurationLoadError.__init__`   s"    J3I$I&Ir6   r1   ) r[   r\   r]   r^   rg   r_   __classcell__rl   s   @r4   ra   ra   _   s    J Jr6   ra   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )ValidationErrore   c                L   > Xl         X l        X0l        [        TU ]  " U40 UD6  g r0   )parameter_nameparameter_valuesourcerf   rg   )rh   rv   rw   rx   msgrj   rl   s         r4   rg   ValidationError.__init__f   s&    ,.''r6   )rv   rw   rx   r0   ro   rq   s   @r4   rs   rs   e   s    ( (r6   rs   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )MultipleKeysErrorm   c                f   > Xl         X l        SU S[        U5       SU S3n[        TU ]  US XS9  g )NzMultiple aliased keys in file z:
z 
Must declare only one. Prefer ''ry   )rx   keysrG   rf   rg   )rh   rx   r   preferred_keyry   rl   s        r4   rg   MultipleKeysError.__init__n   sM    	,VHC4 ! "..;_A? 	
 	f>r6   )r   rx   ro   rq   s   @r4   r|   r|   m   s    ? ?r6   r|   c                  .   ^  \ rS rSr SU 4S jjrSrU =r$ )InvalidTypeErrory   c                v   > X@l         XPl        Uc  SU SU< SU SU S[        U5       3
n[        TU ]  XX6S9  g )N
Parameter  =  declared in z
 has type z.
Valid types:
r   )
wrong_typevalid_typesrG   rf   rg   )rh   rv   rw   rx   r   r   ry   rl   s          r4   rg   InvalidTypeError.__init__z   sc     %&;^,C/B-PVxWablam n!!,[!9 :<  	&Jr6   )r   r   r0   ro   rq   s   @r4   r   r   y   s    TX
K 
Kr6   r   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )CustomValidationError   c                @   > [         TU ]  UUUSU SU< SU SU 3S9  g )Nr   r   r   z is invalid.
r   re   )rh   rv   rw   rx   custom_messagerl   s        r4   rg   CustomValidationError.__init__   s@    ^,C/B-(.(8: 	 	
r6   r1   ro   rq   s   @r4   r   r      s    	
 	
r6   r   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )MultiValidationError   c                .   > [         TU ]  " U/UQ70 UD6  g r0   re   )rh   errorsargsrj   rl   s       r4   rg   MultiValidationError.__init__   s    1$1&1r6   r1   ro   rq   s   @r4   r   r      s    2 2r6   r   c                P    U (       d  g[        U 5      S:X  a  U S   e[        U 5      e)NTr*   r   )lenr   )r   s    r4   raise_errorsr      s(    	V	Qi"6**r6   c                  V    \ rS rSrSrSrSrS r\S 5       r	\S 5       r
\S 5       rS	rg
)ParameterFlag   finaltopbottomc                    U R                    $ r0   rM   rh   s    r4   __str__ParameterFlag.__str__   s    **r6   c                
    X   $ r0   r1   )clsnames     r4   	from_nameParameterFlag.from_name   s
    yr6   c                    U " U5      $ r0   r1   )r   rM   s     r4   
from_valueParameterFlag.from_value   s    5zr6   c                t     UR                  S5      nU R                  U5      $ ! [        [        4 a     g f = f)Nz!#)stripr   
ValueErrorAttributeError)r   strings     r4   from_stringParameterFlag.from_string   s;    	\\$'F>>&))N+ 		s   !$ 77r1   N)r[   r\   r]   r^   r   r   r   r   classmethodr   r   r   r_   r1   r6   r4   r   r      sR    E
CF      r6   r   c                  `    \ rS rSrS rS r\S 5       r\S 5       r\S 5       r	\
S 5       rSrg	)
RawParameter   c                v    Xl         X l         UR                  S5      U l        g ! [         a	    X0l         g f = f)Nzutf-8)rx   rL   decode
_raw_valuer   )rh   rx   rL   	raw_values       r4   rg   RawParameter.__init__   s7    	('..w7DO 	('O	(s   % 88c                *    [        [        U 5      5      $ r0   )rT   varsr   s    r4   __repr__RawParameter.__repr__   s    4:r6   c                    [        5       er0   NotImplementedErrorrh   parameter_objs     r4   rM   RawParameter.value       !##r6   c                    [        5       er0   r   r   s    r4   keyflagRawParameter.keyflag   r   r6   c                    [        5       er0   r   r   s     r4   
valueflagsRawParameter.valueflags   r   r6   c           
     \    U(       a  UVs0 s H  o3U " XX#   5      _M     sn$ [         $ s  snf r0   )	EMPTY_MAPr   rx   from_maprL   s       r4   make_raw_parameters RawParameter.make_raw_parameters   s2    DLMHSV(-88HMM Ns   ))r   rL   rx   N)r[   r\   r]   r^   rg   r   r   rM   r   r   r   r   r_   r1   r6   r4   r   r      s\    ( $ $ $ $ $ $  r6   r   )	metaclassc                  X   ^  \ rS rSrSrS rS rS r\S 5       r	\
U 4S j5       rSrU =r$ )	EnvRawParameter   envvarsc                   ^  [        US5      (       a`  [        T R                  [        5      (       d   e[	        US5      n[        U 4S jS T R                  R                  U5      5       5       5      $ T R                  S   R                  5       $ )Nstring_delimiterc              3     >#    U  H3  nU(       d  M  [        [         R                  TR                  U5      v   M5     g 7fr0   )r   rx   rL   )r@   vrh   s     r4   rC   (EnvRawParameter.value.<locals>.<genexpr>   s4      WA E 6 6!DDWs   >,>c              3  @   #    U  H  oR                  5       v   M     g 7fr0   )r   )r@   vvs     r4   rC   r      s     W/V((**/V   r   )	hasattrrS   r   rT   getattrtuplesplit'_EnvRawParameter__important_split_valuer   rh   r   r   s   `  r4   rM   EnvRawParameter.value   s     ="455doos3333&}6HI Wt/D/DEU/VW   //288::r6   c                X    [        U R                  5      S:  a  [        R                  $ S $ Nr   )r   r   r   r   r   s    r4   r   EnvRawParameter.keyflag   s&    &)$*F*F&G1&L}""VRVVr6   c                    [        US5      (       a6  [        US5      n[        S U R                  R	                  U5      5       5      $ U R
                  S   R                  5       $ )Nr   c              3  &   #    U  H  nS v   M	     g7f)rn   Nr1   )r@   _s     r4   rC   -EnvRawParameter.valueflags.<locals>.<genexpr>   s     M%L%Ls   r   )r   r   r   r   r   r   r   r   s      r4   r   EnvRawParameter.valueflags   sY    ="455&}6HIMT__%:%:;K%LMMM//288::r6   c                8    U R                   R                  S5      $ )Nz
!important)r   r   r   s    r4   __important_split_value'EnvRawParameter.__important_split_value   s    $$\22r6   c           	     2  > UR                  5        S3n[        R                  " 5       VVs0 s H?  u  p4UR                  U5      (       d  M  UR	                  USS5      R                  5       U_MA     nnn[        TU ]  [        R                  U5      $ s  snnf )Nr   rn   r*   )
upperr   rO   
startswithreplacelowerrf   r   r   rx   )r   appnamekeystartkr   raw_envrl   s         r4   r   #EnvRawParameter.make_raw_parameters   s    mmo&a(  
'||H% 2AIIhA&,,.1' 	 

 w*?+A+A7KK
s   B&Br1   )r[   r\   r]   r^   rx   rM   r   r   propertyr   r   r   r_   rp   rq   s   @r4   r   r      sB    F;W; 3 3 L Lr6   r   c                  H   ^  \ rS rSrSrS rS rS r\U 4S j5       r	Sr
U =r$ )ArgParseRawParameteri  cmd_linec           	     >   [        U R                  5      (       ao  / n[        [        U R                  5      5       H@  nUR	                  [        U R                  U R                  U R                  U   5      5        MB     [        U5      $ [        U R                  5      $ r0   )
r+   r   ranger   appendr  rx   rL   r   r   )rh   r   children_valuesis       r4   rM   ArgParseRawParameter.value
  sx     doo&& O3t/0&&(dhhPQ@RS 1 ))doo..r6   c                    g r0   r1   r   s    r4   r   ArgParseRawParameter.keyflag      r6   c                4    [        U[        5      (       a  S $ S$ Nr1   )rS   PrimitiveLoadedParameterr   s     r4   r   ArgParseRawParameter.valueflags  s    !-1IJJtRPRRr6   c                @   > [         TU ]  [        R                  U5      $ r0   )rf   r   r  rx   )r   args_from_argparserl   s     r4   r   (ArgParseRawParameter.make_raw_parameters  s!    w* '');
 	
r6   r1   )r[   r\   r]   r^   rx   rM   r   r   r   r   r_   rp   rq   s   @r4   r  r    s,    F/S 
 
r6   r  c                     ^  \ rS rSrU 4S jrS rS rS r\S 5       r	\
S 5       r\S 5       r\S	 5       r\
S
 5       r\
S 5       rSrU =r$ )YamlRawParameteri$  c           
     l  > X@l         [        T
U ]	  XU5        [        U R                  [
        5      (       a  U R                  U R                  5      n[        S U5       5      U l        / n[        [        U R                  5      5       HC  nUR                  [        U R                  U R                  U R                  U   XW   5      5        ME     [        U5      U l        g [        U R                  [         5      (       a  U R#                  U R                  5      nUR%                  5       VV	s0 s H   u  pU	c  M
  U[&        R)                  U	5      _M"     sn	nU l        0 nU R                  R%                  5        H+  u  p[        U R                  U R                  XU   5      Xh'   M-     [+        U5      U l        g [        U R                  [,        5      (       a  S U l        U R                  U l        g [/        [1        U R                  5      U R                  [2        R4                  S9  [7        5       es  sn	nf )Nc              3  L   #    U  H  n[         R                  U5      v   M     g 7fr0   )r   r   )r@   ss     r4   rC   ,YamlRawParameter.__init__.<locals>.<genexpr>-  s!      &6D))!,,ns   "$)file)_key_commentrf   rg   rS   r   r   _get_yaml_list_commentsr   _value_flagsr  r   r  r  rx   rL   _valuer   _get_yaml_map_commentsrO   r   r   r   r,   printtypesysstderrr%   )rh   rx   rL   r   key_commentvalue_commentsr  r	  r   r   rl   s             r4   rg   YamlRawParameter.__init__'  s   'i0doo|44!99$//JN % &6D& !D !O3t/0&&$TXXtq/A>CT 1  0DK66!88IN +002!2DA 0=,,Q//2!D
 !O--/%5KK1Q.?&" 0 %_5DK99 $D//DK$t'szzJ,..!!s   ,	H09H0c                    U R                   $ r0   r  r   s     r4   rM   YamlRawParameter.valueL      {{r6   c                @    [         R                  U R                  5      $ r0   )r   r   r  r   s    r4   r   YamlRawParameter.keyflagO  s    (():):;;r6   c                    U R                   $ r0   )r  r   s     r4   r   YamlRawParameter.valueflagsR  s       r6   c                     U R                   R                  U   S   R                  R                  5       $ ! [        [
        4 a     g f = fr   carO   rM   r   r   KeyError)commented_dictrL   s     r4   _get_yaml_key_comment&YamlRawParameter._get_yaml_key_commentU  sI    	!$$**3/288>>@@) 		s   36 A	A	c                &   / n[        [        U5      5       H;  n UR                  U R                  UR                  R
                  U   5      5        M=     [        U5      $ ! [        [        [        [        4 a    UR                  S 5         Mx  f = fr0   )r  r   r  _get_yaml_list_comment_itemr2  rO   r   
IndexErrorr3  rF   r   )r   rM   list_commentsr	  s       r4   r  (YamlRawParameter._get_yaml_list_comments\  s}    
 s5z"A+$$S%D%DUXX^^TUEV%WX #
 ]## #J)D +$$T*+s   7A!!+BBc                    U S   (       a&  U S   R                   R                  5       =(       d    S $ U S   S   R                   R                  5       =(       d    S $ )Nr   r*   )rM   r   )rA   s    r4   r8  ,YamlRawParameter._get_yaml_list_comment_itemi  sI     77==&&(0D071:##))+3t3r6   c                    0 nU  HC  n U R                   R                  U   S   R                  R                  5       =(       d    S X'   ME     U$ ! [        [
        4 a    S X'    M`  f = fr   r1  )rM   map_commentsrL   s      r4   r   'YamlRawParameter._get_yaml_map_commentsr  sj    C)$)HHNN3$7$:$@$@$F$F$H$PD! 
  #H- )$(!)s   ?AA&%A&c                |    U(       a+  UVs0 s H  nX0" XX#   U R                  X#5      5      _M      sn$ [        $ s  snf r0   )r5  r   r   s       r4   r   $YamlRawParameter.make_raw_parameters|  sX    
 $	 $C S0I0I(0X  $	  s   %9c           	     b   [        U5       n [        U5      nU R                  X5      =(       d    [        sS S S 5        $ ! [         a1  nUR                  n[	        USUR
                  UR                  S9eS nAf[         a  n[	        USUR                  S9eS nAff = f! , (       d  f       g = f)Nz:  reason: invalid yaml at line %(line)s, column %(column)s)linecolumnz/  reason: invalid yaml at position %(position)s)position)openr.   r   problem_markra   rD  rE  r   rF  r   r   )r   filepathfhyaml_objerrmarks         r4   make_raw_parameters_from_file.YamlRawParameter.make_raw_parameters_from_file  s    (^r/3 **8>K)# ^   '',P;;	   ,E \\  ^s9   B A B  
B
,A66BBBB  
B.)r  r  r  )r[   r\   r]   r^   rg   rM   r   r   staticmethodr5  r   r  r8  r   r   rN  r_   rp   rq   s   @r4   r  r  $  s    #/J<!   
$ 
$ 4 4     L Lr6   r  c                  >   ^  \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )DefaultValueRawParameteri  zFWraps a default value as a RawParameter, for usage in ParameterLoader.c           	     :  > [         T
U ]  XU5        [        U R                  [        5      (       aY  0 nU R                  R                  5        H(  u  pV[        U R                  U R                  U5      XE'   M*     [        U5      U l
        g [        U R                  5      (       au  / n[        [        U R                  5      5       H@  nUR                  [        U R                  U R                  U R                  U   5      5        MB     [        U5      U l
        g [        U R                  [         5      (       ay  U R                  U l
        [#        U R                  5      R                  5        H@  u  pU R                  R%                  U[        U R                  U R                  U	5      5        MB     g [        U R                  [&        5      (       a  U R                  U l
        g [        U R                  [(        5      (       a  U R                  U l
        g [+        5       er0   )rf   rg   rS   r   r   rO   rR  rx   rL   r   r  r+   r  r   r  r   ConfigurationObjectr   __setattr__r   r,   r%   )rh   rx   rL   r   r  r   r   r	  	attr_name
attr_valuerl   s             r4   rg   !DefaultValueRawParameter.__init__  sv   i0doow// O--/%=dkk488UV%W" 0$_5DK(( O3t/0&&,T[[$((DOOTUDVW 1  0DK)<==//DK)-doo)>)D)D)F%	'',T[[$((JO *G
 ..//DK99//DK,..r6   c                    U R                   $ r0   r)  r   s     r4   rM   DefaultValueRawParameter.value  r+  r6   c                    g r0   r1   r   s    r4   r    DefaultValueRawParameter.keyflag  r  r6   c                ^   [        U R                  [        5      (       a
  [        5       $ [	        U R                  5      (       a  g[        U R                  [
        5      (       a  g [        U R                  [        5      (       a  g [        U R                  [        5      (       a  g [        5       er  )	rS   r   r   r   r+   rT  r   r,   r%   r   s     r4   r   #DefaultValueRawParameter.valueflags  ss    doow//<(()<==..99,..r6   r)  )r[   r\   r]   r^   __doc__rg   rM   r   r   r_   rp   rq   s   @r4   rR  rR    s    P/:/ /r6   rR  c                      \ rS rSrSrSrSS jrS rS rSS jr	S r
\S 5       rS	 r\SS
 j5       r\S 5       r\S 5       rSrg)LoadedParameteri  Nc                @    Xl         X l        X0l        X@l        XPl        g)a  
Represents a Parameter that has been loaded with configuration value.

Args:
    name (str): name of the loaded parameter
    value (LoadedParameter or primitive): the value of the loaded parameter
    key_flag (ParameterFlag or None): priority flag for the parameter itself
    value_flags (Any or None): priority flags for the parameter values
    validation (callable): Given a parameter value as input, return a boolean indicating
        validity, or alternately return a string describing an invalid value.
N)_namerM   key_flagvalue_flags_validation)rh   r   rM   rd  re  
validations         r4   rg   LoadedParameter.__init__  s     

 &%r6   c                d    [        U5      [        U 5      L a  U R                  UR                  :H  $ gNFr"  rM   rh   others     r4   __eq__LoadedParameter.__eq__  (    ;$t*$::,,r6   c                ,    [        U R                  5      $ r0   hashrM   r   s    r4   __hash__LoadedParameter.__hash__      DJJr6   c           
        / n[        X R                  5      (       dF  UR                  [        U R                  X#[        U R                  5      U R                  5      5        U$ U R                  bx  U R                  U5      nUSL a'  UR                  [        U R                  X#5      5        U$ [        U[        5      (       a&  UR                  [        U R                  X#U5      5        U$ )z
Validate a LoadedParameter typed value.

Args:
    instance (Configuration): the instance object used to create the LoadedParameter.
    typed_value (Any): typed value to validate.
    source (str): string description for the source of the typed_value.
F)rS   _typer  r   rc  r"  rM   rf  rs   rT   r   )rh   instancetyped_valuerx   r   results         r4   collect_errorsLoadedParameter.collect_errors  s     +zz22MM JJT$**5Etzz  )%%k2Fodjj+NO
 	 FC(()$**k6R r6   c                   [        U R                  [        5      (       a:  [        U R                  5      " S U R                  R	                  5       5       5      nO[        U R                  5      (       a,  [        U R                  5      " S U R                  5       5      nO[        U R                  [        5      (       ax  [        U R                  5      R	                  5        HE  u  p#[        U[        5      (       d  M  U R                  R                  X#R                  5       5        MG     U R                  $ [        U R                  5      nXl        U $ )z^
Recursively expands any environment values in the Loaded Parameter.

Returns LoadedParameter
c              3  H   #    U  H  u  pXR                  5       4v   M     g 7fr0   expand)r@   r   r   s      r4   rC   )LoadedParameter.expand.<locals>.<genexpr>  s     (XEWTQ!XXZEWs    "c              3  @   #    U  H  oR                  5       v   M     g 7fr0   r  )r@   r   s     r4   rC   r    s     (HZZr   )rS   rM   r   r"  rO   r+   rT  r   ra  rU  r  rW   )rh   	new_valuerV  rW  s       r4   r  LoadedParameter.expand  s     djj'**TZZ((XTZZEUEUEW(XXI

##TZZ((HTZZ(HHI

$788)-djj)9)?)?)A%	j/::JJ**96G6G6IJ *B ::4TZZ@I
r6   c                    [        5       e)z
Recursively merges matches into one LoadedParameter.

Args:
    matches (List<LoadedParameter>): list of matches of this parameter.

Returns: LoadedParameter
r   )rh   matchess     r4   mergeLoadedParameter.merge#  s     "##r6   c                   U R                   n [        R                  U R                  X5      $ ! [         a  n[        U5      n[        U[        5      (       aR  SR                  [        SR                  UR                  R                  5       5      5      nUSU R                   SU 3-  n[        U R                  UR                  X5      eSnAff = f)z
Recursively types a LoadedParameter.

Args:
    source (str): string describing the source of the LoadedParameter.

Returns: a primitive, sequence, or map representing the typed value.
, '{}'
Valid choices for rK   N)_element_typera  _typify_data_structurerM   r&   rT   
issubclassr   rE   mapformat__members__valuesrc  r   )rh   rx   element_typeery   choicess         r4   r'   LoadedParameter.typify/  s     ))	J"99

F  ! 	Ja&C,--))|'?'?'F'F'HI -djj\G9EE'

AGGVII	Js   . 
CBCCc                V  ^ [        U [        5      (       a(  [        U 5      " U4S jU R                  5       5       5      $ [	        U 5      (       a  [        U 5      " U4S jU 5       5      $ [        U [
        5      (       a[  [        U 5      R                  5        H<  u  p4[        U[        5      (       d  M  U R                  X4R                  T5      5        M>     U $ [        U [        5      (       a2  [        U[        5      (       a  [        U[        5      (       a  U" U 5      $ [        X5      $ )Nc              3  L   >#    U  H  u  pXR                  T5      4v   M     g 7fr0   r'   )r@   r   r   rx   s      r4   rC   9LoadedParameter._typify_data_structure.<locals>.<genexpr>I  s     O88F#34   !$c              3  D   >#    U  H  oR                  T5      v   M     g 7fr0   r  )r@   r   rx   s     r4   rC   r  K  s     ?Axx//s    )rS   r   r"  rO   r+   rT  r   ra  rU  r'   rT   r  )rM   rx   	type_hintrV  rW  s    `   r4   r  &LoadedParameter._typify_data_structureF  s    eW%%;OOOO;????233)-e):):)<%	j/::%%i1B1B61JK *= Luc""9d++9c**
 U##%++r6   c                :    U R                   [        R                  L $ r0   )rd  r   r   )loaded_parameters    r4   _match_key_is_important'LoadedParameter._match_key_is_important]  s    ((M,?,???r6   c                H    [        [        U 5      S S S9nUc  U $ U S US-    $ )Nc                2    [         R                  U S   5      $ )Nr*   )ra  r  r2   s    r4   r5   :LoadedParameter._first_important_matches.<locals>.<lambda>e  s    o==adCr6   c                    U S   $ )Nr   r1   r2   s    r4   r5   r  f  s    AaDr6   )applyr*   )r#   	enumerate)r  idxs     r4   _first_important_matches(LoadedParameter._first_important_matchesa  s6    gC 

 +w=79S1W+==r6   )rc  rf  rd  rM   re  r0   
<<merged>>)r[   r\   r]   r^   rx  r  rg   rn  rt  r|  r  r   r  r'   rP  r  r  r  r_   r1   r6   r4   ra  ra    s    E M&$
 4, 	$ 	$J. , ,, @ @ > >r6   ra  c                  D   ^  \ rS rSrSr SU 4S jjrS rS rS rSr	U =r
$ )	r  ik  z
LoadedParameter type that holds a single python primitive value.

The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
python 2 has long and unicode types.
c                @   > X l         X l        [        TU ]  XXEU5        g)z
Args:
    element_type (type or tuple[type]): Type-validation of parameter's value.
    value (primitive value): primitive python value.
N)rx  r  rf   rg   )rh   r   r  rM   rd  re  rg  rl   s          r4   rg   !PrimitiveLoadedParameter.__init__s  s!     "
)hZHr6   c                d    [        U5      [        U 5      L a  U R                  UR                  :H  $ grj  rk  rl  s     r4   rn  PrimitiveLoadedParameter.__eq__  rp  r6   c                ,    [        U R                  5      $ r0   rr  r   s    r4   rt  !PrimitiveLoadedParameter.__hash__  rv  r6   c                t    [        U[        R                  S S9nUb  U$ [        US S S9nUb  U$ [	        5       e)N)defaultc                
    U S L$ r0   r1   r2   s    r4   r5   0PrimitiveLoadedParameter.merge.<locals>.<lambda>  s    Qd]r6   )r#   ra  r  r$   r%   )rh   r  important_match
last_matchs       r4   r  PrimitiveLoadedParameter.merge  sK    _<<d
 &""'#:DI
!(**r6   r  rx  r0   )r[   r\   r]   r^   r_  rg   rn  rt  r  r_   rp   rq   s   @r4   r  r  k  s)     LP
I
 
+ 
+r6   r  c                  P   ^  \ rS rSrSr\r SU 4S jjrSU 4S jjrS	S jr	Sr
U =r$ )
MapLoadedParameteri  zFLoadedParameter type that holds a map (i.e. dict) of LoadedParameters.c                4   > X0l         [        TU ]	  XXEU5        g)z
Args:
    value (Mapping): Map of string keys to LoadedParameter values.
    element_type (Parameter): The Parameter type that is held in value.
    value_flags (Mapping): Map of priority value flags.
Nr  rf   rg   rh   r   rM   r  rd  re  rg  rl   s          r4   rg   MapLoadedParameter.__init__       *hZHr6   c                  > [         TU ]  XU R                  5      n[        U R                  [        5      (       aG  U R                  R                  5        H)  u  pVUR                  UR                  XU   U5      5        M+     U$ r0   )rf   r|  rM   rS   r   rO   extendrh   ry  rz  rx   r   rL   rM   rl   s          r4   r|  !MapLoadedParameter.collect_errors  sg    'tzzJ djj'**"jj..0
e228=MvVW 1r6   c           	        [         R                  U5      nU H  n[        UR                  [        5      (       a  M$  [        U R                  UR                  UR                  UR                  R                  R                  U R                  R                  5      e   [        U5      VVVs0 s HX  nUR                  R                  5         H6  u  p4UR                  R                  U5      [        R                   :X  d  M4  X4_M8     MZ     nnnn0 nU HG  nUR                  R                  5        H&  u  p4UR#                  U/ 5      R%                  U5        M(     MI     UR                  5       VVs0 s H  u  p7X7S   R'                  U5      _M     nnn[)        0 UEUE5      n	[+        U R,                  U	U R.                  U R0                  U R                  U R2                  S9$ s  snnnf s  snnf Nr   rg  )ra  r  rS   rM   r   r   r   rx   rl   r[   rx  reversedrO   re  getr   r   
setdefaultr  r  r   r  rc  r  rd  rf  
rh   
parameters	parameterrL   rM   	final_mapgrouped_mapr  
merged_mapmerged_values
             r4   r  MapLoadedParameter.merge  s    %==jI
 $Iioow77&IIOO$$OO--66JJ''  $ &j1
1	'oo335
$$((-1D1DD CJ5 1 	 
 #I'oo335
&&sB/66u= 6 $ =H<M<M<O
<O[SC((<O 	 

 ""=Z"=9"=> "JJMM''
 	
+

s   +AG! 
G!/ G(r  r0   r  )r  zSequence[MapLoadedParameter]returnr  )r[   r\   r]   r^   r_  r   rx  rg   r|  r  r_   rp   rq   s   @r4   r  r    s'    PE LP
I.
 .
r6   r  c                  L   ^  \ rS rSrSr\r SU 4S jjrSU 4S jjrS r	Sr
U =r$ )	SequenceLoadedParameteri  zKLoadedParameter type that holds a sequence (i.e. list) of LoadedParameters.c                4   > X0l         [        TU ]	  XXEU5        g)z
Args:
    value (Sequence): Sequence of LoadedParameter values.
    element_type (Parameter): The Parameter type that is held in the sequence.
    value_flags (Sequence): Sequence of priority value_flags.
Nr  r  s          r4   rg    SequenceLoadedParameter.__init__  r  r6   c                   > [         TU ]  XU R                  5      n[        U R                  5       H)  u  pVUR	                  UR                  XU   U5      5        M+     U$ r0   )rf   r|  rM   r  r  )rh   ry  rz  rx   r   r  elementrl   s          r4   r|  &SequenceLoadedParameter.collect_errors  sP    'tzzJ%djj1LCMM'00s;KVTU 2r6   c           	     B  ^ [        S [        R                  U5      5       5      nU He  u  p4[        U[         5      (       a  M  [	        U R
                  UUR                  UR                  R                  U R                  R                  5      e   S m[        R                  " U4S jU5       5      n[        [        R                  " U4S j[        U5      5       5      5      n[        R                  " S [        U5      5       5      n[        [        / UQUQ75      5      n[        [        / [        U5      Q[        U5      Q75      5      n	[        [        U	5      5      n
[        U R                  U
U R                   U R"                  U R$                  U R&                  S9$ )Nc              3  <   #    U  H  nXR                   4v   M     g 7fr0   r   )r@   matchs     r4   rC   0SequenceLoadedParameter.merge.<locals>.<genexpr>  s      ,
J KK Js   c                z   ^ U (       a2  [        U4S j[        U R                  U R                  5      5       5      $ S$ )Nc              3  :   >#    U  H  u  pUTL d  M  Uv   M     g 7fr0   r1   )r@   rD  flagmarkers      r4   rC   JSequenceLoadedParameter.merge.<locals>.get_marked_lines.<locals>.<genexpr>  s#      &I
v~ D&Is   	r1   )r   ziprM   re  )r  r  s    `r4   get_marked_lines7SequenceLoadedParameter.merge.<locals>.get_marked_lines
  s?       &)%++u7H7H&I  r6   c              3  V   >#    U  H  u  pT" U[         R                  5      v   M      g 7fr0   )r   r   )r@   mr   r  s      r4   rC   r    s*      (
3 Q 1 1223   &)c              3  V   >#    U  H  u  pT" U[         R                  5      v   M      g 7fr0   )r   r   )r@   r  r   r  s      r4   rC   r    s*        EHE !(<(<== Er  c              3  *   #    U  H	  u  pUv   M     g 7fr0   r1   )r@   r   r   s      r4   rC   r  %  s      (
?$!A?s   r  )r   ra  r  rS   r   r   rx   rl   r[   rx  r   from_iterabler  r)   r  rc  r  rd  re  rf  )rh   r  relevant_matches_and_valuesr  rM   	top_linesbottom_lines	all_linestop_dedupedbottom_dedupedmerged_valuesr  s              @r4   r  SequenceLoadedParameter.merge  s    ', ,
(AA'J,
 '
# 8LEeU++&IILLOO,,JJ''  8		 '' (
3(
 
	    ()D E  
 '' (
"#>?(
 
	
 F#;Y#;#;<= DXl+Dh{.CDE
 h~67&JJMM''
 	
r6   r  r0   r  )r[   r\   r]   r^   r_  r   rx  rg   r|  r  r_   rp   rq   s   @r4   r  r    s)    UE LP
IF
 F
r6   r  c                  X   ^  \ rS rSrSr\r SU 4S jjrSU 4S jjr    S	S jr	Sr
U =r$ )
ObjectLoadedParameteri@  zLLoadedParameter type that holds a mapping (i.e. object) of LoadedParameters.c                4   > X0l         [        TU ]	  XXEU5        g)z
Args:
    value (Sequence): Object with LoadedParameter fields.
    element_type (object): The Parameter type that is held in the sequence.
    value_flags (Sequence): Sequence of priority value_flags.
Nr  r  s          r4   rg   ObjectLoadedParameter.__init__E  r  r6   c                H  > [         TU ]  XU R                  5      n[        U R                  [        5      (       ag  [        U R                  5      R                  5        H@  u  pV[        U[        5      (       d  M  UR                  UR                  XU   U5      5        MB     U$ r0   )	rf   r|  rM   rS   rT  r   rO   ra  r  r  s          r4   r|  $ObjectLoadedParameter.collect_errorsQ  s    'tzzJ djj"566"4::.446
e_55MM,,X37GP 7
 r6   c           
        [         R                  U5      n[        U5      VVVs0 s Hx  n[        UR                  5      R                  5         HM  u  p4[        U[         5      (       d  M  UR                  R                  U5      [        R                  :X  d  MK  X4_MO     Mz     nnnn0 nU HP  n[        UR                  5      R                  5        H&  u  p4UR                  U/ 5      R                  U5        M(     MR     UR                  5       VVs0 s H  u  p7X7S   R                  U5      _M     nnn[        R                  " U R                   5      n	0 UEUER                  5        H  u  p4U	R#                  X45        M     [%        U R&                  U	U R                   U R(                  U R                  U R*                  S9$ s  snnnf s  snnf r  )ra  r  r  r   rM   rO   rS   re  r  r   r   r  r  r  copydeepcopyr  rU  r  rc  rd  rf  r  s
             r4   r  ObjectLoadedParameter.merge]  s   
 %==jI
 &j1
1	"9??399;
5/2	 
 ))--c2m6I6II CJ; 1 	 
 #I"9??399;
&&sB/66u= < $ =H<M<M<O
<O[SC((<O 	 

 }}T%7%785Z595;;=JC$$S0 > %JJMM''
 	
5
 
s   AG*+G
G G	r  r0   r  )r  zSequence[ObjectLoadedParameter]r  r  )r[   r\   r]   r^   r_  objectrx  rg   r|  r  r_   rp   rq   s   @r4   r  r  @  s7    VE LP
I
*
9*
	*
 *
r6   r  c                      \ rS rSrSrS rSrg)rT  i  zIDummy class to mark whether a Python object has config parameters within.c                V    0 n[        U 5      R                  5        H	  u  p#X1U'   M     U$ )z6
Return a serializable object with defaults filled in
)r   rO   )rh   serializableattrrM   s       r4   to_jsonConfigurationObject.to_json  s2     :++-KD!& . r6   r1   N)r[   r\   r]   r^   r_  r
  r_   r1   r6   r4   rT  rT    s
    S	r6   rT  c                  R    \ rS rSrSrSrS	S jr\S 5       rS r	\
S 5       rS rSrg)
	Parameteri  Nc                    Xl         X l        g)a  
The Parameter class represents an unloaded configuration parameter, holding type, default
and validation information until the parameter is loaded with a configuration.

Args:
    default (Any): the typed, python representation default value given if the Parameter
        is not found in a Configuration.
    validation (callable): Given a parameter value as input, return a boolean indicating
        validity, or alternately return a string describing an invalid value.
N_defaultrf  )rh   r  rg  s      r4   rg   Parameter.__init__  s      %r6   c                T    [        SSU R                  5      nU R                  SU5      $ )zGReturns a DefaultValueRawParameter that wraps the actual default value.r  )rR  r  load)rh   wrapped_defaults     r4   r  Parameter.default  s'     39iWyyO44r6   c                    / n/ nUR                   R                  5        HK  u  pg[        R                  XU5      u  pUb  UR	                  U5        U	(       d  M:  UR	                  U	5        MM     XE4$ )aa  
Finds all matches of a Parameter in a Configuration instance

Args:
    name (str): canonical name of the parameter to search for
    names (tuple(str)): alternative aliases of the parameter
    instance (Configuration): instance of the configuration to search within

Returns (List(RawParameter)): matches of the parameter found in the configuration.
)raw_datarO   ParameterLoader!raw_parameters_from_single_sourcer  )
rh   r   namesry  r  multikey_exceptionsrI  raw_parametersr  errors
             r4   get_all_matchesParameter.get_all_matches  su      (0(9(9(?(?(A$H*LL^LE  u%u#**51 )B ++r6   c                    [        5       e)z
Loads a Parameter with the value in a RawParameter.

Args:
    name (str): name of the parameter to pass through
    match (RawParameter): the value of the RawParameter match

Returns a LoadedParameter
r   rh   r   r  s      r4   r  Parameter.load  s     "##r6   c                R   U R                   n [        X45      $ ! [         a  n[        U5      n[	        U[
        5      (       aH  SR                  [        SR                  UR                  R                  5       5      5      nUSU SU 3-  n[        XR                  X&5      eS nAff = f)Nr  r  r  rK   )r  r(   r&   rT   r  r   rE   r  r  r  r  r   rM   )rh   r   rx   rM   r  r  ry   r  s           r4   r'   Parameter.typify  s    ))		D(==  	Da&C,--))|'?'?'F'F'HI -dV2gY??'ggvCC	Ds   
 
B&A>B!!B&r  r0   )r[   r\   r]   r^   rx  r  rg   r  r  r  r   r  r'   r_   r1   r6   r4   r  r    sF    E M& 5 5
,. 
$ 
$Dr6   r  c                  6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )PrimitiveParameteri  z
Parameter type for a Configuration class that holds a single python primitive value.

The python primitive types are str, int, float, complex, bool, and NoneType. In addition,
python 2 has long and unicode types.
c                p   > Uc  [        U5      OUU l        U R                  U l        [        TU ]  X5        g)z
Args:
    default (primitive value): default value if the Parameter is not found.
    element_type (type or tuple[type]): Type-validation of parameter's value. If None,
        type(default) is used.
N)r"  rx  r  rf   rg   )rh   r  r  rg  rl   s       r4   rg   PrimitiveParameter.__init__  s0     '3&:T']
!ZZ-r6   c           	         [        UU R                  UR                  U R                  5      UR	                  5       UR                  U R                  5      U R                  S9$ Nr  )r  rx  rM   r  r   r   rf  r!  s      r4   r  PrimitiveParameter.load  sQ    'JJKK**+MMOT//0''
 	
r6   r  NN)	r[   r\   r]   r^   r_  rg   r  r_   rp   rq   s   @r4   r&  r&    s    	.
 
r6   r&  c                  T   ^  \ rS rSrSr\r\" 5       S4U 4S jjrU 4S jrS r	Sr
U =r$ )MapParameteri  zTParameter type for a Configuration class that holds a map (i.e. dict) of Parameters.Nc                v   > Xl         U=(       a    [        U5      =(       d
    [        5       n[        TU ]  X#S9  g)z
Args:
    element_type (Parameter): The Parameter type held in the MapParameter.
    default (Mapping):  The parameter's default value. If None, will be an empty dict.
r  N)r  r   rf   rg   rh   r  r  rg  rl   s       r4   rg   MapParameter.__init__	  s1     *1j1AZ\8r6   c                P   > [         TU ]  XU5      u  pE[        S U5       5      nXE4$ )Nc              3  B   #    U  H  oR                   c  M  Uv   M     g 7fr0   r   r@   r  s     r4   rC   /MapParameter.get_all_matches.<locals>.<genexpr>       G7all7   	rf   r  r   rh   r   r  ry  r  
exceptionsrl   s         r4   r  MapParameter.get_all_matches  0    #g5d8LG7GG""r6   c           	        UR                  U R                  5      nUc@  [        U[        5       U R                  UR	                  5       [        5       U R
                  S9$ [        U[        5      (       d@  [        XUR                  UR                  R                  U R                  R                  5      e0 nUR                  U R                  5      R                  5        H$  u  pVU R                  R                  X5      nXtU'   M&     [        U[        U5      U R                  UR	                  5       UR                  U R                  5      U R
                  S9$ r*  )rM   r  r  r   r   rf  rS   r   r   rx   rl   r[   rx  rO   r  r   )rh   r   r  rM   
loaded_maprL   child_valueloaded_child_values           r4   r  MapParameter.load  s!   D../=%""++  %))"U\\5??+C+CTZZEXEX  
 %D,>,> ? E E GC!%!3!3!8!8!K0sO !H "z"MMOT//0''
 	
r6   r  )r[   r\   r]   r^   r_  r   rx  rg   r  r  r_   rp   rq   s   @r4   r.  r.    s&    ^E-7\d 9#
 
r6   r.  c                  F   ^  \ rS rSrSr\rSU 4S jjrU 4S jrS r	Sr
U =r$ )SequenceParameteri9  zYParameter type for a Configuration class that holds a sequence (i.e. list) of Parameters.c                <   > Xl         X@l        [        TU ]  X#5        g)z
Args:
    element_type (Parameter): The Parameter type that is held in the sequence.
    default (Sequence): default value, empty tuple if not given.
    string_delimiter (str): separation string used to parse string into sequence.
N)r  r   rf   rg   )rh   r  r  rg  r   rl   s        r4   rg   SequenceParameter.__init__>  s     * 0-r6   c                P   > [         TU ]  XU5      u  pE[        S U5       5      nXE4$ )Nc              3  B   #    U  H  oR                   c  M  Uv   M     g 7fr0   r4  r5  s     r4   rC   4SequenceParameter.get_all_matches.<locals>.<genexpr>N  r7  r8  r9  r:  s         r4   r  !SequenceParameter.get_all_matchesI  s2     $g5d8LG7GG""r6   c           	     <   UR                  U 5      nUc0  [        USU R                  UR                  5       SU R                  S9$ [        U5      (       d@  [        XUR                  UR                  R                  U R                  R                  5      e/ nU H/  nU R                  R                  X5      nUR                  U5        M1     [        U[        U5      U R                  UR                  5       UR                  U R                  5      U R                  S9$ )Nr1   r  )rM   r  r  r   rf  r+   r   rx   rl   r[   rx  r  r  r   r   )rh   r   r  rM   loaded_sequencer@  rA  s          r4   r  SequenceParameter.loadQ  s   D!=*""++  %  "U\\5??+C+CTZZEXEX   K!%!3!3!8!8!K""#56 ! '/"MMOT//0''
 	
r6   )r  r   )r1   N,)r[   r\   r]   r^   r_  r   rx  rg   r  r  r_   rp   rq   s   @r4   rD  rD  9  s    cE	.#
 
r6   rD  c                  T   ^  \ rS rSrSr\r\" 5       S4U 4S jjrU 4S jr	S r
SrU =r$ )ObjectParameteriq  zTParameter type for a Configuration class that holds an object with Parameter fields.Nc                0   > Xl         [        TU ]	  X#5        g)z
Args:
    element_type (object): The object type with parameter fields held in ObjectParameter.
    default (Sequence): default value, empty tuple if not given.
Nr  r0  s       r4   rg   ObjectParameter.__init__v  s     *-r6   c                P   > [         TU ]  XU5      u  pE[        S U5       5      nXE4$ )Nc              3  B   #    U  H  oR                   c  M  Uv   M     g 7fr0   r4  r5  s     r4   rC   2ObjectParameter.get_all_matches.<locals>.<genexpr>  r7  r8  r9  r:  s         r4   r  ObjectParameter.get_all_matches  r=  r6   c           	     
   UR                  U R                  5      nUc0  [        US U R                  UR                  5       S U R                  S9$ [        U[        [        45      (       d@  [        XUR                  UR                  R                  U R                  R                  5      e[        U[        5      (       a  [        U5      n[        U R                  5      R                  5       VVs0 s H  u  pE[        U[        5      (       d  M  XE_M      nnn0 nUR                  5        H?  u  pEUR!                  U5      =n(       a  UR#                  X5      n	OUR$                  n	XU'   MA     [&        R(                  " U R                  5      n
UR                  5        H  u  pKU
R+                  XK5        M     [        UU
U R                  UR                  5       UR-                  U R                  5      U R                  S9$ s  snnf r*  )rM   r  r  r   rf  rS   r   rT  r   rx   rl   r[   rx  r   rO   r  r  r  r  r  r  rU  r   )rh   r   r  rM   rV  parameter_typeobject_parameter_attrsloaded_attrsraw_child_valuerA  object_copyloaded_child_parameters               r4   r  ObjectParameter.load  s   D../=(""++  %'+>!?@@"U\\5??+C+CTZZEXEX 
 e011KE .2$2D2D-E-K-K-M"
-M)	.)4 &I%-M 	 "
 )?)E)E)G%I"'))I"666%3%8%8%O"%3%;%;"&8# *H mmD$6$671=1C1C1E-I##IF 2F %MMOT//0''
 	
)"
s   /G?G?r  )r[   r\   r]   r^   r_  r  rx  rT  rg   r  r  r_   rp   rq   s   @r4   rP  rP  q  s'    ^E-@-Bt .#0
 0
r6   rP  c                  d    \ rS rSrSrSS jrS r\S 5       r\S 5       r	S r
S r\S	 5       rS
rg)r  i  ze
ParameterLoader class contains the top level logic needed to load a parameter from start to
finish.
c                D    SU l         SU l        Xl        X l        X0l        g)z
Args:
    parameter_type (Parameter): the type of Parameter that is stored in the loader.
    aliases (tuple(str)): alternative aliases for the Parameter
    expandvars (bool): whether or not to recursively expand environmental variables.
N)rc  _namesr"  aliases_expandvars)rh   rX  rb  r   s       r4   rg   ParameterLoader.__init__  s"     
"	%r6   c                j    Xl         [        S [        U R                  U45      5       5      nX l        U$ )Nc              3  $   #    U  H  ov   M     g 7fr0   r1   )r@   r3   s     r4   rC   ,ParameterLoader._set_name.<locals>.<genexpr>  s     C&B1&Bs   )rc  	frozensetr   rb  ra  )rh   r   ra  s      r4   	_set_nameParameterLoader._set_name  s0     
CeDLL4'&BCCr6   c                H    U R                   c
  [        5       eU R                   $ r0   )rc  r%   r   s    r4   r   ParameterLoader.name  s    ::,..zzr6   c                H    U R                   c
  [        5       eU R                   $ r0   )ra  r%   r   s    r4   r  ParameterLoader.names  s    ;;,..{{r6   c                   U R                   UR                  ;   a  UR                  U R                      $ U R                  R                  U R                   U R                  U5      u  p4UVs/ s H(  oPR                  R                  U R                   U5      PM*     nnU(       a  US   R                  U5      OU R                  R                  nU R                  (       a  UR                  5       OUn UR                  S5      n	UR                  UR                  XS5      5        [        U5        W	UR                  U R                   '   U	$ s  snf ! [         a  n
UR                  U
5         S n
A
NKS n
A
ff = f)Nr   r  )r   _cache_r"  r  r  r  r  r  rc  r  r'   r  r|  r   r  r   )rh   ry  instance_typeraw_matchesr   r  r  mergedexpandedr{  r  s              r4   __get__ParameterLoader.__get__  s+    99(((##DII.. #ii77		4::xX BMM99>>$))U3M /6!!'*499;L;L
 '+&6&66==?F	S__\2F MM(11(LQRV&,## N % 	MM!	s   */E0E 
E2E--E2c                X    [         R                  U R                  U R                  U5      $ r0   )r  r  r   r  )rh   r  s     r4   "_raw_parameters_from_single_source2ParameterLoader._raw_parameters_from_single_source  s$    @@IItzz>
 	
r6   c           	        U[        UR                  5       5      -  nUVs0 s H  oDX$   _M	     nn[        U5      nUS:X  a  gUS:X  a$  [        [	        UR                  5       5      5      S 4$ X;   a/  XP   [        U[        [	        U5      5         R                  X05      4$ S [        U[        [	        U5      5         R                  X05      4$ s  snf )Nr   r,  r*   )rh  r   r   nextiterr  r|   rx   )r   r  r  r   rL   r  numkeyss          r4   r  1ParameterLoader.raw_parameters_from_single_source  s     y!4!4!6777;<t++t<d)a<\W^^-./55\="3tDJ/077#   *tDJ/077   =s   C)rc  rc  ra  rb  r"  N)r1   F)r[   r\   r]   r^   r_  rg   ri  r  r   r  ru  rx  rP  r  r_   r1   r6   r4   r  r    sW    
&    <

  r6   r  c                  L   ^  \ rS rSrSrU 4S jr\SS j5       rU 4S jrSr	U =r
$ )ConfigurationTypei  zmetaclass for Configurationc                   > [         TU ]  XU5        [        S U R                  R	                  5       5       5      U l        U R                  5         g )Nc              3  v   #    U  H/  u  p[        U[        5      (       d  M  UR                  U5      v   M1     g 7fr0   )rS   r  ri  )r@   r   ps      r4   rC   -ConfigurationType.__init__.<locals>.<genexpr>   s1      $
/!_- AKK/s   99)rf   rg   r   __dict__rO   parameter_names _set_parameter_names_and_aliases)r   r   basesr	  rl   s       r4   rg   ConfigurationType.__init__  sI    d+ $ $
<<--/$
 
 	,,.r6   c                    U R                   R                  5       VVs0 s H  u  p[        U[        5      (       d  M  X_M      snn$ s  snnf r0   )r  rO   rS   r  )r   r   params      r4   _parameter_loaders$ConfigurationType._parameter_loaders)  sF      #||113
3%1 DK3
 	
 
s
   AAc                J   > [         TU ]  " U0 UD6nU R                  Ul        U$ r0   )rf   __call__r  )r   r   rj   rh   rl   s       r4   r  ConfigurationType.__call__1  s*    w00"%"8"8r6   )r  )r  zdict[str, ParameterLoader])r[   r\   r]   r^   r_  rg   r  r  r  r_   rp   rq   s   @r4   r  r    s)    %/ 
 
 r6   r  )z.condarccondarc)z.ymlz.yamlz9
    # delimiter and a Python identifier
    \$(?P<named>z?) |

    # delimiter and a braced identifier
    \${(?P<braced>z8)} |

    # delimiter padded identifier
    %(?P<padded>z)%
    )flagsc               J   ^ 0 TEUEmSU4S jjn[         R                  X05      $ )u  Expand variables in a string.

Inspired by `string.Template` and modified to mirror `os.path.expandvars` functionality
allowing custom variables without mutating `os.environ`.

Expands POSIX and Windows CMD environment variables as follows:

- $VARIABLE → value of VARIABLE
- ${VARIABLE} → value of VARIABLE
- %VARIABLE% → value of VARIABLE

Invalid substitutions are left as-is:

- $MISSING → $MISSING
- ${MISSING} → ${MISSING}
- %MISSING% → %MISSING%
- $$ → $$
- %% → %%
- $ → $
- % → %
c                   > [        TR                  U R                  S5      =(       d)    U R                  S5      =(       d    U R                  S5      U R                  5       5      5      $ )Nnamedbracedpadded)rT   r  group)r  mappings    r4   convert"custom_expandvars.<locals>.convertb  sM    KKG$VH(=VXAV
 	
r6   )r  r:   )_RE_CUSTOM_EXPANDVARSsub)templater  rj   r  s    `  r4   custom_expandvarsr  H  s,    0 $#F#G
 !$$W77r6   c                      \ rS rSrSS jr\S 5       r\    SS j5       r\    SS j5       r	SS jr
SS jrS	 rSS
 jrS S!S jjrS rS rS rS rS r\S 5       rS rS rS rS rS"S#S jjrS rS rSrg)$Configurationim  Nc                    0 U l         0 U l        [        5       U l        [	        [
        5      U l        U R                  " U40 UD6  U R                  U5        U R                  U5        g r0   )
r  rp  r   _reset_callbacksr   list_validation_errors_set_search_path_set_env_vars_set_argparse_args)rh   search_pathapp_nameargparse_argsrj   s        r4   rg   Configuration.__init__n  sX      *"-d"3k4V48$.r6   c                `    [        S U R                  R                  5       5       5      U l        g)zEBuild parameter_names_and_aliases from the class's parameter loaders.c              3  `   #    U  H$  nUR                   =(       d    S   H  nUv   M	     M&     g7f)r1   Nra  )r@   r  
alias_names      r4   rC   AConfiguration._set_parameter_names_and_aliases.<locals>.<genexpr>}  s.      0
4 xx~2~
 - 4s   ,.N)r   r  r  parameter_names_and_aliases)r   s    r4   r  .Configuration._set_parameter_names_and_aliasesz  s-     +0 0
++2240
 +
'r6   c              +    #    U  H  n[        U[        5      (       a  UnO3[        [        U5      [        40 UD6n[        U5      R                  5       nUR                  5       (       a.  UR                  [        ;   d  UR                  [        ;   a  Uv   M  UR                  5       (       d  M  S [        UR                  5       5      5        S h  vN   M     g  N	7f)Nc              3     #    U  H4  nUR                  5       (       d  M  UR                  [        ;   d  M0  Uv   M6     g 7fr0   )is_filesuffixYAML_EXTENSIONS)r@   subpaths     r4   rC   4Configuration._expand_search_path.<locals>.<genexpr>  s4      #9( -4^^-N G#9s   >>	>)rS   r   r  rT   r   
expanduserr  r   CONDARC_FILENAMESr  r  is_dirsortediterdir)r  rj   searchrd   r  s        r4   _expand_search_path!Configuration._expand_search_path  s     
 "F &$'',S['LVLH~002||~~		..$++2P
#)$,,.#9   "s   B'C-"CC
Cc              #     #    U H  n U[         R                  U5      4v   M     g ! [         a"  n[        R	                  SUU5         S nAMI  S nAff = f7f)Nz1Ignoring configuration file (%s) due to error:
%s)r  rN  ra   logwarning)r   r  rd   rL  s       r4   _load_search_pathConfiguration._load_search_path  sX     
  D,JJ4PPP   * H s*   A'A
AAAAAc                    [        U R                  " U40 UD65      U l        U R                  [	        U R                  U R                  5      5      5        U R                  5         U $ r0   )r   r  _search_path_set_raw_datadictr  _reset_cache)rh   r  rj   s      r4   r  Configuration._set_search_path  sT    &t'?'?'Vv'VW4 6 6t7H7H IJKr6   c                    Xl         [        R                  nX R                  ;   a  U R                  U	 U(       a"  [        R	                  U5      U R                  U'   U R                  5         U $ r0   )	_app_namer   rx   r  r   r  )rh   r  rx   s      r4   r  Configuration._set_env_vars  sW    ! !'']]"f%$3$G$G$QDMM&!r6   c                   [        US5      (       a  [        U5      R                  5       nOU(       d  SnOUR                  5       n[        UVVs0 s H  u  p4U[        Ld  M  X4_M     snn5      =U l        n[        R                  nXPR                  ;   a  U R                  U	 [        R                  U5      U R                  U'   U R                  5         U $ s  snnf )Nr  r1   )r   r   rO   r"   r-   _argparse_argsr  rx   r  r   r  )rh   r  rO   r   r   rx   s         r4   r   Configuration._set_argparse_args  s     =*-- '--/EE "'')E.6#5edaq}TQTe5/
 	
m
 &,,]]"f% 4 H H Wf 6s   C
"C
c                \    U R                   R                  U5        U R                  5         U $ r0   )r  updater  )rh   r  s     r4   r  Configuration._set_raw_data  s%    X&r6   c                b   ^^ [        UU4S jU R                  R                  5       5       S5      $ )a(  
Find the canonical parameter name for a given alias.

This method searches through all configuration parameters to find the canonical
parameter name that corresponds to the given alias. It's useful for resolving
parameter aliases to their primary names in configuration contexts.

Args:
    alias (str): The parameter alias to look up.
    ignore_private (bool, optional): If True (default), exclude private parameters
        (those starting with underscore) from the search. If False, include all
        parameters regardless of privacy.

Returns:
    str | None: The canonical parameter name if the alias is found, otherwise None.

Example:
    >>> config = Configuration()
    >>> config.name_for_alias("channel_priority")
    'channel_priority'
    >>> config.name_for_alias("unknown_alias")
    None
c              3     >#    U  HL  nTUR                   ;   d  M  T(       a"  UR                  R                  S 5      (       a  M>  UR                  v   MN     g7fr   N)rb  rc  r   )r@   r  aliasignore_privates     r4   rC   /Configuration.name_for_alias.<locals>.<genexpr>  sE      9AAII%  (qww/A/A#/F 9s   A%AAN)r{  r  r  )rh   r  r  s    ``r4   name_for_aliasConfiguration.name_for_alias  s3    0 00779 
 	
r6   c                N   U R                   nX;   a  X!   $ SU-   nX2;   a  X#   $ U R                  R                  R                  5        HZ  u  pE[	        U[
        5      (       a  UR                  U:X  a  Us  $ [	        U[
        5      (       d  ME  U[        USS5      ;   d  MX  Us  $    g)z:Get parameter loader with fallback for missing parameters.r   ra  r1   N)r  rl   r  rO   rS   r  rc  r   )rh   rv   loadersprivate_namer   r  s         r4   _get_parameter_loader#Configuration._get_parameter_loader  s    ))$** ^+"((  >>2288:KD%11ekk^6S%11nxI 7  ; r6   c                H    0 U l         U R                   H
  nU" 5         M     U $ r0   )rp  r  rh   callbacks     r4   r  Configuration._reset_cache  s#    --HJ .r6   c                :    U R                   R                  U5        g r0   )r  addr  s     r4   register_reset_callaback&Configuration.register_reset_callaback!  s    !!(+r6   c                (   0 n/ nU R                   U   nU R                   H  nU R                  U5      nUc  M  UR                  U5      u  pxU(       a  UR	                  U5        Ub}  UR
                  R                  XW5      n	 U	R                  UR                  5      n
U	R                  X
UR                  5      nU(       a  UR                  U5        M  XUR                  '   M  M     X#4$ ! [         a  nUR	                  U5         S nAM  S nAff = fr0   )r  r  r  rx  r  r"  r  r'   rx   r|  r  rL   r   )rh   rx   typed_valuesvalidation_errorsr  rL   r  r  multikey_errorr  rz  collected_errorsr  s                r4   check_sourceConfiguration.check_source$  s    v.''C2237I $-$P$P%!E !((8 #,>>#6#6s#B >"2"9"9%,,"GK (8'F'F5<<($ ()001AB2=UYY/ E (F .. - 0%,,Q//0s   C++
D5DDc                   ^  [        [        R                  " U 4S jT R                  5       5      5      n[	        U5        T R                  5         g )Nc              3  L   >#    U  H  nTR                  U5      S    v   M     g7f)r*   N)r  )r@   rx   rh   s     r4   rC   -Configuration.validate_all.<locals>.<genexpr>Q  s$       ;H!!&)!,=r  )r  r   r  r  r   validate_configuration)rh   r  s   ` r4   validate_allConfiguration.validate_allO  sD       ;?==  

 	&'##%r6   c                     U " U0 UD6  g! [          a*  n[        US5      (       a  UR                  OU4s S nA$ S nAff = f)Nr   r1   )rY   r   r   )funcr   rj   r  s       r4   _collect_validation_error'Configuration._collect_validation_errorX  sF    	>$!&!  " 	> '8 4 4AHH!==	>s    
?:??c                   ^  [         R                  " U 4S jT R                  5       5      nT R                  5       n[	        [        [         R                  " X45      5      5        g )Nc              3  Z   >#    U  H   n[         R                  [        TU5      v   M"     g 7fr0   )r  r  r   )r@   r   rh   s     r4   rC   7Configuration.validate_configuration.<locals>.<genexpr>a  s*      %
, 33GT4HH,s   (+)r   r  r  post_build_validationr   r   )rh   r   post_errorss   `  r4   r  $Configuration.validate_configuration`  sQ    $$ %
,,%
 
 002U5../DEFGr6   c                    gr  r1   r   s    r4   r   #Configuration.post_build_validationh  s    r6   c                2   0 n0 nU R                    H  nU R                  U5      u  X'   X#'   M     [        [        [        R
                  " UR                  5       5      5      5        UR                  5       VVs0 s H  u  pEU(       d  M  XE_M     snn$ s  snnf r0   )r  r  r   r   r   r  r  rO   )rh   r  r  rx   r   r   s         r4   collect_allConfiguration.collect_allk  s    mmF>B>O>OPV>W;L "3"; $U5../@/G/G/IJKL!-!3!3!5;!5!5;;;s   8B	Bc           	       ^	 XR                   ;  a  SU-   nU R                  U5      nUc  [        U5      eUR                  n[	        U[
        5      (       d   eUR                  R                  S5      m	[        U	4S jUR                  5       5      nU R                  5       R                  T	S5      nUR                  n[        U5      [        :X  a  U/n[        U5      (       d  U/n[	        UR                  [
        5      (       d  [	        UR                  [        5      (       a  [        S U5       5      nO[        S U5       5      nUR                   R"                  R%                  5       R'                  SS5      T	UUUR(                  R+                  S5      UR'                  SS	5      R-                  5       S
.n[	        U[.        5      (       a  UR0                  US'   U$ )Nr   c              3  6   >#    U  H  oT:w  d  M
  Uv   M     g 7fr0   r1   )r@   r  r   s     r4   rC   3Configuration.describe_parameter.<locals>.<genexpr>  s     U+C%PT}+Cs   		rn   c              3     #    U  H8  oR                   R                  R                  5       R                  S S5      v   M:     g7f)r  rn   N)rl   r[   r   r   r@   _ets     r4   rC   r
    s5      "SUC&&,,.66{BGGSUs   A Ac              3  8   #    U  H  oR                   v   M     g 7fr0   )r[   r  s     r4   rC   r
    s     !="3,,"s   r  z<<describe>>r>    )rX  r   rb  element_typesdefault_valuedescriptionr   )r  r  r3  r"  rS   r  r   lstripr   rb  get_descriptionsr  r  r	   r+   rT  rl   r[   r   r   r  r'   r   rD  r   )
rh   rv   parameter_loaderr  rb  r  etr  detailsr   s
            @r4   describe_parameter Configuration.describe_parameters  s   !5!55 >1N55nE#>**$))	)Y////  $$++C0U+;+C+CUU++-11$;$$8xB"~~Bi--y99Z##%8>
 >
 " "SU" M "!="!==M (11::@@BJJR *&..55nE&..tS9??A	
 i!233*3*D*DG&'r6   c                    U(       a<  [        [        R                  S U R                  R	                  5       5       5      5      $ [        [        S U R                  5       5      5      $ )Nc              3  J   #    U  H  oR                     H  o"v   M     M     g 7fr0   r  )r@   r  r   s      r4   rC   0Configuration.list_parameters.<locals>.<genexpr>  s      "BQxxtDxD"Bs   !#c              3  B   #    U  H  oR                  S 5      v   M     g7fr  )r  )r@   r   s     r4   rC   r    s     N9MKK,,9Ms   )r   r  fromkeysr  r  r  r  )rh   rb  s     r4   list_parametersConfiguration.list_parameters  sX     "&"9"9"@"@"B  
 VN9M9MNNOOr6   c                    XR                   ;  a  SU-   nU R                  U5      nUc  [        U5      eUR                  n[	        U[
        5      (       d   eUR                  XU5      $ )Nr   )r  r  r3  r"  rS   r  r'   )rh   rv   rM   rx   r  r  s         r4   typify_parameterConfiguration.typify_parameter  sk    !5!55 >1N55nE#>**$))	)Y////>>r6   c                    [        5       er0   r   r   s    r4   r  Configuration.get_descriptions  s    !##r6   )r  r  rp  r  r  r  r  )r1   NN)r  r<   r  Iterable[Path])r  r&  r  zIterable[tuple[Path, dict]])r  r<   r0   )r  zMapping[Hashable, dict])T)r  rT   r  boolr  z
str | None)F)rb  r'  )r[   r\   r]   r^   rg   r   r  rP  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r"  r  r_   r1   r6   r4   r  r  m  s    
/ 
 
  
 0 # 
% :
 
D,,)/V&  H<,\P?$r6   r  c                   ^  U 4S jnU$ )a  
Used to validate properties on :class:`Configuration` subclasses defined as a
``SequenceParameter(MapParameter())`` where the map contains a single key that
should be regarded as unique. This decorator will handle removing duplicates and
merging to a single sequence.
c                4   >^  [        T 5      U U4S j5       nU$ )Nc            
     B  > T" U 0 UD6n0 nU Hv  nUR                  T5      nUc+  [        R                  SU STR                   ST S35        MB  XS;   a+  [        R                  SU STR                   SU S35        Mr  XCU'   Mx     [	        UR                  5       5      $ )NzConfiguration: skipping z for "z"; unique key "z" not present on mappingz
"; value "z" already present)r  r  r  r[   r   r  )r   rj   sequence_mapnew_sequence_mappingr  unique_key_valuer  
unique_keys         r4   wrapper8unique_sequence_map.<locals>.inner_wrap.<locals>.wrapper  s    00L#% '#*;;z#: #+II27)6$-- Q&<'?A #;II27)6$-- Q,-->@ 9@%56# (& -44677r6   r
   )r  r/  r.  s   ` r4   
inner_wrap'unique_sequence_map.<locals>.inner_wrap  s     	t	8 
	82 r6   r1   )r.  r1  s   ` r4   unique_sequence_mapr3    s    : r6   )z  )r  rT   r  zMapping[str, Any]r  rT   )r.  rT   )xr_  
__future__r   r  r#  abcr   r   collectionsr   collections.abcr   enumr   r	   	functoolsr   	itertoolsr   loggingr   osr   os.pathr   pathlibr   rer   r   r   r   r   typingr   boltons.setutilsr   r   r   r   _getFreezeConversionMapr   	_registerruamel.yaml.commentsr   r   ruamel.yaml.readerr   ruamel.yaml.scannerr   rn   r    r!   auxlib.collectionr"   r#   r$   auxlib.exceptionsr%   auxlib.type_coercionr&   r'   r(   common.iteratorsr)   compatr+   r,   	constantsr-   	serializer.   r7   r8   r9   r:   r;   common.pathr<   r[   r  r   rG   rQ   rW   rY   ra   rs   r|   r   r   r   r   r   r   r   r  r  rR  ra  r  r  r  r  rT  r  r&  r.  rD  rP  r  r"  r  r  r  	idpatternr  r  r  r3  r1   r6   r4   <module>rP     s   #  
 ' # #        + +    ' - H , ; * , * 5 5 : S S % /  +&(( dK <<'L	0V	 	J/ J(( (	? 	?K K

O 

2?,> 2
+D 2W @)Ll )LX
< 
:vL| vLr2/| 2/jV> V>r&+ &+RH
 H
V^
o ^
BG
O G
T JD' JDZ
 
<2
9 2
j5
	 5
pD
i D
N^ ^B < , #
##$ % &&' ( ##$ %	 w
   13"8"8-"8"8JL$/ L$^
%r6   