
    Yh              
       L   d dl Z e j                  j                  dk  reefZneZeZdZdZ	d Z
dZdZdZd	 ZeZd
Zd Zd Zd Zd Zd Zd dlZd dlZd dlZd dlZ ej6                  d      Zdddddddddd	Zd Z G d de      Z  G d de      Z!e"d k(  rd dl#m$Z$  e$jH                         Z%d dl Z  e&e jN                  d!         Z(e(jS                         Z* e!e%      Z+e+jY                  e*e jN                  d!          	 e+j[                         Z.e.sy e/e+j`                  e.       'y)"    N   )
CPP_IDCPP_INTEGER	CPP_FLOAT
CPP_STRINGCPP_CHARCPP_WSCPP_COMMENT1CPP_COMMENT2	CPP_POUND
CPP_DPOUNDz+-*/%|&~^<>=!?()[]{}.,;:\'"c                 v    | j                   xj                  | j                  j                  d      z  c_        | S )z\s+
lexerlinenovaluecountts    b/var/www/django-portfolio.reubendavern.link/venv/lib/python3.12/site-packages/pycparser/ply/cpp.pyt_CPP_WSr      &    GGNNaggmmD))NH    z\#z\#\#z[A-Za-z_][\w_]*c                     | S )zA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?) r   s    r   r   r   +   s    Hr   z?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?c                 v    | j                   xj                  | j                  j                  d      z  c_        | S )z\"([^\\\n]|(\\(.|\n)))*?\"r   r   r   s    r   t_CPP_STRINGr   5   r   r   c                 v    | j                   xj                  | j                  j                  d      z  c_        | S )z(L)?\'([^\\\n]|(\\(.|\n)))*?\'r   r   r   s    r   
t_CPP_CHARr    ;   r   r   c                     | j                   j                  d      }| j                  xj                  |z  c_        d| _        |rd|z  | _         | S d| _         | S )z(/\*(.|\n)*?\*/)r   r	    )r   r   r   r   type)r   ncrs     r   t_CPP_COMMENT1r%   A   sL    
''--
CGGNNcNAFsqwH 9<qwHr   c                 "    d| _         d| _        | S )z(//.*?(\n|$))r	   r   )r#   r   r   s    r   t_CPP_COMMENT2r'   J   s     AFqwHr   c                     | j                   d   | _        | j                   d   | _         | j                  j                  d       | S Nr      )r   r#   r   skipr   s    r   t_errorr,   P   s4    WWQZAFggajAGGGLLOHr   z\?\?[=/\'\(\)\!<>\-]#\^[]|{}~)	=/'()!<>-c                 0    t         j                  d |       S )Nc                 6    t         | j                         d      S N)_trigraph_repgroup)gs    r   <lambda>ztrigraph.<locals>.<lambda>z   s    }QWWYr]'C r   )_trigraph_patsub)inputs    r   trigraphrJ   y   s    CEJJr   c                       e Zd ZddZy)MacroNc                 b    || _         || _        || _        || _        |r
|d   | _        d | _        y rA   )namer   arglistvariadicvarargsource)selfrN   r   rO   rP   s        r   __init__zMacro.__init__   s3    	
 !"+DKr   )NF)__name__
__module____qualname__rT   r   r   r   rL   rL      s    r   rL   c                       e 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dZd ZddZd Zd Zd Zdi fdZd Zy)PreprocessorNc                 V   |t         j                  }|| _        i | _        g | _        g | _        | j                          t        j                         }| j                  dt        j                  d|      z         | j                  dt        j                  d|      z         d | _
        y )Nz__DATE__ "%s"z%b %d %Yz__TIME__ "%s"z%H:%M:%S)lexr   macrospath	temp_pathlexprobetime	localtimedefinestrftimeparser)rS   r   tms      r   rT   zPreprocessor.__init__   s    =IIE
	 	^^%j(DDE%j(DDEr   c                     g }| j                   j                  |       	 | j                   j                         }|s	 |S |j                  |       1N)r   rI   tokenappend)rS   texttokenstoks       r   tokenizezPreprocessor.tokenize   sK    

**""$C MM# r   c                 &    t        d|||fz         y )Nz%s:%d %s)print)rS   filelinemsgs       r   errorzPreprocessor.error   s    jDc?*+r   c                 (   | j                   j                  d       | j                   j                         }|r|j                  dk7  rt	        d       n|j
                  | _        | j                   j                  d       | j                   j                         }|rt        |j                        dk7  rt	        d       n+|j
                  | _        t        |j                        | _	        | j                   j                  d       | j                   j                         }|r|j                  dk7  rt	        d       n|j
                  | _
        | j                   j                  d       | j                   j                         }|r|j                  dk7  rd | _        n|j
                  | _        | j                   j                  d	       | j                   j                         }|r|j                  d	k7  rd | _        t	        d
       n|j
                  | _        | j                  | j                  f| _        g d}|D ]W  }| j                   j                  |       | j                   j                         }|r|j                  |k7  sJt	        d|z         Y y )N
identifierz"Couldn't determine identifier type12345i90  zCouldn't determine integer typez
"filename"zCouldn't determine string typez  r   z%Couldn't determine token for newlines)	r<   r=   r-   ##r.   r9   r:   ,.z,Unable to lex '%s' required for preprocessor)r   rI   rh   r   ro   r#   t_IDint	t_INTEGERt_INTEGER_TYPEt_STRINGt_SPACE	t_NEWLINEt_WS)rS   rl   charscs       r   r_   zPreprocessor.lexprobe   s    	

&jj cii</67DI 	

!jj c#))n-34 XXDN"&syy/D 	

(jj cii>123HHDM 	

jj cii4'DL88DL 	

jj cii4'!DN9: XXDN\\4>>2	 9 	JAJJQ**""$C#))q.DqHI		Jr   c                 :    | j                   j                  |       y rg   )r]   ri   )rS   r]   s     r   add_pathzPreprocessor.add_path  s    		r   c              #     K   | j                   j                         }|j                         D cg c]  }|j                          }}t	        t        |            D ]j  }|dz   }||   j                  d      s|t        |      k  s,||   d d ||   z   ||<   d||<   |dz  }||   j                  d      s\|t        |      k  r?l dj                  |      } |j                  |       d|_	        g }	  |j                         }|sn>|j                  |       |j                  | j                  v rd|j                  v r| g }R|r| y y c c}w w)Nr*   r.   rB    r   )r   clone
splitlinesrstripxrangelenendswithjoinrI   r   rh   ri   r#   r   r   )	rS   rI   r[   xlinesijcurrent_linerl   s	            r   group_lineszPreprocessor.group_lines  sQ    jj %*%5%5%7888E
# 	A!A(##D)q3u:~ 8CR=q1aaQ (##D)q3u:~	 		% 		%
#))+C$xx499$):""!   - 9s)   -EE2E9E/E8EBEc                 |   d}|t        |      k  rJ||   j                  | j                  v r/|dz  }|t        |      k  r||   j                  | j                  v r/|d |= t        |      dz
  }|dk\  rA||   j                  | j                  v r&|dz  }|dk\  r||   j                  | j                  v r&||dz   d = |S r)   )r   r#   r   )rS   rk   r   s      r   
tokenstripzPreprocessor.tokenstrip8  s    #f+o&)..DII"=FA #f+o&)..DII"=2A2JKM1f4994FA 1f49941Q34Lr   c                    g }g }g }d}t        |      }d}||k  rA||   j                  | j                  v r&|dz  }||k  r||   j                  | j                  v r&||k  r'||   j                  dk(  r|j	                  |dz          n/| j                  | j                  |d   j                  d       dg g fS |dz  }||k  r||   }|j                  dk(  r|j	                  |       |dz  }n|j                  dk(  rW|dz  }|dk(  r;|r1|j	                  | j                  |             |j	                  |       |dz   ||fS |j	                  |       n\|j                  dk(  r<|dk(  r7|j	                  | j                  |             |j	                  |dz          g }n|j	                  |       |dz  }||k  r| j                  | j                  |d   j                  d       dg g fS )	Nr*   r   r9   zMissing '(' in macro argumentsr:   rx   rB   zMissing ')' in macro arguments)	r   r#   r   r   ri   rs   rR   r   r   )	rS   	tokenlistargs	positionscurrent_argnestingtokenlenr   r   s	            r   collect_argszPreprocessor.collect_argsT  s   	y> 8|)A,"3"3tyy"@FA 8|)A,"3"3tyy"@ Ly|11S8QqS!JJt{{9Q<#6#67WXb"9	Q(l!Aww#~""1%1C1a<"DOOK$@A!((+Q3tI--""1%CGqLDOOK89  1% ""1%FA' (l, 	

4;;y}334TU"Rxr   c                 z   g |_         g |_        g |_        d}|t        |j                        k  r|j                  |   j
                  | j                  k(  r|j                  |   j                  |j                  v r|j                  j                  |j                  |   j                        }|dkD  r|j                  |dz
     j                  dk(  rt        j                  |j                  |         |j                  |<   | j                  |j                  |   _        |j                  |dz
  = |j                  j                  ||dz
  f       ;|dkD  rR|j                  |dz
     j                  dk(  r3|j                   j                  d||dz
  f       |j                  |dz
  = |dz   t        |j                        k  rD|j                  |dz      j                  dk(  r%|j                   j                  d||f       |dz  }|j                   j                  d||f       n|j                  |   j                  dk(  r|j                  r|dkD  r|j                  |dz
     j                  dk(  r|dz   t        |j                        k  rp|j                  |dz      j
                  | j                  k(  rG|j                  |dz      j                  |j                  k(  r|j                  j                  |dz
         |dz  }|t        |j                        k  r|j                   j                  d d	
       y )Nr   r*   r-   rw   r   erx   c                     | d   S )N   r   )r   s    r   rF   z,Preprocessor.macro_prescan.<locals>.<lambda>  s
    qt r   T)keyreverse)patch	str_patchvar_comma_patchr   r   r#   rz   rO   indexcopyr~   ri   rP   rQ   sort)rS   macror   argnums       r   macro_prescanzPreprocessor.macro_prescan  s    "#ekk""{{1~""dii/EKKN4H4HEMM4Y,,U[[^-A-ABq5U[[1-33s:%)YYu{{1~%>EKKN*.--EKKN'AaC(OO**F1Q3<8!eAaC 0 6 6$ >KK&&F1Q3'78AaC(sc%++..5;;qs3C3I3IT3QKK&&F1~6FA KK&&F1~6Q%%->>q1u5;;qs3C3I3IS3PA#U[[!11AaC8H8M8MQUQZQZ8ZQqS)//5<<?))0015FA7 #ekk""8 	^D9r   c                    |j                   D cg c]  }t        j                  |       }}i }|j                  D ]s  \  }}||vrBddj                  ||   D cg c]  }|j                    c}      z  j	                  dd      ||<   t        j                  ||         ||<   ||   ||   _         u d}	|j
                  r|d   s|j                  D ]	  }d ||<   d}	 i }
|j                  D ]C  \  }}}|dk(  r||   |||d	z    |d
k(  s||
vr| j                  ||         |
|<   |
|   |||d	z    E |	r|D cg c]  }|s|	 }}|S c c}w c c}w c c}w )Nz"%s"r   r.   z\\FrB   Tr   r*   r   )	r   r   r   r   replacerP   r   r   expand_macros)rS   r   r   _xrepstr_expansionr   r   r   comma_patchexpandedptype_is                r   macro_expand_argszPreprocessor.macro_expand_args  s   ',{{3tyy}33  	1IFA]*)/"''DQWL:Yq177:Y2Z)Z(c(cdhio(pf%YYs1v&CF(0CFL		1 >>$r(** #A"#  % 	.E61|!&\Aac
#)'+'9'9$v,'GHV$%f-Aac
	.  #*"r2*C*
K 4 ;Z8 +s   EE6E>Ec           	         |i }d}|t        |      k  r$||   }|j                  | j                  k(  r|j                  | j                  v r|j                  |vrd||j                  <   | j                  |j                     }|j
                  sm| j                  |j                  D cg c]  }t        j                  |       c}|      }|D ]  }|j                  |_         ||||dz    |t        |      z  }n|dz   }	|	t        |      k  rJ||	   j                  | j                  v r/|	dz  }	|	t        |      k  r||	   j                  | j                  v r/||	   j                  dk(  rh| j                  ||	d        \  }
}}|j                  sqt        |      t        |j
                        k7  rP| j                  | j                  |j                  d|j                  t        |j
                        fz         |	|
z   }n|j                  rt        |      t        |j
                        dz
  k  rt        |j
                        dkD  rM| j                  | j                  |j                  d|j                  t        |j
                        dz
  fz         nL| j                  | j                  |j                  d|j                  t        |j
                        dz
  fz         |	|
z   }n|j                  rt        |      t        |j
                        dz
  k(  r|j                  g        nX||	|t        |j
                        dz
     z   |	|
z   dz
   |t        |j
                        dz
  <   |t        |j
                        d = | j                  ||      }| j                  ||      }|D ]  }|j                  |_         ||||	|
z    |t        |      z  }||j                  = |j                  d	k(  r1| j                   |_        | j#                  |j                        |_        |dz  }|t        |      k  r$|S c c}w )
Nr   Tr*   r9   zMacro %s requires %d argumentsr   z(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argument__LINE__)r   r#   rz   r   r\   rO   r   r   r   r   r   rP   rs   rR   ri   r   r|   r}   )rS   rk   r   r   r   mr   exr   r   tokcountr   r   r   rs                  r   r   zPreprocessor.expand_macros  s   H#f+oq	Avv"77dkk)aggX.E(,HQWW%AGG,A99!//0Q220QRZ[!# 0A'(xxAH0(*q1SW E#f+o&)..DII2MFA  #f+o&)..DII2M!!9??c16:6G6Gqr
6S3HT)#$::#d)AII2N $

4;;qxx@`dedkdklopqpypylzc{@{ |$%L!"D	C		N1<L0L#&qyy>A#5$(JJt{{188Dnrsryry{~  @A  @I  @I  |J  KL  |L  rM  EM  %N$(JJt{{188Dmqrqxqxz}~  H  H  {I  JK  {K  qL  EL  %M$%L#$::'*4yC		N14D'D(,BAG)TWXYXaXaTbcdTdJeHefghpfpqrfrAsS^A-=(>,0QYY,A '+&<&<Qt&D&*&8&8X&F), !8A/0xxAH!87:q8 4 !SX )WW
*!^^AF"11!((;AGFAi #f+oj W 1Rs   *P<c                 x   d}|t        |      k  rZ||   j                  | j                  k(  r(||   j                  dk(  r|dz   }d}d}|t        |      k  r||   j                  | j                  v r|dz  }/||   j                  | j                  k(  r#||   j                  | j
                  v rd}nd}|sSnf||   j                  dk(  rd}n=||   j                  d	k(  rn>| j                  | j                  ||   j                  d
       |dz  }|t        |      k  r| j                  ||   _        | j                  |      ||   _        ||dz   |dz   = |dz  }|t        |      k  rZ| j                  |      }t        |      D ]  \  }}|j                  | j                  k(  rFt        j                  |      ||<   | j                  ||   _        | j                  d      ||   _        e|j                  | j                  k(  st        j                  |      ||<   t        ||   j                        ||   _        ||   j                  d   dvs||   j                  d d ||   _        ||   j                  d   dvr/ dj                  |D cg c]  }t        |j                         c}      }|j!                  dd      }|j!                  dd      }|j!                  dd      }	 t#        |      }|S c c}w # t$        $ r0 | j                  | j                  |d   j                  d       d}Y |S w xY w)Nr   definedr*   F0L1Lr9   Tr:   zMalformed defined()rB   0123456789abcdefABCDEFr   z&&z and z||z or r;   z not zCouldn't evaluate expression)r   r#   rz   r   r   r\   rs   rR   r   r|   r}   r   	enumerater   strr   r   eval	Exception)	rS   rk   r   r   	needparenresultr   r   exprs	            r   evalexprzPreprocessor.evalexpr(  s    #f+oay~~*vay)/KE!	#f+oay~~2Q 4994!!9??dkk9%)F%)F(%C/$(	C/

4;;vay/?/?@UVFA! #f+o" "&q	"&"5"5f"=q	1Q3qs7OFA3 #f+o4 ##F+V$ 
	;CAavv" IIaLq	!%q	"&"5"5d";q	4>>) IIaLq	"%fQioo"6q	Qioob)1II&,Qioocr&:F1IO Qioob)1II
	; wwf5AGG56||D)||D(||C(	$ZF  6  	JJt{{6!9#3#34RSF	s   K;.L   5L98L9c              #     K   t        |      }| j                  |      }|sd}| j                  d|z         || _        g }d}d}g }|D ]^  }	t	        |	      D ]  \  }
}|j
                  | j                  vs n j                  dk(  r	|	D ];  }|j
                  | j                  v sd|j                  v s+|j                  |       = | j                  |	
dz   d        }|r$|d   j                  }| j                  |dd        }nd}g }|d	k(  r1|s| j                  |      D ]  }|  g }| j                  |       |d
k(  ra|s| j                  |      D ]  }|  g }| j                  d   }| j                  |      D ]  }|  || j                  d<   || _        ^|dk(  r3|sg| j                  |      D ]  }|  g }| j                  |       |dk(  r<|j                  ||f       |s|d   j                  | j                  vrd}d}d}|dk(  r<|j                  ||f       |s|d   j                  | j                  v rd}d}d}|dk(  r4|j                  ||f       |s4| j                  |      }|sd}d}Md}Q|dk(  r]|r/|d   d   sb|rd}h|rl| j                  |      }|sd}d}| j                  | j                  |d   j                   d       |dk(  rH|r|d   d   s|rd}|rd}d}| j                  | j                  |d   j                   d        |dk(  rC|r|j#                         \  }}| j                  | j                  |d   j                   d       HJ|sN|j%                  |	       a | j                  |      D ]  }|  g }y w)Nr   z__FILE__ "%s"TFr-   r   r*   r   rb   include__FILE__undefifdefifndefifelifrB   zMisplaced #elifelsezMisplaced #elseendifzMisplaced #endif)rJ   r   rb   rR   r   r#   r   r   ri   r   r   r\   r   r   r   rs   r   popextend)rS   rI   rR   r   r   chunkenable	iftriggerifstackr   r   rl   	dirtokensrN   r   oldfiler   s                    r   parsegenzPreprocessor.parsegenc  s     UO  #F%./	 f	$A"1 4#88499,e4yyC  *Cxx499,1BS)* !OOAacdG4	$Q<--D??9QR=9DDD8##'#5#5e#< &C"%I& "D)Y&#'#5#5e#< &C"%I& ""&++j"9#'<<#5 &C"%I&29J/&,W_#'#5#5e#< &C"%I& "

4(W_NNF9#56#Aw}};%*F(-I(,IX%NNF9#567==DKK7%*F(-I(,IT\NNF9#56!%t!4%%*F(-I(,IV^"2;q>%).%.)-t)<#).2F04I

4;;y|/B/BCTUV^"2;q>%).%.)-,0	

4;;y|/B/BCTUW_+2;;=(y

4;;y|/B/BCUV  LLOMf	$P %%e, 	CI	se   A3O60O'O6AO5O	A$O/A	O:?O;?O<,O*O4O	AOOA>O1Oc              #     K   |sy |r6|d   j                   dk7  r-|d   j                  | j                  k7  r| j                  |      }|d   j                   dk(  rd}|t	        |      k  r'||   j                   dk(  rn |dz  }|t	        |      k  r't        d       y dj                  |d| D cg c]  }|j                    c}      }| j                  dgz   | j                  z   }nX|d   j                  | j                  k(  r0|d   j                   dd }| j                  dgz   | j                  z   }nt        d       y D ]  }t        j                  j                  |      }	 t        |d	      j                         }t        j                  j                  |      }	|	r| j                  j                  d|	       | j                  ||      D ]  }
|
  |	r| j                  d=  y  t        d
z         y c c}w # t        $ r Y w xY ww)Nr   r<   r*   r=   zMalformed #include <...>r   rB   zMalformed #include statementr   zCouldn't find '%s')r   r#   r~   r   r   ro   r   r]   r^   osopenreaddirnameinsertr   IOError)rS   rk   r   r   filenamer]   pinamedatadnamerl   s              r   r   zPreprocessor.include  s    ay#%&)..DMM*I++F3ay#%#f+oay#-FA #f+o
 4577VAa[#AAGG#AByyB4'$..84==0!!9??1R0~~,tyy845 	3AGGLL8,EE#++-.NN))!E2==h7 CIq)	3 &12/ $B(  s>   BHH/G8B"H%BG=&H=	H	HH		Hc           	         t        |t              r| j                  |      }|}	 |d   }t        |      dkD  r|d   }nd }|s0t	        |j
                  g       }|| j                  |j
                  <   y |j                  | j                  v rBt	        |j
                  | j                  |dd              }|| j                  |j
                  <   y |j
                  dk(  r6| j                  |dd        \  }}}d}	|D ]  }
|	rt        d        y dj                  |
D cg c]  }t        |j
                         c}      }|dk(  r(d	}	| j                  |
d   _        d
|
d   _        d	}	|
dd = r|dd  dk(  rS|
d   j                  | j                  k(  r7d	}	|
dd = |
d   j
                  dd  dk(  r|
d   j
                  d d |
d   _        t        |
      dkD  s|
d   j                  | j                  k7  st        d        y  | j                  |d|z   d        }d}|t        |      k  r|dz   t        |      k  rj||   j                  | j                  v r||dz      j
                  dk(  r||= S||   j
                  dk(  r$||dz      j                  | j                  v r||dz   = |dz  }|t        |      k  rt	        |j
                  ||D cg c]  }|d   j
                   c}|	      }| j                  |       || j                  |j
                  <   y t        d       y c c}w c c}w # t         $ r t        d       Y y w xY w)Nr   r*   r   r9   Fz0No more arguments may follow a variadic argumentr   z...T__VA_ARGS__zInvalid macro argumentrw   zBad macro definition)
isinstanceSTRING_TYPESrm   r   rL   r   r\   r#   r   r   r   ro   r   r   rz   r   LookupError)rS   rk   linetokrN   mtyper   r   r   r   rP   ar   astrmvaluer   r   s                   r   rb   zPreprocessor.define  s   f\*]]6*F9	*1:D7|a
$**R(*+DJJ'tyy($**T__WQR[%AB*+DJJ'#,0,=,=gabk,J)$	  $0APQ77A#>bCM#>?Du}#'$(II!	%2!
#'abE bce+!		TYY0F#'abE Q4::bc?e3)*1CRAaDJ 1vzQqTYY$))%;67-$00 "__WQxZ[-ABFAc&k/Q3V,%ay~~:vac{?P?PTX?X$*1I (!'D!8VAaC[=M=MQUQZQZ=Z$*1Q3KQ c&k/ djjT0J10J8TA&&q)./DKK

+,-E $?< 1K
  	*()	*s]   AL( 2AL( >L( L( L
6B9L( 0L( =B6L( 4L( 	L#2L( L( 
L( (L?>L?c                 \    |d   j                   }	 | j                  |= y # t        $ r Y y w xY w)Nr   )r   r\   r   )rS   rk   ids      r   r   zPreprocessor.undef]  s1    AY__	B 		s    	++c                 @    || _         | j                  ||      | _        y rg   )ignorer   rd   )rS   rI   rR   r   s       r   parsezPreprocessor.parsei  s    mmE&1r   c                     	 	 t        | j                        }|j                  | j                  vr|S 0# t        $ r
 d | _        Y y w xY wrg   )nextrd   r#   r   StopIteration)rS   rl   s     r   rh   zPreprocessor.tokenr  sL    	4;;'884;;.s
   	DK	s   /3 3 AArg   )rU   rV   rW   rT   rm   rs   r_   r   r   r   r   r   r   r   r   r   r   rb   r   r   rh   r   r   r   rY   rY      so    ,,4JxB	8+j!:V'd9D4v{F)3b>*L !%B 2r   rY   __main__r*   )1sysversion_infomajorr   unicoder   ranger   rk   literalsr   t_CPP_POUNDt_CPP_DPOUNDt_CPP_IDr   t_CPP_INTEGERt_CPP_FLOATr   r    r%   r'   r,   rer   r`   os.pathr   compilerG   rC   rJ   objectrL   rY   rU   ply.lexr[   r   r   argvfr   rI   r   r   rh   rl   ro   rR   r   r   r   <module>r     sq    A>LLF
 ,
    Q 
   & 

67
K&F "\6 \| zCGGIE SXXa[AFFHEUAGGE#((1+
ggiEahh  r   