
    Owgp                    ,   d dl mZ d dlmZmZ d dlmZmZmZm	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mZmZ d d
lmZ d dlmZmZ d dlm c m!Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 erd dl1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7  ed       ee$d   d      ddddddddejp                  df
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*d              Z9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+dZ:	 	 d,	 	 	 	 	 	 	 d-dZ;	 d.	 	 	 d/dZ<	 d.	 	 	 	 	 d0d Z=	 d.	 	 	 	 	 	 	 d1d!Z>d" Z? ed       ee$d#   d      ejp                  ejp                  d$	 	 	 	 	 	 	 	 	 d2d%              Z@	 	 	 	 	 	 	 	 d3	 	 	 	 	 	 	 	 	 d4d&ZA	 d.	 	 	 	 	 	 	 d5d'ZBd6d7d(ZC	 	 	 	 	 	 d8d)ZDy)9    )annotations)HashableSequence)TYPE_CHECKINGCallableLiteralcastN)lib)AppenderSubstitution)find_stack_level)maybe_downcast_to_dtype)is_list_likeis_nested_list_like	is_scalar)ExtensionDtype)ABCDataFrame	ABCSeries)_shared_docs)Grouper)Index
MultiIndexget_objs_combined_axis)concat)cartesian_product)Series)AggFuncTypeAggFuncTypeBaseAggFuncTypeDict
IndexLabel	DataFramez
data : DataFramepivot_table   )indentsmeanFTAllc                |   t        |      }t        |      }t        |t              rog }g }|D ]E  }t        | |||||||||	|
      }|j	                  |       |j	                  t        |d|             G t        ||d      }|j                  | d      S t        | |||||||||	|
      }|j                  | d      S )N)
valuesindexcolumns
fill_valueaggfuncmarginsdropnamargins_nameobservedsort__name__r$   )keysaxisr#   )method)_convert_by
isinstancelist__internal_pivot_tableappendgetattrr   __finalize__)datar)   r*   r+   r-   r,   r.   r/   r0   r1   r2   piecesr4   func_tabletables                   P/var/www/horilla/myenv/lib/python3.12/site-packages/pandas/core/reshape/pivot.pyr#   r#   =   s     E'"G'4 "$ 	9D+%)!F MM&!KKj$78	9" vDq1!!$}!=="E d=99    c                l	   ||z   }|du}|rt        |      rd}t        |      }nd}|g}|D ]  }|| vst        |       g }||z   D ]4  }t        |t              r|j
                  }	 || v r|j                  |       6 t        |      t        | j                        k  r6| |   } n0| j                  }|D ]  }	 |j                  |      } t        |      }|	t        j                  u rdn|	}| j                  |||
|      }|	t        j                  u rJt        d |j                   j"                  D              r$t%        j&                  dt(        t+                      |j-                  |      }|r7t        |t.              r't        |j                        r|j1                  d	      }|}|j2                  j4                  d
kD  r|r|j2                  j6                  dt        |       }g }t9        t        |      t        |            D ]D  }|j2                  j6                  |   }|||v r|j                  |       4|j                  |       F |j;                  ||      }|st        |j2                  t<              r\t=        j>                  tA        |j2                  jB                        |j2                  j6                        }|jE                  |d|      }t        |j                  t<              r\t=        j>                  tA        |j                  jB                        |j                  j6                        }|jE                  |d
|      }|
du r"t        |t.              r|jG                  d
      }|O|jI                  |      }|t        u r6|	s4t        jJ                  |      r|jM                  tN        jP                        }|r9|r#| | jS                         jU                  d
         } tW        || |||||||	      }|r;s9|j                  j4                  d
kD  r |j                  jY                  d      |_	        t        |      dk(  rt        |      dkD  r|jZ                  }t        |t.              r|r|j1                  dd
      }|S # t        $ r Y Pw xY w# t        t        t        f$ r Y w xY w)zL
    Helper of :func:`pandas.pivot_table` for any non-list ``aggfunc``.
    NTF)r1   r2   r/   c              3  4   K   | ]  }|j                     y wN)_passed_categorical).0pings     rC   	<genexpr>z)__internal_pivot_table.<locals>.<genexpr>   s      *%)  *s   zThe default value of observed=False is deprecated and will change to observed=True in a future version of pandas. Specify observed=False to silence this warning and retain the current behavior)category
stacklevelall)howr$   r,   namesr   )r5   r,   r5   )rowscolsr-   r1   r0   r,   )rO   r5   ).r   r9   KeyErrorr8   r   keyr;   	TypeErrorlenr+   drop
ValueErrorr
   
no_defaultgroupbyany_grouper	groupingswarningswarnFutureWarningr   aggr   r/   r*   nlevelsrR   rangeunstackr   from_arraysr   levelsreindex
sort_indexfillna
is_integerastypenpint64notnarN   _add_margins	droplevelT)r>   r)   r*   r+   r-   r,   r.   r/   r0   r1   r2   r4   values_passedvalues_multii	to_filterxrW   observed_boolgroupedaggedrB   index_names
to_unstacknamems                             rC   r:   r:   v   sB     7?D$&ML&\F LXF  	"A}qk!	" 	 	A!W%EE9$$Q'	 y>C--	?D  	CS)	
 f%7EXMll4-d6lRG3>>!c *-4-=-=-G-G* ' 	U #')	
 KK E*UL1c%--6H'E {{Q5 kk''#e*5
s5z3t9- 	(A;;$$Q'D|t{2!!!$!!$'	( jZ@ekk:.&&!%++"4"45U[[=N=NA MM!!
MCEemmZ0&&!%--"6"67u}}?R?RA MM!!
MCEt|
5,7  a (Z(c>(s~~j/I LL*E

((a(01D%!

 \emm.C.Ca.G//2
5zQ3w<!+ %&6Q/LA   z84 s$   'R7R	RRR32R3c	           
     0   t        |t              st        d      d| d}	| j                  j                  D ]*  }
|| j                  j                  |
      v s!t        |	       t        ||||      }| j                  dk(  rF| j                  j                  dd  D ]*  }
|| j                  j                  |
      v s!t        |	       t        |      dkD  r|fdt        |      dz
  z  z   }n|}|s5t        | t              r%| j                  | j                  |||   i            S |r+t        | |||||||      }t        |t              s|S |\  }}}n;t        | t              sJ t!        | ||||||      }t        |t              s|S |\  }}}|j#                  |j                  |      }|D ]&  }t        |t              r	||   ||<   ||d      ||<   ( dd	lm}  ||t)        |g      
      j*                  }|j                  j                  }t-        |j.                        D ]M  }t        |t0              r|j3                  |g      j                  }||   j5                  t6        |f      ||<   O |j                  |      }||j                  _        |S )Nz&margins_name argument must be a stringzConflicting name "z" in margins   r$    rP   r   r!   )r+   )args)r8   strr[   r*   rR   get_level_values_compute_grand_marginndimr+   rY   r   _append_constructor_generate_marginal_resultstupler   )_generate_marginal_results_without_valuesrj   pandasr"   r   rt   setdtypesr   select_dtypesapplyr   )rB   r>   r)   rT   rU   r-   r1   r0   r,   msglevelgrand_marginrW   marginal_result_setresultmargin_keys
row_marginkr"   margin_dummy	row_namesdtypes                         rC   rr   rr      s    lC(ABB|nL
9C"" "5;;77>>S/!" )vwMLzzQ]]((, 	&Eu}}==eDD o%	&
 4y1}oTQ 77j	2 }}U//l<6P0QRSS	84tWh
 -u5&&*='Z %...G4tWh
 -u5&&*='Z##FNNz#JJ /a(OJqM(1.JqM	/ !Zu>@@L""I V]]# 
e^,##UG,44)$/55#5( 6 
T
 ^^L)F"FLLMrD   c                   |ri }| |   j                         D ]  \  }}	 t        |t              r t        ||             ||<   nUt        |t              r:t        ||   t              r t        |||                ||<   n ||   |      ||<   n ||      ||<    |S | || j                        iS # t
        $ r Y w xY wrG   )itemsr8   r   r<   dictrX   r*   )r>   r)   r-   r0   r   r   vs          rC   r   r   U  s     L&&( 	DAqgs+&9ga&9&;LO.!'!*c2*@'!WQZ*@*BQ*4'!*Q-Q&-ajLO	 gdjj122	  s   A:B11	B=<B=c                   t              dkD  rg }g }	fd}
t        |      dkD  r|||z      j                  ||      j                  |      }d}| j                  j                  d|      D ]S  \  }}|j                  } |
|      }|j	                         }||   ||<   |j                  |       |	j                  |       U nddlm} d}| j                  d|      D ]  \  }}t              dkD  r	 |
|      }n}|j                  |        ||j                  |            j                  }t        |j                  t              r6t        j                  |g|j                  j                  d gz         |_
        n't        |g|j                  j                        |_
        |j                  |       |	j                  |        |s| S t!        ||	      }t        |      dk(  r|S | }| j"                  }	t              dkD  r||z      j                  |      j                  |      }|j%                  d
      }t              gt'        t)        t                          z   }|D cg c]  }|j                  j                  |    }}|j                  j+                  |      |_
        n+|j-                  t.        j0                  |j"                        }||	|fS c c}w )Nr   c                0    | fdt              dz
  z  z   S )Nr   r$   rY   )rW   rU   r0   s    rC   _all_keyz,_generate_marginal_results.<locals>._all_key|  s     &#d)a-)@@@rD   r1   r$   )r   r1   r!   rQ   r   rS   T)future_stackr*   )rY   r]   rd   rt   copyr;   r   r"   r   r8   r*   r   from_tuplesrR   r   r   r   r+   stackr9   rf   reorder_levels_constructor_slicedro   nan)rB   r>   r)   rT   rU   r-   r1   r0   table_piecesr   r   margincat_axisrW   pieceall_keyr"   transformed_piecer   r   new_order_indicesrw   new_order_namess       `  `               rC   r   r   l  s    4y1}	A t9q=$-(000IMMgVFH#ggooAoI 	,
U"3- 

!'g##E*""7+	, )H#mm!hmG ,
Ut9q=&smG*G##E* %.ekk'.B$C$E$E!ekk:6.8.D.D 	):):dV)C/%+ /4WIEKKDTDT.U%+ ##$56""7+',* LLx8Ft9>Mmm
4y1}$-(000IMMgV
%%4%8
 !YK$uSY/?*@@>OP:++11!4PP%++::?K
--bffFNN-K
;
** Qs   5 K(c                2   t              dkD  rg }fd}t        |      dkD  rE|j                  ||      |   j                  |      }	 |       }
|	| |
<   | }|j                  |
       nR|j                  dd|      j                  |      }	 |       }
|	| |
<   | }|j                  |
       |S | }| j                  }t              r&|j                  |         j                  |      }n%t        t        j                  |j                        }|||fS )Nr   c                 N    t               dk(  rS fdt               dz
  z  z   S )Nr$   r   r   )rU   r0   s   rC   r   z;_generate_marginal_results_without_values.<locals>._all_key  s.    4yA~## ?Uc$i!m%<<<rD   r   )r   r5   r1   r   )rY   r]   r   r;   r+   r   ro   r   )rB   r>   rT   rU   r-   r1   r0   r   r   r   r   r   r   s      `  `      rC   r   r     s    4y1}	=
 t9q=\\$\:4@FFwOFjG#E'NFw' \\H\EKKGTFjG#E'NFw'Mmm
4y\\$\:4@FFwO
BFF&..9
;
**rD   c                    | g } | S t        |       s5t        | t        j                  t        t
        t        f      st        |       r| g} | S t        |       } | S rG   )	r   r8   ro   ndarrayr   r   r   callabler9   )bys    rC   r7   r7     sX    	z I 	"b2::uiABB<T I "XIrD   pivot)r*   r)   c                  t        j                  |      }| j                  d      } | j                  j                         | _        | j                  j                  D cg c]  }||nt
        j                   c}| j                  _        |t
        j                  u rT|t
        j                  urt        j                  |      }ng }|t
        j                  u }| j                  ||z   |      }nv|t
        j                  u rt        | j                  t              rFt        | j                  j                        D 	cg c]  }	| j                  j                  |	       }
}	nX| j                  | j                  | j                  j                        g}
n%t        j                  |      D cg c]  }| |   	 }
}|D cg c]  }| |   	 }}|
j                  |       t        j                   |
      }t#        |      rIt        |t$              s9t'        t(        t*           |      }| j-                  | |   j.                  ||      }n | j                  | |   j.                  |      }|j1                  |      }|j                  j                  D cg c]  }|t
        j                  ur|nd  c}|j                  _        |S c c}w c c}	w c c}w c c}w c c}w )NF)deep)r;   r   )r*   r+   r   )comconvert_to_list_liker   r*   rR   r
   r\   	set_indexr8   r   rf   re   r   r   r   extendrh   r   r   r	   r   r   r   _valuesrg   )r>   r+   r*   r)   columns_listliker   rU   r;   indexedrw   
index_listidxcoldata_columns
multiindexr   s                   rC   r   r     sr    //8
 99%9 D"DJAEAQAQ9= cnn4DJJ
 &++E2DD#..( ..##F ! 

 CNN"$**j1 =B$**BTBT<U78DJJ//2
 
 ,,TZZdjjoo,N
 03/G/G/NO$s)OJO-=>cS	>>,'++J7

65(A(8,f5F''V$$J ( G ..tF|/C/C:.VG __-.FAGASAS9=CNN*4FLL Mi, P> s   K?"K.K KKc
           
        ||t        d      ||t        d      t        |       s| g} t        |      s|g}d}
| |z   D cg c]  }t        |t        t        f      s| }}|rt        |dd      }
t        | |d      }t        ||d	      }t        ||      \  }}}}d
dlm	} i t        t        ||             t        t        ||            } |||
      }|d
|d<   t        d
d}n	||d<   d|i} |j                  	 d|||||dd|}|	durt        ||	||      }|j                  |d
      }|j                  |d      }|S c c}w )a  
    Compute a simple cross tabulation of two (or more) factors.

    By default, computes a frequency table of the factors unless an
    array of values and an aggregation function are passed.

    Parameters
    ----------
    index : array-like, Series, or list of arrays/Series
        Values to group by in the rows.
    columns : array-like, Series, or list of arrays/Series
        Values to group by in the columns.
    values : array-like, optional
        Array of values to aggregate according to the factors.
        Requires `aggfunc` be specified.
    rownames : sequence, default None
        If passed, must match number of row arrays passed.
    colnames : sequence, default None
        If passed, must match number of column arrays passed.
    aggfunc : function, optional
        If specified, requires `values` be specified as well.
    margins : bool, default False
        Add row/column margins (subtotals).
    margins_name : str, default 'All'
        Name of the row/column that will contain the totals
        when margins is True.
    dropna : bool, default True
        Do not include columns whose entries are all NaN.
    normalize : bool, {'all', 'index', 'columns'}, or {0,1}, default False
        Normalize by dividing all values by the sum of values.

        - If passed 'all' or `True`, will normalize over all values.
        - If passed 'index' will normalize over each row.
        - If passed 'columns' will normalize over each column.
        - If margins is `True`, will also normalize margin values.

    Returns
    -------
    DataFrame
        Cross tabulation of the data.

    See Also
    --------
    DataFrame.pivot : Reshape data based on column values.
    pivot_table : Create a pivot table as a DataFrame.

    Notes
    -----
    Any Series passed will have their name attributes used unless row or column
    names for the cross-tabulation are specified.

    Any input passed containing Categorical data will have **all** of its
    categories included in the cross-tabulation, even if the actual data does
    not contain any instances of a particular category.

    In the event that there aren't overlapping indexes an empty DataFrame will
    be returned.

    Reference :ref:`the user guide <reshaping.crosstabulations>` for more examples.

    Examples
    --------
    >>> a = np.array(["foo", "foo", "foo", "foo", "bar", "bar",
    ...               "bar", "bar", "foo", "foo", "foo"], dtype=object)
    >>> b = np.array(["one", "one", "one", "two", "one", "one",
    ...               "one", "two", "two", "two", "one"], dtype=object)
    >>> c = np.array(["dull", "dull", "shiny", "dull", "dull", "shiny",
    ...               "shiny", "dull", "shiny", "shiny", "shiny"],
    ...              dtype=object)
    >>> pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'])
    b   one        two
    c   dull shiny dull shiny
    a
    bar    1     2    1     0
    foo    2     2    1     2

    Here 'c' and 'f' are not represented in the data and will not be
    shown in the output because dropna is True by default. Set
    dropna=False to preserve categories with no data.

    >>> foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
    >>> bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
    >>> pd.crosstab(foo, bar)
    col_0  d  e
    row_0
    a      1  0
    b      0  1
    >>> pd.crosstab(foo, bar, dropna=False)
    col_0  d  e  f
    row_0
    a      1  0  0
    b      0  1  0
    c      0  0  0
    Nz&aggfunc cannot be used without values.z)values cannot be used without an aggfunc.TF)	intersectr2   row)prefixr   r   r!   r   	__dummy__)r-   r,   r-   )r*   r+   r.   r0   r/   r1   )	normalizer.   r0   )r*   r5   r$   )r+   r5   )r   )r[   r   r8   r   r   r   
_get_names_build_names_mapperr   r"   r   ziprY   r#   
_normalizerename_axis)r*   r+   r)   rownamescolnamesr-   r.   r0   r/   r   
common_idxry   	pass_objsrownames_mapperunique_rownamescolnames_mapperunique_colnamesr"   r>   dfkwargsrB   s                         rC   crosstabr   B  s   T ~'-ABBgoDEEu%w')J!GOXqz!i=V/WXIX+IER
%%8H'8E:H 	Hh/ !
s?E*
+
s?G,
-D 
4z	*B~; 2 ;W% BNN	!	 	E Yl
 O!<EoA>ELi Ys   E Ec                   t        |t        t        f      sddd}	 ||   }|du r2d d d d	}|d
   |d<   	 ||   } ||       } | j                  d      } | S |du r| j                  }| j                  }	| j                  dd d f   j                  }
||
v||
k7  z  rt	        | d      | j                  d ddf   }| j                  dd df   }| j                  d dd df   } t        | |d      } |dk(  r<||j                         z  }t        | |gd      } | j                  d      } |	| _        | S |dk(  r>||j                         z  }| j                  |      } | j                  d      } || _        | S |d
k(  s|du rv||j                         z  }||j                         z  }d|j                  |<   t        | |gd      } | j                  |      } | j                  d      } || _        |	| _        | S t	        d      t	        d      # t        $ r}t	        d      |d }~ww xY w# t        $ r}t	        d      |d }~ww xY w)Nr*   r+   )r   r$   zNot a valid normalize argumentFc                L    | | j                  d      j                  d      z  S Nr$   rS   r   sumry   s    rC   <lambda>z_normalize.<locals>.<lambda>  s#    QA!2!2!2!:: rD   c                (    | | j                         z  S rG   r   r   s    rC   r   z_normalize.<locals>.<lambda>  s    QUUW rD   c                H    | j                  | j                  d      d      S r   )divr   r   s    rC   r   z_normalize.<locals>.<lambda>  s    quuQUUU]u; rD   )rN   r+   r*   rN   Tr   z not in pivoted DataFrame)r   r.   r$   rS   zNot a valid margins argument)r8   boolr   rV   r[   rl   r*   r+   ilocr   r   r   r   r   loc)rB   r   r.   r0   	axis_subserrnormalizersftable_indextable_columnslast_ind_or_colcolumn_marginindex_margins                rC   r   r     s    i$-I.		H!),I % ;,;3
 (.D	HI&A %Qf Lc 
Dkk**RU+00 /LO4ST~-FGHH

3B37+zz"crc'* 

3B38$ 5IuE 	!)M,=,=,??ME=1:ELLOE)EM2 L/ '!',*:*:*<<LMM,/ELLOE%EK& L# %9#4)M,=,=,??M',*:*:*<<L-.L\*E=1:EMM,/ELLOE%EK)EM L =>> 788I  	H=>CG	H  	H=>CG	Hs.   H H) 	H&H!!H&)	I2H>>Ic                N   |eg }t        |       D ]S  \  }}t        |t              r(|j                  |j	                  |j                         >|j	                  | d|        U |S t        |      t        |       k7  rt        d      t        |t              st        |      }|S )N_z*arrays and names must have the same length)	enumerater8   r   r   r;   rY   AssertionErrorr9   )arrsrR   r   rw   arrs        rC   r   r   ?  s    }o 	.FAs#y)chh.BSXX&xq_-		. L u:T" !MNN%&KELrD   c                   d }t        |       j                  t        |            } ||        ||      z  |z  }t        |       D ci c]  \  }}||v sd| | }}}t        |       D cg c]  \  }}||v rd| n| }}}t        |      D ci c]  \  }}||v sd| | }	}}t        |      D cg c]  \  }}||v rd| n| }
}}|||	|
fS c c}}w c c}}w c c}}w c c}}w )a  
    Given the names of a DataFrame's rows and columns, returns a set of unique row
    and column names and mappers that convert to original names.

    A row or column name is replaced if it is duplicate among the rows of the inputs,
    among the columns of the inputs or between the rows and the columns.

    Parameters
    ----------
    rownames: list[str]
    colnames: list[str]

    Returns
    -------
    Tuple(Dict[str, str], List[str], Dict[str, str], List[str])

    rownames_mapper: dict[str, str]
        a dictionary with new row names as keys and original rownames as values
    unique_rownames: list[str]
        a list of rownames with duplicate names replaced by dummy names
    colnames_mapper: dict[str, str]
        a dictionary with new column names as keys and original column names as values
    unique_colnames: list[str]
        a list of column names with duplicate names replaced by dummy names

    c                J    t               }| D ch c]	  }||vs| c}S c c}w rG   )r   )rR   seenr   s      rC   get_duplicatesz+_build_names_mapper.<locals>.get_duplicatesn  s$    E!&;$d*:;;;s   	  row_col_)r   intersectionr   )r   r   r  shared_names	dup_namesrw   r   r   r   r   r   s              rC   r   r   P  s?   << x=--c(m<Lx(>(+CClRI )2((;$Qty?P$qc
DO  BK8AT6=adi'$qc
T1O 
 )2((;$Qty?P$qc
DO  BK8AT6=adi'$qc
T1O  O_oMMs$   	CC/CC%"C%;C+)r>   r"   r-   r   r.   r   r/   r   r0   r   r1   bool | lib.NoDefaultr2   r   returnr"   )r>   r"   r-   z!AggFuncTypeBase | AggFuncTypeDictr.   r   r/   r   r0   r   r1   r
  r2   r   r  r"   )r'   N)rB   zDataFrame | Seriesr>   r"   r1   r   r0   r   )r'   )r>   r"   r0   r   )r>   r"   r1   r   r0   r   )rB   r"   r>   r"   r1   r   r0   r   )
r>   r"   r+   r    r*   IndexLabel | lib.NoDefaultr)   r  r  r"   )NNNNFr'   TF)
r.   r   r0   r   r/   r   r   z/bool | Literal[0, 1, 'all', 'index', 'columns']r  r"   )rB   r"   r.   r   r0   r   r  r"   )r   )r   r   )r   	list[str]r   r  r  z;tuple[dict[str, str], list[str], dict[str, str], list[str]])E
__future__r   collections.abcr   r   typingr   r   r   r	   ra   numpyro   pandas._libsr
   pandas.util._decoratorsr   r   pandas.util._exceptionsr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   r   pandas.core.dtypes.dtypesr   pandas.core.dtypes.genericr   r   pandas.core.commoncorecommonr   pandas.core.framer   pandas.core.groupbyr   pandas.core.indexes.apir   r   r   pandas.core.reshape.concatr   pandas.core.reshape.utilr   pandas.core.seriesr   pandas._typingr   r   r   r    r   r"   r\   r#   r:   rr   r   r   r   r7   r   r   r   r   r    rD   rC   <module>r$     sN   "     5 ; 
 5
 !   * ' 
 . 6 %  !
 "#	,}
%q1 
!"%(^^4:
4:
 4: 4: 4: 4: #4: 4: 4: 2 $4:nG
G
 /G G G G #G G Gd #RR
R R Rl @E3
34<3> #Q+
Q+ Q+ Q+v #*+*+
*+ *+ *+Z "#	,w
+
 ),),B
B B &	B
 'B B , $BP "AFj j j j ?j j\ JOMM*.M>FMM`"3N3N#,3N@3NrD   