
    J/PhV                        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d.d&g fd/d&g fd0d,g fd1d&g fd2d,g fd3d&g fd4d,g fd5d&d)gfd6d,d)gfd7d,d)gfi d8d&d)gfd9d&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d?d&d)d;gfd@d&d)gfdAd&d)d;gfdBd&d)dCgfdDd&d)gfdEd&g dFfdGd&d)dHgfdId&dJgfdKd&dJgfdLd&dJdMgfdNd&dMdOgfi dPd&dJgfdQd&g dRfdSd&dMgfdTd&g dUfdVd&g fdWd&g fdXd&g fdYd&g fdZd&g d[fd\d&g d[fd]d&g d^fd_d&g d`fdad&g d[fdbd&g dcfddd&g defdfd&g dgfdhd&d)dJgfi did&g djfdkd&g dlfdmd&g dnfdod&d)gfdpd&g dqfdrd&g dsfdtd&d)gfdud&d)d;gfdvd&g d[fdwd,g d[fdxd,g fdyd&d)d;gfdzd&g d&d)d;gfd{d,d|gd&d)d;gfd}d,d|gd&d)d;gfd~d,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;dJg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 Z-d Z.d Z/d Z0dS )    
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     J/var/www/html/test/jupyter/venv/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__-   s=    %&& 
9U]+C+CyLH
 H
 ,
 	
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_:   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>A   s     <<<!QVVXX<<<r   	Intercept)r   joinr&   s    r   r1   z	Term.name>   s4    < 	88<<t|<<<===;r   N)__name__
__module____qualname____doc__r   r    r#   r'   r   __repr__r-   r1   r   __getstate__r"   r   r   r   r      s         6 6 6
 
 

! ! !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   r1   s     r   r   z_MockFactor.__init__L   s    


r   c                     | j         S r   r@   r&   s    r   r1   z_MockFactor.nameO   s
    zr   N)r7   r8   r9   r   r1   r"   r   r   r>   r>   K   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)      rD   )rD   rE   rD   rE   aba:bzb:ar5   )r   r   r%   r>   r1   r   )f1f2s     r   	test_TermrK   S   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   rN   rO   s      r   r   zModelDesc.__init__s   s(    *<88*<88r   c                 N    |rJ t          || g d| j        fd| j        fg          S )NrN   rO   )r   rN   rO   r*   s      r   r-   zModelDesc._repr_pretty_y   sA    d/0>4CT2UV	
 
 	
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   r1   )terms    r   	term_codez%ModelDesc.describe.<locals>.term_code   s     y  syy{{"r   z + c                 &    g | ]} |          S r"   r"   r2   rT   rU   s     r   r4   z&ModelDesc.describe.<locals>.<listcomp>   s!    KKKYYt__KKKr   z ~ z~ 0c                 <    g | ]}|t           k     |          S r"   r   rW   s     r   r4   z&ModelDesc.describe.<locals>.<listcomp>   s2       $(ARAR		$ARARARr   )r6   rN   rO   r   append)r   result
term_namesrU   s      @r   describezModelDesc.describe   s    	# 	# 	# KKKK9JKKKLL 	eOFFdNF++ii	***FFJ 111!!#&&&    ,0,=   J 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)r7   r8   r9   r:   r   r   r;   r-   r^   classmethodrg   r   r<   r"   r   r   r   r   `   so         $9 9 9 $H
 
 
     D   [  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 )NrF   rG   z1 + a ~ 0 + a + a:bz~ 0z1 ~ 0z1 ~ 1z1 ~ b)	r>   r   r   r   rN   rO   printr^   r   )rI   rJ   ms      r   test_ModelDescrl      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i[9dB4jj"9::CCEEPPPPPPr   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   rg   rN   r   r	   rO   r   )inputmds     r   test_ModelDesc_from_formularr      s    =112 G G##E***S//"###
 
 
 
 
 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   rv   rw   rx   ry   s        r   r   zIntermediateExpr.__init__   sk    " 0!2>%0011
> 	)((((N>t'=>>>>>>>r   c                 \    |rJ t          || | j        | j        | j        | j        g          S r   )r   rv   rw   rx   ry   r*   s      r   _pretty_repr_zIntermediateExpr._pretty_repr_   s<    ^T2D4JDJW
 
 	
r   N)
r7   r8   r9   r:   r   r   r;   r{   r   r<   r"   r   r   rt   rt      s@        LL? ? ? $H
 
 
 LLLr   rt   c                      | rt           f|z   S |S r   rZ   )doitry   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"   rb   r2   arg	evaluators     r   r4   z#_eval_any_tilde.<locals>.<listcomp>   %    666SY^^C  666r   rD   r   FTrE   )	argsleninsertrt   r   r~   rv   ry   rx   r   re   exprss   `  r   _eval_any_tilder      s    6666DI666E
5zzQ 	Q(dB??@@@u::????U1X/q@@q!;;U1X^LL  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   rD   ZEROFTrb   r   typert   ry   rv   rw   rx   )r   re   	left_expr
right_exprs       r   _eval_binary_plusr      s    ty|,,Iy|F""tT9?CCC^^DIaL11
 	#+*"22	   $#*+*"22	  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   rD   r   TFONEc                 &    g | ]}|j         v|S r"   )ry   )r2   rT   r   s     r   r4   z&_eval_binary_minus.<locals>.<listcomp>  s&    RRR$TAQ5Q5Q5Q5Q5Qr   r   )r   re   r   ry   r   s       @r   _eval_binary_minusr     s    ty|,,Iy|F""dilE9?KKK	1	e	#	#tT9?CCC^^DIaL11
RRRR)/RRR 	#E4u===##*+	  r   c                 >    | j         rt          d| j                  d S )Nz1intercept term cannot interact with anything else)rv   r   rw   )exprs    r   _check_interactabler   *  s1    ~ 
B!
 
 	

 
r   c                     | |fD ]}t          |           g }| j        D ];}|j        D ]1}|                    t          |j        |j        z                        2<t          dd d|          S )NF)r   ry   r[   r   r   rt   )r   r   r   ry   l_termr_terms         r   _interactionr   2  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   r4   z%_eval_binary_prod.<locals>.<listcomp>=  r   r   Fr   rD   )r   rt   ry   r   r   s   `  r   _eval_binary_prodr   <  sW    6666DI666EtUE!HNU1X^;lE>R>XX  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   rD   F)	rb   r   r)   ry   r   r   rt   r   r   )r   re   r   r   ry   left_factorsrT   left_combined_exprs           r   _eval_binary_divr   K  s    ty|,,I	!--J!!E	"""L + +T\***)%utL?Q?Q>RSS	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   r4   z)_eval_binary_interact.<locals>.<listcomp>[  r   r   )r   r   r   s   `  r   _eval_binary_interactr   Z  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   rD   )r   NUMBERz '**' requires a positive integerF)rb   r   r   r   tokenextraint
ValueErrorr   ry   minr   ranger   rt   )r   re   r   powerr   	all_termsbig_expris           r   _eval_binary_powerr   _  s   ty|,,I	"""Ey|---y|!'	IIEE 	 	 	D	qyy;TYq\JJJIHIO$$e,,E1e__ / /	844.		E4	:::s   A. .
A;:A;c                 B    |                      |j        d                   S )Nr   )rb   r   r   re   s     r   _eval_unary_plusr   u  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   rt   originr   r   s     r   _eval_unary_minusr   y  se    y|F""dk5"===	1	e	#	#tT2666DdKKKr   c                 &    t          dd dg           S )NFT)rt   r   s     r   
_eval_zeror     s    E4r222r   c                 0    t          d|j        dg           S )NTF)rt   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     s    
NPT
U
UUr   c                     t          |j        j        |j                  }t	          dd dt          |g          g          S )N)r   F)r	   r   r   r   rt   r   )r   re   factors      r   _eval_python_exprr     s:    
(===FE4vh0@AAAr   c                   "    e Zd Zd Zd ZddZdS )ra   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~rE   rD   +-*/r/   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__  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   rt   r   )r   re   r`   r\   keys        r   rb   zEvaluator.eval  s    $	*****y#di..)d&&&*HL			S
   '!#&tT22 	Jv7G$H$H 	&),, 
 KT   ! 	   r   N)T)r7   r8   r9   r   r   rb   r"   r   r   ra   ra     sF          60 0 0     r   ra    T z 
 rF   rS   rX   Fz- 1z- 0z+ 1z+ 0z0 + 1z1 + 0z1 - 0z0 - 1z1 + az0 + aza - 1za - 0z1 - aa + brG   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))rF   zI(b)cza + I(b + c)zI(b + c)rH   rF   rG   za:b:az	a:(b + c)rF   r   z	(a + b):crG   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)rG   r   r   z	a:b - a:bz	a:b - b:az1 - (a + b)za + b - (a + b)za * b)rF   rG   r   z	a * b * aza * (b + c))rF   rG   r   r   r   z(a + b) * c)rF   rG   r   r   r   za * (b - c)zc + a:c + a * (b - c))r   r   rF   rG   r   z(a - b) * c)rF   r   r   zb + b:c + (a - b) * c)rG   r   rF   r   r   za/bz	(a + b)/c)rF   rG   rF   rG   r   zb + b:c + (a - b)/c)rG   r   rF   r   z	a/(b + c))rF   r   r   za ** 2z(a + b + c + d) ** 2)
rF   rG   r   dr   r   rF   r   r   rG   r   r   r   z(a + b + c + d) ** 3)rF   rG   r   r   r   r   r   r   r   r   r   )rF   rG   r   )rF   r   r   )rG   r   r   za + +az~ a + bz~ a*bz	~ a*b + 0z~ -1z	0 ~ a + bz	1 ~ a + bz	y ~ a + brn   z0 + y ~ a + bz0 + y * z ~ a + b)rn   z)rn   r   z-1 ~ 1z1 + y ~ a + bz	a + b * c)rF   rG   r   r   z	a * b + c)rF   rG   r   r   z	a * b - az	a + b / c)rF   rG   r   z	a / b + c)rF   r   r   za*b:c)rF   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	   )r2   ss     r   r4   z'_assert_terms_match.<locals>.<listcomp>z  s    )J)J)JA*Q--)J)J)Jr   )r   zipr   r   strr   r   )ry   expected_intercept	expectedsrT   expecteds        r   _assert_terms_matchr   r  s     %D9$	u::Y''''eY// $ $hdD!! 	$(C(( '$;<5)J)J)J)J)J#K#KKKKKK8#####$ $r   c                 |   |                                  D ]\  }}t          |          dk    rdg f|z   }t                              |          }t	          t          |                     t	          |           t	          |           |\  }}}}t          |j        ||           t          |j        ||           d S )NrE   F)	itemsr   r   rg   rj   reprr   rN   rO   )testscoder\   
model_desclhs_interceptrN   rhs_interceptrO   s           r   _do_eval_formula_testsr     s     	R 	Rfv;;!R[6)F++D11
d4jjfjCI@|]LJ3]LQQQJ3]LQQQQ	R 	Rr   c                  .    t          t                     d S r   )r   _eval_testsr"   r   r   test_eval_formular     s    ;'''''r   c                  :    ddl m}  d } | |t                     d S )Nr   )_parsing_error_testc                 6    t                               |           S r   )r   rg   )formulas    r   <lambda>z3test_eval_formula_error_reporting.<locals>.<lambda>  s    y55g>> r   )patsy.parse_formular   _eval_error_tests)r   parse_fns     r   !test_eval_formula_error_reportingr     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   rD   rE         )patsy.originr  r   rg   rO   r   r   )r  descs     r   test_formula_factor_originr    s    ######!!'**DQ'*1VVGQ5J5JJJJJQ'*1VVGQ5J5JJJJJJJr   N)1patsyr   r   r   r   r   
patsy.evalr   r	   
patsy.utilr
   r   r   r   r   __all__objectr   r   r>   rK   r   rl   rr   rt   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ra   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 + + +\ DHH	    &   
! 
! 
!U U U U U U U UpQ Q Q"G G G    v   2      ,  (
 
 
7 7 7  7 7 7     
; ; ;,( ( (L L L3 3 3: : :V V VB B B
5 5 5 5 5 5 5 5txr
x$x T2Jx $	x
 $x %x 
E2;x 
D":x 
D":x 
E2;x dBZx eR[x dBZx eR[x dSE]x  ecU^!x" ecU^#x x$ dSE]%x& dBZ'x( dS#J)x* sCj!+x, dS#J'-x. tc3Z(/x0 $c
+1x2 $3x4 D3*%5x6 tc+?%@A7x: 7u;x< t///0=x> TC,-?x@ 
D:,AxB dZL!CxD $Z01ExF $Z01Gx x xH $%IxJ D"?"?"?@KxL $%MxN D"?"?"?@OxP $QxR $SxT D":UxV bzWxX d***+YxZ $.../[x\ DAAAB]x^ DAAAB_x` D0001axb d$K$K$KLcxd D0001exf d$K$K$KLgxh 
D3
#$ix x xj $3334kxl D"D"D"DEmxn $5556oxp tcUmqxr 	
 	
 	
sxP 	
 	
 	
Qxv tcUmwxx sCj!yxz d***+{x| %///0}x~ UBKx@ $c
#AxB $D3*-CxD %#sCj1ExF ecUD3*5GxH %!7!7!7SzJIxJ ub$#Kx x xL dSE4#s4MxP $3334QxR $3334SxT $j)*UxV $.../WxX $.../YxZ d6667[x\ d6667]x` bzaxb E2;cxd D":exf r{gxh D3%=ixj dSE]kxl dSE]mxn eR[ox xv' ' ' T
$ 
$ 
$
R 
R 
R( ( (5 5 5K K K K Kr   