
    .CcW                        d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZ g d	Z G d
 de          Z eg           Z G d de          Zd Z G d de          Zd Zd Z G d de          Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d  Z'd! Z(d" Z)d# Z*d$ Z+ G d% d&e          Z,i d'd(g fd)d(g fd*d(g fd+d(d+gfd,d(g fd-d.g fd/d.g fd0d(g fd1d(g fd2d.g fd3d(g fd4d.g fd5d(g fd6d.g fd7d(d+gfd8d.d+gfd9d.d+gfi d:d(d+gfd;d(g fd<d(d+d=gfd>d(d+d=gfd?d(d+d=gfd@d(d+d=gfdAd(d+d=gfdBd(d+gfdCd(d+d=gfdDd(d+dEgfdFd(d+gfdGd(g dHfdId(d+dJgfdKd(dLgfdMd(dLgfdNd(dLdOgfdPd(dOdQgfi dRd(dLgfdSd(g dTfdUd(dOgfdVd(g dWfdXd(g fdYd(g fdZd(g fd[d(g fd\d(g d]fd^d(g d]fd_d(g d`fdad(g dbfdcd(g d]fddd(g defdfd(g dgfdhd(g difdjd(d+dLgfi dkd(g dlfdmd(g dnfdod(g dpfdqd(d+gfdrd(g dsfdtd(g dufdvd(d+gfdwd(d+d=gfdxd(g d]fdyd.g d]fdzd.g fd{d(d+d=gfd|d(g d(d+d=gfd}d.d~gd(d+d=gfdd.d~gd(d+d=gfdd.g dd(d+d=gfdd.g d(g fi dd(d~gd(d+d=gfdd(g dfdd(g dfdd(d=dLgfdd(g dfdd(g dfdd(g dfdd(g dfdd(g fdd.g fdd(g fdd.g fdd(d+gfdd(d+gfdd(d+gfdd.g fZ-g dZ.d Z/d Z0d Z1d Z2d Z3dS )    )print_functionN
PatsyError)	ParseNodeTokenparse_formula)EvalEnvironment
EvalFactor)uniqueify_list)repr_pretty_delegaterepr_pretty_impl)no_picklingassert_no_pickling)Term	ModelDesc	INTERCEPTc                   >    e Zd ZdZd Zd Zd Zd ZeZ	d Z
d ZeZdS )	r   a  The interaction between a collection of factor objects.

    This is one of the basic types used in representing formulas, and
    corresponds to an expression like ``"a:b:c"`` in a formula string.
    For details, see :ref:`formulas` and :ref:`expert-model-specification`.

    Terms are hashable and compare by value.

    Attributes:
    
    .. attribute:: factors

       A tuple of factor objects.
    c                 H    t          t          |                    | _        d S N)tupler   factors)selfr   s     *lib/python3.11/site-packages/patsy/desc.py__init__zTerm.__init__+   s    ^G4455    c                     t          |t                    o)t          |j                  t          | j                  k    S r   )
isinstancer   	frozensetr   r   others     r   __eq__zTerm.__eq__.   s7    5$'' Hem,,	$,0G0GG	Ir   c                     | |k     S r    r   s     r   __ne__zTerm.__ne__2   s    5=  r   c                 R    t          t          t          | j                  f          S r   )hashr   r   r   r   s    r   __hash__zTerm.__hash__5   s    T9T\223444r   c                 V    |rJ t          || t          | j                  g           d S r   )r   listr   r   pcycles      r   _repr_pretty_zTerm._repr_pretty_9   s3    D4#5#5"677777r   c                 \    | j         r$d                    d | j         D                       S dS )z+Return a human-readable name for this term.:c                 6    g | ]}|                                 S r#   )name).0fs     r   
<listcomp>zTerm.name.<locals>.<listcomp>@   s     <<<!QVVXX<<<r   	Intercept)r   joinr'   s    r   r2   z	Term.name=   s4    < 	88<<t|<<<===;r   N)__name__
__module____qualname____doc__r   r!   r$   r(   r   __repr__r.   r2   r   __getstate__r#   r   r   r   r      s         6 6 6I I I! ! !5 5 5 $H8 8 8   LLLr   r   c                       e Zd Zd Zd ZdS )_MockFactorc                     || _         d S r   _name)r   r2   s     r   r   z_MockFactor.__init__I   s    


r   c                     | j         S r   rA   r'   s    r   r2   z_MockFactor.nameL   s
    zr   N)r8   r9   r:   r   r2   r#   r   r   r?   r?   H   s2              r   r?   c                  p   t          g d          j        dk    sJ t          ddg          t          ddg          k    sJ t          t          ddg                    t          t          ddg                    k    sJ t          d          } t          d          }t          | |g                                          dk    sJ t          || g                                          dk    sJ t          g                                           d	k    sJ t          t          g                      d S )
N)      rE   )rE   rF   rE   rF   aba:bzb:ar6   )r   r   r&   r?   r2   r   )f1f2s     r   	test_TermrL   O   s   			??"f,,,,A<<4A<<''''aVdAq6ll!3!33333	S		B	S		BR>>  E))))R>>  E))))88==??k))))tBxx     r   c                   B    e Zd ZdZd ZeZd Zd Ze	d             Z
eZdS )r   a  A simple container representing the termlists parsed from a formula.

    This is a simple container object which has exactly the same
    representational power as a formula string, but is a Python object
    instead. You can construct one by hand, and pass it to functions like
    :func:`dmatrix` or :func:`incr_dbuilder` that are expecting a formula
    string, but without having to do any messy string manipulation. For
    details see :ref:`expert-model-specification`.

    Attributes:

    .. attribute:: lhs_termlist
                   rhs_termlist

       Two termlists representing the left- and right-hand sides of a
       formula, suitable for passing to :func:`design_matrix_builders`.
    c                 V    t          |          | _        t          |          | _        d S r   )r   lhs_termlistrhs_termlist)r   rO   rP   s      r   r   zModelDesc.__init__m   s(    *<88*<88r   c                 N    |rJ t          || g d| j        fd| j        fg          S )NrO   rP   )r   rO   rP   r+   s      r   r.   zModelDesc._repr_pretty_r   sF    4 ""0$2C!D"0$2C!D!FG G 	Gr   c                 d   d d                     fd| j        D                       }|r|dz  }n|dz  }| j        t          gk    r| t                    z  }nSg }t          | j        vr|                    d           |fd| j        D             z  }|d                     |          z  }|S )a  Returns a human-readable representation of this :class:`ModelDesc`
        in pseudo-formula notation.

        .. warning:: There is no guarantee that the strings returned by this
           function can be parsed as formulas. They are best-effort
           descriptions intended for human users. However, if this ModelDesc
           was created by parsing a formula, then it should work in
           practice. If you *really* have to.
        c                 D    | t           k    rdS |                                 S )N1)r   r2   )terms    r   	term_codez%ModelDesc.describe.<locals>.term_code   s"    y  #syy{{"r   z + c                 &    g | ]} |          S r#   r#   r3   rU   rV   s     r   r5   z&ModelDesc.describe.<locals>.<listcomp>   s!    KKKYYt__KKKr   z ~ z~ 0c                 <    g | ]}|t           k     |          S r#   r   rX   s     r   r5   z&ModelDesc.describe.<locals>.<listcomp>   s:     1 1 1t"i/199T?? 1 1 1r   )r7   rO   rP   r   append)r   result
term_namesrV   s      @r   describezModelDesc.describey   s    	# 	# 	#
 KKKK9JKKKLL 	eOFFdNF+ 	-ii	***FFJ 11 '!!#&&& 1 1 1 1t7H 1 1 1 1Jejj,,,Fr   c                     t          |t                    r|}nt          |          }t                                          |d          }t          ||           sJ |S )a$  Construct a :class:`ModelDesc` from a formula string.

        :arg tree_or_string: A formula string. (Or an unevaluated formula
          parse tree, but the API for generating those isn't public yet. Shh,
          it can be our secret.)
        :returns: A new :class:`ModelDesc`.
        F)require_evalexpr)r   r   r   	Evaluatoreval)clstree_or_stringtreevalues       r   from_formulazModelDesc.from_formula   sa     ni00 	1!DD 00D   >>%%%%%%r   N)r8   r9   r:   r;   r   r   r<   r.   r_   classmethodrh   r   r=   r#   r   r   r   r   [   sq         "9 9 9 $HG G G  >   [  LLLr   r   c                     t          d          } t          d          }t          t          t          | g          gt          | g          t          | |g          g          }|j        t          t          | g          gk    sJ |j        t          | g          t          | |g          gk    sJ t          |                                           |                                dk    sJ t          |           t          g g                                           dk    sJ t          t          gg                                           dk    sJ t          t          gt          g                                          dk    sJ t          t          gt          t          |g          g                                          dk    sJ d S )NrG   rH   z1 + a ~ 0 + a + a:bz~ 0z1 ~ 0z1 ~ 1z1 ~ b)	r?   r   r   r   rO   rP   printr_   r   )rJ   rK   ms      r   test_ModelDescrm      s   	S		B	S		B9dB4jj)D"JJb"X+GHHA>ird44444>dB4jj$Bx..99999	!**,,::<<00000qR%%''50000i["%%..00G;;;;i[9+..7799WDDDDykItRDzz#:;;DDFF     r   c                     dt          d          fD ]t} t                              |           }|j        t	          t          d          g          gk    sJ |j        t          t	          t          d          g          gk    sJ ud S )Nzy ~ xyx)r   r   rh   rO   r   r
   rP   r   )inputmds     r   test_ModelDesc_from_formulars      s    =112 G G##E**4C(9#:#:"<<<<<9dJsOO3D.E.E"FFFFFFG Gr   c                   &    e Zd ZdZd ZeZd ZeZ	dS )IntermediateExprzFThis class holds an intermediate result while we're evaluating a tree.c                     || _         || _        || _        t          t	          |                    | _        | j         r	| j        sJ | j         r	| j        rJ d S d S r   )	interceptintercept_originintercept_removedr   r   terms)r   rw   rx   ry   rz   s        r   r   zIntermediateExpr.__init__   sk    " 0 1>%0011
> 	)((((N>t'=>>>>>>>r   c                 \    |rJ t          || | j        | j        | j        | j        g          S r   )r   rw   rx   ry   rz   r+   s      r   _pretty_repr_zIntermediateExpr._pretty_repr_   sA    4!%1F!%!7!EF F 	Fr   N)
r8   r9   r:   r;   r   r   r<   r|   r   r=   r#   r   r   ru   ru      sC        LL? ? ? $HF F F LLLr   ru   c                      | rt           f|z   S |S r   r[   )doitrz   s     r   _maybe_add_interceptr      s     |e##r   c           	      x     fd|j         D             }t          |          dk    r&|                    dt          dd dg                      t          |          dk    sJ t	          t          |d         j        |d         j                  t          |d         j         |d         j                            S )Nc                 :    g | ]}                     |          S r#   rc   r3   arg	evaluators     r   r5   z#_eval_any_tilde.<locals>.<listcomp>   %    666SY^^C  666r   rE   r   FTrF   )	argsleninsertru   r   r   rw   rz   ry   r   rf   exprss   `  r   _eval_any_tilder      s    6666DI666E
5zzQ A 	Q(dB??@@@u::?)%(*<eAhnMM)eAh.H*H*/(.: :; ; ;r   c                    |                      |j        d                   }|j        d         j        dk    rt          dd d|j                  S |                      |j        d                   }|j        r$t          d|j        d|j        |j        z             S t          |j        |j        |j        |j        |j        z             S )Nr   rE   ZEROFTrc   r   typeru   rz   rw   rx   ry   )r   rf   	left_expr
right_exprs       r   _eval_binary_plusr      s    ty|,,Iy|F" HtT9?CCC^^DIaL11
 	H#D**Eu$-Oj6F$FH H H $I$7$-$>$-$?$-Oj6F$FH H Hr   c                    |                      |j        d                   }|j        d         j        dk    r"t          d|j        d         d|j                  S |j        d         j        dk    rt          dd d|j                  S |                      |j        d                   fd|j        D             }j        rt          dd d|          S t          |j        |j        |j        |          S )Nr   rE   r   TFONEc                 &    g | ]}|j         v|S r#   )rz   )r3   rU   r   s     r   r5   z&_eval_binary_minus.<locals>.<listcomp>  s5     2 2 2$
 002 2 2 2r   r   )r   rf   r   rz   r   s       @r   _eval_binary_minusr      s   ty|,,Iy|F" +dilE )1 1 	1	1	e	# +tT9?CCC^^DIaL11
2 2 2 2)/ 2 2 2 	+#E4u===#I$7$-$>$-$?$)+ + +r   c                 >    | j         rt          d| j                  d S )Nz1intercept term cannot interact with anything else)rw   r   rx   )exprs    r   _check_interactabler     s9    ~ D ,-1-BD D 	DD Dr   c                     | |fD ]}t          |           g }| j        D ];}|j        D ]1}|                    t          |j        |j        z                        2<t          dd d|          S )NF)r   rz   r\   r   r   ru   )r   r   r   rz   l_termr_terms         r   _interactionr     s    J' " "D!!!!E/ @ @ & 	@ 	@FLLfnv~=>>????	@E4666r   c           	            fd|j         D             }t          dd d|d         j        |d         j        z   t          | j        z             S )Nc                 :    g | ]}                     |          S r#   r   r   s     r   r5   z%_eval_binary_prod.<locals>.<listcomp>  r   r   Fr   rE   )r   ru   rz   r   r   s   `  r   _eval_binary_prodr     s]    6666DI666EE4!!HN#Ahn-*E289: : :r   c                    |                      |j        d                   }|                      |j        d                   }t          |j                  }t	          |           g }|j        D ]}|t          |j                  z  }t          dd dt          |          g          }|t          t          ||          j                  z  }t          dd d|          S )Nr   rE   F)	rc   r   r*   rz   r   r   ru   r   r   )r   rf   r   r   rz   left_factorsrU   left_combined_exprs           r   _eval_binary_divr   (  s    ty|,,I	!--J!!E	"""L + +T\***)%u+/+=+=*>@ @ 
T,1:>>DEEEEE4666r   c                 <      fd|j         D             }t          | S )Nc                 :    g | ]}                     |          S r#   r   r   s     r   r5   z)_eval_binary_interact.<locals>.<listcomp>8  r   r   )r   r   r   s   `  r   _eval_binary_interactr   7  s)    6666DI666Er   c                    |                      |j        d                   }t          |           d}|j        d         j        dv r8|j        d         j        j        }	 t          |          }n# t          $ r Y nw xY w|dk     rt          d|j        d                   |j	        }|}t          t          |j	                  |          }t          d|          D ]}t          ||          }||j	        z   }t          dd d|          S )Nr   rE   )r   NUMBERz '**' requires a positive integerF)rc   r   r   r   tokenextraint
ValueErrorr   rz   minr   ranger   ru   )r   rf   r   powerr   	all_termsbig_expris           r   _eval_binary_powerr   ;  s   ty|,,I	"""Ey|-- y|!'	IIEE 	 	 	D	qy K;TYq\JJJIHIO$$e,,E1e__ / /	844.		E4	:::s   A. .
A;:A;c                 B    |                      |j        d                   S )Nr   )rc   r   r   rf   s     r   _eval_unary_plusr   P  s    >>$)A,'''r   c                     |j         d         j        dk    rt          d|j        dg           S |j         d         j        dk    rt          dd dg           S t	          d|          )Nr   r   TFr   z)Unary minus can only be applied to 1 or 0)r   r   ru   originr   r   s     r   _eval_unary_minusr   S  sk    y|F" Ldk5"===	1	e	# LtT2666DdKKKr   c                 &    t          dd dg           S )NFT)ru   r   s     r   
_eval_zeror   [  s    E4r222r   c                 0    t          d|j        dg           S )NTF)ru   r   r   s     r   	_eval_oner   ^  s    D$+ub999r   c                 "    t          d|          )Nz4numbers besides '0' and '1' are only allowed with **r   r   s     r   _eval_numberr   a  s    
 /046 6 6r   c                     t          |j        j        |j                  }t	          dd dt          |g          g          S )N)r   F)r
   r   r   r   ru   r   )r   rf   factors      r   _eval_python_exprr   e  s:    
(===FE4vh0@AAAr   c                   "    e Zd Zd Zd ZddZdS )rb   c                 2   i | _         |                     ddt                     |                     ddt                     |                     ddt                     |                     ddt                     |                     ddt
                     |                     ddt                     |                     ddt                     |                     d	dt                     |                     ddt                     |                     ddt                     |                     d
dt                     |                     ddt                     |                     ddt                     |                     ddt                     i | _        d S )N~rF   rE   +-*/r0   z**r   r   r   r   PYTHON_EXPR)_evaluatorsadd_opr   r   r   r   r   r   r   r   r   r   r   r   r   stashr'   s    r   r   zEvaluator.__init__j  sT   CO,,,CO,,,C-...C.///C-...C,---C1222D!/000C,---C-...FAz***E1i(((Ha...M1&7888 


r   c                     || j         ||f<   d S r   )r   )r   oparityr   s       r   r   zEvaluator.add_op  s    &/U###r   Tc                    d }t          |t                    sJ |j        t          |j                  f}|| j        vrt          d|j        d|j                   | j        |         | |          }|rJt          |t                    s5t          |t                    rt          d|          t          d|          |S )Nz#I don't know how to evaluate this 'z
' operatorz2~ can only be used once, and only at the top levelzBcustom operator returned an object that I don't know how to handle)
r   r   r   r   r   r   r   r   ru   r   )r   rf   ra   r]   keys        r   rc   zEvaluator.eval  s    $	*****y#di..)d&& 	,*37999? $
, , , '!#&tT22 	4Jv7G$H$H 	4&),, 4  "<$(* * * ! "-.24 4 4 r   N)T)r8   r9   r:   r   r   rc   r#   r   r   rb   rb   i  sF          60 0 0     r   rb    T z 
 rG   rT   rY   Fz- 1z- 0z+ 1z+ 0z0 + 1z1 + 0z1 - 0z0 - 1z1 + az0 + aza - 1za - 0z1 - aa + brH   z(a + b)za + ((((b))))za + ((((+b))))za + ((((b - a))))z	a + a + aza + (b - a)za + np.log(a, base=10)znp.log(a, base=10)z0a + np.log(a, base=10) - np . log(a , base = 10)za + (I(b) + c))rG   zI(b)cza + I(b + c)zI(b + c)rI   rG   rH   za:b:az	a:(b + c)rG   r   z	(a + b):crH   r   z	a:(b - c)zc + a:c + a:(b - c))r   r   r   z	(a - b):czb + b:c + (a - b):c)rH   r   r   z	a:b - a:bz	a:b - b:az1 - (a + b)za + b - (a + b)za * b)rG   rH   r   z	a * b * aza * (b + c))rG   rH   r   r   r   z(a + b) * c)rG   rH   r   r   r   za * (b - c)zc + a:c + a * (b - c))r   r   rG   rH   r   z(a - b) * c)rG   r   r   zb + b:c + (a - b) * c)rH   r   rG   r   r   za/bz	(a + b)/c)rG   rH   rG   rH   r   zb + b:c + (a - b)/c)rH   r   rG   r   z	a/(b + c))rG   r   r   za ** 2z(a + b + c + d) ** 2)
rG   rH   r   dr   r   rG   r   r   rH   r   r   r   z(a + b + c + d) ** 3)rG   rH   r   r   r   r   r   r   r   r   r   )rG   rH   r   )rG   r   r   )rH   r   r   za + +az~ a + bz~ a*bz	~ a*b + 0z~ -1z	0 ~ a + bz	1 ~ a + bz	y ~ a + bro   z0 + y ~ a + bz0 + y * z ~ a + b)ro   z)ro   r   z-1 ~ 1z1 + y ~ a + bz	a + b * c)rG   rH   r   r   z	a * b + c)rG   rH   r   r   z	a * b - az	a + b / c)rG   rH   r   z	a / b + c)rG   r   r   za*b:c)rG   r   r   za:b*c)r   r   r   z~ 1 + 1 + 0 + 1z~ 0 + 1 + 0z~ 0 - 1 - 1 + 0 + 1z~ 1 - 1z~ 0 + a + 1z~ 1 + (a + 0)z~ 0 + (a + 1)z~ 1 - (a + 1))#za <+>za + <(>z
b + <(-a)>za:<1>z(a + <1>)*bza + <2>z	a + <1.0>za ** <b>za ** <(1 + 1)>z
a ** <1.5>za + b <# asdf>z<)>za + <)>z<*> aza + <*>za + <foo[bar>za + <foo{bar>za + <foo(bar>z
a + <[bar>z
a + <{bar>za + <{bar[]>za + foo<]>barza + foo[]<]>barza + foo{}<}>barza + foo<)>barza + b<)>z(a) <.>z<(>a + bz<y ~ a> ~ bzy ~ <(a ~ b)>z	<~ a> ~ bz~ <(a ~ b)>z1 + <-(a + b)>z<- a>za + <-a**2>c                 :   |rdg|z   }t          |           t          |          k    sJ t          | |          D ]_\  }}t          |t                    r=t          |t                    r|f}|j        t          d |D                       k    sJ W||k    sJ `d S )Nr#   c                 ,    g | ]}t          |          S r#   )r
   )r3   ss     r   r5   z'_assert_terms_match.<locals>.<listcomp>Q  s    )J)J)JA*Q--)J)J)Jr   )r   zipr   r   strr   r   )rz   expected_intercept	expectedsrU   expecteds        r   _assert_terms_matchr   I  s     %D9$	u::Y''''eY// $ $hdD!! 	$(C(( '$;<5)J)J)J)J)J#K#KKKKKK8#####$ $r   c                 |   t          j        |           D ]\  }}t          |          dk    rdg f|z   }t                              |          }t          t          |                     t          |           t          |           |\  }}}}t          |j        ||           t          |j	        ||           d S )NrF   F)
six	iteritemsr   r   rh   rk   reprr   rO   rP   )testscoder]   
model_desclhs_interceptrO   rhs_interceptrP   s           r   _do_eval_formula_testsr   U  s    e,, 9 9fv;;! 	*R[6)F++D11
d4jjfjCI@|]LJ3)<	9 	9 	9J3)<	9 	9 	9 	99 9r   c                  .    t          t                     d S r   )r   _eval_testsr#   r   r   test_eval_formular   c  s    ;'''''r   c                  :    ddl m}  d } | |t                     d S )Nr   )_parsing_error_testc                 6    t                               |           S r   )r   rh   )formulas    r   <lambda>z3test_eval_formula_error_reporting.<locals>.<lambda>h  s    y55g>> r   )patsy.parse_formular   _eval_error_tests)r   parse_fns     r   !test_eval_formula_error_reportingr  f  s6    777777>>H"344444r   c                      ddl m}  t                              d          }|j        d         j        d         j         | ddd          k    sJ |j        d         j        d         j         | ddd          k    sJ d S )Nr   )Originr   rE   rF         )patsy.originr  r   rh   rP   r   r   )r  descs     r   test_formula_factor_originr  k  s    ######!!'**Da (+2vgq!$$% & & &a (+2vgq!$$% & & & & &r   )4
__future__r   r   patsyr   r   r   r   r   
patsy.evalr	   r
   
patsy.utilr   r   r   r   r   __all__objectr   r   r?   rL   r   rm   rs   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   r   r   r   r   r   r  r  r#   r   r   <module>r     s
   & % % % % % 



       ? ? ? ? ? ? ? ? ? ? 2 2 2 2 2 2 2 2 % % % % % % = = = = = = = = 6 6 6 6 6 6 6 6 -
,
,( ( ( ( (6 ( ( (T DHH	    &   
! 
! 
!N N N N N N N N`  "G G G    v   (  
; 
; 
;H H H + + +&D D D
7 7 7: : :7 7 7     ; ; ;*( ( (L L L3 3 3: : :6 6 6B B B1 1 1 1 1 1 1 1jpr
p$p T2Jp $	p $p %p 
E2;p 
D":p 
D":p 
E2;p dBZp eR[p dBZp eR[p" dSE]#p$ ecU^%p& ecU^'p p( dSE])p* dBZ+p. dS#J/p0 sCj!1p2 dS#J'3p4 tc3Z(5p6 $c
+7p: $;p> D3*%?pB tc+?%@ACpF 7uGpJ t///0KpL TC,-MpP 
D:,QpR dZL!SpT $Z01UpV $Z01Wp p pX $%YpZ D"?"?"?@[p\ $%]p^ D"?"?"?@_pb $cpd $eph D":ipj bzkpn d***+opp $.../qpr DAAABspt DAAABupv D0001wpx d$K$K$KLypz D0001{p| d$K$K$KL}p@ 
D3
#$Ap p pB $3334CpD D"D"D"DEEpF $5556GpJ tcUmKpL T $H $H $H IMpR T $F $F $F GSp^ tcUm_pb sCj!cpd d***+epf %///0gph UBKipl $c
#mpn $D3*-opp %#sCj1qpr ecUD3*5spt %!7!7!7SzJupv ub$#wp p px dSE4#s4yp~ $3334p@ $3334ApB $j)*CpD $.../EpF $.../GpH d6667IpJ d6667KpP bzQpR E2;SpT D":UpV r{WpX D3%=YpZ dSE][p\ dSE]]p^ eR[_p pf6 6 6 p
$ 
$ 
$9 9 9( ( (5 5 5
& & & & &r   