
    2yi              	         d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZ d dl	mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlm Z m!Z! d dl"Z"d dl#Z#d dl$Z#d dl%m&Z&m'Z'm(Z( d d	l)m*Z*m+Z+m,Z,m-Z-m.Z. d d
l/m0Z0  ed      Z1 ede+      Z2 ejf                  e4      Z5 G d dee2   e*e2         Z6 G d de6e2   ee2         Z7 G d dee1   e*e1         Z8 G d dee1   e*ee1            Z9 G d dee1   e*ee:e1f            Z; G d de9e,         Z< G d dee1   e8e1         Z= G d dee1   e8e1         Z> G d de*      Z? G d  d!e      Z@ G d" d#e8e@         ZA G d$ d%e8e:         ZB G d& d'ee1   e*ee1df            ZC G d( d)eB      ZD G d* d+e=e:         ZE G d, d-e*e:         ZF G d. d/e=e:         ZG G d0 d1e=e:         ZH G d2 d3eH      ZI G d4 d5eI      ZJ G d6 d7eH      ZK G d8 d9e9e:         ZL G d: d;eI      ZM G d< d=e*e'j                           ZN G d> d?e8      ZO G d@ dAee1   e*e1         ZP G dB dCe+      ZQ G dD dEe*eeQe:f            ZR G dF dGe8ee:            ZS G dH dIe8e&j                           ZU G dJ dKe*ee	j                              ZW G dL dMe*e#j                  j                           ZZy)N    )annotationsN)Counter
UserString)SimpleNamespace)AnyCallable
CollectionDictGenericIteratorListMappingMutableMapping
NamedTupleTypeVarUnionoverload)quote)urlsplit
urlunsplit)pluginsthemeutils)BaseConfigOptionConfigLegacyConfigPlainConfigSchemaItemValidationError)ConfigurationErrorT
SomeConfig)boundc                       e Zd ZU dZdZded<   ded<   edd	 	 	 	 	 dd	       Zed
d	 	 	 	 	 dd       Zdd fd
ZddZddZ	ddZ
 xZS )	SubConfiga  
    Subconfig Config Option.

    New: If targeting MkDocs 1.4+, please pass a subclass of Config to the
    constructor, instead of the old style of a sequence of ConfigOption instances.
    Validation is then enabled by default.

    A set of `config_options` grouped under a single config option.
    By default, validation errors and warnings resulting from validating
    `config_options` are ignored (`validate=False`). Users should typically
    enable validation with `validate=True`.
    N
str | None_config_file_pathtype[SomeConfig]config_classT)validatec                   y)zRCreate a sub-config in a type-safe way, using fields defined in a Config subclass.N )selfr(   r)   s      ^/var/www/html/content_weaver/venv/lib/python3.12/site-packages/mkdocs/config/config_options.py__init__zSubConfig.__init__E           Fc                    y)z;Create an untyped sub-config, using directly passed fields.Nr+   )r,   r)   config_optionss      r-   r.   zSubConfig.__init__K   r/   r0   c               :   t         |           i | _        |dn|| _        t	        |       t
        u rit        |      dk(  r0t        |d   t              rt        |d   t              r
|\  | _
        y t        j                  t        |      | _
        |dn|| _        y y )NT   r   F)superr.   default_do_validationtyper$   len
isinstance
issubclassr   r(   	functoolspartialr   )r,   r)   r2   	__class__s      r-   r.   zSubConfig.__init__S   s    &.&6dH:"N#q(~a0$7~a0&9'5$"$-$5$5lN$S!/7/?eX# #r0   c                j    | j                    d|j                    d}t        || ft        |            S )z^Eliminates the need to write `config_class = FooConfig` when subclassing SubConfig[FooConfig].[])r(   )__name__r8   dict)clsr(   names      r-   __class_getitem__zSubConfig.__class_getitem__b   s5    ,,q!6!6 7q9D3&$L"ABBr0   c                &    |j                   | _        y N)config_file_pathr&   r,   configkey_names      r-   pre_validationzSubConfig.pre_validationg   s    !'!8!8r0   c                d   | j                  | j                        }	 |j                  |       |j                         \  }}| j                  r=| j                  j                  d |D               |r|d   \  }}t        d| d|       |S # t        $ r}t        t        |            d }~ww xY w)NrI   c              3  2   K   | ]  \  }}d | d|   yw)Sub-option '': Nr+   ).0keymsgs      r-   	<genexpr>z+SubConfig.run_validation.<locals>.<genexpr>t   s!      W(#s<uCu!= Ws   r   rQ   rR   )
r(   r&   	load_dictr)   r   r   strr7   warningsextend)r,   valuerK   failedrY   erT   errs           r-   run_validationzSubConfig.run_validationj   s    ""D4J4J"K	*U#%0FH MM   Wh WW!!9S%SESE&BCC " 	*!#a&))	*s   $B 	B/B**B/)r,   zSubConfig[SomeConfig]r(   r'   r)   bool)r,   zSubConfig[LegacyConfig]r2   r   r)   r`   )r(   ztype[Config]rK   r   rL   rX   )r[   objectreturnr!   )rB   
__module____qualname____doc__r&   __annotations__r   r.   rF   rM   r_   __classcell__r>   s   @r-   r$   r$   4   s     %)z(""\`a#a3CaUYa a
  J%J.J J J 26 NC
9r0   r$   c                  $     e Zd ZdZd fdZ xZS )PropagatingSubConfigz
    A SubConfig that must consist of SubConfigs with defined schemas.

    Any value set on the top config gets moved to sub-configs with matching keys.
    c                   t        |t              rt               }| j                  j                  D ]  \  }}t        |t
              s|j                  j                  D ]S  \  }}||v s|j                  |i       }t        |t              s.|j                  |       |j                  |||          U  |D ]  }||=  t        	| %  |      S rH   )
r:   rC   setr(   _schemar$   
setdefaultaddr5   r_   )
r,   r[   
to_discardk1v1k2_subdictkr>   s
            r-   r_   z#PropagatingSubConfig.run_validation   s    eT"J++33 BBb),!#!8!8 BA;&+&6&6r2&>G)'48 *r 2 ' 2 22uRy ABB   !Hw%e,,r0   r[   rb   )rB   rd   re   rf   r_   rh   ri   s   @r-   rk   rk   }   s    - -r0   rk   c                  P     e Zd ZdZedd       Zeddd       Zd fd	Zd Z xZS )	OptionallyRequiredz
    Soft-deprecated, do not use.

    A subclass of BaseConfigOption that adds support for default values and
    required values. It is a base class for config options.
    c                     y rH   r+   r,   r6   s     r-   r.   zOptionallyRequired.__init__       r0   c                    y rH   r+   r,   r6   requireds      r-   r.   zOptionallyRequired.__init__   r}   r0   c                ^    t         |           || _        || _        t	        |      | _        y rH   )r5   r.   r6   _legacy_requiredr`   r   r,   r6   r   r>   s      r-   r.   zOptionallyRequired.__init__   s(     (Xr0   c                    |=| j                   | j                   }n$| j                  sy| j                  rt        d      | j                  |      S )z
        Perform some initial validation.

        If the option is empty (None) and isn't required, leave it as such. If
        it is empty but has a default, use that. Finally, call the
        run_validation method on the subclass unless.
        N$Required configuration not provided.)r6   r   r   r_   r,   r[   s     r-   r)   zOptionallyRequired.validate   sJ     =||']]%&LMM""5))r0   rH   r   r`   )NN)rB   rd   re   rf   r   r.   r)   rh   ri   s   @r-   rz   rz      s:        '*r0   rz   c                  N     e Zd ZU dZdZded<   d	d
 fdZddZddZddZ	 xZ
S )ListOfItemsz
    Validates a homogeneous list of items.

    E.g. for `config_options.ListOfItems(config_options.Type(int))` a valid item is `[1, 2, 3]`.
    Nbool | Noner   c                t    t         |           || _        || _        | j                  | j                  _        y rH   r5   r.   r6   option_typerY   r,   r   r6   r>   s      r-   r.   zListOfItems.__init__   /    &$(MM!r0   c                J    t        |       j                   d| j                   S N: r8   rB   r   r,   s    r-   __repr__zListOfItems.__repr__   %    t*%%&b)9)9(:;;r0   c                     || _         || _        y rH   _config	_key_namerJ   s      r-   rM   zListOfItems.pre_validation       !r0   c                   |/| j                   s| j                  t        d      | j                  }t        |t              st        dt        |       d      |s|S t        d      }	 | j                  j                  |_        t        | dd      }t        t        |            D cg c]
  }| d| d }}t        t        ||            |_        | j                   | j"                  _        |D ]  }| j"                  j%                  ||         |D ]#  }| j"                  j'                  ||         ||<   % |D ]  }| j"                  j)                  ||         |D cg c]  }||   	 c}S # t        $ r Y w xY wc c}w c c}w )	Nr   z Expected a list of items, but a  was given.r+   r    r@   rA   )r   r6   r   r:   listr8   r   r   rI   AttributeErrorgetattrranger9   rC   zipdatarY   r   rM   r_   post_validation)r,   r[   fake_configparent_key_namei	fake_keysrL   rw   s           r-   r_   zListOfItems.run_validation   s   =}} 4%&LMMLLE%&!$DT%[MQ\"]^^L"2&	+/<<+H+HK(
 "$R88=c%j8IJ1(!A.J	JIu 56$(MM!# 	CH++KB	C# 	[H$($4$4$C$CKPXDY$ZK!	[ $ 	DH,,[(C	D )221A22#  		
 K 3s   *E/ (E> F/	E;:E;rH   r   BaseConfigOption[T]rc   Nonerc   rX   ra   )r[   rb   rc   zlist[T]rB   rd   re   rf   r   rg   r.   r   rM   r_   rh   ri   s   @r-   r   r      s(     !Hk 2<"3r0   r   c                  N     e Zd ZU dZdZded<   d	d
 fdZddZddZddZ	 xZ
S )DictOfItemsz
    Validates a dict of items. Keys are always strings.

    E.g. for `config_options.DictOfItems(config_options.Type(int))` a valid item is `{"a": 1, "b": 2}`.
    Nr   r   c                t    t         |           || _        || _        | j                  | j                  _        y rH   r   r   s      r-   r.   zDictOfItems.__init__   r   r0   c                J    t        |       j                   d| j                   S r   r   r   s    r-   r   zDictOfItems.__repr__  r   r0   c                     || _         || _        y rH   r   rJ   s      r-   rM   zDictOfItems.pre_validation  r   r0   c           
        |/| j                   s| j                  t        d      | j                  }t        |t              st        dt        |       d      |s|S t        d      }	 | j                  j                  |_        ||_
        |D ]  }| j                  j                  ||         |D ]4  }t        |t              rt        dt         dt        |       d| d       |D ]#  }| j                  j                  ||         ||<   % |D ]  }| j                  j                  ||         |S # t        $ r Y w xY w)	Nr   z Expected a dict of items, but a r   r+   Expected type: z for keys, but received: z (key=))r   r6   r   r:   rC   r8   r   r   rI   r   r   r   rM   rX   r_   r   )r,   r[   r   rT   s       r-   r_   zDictOfItems.run_validation
  sc   =}} 4%&LMMLLE%&!$DT%[MQ\"]^^L"2&	+/<<+H+HK(
 ! 	>C++K=	> 	Cc3'%%cU*CDI;fUXTYYZ[ 	
  	QC#//>>{3?OPK	Q  	?C,,[#>	? '  		s   *D5 5	E ErH   r   r   ra   )r[   rb   rc   zdict[str, T]r   ri   s   @r-   r   r      s(     !Hk 2<" r0   r   c                  N     e Zd ZdZedd       Zedd       Zddd	 fdZ xZS )
ConfigItemsz
    Deprecated: Use `ListOfItems(SubConfig(...))` instead of `ConfigItems(...)`.

    Validates a list of mappings that all must match the same set of
    options.
    c                     y rH   r+   )r,   r2   s     r-   r.   zConfigItems.__init__5  r}   r0   c                    y rH   r+   )r,   r   r2   s      r-   r.   zConfigItems.__init__9  r}   r0   Nr   c               b    t         |   t        | g        || _        t	        |      | _        y )Nr6   )r5   r.   r$   r   r`   r   )r,   r   r2   r>   s      r-   r.   zConfigItems.__init__=  s-    N3R@ (Xr0   )r2   r   )r2   r   r   r`   )r2   r   rc   r   rB   rd   re   rf   r   r.   rh   ri   s   @r-   r   r   -  sA         IM ' 'r0   r   c                  V     e Zd ZdZeddd       Zeddd       Zdd	 fdZd
dZ xZS )Typezd
    Type Config Option.

    Validate the type of a config option against a given Python type.
    c                    y rH   r+   r,   type_lengthkwargss       r-   r.   zType.__init__J  r}   r0   c                    y rH   r+   r   s       r-   r.   zType.__init__N  r}   r0   c               @    t        |   di | || _        || _        y Nr+   )r5   r.   _typer   )r,   r   r   r   r>   s       r-   r.   zType.__init__R  s!    "6"
r0   c           
     2   t        || j                        s&d| j                   dt        |       }t        |      | j                  Nt	        |      | j                  k7  r6d| j                   d| j                   d|dt	        |       }t        |      |S )Nr    but received: z with length )r:   r   r8   r   r9   r   )r,   r[   rU   s      r-   r_   zType.run_validationW  s    %,#DJJ<tE{mLC c"" [[$Ut{{)B!$**]4;;-!%-E
|E  c"" Lr0   rH   )r   
int | Noner   ztype[T])r   r   r   ztuple[type[T], ...]rc   r   r[   rb   rc   r    rB   rd   re   rf   r   r.   r_   rh   ri   s   @r-   r   r   C  s:        
#r0   r   c                  .     e Zd ZdZdd fdZddZ xZS )Choicez_
    Choice Config Option.

    Validate the config option against a strict set of values.
    c                    t        |   dd|i| 	 t        |      }|rt	        |t
              rt        d|       |||vrt        |d|      || _        y # t        $ r d}Y Kw xY w)Nr6   r   z"Expected iterable of choices, got z is not one of r+   )r5   r.   r9   	TypeErrorr:   rX   
ValueErrorchoices)r,   r   r6   r   r   r>   s        r-   r.   zChoice.__init__l  s    33F3	\F GS1A'KLL7'#9{/'EFF  	F	s   A A+*A+c                X    || j                   vrt        d| j                    d|      |S )NzExpected one of: r   )r   r   r   s     r-   r_   zChoice.run_validationz  s2    $!$5dll^?SXR["\]]r0   rH   )r   zCollection[T]r6   T | Nonerc   r   r   )rB   rd   re   rf   r.   r_   rh   ri   s   @r-   r   r   e  s    r0   r   c                  \     e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 d fdZd	dZd Zd	dZd Z xZ	S )

DeprecatedaU  
    Deprecated Config Option.

    Raises a warning as the option is deprecated. Uses `message` for the
    warning. If `move_to` is set to the name of a new config option, the value
    is moved to the new option on pre_validation. If `option_type` is set to a
    ConfigOption instance, then the value is validated against that type.
    c                    t         |           d | _        || _        |s|rd}nd}|r	|d| dz  }|| _        || _        |xs
 t               | _        | j                  j                  | _        y )Nz6The configuration option '{}' was removed from MkDocs.zZThe configuration option '{}' has been deprecated and will be removed in a future release.z Use 'z
' instead.)	r5   r.   r6   moved_tomessageremovedr   optionrY   )r,   r   r   r   r   r>   s        r-   r.   zDeprecated.__init__  sz     	 R;  VH:Z88!7%5%7,,r0   c                   | j                   j                  ||       |j                  |      | j                  r$t	        | j
                  j                  |            | j                  j                  | j
                  j                  |             | j                  i| j                  j                  d      ^ }}|}|D ]/  }|j                  |      i ||<   ||   }t        |t              r/ y  |j                  |      ||<   y y y )N.)r   rM   getr   r   r   formatrY   appendr   splitr:   rC   pop)r,   rK   rL   parent_keys
target_keytargetrT   s          r-   rM   zDeprecated.pre_validation  s    ""684::h+||%dll&9&9(&CDDMM  !4!4X!>?}}(+/==+>+>s+C(j$& Czz#.&(s#C[F%fd3 &,ZZ%9z" ) ,r0   c                8    | j                   j                  |      S rH   r   r)   r   s     r-   r)   zDeprecated.validate  s    {{##E**r0   c                <    | j                   j                  ||       y rH   )r   r   rJ   s      r-   r   zDeprecated.post_validation  s    ##FH5r0   c                n    | j                   j                          | j                   j                  | _        y rH   r   reset_warningsrY   r   s    r-   r   zDeprecated.reset_warnings  #    ""$,,r0   )NNFN)
r   r%   r   r%   r   r`   r   zBaseConfigOption | Nonerc   r   ra   )
rB   rd   re   rf   r.   rM   r)   r   r   rh   ri   s   @r-   r   r     s_      $"/3-- - 	-
 -- 
-6:.+6-r0   r   c                  *    e Zd ZU ded<   ded<   ddZy)_IpAddressValuerX   hostintportc                8    | j                    d| j                   S )N:)r   r   r   s    r-   __str__z_IpAddressValue.__str__  s    ))Adii[))r0   Nr   )rB   rd   re   rg   r   r+   r0   r-   r   r     s    
I
I*r0   r   c                      e Zd ZdZddZy)	IpAddressz_
    IpAddress Config Option.

    Validate that an IP address is in an appropriate format
    c                   t        |t              rd|vrt        d      |j                  dd      \  }}|dk7  rF|j	                  d      r|j                  d      r|dd }	 t        t        j                  |            }	 t        |      }t        ||      S # t        $ r}t        |      d }~ww xY w# t        $ r t        d| d	      w xY w)
Nr   z$Must be a string of format 'IP:PORT'r4   	localhostr@   rA   'z' is not a valid port)r:   rX   r   rsplit
startswithendswith	ipaddress
ip_addressr   r   	Exceptionr   )r,   r[   r   port_strr]   r   s         r-   r_   zIpAddress.run_validation  s    %%E)9!"HIIc1-h;s#c(:Abz)9//56	Gx=D tT**  )%a(()
  	G!AhZ/D"EFF	Gs$   "B B4 	B1!B,,B14CN)r[   rb   rc   r   rB   rd   re   rf   r_   r+   r0   r-   r   r     s    +r0   r   c                  b     e Zd ZdZedddd	d       Zedddd
d       Zdd fdZddZ xZS )URLzR
    URL Config Option.

    Validate a URL by requiring a scheme is present.
    F)is_dirc                    y rH   r+   )r,   r6   r  s      r-   r.   zURL.__init__  r}   r0   c                    y rH   r+   )r,   r6   r   r  s       r-   r.   zURL.__init__  r}   r0   c                6    || _         t        | 	  ||       y )Nr   )r  r5   r.   )r,   r6   r   r  r>   s       r-   r.   zURL.__init__  s    84r0   c                   t        |t              st        dt        |             |dk(  r|S 	 t	        |      }|j                  r]|j                  rQ| j                  r:|j                  j                  d      s|j                  |j                   d      }t        |      S t        d      # t
        t        f$ r t        d      w xY w)NzExpected a string, got r   zUnable to parse the URL./pathz;The URL isn't valid, it should include the http:// (scheme))r:   rX   r   r8   r   r   r   schemenetlocr  r  r   _replacer   )r,   r[   
parsed_urls      r-   r_   zURL.run_validation  s    %%!$;DK="IJJB;L	>!%J !2!2{{:??#;#;C#@'008I6K0L
j))[\\ 	* 	>!"<==	>s   B/ /C
rH   )r  r`   )r   r`   r  r`   )NNF)r  r`   rc   r   r[   rb   rc   rX   r   ri   s   @r-   r  r    sI     u   u  5]r0   r  c                  H     e Zd ZdZd fdZd Zd	dZd
dZd	dZd Z	 xZ
S )Optionalz
    Wraps a field and makes a None value possible for it when no value is set.

    E.g. `my_field = config_options.Optional(config_options.Type(str))`
    c                    |j                   t        d|j                   d      t        |           || _        |j
                  | _        y )Nz#This option already has a default (z.) and doesn't need to be wrapped into Optional)r6   r   r5   r.   r   rY   )r,   config_optionr>   s     r-   r.   zOptional.__init__  sW      ,5m6K6K5N O? @  	#%..r0   c                B    |dv rt         t        | j                  |      S )N)r   rY   )r   r   r   )r,   rT   s     r-   __getattr__zOptional.__getattr__"  s"    ((  t{{C((r0   c                :    | j                   j                  ||      S rH   )r   rM   rJ   s      r-   rM   zOptional.pre_validation'  s    {{))&(;;r0   c                >    |y | j                   j                  |      S rH   r   r   s     r-   r_   zOptional.run_validation*  s    ={{##E**r0   c                t    | j                   j                  ||      }| j                   j                  | _        |S rH   )r   r   rY   )r,   rK   rL   results       r-   r   zOptional.post_validation/  s.    ,,VX>,,r0   c                n    | j                   j                          | j                   j                  | _        y rH   r   r   s    r-   r   zOptional.reset_warnings4  r   r0   )r  r   rc   r   ra   )r[   rb   rc   r   )rB   rd   re   rf   r.   r  rM   r_   r   r   rh   ri   s   @r-   r  r    s&    /)
<+

-r0   r  c                  &     e Zd Z fdZddZ xZS )RepoURLc                X    t        j                  dt               t        |   |i | y )Nz8RepoURL is no longer used in MkDocs and will be removed.)rY   warnDeprecationWarningr5   r.   )r,   argsr   r>   s      r-   r.   zRepoURL.__init__:  s)    FHZ	
 	$)&)r0   c                   t        |d         j                  j                         }|j                  d      }|d   W|j                  d      F|dk(  rd|d<   n;|dk(  rd|d<   n0|dk(  rd	|d<   n%|j	                  d
      d   j                         |d<   |d   ||dk(  s|dk(  rd}n
|dk(  rd}nd}|r|j                  d      s|dz  }||d<   y )Nrepo_urledit_uri	repo_name
github.comGitHubbitbucket.org	Bitbucket
gitlab.comGitLabr   r   edit/master/docs/src/default/docs/r   r  )r   r  lowerr   r   titler   )r,   rK   rL   	repo_hostr(  s        r-   r   zRepoURL.post_validation@  s    VJ/077==?	::j) *)fjj.E.ML(&.{#o-&1{#l*&.{#&/ooc&:1&=&C&C&E{# *)h.>L(I,E.o-. H--c2OH%zr0   ra   rB   rd   re   r.   r   rh   ri   s   @r-   r!  r!  9  s    *&r0   r!  c                  (     e Zd Zd fdZddZ xZS )EditURIc                :    t         |   t               || _        y rH   r5   r.   rX   repo_url_keyr,   r:  r>   s     r-   r.   zEditURI.__init__`      (r0   c                   |j                  |      }|j                  | j                        }|9|7t        |      j                  j	                         }|dk(  s|dk(  rd}n|dk(  rd}|r|j                  d      s|dz  }|||<   y )Nr*  r.  r0  r,  r1  r  )r   r:  r   r  r2  r   )r,   rK   rL   r(  r'  r4  s         r-   r   zEditURI.post_validationd  s    ::h'::d//0 4 *11779IL(I,E.o-. H--c2OH#xr0   r:  rX   rc   r   ra   r5  ri   s   @r-   r7  r7  _  s    )$r0   r7  c                  r     e Zd Z G d dej                        Z G d de      Zdd	 fdZd
dZddZ	 xZ
S )EditURITemplatec                       e Zd Z fdZ xZS )EditURITemplate.Formatterc                H    |dk(  rt        |d      S t        | 	  ||      S )Nqr   )safe)urlquoter5   convert_field)r,   r[   
conversionr>   s      r-   rG  z'EditURITemplate.Formatter.convert_fieldx  s*    S B//7(
;;r0   )rB   rd   re   rG  rh   ri   s   @r-   	FormatterrB  w  s    	< 	<r0   rI  c                  &     e Zd Zd fdZd Z xZS )EditURITemplate.Templatec                    t         |   |       || _        	 | j                  dd       y # t        $ r}t        d|       d }~ww xY w)Nr   zUnknown template substitute: )r5   r.   	formatterr   KeyErrorr   )r,   rM  r   r]   r>   s       r-   r.   z!EditURITemplate.Template.__init__~  sP    GT"&DNFB# F #@!DEEFs   , 	AAAc                R    | j                   j                  | j                  ||      S )N)r  
path_noext)rM  r   r   )r,   r  rP  s      r-   r   zEditURITemplate.Template.format  s"    >>((*(UUr0   r   )rB   rd   re   r.   r   rh   ri   s   @r-   TemplaterK  }  s    	F	Vr0   rQ  c                0    t         |           || _        y rH   )r5   r.   edit_uri_key)r,   rS  r>   s     r-   r.   zEditURITemplate.__init__  s    (r0   c                |    	 | j                  | j                         |      S # t        $ r}t        |      d }~ww xY wrH   )rQ  rI  r  r   r,   r[   r]   s      r-   r_   zEditURITemplate.run_validation  s:    	%==!1599 	%!!$$	%s   " 	;6;c                    | j                   r[|j                  |      rI|j                  | j                         r-| j                  j                  d| j                    d| d       y y y y )NzThe option 'z' has no effect when 'z	' is set.)rS  r   rY   r   rJ   s      r-   r   zEditURITemplate.post_validation  s`    H!5&**TEVEV:WMM  t0011GzQZ[ ;X!5r0   rH   )rS  r%   rc   r   rx   ra   )rB   rd   re   stringrI  r   rQ  r.   r_   r   rh   ri   s   @r-   r@  r@  v  s2    <F$$ <
V: 
V)%r0   r@  c                  (     e Zd Zd fdZddZ xZS )RepoNamec                :    t         |   t               || _        y rH   r9  r;  s     r-   r.   zRepoName.__init__  r<  r0   c                2   |j                  |      }|j                  | j                        }|i|ft        |d         j                  j	                         }|dk(  rd}n2|dk(  rd}n*|dk(  rd}n"|j                  d      d	   j                         }|||<   y y y )
Nr'  r*  r+  r,  r-  r.  r/  r   r   )r   r:  r   r  r2  r   r3  )r,   rK   rL   r)  r'  r4  s         r-   r   zRepoName.post_validation  s    JJx(	::d//0 I$5 
!34;;AACIL($	o-'	l*$	%OOC0399;	(F8 %6r0   r>  ra   r5  ri   s   @r-   rY  rY    s    ))r0   rY  c                       e Zd ZU dZ eej                  j                        Zde	d<   dZ
dd	 fdZd
dZd fdZ xZS )FilesystemObjectz8Base class for options that point to filesystem objects.zCallable[[str], bool]existence_testzfile or directoryc                J    t        |   t        fi | || _        d | _        y rH   )r5   r.   rX   exists
config_dir)r,   r`  r   r>   s      r-   r.   zFilesystemObject.__init__  s#    ''&*r0   c                    |j                   r/t        j                  j                  |j                         | _        y d | _        y rH   )rI   osr  dirnamera  rJ   s      r-   rM   zFilesystemObject.pre_validation  s1    8>8O8OBGGOOF334 	UY 	r0   c                |   t         |   |      }| j                  rIt        j                  j                  |      s*t        j                  j                  | j                  |      }| j                  r-| j                  |      st        d| d| j                   d      t        j                  j                  |      S )Nz
The path 'z' isn't an existing r   )r5   r_   ra  rc  r  isabsjoinr`  r^  r   rE   abspath)r,   r[   r>   s     r-   r_   zFilesystemObject.run_validation  s    &u-??277==#7GGLL%8E;;t2259!Jug5I$))TU"VWWwwu%%r0   )F)r`  r`   rc   r   ra   r  )rB   rd   re   rf   staticmethodrc  r  r`  r^  rg   rE   r.   rM   r_   rh   ri   s   @r-   r]  r]    s7    B,8,HN)HD+


& &r0   r]  c                  L    e Zd ZdZ eej                  j                        ZdZ	y)Dirzf
    Dir Config Option.

    Validate a path to a directory, optionally verifying that it exists.
    	directoryN)
rB   rd   re   rf   ri  rc  r  isdirr^  rE   r+   r0   r-   rk  rk    s      ""''--0NDr0   rk  c                      e Zd ZddZy)DocsDirc                    |j                   sy t        j                  j                  |j                         ||   k(  rt	        d| d| d      y )NzThe 'zd' should not be the parent directory of the config file. Use a child directory instead so that the 'z"' is a sibling of the config file.)rI   rc  r  rd  r   rJ   s      r-   r   zDocsDir.post_validation  s]    && 77??6223vh7GG!z "J@B  Hr0   Nra   )rB   rd   re   r   r+   r0   r-   ro  ro    s    
r0   ro  c                  L    e Zd ZdZ eej                  j                        ZdZ	y)Filezb
    File Config Option.

    Validate a path to a file, optionally verifying that it exists.
    fileN)
rB   rd   re   rf   ri  rc  r  isfiler^  rE   r+   r0   r-   rr  rr    s      ""''..1NDr0   rr  c                  T     e Zd ZdZeg fd       Zeg fdd       Zg dfd fdZ xZS )ListOfPathsa  
    List of Paths Config Option.

    A list of file system paths. Raises an error if one of the paths does not exist.

    For greater flexibility, prefer ListOfItems, e.g. to require files specifically:

        config_options.ListOfItems(config_options.File(exists=True))
    c                     y rH   r+   r|   s     r-   r.   zListOfPaths.__init__  r}   r0   c                    y rH   r+   r   s      r-   r.   zListOfPaths.__init__  r}   r0   Nc                H    t         |   t        d      |       || _        y NT)r`  )r5   r.   r]  r   r   s      r-   r.   zListOfPaths.__init__  s    )6@ r0   r   r   r   ri   s   @r-   rv  rv    sG     !   !    "D ! !r0   rv  c                  $     e Zd ZdZd fdZ xZS )SiteDirzp
    SiteDir Config Option.

    Validates the site_dir and docs_dir directories do not contain each other.
    c                   t         |   ||       |d   }|d   }|t        j                  z   j	                  |j                  t        j                        t        j                  z         rt        d| d| d      |t        j                  z   j	                  |j                  t        j                        t        j                  z         rt        d| d| d      y )Ndocs_dirsite_dirzThe 'docs_dir' should not be within the 'site_dir' as this can mean the source files are overwritten by the output or it will be deleted if --clean is passed to mkdocs build. (site_dir: 'z', docs_dir: 'z')zThe 'site_dir' should not be within the 'docs_dir' as this leads to the build directory being copied into itself and duplicate nested files in the 'site_dir'. (site_dir: ')r5   r   rc  sepr   rstripr   )r,   rK   rL   r~  r  r>   s        r-   r   zSiteDir.post_validation  s    1*%*%
 rvv))(//"&&*ABFF*JK!  (jxjD  ++HOOBFF,Cbff,LM!  (jxjD  Nr0   ra   )rB   rd   re   rf   r   rh   ri   s   @r-   r|  r|    s     r0   r|  c                  6     e Zd ZdZdd fdZddZddZ xZS )	Themez\
    Theme Config Option.

    Validate that the theme exists and build Theme instance.
    c                0    t         |           || _        y rH   )r5   r.   r6   )r,   r6   r>   s     r-   r.   zTheme.__init__,  s    r0   c                &    |j                   | _         y rH   rO   rJ   s      r-   rM   zTheme.pre_validation0  s     & 7 7r0   c                h   || j                   d| j                   i}nOt        |t              rd|i}n:t        |t              rd|vrt	        d      |}nt	        dt        |       d      t        j                         }|d   *|d   |vr#t	        d|d    ddj                  |             |d   sd|vrt	        d	      d|v rqt        j                  j                  |d         sOt        j                  j                  | j                        }t        j                  j                  ||d         |d<   d|v r@t        j                  j                  |d         st	        d
j                  |d               d|v rt        |d   t              st	        d      t!        j"                  di |S )NrE   zNo theme name set.zInvalid type z'. Expected a string or key/value pairs.zUnrecognised theme name: 'z''. The available installed themes are: z, 
custom_dirz7At least one of 'name' or 'custom_dir' must be defined.z5The path set in custom_dir ('{path}') does not exist.r  localez'locale' must be a string.r+   )r6   r:   rX   rC   r   r8   r   get_theme_namesrg  rc  r  rf  rd  rI   rm  r   r   r  )r,   r[   theme_configthemesra  s        r-   r_   zTheme.run_validation3  s   =T\\5"DLL1Ls#"E?Lt$U"%&:;; L!U},ST  &&(+V0DF0R!,\&-A,B C77;yy7H6IK 
 F#L(H!"[\\ <'l<>X0Y)>)>?J)+j,|B\)]L&<'l<>X0Y!GNN%l3 O   |#J|H7Ms,S!">??{{*\**r0   rH   r   ra   )r[   rb   rc   ztheme.Theme)rB   rd   re   rf   r.   rM   r_   rh   ri   s   @r-   r  r  %  s    8'+r0   r  c                  6    e Zd ZdZddddZd Zed	d       Zy)
Navz:
    Nav Config Option.

    Validate the Nav config.
    Ttopc                  t        |t              r |D ]  }| j                  |        |r|sd }|S t        |t              r[|rY|sW| j                  j                  d| j                  |              |j                         D ]  }| j                  |d        |S t        |t              r|s	 |S t        d| j                  |             )NzExpected nav to be a list, got Fr  )r:   r   _validate_nav_itemrC   rY   r   
_repr_itemvaluesr_   rX   r   )r,   r[   r  subitems       r-   r_   zNav.run_validationd  s    eT"  1''015  t$sMM  #B4??SXCYBZ![\ <<> 8##G#78 	 s#C  "$CDOOTYDZC["\]]r0   c                &   t        |t              ry t        |t              rTt        |      dk7  rt	        d| j                  |             |j                         D ]  }| j                  |d        y t	        d| j                  |             )Nr4   z.Expected nav item to be a dict of size 1, got Fr  z.Expected nav item to be a string or dict, got )r:   rX   rC   r9   r   r  r  r_   )r,   r[   subnavs      r-   r  zNav._validate_nav_itemu  s    eS!t$5zQ%DT__UZE[D\]   ,,. 7##F#67 "@QVAW@XY r0   c                    t        |t              r|rdt        |j                                S t        |t        t        d       f      rt        |      S dt        |      j                   d|S )Nzdict with keys za r   )r:   rC   tuplekeysrX   r8   reprrB   )rD   r[   s     r-   r  zNav._repr_item  sb    eT"u$U5::<%8$9::T$Z01;U,,-Ry99r0   Nrx   r   )rB   rd   re   rf   r_   r  classmethodr  r+   r0   r-   r  r  ]  s*     48 " : :r0   r  c                      e Zd ZdZddZy)Privatez`A config option that can only be populated programmatically. Raises an error if set by the user.c                    |t        d      y )NzFor internal use only.)r   r   s     r-   r_   zPrivate.run_validation  s    !":;; r0   N)r[   rb   rc   r   r  r+   r0   r-   r  r    s
    j<r0   r  c                       e Zd ZdZ ee      Z	  eed      Z	  eed      Z		  eed      Z
	 dd	 fdZd Zd Z xZS )
ExtraScriptValuezZAn extra script to be added to the page. The `extra_javascript` config is a list of these.r   r   Fc                4    t         |   |       || _        y )NrO   )r5   r.   r  )r,   r  rI   r>   s      r-   r.   zExtraScriptValue.__init__  s    *:;	r0   c                    | j                   S rH   r  r   s    r-   r   zExtraScriptValue.__str__      yyr0   c                    | j                   S rH   r  r   s    r-   
__fspath__zExtraScriptValue.__fspath__  r  r0   )r   N)r  rX   )rB   rd   re   rf   r   rX   r  r8   r`   deferasync_r.   r   r  rh   ri   s   @r-   r  r    sN    d9D3R D4u%E7$&F7r0   r  c                  &     e Zd Z fdZddZ xZS )ExtraScriptc                N    t         |           t        t                  | _        y rH   )r5   r.   r$   r  r   )r,   r>   s    r-   r.   zExtraScript.__init__  s    $%568r0   c                    | j                   | j                  _         t        |t              r1|j	                  d      r| j                  j                  |dd      S |S | j                  j                  |      S )Nz.mjsmodule)r  r8   )rY   r   r:   rX   r   r_   r   s     r-   r_   zExtraScript.run_validation  sb    $(MM!eS!~~f%''66x7XYYL..u55r0   )r[   rb   rc   zExtraScriptValue | str)rB   rd   re   r.   r_   rh   ri   s   @r-   r  r    s    96r0   r  c                  X     e Zd ZdZddg f	 	 	 	 	 	 	 d	 fdZd
dZd ZddZddZ xZ	S )MarkdownExtensionsak  
    Markdown Extensions Config Option.

    A list or dict of extensions. Each list item may contain either a string or a one item dict.
    A string must be a valid Markdown extension name with no config options defined. The key of
    a dict item must be a valid Markdown extension name and the value must be a dict of config
    options for that extension. Extension configs are set on the private setting passed to
    `configkey`. The `builtins` keyword accepts a list of extensions which cannot be overridden by
    the user. However, builtins can be duplicated to define config options for them if desired.
    Nmdx_configsc                L    t        |   dd|i| |xs g | _        || _        y )Nr6   r+   )r5   r.   builtins	configkey)r,   r  r  r6   r   r>   s        r-   r.   zMarkdownExtensions.__init__  s,     	33F3 B"r0   c                    t        |t              st        d| d      |sy t        |t              st        d| d      || j                  |<   y )Nr   z)' is not a valid Markdown Extension name.z/Invalid config options for Markdown Extension 'z'.)r:   rX   r   rC   
configdata)r,   extcfgs      r-   validate_ext_cfgz#MarkdownExtensions.validate_ext_cfg  sW    #s#!AcU*S"TUU#t$!$STWSXXZ"[\\"r0   c                f    t               x|_        }t               |_        d|j                  _        y )Nr   )r   _current_pagers  src_path)r,   rK   rL   current_pages       r-   rM   z!MarkdownExtensions.pre_validation  s+    .=.??|+-%'"r0   c                H   i | _         t        |t        t        t        f      st        d      g }t        |t              r<|j                         D ](  \  }}| j                  ||       |j                  |       * n|D ]  }t        |t              rPt        |      dkD  rt        d      |j                         \  }}| j                  ||       |j                  |       ct        |t              r|j                  |       t        d       t        j                  | j                  |z         }t        j                          }|D ]   }	 |j#                  |f| j                          " |S # t$        $ r}g }t'        t)        j*                  t-        j.                         d               D ]"  }	|	j0                  s n|j3                  d|	       $ dj5                  t)        j6                  |            }
t        d| d|
 t9        |      j:                   d|       d }~ww xY w)	Nz)Invalid Markdown Extensions configurationr4      r   r   zFailed to load extension 'z'.
r   )r  r:   r   r  rC   r   itemsr  r   r9   popitemrX   r   reduce_listr  markdownMarkdownregisterExtensionsr  reversed	traceback
extract_tbsysexc_infolineinsertrg  format_listr8   rB   )r,   r[   
extensionsr  r  itemmdr]   stackframetbs              r-   r_   z!MarkdownExtensions.run_validation  s   +-%$t!45!"MNN
eT"!KKM 'S%%c3/!!#&'  
WdD)4y1}-.YZZ#||~HC))#s3%%c*c*%%d+)*UVV
W &&t}}z'AB
   	C%%sfdoo>	   
 %i&:&:3<<>!;L&MN +E ::LLE*+ WWY2259:%0T"d1g>N>N=OrRSQTU 
s   E,,	H!5B'HH!c                D    d |_         | j                  || j                  <   y rH   )r  r  r  rJ   s      r-   r   z"MarkdownExtensions.post_validation  s    #!%t~~r0   )r  zlist[str] | Noner  rX   r6   	list[str]rc   r   )r  rb   r  rb   rc   r   )r[   rb   rc   r  ra   )
rB   rd   re   rf   r.   r  rM   r_   r   rh   ri   s   @r-   r  r    sS    	 &*&		#"	# 	# 		# 
	##()V1r0   r  c                  V     e Zd ZdZdd	 fdZd Zd
dZedd       ZddZ	ddZ
 xZS )Pluginsz
    Plugins config option.

    A list or dict of plugins. If a plugin defines config options those are used when
    initializing the plugin class.
    c                    t        |   di | t        j                         | _        || _        d | _        i | _        y r   )r5   r.   r   get_pluginsinstalled_plugins	theme_keyr   plugin_cache)r,   r  r   r>   s      r-   r.   zPlugins.__init__  s:    "6"!(!4!4!6"&*;=r0   c                    || _         y rH   )r   rJ   s      r-   rM   zPlugins.pre_validation   s	    r0   c                   t        |t        t        t        f      st	        d      t        j                         | _        t               | _        | j                  |      D ]  \  }}| j                  ||        | j
                  S )Nz7Invalid Plugins configuration. Expected a list or dict.)r:   r   r  rC   r   r   PluginCollectionr   _instance_counter_parse_configsload_plugin_with_namespace)r,   r[   rE   r  s       r-   r_   zPlugins.run_validation#  sq    %$t!45!"[\\//1;B9,,U3 	7ID#++D#6	7||r0   c              #    K   t        |t              r>|j                         D ]*  \  }}t        |t              st	        d| d      ||f , y |D ]h  }t        |t              r-t        |      dk7  rt	        d      |j                         \  }}n|}i }t        |t              st	        d| d      ||f j y w)Nr   z' is not a valid plugin name.r4   zInvalid Plugins configuration)r:   rC   r  rX   r   r9   r  )rD   r[   rE   r  r  s        r-   r  zPlugins._parse_configs,  s     eT""[[]  	c!$,)AdV3P*QRRCi 
  
 dD)4yA~-.MNN $ID#DC!$,)AdV3P*QRRCi
 s   B=B?c                   d|v r|j                  d      re|dd  }n_| j                  rS| j                  rG| j                  | j                     }t        |t              s|d   }|r| d| }|| j
                  v r|}|| j                  ||      fS )Nr  r4   rE   )r   r  r   r:   rX   r  load_plugin)r,   rE   rK   current_themeexpanded_names        r-   r  z"Plugins.load_plugin_with_namespace@  s    $;s#ABx ~~$,, $T^^ <!-5$1&$9M '4oQtf$=M$(>(>>,d&&tV455r0   c           	        | j                   vrt        d d      |xs i }t        |t              st        d d      | j                  xx   dz  cc<   | j                     }}|dkD  r|d| z  }| j
                  j                  |      }|| j                      j                         }t        |t        j                        sZt        |j                   d|j                   dt        j                  j                   dt        j                  j                          |       }t        |d	      st        |d
      r|| j
                  |<   |dkD  r,t        |dd      s| j                  j!                  d d       d|v rtt#        d |j$                  D              sX|j'                  d      }t        |t(              st        d dt+        |             |st,        j/                  d| d       |S |j1                  || j2                  r| j2                  j4                  nd       \  }}	|	D ]]  }
t        |
t6              r"| j                  j!                  d| d|
        5|
\  }}| j                  j!                  d| d| d|        _ dj9                  fd|D              }|rt        |      || j                  |<   |S )NzThe "z" plugin is not installedz Invalid config options for the 'z	' plugin.r4   z #r   z must be a subclass of 
on_startupon_shutdownsupports_multiple_instancesFPlugin 'z|' was specified multiple times - this is likely a mistake, because the plugin doesn't declare `supports_multiple_instances`.enabledc              3  ,   K   | ]  }|d    dk(    yw)r   r  Nr+   )rS   pairs     r-   rV   z&Plugins.load_plugin.<locals>.<genexpr>u  s     *aD47i+?*as   z3' option 'enabled': Expected boolean but received: z&' is disabled in the config, skipping.rR   
' option '
c              3  :   K   | ]  \  }}d  d| d|   yw)r  r  rR   Nr+   )rS   rT   rU   rE   s      r-   rV   z&Plugins.load_plugin.<locals>.<genexpr>  s+     "cPXPSUXXdV:cU#cU#K"cs   )r  r   r:   rC   r  r  r   loadr;   r   
BasePluginrd   rB   hasattrr   rY   r   anyconfig_schemer   r`   r8   logdebugload_configr   rI   rX   rg  )r,   rE   rK   inst_number	inst_nameplugin
plugin_clsr  errorswarnswarningrT   rU   errors_messages    `            r-   r  zPlugins.load_pluginQ  s   t---!E$/H"IJJ2&$'!$DTF)"TUUt$)$,,T2	?2k]++I""&&y1>//5::<Jj'*<*<=%!,,-Qz/B/B.C D**556a8J8J8S8S7TV 
  \Fv|,0N/5!!),?763PRW#XMM  4& !T T s*aFL`L`*a'ajj+Ggt,%tf$WX\]dXeWfg  		HYK/UVW**T\\DLL11t
  	TG'3'$$x	{#gY%GH"S$$x	{*SESE%RS	T "c\b"cc!.11"(Yr0   rH   )r  r%   rc   r   )r[   rb   rc   zplugins.PluginCollection)r[   zlist | tuple | dictrc   zIterator[tuple[str, dict]])rE   rX   rc   ztuple[str, plugins.BasePlugin])rE   rX   rc   zplugins.BasePlugin)rB   rd   re   rf   r.   rM   r_   r  r  r  r  rh   ri   s   @r-   r  r    s5    >    &6"<r0   r  c                  n     e Zd ZdZd	 fdZd
dZddZ ej                  d      d        Z	d
dZ
 xZS )Hooksz?A list of Python scripts to be treated as instances of plugins.c                >    t         |           g | _        || _        y rH   )r5   r.   r6   plugins_key)r,   r  r>   s     r-   r.   zHooks.__init__  s    &r0   c                p    t        t        d            | _        | j                  j                  ||       y rz  )r   rr  _base_optionrM   rJ   s      r-   rM   zHooks.pre_validation  s*    'D(9:((:r0   c                   | j                   j                  |      }| j                  j                  | j                   j                         t	        |t
              sJ i }t        ||      D ]  \  }}| j                  ||      ||<    |S rH   )r  r)   rY   rZ   r:   r   r   
_load_hook)r,   r[   pathshooksrE   r  s         r-   r_   zHooks.run_validation  s~    !!**51T..778%&&&eU+ 	6JD$//$5E$K	6r0   N)maxsizec                >   dd l }|j                  j                  ||      }|t        d| d      |j                  j	                  |      }|t
        j                  |<   |j                  t        d| d      t
        j                  j                         }t
        j                  j                  dt        j                  j                  |             	 |j                  j                  |       |t
        j                  d d  |S # |t
        j                  d d  w xY w)Nr   zCannot import path 'z' as a Python module)importlib.utilutilspec_from_file_locationr   module_from_specr  modulesloaderr  copyr  rc  rd  exec_module)r,   rE   r  	importlibspecr  old_sys_paths          r-   r  zHooks._load_hook  s    ~~55dDA<!$8>R"STT006"D;;!$8>R"STTxx}}277??401	'KK##F+&CHHQK 'CHHQKs   D Dc                b    || j                      }||   j                         D ]
  \  }}|||<    y rH   )r  r  )r,   rK   rL   r   rE   hooks         r-   r   zHooks.post_validation  s<    ))* *002 	!JD$ GDM	!r0   )r  rX   rc   r   ra   )r[   rb   rc   zMapping[str, Any])rB   rd   re   rf   r.   rM   r_   r<   	lru_cacher  r   rh   ri   s   @r-   r  r    s;    I'
; Y& '(!r0   r  c                      e Zd ZdZddZy)PathSpecz.A path pattern based on gitignore-like syntax.c                   t        |t              st        dt        |       d      	 t        j
                  j                  j                  |j                               S # t        $ r}t        t        |            d }~ww xY w)Nz#Expected a multiline string, but a r   )lines)
r:   rX   r   r8   pathspec	gitignoreGitIgnoreSpec
from_lines
splitlinesr   rU  s      r-   r_   zPathSpec.run_validation  ss    %%!$GU}T_"`aa	*%%33>>UEUEUEW>XX 	*!#a&))	*s   7A" "	B+A??BN)r[   rb   rc   z pathspec.gitignore.GitIgnoreSpecr  r+   r0   r-   r  r    s
    8*r0   r  )[
__future__r   r<   r  loggingrc  rW  r  r  typesrY   collectionsr   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   urllib.parser   rF  r   r   r  r  pathspec.gitignoremkdocsr   r   r   mkdocs.config.baser   r   r   r   r   mkdocs.exceptionsr   r    r!   	getLoggerrB   r  r$   rk   rz   r   rX   r   r   r   r   r   r   r   r  r  r!  r7  r@  rY  r]  rk  ro  rr  rv  r|  r  r  r  r  r  r  r  r  
ModuleTyper  r   r!  r  r+   r0   r-   <module>r0     s$   "    	  
    + !    + -    ( (  1CL\0
g!F
#%5j%A FR-9Z0'*2E -.&*%5a%8 &*R43'!*.tAw7 43n6'!*.tCF|< 6r'+l+ ',#71:)!, #DWQZ+A. 6D-! D-N*j *+"?3 +:"]
S
! "]J%-wqz+E!T'N; %-P#&c #&L$d3i $.!&s+ !H)tCy ).&tCy &2
 c  !+c" !0c >5+U[[) 5+p.:
 .:b<gaj*1- <v .6"5)93)>#?@ 6S1+DI6 S1l| !9!9: |~.!T%"2"234 .!b	* 2 2 @ @A 	*r0   