
    "i                        d Z ddlmZmZ ddlmZ ddlmZmZ  G d de	          Z
 ee
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        e
j        g          Z i de
j!        de
j"        d	e
j#        d
e
j$        de
j%        de
j&        de
j'        de
j(        de
j)        de
j*        de
j+        de
j,        de
j-        de
j.        de
j/        de
j0        de
j1        i de
j2        de
j3        de
j        de
j        de
j        de
j        de
j        de
j        d e
j        d!e
j        d"e
j        d#e
j4        d$e
j5        d%e
j6        d&e
j7        d'e
j8        d(e
j9        i d)e
j:        d*e
j;        d+e
j<        d,e
j=        d-e
j>        d.e
j?        d/e
j@        d0e
j        d1e
j        d2e
j        d3e
j        d4e
j        d5e
j        d6e
j        d7e
j        d8e
j        d9e
j        d:e
j        iZAe
j7        e
j-        e
j:        e
j;        e
j<        e
j=        e
j9        e
j>        d;ZBi d<d=d=d=dd>ddd?d?dd?ddd	d	d@d@d
d
dddddddAdAdBdAdCdCdDdDi dEdEdFdFdGdGd>d>dHdHdIdIdJdJdKdKdLdLdMdMdNdNdOdOdPdPdddQdQddZCdRdSdOddTdUZDdVdWdXdYdZd[d\d]ZE G d^ d_e	          ZFd` ZGda ZHdb ZIdc ZJdd ZKde ZLdf ZMdg ZNdh ZOdi ZPdj ZQdk ZRdl ZSdm ZT G dn doe	          ZUdpS )qzExpression Parser.   )
BYTE_TYPESget_item_or_attr)DbDocMessagemysqlxpb_enumc                   r   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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!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.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZS )[	TokenTyper                        	   
                                                                      !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   N)\__name__
__module____qualname__NOTANDORXORISLPARENRPAREN
LSQBRACKET
RSQBRACKETBETWEENTRUENULLFALSEINLIKEINTERVALREGEXPESCAPEIDENTLSTRINGLNUMDOTDOLLARCOMMAEQNEGTGELTLEBITANDBITORBITXORLSHIFTRSHIFTPLUSMINUSMULDIVHEXBINNEGBANGMICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAREROTEME
DOUBLESTARMODCOLONORORANDANDLCURLYRCURLYCASTDOTSTARORDERBY_ASCORDERBY_DESCASARROWQUOTEBINARYDATETIMETIMECHARDATEDECIMALSIGNEDINTEGERUNSIGNEDJSONSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_SECONDHOUR_MICROSECONDHOUR_SECONDHOUR_MINUTEDAY_MICROSECOND
DAY_SECOND
DAY_MINUTEDAY_HOUR
YEAR_MONTHOVERLAPS     C/srv/django_bis/venv311/lib/python3.11/site-packages/mysqlx/expr.pyr
   r
   %   s       
C
C	
B
C	
BFFJJGDDE	BDHFFEGD
CFE	B	B	B	B	B	BFEFFFDE
C
C
C
C
CDKFFD
CDEGDGJ
CEDFFFDGKL	BEEFHDDDGFGHDMKKOJJHJHHHr   r
   andorxorisnotlikeinoverlapsregexpbetweenintervalescapecastdivhexbintruefalsenullsecondminutehourdayweekmonthquarteryearmicrosecondascdescasbinarydatetimetimechardatedecimalsignedunsignedintegerjsonsecond_microsecondminute_microsecondminute_secondhour_microsecondhour_secondhour_minuteday_microsecond
day_second
day_minuteday_hour
year_month)r   r   r   r   r   r   r   r   ===&&||^!=<>>>=<<=&|<<>>+-*/~%cont_in	sign_plus
sign_minus!)r  r  r	  r   r  is_notnot_between
not_regexpnot_likenot_innot_cont_innot_overlaps)r   r   r   r   r   r  r   c                   "    e Zd ZddZd Zd ZdS )Tokenr   c                 0    || _         || _        || _        d S N)
token_typevaluelength)selfr  r  r  s       r   __init__zToken.__init__  s    $
r   c                 *    |                                  S r  )__str__r  s    r   __repr__zToken.__repr__  s    ||~~r   c                     | j         t          j        k    s*| j         t          j        k    s| j         t          j        k    r d                    | j         | j                  S d                    | j                   S )Nz{0}({1})z{0})r  r
   rx   rz   ry   formatr  r!  s    r   r   zToken.__str__  s^    ?io--?in,,?i///$$T_djAAA||DO,,,r   N)r   )rc   rd   re   r  r"  r   r   r   r   r  r    sF           
  - - - - -r   r  c                 `   t          d          }t          | t                     r| S t          | t                    r|                     d          S t          | t          t
          f          r7t          d          |d<   t          |                                           |d<   nt          | t          t          f          r7t          d          |d<   t          |                                           |d<   n6t          d	          |d<   t          |                                           |d
<   |S )NMysqlx.Expr.ExprT)reparseMysqlx.Expr.Expr.Type.OBJECTtypeobjectMysqlx.Expr.Expr.Type.ARRAYarrayMysqlx.Expr.Expr.Type.LITERALliteral)r   
isinstance
ExprParserexprdictr   r   build_objectget_messagelisttuplebuild_arraybuild_scalarr  msgs     r   
build_exprr;  $  s   
$
%
%C%'## ;	EJ	(	( 
;zz$z'''	ED%=	)	) ;#$BCCF$U++7799H	ED%=	)	) ;#$ABBF"5))5577G#$CDDF%e,,88::IJr   c                    t          | t                    rt          |           S t          | t                    rt	          |           S t          | t
                    rt          |           S t          | t                    rt          |           S t          | t                    rt          |           S | t                      S t          d                    t          |                               )NzUnsupported data type: {0}.)r/  strbuild_string_scalarr   build_bytes_scalarboolbuild_bool_scalarintbuild_int_scalarfloatbuild_double_scalarbuild_null_scalar
ValueErrorr$  r)  r  s    r   r8  r8  6  s    % #"5)))	E:	&	& 	#!%(((	E4	 	  # '''	E3		 #&&&	E5	!	! #"5)))	 """
299$u++FF
G
GGr   c                    t          | t                    rt          | j                  S t	          d          }|                                 D ]\  }}t	          d          }t          |t                    r|                                n||d<   t          |          	                                |d<   |d         
                    |	                                g           |S )NMysqlx.Expr.ObjectMysqlx.Expr.Object.ObjectFieldkeyr  fld)r/  r   r3  __dict__r   itemsr=  encoder;  r4  extend)objr:  rL  r  pairs        r   r3  r3  F  s    #u *CL)))
&
'
'Ciikk 0 0
U788&0c&:&:CcjjlllU"5))5577WE
4++--.////Jr   c                 n    t          d          }|d                             d | D                        |S )NMysqlx.Expr.Arrayr  c                 P    g | ]#}t          |                                          $S r   )r;  r4  ).0r  s     r   
<listcomp>zbuild_array.<locals>.<listcomp>U  s,    LLLUE**6688LLLr   )r   rQ  )r,  r:  s     r   r7  r7  S  s<    
%
&
&CLLLeLLLMMMJr   c                  H    t          d          } t          d          | d<   | S )NMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLr)  r   )r:  s    r   rF  rF  Y  s'    
+
,
,C EFFCKJr   c                 R    t          d          }t          d          |d<   | |d<   |S )NrZ  z%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr)  v_doubler   r9  s     r   rE  rE  _  s0    
+
,
,C GHHCKC
OJr   c                 R    t          d          }t          d          |d<   | |d<   |S )NrZ  z#Mysqlx.Datatypes.Scalar.Type.V_SINTr)  v_signed_intr   r9  s     r   rC  rC  f  s1    
+
,
,C EFFCKCJr   c                 R    t          d          }t          d          |d<   | |d<   |S )NrZ  z#Mysqlx.Datatypes.Scalar.Type.V_UINTr)  v_unsigned_intr   r9  s     r   build_unsigned_int_scalarra  l  s2    
+
,
,C EFFCK!CJr   c                     t          | t                    rt          t          | d                    } t	          d          }t          d          |d<   t	          d|           |d<   |S )Nzutf-8rZ  z%Mysqlx.Datatypes.Scalar.Type.V_STRINGr)  zMysqlx.Datatypes.Scalar.StringrH  v_string)r/  r=  bytes	bytearrayr   r   r9  s     r   r>  r>  r  sg    % 1iw//00
+
,
,C GHHCK>eLLLC
OJr   c                 R    t          d          }t          d          |d<   | |d<   |S )NrZ  z#Mysqlx.Datatypes.Scalar.Type.V_BOOLr)  v_boolr   r9  s     r   rA  rA  {  s0    
+
,
,C EFFCKCMJr   c                 p    t          d          }t          d          |d<   t          d|           |d<   |S )NrZ  z%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr)  zMysqlx.Datatypes.Scalar.OctetsrH  v_octetsr   r9  s     r   r?  r?    s>    
+
,
,C GHHCK>eLLLC
OJr   c                 R    t          d          }t          d          |d<   | |d<   |S )Nr&  r-  r)  r.  r   r9  s     r   build_literal_exprrk    s0    
$
%
%C ?@@CKC	NJr   c                     t          d          }t          |          |d<   |                                g|d<   t          d          }t          d          |d<   |                                |d<   |S )NMysqlx.Expr.Operatornameparamr&  Mysqlx.Expr.Expr.Type.OPERATORr)  operator)r   _UNARY_OPERATORSr4  r   )rn  ro  rq  r:  s       r   build_unary_oprs    sr    -..H'-HV**,,-HW
$
%
%C @AACK**,,C
OJr   c                 .    |                      dd          S )N"z"")replace)strings    r   escape_literalrx    s    >>#t$$$r   c                   \   e Zd Zd:dZd Zd Zd Zd Zd;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d Zd Zd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"d;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/d0 Z0d;d1Z1d;d2Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7d8 Z8d9S )<r0  Tc                     || _         g | _        g | _        d| _        || _        i | _        d| _        |                                  |                                  d S N    )	rw  tokenspath_name_queuepos_allow_relational_columnsplaceholder_name_to_positionpositional_placeholder_countclean_expressionlex)r  rw  allow_relationals      r   r  zExprParser.__init__  sZ    !)9&,.),-)




r   c                 6    d                     | j                  S )Nz<mysqlx.ExprParser '{}'>)r$  rw  r!  s    r   r   zExprParser.__str__  s    )00===r   c                    t          | j        t                    st          | j                  | _        | j                            d          | _        t          | j                  dk    r%| j        d         dk    r| j        dd         | _        d| j        dd                                         v r| j        dd         | _        d| j        dd	                                         v r| j        d	d         | _        dS dS )
zRemoves the keywords that does not form part of the expression.

        Removes the keywords "SELECT" and "WHERE" that does not form part of
        the expression itself.
         r   ;NSELECTr   WHEREr   )r/  rw  r=  reprstriplenupperr!  s    r   r  zExprParser.clean_expression  s     $+s++ 	,t{++DKk'',,t{aDKOs$:$:+crc*DKt{2A2,,....+abb/DKdk"1"o++----+abb/DKKK .-r   c                 `    |dz   t          | j                  k     o| j        |dz            |k    S Nr   )r  rw  )r  rL  r   s      r   next_char_iszExprParser.next_char_is  s0    QwT[)))Jdk#'.Bd.JJr   c                    |}d}|t          | j                  k     r| j        |                                         s| j        |         dk    rs| j        |         dk    r|du rt          d          d}|dz  }|t          | j                  k     r0| j        |                                         b| j        |         dk    s| j        ||         }t	          t
          j        |t          |                    S )NF.Tz"Invalid number. Found multiple '.'r   )r  rw  isdigitrG  r  r
   rz   )r  r  start	found_dotvals        r   
lex_numberzExprParser.lex_number  s    	C$$$$$+c*:*B*B*D*D$*.+c*:c*A*A{33&&$$$%IJJJ 	 1HC C$$$$$+c*:*B*B*D*D$*.+c*:c*A*A k%)$Y^S#c((333r   Fc                    |}|t          | j                  k     r| j        |                                         s2| j        |         dk    s!| j        |                                         rp|rn|dz  }|t          | j                  k     rQ| j        |                                         <| j        |         dk    M| j        |                                         r|n| j        ||         }	 |t          | j                  k     rU| j        |         dk    rD|                                t
          vr)t          t          j        |t          |                    }nMt          t          |                                         |                                t          |                    }n8# t          $ r+ t          t          j        |t          |                    }Y nw xY w|S )N_r   ()r  rw  isalnumisspacelower%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr  r
   rx   _RESERVED_WORDSKeyError)r  iallow_spacer  r  tokens         r   	lex_alphazExprParser.lex_alpha  s   #dk""""{1~%%'' #+/;q>S+@+@A&&(( ,A-8 ,AFA #dk""""{1~%%'' #+/;q>S+@+@A&&(( ,A-8 ,A k%'"	:3t{####A#(=(=yy{{"GGGiosCHH==ociikk:CIIKKSRR 	: 	: 	:)/3C99EEE	:s   *B:F% %2GGc                    | j         |         }d}|dz  }|}|t          | j                   k     r| j         |         }||k    r0|dz   t          | j                   k     r| j         |dz            |k    rn`||k    s|dk    r2|dz   t          | j                   k    rn8|dz  }|| j         |         z  }n||z  }|dz  }|t          | j                   k     |t          | j                   k    s| j         |         |k    r"t          d                    |                    |dk    r+t	          t
          j        |t          |          dz             S t	          t
          j        |t          |          dz             S )N r   \z*Unterminated quoted string starting at {0}`r   )rw  r  rG  r$  r  r
   rx   ry   )r  rL  
quote_charr  r  r   s         r   lex_quoted_tokenzExprParser.lex_quoted_token  s   [%
qC$$$$;s#Dz!!cAgDK0@0@&@&@{37#z11##tt||7c$+....qt{3''t1HC C$$$$ #dk""""dk#&6*&D&D   &u/ / /#s3xx!|<<<Y&SXX\:::r   c                    d}d}d}|t          | j                  k     r)| j        |         }|                                r|dz  }@|                                r|                     |          }n|                                s|dk    r|                     ||          }nf|dk    rt          t          j	        |          }nD|dk    rt          t          j
        |          }n"|dk    rt          t          j        |          }n |dk    rt          t          j        |          }n|d	k    rt          t          j        |          }n|d
k    rS|                     |d          r!|st          t          j        dd          }d}nt          t          j        |          }nc|dk    rO|                     |d          rt          t          j        dd          }n*t          t          j        |          }n|dk    rt          t          j        |          }n|dk    rt          t          j        |          }n|dk    rt          t          j        |          }n|dk    rP|                     |d          rt          t          j        dd          }not          t          j        dd          }nR|dk    rO|                     |d          rt          t          j        dd          }nt          t          j        |          }n|dk    rt          t          j        |          }n|dk    rO|                     |d          rt          t          j        dd          }nt          t          j        |          }n|dk    rt          t          j        |          }nd|dk    rt          t          j        |          }nB|dk    rt          t          j        |          }n |dk    rt          t          j        |          }n|dk    rt          t          j         |          }n|d k    rt          t          j!        |          }n|d!k    rO|                     |d          rt          t          j"        d"d          }nt          t          j#        |          }ne|d#k    r|                     |d          rt          t          j"        d$d          }n,|                     |d#          rt          t          j$        d%d          }n|                     |d          rt          t          j%        d&d          }nt          t          j&        |          }n|dk    r|                     |d          rt          t          j'        d'd          }nq|                     |d          rt          t          j(        d(d          }n>t          t          j)        |          }n"|d)k    r|                     |d          rt          t          j*        d*d          }n|dz   t          | j                  k     r8| j        |dz                                            r|                     |          }nt          t          j+        |          }n||d+k    s|d,k    r&|r$t          t          j,        |          }|sd}nOd}d}nJ|d,k    s|d+k    s|d-k    r| -                    |          }n"t]          d./                    |                    | j0        1                    |           ||j2        z  }|t          | j                  k     'd S d S )/Nr|  Fr   r  ?:{}r  r  r   z->r   Tr  z**r  $r
  r   r   r  r   r   r  r   r  )[]r	  ,r  r   r   r   r  r   r  r   r  z.*'ru  r  zUnknown character at {0})3r  rw  r  r  r  isalphar  r  r
   r   r   r   r   r   r  r   r   r   r   r   r|   r   r~   r   r   r   r   r   rk   rl   rm   rn   r   r}   r   r   r   r   r   r   r   r   r   r{   r   r  rG  r$  r}  appendr  )r  r  
arrow_lastinside_arrowr   r  s         r   r  zExprParser.lex  s   
#dk"""";q>D||~~ eGQ bG** `G43;;q,77i/66iot44i.55i.55ind33$$Q,, 9Z 9!)/4;;E!%JJ!)/488EE$$Q,, 7!)"6a@@EE!)-66EEimT22i.55imT22$$Q,, 9!),a88EE!),a88EE$$Q,, :!)"2D!<<EE!)"2D99EEi.55$$Q,, 9!).$::EE!)/488EEi.55i.55i2D99i2D99imT22iot44$$Q,, 8!),a88EE!).$77EE$$Q,, 6!),a88EE&&q#.. 6!)"2D!<<EE&&q#.. 6!),a88EE!),55EE$$Q,, 6!)"2D!<<EE&&q#.. 6!),a88EE!),55EE$$Q,, 7!)"3T1==EEUS----$+a!e2D2L2L2N2N- OOA..EE!)-66EE#++*iot44# )#'LL!&J#(LLts{{--a00 !;!B!B1!E!EFFFKu%%%AS #dk""""""""r   c                 D   | j         t          | j                  k    r(t          d                    || j                             | j        | j                  j        |k    r?t          d                    || j         | j        | j                  | j                            d S )Nz5Expected token type {0} at pos {1} but no tokens leftzDExpected token type {0} at pos {1} but found type {2}, on tokens {3})r  r  r}  rG  r$  r  r  r  s     r   assert_cur_tokenzExprParser.assert_cur_tokenm  s    8s4;'''' ++16*dh+G+GI I I;tx +z99   &z48'+{48'<dk!K !KL L L :9r   c                 8    |                      | j        |          S r  pos_token_type_isr  r  s     r   cur_token_type_iszExprParser.cur_token_type_isw  s    %%dh
;;;r   c                 n    | j         t          | j                  k     o| j        | j                  j        |v S r  r  r  r}  r  r  typess     r   cur_token_type_inzExprParser.cur_token_type_inz  s4    x#dk*** 9{48$/58	9r   c                 >    |                      | j        dz   |          S r  r  r  s     r   next_token_type_iszExprParser.next_token_type_is~  s    %%dhlJ???r   c                 t    | j         t          | j                  k     o| j        | j         dz            j        |v S r  r  r  s     r   next_token_type_inzExprParser.next_token_type_in  s8    x#dk*** ={48a<(3u<	=r   c                 ^    |t          | j                  k     o| j        |         j        |k    S r  )r  r}  r  )r  r  r  s      r   r  zExprParser.pos_token_type_is  s0    S%%% 6K':5	6r   c                 ~    |                      |           | j        | j                 j        }| xj        dz  c_        |S r  )r  r}  r  r  )r  r  r  s      r   consume_tokenzExprParser.consume_token  s;    j)))DH%+Ar   c                    g }d}|                      t          j                   |                     t          j                  sM|                                                                 }t          |d          r4|j        j	        r(| j
                            d|j        j	                   d}nGt          |d          s7d|v r3d|d         v r)| j
                            d|d         d                    d}|                    |           |                     t          j                  rh| xj        dz  c_        |                    |                                                                            |                     t          j                  h|                      t          j                   |r| j
                                         |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        F
identifierr|  Trn  r   )r  r
   rk   r  rl   _exprr4  hasattrr  rn  r~  insertr  r}   r  pop)r  exprspath_name_addedmsg_exprs       r   paren_expr_listzExprParser.paren_expr_list  s    9+,,,%%i&677 	9zz||//11Hx.. '83F3K '$++Ax/B/GHHH"&X|44 'x''Fh|6L,L,L$++Ax/Ef/MNNN"&LL"""((99 9ATZZ\\5577888 ((99 9 	9+,,, 	' $$&&&r   c                 v   |                      t          j                   t          d          }|                     t          j                  rA|                     t          j                  |d<   |                     t          j                   | j        | j                 j	        |d<   | xj        dz  c_        |S )NzMysqlx.Expr.Identifierschema_namern  r   )
r  r
   rx   r   r  r{   r  r}  r  r  )r  idents     r   r  zExprParser.identifier  s    io...011""9=11 	.#'#5#5io#F#FE- y}---DH-3fAr   c                     t          d          }|                                 |d<   |                                 |d<   t          d          }t          d          |d<   |                                |d<   |S )NzMysqlx.Expr.FunctionCallrn  ro  r&  zMysqlx.Expr.Expr.Type.FUNC_CALLr)  function_call)r   r  r  r   r4  )r  r  r  s      r   r  zExprParser.function_call  sv     :;; $ 1 1f!%!5!5!7!7g-..()JKK$1$=$=$?$?!r   c                    |                      t          j                   | j        | j                 }|j        t          j        k    r|j                            d          rA|j        	                    d          r't          d                    |j                            |                      t          j                   |j        }nc|j        t          j        k    r'|                      t          j                   |j        }n't          d                    | j                            t          d          }t          d          |d<   ||d<   |S )Nr  z-{0} is not a valid JSON/ECMAScript identifierzBExpected token type IDENT or LSTRING in JSON path at token pos {0}Mysqlx.Expr.DocumentPathItem(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr)  r  )r  r
   r{   r}  r  r  rx   r  
startswithendswithrG  r$  ry   r   r   )r  r  member_namedoc_path_items       r   docpath_memberzExprParser.docpath_member  s>   9=)))DH%y..{%%c** Cu{/C/CC/H/H C  "..4fU[.A.AC C Cy///+KK!222y0111+KK 55;VDH5E5EG G G >?? -6!8 !8f!,gr   c                    |                      t          j                   |                     t          j                  ra|                      t          j                   |                      t          j                   t          d          }t          d          |d<   |S |                     t          j                  rt          |                      t          j                            }|dk     r't          d                    | j                            |                      t          j                   t          d          }t          d          |d<   ||d<   |S t          d                    | j                            )	Nr  z6Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEX_ASTERISKr)  r|  z%Array index cannot be negative at {0}z-Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEXindexzJException token type MUL or LNUM in JSON path array index at token pos {0})r  r
   rm   r  r   rn   r   r   rz   rB  
IndexErrorr$  r  rG  )r  r  r  s      r   docpath_array_loczExprParser.docpath_array_loc  sc   9/000!!)-00 	2y}---y3444#$BCCM$1H%J %JM&!  ##IN33 	2**9>::;;Eqyy  "$$*F48$4$46 6 6y3444#$BCCM$1?%A %AM&!%*M'"     &tx 0 02 2 2r   c                    t          d          }|                     t          j                  rqt          d          }t	          d          |d<   |                     t          j                  |d<   |d                             |                                g           |d                             |                                            | j	        r| j	        d         |d<   t          d	          }t	          d
          |d<   ||d<   |S )NMysqlx.Expr.ColumnIdentifierr  r  r)  r  document_pathr|  rn  r&  Mysqlx.Expr.Expr.Type.IDENTr  )
r   r  r
   rx   r   r  rQ  r4  r  r~  )r  col_idr  r1  s       r   document_fieldzExprParser.document_field  s    788!!)/22 	J#$BCCM$1:%< %<M&!%)%7%7	%H%HM'"?#**M,E,E,G,G+HIII&&t'9'9';';<<< 	5!1!4F6N)**$%BCCV#\r   c                 `   g }	 |                      t          j                  r;|                    |                                                                            nh|                      t          j                  rh|                     t          j                   t          d          }t          d          |d<   |                    |                                           n|                      t          j
                  r:|                    |                                                                            n|                      t          j                  rh|                     t          j                   t          d          }t          d          |d<   |                    |                                           nnt          |          }|dk    rQt          ||dz
           d          t          d          k    r't          d                    | j                            |S )	zParse a JSON-style document path, like WL#7909, but prefix by @.
        instead of $. We parse this as a string because the protocol doesn't
        support it. (yet)
        Tr  z1Mysqlx.Expr.DocumentPathItem.Type.MEMBER_ASTERISKr)  z1Mysqlx.Expr.DocumentPathItem.Type.DOUBLE_ASTERISKr|  r   z$JSON path may not end in '**' at {0})r  r
   r{   r  r  r4  r   r  r   r   rm   r  r   r  r   rG  r$  r  )r  doc_pathr  rO  s       r   r  zExprParser.document_path  s    
 	%%im44  3 3 5 5 A A C CDDDD''	(9:: ""9#4555 '(F G G(5G)I )If% 9 9 ; ;<<<<''	(<== 	 6 6 8 8 D D F FGGGG''	(<== ""9#7888 '(F G G(5G)I )If% 9 9 ; ;<<<<%	& H199)(519*=vFFLMMN N   &tx 0 02 2 2r   c                    g }|                     |                     t          j                             |                     t          j                  rp|                     t          j                   |                     |                     t          j                             |                     t          j                  pt          |          dk    r't          d                    | j	                            |
                                 t          d          }t          dt          |                    D ]7}|dk    r|d         |d<   |dk    r|d         |d<   &|dk    r|d         |d	<   8d
}|                     t          j                  r9d}|                     t          j                   |                                 |d<   n|                     t          j                  rd}|                     t          j                   d
}|                     t          j                  r!d}|                     t          j                   |                     t          j                   |                                 |d<   |r|                     t          j                   |rmt          |d                   dk    rTt          d          }t#          d          |d<   d|d<   |d                             |                                g           t          d          }t#          d          |d<   ||d<   |S )Nr   z#Too many parts to identifier at {0}r  r|  rn  r   
table_namer   r  FTr  r  r  r)  r  r  r&  r  r  )r  r  r
   rx   r  r{   r  rG  r$  r  reverser   ranger|   r  r   r   r   rQ  r4  )r  partsr  r  is_doc	is_quotedr  r  s           r   column_identifierzExprParser.column_identifier  s   T''	88999$$Y]33 	>y}---LL++IO<<=== $$Y]33 	> u::>>   &tx 0 02 2 2788q#e**%% 	1 	1AAvv!&qva',Qx|$$a(-a}%!!)"233 	4Fy/000&*&8&8&:&:F?####IO44 
	4Fy///I%%io66 4 	""9?333y/000&*&8&8&:&:F?# 4""9?333 	Jc&122a77#$BCCM$1:%< %<M&!%'M'"?#**M,E,E,G,G+HIII-..()FGG!'r   c                     | j         t          | j                  k    rt          d          | j        | j                  }| xj         dz  c_         |S )NzUnexpected end of token streamr   )r  r  r}  rG  )r  r  s     r   
next_tokenzExprParser.next_tokenK  sJ    8s4;''''=>>>DH%Ar   c                     |                                  }|j        |k    r"t          d                    |                    d S )NzExpected token type {0})r  r  rG  r$  )r  r  r  s      r   expect_tokenzExprParser.expect_tokenR  sD    !!z))6==jIIJJJ *)r   c                 &    | j         | j                 S r  )r}  r  r!  s    r   
peek_tokenzExprParser.peek_tokenW  s    {48$$r   c                 T    | j         | j                 j        }| xj        dz  c_        |S r  )r}  r  r  )r  r  s     r   consume_any_tokenzExprParser.consume_any_tokenZ  s'    DH%+Ar   c                    t          d          }| j        t          | j                  k     r|                     t
          j                  s|d                             |                                 	                                g           |                     t
          j
                  sn[|                     t
          j
                   | j        t          | j                  k     r|                     t
          j                  |                     t
          j                   t          d          }t          d          |d<   |	                                |d<   |S )zH
        jsonArray            ::=  "[" [ expr ("," expr)* ] "]"
        rU  r  r&  r+  r)  r,  )r   r  r  r}  r  r
   rn   rQ  r  r4  r}   r  r   )r  r:  r1  s      r   parse_json_arrayzExprParser.parse_json_array_  s%    )**hT[))))&&y';<< *L!9!9!;!; <===)))/:: y/// hT[))))&&y';<< * 	9/000)**$%BCCV))Wr   c                    t          d          }| j        t          | j                  k     rC|                     t
          j                  s#t          d          }|                     t
          j                  |d<   |                     t
          j	                   | 
                                                                |d<   |d                             |                                g           |                     t
          j                  sn\|                     t
          j                   | j        t          | j                  k     r |                     t
          j                  #|                     t
          j                   t          d          }t          d          |d<   |                                |d	<   |S )
z
        jsonDoc              ::=  "{" [jsonKeyValue ("," jsonKeyValue)*] "}"
        jsonKeyValue         ::=  STRING_DQ ":" expr
        rJ  rK  rL  r  rM  r&  r(  r)  r*  )r   r  r  r}  r  r
   r   r  ry   r   r  r4  rQ  r}   r   )r  r:  itemr1  s       r   parse_json_doczExprParser.parse_json_docq  sx   
 *++hT[))))&&y'788 *;<<D,,Y->??DKy/// JJLL4466DMJt//112333)))/:: y/// hT[))))&&y'788 * 	9+,,,)**$%CDDV**Xr   c                 p   d}|                      t          j                  r |                     t          j                  }n|                      t          j                  r |                     t          j                  }nQ|j        t          j        k    rt          | j                  }n't          d
                    | j                            t          d          }t          d          |d<   || j        v r| j        |         |d<   n)| j        |d<   | j        | j        |<   | xj        dz  c_        |S )Nr  z)Invalid placeholder name at token pos {0}r&  z!Mysqlx.Expr.Expr.Type.PLACEHOLDERr)  positionr   )r  r
   rz   r  rx   r  r   r=  r  rG  r$  r  r   r   r  )r  r  place_holder_namer  s       r   parse_place_holderzExprParser.parse_place_holder  s;   !!).11 	2 $ 2 29> B B##IO44 	2 $ 2 29? C C!222 #D$E F F   &tx 0 02 2 2 -..()LMM AAA12CD Z   $(#DHZ 1 -.?@--2--r   c                    t          dd          }|                     t          j                   |d                             |                                                                 g           |                     t          j                   t          t          
                    |                                                     }|d                             t          |                                          g           |                     t          j                   t          d|                                          }t          d          |d<   |S )	z< cast ::= CAST LPAREN expr AS cast_data_type RPAREN
        rm  r   rn  ro  r&  rq  rp  r)  )r   r  r
   rk   rQ  r  r4  r   r?  r=  rP  cast_data_typerk  rl   r   )r  rq  type_scalarr:  s       r   r   zExprParser.cast  s    1???9+,,,  $**,,":":"<"<!=>>>9<((((D4G4G4I4I)J)JKK  ,,88::;	= 	= 	=9+,,,(83G3G3I3IJJJ#$DEEF
r   c                 ,   |                                  }|j        t          j        t          j        t          j        t          j        fv r8|                                 }|rd                    |j	        |          n|j	        S |j        t          j
        u r9|                     d          }|rd                    |j	        |          n|j	        S |j        t          j        t          j        fv rE|                     t          j                  r|                     t          j                   |j	        S |j        t          j        t          j        t          j        fv r|j	        S t%          d                    |j        | j        |j	                            )a   cast_data_type ::= ( BINARY dimension? ) |
                               ( CHAR dimension? ) |
                               ( DATE ) |
                               ( DATETIME dimension? ) |
                               ( TIME dimension? ) |
                               ( DECIMAL dimension? ) |
                               ( SIGNED INTEGER? ) |
                               ( UNSIGNED INTEGER? ) |
                               JSON
        z{0}{1}Tz,Unknown token type {0} at position {1} ({2}))r  r  r
   r   r   r   r   cast_data_type_dimensionr$  r  r   r   r   r  r   r  r   r   rG  r  )r  r  	dimensions      r   r  zExprParser.cast_data_type  so    !!	 0). ) 2IN E E E5577I 28??5;	:::&+k2!22255d;;I 28??5;	:::&+k2)"2I4F!HHH%%i&788 6""9#4555;)"3Y^"+."3 3 3; "F5#3TXu{KKM M 	Mr   c                 |   |                      t          j                  sdS g }|                     t          j                   |                    |                     t          j                             |rp|                      t          j                  rQ|                     t          j                   |                    |                     t          j                             |                     t          j                   t          |          dk    rd	                    |d                   n	 dj	        | S )z4 dimension ::= LPAREN LNUM (, LNUM)? RPAREN
        Nr   z({0})r|  z	({0},{1}))
r  r
   rk   r  r  rz   r}   rl   r  r$  )r  r   r  s      r   r  z#ExprParser.cast_data_type_dimension  s    %%i&677 	4	9+,,,++IN;;<<< 	At--io>> 	Ay///T//	??@@@9+,,,/29~~/B/Bw~~il+++!{!9-	.r   c                 p    t          d          }t          d          |d<   t          dd          |d<   |S )Nr&  rp  r)  rm  r  r  rq  r   )r  r:  s     r   star_operatorzExprParser.star_operator  s>    ())#$DEEF!"8sCCCJ
r   c                 P	   |                                  }|j        t          j        t          j        fv r|                     |          S |j        t          j        k    r|                                 S |j        t          j        k    r| 	                                S |j        t          j
        k    r|                                 S |j        t          j        k    r5|                                 }|                     t          j                   |S |j        t          j        t          j        fv r|                                 }|j        t          j        k    r8|j        |j        z   | j        | j                 _        |                                 S t1          |j        |                                           S |j        t          j        t          j        t          j        fv r't1          |j        |                                           S |j        t          j        k    r!t;          t=          |j                            S |j        t          j        k    rt;          tA                                S |j        t          j        k    red|j        v r.t;          tC          tE          |j                                      S t;          tG          tI          |j                                      S |j        t          j%        t          j&        fv r/t;          tO          |j        t          j%        k                        S |j        t          j(        k    r| )                                S |j        t          j*        k    r| +                                S |j        t          j,        k    r| j        dz
  | _        | -                    t          j                  so| -                    t          j.                  rd| /                    | j        dz   t          j,                  r<| /                    | j        dz   t          j                  r| 0                                S | j1        s| )                                n| 2                                S tg          d4                    |j        | j                            )z<Parse an atomic expression and return a protobuf Expr objectr  r   r   r   zAUnknown token type = {0}  when expecting atomic expression at {1})5r  r  r
   r   r   r  r   r  rm   r  r   r   rk   r  r  rl   r   r   r   rz   r  r}  r  atomic_exprrs  rf   r   r   ry   rk  r>  rq   rF  rE  rD  rC  rB  rp   rr   rA  r|   r  r   r  rx   r  r{   r  r  r  r  rG  r$  )r  r  r1  peeks       r   r  zExprParser.atomic_expr  s   !!	 19?CCC**5111!111&&(((!555((***//99;;!111::<<Di.///K).)/!BBB??$$D).00.3kDJ.FDH%+'')))!%+t/?/?/A/ABBB)-	!OOO!%+t/?/?/A/ABBB!222%&9%+&F&FGGG//%&7&9&9::://ek!!)'ek(:(:;;= = =%&6s5;7G7G&H&HIII).)/!BBB%!%"2in"DEEG G G!111&&(((..%%'''00x!|DH&&y'788 ,''	66,&&tx!|Y_EE, &&tx!|Y5EFF,
 ))+++92D'')))//113  "F5#3TX>>@ @ 	@r   c                 h    |            }| j         t          | j                  k     r	| j        | j                  j        |v rt	          d          }t          d          |d<   t	          d          }t          | j        | j                  j                 |d<   |                                g|d<   | xj         dz  c_         |d         	                     |                                            g           ||d<   |}| j         t          | j                  k     r| j        | j                  j        |v |S )	z}Given a `set' of types and an Expr-returning inner parser function,
        parse a left associate binary operator expressionr&  rp  r)  rm  rn  ro  r   rq  )
r  r  r}  r  r   r   
_OPERATORSr  r4  rQ  )r  r  inner_parserlhsr:  rq  s         r   parse_left_assoc_binary_op_exprz*ExprParser.parse_left_assoc_binary_op_expr  s    lnnx#dk****{48$/588,--C'(HIICK566H)$+dh*?*EFHV!$!2!2 3HWHHMHHW$$llnn&@&@&B&B%CDDD&C
OC x#dk****{48$/588 
r   c                    |                                  }|                     t          j        t          j                  r|                     t          j                  r|                                 }t          d          }|d         	                    |
                                g           |j        t          j        u rdnd|d<   |                     t          j                   |d         	                    |                                 
                                g            | j        t           s't          d                    | j                            t$                              |                                                                           }|d         	                    t-          t/          |                    
                                g           t          d|          }t1          d	          |d
<   |S )Nrm  ro  date_adddate_subrn  z&Expected interval type at position {0}r&  r  rp  r)  )r  r  r
   r   r   r  ru   r  r   rQ  r4  r  r  bit_expr_INTERVAL_UNITSrG  r$  r  r=  rP  r  r  rk  r?  r   )r  r  r  rq  s       r   add_sub_intervalzExprParser.add_sub_interval1  s     !!).)/BB 	J""9#566	JOO%%E566HW$$coo&7&7%8999-2-=-O-Ozz$. V y1222W$$dmmoo&A&A&C&C%DEEE)4)?; 6  "$$*F48$4$46 6 6 JJt5577==??@@EW$$&8"5))'+ '++6;==&: ; ; ; ,x@@@C'(HIICK
r   c                     |                      t          t          j        t          j        t          j        g          | j                  S r  )r  setr
   r   r   r   r$  r!  s    r   mul_div_exprzExprParser.mul_div_exprL  s8    33	y}=>>!# # 	#r   c                 ~    |                      t          t          j        t          j        g          | j                  S r  )r  r&  r
   r   r   r'  r!  s    r   add_sub_exprzExprParser.add_sub_exprQ  s6    33122D4EG G 	Gr   c                 ~    |                      t          t          j        t          j        g          | j                  S r  )r  r&  r
   r   r   r)  r!  s    r   
shift_exprzExprParser.shift_exprU  s8    33!9#3455t7HJ J 	Jr   c                     |                      t          t          j        t          j        t          j        g          | j                  S r  )r  r&  r
   r   r   r   r+  r!  s    r   r"  zExprParser.bit_exprY  s9    33!9?I4DEFFO  	r   c           
          |                      t          t          j        t          j        t          j        t          j        t          j        t          j        g          | j	                  S r  )
r  r&  r
   r   r   r   r   r~   r   r"  r!  s    r   	comp_exprzExprParser.comp_expr^  sJ    33y|Y\9<y|- . ./3}> > 	>r   c                 
   g }|                                  }d}|                     t          j                  r!d}|                     t          j                   | j        t          | j                  k     r|                    |	                                           | j        | j                 j
        }|                     t          j                  r|                     t          j                   |                     t          j                  r!d}|                     t          j                   |                    |                                  	                                           n|                     t          j                  r|                     t          j                   |                     t          j                  r)|                    |                                            nd}|                    |                                  	                                           n|                     t          j                  rZ|                     t          j                   |                    |                                  	                                           nc|                     t          j                  r|                     t          j                   |                    |                                  	                                           |                     t          j                  rX|                     t          j                   |                    |                                  	                                           ns|                     t          j                  r|                     t          j                   |                    |                                  	                                           |                     t          j                   |                    |                                  	                                           n|                     t          j                  rY|                     t          j                   |                    |                                  	                                           n+|r't-          d                    | j                            d }|rbt1          d          }|rt2          |         n||d<   ||d<   t1          d          }t5          d	          |d
<   |	                                |d<   |}|S )NFTr  z"Unknown token after NOT as pos {0}rm  rn  ro  r&  rp  r)  rq  )r.  r  r
   rf   r  r  r  r}  r  r4  r  rj   rs   rk   rQ  r  r   rt   rw   ro   rg   rv   rG  r$  r   	_NEGATIONr   )r  paramsr  r  op_namerq  r  s          r   	ilri_exprzExprParser.ilri_exprc  sg   nn!!)-00 	.Fy}---8c$+&&&&MM#//++,,,k$(+1G%%il33 $""9<000)))-88 6!F&&y}555dnn..::<<====''	55 ""9<000)))*:;; BMM$"6"6"8"89999'GMM$.."2"2">">"@"@AAAA''	(:;; ""9#5666dnn..::<<====''	77 ""9>222dnn..::<<===)))*:;; B&&y'7888MM$.."2"2">">"@"@AAA''	(9:: ""9#4555dnn..::<<===""9=111dnn..::<<====''	(899 ""9#3444dnn..::<<==== :$ &((.tx(8(8: : : "#9::9?#L9W#5#5W $*!"#566#04$6 $6 '/';';'='=$
r   c                 ~    |                      t          t          j        t          j        g          | j                  S r  )r  r&  r
   rg   r   r3  r!  s    r   and_exprzExprParser.and_expr  s6    33	 0122DND D 	Dr   c                 h    |                      t          t          j        g          | j                  S r  )r  r&  r
   ri   r5  r!  s    r   xor_exprzExprParser.xor_expr  s-    33  $-1 1 	1r   c                 ~    |                      t          t          j        t          j        g          | j                  S r  )r  r&  r
   rh   r   r7  r!  s    r   or_exprzExprParser.or_expr  s5    33y~.//@ @ 	@r   c                     |r0g | _         d| _        i | _        d| _        |                                  |                                 S r{  )r}  r  r  r  r  r9  )r  r'  s     r   r  zExprParser._expr  sC     	DKDH02D-01D-HHJJJ||~~r   c                 V   |                      |          }| j        }|                     t          | j                  dz
  t
          j                  r|dz  }|t          | j                  k     r:t          d                    | j        | j        d          | j                            |S )Nr   z9Unused token types {} found in expression at position: {})	r  r  r  r  r}  r
   r   rG  r$  )r  r'  
expressionused_tokenss       r   r1  zExprParser.expr  s    ZZ((
h!!#dk"2"2Q"6	EE 	1KT[)))) ,,2F4;txyy3I378-= -=> > > r   c                 ^    t          d|                     t          j                            S )NzMysqlx.Crud.Columnr  )r   r  r
   rx   r!  s    r   parse_table_insert_fieldz#ExprParser.parse_table_insert_field  s3    + ..y??A A A 	Ar   c                 4    |                                  j        S r  )r  r  r!  s    r   parse_table_update_fieldz#ExprParser.parse_table_update_field  s    %%''22r   c                 H   g }| j                             d          }|                                 |rn|                                }|                    d          |                    d          k    sX|                    d          |                    d          k    s,|                    d          |                    d          k    rd                    |                                |          }|                    d          |                    d          k    T|                    d          |                    d          k    |                    d          |                    d          k    |                    |                                           |n|S )	Nr  r  r  r  r  r  r  z{1},{0})rw  splitr  r  countr$  r  r  )r  fieldstempfields       r   _table_fieldszExprParser._table_fields  sZ   {  %% 	)HHJJE++c""ekk#&6&666C  EKK$4$444C  EKK$4$444!((U;; ++c""ekk#&6&666C  EKK$4$444C  EKK$4$444MM%++--(((  	) r   c                 z   g }d}|                                  }| j        t          | j                  k     r|s|                     t
          j                   d}t          d|                                           }| 	                    t
          j
                  rB|                     t
          j
                   |                     t
          j                  |d<   n|t          |                   |d<   |                    |                                           | j        t          | j                  k     |S )NTFzMysqlx.Crud.Projection)sourcealias)rH  r  r  r}  r  r
   r}   r   r  r  r   rx   r  r4  )r  project_exprfirstrE  
projections        r   parse_table_select_projectionz(ExprParser.parse_table_select_projection  s   ##%%hT[)))) 4""9?333E !9$**,,OOOJ%%il33 @""9<000&*&8&8&I&I
7##&,S->->&?
7#
 6 6 8 8999 hT[)))) r   c                    g }d}| j         t          | j                  k     r,|s|                     t          j                   d}t          d|                                           }|                     t          j	                  r2t          d          |d<   |                     t          j	                   nP|                     t          j                  r1t          d          |d<   |                     t          j                   |                    |                                           | j         t          | j                  k     ,|S )NTFzMysqlx.Crud.Order)r1  zMysqlx.Crud.Order.Direction.ASC	directionz Mysqlx.Crud.Order.Direction.DESC)r  r  r}  r  r
   r}   r   r  r  r   r   r   r  r4  )r  order_specsrM  orders       r   parse_order_speczExprParser.parse_order_spec  s3   hT[)))) 4""9?333E/djjllCCCE%%i&;<< ;%25&7 &7k"""9#89999''	(>?? ;%26&8 &8k"""9#9:::u0022333 hT[)))) r   c                 :   g }d}| j         t          | j                  k     ry|s|                     t          j                   d}|                    |                                                                            | j         t          | j                  k     y|S )NTF)	r  r  r}  r  r
   r}   r  r  r4  )r  	expr_listrM  s      r   parse_expr_listzExprParser.parse_expr_list  s    	hT[)))) 4""9?333ETZZ\\5577888	 hT[))))
 r   N)T)F)9rc   rd   re   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  r  r  r$  r'  r)  r+  r"  r.  r3  r5  r7  r9  r  r1  r?  rA  rH  rO  rT  rW  r   r   r   r0  r0    s       	 	 	 	> > >* * *"K K K4 4 4    $; ; ;6m m m^L L L< < <9 9 9@ @ @= = =6 6 6    2      ,2 2 22     @/ / /b  K K K
% % %  
  $  .  0   M M M@. . . ."  6@ 6@ 6@p  $  6# # #
G G GJ J J  
> > >
8 8 8tD D D1 1 1@ @ @   	 	 	 	A A A3 3 3    $  &    r   r0  N)V__doc__helpersr   r   dbdocr   protobufr   r   r*  r
   r&  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  rg   rh   ri   rj   rf   rt   rs   r   rv   ro   ru   rw   r   r   r   r   rp   rr   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rr  r0  r  r;  r8  r3  r7  rF  rE  rC  ra  r>  rA  r?  rk  rs  rx  r0  r   r   r   <module>r\     s  :   1 1 1 1 1 1 1 1       , , , , , , , ,Y Y Y Y Y Y Y Yx #NMNON  )  .5		5	5 
	5 			5
 
	5 	5 		5 	"5 	 5 	!5 	"5 	 5 	5 
	5 
	5  
	!5" 	#5 5$ 	%5& 	'5( 	 )5* 	 +5, 	-5. 
	/50 	152 	354 	!556 	758 9(95: 
	%;5< 	&=5> 		?5@ 	 A5B 	"C5D 	E5 5 5F 	G5H 	I5J 	!K5L 	 M5N 	"O5P 	!Q5R 	S5T )6U5V )6W5X Y,Y5Z 	2[5\ 9(]5^ 9(_5` y0a5b )&c5d )&e5f 	"g5 5h )&i5 5p NNN N"	) 	) %""$" 
4" 
5	"
 	$" 	$" 
5" 
5" " 	$" y" 	$" F" 	$" 	$"  !"" 	$#" "$ %"& 	$'"( )"* 	$+", -". 	$/"0 	$1"2 3"4 5"6 7"8 9": ;"< ="> F?"@ yA"B 
C" "
J 
			   
 	- - - - -F - - -&  $H H H 
 
 
                    % % %` ` ` ` ` ` ` ` ` `r   