
    -PhL                    
   U d Z ddlmZ ddlZddlZddlZddlmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ er"ddlmZmZmZmZ ddlmZmZmZ ddlmZ ddl m!Z! dZ"dZ# ed ej$        ej$        ej%        ej&        ej'        e#ej(        d          Z)de*d<    ed ej'        e#ej(        d          Z+de*d<   ej%        dej&        dej(        diZ,de*d<   ddd"Z-ded&Z. G d' d(ej/                  Z0 G d) d*e0          Z1 G d+ d,e0          Z2 G d- d!ej3        ej4                           Z5 G d. d/ej6        d0                   Z7 G d1 d2ej6        d0                   Z8 G d3 d4ej9        j:                  Z;e
dfd6            Z<e
dgd8            Z=e
dgd9            Z>eZ?e
dhd<            Z@ G d= d>          ZA G d? d@ejB                  ZC G dA dBejB                  ZDdidHZE G dI dJejB                  ZF G dK dLejB                  ZG G dM dNejB                  ZH G dO dPejB                  ZI G dQ dReI          ZJ G dS dTeI          ZKdjdXZL G dY dZejM                  ZN G d[ d0          ZO G d\ d]          ZPdkdcZQdS )lz%Logging utility functions for Sphinx.    )annotationsN)defaultdict)contextmanagernullcontext)TYPE_CHECKING)nodes)get_source_line)	colourise)SphinxWarning)IteratorMappingSequenceSet)IOAnyNoReturn)Node)Sphinxsphinx   c                     t           j        S N)loggingWARNING     S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sphinx/util/logging.py<lambda>r      s    GO r   )CRITICALSEVEREERRORr   INFOVERBOSEDEBUGzdefaultdict[str, int]LEVEL_NAMESc                     t           j        S r   )r   NOTSETr   r   r   r   r   ,   s    GN r   )r         zdefaultdict[int, int]VERBOSITY_MAPdarkredreddarkgrayzdict[int, str]	COLOR_MAPnamestrreturnSphinxLoggerAdapterc                n    t          j        t          dz   | z             }d|_        t	          |i           S )a  Get logger wrapped by :class:`sphinx.util.logging.SphinxLoggerAdapter`.

    Sphinx logger always uses ``sphinx.*`` namespace to be independent from
    settings of root logger.  It ensures logging is consistent even if a
    third-party extension or imported application resets logger settings.

    Example usage::

        >>> from sphinx.util import logging
        >>> logger = logging.getLogger(__name__)
        >>> logger.info('Hello, this is an extension!')
        Hello, this is an extension!
    .F)r   	getLogger	NAMESPACEdisabledr2   )r/   loggers     r   r5   r5   ;   s4     y3566FFOvr***r   recordslist[logging.LogRecord]Nonec                    | D ]a}|                                 |_        d|_        t          |dd          }t	          |t
          j                  rt          |          |_        bdS )zConvert LogRecord serializable.r   locationN)	
getMessagemsgargsgetattr
isinstancer   r   get_node_locationr=   )r9   rr=   s      r   convert_serializablerE   Q   sf     5 51j$//h
++ 	5*844AJ5 5r   c                  8     e Zd ZU dZdZdZded<   d	 fdZ xZS )
SphinxLogRecordz$Log record class supporting location Nr   r=   r1   r0   c                    t                                                      }t          | dd           }|r| d| j         | }n| j        |vr
| j        |z   }|S )Nr=   z: )superr>   rA   prefix)selfmessager=   	__class__s      r   r>   zSphinxLogRecord.getMessagec   sk    ''$$&&4T22 	,!;;T[;';;GG[''kG+Gr   r1   r0   )	__name__
__module____qualname____doc__rK   r=   __annotations__r>   __classcell__rN   s   @r   rG   rG   ]   s[         ..FH         r   rG   c                      e Zd ZdZdZdS )SphinxInfoLogRecordz)Info log record class supporting locationrH   N)rP   rQ   rR   rS   rK   r   r   r   rX   rX   n   s        33FFFr   rX   c                  *    e Zd ZdZedd            ZdS )SphinxWarningLogRecordz,Warning log record class supporting locationr1   r0   c                b    | j         t          j        k    rdS | j         t          j        k    rdS dS )Nz
CRITICAL: zERROR: z	WARNING: )levelnor   r   r!   rL   s    r   rK   zSphinxWarningLogRecord.prefixw   s0    <7+++<\W]**9;r   NrO   )rP   rQ   rR   rS   propertyrK   r   r   r   rZ   rZ   t   s8        66   X  r   rZ   c                  `     e Zd ZdZg dZd" fdZd#dZd$dZd%dZdddddddd& fd!Z	 xZ
S )'r2   z9LoggerAdapter allowing ``type`` and ``subtype`` keywords.typesubtyper=   nonlcoloroncelevel	int | strr?   r0   r@   r   kwargsr1   r;   c                    t          |t                    r  t                      j        ||g|R i | d S t          |         } t                      j        ||g|R i | d S r   )rB   intrJ   logr%   )rL   rf   r?   r@   rh   r\   rN   s         r   rk   zSphinxLoggerAdapter.log   s}     eS!! 	7EGGKs4T444V44444!%(GEGGK6t666v66666r   c                4     | j         t          |g|R i | d S r   )rk   r#   )rL   r?   r@   rh   s       r   verbosezSphinxLoggerAdapter.verbose   s,    #/////////r   dict[str, Any]tuple[str, dict[str, Any]]c                    |                     di           }| j        D ]}||v r|                    |          ||<   ||fS )Nextra)
setdefaultKEYWORDSpop)rL   r?   rh   rq   keywords        r   processzSphinxLoggerAdapter.process   sS    !!'2..} 	5 	5G&  !'G!4!4gF{r   recordlogging.LogRecordc                :    | j                             |           d S r   )r8   handlerL   rw   s     r   rz   zSphinxLoggerAdapter.handle   s    6"""""r   NTFobjectra   
str | Nonerb   r=   1str | tuple[str | None, int | None] | Node | Nonerc   boolrd   re   c          
     L     t                      j        |g|R ||||||d|	S )aj  Log a sphinx warning.

        It is recommended to include a ``type`` and ``subtype`` for warnings as
        these can be displayed to the user using :confval:`show_warning_types`
        and used in :confval:`suppress_warnings` to suppress specific warnings.

        It is also recommended to specify a ``location`` whenever possible
        to help users in correcting the warning.

        :param msg: The message, which may contain placeholders for ``args``.
        :param args: The arguments to substitute into ``msg``.
        :param type: The type of the warning.
        :param subtype: The subtype of the warning.
        :param location: The source location of the warning's origin,
            which can be a string (the ``docname`` or ``docname:lineno``),
            a tuple of ``(docname, lineno)``,
            or the docutils node object.
        :param nonl: Whether to append a new line terminator to the message.
        :param color: A color code for the message.
        :param once: Do not log this warning,
            if a previous warning already has same ``msg``, ``args`` and ``once=True``.
        r`   )rJ   warning)rL   r?   ra   rb   r=   rc   rd   re   r@   rh   rN   s             r   r   zSphinxLoggerAdapter.warning   sX    D uww



 

 

 

 

 

 
	
r   )
rf   rg   r?   r0   r@   r   rh   r   r1   r;   )r?   r0   r@   r   rh   r   r1   r;   )r?   r0   rh   rn   r1   ro   rw   rx   r1   r;   )r?   r|   r@   r|   ra   r}   rb   r}   r=   r~   rc   r   rd   r}   re   r   rh   r   r1   r;   )rP   rQ   rR   rS   rs   rk   rm   rv   rz   r   rU   rV   s   @r   r2   r2      s        CCGGGH7 7 7 7 7 70 0 0 0   # # # #  "FJ ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
 ,
r   c                      e Zd ZdZdS )WarningStreamHandlerzStreamHandler for warnings.N)rP   rQ   rR   rS   r   r   r   r   r      s        %%Dr   r   SafeEncodingWriterc                  $     e Zd ZdZd fdZ xZS )NewLineStreamHandlerzAStreamHandler which switches line terminator by record.nonl flag.rw   rx   r1   r;   c                   	 |                                   t          |dd          rd| _        t                                          |           d| _        |                                  d S # d| _        |                                  w xY w)Nrc   FrH   
)acquirerA   
terminatorrJ   emitrelease)rL   rw   rN   s     r   r   zNewLineStreamHandler.emit   sz    	LLNNNvvu-- %"$GGLL   "DOLLNNNNN #DOLLNNNNs   AA- -B
r   )rP   rQ   rR   rS   r   rU   rV   s   @r   r   r      sC        KK	 	 	 	 	 	 	 	 	 	r   r   c                  P     e Zd ZU dZded<   d fdZdd
ZddZddZddZ	 xZ
S )MemoryHandlerzHandler buffering all logs.r:   bufferr1   r;   c                J    t                                          d           d S )N)rJ   __init__)rL   rN   s    r   r   zMemoryHandler.__init__   s!    r   rw   rx   r   c                    dS )NFr   r{   s     r   shouldFlushzMemoryHandler.shouldFlush   s    ur   c                    d S r   r   r]   s    r   flushzMemoryHandler.flush   s	     	r   r8   logging.Loggerc                    |                                   	 | j        D ]}|                    |           g | _        |                                  d S # |                                  w xY wr   )r   r   rz   r   )rL   r8   rw   s      r   flushTozMemoryHandler.flushTo   sd    	+ & &f%%%%DKLLNNNNNDLLNNNNs   &A A(c                $    | j         g c}| _         |S r   )r   )rL   r   s     r   clearzMemoryHandler.clear   s    "k2r   r1   r;   rw   rx   r1   r   )r8   r   r1   r;   )r1   r:   )rP   rQ   rR   rS   rT   r   r   r   r   r   rU   rV   s   @r   r   r      s         %%####           
          r   r   Iterator[logging.Handler]c               #    K   t          j        t                    } t                      }|                    t           j                   	 g }| j        dd         D ]A}t          |t                    r*| 	                    |           |
                    |           B|                     |           |V  | 	                    |           |D ]}|                     |           |                    |            dS # | 	                    |           |D ]}|                     |           |                    |            w xY w)zgContext manager to postpone logging warnings temporarily.

    Similar to :func:`pending_logging`.
    N)r   r5   r6   r   setLevelr   handlersrB   r   removeHandlerappend
addHandlerr   r8   
memhandlerr   handlers       r   pending_warningsr      s`      y))FJ(((#qqq) 	) 	)G'#788 )$$W---(((*%%%Z((( 	' 	'Gg&&&&6""""" 	Z((( 	' 	'Gg&&&&6""""s   
A,C< <AEIterator[MemoryHandler]c               #    K   t          j        t                    } t                      }	 g }| j        dd         D ],}|                     |           |                    |           -|                     |           |V  |                     |           |D ]}|                     |           dS # |                     |           |D ]}|                     |           w xY w)zContext manager to suppress logging all logs temporarily.

    For example::

        >>> with suppress_logging():
        >>>     logger.warning('Warning message!')  # suppressed
        >>>     some_long_process()
        >>>
    N)r   r5   r6   r   r   r   r   r   r   s       r   suppress_loggingr     s      y))FJ'qqq) 	% 	%G  )))OOG$$$$*%%%Z((( 	' 	'Gg&&&&	' 	' 	Z((( 	' 	'Gg&&&&	's   AB3 31C$c               #     K   t          j        t                    } 	 t                      5 }|V  ddd           n# 1 swxY w Y   |                    |            dS # |                    |            w xY w)a$  Context manager to postpone logging all logs temporarily.

    For example::

        >>> with pending_logging():
        >>>     logger.warning('Warning message!')  # not flushed yet
        >>>     some_long_process()
        >>>
        Warning message!  # the warning is flushed here
    N)r   r5   r6   r   r   )r8   r   s     r   pending_loggingr   8  s       y))F# 	:	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	6"""""
6""""s+   A <A A  A A A A5rK   Iterator[None]c              #    K   t          j        t                    }d}|j        D ]}t	          |t
                    r|} ndV  dS d}|j        D ]}t	          |t                    r|} n|r(	 |j        }| |_        dV  ||_        dS # ||_        w xY wt          |           }	 |	                    |           dV  |
                    |           dS # |
                    |           w xY w)zContext manager to prepend prefix to all warning log records temporarily.

    For example::

        >>> with prefixed_warnings("prefix:"):
        >>>     logger.warning('Warning message!')  # => prefix: Warning message!

    .. versionadded:: 2.0
    N)r   r5   r6   r   rB   r   filtersMessagePrefixFilterrK   	addFilterremoveFilter)rK   r8   warning_handlerr   prefix_filter_filterpreviouss          r   prefixed_warningsr   O  sH      y))FO?  g344 	%OE	
 	M"*  g233 	#ME	  8	,$+H#)M EEE#+M   8M ++++ ,F33	8%%m444EEE((77777O((7777s   /B
 
	B&C C-c                  .    e Zd ZddZedd            ZdS )	LogCollectorr1   r;   c                    g | _         d S r   )logsr]   s    r   r   zLogCollector.__init__~  s    -/			r   r   c              #     K   t                      5 }d V  |                                | _        d d d            d S # 1 swxY w Y   d S r   )r   r   r   )rL   r   s     r   collectzLogCollector.collect  s       	+*EEE"((**DI	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   <A A Nr   )r1   r   )rP   rQ   rR   r   r   r   r   r   r   r   r   }  sH        0 0 0 0 + + + ^+ + +r   r   c                      e Zd ZdZddZdS )	
InfoFilterz"Filter error and warning messages.rw   rx   r1   r   c                ,    |j         t          j        k     S r   )r\   r   r   r{   s     r   filterzInfoFilter.filter  s    ~//r   Nr   rP   rQ   rR   rS   r   r   r   r   r   r     s.        ,,0 0 0 0 0 0r   r   c                      e Zd ZdZddZdS )	_RaiseOnWarningFilterz(Raise exception if a warning is emitted.rw   rx   r1   r   c                    	 |j         |j        z  }n# t          t          f$ r
 |j         }Y nw xY wt	          |dd          x}r| d| }|j        t          |          |j        d         t          |          )Nr=   rH   :r(   )r?   r@   	TypeError
ValueErrorrA   exc_infor   )rL   rw   rM   r=   s       r   r   z_RaiseOnWarningFilter.filter  s    	!j6;.GG:& 	! 	! 	!jGGG	!vz26668 	.!--G--G?&((foa.@@G$$$s    --N)rw   rx   r1   r   r   r   r   r   r   r     s.        22	% 	% 	% 	% 	% 	%r   r   warning_typesub_typesuppress_warningsSet[str] | Sequence[str]r   c                ~    | t          |          dk    rdS t          |          }| |v rdS |  d|v rdS |  d| |v S )z/Check whether the warning is suppressed or not.Nr   FTz.*r4   )len	frozenset)r   r   r   suppressed_warningss       r   is_suppressed_warningr     sv     s#455::u#$566***t
111t''X''+>>>r   c                  ,     e Zd ZdZd fdZdd
Z xZS )WarningSuppressorz#Filter logs by `suppress_warnings`.appr   r1   r;   c                V    || _         t                                                       d S r   r   rJ   r   rL   r   rN   s     r   r   zWarningSuppressor.__init__  &    r   rw   rx   r   c                    t          |dd          }t          |dd          }	 | j        j        j        }n# t          $ r d}Y nw xY wt          |||          rdS | j        xj        dz  c_        dS )Nra   rH   rb   r   Fr(   T)rA   r   configr   AttributeErrorr   
_warncount)rL   rw   ra   rb   r   s        r   r   zWarningSuppressor.filter  s    vvr**&)R00	# $ A 	# 	# 	# "	# !w0ABB 	5H1$4   6 AAr   r   r1   r;   r   rP   rQ   rR   rS   r   r   rU   rV   s   @r   r   r     sW        --            r   r   c                  ,     e Zd ZdZd fdZdd
Z xZS )r   z"Prepend prefix to all log records.rK   r0   r1   r;   c                V    || _         t                                                       d S r   )rK   rJ   r   )rL   rK   rN   s     r   r   zMessagePrefixFilter.__init__  s&    r   rw   rx   r   c                B    | j         r| j         dz   |j        z   |_        dS )N T)rK   r?   r{   s     r   r   zMessagePrefixFilter.filter  s&    ; 	8s*VZ7FJtr   )rK   r0   r1   r;   r   r   rV   s   @r   r   r     sW        ,,            r   r   c                  .     e Zd ZdZdd fdZddZ xZS )
OnceFilterzShow the message only once.rH   r/   r0   r1   r;   c                X    t                                          |           i | _        d S r   )rJ   r   messages)rL   r/   rN   s     r   r   zOnceFilter.__init__  s+      	r   rw   rx   r   c                    t          |dd          }|sdS | j                            |j        g           }|j        |v rdS |                    |j                   dS )Nre   rH   TF)rA   r   rr   r?   r@   r   )rL   rw   re   paramss       r   r   zOnceFilter.filter  sd    vvr** 	4]--fj"==F{f$$uMM&+&&&4r   )rH   )r/   r0   r1   r;   r   r   rV   s   @r   r   r     s\        %%      
 
 
 
 
 
 
 
r   r   c                  8     e Zd ZU dZded<   d fdZddZ xZS )SphinxLogRecordTranslatorzConverts a log record to one Sphinx expects

    * Make a instance of SphinxLogRecord
    * docname to path if location given
    * append warning type/subtype to message if :confval:`show_warning_types` is ``True``
    ztype[logging.LogRecord]LogRecordClassr   r   r1   r;   c                V    || _         t                                                       d S r   r   r   s     r   r   z"SphinxLogRecordTranslator.__init__  r   r   rw   rZ   r   c                   t          |t          j                  r| j        |_        t          |dd           }t          |t                    ra|\  }}|rR|r*| j        j        	                    |           d| |_
        n| j        j        	                    |           |_
        nbd |_
        nZt          |t          j                  rt          |          |_
        n+|r)d|vr%| j        j        	                    |           |_
        dS )Nr=   r   T)rB   r   	LogRecordr   rN   rA   tupler   envdoc2pathr=   r   r   rC   )rL   rw   r=   docnamelinenos        r   r   z SphinxLogRecordTranslator.filter  s
   fg/00 	3#2F6:t44h&& 	C&OGV ' J)-)>)>w)G)G&R&R&&R&RFOO)-)>)>w)G)G&IFOO"&%*-- 	C/99FOO 	C#X--!%!6!6x!@!@BFOtr   r   rw   rZ   r1   r   )rP   rQ   rR   rS   rT   r   r   rU   rV   s   @r   r   r     sk           ,+++            r   r   c                      e Zd ZdZeZdS )InfoLogRecordTranslatorz/LogRecordTranslator for INFO level log records.N)rP   rQ   rR   rS   rX   r   r   r   r   r   r     s        99(NNNr   r   c                  (     e Zd ZdZeZd fdZ xZS )WarningLogRecordTranslatorz2LogRecordTranslator for WARNING level log records.rw   rZ   r1   r   c                <   t                                          |          }	 | j        j        j        }n# t
          $ r d}Y nw xY w|rRt          |dd          x}r?t          |dd          x}r|xj        d| d| dz  c_        n|xj        d| dz  c_        |S )NFra   rH   rb   z [r4   ])rJ   r   r   r   show_warning_typesr   rA   r?   )rL   rw   retr   log_typelog_subtyperN   s         r   r   z!WarningLogRecordTranslator.filter  s    ggnnV$$	'!%!C 	' 	' 	'!&	'  	3"662666x 3")&)R"@"@@; 3JJ"@x"@"@+"@"@"@@JJJJJ"2x"2"2"22JJ
r   r   )rP   rQ   rR   rS   rZ   r   r   rU   rV   s   @r   r   r     sH        <<+N         r   r   noder   r}   c                    t          |           \  }}|r&|r$t          j                            |           d| S |r"t          j                            |           dS |rd| S d S )Nr   z
<unknown>:)r	   ospathabspath)r  sourcelines      r   rC   rC   *  s    "4((LFD 3$ 3'//&))22D222 -'//&)),,,, #"D"""4r   c                        e Zd Zd fdZ xZS )ColorizeFormatterrw   rx   r1   r0   c                    t                                          |          }t          |dd          }|s t                              |j        d          }|s|S 	 t          ||          S # t          $ r |cY S w xY w)Nrd   rH   )rJ   formatrA   r.   getr\   r
   r   )rL   rw   rM   colour_namerN   s       r   r  zColorizeFormatter.format6  s    ''..((fgr22 	<#--;;K 	N	['222 	 	 	NNN	s   A+ +A:9A:)rw   rx   r1   r0   )rP   rQ   rR   r  rU   rV   s   @r   r  r  5  s=        
 
 
 
 
 
 
 
 
 
r   r  c                  *    e Zd ZdZddZdd	Zdd
ZdS )r   z7Stream writer which ignores UnicodeEncodeError silentlystreamIO[str]r1   r;   c                D    || _         t          |dd          pd| _        d S )Nencodingascii)r  rA   r  )rL   r  s     r   r   zSafeEncodingWriter.__init__F  s%    
G<<Gr   datar0   c                    	 | j                             |           d S # t          $ rO | j                             |                    | j        d                              | j                             Y d S w xY w)Nreplace)r  writeUnicodeEncodeErrorencoder  decoderL   r  s     r   r  zSafeEncodingWriter.writeJ  s    	Kd#####! 	 	 	 KDM955<<T]KK     	s    AA76A7c                f    t          | j        d          r| j                                         d S d S )Nr   )hasattrr  r   r]   s    r   r   zSafeEncodingWriter.flushT  s:    4;(( 	 K	  	 r   N)r  r  r1   r;   r  r0   r1   r;   r   )rP   rQ   rR   rS   r   r  r   r   r   r   r   r   C  sZ        AAH H H H              r   c                  "    e Zd ZdZddZddZdS )LastMessagesWriterzBStream writer storing last 10 messages in memory to save trackbackr   r   r  r  r1   r;   c                    || _         d S r   )r   )rL   r   r  s      r   r   zLastMessagesWriter.__init__\  s    r   r  r0   c                D    | j         j                            |           d S r   )r   
messagelogr   r  s     r   r  zLastMessagesWriter.write_  s!    ""4(((((r   N)r   r   r  r  r1   r;   r   )rP   rQ   rR   rS   r   r  r   r   r   r"  r"  Y  sB        LL   ) ) ) ) ) )r   r"  r   r   statusr  r   c                <   t          j        t                    }|                    t           j                   d|_        |j        dd         D ]}|                    |           t          t          |                    }|
                    t                                 |
                    t          |                      |                    t          | j                            |                    t!                                 t#          t          |                    }| j        r!|
                    t'                                 |
                    t)          |                      |
                    t+          |                      |
                    t-                                 |                    t           j                   |                    t!                                 t          j        t3          | |                    }|
                    t                                 |                    t          | j                            |                    |           |                    |           |                    |           dS )zSetup root logger for SphinxFN)r   r5   r6   r   r$   	propagater   r   r   r   r   r   r   r*   	verbositysetFormatterr  r   _exception_on_warningr   r   r   r   r   StreamHandlerr"  r   )r   r&  r   r8   r   info_handlerr   messagelog_handlers           r   setupr/  c  s3   y))F
OOGM"""F ?111% & &W%%%%'(:6(B(BCCL:<<(((2377888-6777/11222*+=g+F+FGGO
  ;!!"7"9"9:::/445558==>>>jll+++W_---  !2!4!4555 ./A#v/N/NOO  ...cm <===
l###
o&&&
()))))r   )r/   r0   r1   r2   )r9   r:   r1   r;   )r1   r   )r1   r   )rK   r0   r1   r   )r   r0   r   r0   r   r   r1   r   )r  r   r1   r}   )r   r   r&  r  r   r  r1   r;   )RrS   
__future__r   r   logging.handlersos.pathr  collectionsr   
contextlibr   r   typingr   docutilsr   docutils.utilsr	   sphinx._cli.util.colourr
   sphinx.errorsr   collections.abcr   r   r   r   r   r   r   docutils.nodesr   sphinx.applicationr   r6   r#   r   r!   r   r"   r$   r%   rT   r*   r.   r5   rE   r   rG   rX   rZ   LoggerAdapterLoggerr2   r,  r   r   r   BufferingHandlerr   r   r   r   skip_warningiserrorr   r   Filterr   r   r   r   r   r   r   r   r   rC   	Formatterr  r   r"  r/  r   r   r   <module>rC     sY   + + + " " " " " "       # # # # # # 2 2 2 2 2 2 2 2                   * * * * * * - - - - - - ' ' ' ' ' ' *@@@@@@@@@@@@((((((((((######)))))) 	
%0[$"? & &     (3{<= ( (     M9OUM:	    + + + +,	5 	5 	5 	5    g'   "    /   
 
 
 
 
_ 
 
 
H
 H
 H
 H
 H
'/? H
 H
 H
V	 	 	 	 	701EF 	 	 	    701EF       G$5   < # # # #6 ' ' ' '8 # # # #& "  *8 *8 *8 *8Z	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+0 0 0 0 0 0 0 0% % % % %GN % % %? ? ? ?       0
 
 
 
 
'. 
 
 
       ," " " " " " " "J) ) ) ) )7 ) ) )    !:   .       )                  ,) ) ) ) ) ) ) )* * * * * *r   