Index: .gitignore
===================================================================
--- .gitignore	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ .gitignore	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -33,15 +33,15 @@
 
 # generated by latex
-doc/refrat/refrat.aux
-doc/refrat/refrat.bbl
-doc/refrat/refrat.blg
-doc/refrat/refrat.brf
-doc/refrat/refrat.dvi
-doc/refrat/refrat.idx
-doc/refrat/refrat.ilg
-doc/refrat/refrat.ind
-doc/refrat/refrat.log
-doc/refrat/refrat.out
-doc/refrat/refrat.pdf
-doc/refrat/refrat.ps
-doc/refrat/refrat.toc
+*.aux
+*.bbl
+*.blg
+*.brf
+*.dvi
+*.idx
+*.ilg
+*.ind
+*.log
+*.out
+*.pdf
+*.ps
+*.toc
Index: configure
===================================================================
--- configure	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ configure	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -2409,4 +2409,10 @@
 
 
+if test "x${CXXFLAGS}" = "x"; then
+   export CXXFLAGS="-std=c++11 -g -O2 ${CXXFLAGS}"
+else
+   export CXXFLAGS="-std=c++11 ${CXXFLAGS}"
+fi
+
 am__api_version='1.11'
 
Index: configure.ac
===================================================================
--- configure.ac	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ configure.ac	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -7,4 +7,10 @@
 #AC_CONFIG_SRCDIR([src/main.cc])
 AC_CONFIG_HEADERS([config.h])
+
+if test "x${CXXFLAGS}" = "x"; then
+   export CXXFLAGS="-std=c++11 -g -O2 ${CXXFLAGS}"
+else
+   export CXXFLAGS="-std=c++11 ${CXXFLAGS}"
+fi
 
 AM_INIT_AUTOMAKE
Index: doc/LaTeXmacros/common.tex
===================================================================
--- doc/LaTeXmacros/common.tex	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ doc/LaTeXmacros/common.tex	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,219 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% 
+%% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+%%
+%% The contents of this file are covered under the licence agreement in the
+%% file "LICENCE" distributed with Cforall.
+%% 
+%% common.tex -- 
+%% 
+%% Author           : Peter A. Buhr
+%% Created On       : Sat Apr  9 10:06:17 2016
+%% Last Modified By : Peter A. Buhr
+%% Last Modified On : Sat Apr  9 10:06:39 2016
+%% Update Count     : 1
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Names used in the document.
+
+\newcommand{\CFA}{C$\mathbf\forall$\xspace}				% set language symbolic name
+\newcommand{\CFL}{Cforall\xspace}						% set language text name
+\newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
+\def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\makeatletter
+% allow escape sequence in lstinline
+%\usepackage{etoolbox}
+%\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
+
+% make fontsize "small" slightly larger, specifically for san serif (helvetica) in program code
+\renewcommand\small{%
+   \@setfontsize\small{8.5}{11}%
+   \abovedisplayskip 8.5pt \@plus 3pt \@minus 4pt
+   \abovedisplayshortskip \z@ \@plus 2pt
+   \belowdisplayshortskip 4pt \@plus 2pt \@minus 2pt
+   \def\@listi{\leftmargin\leftmargini
+               \topsep 4pt \@plus 2pt \@minus 2pt
+               \parsep 2pt \@pluspt \@minuspt
+               \itemsep \parsep}%
+   \belowdisplayskip \abovedisplayskip
+}
+\usepackage{relsize}									% must be after change to small or selects old size
+
+% reduce size of chapter/section titles
+\def\@makechapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright \normalfont
+    \ifnum \c@secnumdepth >\m@ne
+        \large\bfseries \@chapapp\space \thechapter
+        \par\nobreak
+        \vskip 5\p@
+    \fi
+    \interlinepenalty\@M
+    \Large \bfseries #1\par\nobreak
+    \vskip 50\p@
+  }}
+\def\@makeschapterhead#1{%
+  \vspace*{50\p@}%
+  {\parindent \z@ \raggedright
+    \normalfont
+    \interlinepenalty\@M
+    \Large \bfseries  #1\par\nobreak
+    \vskip 50\p@
+  }}
+\renewcommand\section{\@startsection{section}{1}{\z@}{-3.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\large\bfseries}}
+\renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
+\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{-2.0ex \@plus -1ex \@minus -.2ex}{-1em}{\normalfont\normalsize\bfseries}}
+
+% index macros
+\newcommand{\italic}[1]{\emph{\hyperpage{#1}}}
+\newcommand{\definition}[1]{\textbf{\hyperpage{#1}}}
+\newcommand{\see}[1]{\emph{see} #1}
+
+% reduce bullet size and spacing for "itemize" macro
+\renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}}
+\renewenvironment{itemize}{\begin{list}{\labelitemi}{\topsep=5pt\itemsep=5pt\parsep=0pt}}{\end{list}}
+
+% Define some commands that produce formatted index entries suitable for cross-references.
+% ``\spec'' produces entries for specifications of entities.  ``\impl'' produces entries for their
+% implementations, and ``\use'' for their uses.
+
+%  \newcommand{\bold}[1]{{\bf #1}}
+%  \def\spec{\@bsphack\begingroup
+%             \def\protect##1{\string##1\space}\@sanitize
+%             \@wrxref{|bold}}
+\def\impl{\@bsphack\begingroup
+          \def\protect##1{\string##1\space}\@sanitize
+          \@wrxref{|definition}}
+\newcommand{\indexcode}[1]{{\lstinline$#1$}}
+\def\use{\@bsphack\begingroup
+         \def\protect##1{\string##1\space}\@sanitize
+         \@wrxref{|hyperpage}}
+\def\@wrxref#1#2{\let\thepage\relax
+    \xdef\@gtempa{\write\@indexfile{\string
+    \indexentry{#2@{\lstinline$#2$}#1}{\thepage}}}\endgroup\@gtempa
+    \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
+%\newcommand{\use}[1]{\index{#1@{\lstinline$#1$}}}
+%\newcommand{\impl}[1]{\index{\protect#1@{\lstinline$\protect#1$}|definition}}
+
+% inline text and lowercase index: \Index{inline and lowercase index text}
+% inline text and as-in index: \Index[as-is index text]{inline text}
+% inline text but index with different as-is text: \Index[index text]{inline text}
+\newcommand{\Index}{\@ifstar\@sIndex\@Index}
+\newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
+\newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
+
+\newcommand{\newtermFontInline}{\emph}
+\newcommand{\newterm}{\@ifstar\@snewterm\@newterm}
+\newcommand{\@newterm}[2][\@empty]{\lowercase{\def\temp{#2}}{\newtermFontInline{#2}}\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
+\newcommand{\@snewterm}[2][\@empty]{{\newtermFontInline{#2}}\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
+\makeatother
+
+\newenvironment{quote2}{%
+	\list{}{\lstset{resetmargins=true}\leftmargin=\parindent\rightmargin\leftmargin}%
+	\item\relax
+}{%
+	\endlist
+}% quote2
+\newenvironment{rationale}{%
+  \begin{quotation}\noindent$\Box$\enspace
+}{%
+  \hfill\enspace$\Box$\end{quotation}
+}%
+
+% blocks and titles
+\newcommand{\define}[1]{\emph{#1\/}\index{#1}}
+\newcommand{\rewrite}{\(\Rightarrow\)}
+\newcommand{\rewriterules}{\paragraph{Rewrite Rules}~\par\noindent}
+\newcommand{\examples}{\paragraph{Examples}~\par\noindent}
+\newcommand{\semantics}{\paragraph{Semantics}~\par\noindent}
+\newcommand{\constraints}{\paragraph{Constraints}~\par\noindent}
+\newcommand{\predefined}{\paragraph{Predefined Identifiers}~\par\noindent}
+
+% BNF macros
+\def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
+\let\endsyntax=\endtrivlist
+\newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}}
+\newcommand{\rhs}{\hfil\break\hbox{\hskip1in}}
+\newcommand{\oldlhs}[1]{\emph{#1: \ldots}\index{#1@{\emph{#1}}|italic}}
+\newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}}
+\newcommand{\opt}{$_{opt}$\ }
+
+% adjust varioref package with default "section" and "page" titles, and optional title with faraway page numbers
+% \VRef{label} => Section 2.7, \VPageref{label} => page 17
+% \VRef[Figure]{label} => Figure 3.4, \VPageref{label} => page 17
+\renewcommand{\reftextfaceafter}{\unskip}
+\renewcommand{\reftextfacebefore}{\unskip}
+\renewcommand{\reftextafter}{\unskip}
+\renewcommand{\reftextbefore}{\unskip}
+\renewcommand{\reftextfaraway}[1]{\unskip, p.~\pageref{#1}}
+\renewcommand{\reftextpagerange}[2]{\unskip, pp.~\pageref{#1}--\pageref{#2}}
+\newcommand{\VRef}[2][Section]{\ifx#1\@empty\else{#1}\nobreakspace\fi\vref{#2}}
+\newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}}
+
+% Go programming language
+\lstdefinelanguage{Golang}{
+	morekeywords=[1]{package,import,func,type,struct,return,defer,panic, recover,select,var,const,iota,},%
+	morekeywords=[2]{string,uint,uint8,uint16,uint32,uint64,int,int8,int16, int32,int64,
+		bool,float32,float64,complex64,complex128,byte,rune,uintptr, error,interface},%
+	morekeywords=[3]{map,slice,make,new,nil,len,cap,copy,close,true,false, delete,append,real,imag,complex,chan,},%
+	morekeywords=[4]{for,break,continue,range,goto,switch,case,fallthrough,if, else,default,},%
+	morekeywords=[5]{Println,Printf,Error,},%
+	sensitive=true,%
+	morecomment=[l]{//},%
+	morecomment=[s]{/*}{*/},%
+	morestring=[b]',%
+	morestring=[b]",%
+	morestring=[s]{`}{`},%
+}
+
+% CFA programming language, based on ANSI C
+\lstdefinelanguage{CFA}[ANSI]{C}{
+	morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
+		_Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
+		fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
+		_Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
+	moredelim=**[is][\color{red}]{`}{`}, % red highlighting of program text
+}%
+
+\lstset{
+language=CFA,
+columns=flexible,
+basicstyle=\sf\relsize{-1},
+tabsize=4,
+xleftmargin=\parindent,
+escapechar=@,
+mathescape=true,
+keepspaces=true,
+showstringspaces=false,
+showlines=true,
+aboveskip=6pt,
+belowskip=4pt,
+literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used for red highlighting
+}%
+
+\makeatletter
+% replace/adjust listings characters that look bad in sanserif
+\lst@CCPutMacro
+\lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
+\lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
+\lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
+\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
+\lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
+\lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
+\lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
+\lst@ProcessOther{"60}{\lst@ttfamily{`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}} % replace backquote
+\lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde
+%\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde
+\@empty\z@\@empty % NECESSARY DO NOT REMOVE
+\makeatother
+
+% Local Variables: %
+% tab-width: 4 %
+% fill-column: 100 %
+% End: %
Index: doc/LaTeXmacros/indexstyle
===================================================================
--- doc/LaTeXmacros/indexstyle	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ doc/LaTeXmacros/indexstyle	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,2 @@
+preamble ""
+postamble ""
Index: doc/bibliography/cfa.bib
===================================================================
--- doc/bibliography/cfa.bib	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ doc/bibliography/cfa.bib	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,1 @@
+/usr/local/bibliographies/pl.bib
Index: doc/refrat/Makefile
===================================================================
--- doc/refrat/Makefile	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ doc/refrat/Makefile	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -1,7 +1,7 @@
 ## Define the appropriate configuration variables.
 
-TeXLIB = .::
+TeXLIB = .:../bibliography/:../LaTeXmacros/:
 LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex
-BibTeX = BSTINPUTS=${TeXLIB} && export BSTINPUTS && bibtex
+BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
 
 ## Define the text source files.
@@ -43,5 +43,6 @@
 	dvips $< -o $@
 
-${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex ${basename ${DOCUMENT}}.bib
+${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \
+		../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib
 	# Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
 	if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi
@@ -53,5 +54,5 @@
 	-${BibTeX} ${basename $@}
 	# Make index from *.aux entries and input index at end of document
-	makeindex -s indexstyle ${basename $@}.idx
+	makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx
 	${LaTeX} ${basename $@}.tex
 	# Run again to get index title into table of contents
Index: c/refrat/indexstyle
===================================================================
--- doc/refrat/indexstyle	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,2 +1,0 @@
-preamble ""
-postamble ""
Index: doc/refrat/refrat.tex
===================================================================
--- doc/refrat/refrat.tex	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ doc/refrat/refrat.tex	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -1,2 +1,18 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% 
+%% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+%%
+%% The contents of this file are covered under the licence agreement in the
+%% file "LICENCE" distributed with Cforall.
+%% 
+%% refrat.tex -- 
+%% 
+%% Author           : Peter A. Buhr
+%% Created On       : Wed Apr  6 14:52:25 2016
+%% Last Modified By : Peter A. Buhr
+%% Last Modified On : Sat Apr  9 10:19:12 2016
+%% Update Count     : 8
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
 
@@ -5,5 +21,4 @@
 
 % Latex packages used in the document.
-
 \usepackage{fullpage,times}
 \usepackage{xspace}
@@ -11,130 +26,21 @@
 \usepackage{listings}
 \usepackage{comment}
-\usepackage{latexsym}					% \Box
-\usepackage{mathptmx}					% better math font with "times"
+\usepackage{latexsym}                                   % \Box
+\usepackage{mathptmx}                                   % better math font with "times"
 \usepackage[pagewise]{lineno}
 \renewcommand{\linenumberfont}{\scriptsize\sffamily}
 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
 \usepackage{breakurl}
-\urlstyle{sf}
+\renewcommand{\UrlFont}{\small\sf}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-% Names used in the document.
-
-\newcommand{\CFA}{Cforall\xspace}		% set language text name
-\newcommand{\CFAA}{C$\forall$\xspace}	% set language symbolic name
-\newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
-\def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
+% Bespoke macros used in the document.
+\input{common}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-% Bespoke macros used in the document.
-
-\makeatletter
-% index macros
-\newcommand{\italic}[1]{\emph{\hyperpage{#1}}}
-\newcommand{\definition}[1]{\textbf{\hyperpage{#1}}}
-\newcommand{\see}[1]{\emph{see} #1}
-
-% Define some commands that produce formatted index entries suitable for cross-references.
-% ``\spec'' produces entries for specifications of entities.  ``\impl'' produces entries for their
-% implementations, and ``\use'' for their uses.
-
-%  \newcommand{\bold}[1]{{\bf #1}}
-%  \def\spec{\@bsphack\begingroup
-%             \def\protect##1{\string##1\space}\@sanitize
-%             \@wrxref{|bold}}
-\def\impl{\@bsphack\begingroup
-          \def\protect##1{\string##1\space}\@sanitize
-          \@wrxref{|definition}}
-\newcommand{\indexcode}[1]{{\lstinline$#1$}}
-\def\use{\@bsphack\begingroup
-         \def\protect##1{\string##1\space}\@sanitize
-         \@wrxref{|hyperpage}}
-\def\@wrxref#1#2{\let\thepage\relax
-    \xdef\@gtempa{\write\@indexfile{\string
-    \indexentry{#2@{\lstinline$#2$}#1}{\thepage}}}\endgroup\@gtempa
-    \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
-%\newcommand{\use}[1]{\index{#1@{\lstinline$#1$}}}
-%\newcommand{\impl}[1]{\index{\protect#1@{\lstinline$\protect#1$}|definition}}
-
-% text inline and lowercase index: \Index{Inline and index text}
-% text inline and as-in index: \Index{Inline and Index text}
-% text inline but index with different as-is text: \Index[index text]{inline text}
-\newcommand{\Index}{\@ifstar\@sIndex\@Index}
-\newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
-\newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
-\makeatother
-
-% blocks and titles
-\newcommand{\define}[1]{\emph{#1\/}\index{#1}}
-\newenvironment{rationale}{%
-  \begin{quotation}\noindent$\Box$\enspace
-}{%
-  \hfill\enspace$\Box$\end{quotation}
-}%
-\newcommand{\rewrite}{\(\Rightarrow\)}
-\newcommand{\rewriterules}{\paragraph{Rewrite Rules}~\par\noindent}
-\newcommand{\examples}{\paragraph{Examples}~\par\noindent}
-\newcommand{\semantics}{\paragraph{Semantics}~\par\noindent}
-\newcommand{\constraints}{\paragraph{Constraints}~\par\noindent}
-\newcommand{\predefined}{\paragraph{Predefined Identifiers}~\par\noindent}
-
-% BNF macros
-\def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
-\let\endsyntax=\endtrivlist
-\newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}}
-\newcommand{\rhs}{\hfil\break\hbox{\hskip1in}}
-\newcommand{\oldlhs}[1]{\emph{#1: \ldots}\index{#1@{\emph{#1}}|italic}}
-\newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}}
-\newcommand{\opt}{$_{opt}$\ }
-
-% adjust varioref package with default "section" and "page" titles, and optional title with faraway page numbers
-% \VRef{label} => Section 2.7, \VPageref{label} => page 17
-% \VRef[Figure]{label} => Figure 3.4, \VPageref{label} => page 17
-\renewcommand{\reftextfaceafter}{\unskip}
-\renewcommand{\reftextfacebefore}{\unskip}
-\renewcommand{\reftextafter}{\unskip}
-\renewcommand{\reftextbefore}{\unskip}
-\renewcommand{\reftextfaraway}[1]{\unskip, p.~\pageref{#1}}
-\renewcommand{\reftextpagerange}[2]{\unskip, pp.~\pageref{#1}--\pageref{#2}}
-\newcommand{\VRef}[2][Section]{\ifx#1\@empty\else{#1}\nobreakspace\fi\vref{#2}}
-\newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}}
-
-% adjust listings macros
-\lstdefinelanguage{CFA}[ANSI]{C}%
-{morekeywords={asm,_Alignas,_Alignof,_At,_Atomic,_Bool,catch,catchResume,choose,_Complex,context,disable,dtype,enable,
-	fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,lvalue,_Noreturn,restrict,_Static_assert,
-	_Thread_local,throw,throwResume,try,type,},
-}%
-
-\lstset{
-language=CFA,
-columns=flexible,
-basicstyle=\sf\small,
-tabsize=4,
-xleftmargin=\parindent,
-escapechar=@,
-keepspaces=true,
-%showtabs=true,
-%tab=\rightarrowfill,
-}%
-
-\makeatletter
-% replace/adjust listings characters that look bad in sanserif
-\lst@CCPutMacro
-\lst@ProcessOther{"2D}{\lst@ttfamily{-{}}{{\ttfamily\upshape -}}} % replace minus
-\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
-\lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
-\lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
-\lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
-\lst@ProcessOther{"7E}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}} % replace tilde
-%\lst@ProcessOther{"7E}{\raisebox{-.4ex}[1ex][0pt]{\textasciitilde}} % lower tilde
-\@empty\z@\@empty
-\makeatother
-
-\setcounter{secnumdepth}{3}     % number subsubsections
-\setcounter{tocdepth}{3}		% subsubsections in table of contents
+\setcounter{secnumdepth}{3}                             % number subsubsections
+\setcounter{tocdepth}{3}                                % subsubsections in table of contents
 \makeindex
 
@@ -143,9 +49,16 @@
 \begin{document}
 \pagestyle{headings}
-\linenumbers					% comment out to turn off line numbering
-
-\title{\CFA (\CFAA) Reference Manual and Rationale}
-\author{Glen Ditchfield \and Peter A. Buhr}
-\date{DRAFT\\\today}
+\linenumbers                                            % comment out to turn off line numbering
+
+\title{\Huge
+\vspace*{1in}
+\CFA (\CFL) Reference Manual and Rationale
+}% title
+\author{\huge
+Glen Ditchfield and Peter A. Buhr
+}% author
+\date{
+DRAFT\\\today
+}% date
 
 \pagenumbering{roman}
@@ -159,6 +72,6 @@
 \copyright\,2015 Glen Ditchfield \\ \\
 \noindent
-This work is licensed under the Creative Commons Attribution 4.0 International License. To view a
-copy of this license, visit {\small\url{http://creativecommons.org/licenses/by/4.0}}.
+This work is licensed under the Creative Commons Attribution 4.0 International License.
+To view a copy of this license, visit {\small\url{http://creativecommons.org/licenses/by/4.0}}.
 \vspace*{1in}
 
@@ -173,17 +86,15 @@
 \chapter*{Introduction}\addcontentsline{toc}{chapter}{Introduction}
 
-This document is a reference manual and rationale for \CFA, a polymorphic extension of the C
-programming language. It makes frequent reference to the {\c11} standard \cite{ANS:C11}, and
-occasionally compares \CFA to {\CC} \cite{c++}.
-
-The manual deliberately imitates the ordering of the {\c11} standard (although the section numbering
-differs). Unfortunately, this means the manual contains more ``forward references'' than usual,
-making it harder to follow if the reader does not have a copy of the {\c11} standard. For a simple
-introduction to \CFA, see the companion document ``An Overview of \CFA''
+This document is a reference manual and rationale for \CFA, a polymorphic extension of the C programming language.
+It makes frequent reference to the {\c11} standard \cite{C11}, and occasionally compares \CFA to {\CC} \cite{C++}.
+
+The manual deliberately imitates the ordering of the {\c11} standard (although the section numbering differs).
+Unfortunately, this means the manual contains more ``forward references'' than usual, making it harder to follow if the reader does not have a copy of the {\c11} standard.
+For a simple introduction to \CFA, see the companion document ``An Overview of \CFA''
 \cite{Ditchfield96:Overview}.
 
 \begin{rationale}
-Commentary (like this) is quoted with quads. Commentary usually deals with subtle points, the
-rationale behind a rule, and design decisions.
+Commentary (like this) is quoted with quads.
+Commentary usually deals with subtle points, the rationale behind a rule, and design decisions.
 \end{rationale}
 
@@ -194,6 +105,5 @@
 \chapter{Terms, definitions, and symbols}
 
-Terms from the {\c11} standard used in this document have the same meaning as in the {\c11}
-standard.
+Terms from the {\c11} standard used in this document have the same meaning as in the {\c11} standard.
 
 % No ``Conformance'' or ``Environment'' chapters yet.
@@ -205,7 +115,5 @@
 
 \section{Notation}
-The syntax notation used in this document is the same as in the {\c11} standard, with one exception:
-ellipsis in the definition of a nonterminal, as in ``\emph{declaration:} \ldots'', indicates that
-these rules extend a previous definition, which occurs in this document or in the {\c11} standard.
+The syntax notation used in this document is the same as in the {\c11} standard, with one exception: ellipsis in the definition of a nonterminal, as in ``\emph{declaration:} \ldots'', indicates that these rules extend a previous definition, which occurs in this document or in the {\c11} standard.
 
 
@@ -215,15 +123,12 @@
 \subsection{Scopes of identifiers}\index{scopes}
 
-\CFA's scope rules differ from C's in one major respect: a declaration of an identifier may
-overload\index{overloading} outer declarations of lexically identical identifiers in the same
-\Index{name space}, instead of hiding them. The outer declaration is hidden if the two declarations
-have \Index{compatible type}, or if one declares an array type and the other declares a pointer type
-and the element type and pointed-at type are compatible, or if one has function type and the other
-is a pointer to a compatible function type, or if one declaration is a \lstinline$type$\use{type} or
+\CFA's scope rules differ from C's in one major respect: a declaration of an identifier may overload\index{overloading} outer declarations of lexically identical identifiers in the same
+\Index{name space}, instead of hiding them.
+The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a \lstinline$type$\use{type} or
 \lstinline$typedef$\use{typedef} declaration and the other is not.  The outer declaration becomes
 \Index{visible} when the scope of the inner declaration terminates.
 \begin{rationale}
-Hence, a \CFA program can declare an \lstinline$int v$ and a \lstinline$float v$ in the same
-scope; a {\CC} program can not.
+Hence, a \CFA program can declare an \lstinline$int v$ and a \lstinline$float v$ in the same scope;
+a {\CC} program can not.
 \end{rationale}
 
@@ -232,16 +137,12 @@
 \index{linkage}
 
-\CFA's linkage rules differ from C's in only one respect: instances of a particular identifier with
-external or internal linkage do not necessarily denote the same object or function. Instead, in the
-set of translation units and libraries that constitutes an entire program, any two instances of a
-particular identifier with \Index{external linkage} denote the same object or function if they have
-\Index{compatible type}s, or if one declares an array type and the other declares a pointer type and
-the element type and pointed-at type are compatible, or if one has function type and the other is a
-pointer to a compatible function type. Within one translation unit, each instance of an identifier
-with \Index{internal linkage} denotes the same object or function in the same circumstances.
+\CFA's linkage rules differ from C's in only one respect: instances of a particular identifier with external or internal linkage do not necessarily denote the same object or function.
+Instead, in the set of translation units and libraries that constitutes an entire program, any two instances of a particular identifier with \Index{external linkage} denote the same object or function if they have
+\Index{compatible type}s, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type.
+Within one translation unit, each instance of an identifier with \Index{internal linkage} denotes the same object or function in the same circumstances.
 Identifiers with \Index{no linkage} always denote unique entities.
 \begin{rationale}
-A \CFA program can declare an \lstinline$extern int v$ and an \lstinline$extern float v$; a C
-program cannot.
+A \CFA program can declare an \lstinline$extern int v$ and an \lstinline$extern float v$;
+a C program cannot.
 \end{rationale}
 
@@ -253,12 +154,10 @@
 \subsubsection{Semantics}
 
-\CFA provides a capability for generic types; using this capability a single "generic type
-generator" can be written that can represent multiple concrete type instantiations by substitution
-of the "type parameters" of the generic type for concrete types. Syntactically a generic type
-generator is represented by putting a forall specifier on a struct or union declaration, as defined
-in \VRef{forall}. An instantiation of the generic type is written by specifying the type parameters
-in parentheses after the name of the generic type generator:
-\begin{lstlisting}
-forall( type T | sumable( T ) ) struct pair {
+\CFA provides a capability for generic types;
+using this capability a single "generic type generator" can be written that can represent multiple concrete type instantiations by substitution of the "type parameters" of the generic type for concrete types.
+Syntactically a generic type generator is represented by putting a forall specifier on a struct or union declaration, as defined in \VRef{forall}.
+An instantiation of the generic type is written by specifying the type parameters in parentheses after the name of the generic type generator:
+\begin{lstlisting}
+forall( otype T | sumable( T ) ) struct pair {
 	T x;
 	T y;
@@ -267,13 +166,10 @@
 \end{lstlisting}
 
-The type parameters in an instantiation of a generic type must satisfy any constraints in the forall
-specifier on the type generator declaration, e.g., \lstinline$sumable$. The instantiation then has
-the semantics that would result if the type parameters were substituted into the type generator
-declaration by macro substitution.
-
-Polymorphic functions may have generic types as parameters, and those generic types may use type
-parameters of the polymorphic function as type parameters of the generic type:
-\begin{lstlisting}
-forall( type T ) void swap( pair(T) *p ) {
+The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., \lstinline$sumable$.
+The instantiation then has the semantics that would result if the type parameters were substituted into the type generator declaration by macro substitution.
+
+Polymorphic functions may have generic types as parameters, and those generic types may use type parameters of the polymorphic function as type parameters of the generic type:
+\begin{lstlisting}
+forall( otype T ) void swap( pair(T) *p ) {
 	T z = p->x;
 	p->x = p->y;
@@ -285,34 +181,31 @@
 \subsubsection{Constraints}
 
-To avoid unduly constraining implementors, the generic type generator definition must be visible at
-any point where it is instantiated.  Forward declarations of generic type generators are not
-forbidden, but the definition must be visible to instantiate the generic type.  Equivalently,
-instantiations of generic types are not allowed to be incomplete types.
+To avoid unduly constraining implementors, the generic type generator definition must be visible at any point where it is instantiated.
+Forward declarations of generic type generators are not forbidden, but the definition must be visible to instantiate the generic type.  Equivalently, instantiations of generic types are not allowed to be incomplete types.
 
 \examples
 \begin{lstlisting}
-forall( type T ) struct A;
-
-forall( type T ) struct B {
-	A(T) *a;  // legal, but cannot instantiate B(T)
+forall( otype T ) struct A;
+
+forall( otype T ) struct B {
+	A(T) *a;			// legal, but cannot instantiate B(T)
 };
 
-B(T) x; // illegal, *x.a is of an incomplete generic type
-
-forall( type T ) struct A {
+B(T) x;					// illegal, *x.a is of an incomplete generic type
+ 
+forall( otype T ) struct A {
 	B( T ) *b;
 };
 
-B( T ) y; // legal, *x.a is now of a complete generic type
-
+B( T ) y;				// legal, *x.a is now of a complete generic type
 
 // box.h:
-	forall( type T ) struct box;
-	forall( type T ) box( T ) *make_box( T );
-	forall( type T ) void use_box( box( T ) *b );
+	forall( otype T ) struct box;
+	forall( otype T ) box( T ) *make_box( T );
+	forall( otype T ) void use_box( box( T ) *b );
 	
 // main.c:
-	box( int ) *b = make_box( 42 ); // illegal, def'n of box not visible
-	use_box( b ); // illegal
+	box( int ) *b = make_box( 42 ); // illegal, definition of box not visible
+	use_box( b );		// illegal
 \end{lstlisting}
 
@@ -320,5 +213,6 @@
 \section{Conversions}
 \CFA defines situations where values of one type are automatically converted to another type.
-These conversions are called \define{implicit conversion}s. The programmer can request
+These conversions are called \define{implicit conversion}s.
+The programmer can request
 \define{explicit conversion}s using cast expressions.
 
@@ -330,12 +224,9 @@
 \subsubsection{Safe arithmetic conversions}
 
-In C, a pattern of conversions known as the \define{usual arithmetic conversion}s is used with most
-binary arithmetic operators to convert the operands to a common type and determine the type of the
-operator's result. In \CFA, these conversions play a role in overload resolution, and
-collectively are called the \define{safe arithmetic conversion}s.
-
-Let \(int_r\) and \(unsigned_r\) be the signed and unsigned integer types with integer conversion
-rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$. Let
-\(unsigned_{mr}\) be the unsigned integer type with maximal rank.
+In C, a pattern of conversions known as the \define{usual arithmetic conversion}s is used with most binary arithmetic operators to convert the operands to a common type and determine the type of the operator's result.
+In \CFA, these conversions play a role in overload resolution, and collectively are called the \define{safe arithmetic conversion}s.
+
+Let \(int_r\) and \(unsigned_r\) be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$.
+Let \(unsigned_{mr}\) be the unsigned integer type with maximal rank.
 
 The following conversions are \emph{direct} safe arithmetic conversions.
@@ -343,43 +234,26 @@
 \item
 The \Index{integer promotion}s.
-
-\item
-For every rank $r$ greater than or equal to the rank of \lstinline$int$, conversion from \(int_r\)
-to \(unsigned_r\).
-
-\item
-For every rank $r$ greater than or equal to the rank of \lstinline$int$, where \(int_{r+1}\) exists
-and can represent all values of \(unsigned_r\), conversion from \(unsigned_r\) to \(int_{r+1}\).
-
+\item
+For every rank $r$ greater than or equal to the rank of \lstinline$int$, conversion from \(int_r\) to \(unsigned_r\).
+\item
+For every rank $r$ greater than or equal to the rank of \lstinline$int$, where \(int_{r+1}\) exists and can represent all values of \(unsigned_r\), conversion from \(unsigned_r\) to \(int_{r+1}\).
 \item
 Conversion from \(unsigned_{mr}\) to \lstinline$float$.
-
 \item
 Conversion from an enumerated type to its compatible integer type.
-
-\item
-Conversion from \lstinline$float$ to \lstinline$double$, and from \lstinline$double$ to
-\lstinline$long double$.
-
-\item
-Conversion from \lstinline$float _Complex$ to \lstinline$double _Complex$,
-and from \lstinline$double _Complex$ to \lstinline$long double _Complex$.
-
+\item
+Conversion from \lstinline$float$ to \lstinline$double$, and from \lstinline$double$ to \lstinline$long double$.
+\item
+Conversion from \lstinline$float _Complex$ to \lstinline$double _Complex$, and from \lstinline$double _Complex$ to \lstinline$long double _Complex$.
 \begin{sloppypar}
 \item
-Conversion from \lstinline$float _Imaginary$ to \lstinline$double _Imaginary$, and from
-\lstinline$double _Imaginary$ to \lstinline$long double$ \lstinline$_Imaginary$, if the
-implementation supports imaginary types.
+Conversion from \lstinline$float _Imaginary$ to \lstinline$double _Imaginary$, and from \lstinline$double _Imaginary$ to \lstinline$long double$ \lstinline$_Imaginary$, if the implementation supports imaginary types.
 \end{sloppypar}
 \end{itemize}
 
-If type \lstinline$T$ can be converted to type \lstinline$U$ by a safe direct arithmetic conversion
-and type \lstinline$U$ can be converted to type \lstinline$V$ by a safe arithmetic conversion, then
-the conversion from \lstinline$T$ to type \lstinline$V$ is an \emph{indirect} safe arithmetic
-conversion.
-
-\begin{rationale}
-Note that {\c11} does not include conversion from \Index{real type}s to \Index{complex type}s in the
-usual arithmetic conversions, and \CFA does not include them as safe conversions.
+If type \lstinline$T$ can be converted to type \lstinline$U$ by a safe direct arithmetic conversion and type \lstinline$U$ can be converted to type \lstinline$V$ by a safe arithmetic conversion, then the conversion from \lstinline$T$ to type \lstinline$V$ is an \emph{indirect} safe arithmetic conversion.
+
+\begin{rationale}
+Note that {\c11} does not include conversion from \Index{real type}s to \Index{complex type}s in the usual arithmetic conversions, and \CFA does not include them as safe conversions.
 \end{rationale}
 
@@ -393,7 +267,6 @@
 
 If an expression's type is a pointer to a structure or union type that has a member that is an
-\Index{anonymous structure} or an \Index{anonymous union}, it can be implicitly
-converted\index{implicit conversion} to a pointer to the anonymous structure's or anonymous union's
-type. The result of the conversion is a pointer to the member.
+\Index{anonymous structure} or an \Index{anonymous union}, it can be implicitly converted\index{implicit conversion} to a pointer to the anonymous structure's or anonymous union's type.
+The result of the conversion is a pointer to the member.
 
 \examples
@@ -402,14 +275,13 @@
 	int x, y;
 };
-void move_by(struct point * p1, struct point * p2) {@\impl{move_by}@
+void move_by( struct point * p1, struct point * p2 ) {@\impl{move_by}@
 	p1->x += p2.x;
 	p1->y += p2.y;
 }
-
 struct color_point {
 	enum { RED, BLUE, GREEN } color;
 	struct point;
 } cp1, cp2;
-move_to(&cp1, &cp2);
+move_to( &cp1, &cp2 );
 \end{lstlisting}
 Thanks to implicit conversion, the two arguments that \lstinline$move_by()$ receives are pointers to
@@ -418,27 +290,22 @@
 
 \subsubsection{Specialization}
-A function or value whose type is polymorphic may be implicitly converted to one whose type is
-\Index{less polymorphic} by binding values to one or more of its \Index{inferred parameter}. Any
-value that is legal for the inferred parameter may be used, including other inferred parameters.
-
-If, after the inferred parameter binding, an \Index{assertion parameter} has no inferred parameters
-in its type, then an object or function must be visible at the point of the specialization that has
-the same identifier as the assertion parameter and has a type that is compatible\index{compatible
-  type} with or can be specialized to the type of the assertion parameter.  The assertion parameter
-is bound to that object or function.
-
-The type of the specialization is the type of the original with the bound inferred parameters and
-the bound assertion parameters replaced by their bound values.
+A function or value whose type is polymorphic may be implicitly converted to one whose type is \Index{less polymorphic} by binding values to one or more of its \Index{inferred parameter}.
+Any value that is legal for the inferred parameter may be used, including other inferred parameters.
+
+If, after the inferred parameter binding, an \Index{assertion parameter} has no inferred parameters in its type, then an object or function must be visible at the point of the specialization that has the same identifier as the assertion parameter and has a type that is compatible\index{compatible type} with or can be specialized to the type of the assertion parameter.
+The assertion parameter is bound to that object or function.
+
+The type of the specialization is the type of the original with the bound inferred parameters and the bound assertion parameters replaced by their bound values.
 
 \examples
 The type
 \begin{lstlisting}
-forall( type T, type U ) void (*)( T, U );
+forall( otype T, otype U ) void (*)( T, U );
 \end{lstlisting}
 can be specialized to (among other things)
 \begin{lstlisting}
-forall( type T ) void (*)( T, T );		// U bound to T 
-forall( type T ) void (*)( T, real );	// U bound to real 
-forall( type U ) void (*)( real, U );	// T bound to real 
+forall( otype T ) void (*)( T, T );		// U bound to T
+forall( otype T ) void (*)( T, real );	// U bound to real
+forall( otype U ) void (*)( real, U );	// T bound to real
 void f( real, real );					// both bound to real 
 \end{lstlisting}
@@ -446,9 +313,9 @@
 The type
 \begin{lstlisting}
-forall( type T | T ?+?( T, T )) T (*)( T );
+forall( otype T | T ?+?( T, T ) ) T (*)( T );
 \end{lstlisting}
 can be specialized to (among other things)
 \begin{lstlisting}
-int (*)( int );						// T bound to int, and T ?+?(T, T ) bound to int ?+?( int, int ) 
+int (*)( int );		// T bound to int, and T ?+?(T, T ) bound to int ?+?( int, int ) 
 \end{lstlisting}
 
@@ -465,20 +332,16 @@
 from a pointer to any non-\lstinline$void$ type to a pointer to \lstinline$void$;
 \item
-from a pointer to any type to a pointer to a more qualified version of the type\index{qualified
-type};
-\item
-from a pointer to a structure or union type to a pointer to the type of a member of the structure or
-union that is an \Index{anonymous structure} or an \Index{anonymous union};
-\item
-within the scope of an initialized \Index{type declaration}, conversions between a type and its
-implementation or between a pointer to a type and a pointer to its implementation.
+from a pointer to any type to a pointer to a more qualified version of the type\index{qualified type};
+\item
+from a pointer to a structure or union type to a pointer to the type of a member of the structure or union that is an \Index{anonymous structure} or an \Index{anonymous union};
+\item
+within the scope of an initialized \Index{type declaration}, conversions between a type and its implementation or between a pointer to a type and a pointer to its implementation.
 \end{itemize}
 
 Conversions that are not safe conversions are \define{unsafe conversion}s.
 \begin{rationale}
-As in C, there is an implicit conversion from \lstinline$void *$ to any pointer type. This is
-clearly dangerous, and {\CC} does not have this implicit conversion.
-\CFA\index{deficiencies!void * conversion} keeps it, in the interest of remaining as pure a
-superset of C as possible, but discourages it by making it unsafe.
+As in C, there is an implicit conversion from \lstinline$void *$ to any pointer type.
+This is clearly dangerous, and {\CC} does not have this implicit conversion.
+\CFA\index{deficiencies!void * conversion} keeps it, in the interest of remaining as pure a superset of C as possible, but discourages it by making it unsafe.
 \end{rationale}
 
@@ -486,7 +349,6 @@
 \subsection{Conversion cost}
 
-The \define{conversion cost} of a safe\index{safe conversion}
-conversion\footnote{Unsafe\index{unsafe conversion} conversions do not have defined conversion
-costs.} is a measure of how desirable or undesirable it is. It is defined as follows.
+The \define{conversion cost} of a safe\index{safe conversion} conversion\footnote{Unsafe\index{unsafe conversion} conversions do not have defined conversion costs.} is a measure of how desirable or undesirable it is.
+It is defined as follows.
 \begin{itemize}
 \item
@@ -497,6 +359,5 @@
 
 \item
-The cost of an indirect safe arithmetic conversion is the smallest number of direct conversions
-needed to make up the conversion.
+The cost of an indirect safe arithmetic conversion is the smallest number of direct conversions needed to make up the conversion.
 \end{itemize}
 
@@ -506,19 +367,15 @@
 \begin{itemize}
 \item
-The cost of an implicit conversion from \lstinline$int$ to \lstinline$long$ is 1. The cost of an
-implicit conversion from \lstinline$long$ to \lstinline$double$ is 3, because it is defined in terms
-of conversions from \lstinline$long$ to \lstinline$unsigned long$, then to \lstinline$float$, and
-then to \lstinline$double$.
-
-\item
-If \lstinline$int$ can represent all the values of \lstinline$unsigned short$, then the cost of an
-implicit conversion from \lstinline$unsigned short$ to \lstinline$unsigned$ is 2:
-\lstinline$unsigned short$ to \lstinline$int$ to \lstinline$unsigned$. Otherwise,
-\lstinline$unsigned short$ is converted directly to \lstinline$unsigned$, and the cost is 1.
-
-\item
-If \lstinline$long$ can represent all the values of \lstinline$unsigned$, then the conversion cost
-of \lstinline$unsigned$ to \lstinline$long$ is 1. Otherwise, the conversion is an unsafe
-conversion, and its conversion cost is undefined.
+The cost of an implicit conversion from \lstinline$int$ to \lstinline$long$ is 1.
+The cost of an implicit conversion from \lstinline$long$ to \lstinline$double$ is 3, because it is defined in terms of conversions from \lstinline$long$ to \lstinline$unsigned long$, then to \lstinline$float$, and then to \lstinline$double$.
+
+\item
+If \lstinline$int$ can represent all the values of \lstinline$unsigned short$, then the cost of an implicit conversion from \lstinline$unsigned short$ to \lstinline$unsigned$ is 2:
+\lstinline$unsigned short$ to \lstinline$int$ to \lstinline$unsigned$.
+Otherwise, \lstinline$unsigned short$ is converted directly to \lstinline$unsigned$, and the cost is 1.
+
+\item
+If \lstinline$long$ can represent all the values of \lstinline$unsigned$, then the conversion cost of \lstinline$unsigned$ to \lstinline$long$ is 1.
+Otherwise, the conversion is an unsafe conversion, and its conversion cost is undefined.
 \end{itemize}
 
@@ -529,5 +386,5 @@
 	\rhs \lstinline$forall$
 	\rhs \lstinline$lvalue$
-	\rhs \lstinline$context$
+	\rhs \lstinline$trait$
 	\rhs \lstinline$dtype$
 	\rhs \lstinline$ftype$
@@ -538,9 +395,7 @@
 \subsection{Identifiers}
 
-\CFA allows operator \Index{overloading} by associating operators with special function
-identifiers. Furthermore, the constants ``\lstinline$0$'' and ``\lstinline$1$'' have special status
-for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them
-as overloadable identifiers. Programmers can use these identifiers to declare functions and objects
-that implement operators and constants for their own types.
+\CFA allows operator \Index{overloading} by associating operators with special function identifiers.
+Furthermore, the constants ``\lstinline$0$'' and ``\lstinline$1$'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers.
+Programmers can use these identifiers to declare functions and objects that implement operators and constants for their own types.
 
 
@@ -554,27 +409,20 @@
 \end{syntax}
 
-\index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline$0$''\impl{0}
-and ``\lstinline$1$''\impl{1} are identifiers. No other tokens defined by the rules for integer
-constants are considered to be identifiers.
-\begin{rationale}
-Why ``\lstinline$0$'' and ``\lstinline$1$''? Those integers have special status in C. All scalar
-types can be incremented and decremented, which is defined in terms of adding or subtracting 1. The
-operations ``\lstinline$&&$'', ``\lstinline$||$'', and ``\lstinline$!$'' can be applied to any
-scalar arguments, and are defined in terms of comparison against 0. A \nonterm{constant-expression}
-that evaluates to 0 is effectively compatible with every pointer type.
-
-In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to
-any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to
-0 as a special case. However, user-defined arithmetic types often need the equivalent of a 1 or 0
-for their functions or operators, polymorphic functions often need 0 and 1 constants of a type
-matching their polymorphic parameters, and user-defined pointer-like types may need a null value.
-Defining special constants for a user-defined type is more efficient than defining a conversion to
-the type from \lstinline$_Bool$.
-
-Why \emph{just} ``\lstinline$0$'' and ``\lstinline$1$''? Why not other integers? No other integers
-have special status in C. A facility that let programmers declare specific
-constants---``\lstinline$const Rational 12$'', for instance---would not be much of an improvement.
-Some facility for defining the creation of values of programmer-defined types from arbitrary integer
-tokens would be needed. The complexity of such a feature doesn't seem worth the gain.
+\index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline$0$''\impl{0} and ``\lstinline$1$''\impl{1} are identifiers.
+No other tokens defined by the rules for integer constants are considered to be identifiers.
+\begin{rationale}
+Why ``\lstinline$0$'' and ``\lstinline$1$''? Those integers have special status in C.
+All scalar types can be incremented and decremented, which is defined in terms of adding or subtracting 1.
+The operations ``\lstinline$&&$'', ``\lstinline$||$'', and ``\lstinline$!$'' can be applied to any scalar arguments, and are defined in terms of comparison against 0.
+A \nonterm{constant-expression} that evaluates to 0 is effectively compatible with every pointer type.
+
+In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case.
+However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value.
+Defining special constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline$_Bool$.
+
+Why \emph{just} ``\lstinline$0$'' and ``\lstinline$1$''? Why not other integers? No other integers have special status in C.
+A facility that let programmers declare specific constants---``\lstinline$const Rational 12$'', for instance---would not be much of an improvement.
+Some facility for defining the creation of values of programmer-defined types from arbitrary integer tokens would be needed.
+The complexity of such a feature doesn't seem worth the gain.
 \end{rationale}
 
@@ -582,10 +430,7 @@
 \subsubsection{Operator identifiers}
 
-\index{operator identifiers}\index{identifiers!for operators} Table \ref{opids} lists the
-programmer-definable operator identifiers and the operations they are associated with. Functions
-that are declared with (or pointed at by function pointers that are declared with) these identifiers
-can be called by expressions that use the operator tokens and syntax, or the operator identifiers
-and ``function call'' syntax. The relationships between operators and function calls are discussed
-in descriptions of the operators.
+\index{operator identifiers}\index{identifiers!for operators} Table \ref{opids} lists the programmer-definable operator identifiers and the operations they are associated with.
+Functions that are declared with (or pointed at by function pointers that are declared with) these identifiers can be called by expressions that use the operator tokens and syntax, or the operator identifiers and ``function call'' syntax.
+The relationships between operators and function calls are discussed in descriptions of the operators.
 
 \begin{table}[hbt]
@@ -644,16 +489,13 @@
 
 \begin{rationale}
-Operator identifiers are made up of the characters of the operator token, with question marks added
-to mark the positions of the arguments of operators. The question marks serve as mnemonic devices;
-programmers can not create new operators by arbitrarily mixing question marks and other
-non-alphabetic characters. Note that prefix and postfix versions of the increment and decrement
-operators are distinguished by the position of the question mark.
-\end{rationale}
-
-\begin{rationale}
-The use of ``\lstinline$?$'' in identifiers means that some C programs are not \CFA programs.  For
-instance, the sequence of characters ``\lstinline$(i < 0)?--i:i$'' is legal in a C program, but a
-\CFA compiler detects a syntax error because it treats ``\lstinline$?--$'' as an identifier, not
-as the two tokens ``\lstinline$?$'' and ``\lstinline$--$''.
+Operator identifiers are made up of the characters of the operator token, with question marks added to mark the positions of the arguments of operators.
+The question marks serve as mnemonic devices;
+programmers can not create new operators by arbitrarily mixing question marks and other non-alphabetic characters.
+Note that prefix and postfix versions of the increment and decrement operators are distinguished by the position of the question mark.
+\end{rationale}
+
+\begin{rationale}
+The use of ``\lstinline$?$'' in identifiers means that some C programs are not \CFA programs.  For instance, the sequence of characters ``\lstinline$(i < 0)?--i:i$'' is legal in a C program, but a
+\CFA compiler detects a syntax error because it treats ``\lstinline$?--$'' as an identifier, not as the two tokens ``\lstinline$?$'' and ``\lstinline$--$''.
 \end{rationale}
 
@@ -663,40 +505,41 @@
 \item
 The logical operators ``\lstinline$&&$'' and ``\lstinline$||$'', and the conditional operator
-``\lstinline$?:$''. These operators do not always evaluate their operands, and hence can not be
-properly defined by functions unless some mechanism like call-by-name is added to the language.
-Note that the definitions of ``\lstinline$&&$'' and ``\lstinline$||$'' say that they work by
-checking that their arguments are unequal to 0, so defining ``\lstinline$!=$'' and ``\lstinline$0$''
-for user-defined types is enough to allow them to be used in logical expressions.
-
-\item
-The comma operator\index{comma expression}. It is a control-flow operator like those above.
+``\lstinline$?:$''.
+These operators do not always evaluate their operands, and hence can not be properly defined by functions unless some mechanism like call-by-name is added to the language.
+Note that the definitions of ``\lstinline$&&$'' and ``\lstinline$||$'' say that they work by checking that their arguments are unequal to 0, so defining ``\lstinline$!=$'' and ``\lstinline$0$'' for user-defined types is enough to allow them to be used in logical expressions.
+
+\item
+The comma operator\index{comma expression}.
+It is a control-flow operator like those above.
 Changing its meaning seems pointless and confusing.
 
 \item
-The ``address of'' operator. It would seem useful to define a unary ``\lstinline$&$'' operator that
-returns values of some programmer-defined pointer-like type. The problem lies with the type of the
-operator. Consider the expression ``\lstinline$p = &x$'', where \lstinline$x$ is of type
-\lstinline$T$ and \lstinline$p$ has the programmer-defined type \lstinline$T_ptr$. The expression
-might be treated as a call to the unary function ``\lstinline$&?$''. Now what is the type of the
-function's parameter? It can not be \lstinline$T$, because then \lstinline$x$ would be passed by
-value, and there is no way to create a useful pointer-like result from a value. Hence the parameter
-must have type \lstinline$T *$. But then the expression must be rewritten as ``\lstinline$p = &?( &x )$''
+The ``address of'' operator.
+It would seem useful to define a unary ``\lstinline$&$'' operator that returns values of some programmer-defined pointer-like type.
+The problem lies with the type of the operator.
+Consider the expression ``\lstinline$p = &x$'', where \lstinline$x$ is of type
+\lstinline$T$ and \lstinline$p$ has the programmer-defined type \lstinline$T_ptr$.
+The expression might be treated as a call to the unary function ``\lstinline$&?$''.
+Now what is the type of the function's parameter? It can not be \lstinline$T$, because then \lstinline$x$ would be passed by value, and there is no way to create a useful pointer-like result from a value.
+Hence the parameter must have type \lstinline$T *$.
+But then the expression must be rewritten as ``\lstinline$p = &?( &x )$''
 ---which doesn't seem like progress!
 
-The rule for address-of expressions would have to be something like ``keep applying address-of
-functions until you get one that takes a pointer argument, then use the built-in operator and
-stop''. It seems simpler to define a conversion function from \lstinline$T *$ to \lstinline$T_ptr$.
-
-\item
-The \lstinline$sizeof$ operator. It is already defined for every object type, and intimately tied
-into the language's storage allocation model. Redefining it seems pointless.
-
-\item
-The ``member of'' operators ``\lstinline$.$'' and ``\lstinline$->$''. These are not really infix
-operators, since their right ``operand'' is not a value or object.
-
-\item
-Cast operators\index{cast expression}. Anything that can be done with an explicit cast can be done
-with a function call. The difference in syntax is small.
+The rule for address-of expressions would have to be something like ``keep applying address-of functions until you get one that takes a pointer argument, then use the built-in operator and stop''.
+It seems simpler to define a conversion function from \lstinline$T *$ to \lstinline$T_ptr$.
+
+\item
+The \lstinline$sizeof$ operator.
+It is already defined for every object type, and intimately tied into the language's storage allocation model.
+Redefining it seems pointless.
+
+\item
+The ``member of'' operators ``\lstinline$.$'' and ``\lstinline$->$''.
+These are not really infix operators, since their right ``operand'' is not a value or object.
+
+\item
+Cast operators\index{cast expression}.
+Anything that can be done with an explicit cast can be done with a function call.
+The difference in syntax is small.
 \end{itemize}
 \end{rationale}
@@ -705,82 +548,69 @@
 \section{Expressions}
 
-\CFA allows operators and identifiers to be overloaded. Hence, each expression can have a number
-of \define{interpretation}s, each of which has a different type. The interpretations that are
-potentially executable are called \define{valid interpretation}s. The set of interpretations
-depends on the kind of expression and on the interpretations of the subexpressions that it contains.
-The rules for determining the valid interpretations of an expression are discussed below for each
-kind of expression. Eventually the context of the outermost expression chooses one interpretation
-of that expression.
-
-An \define{ambiguous interpretation} is an interpretation which does not specify the exact object or
-function denoted by every identifier in the expression. An expression can have some interpretations
-that are ambiguous and others that are unambiguous. An expression that is chosen to be executed
-shall not be ambiguous.
-
-The \define{best valid interpretations} are the valid interpretations that use the fewest
-unsafe\index{unsafe conversion} conversions. Of these, the best are those where the functions and
-objects involved are the least polymorphic\index{less polymorphic}. Of these, the best have the
-lowest total \Index{conversion cost}, including all implicit conversions in the argument
-expressions. Of these, the best have the highest total conversion cost for the implicit conversions
-(if any) applied to the argument expressions. If there is no single best valid interpretation, or if
-the best valid interpretation is ambiguous, then the resulting interpretation is
-ambiguous\index{ambiguous interpretation}.
-
-\begin{rationale}
-\CFA's rules for selecting the best interpretation are designed to allow overload resolution to
-mimic C's operator semantics. In C, the ``usual arithmetic conversions'' are applied to the
-operands of binary operators if necessary to convert the operands to types with a common real type.
-In \CFA, those conversions are ``safe''. The ``fewest unsafe conversions'' rule ensures that the
-usual conversions are done, if possible. The ``lowest total expression cost'' rule chooses the
-proper common type. The odd-looking ``highest argument conversion cost'' rule ensures that, when
-unary expressions must be converted, conversions of function results are preferred to conversion of
-function arguments: \lstinline$(double)-i$ will be preferred to \lstinline$-(double)i$.
-
-The ``least polymorphic'' rule reduces the number of polymorphic function calls, since such
-functions are presumably more expensive than monomorphic functions and since the more specific
-function is presumably more appropriate. It also gives preference to monomorphic values (such as the
+\CFA allows operators and identifiers to be overloaded.
+Hence, each expression can have a number of \define{interpretation}s, each of which has a different type.
+The interpretations that are potentially executable are called \define{valid interpretation}s.
+The set of interpretations depends on the kind of expression and on the interpretations of the subexpressions that it contains.
+The rules for determining the valid interpretations of an expression are discussed below for each kind of expression.
+Eventually the context of the outermost expression chooses one interpretation of that expression.
+
+An \define{ambiguous interpretation} is an interpretation which does not specify the exact object or function denoted by every identifier in the expression.
+An expression can have some interpretations that are ambiguous and others that are unambiguous.
+An expression that is chosen to be executed shall not be ambiguous.
+
+The \define{best valid interpretations} are the valid interpretations that use the fewest unsafe\index{unsafe conversion} conversions.
+Of these, the best are those where the functions and objects involved are the least polymorphic\index{less polymorphic}.
+Of these, the best have the lowest total \Index{conversion cost}, including all implicit conversions in the argument expressions.
+Of these, the best have the highest total conversion cost for the implicit conversions
+(if any) applied to the argument expressions.
+If there is no single best valid interpretation, or if the best valid interpretation is ambiguous, then the resulting interpretation is ambiguous\index{ambiguous interpretation}.
+
+\begin{rationale}
+\CFA's rules for selecting the best interpretation are designed to allow overload resolution to mimic C's operator semantics.
+In C, the ``usual arithmetic conversions'' are applied to the operands of binary operators if necessary to convert the operands to types with a common real type.
+In \CFA, those conversions are ``safe''.
+The ``fewest unsafe conversions'' rule ensures that the usual conversions are done, if possible.
+The ``lowest total expression cost'' rule chooses the proper common type.
+The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: \lstinline$(double)-i$ will be preferred to \lstinline$-(double)i$.
+
+The ``least polymorphic'' rule reduces the number of polymorphic function calls, since such functions are presumably more expensive than monomorphic functions and since the more specific function is presumably more appropriate.
+It also gives preference to monomorphic values (such as the
 \lstinline$int$ \lstinline$0$) over polymorphic values (such as the \Index{null pointer}
-\lstinline$0$\use{0}). However, interpretations that call polymorphic functions are preferred to
-interpretations that perform unsafe conversions, because those conversions potentially lose accuracy
-or violate strong typing.
+\lstinline$0$\use{0}).
+However, interpretations that call polymorphic functions are preferred to interpretations that perform unsafe conversions, because those conversions potentially lose accuracy or violate strong typing.
 
 There are two notable differences between \CFA's overload resolution rules and the rules for
-{\CC} defined in \cite{c++}. First, the result type of a function plays a role. In {\CC}, a
-function call must be completely resolved based on the arguments to the call in most circumstances.
-In \CFA, a function call may have several interpretations, each with a different result type, and
-the interpretations of the containing context choose among them. Second, safe conversions are used
-to choose among interpretations of all sorts of functions; in {\CC}, the ``usual arithmetic
-conversions'' are a separate set of rules that apply only to the built-in operators.
-\end{rationale}
-
-Expressions involving certain operators\index{operator identifiers} are considered to be equivalent
-to function calls. A transformation from ``operator'' syntax to ``function call'' syntax is defined
-by \define{rewrite rules}. Each operator has a set of predefined functions that overload its
-identifier. Overload resolution determines which member of the set is executed in a given
-expression. The functions have \Index{internal linkage} and are implicitly declared with \Index{file
-scope}. The predefined functions and rewrite rules are discussed below for each of these
-operators.
-\begin{rationale}
-Predefined functions and constants have internal linkage because that simplifies optimization in
-traditional compile-and-link environments. For instance, ``\lstinline$an_int + an_int$'' is
-equivalent to ``\lstinline$?+?(an_int, an_int)$''. If integer addition has not been redefined in
-the current scope, a compiler can generate code to perform the addition directly. If predefined
-functions had external linkage, this optimization would be difficult.
-\end{rationale}
-
-\begin{rationale}
-Since each subsection describes the interpretations of an expression in terms of the interpretations
-of its subexpressions, this chapter can be taken as describing an overload resolution algorithm that
-uses one bottom-up pass over an expression tree. Such an algorithm was first described (for Ada) by
-Baker~\cite{Bak:overload}. It is extended here to handle polymorphic functions and arithmetic
-conversions. The overload resolution rules and the predefined functions have been chosen so that, in
-programs that do not introduce overloaded declarations, expressions will have the same meaning in C
-and in \CFA.
-\end{rationale}
-
-\begin{rationale}
-Expression syntax is quoted from the {\c11} standard. The syntax itself defines the precedence and
-associativity of operators. The sections are arranged in decreasing order of precedence, with all
-operators in a section having the same precedence.
+{\CC} defined in \cite{C++}.
+First, the result type of a function plays a role.
+In {\CC}, a function call must be completely resolved based on the arguments to the call in most circumstances.
+In \CFA, a function call may have several interpretations, each with a different result type, and the interpretations of the containing context choose among them.
+Second, safe conversions are used to choose among interpretations of all sorts of functions;
+in {\CC}, the ``usual arithmetic conversions'' are a separate set of rules that apply only to the built-in operators.
+\end{rationale}
+
+Expressions involving certain operators\index{operator identifiers} are considered to be equivalent to function calls.
+A transformation from ``operator'' syntax to ``function call'' syntax is defined by \define{rewrite rules}.
+Each operator has a set of predefined functions that overload its identifier.
+Overload resolution determines which member of the set is executed in a given expression.
+The functions have \Index{internal linkage} and are implicitly declared with \Index{file scope}.
+The predefined functions and rewrite rules are discussed below for each of these operators.
+\begin{rationale}
+Predefined functions and constants have internal linkage because that simplifies optimization in traditional compile-and-link environments.
+For instance, ``\lstinline$an_int + an_int$'' is equivalent to ``\lstinline$?+?(an_int, an_int)$''.
+If integer addition has not been redefined in the current scope, a compiler can generate code to perform the addition directly.
+If predefined functions had external linkage, this optimization would be difficult.
+\end{rationale}
+
+\begin{rationale}
+Since each subsection describes the interpretations of an expression in terms of the interpretations of its subexpressions, this chapter can be taken as describing an overload resolution algorithm that uses one bottom-up pass over an expression tree.
+Such an algorithm was first described (for Ada) by Baker~\cite{Bak:overload}.
+It is extended here to handle polymorphic functions and arithmetic conversions.
+The overload resolution rules and the predefined functions have been chosen so that, in programs that do not introduce overloaded declarations, expressions will have the same meaning in C and in \CFA.
+\end{rationale}
+
+\begin{rationale}
+Expression syntax is quoted from the {\c11} standard.
+The syntax itself defines the precedence and associativity of operators.
+The sections are arranged in decreasing order of precedence, with all operators in a section having the same precedence.
 \end{rationale}
 
@@ -801,26 +631,20 @@
 const int 1;@\use{1}@
 const int 0;@\use{0}@
-forall( dtype DT ) DT *const 0;
-forall( ftype FT ) FT *const 0;
+forall( dtype DT ) DT * const 0;
+forall( ftype FT ) FT * const 0;
 \end{lstlisting}
 
 \semantics
-The \Index{valid interpretation} of an \nonterm{identifier} are given by the visible\index{visible}
-declarations of the identifier.
-
-A \nonterm{constant} or \nonterm{string-literal} has one valid interpretation, which has the type
-and value defined by {\c11}. The predefined integer identifiers ``\lstinline$1$'' and
-``\lstinline$0$'' have the integer values 1 and 0, respectively. The other two predefined
-``\lstinline$0$'' identifiers are bound to polymorphic pointer values that, when
-specialized\index{specialization} with a data type or function type respectively, produce a null
-pointer of that type.
+The \Index{valid interpretation} of an \nonterm{identifier} are given by the visible\index{visible} declarations of the identifier.
+
+A \nonterm{constant} or \nonterm{string-literal} has one valid interpretation, which has the type and value defined by {\c11}.
+The predefined integer identifiers ``\lstinline$1$'' and ``\lstinline$0$'' have the integer values 1 and 0, respectively.
+The other two predefined ``\lstinline$0$'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type.
 
 A parenthesised expression has the same interpretations as the contained \nonterm{expression}.
 
 \examples
-The expression \lstinline$(void *)0$\use{0} specializes the (polymorphic) null pointer to a null
-pointer to \lstinline$void$. \lstinline$(const void *)0$ does the same, and also uses a safe
-conversion from \lstinline$void *$ to \lstinline$const void *$. In each case, the null pointer
-conversion is better\index{best valid interpretations} than the unsafe conversion of the integer
+The expression \lstinline$(void *)0$\use{0} specializes the (polymorphic) null pointer to a null pointer to \lstinline$void$. \lstinline$(const void *)0$ does the same, and also uses a safe conversion from \lstinline$void *$ to \lstinline$const void *$.
+In each case, the null pointer conversion is better\index{best valid interpretations} than the unsafe conversion of the integer
 \lstinline$0$ to a pointer.
 
@@ -828,22 +652,19 @@
 Note that the predefined identifiers have addresses.
 
-\CFA does not have C's concept of ``null pointer constants'', which are not typed values but
-special strings of tokens. The C token ``\lstinline$0$'' is an expression of type \lstinline$int$
-with the value ``zero'', and it \emph{also} is a null pointer constant. Similarly,
-``\lstinline$(void *)0$ is an expression of type \lstinline$(void *)$ whose value is a null pointer,
-and it also is a null pointer constant. However, in C, ``\lstinline$(void *)(void *)0$'' is
-\emph{not} a null pointer constant, even though it is null-valued, a pointer, and constant! The
-semantics of C expressions contain many special cases to deal with subexpressions that are null
-pointer constants.
-
-\CFA handles these cases through overload resolution. The declaration
-\begin{lstlisting}
-forall( dtype DT ) DT *const 0;
-\end{lstlisting}
-means that \lstinline$0$ is a polymorphic object, and contains a value that can have \emph{any}
-pointer-to-object type or pointer-to-incomplete type. The only such value is the null pointer.
-Therefore the type \emph{alone} is enough to identify a null pointer. Where C defines an operator
-with a special case for the null pointer constant, \CFA defines predefined functions with a
-polymorphic object parameter.
+\CFA does not have C's concept of ``null pointer constants'', which are not typed values but special strings of tokens.
+The C token ``\lstinline$0$'' is an expression of type \lstinline$int$ with the value ``zero'', and it \emph{also} is a null pointer constant.
+Similarly,
+``\lstinline$(void *)0$ is an expression of type \lstinline$(void *)$ whose value is a null pointer, and it also is a null pointer constant.
+However, in C, ``\lstinline$(void *)(void *)0$'' is
+\emph{not} a null pointer constant, even though it is null-valued, a pointer, and constant! The semantics of C expressions contain many special cases to deal with subexpressions that are null pointer constants.
+
+\CFA handles these cases through overload resolution.
+The declaration
+\begin{lstlisting}
+forall( dtype DT ) DT * const 0;
+\end{lstlisting} means that \lstinline$0$ is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type.
+The only such value is the null pointer.
+Therefore the type \emph{alone} is enough to identify a null pointer.
+Where C defines an operator with a special case for the null pointer constant, \CFA defines predefined functions with a polymorphic object parameter.
 \end{rationale}
 
@@ -851,9 +672,6 @@
 \subsubsection{Generic selection}
 
-\constraints The best interpretation of the controlling expression shall be
-unambiguous\index{ambiguous interpretation}, and shall have type compatible with at most one of the
-types named in its generic association list. If a generic selection has no \lstinline$default$
-generic association, the best interpretation of its controlling expression shall have type
-compatible with exactly one of the types named in its generic association list.
+\constraints The best interpretation of the controlling expression shall be unambiguous\index{ambiguous interpretation}, and shall have type compatible with at most one of the types named in its generic association list.
+If a generic selection has no \lstinline$default$ generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list.
 
 \semantics
@@ -883,7 +701,7 @@
 \rewriterules
 \begin{lstlisting}
-a[b] @\rewrite@ ?[?]( b, a ) // if a has integer type */@\use{?[?]}@
+a[b] @\rewrite@ ?[?]( b, a ) // if a has integer type@\use{?[?]}@
 a[b] @\rewrite@ ?[?]( a, b ) // otherwise
-a( ${\em arguments }$ ) @\rewrite@ ?()( a, ${\em arguments} )$@\use{?()}@
+a( @\emph{arguments}@ ) @\rewrite@ ?()( a, @\emph{arguments}@ )@\use{?()}@
 a++ @\rewrite@ ?++(&( a ))@\use{?++}@
 a-- @\rewrite@ ?--(&( a ))@\use{?--}@
@@ -895,39 +713,35 @@
 \predefined
 \begin{lstlisting}
-forall( type T ) lvalue T ?[?]( T *, ptrdiff_t );@\use{ptrdiff_t}@
-forall( type T ) lvalue _Atomic T ?[?]( _Atomic T *, ptrdiff_t );
-forall( type T ) lvalue const T ?[?]( const T *, ptrdiff_t );
-forall( type T ) lvalue restrict T ?[?]( restrict T *, ptrdiff_t );
-forall( type T ) lvalue volatile T ?[?]( volatile T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic const T ?[?]( _Atomic const T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic restrict T ?[?]( _Atomic restrict T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic volatile T ?[?]( _Atomic volatile T *, ptrdiff_t );
-forall( type T ) lvalue const restrict T ?[?]( const restrict T *, ptrdiff_t );
-forall( type T ) lvalue const volatile T ?[?]( const volatile T *, ptrdiff_t );
-forall( type T ) lvalue restrict volatile T ?[?]( restrict volatile T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic const restrict T ?[?]( _Atomic const restrict T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic const volatile T ?[?]( _Atomic const volatile T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic restrict volatile T ?[?]( _Atomic restrict volatile T *, ptrdiff_t );
-forall( type T ) lvalue const restrict volatile T ?[?]( const restrict volatile T *, ptrdiff_t );
-forall( type T ) lvalue _Atomic const restrict volatile T ?[?]( _Atomic const restrict volatile T *, ptrdiff_t );
+forall( otype T ) lvalue T ?[?]( T *, ptrdiff_t );@\use{ptrdiff_t}@
+forall( otype T ) lvalue _Atomic T ?[?]( _Atomic T *, ptrdiff_t );
+forall( otype T ) lvalue const T ?[?]( const T *, ptrdiff_t );
+forall( otype T ) lvalue restrict T ?[?]( restrict T *, ptrdiff_t );
+forall( otype T ) lvalue volatile T ?[?]( volatile T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic const T ?[?]( _Atomic const T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic restrict T ?[?]( _Atomic restrict T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic volatile T ?[?]( _Atomic volatile T *, ptrdiff_t );
+forall( otype T ) lvalue const restrict T ?[?]( const restrict T *, ptrdiff_t );
+forall( otype T ) lvalue const volatile T ?[?]( const volatile T *, ptrdiff_t );
+forall( otype T ) lvalue restrict volatile T ?[?]( restrict volatile T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic const restrict T ?[?]( _Atomic const restrict T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic const volatile T ?[?]( _Atomic const volatile T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic restrict volatile T ?[?]( _Atomic restrict volatile T *, ptrdiff_t );
+forall( otype T ) lvalue const restrict volatile T ?[?]( const restrict volatile T *, ptrdiff_t );
+forall( otype T ) lvalue _Atomic const restrict volatile T ?[?]( _Atomic const restrict volatile T *, ptrdiff_t );
 \end{lstlisting}
 \semantics
-The interpretations of subscript expressions are the interpretations of the corresponding function
-call expressions.
+The interpretations of subscript expressions are the interpretations of the corresponding function call expressions.
 \begin{rationale}
 C defines subscripting as pointer arithmetic in a way that makes \lstinline$a[i]$ and
-\lstinline$i[a]$ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the
-number of overloadings of \lstinline$?[?]$.
-
-Subscript expressions are rewritten as function calls that pass the first parameter by value. This
-is somewhat unfortunate, since array-like types tend to be large. The alternative is to use the
-rewrite rule ``\lstinline$a[b]$ \rewrite \lstinline$?[?](&(a), b)$''. However, C semantics forbid
-this approach: the \lstinline$a$ in ``\lstinline$a[b]$'' can be an arbitrary pointer value, which
-does not have an address.
+\lstinline$i[a]$ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of \lstinline$?[?]$.
+
+Subscript expressions are rewritten as function calls that pass the first parameter by value.
+This is somewhat unfortunate, since array-like types tend to be large.
+The alternative is to use the rewrite rule ``\lstinline$a[b]$ \rewrite \lstinline$?[?](&(a), b)$''.
+However, C semantics forbid this approach: the \lstinline$a$ in ``\lstinline$a[b]$'' can be an arbitrary pointer value, which does not have an address.
 
 The repetitive form of the predefined identifiers shows up a deficiency\index{deficiencies!pointers
- to qualified types} of \CFA's type system. Type qualifiers are not included in type values, so
-polymorphic functions that take pointers to arbitrary types often come in one flavor for each
-possible qualification of the pointed-at type.
+ to qualified types} of \CFA's type system.
+Type qualifiers are not included in type values, so polymorphic functions that take pointers to arbitrary types often come in one flavor for each possible qualification of the pointed-at type.
 \end{rationale}
 
@@ -936,24 +750,16 @@
 
 \semantics
-A \define{function designator} is an interpretation of an expression that has function type. The
-\nonterm{postfix-expression} in a function call may have some interpretations that are function
-designators and some that are not.
-
-For those interpretations of the \nonterm{postfix-expression} that are not function designators, the
-expression is rewritten and becomes a call of a function named ``\lstinline$?()$''. The valid
-interpretations of the rewritten expression are determined in the manner described below.
-
-Each combination of function designators and argument interpretations is considered. For those
-interpretations of the \nonterm{postfix-expression} that are \Index{monomorphic function}
-designators, the combination has a \Index{valid interpretation} if the function designator accepts
-the number of arguments given, and each argument interpretation matches the corresponding explicit
-parameter:
+A \define{function designator} is an interpretation of an expression that has function type.
+The
+\nonterm{postfix-expression} in a function call may have some interpretations that are function designators and some that are not.
+
+For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named ``\lstinline$?()$''.
+The valid interpretations of the rewritten expression are determined in the manner described below.
+
+Each combination of function designators and argument interpretations is considered.
+For those interpretations of the \nonterm{postfix-expression} that are \Index{monomorphic function} designators, the combination has a \Index{valid interpretation} if the function designator accepts the number of arguments given, and each argument interpretation matches the corresponding explicit parameter:
 \begin{itemize}
-\item
-if the argument corresponds to a parameter in the function designator's prototype, the argument
-interpretation must have the same type as the corresponding parameter, or be implicitly convertible
-to the parameter's type
-\item
-if the function designator's type does not include a prototype or if the argument corresponds to
+\item if the argument corresponds to a parameter in the function designator's prototype, the argument interpretation must have the same type as the corresponding parameter, or be implicitly convertible to the parameter's type
+\item if the function designator's type does not include a prototype or if the argument corresponds to
 ``\lstinline$...$'' in a prototype, a \Index{default argument promotion} is applied to it.
 \end{itemize}
@@ -961,49 +767,29 @@
 
 For those combinations where the interpretation of the \nonterm{postfix-expression} is a
-\Index{polymorphic function} designator and the function designator accepts the number of arguments
-given, there shall be at least one set of \define{implicit argument}s for the implicit parameters
-such that
+\Index{polymorphic function} designator and the function designator accepts the number of arguments given, there shall be at least one set of \define{implicit argument}s for the implicit parameters such that
 \begin{itemize}
 \item
-If the declaration of the implicit parameter uses \Index{type-class} \lstinline$type$\use{type}, the
-implicit argument must be an object type; if it uses \lstinline$dtype$, the implicit argument must
-be an object type or an incomplete type; and if it uses \lstinline$ftype$, the implicit argument
-must be a function type.
-
-\item
-if an explicit parameter's type uses any implicit parameters, then the corresponding explicit
-argument must have a type that is (or can be safely converted\index{safe conversion} to) the type
-produced by substituting the implicit arguments for the implicit parameters in the explicit
-parameter type.
-
-\item
-the remaining explicit arguments must match the remaining explicit parameters, as described for
-monomorphic function designators.
-
-\item
-for each \Index{assertion parameter} in the function designator's type, there must be an object or
-function with the same identifier that is visible at the call site and whose type is compatible with
-or can be specialized to the type of the assertion declaration.
+If the declaration of the implicit parameter uses \Index{type-class} \lstinline$type$\use{type}, the implicit argument must be an object type;
+if it uses \lstinline$dtype$, the implicit argument must be an object type or an incomplete type;
+and if it uses \lstinline$ftype$, the implicit argument must be a function type.
+
+\item if an explicit parameter's type uses any implicit parameters, then the corresponding explicit argument must have a type that is (or can be safely converted\index{safe conversion} to) the type produced by substituting the implicit arguments for the implicit parameters in the explicit parameter type.
+
+\item the remaining explicit arguments must match the remaining explicit parameters, as described for monomorphic function designators.
+
+\item for each \Index{assertion parameter} in the function designator's type, there must be an object or function with the same identifier that is visible at the call site and whose type is compatible with or can be specialized to the type of the assertion declaration.
 \end{itemize}
-There is a valid interpretation for each such set of implicit parameters. The type of each valid
-interpretation is the return type of the function designator with implicit parameter values
-substituted for the implicit arguments.
-
-A valid interpretation is ambiguous\index{ambiguous interpretation} if the function designator or
-any of the argument interpretations is ambiguous.
-
-Every valid interpretation whose return type is not compatible with any other valid interpretation's
-return type is an interpretation of the function call expression.
-
-Every set of valid interpretations that have mutually compatible\index{compatible type} result types
-also produces an interpretation of the function call expression. The type of the interpretation is
-the \Index{composite type} of the types of the valid interpretations, and the value of the
-interpretation is that of the \Index{best valid interpretation}.
-\begin{rationale}
-One desirable property of a polymorphic programming language is \define{generalizability}: the
-ability to replace an abstraction with a more general but equivalent abstraction without requiring
-changes in any of the uses of the original\cite{Cormack90}. For instance, it should be possible to
-replace a function ``\lstinline$int f( int );$'' with ``\lstinline$forall( type T ) T f( T );$''
-without affecting any calls of \lstinline$f$.
+There is a valid interpretation for each such set of implicit parameters.
+The type of each valid interpretation is the return type of the function designator with implicit parameter values substituted for the implicit arguments.
+
+A valid interpretation is ambiguous\index{ambiguous interpretation} if the function designator or any of the argument interpretations is ambiguous.
+
+Every valid interpretation whose return type is not compatible with any other valid interpretation's return type is an interpretation of the function call expression.
+
+Every set of valid interpretations that have mutually compatible\index{compatible type} result types also produces an interpretation of the function call expression.
+The type of the interpretation is the \Index{composite type} of the types of the valid interpretations, and the value of the interpretation is that of the \Index{best valid interpretation}.
+\begin{rationale}
+One desirable property of a polymorphic programming language is \define{generalizability}: the ability to replace an abstraction with a more general but equivalent abstraction without requiring changes in any of the uses of the original\cite{Cormack90}.
+For instance, it should be possible to replace a function ``\lstinline$int f( int );$'' with ``\lstinline$forall( otype T ) T f( T );$'' without affecting any calls of \lstinline$f$.
 
 \CFA\index{deficiencies!generalizability} does not fully possess this property, because
@@ -1015,17 +801,16 @@
 float f;
 double d;
-f = g( f, f );	// (1) 
-f = g( i, f );	// (2) (safe conversion to float) 
-f = g( d, f );	// (3) (unsafe conversion to float) 
-\end{lstlisting}
-If \lstinline$g$ was replaced by ``\lstinline$forall( type T ) T g( T, T );$'', the first and second
-calls would be unaffected, but the third would change: \lstinline$f$ would be converted to
+f = g( f, f );		// (1)
+f = g( i, f );		// (2) (safe conversion to float)
+f = g( d, f );		// (3) (unsafe conversion to float) 
+\end{lstlisting}
+If \lstinline$g$ was replaced by ``\lstinline$forall( otype T ) T g( T, T );$'', the first and second calls would be unaffected, but the third would change: \lstinline$f$ would be converted to
 \lstinline$double$, and the result would be a \lstinline$double$.
 
-Another example is the function ``\lstinline$void h( int *);$''. This function can be passed a
-\lstinline$void *$ argument, but the generalization ``\lstinline$forall( type T ) void h( T *);$''
-can not. In this case, \lstinline$void$ is not a valid value for \lstinline$T$ because it is not an
-object type. If unsafe conversions were allowed, \lstinline$T$ could be inferred to be \emph{any}
-object type, which is undesirable.
+Another example is the function ``\lstinline$void h( int *);$''.
+This function can be passed a
+\lstinline$void *$ argument, but the generalization ``\lstinline$forall( otype T ) void h( T *);$'' can not.
+In this case, \lstinline$void$ is not a valid value for \lstinline$T$ because it is not an object type.
+If unsafe conversions were allowed, \lstinline$T$ could be inferred to be \emph{any} object type, which is undesirable.
 \end{rationale}
 
@@ -1033,5 +818,5 @@
 A function called ``\lstinline$?()$'' might be part of a numerical differentiation package.
 \begin{lstlisting}
-extern type Derivative;
+extern otype Derivative;
 extern double ?()( Derivative, double );
 extern Derivative derivative_of( double (*f)( double ) );
@@ -1045,17 +830,14 @@
 For that interpretation, the function call is treated as ``\lstinline$?()( sin_dx, 12.9 )$''.
 \begin{lstlisting}
-int f( long );		// (1) 
-int f( int, int );	// (2) 
+int f( long );		// (1)
+int f( int, int );	// (2)
 int f( int *);		// (3) 
-
 int i = f( 5 );		// calls (1) 
 \end{lstlisting}
-Function (1) provides a valid interpretation of ``\lstinline$f( 5 )$'', using an implicit
-\lstinline$int$ to \lstinline$long$ conversion. The other functions do not, since the second
-requires two arguments, and since there is no implicit conversion from \lstinline$int$ to
-\lstinline$int *$ that could be used with the third function.
-
-\begin{lstlisting}
-forall( type T ) T h( T );
+Function (1) provides a valid interpretation of ``\lstinline$f( 5 )$'', using an implicit \lstinline$int$ to \lstinline$long$ conversion.
+The other functions do not, since the second requires two arguments, and since there is no implicit conversion from \lstinline$int$ to \lstinline$int *$ that could be used with the third function.
+
+\begin{lstlisting}
+forall( otype T ) T h( T );
 double d = h( 1.5 );
 \end{lstlisting}
@@ -1064,67 +846,57 @@
 
 \begin{lstlisting}
-forall( type T, type U ) void g( T, U );	// (4) 
-forall( type T ) void g( T, T );			// (5) 
-forall( type T ) void g( T, long );			// (6) 
-void g( long, long );						// (7) 
+forall( otype T, otype U ) void g( T, U );	// (4)
+forall( otype T ) void g( T, T );			// (5)
+forall( otype T ) void g( T, long );			// (6)
+void g( long, long );						// (7)
 double d;
 int i;
 int *p;
-
-g( d, d );			// calls (5) 
-g( d, i );			// calls (6) 
-g( i, i );			// calls (7) 
+g( d, d );			// calls (5)
+g( d, i );			// calls (6)
+g( i, i );			// calls (7)
 g( i, p );			// calls (4) 
 \end{lstlisting}
-The first call has valid interpretations for all four versions of \lstinline$g$. (6) and (7) are
-discarded because they involve unsafe \lstinline$double$-to-\lstinline$long$ conversions. (5) is
-chosen because it is less polymorphic than (4).
-
-For the second call, (7) is again discarded. Of the remaining interpretations for (4), (5), and (6)
-(with \lstinline$i$ converted to \lstinline$long$), (6) is chosen because it is the least
-polymorphic.
-
-The third call has valid interpretations for all of the functions; (7) is chosen since it is not
-polymorphic at all.
-
-The fourth call has no interpretation for (5), because its arguments must have compatible type. (4)
-is chosen because it does not involve unsafe conversions.
-\begin{lstlisting}
-forall( type T ) T min( T, T );
+The first call has valid interpretations for all four versions of \lstinline$g$. (6) and (7) are discarded because they involve unsafe \lstinline$double$-to-\lstinline$long$ conversions. (5) is chosen because it is less polymorphic than (4).
+
+For the second call, (7) is again discarded.
+Of the remaining interpretations for (4), (5), and (6) (with \lstinline$i$ converted to \lstinline$long$), (6) is chosen because it is the least polymorphic.
+
+The third call has valid interpretations for all of the functions;
+(7) is chosen since it is not polymorphic at all.
+
+The fourth call has no interpretation for (5), because its arguments must have compatible type. (4) is chosen because it does not involve unsafe conversions.
+\begin{lstlisting}
+forall( otype T ) T min( T, T );
 double max( double, double );
-context min_max( T ) {@\impl{min_max}@
+trait min_max( T ) {@\impl{min_max}@
 	T min( T, T );
 	T max( T, T );
 }
-forall( type U | min_max( U ) ) void shuffle( U, U );
-shuffle(9, 10);
-\end{lstlisting}
-The only possibility for \lstinline$U$ is \lstinline$double$, because that is the type used in the
-only visible \lstinline$max$ function. 9 and 10 must be converted to \lstinline$double$, and
+forall( otype U | min_max( U ) ) void shuffle( U, U );
+shuffle( 9, 10 );
+\end{lstlisting}
+The only possibility for \lstinline$U$ is \lstinline$double$, because that is the type used in the only visible \lstinline$max$ function. 9 and 10 must be converted to \lstinline$double$, and
 \lstinline$min$ must be specialized with \lstinline$T$ bound to \lstinline$double$.
 \begin{lstlisting}
-extern void q( int );		// (8) 
-extern void q( void * );	// (9) 
+extern void q( int );		// (8)
+extern void q( void * );	// (9)
 extern void r();
 q( 0 );
 r( 0 );
 \end{lstlisting}
-The \lstinline$int 0$ could be passed to (8), or the \lstinline$(void *)$ \Index{specialization} of
-the null pointer\index{null pointer} \lstinline$0$\use{0} could be passed to (9). The former is
-chosen because the \lstinline$int$ \lstinline$0$ is \Index{less polymorphic}. For
-the same reason, \lstinline$int$ \lstinline$0$ is passed to \lstinline$r()$, even though it has
-\emph{no} declared parameter types.
+The \lstinline$int 0$ could be passed to (8), or the \lstinline$(void *)$ \Index{specialization} of the null pointer\index{null pointer} \lstinline$0$\use{0} could be passed to (9).
+The former is chosen because the \lstinline$int$ \lstinline$0$ is \Index{less polymorphic}.
+For the same reason, \lstinline$int$ \lstinline$0$ is passed to \lstinline$r()$, even though it has \emph{no} declared parameter types.
 
 
 \subsubsection{Structure and union members}
 
-\semantics In the member selection expression ``\lstinline$s$.\lstinline$m$'', there shall be at
-least one interpretation of \lstinline$s$ whose type is a structure type or union type containing a
-member named \lstinline$m$. If two or more interpretations of \lstinline$s$ have members named
-\lstinline$m$ with mutually compatible types, then the expression has an \Index{ambiguous
-interpretation} whose type is the composite type of the types of the members. If an interpretation
-of \lstinline$s$ has a member \lstinline$m$ whose type is not compatible with any other
-\lstinline$s$'s \lstinline$m$, then the expression has an interpretation with the member's type. The
-expression has no other interpretations.
+\semantics In the member selection expression ``\lstinline$s$.\lstinline$m$'', there shall be at least one interpretation of \lstinline$s$ whose type is a structure type or union type containing a member named \lstinline$m$.
+If two or more interpretations of \lstinline$s$ have members named
+\lstinline$m$ with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members.
+If an interpretation of \lstinline$s$ has a member \lstinline$m$ whose type is not compatible with any other
+\lstinline$s$'s \lstinline$m$, then the expression has an interpretation with the member's type.
+The expression has no other interpretations.
 
 The expression ``\lstinline$p->m$'' has the same interpretations as the expression
@@ -1136,160 +908,90 @@
 \predefined
 \begin{lstlisting}
-_Bool ?++( volatile _Bool * ),
-	?++( _Atomic volatile _Bool * );
-char ?++( volatile char * ),
-	?++( _Atomic volatile char * );
-signed char ?++( volatile signed char * ),
-	?++( _Atomic volatile signed char * );
-unsigned char ?++( volatile signed char * ),
-	?++( _Atomic volatile signed char * );
-short int ?++( volatile short int * ),
-	?++( _Atomic volatile short int * );
-unsigned short int ?++( volatile unsigned short int * ),
-	?++( _Atomic volatile unsigned short int * );
-int ?++( volatile int * ),
-	?++( _Atomic volatile int * );
-unsigned int ?++( volatile unsigned int * ),
-	?++( _Atomic volatile unsigned int * );
-long int ?++( volatile long int * ),
-	?++( _Atomic volatile long int * );
-long unsigned int ?++( volatile long unsigned int * ),
-	?++( _Atomic volatile long unsigned int * );
-long long int ?++( volatile long long int * ),
-	?++( _Atomic volatile long long int * );
-long long unsigned ?++( volatile long long unsigned int * ),
-	?++( _Atomic volatile long long unsigned int * );
-float ?++( volatile float * ),
-	?++( _Atomic volatile float * );
-double ?++( volatile double * ),
-	?++( _Atomic volatile double * );
-long double ?++( volatile long double * ),
-	?++( _Atomic volatile long double * );
-
-forall( type T ) T * ?++( T * restrict volatile * ),
-	* ?++( T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic T * ?++( _Atomic T * restrict volatile * ),
-	* ?++( _Atomic T * _Atomic restrict volatile * );
-
-forall( type T ) const T * ?++( const T * restrict volatile * ),
-	* ?++( const T * _Atomic restrict volatile * );
-
-forall( type T ) volatile T * ?++( volatile T * restrict volatile * ),
-	* ?++( volatile T * _Atomic restrict volatile * );
-
-forall( type T ) restrict T * ?++( restrict T * restrict volatile * ),
-	* ?++( restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const T * ?++( _Atomic const T * restrict volatile * ),
+_Bool ?++( volatile _Bool * ), ?++( _Atomic volatile _Bool * );
+char ?++( volatile char * ), ?++( _Atomic volatile char * );
+signed char ?++( volatile signed char * ), ?++( _Atomic volatile signed char * );
+unsigned char ?++( volatile signed char * ), ?++( _Atomic volatile signed char * );
+short int ?++( volatile short int * ), ?++( _Atomic volatile short int * );
+unsigned short int ?++( volatile unsigned short int * ), ?++( _Atomic volatile unsigned short int * );
+int ?++( volatile int * ), ?++( _Atomic volatile int * );
+unsigned int ?++( volatile unsigned int * ), ?++( _Atomic volatile unsigned int * );
+long int ?++( volatile long int * ), ?++( _Atomic volatile long int * );
+long unsigned int ?++( volatile long unsigned int * ), ?++( _Atomic volatile long unsigned int * );
+long long int ?++( volatile long long int * ), ?++( _Atomic volatile long long int * );
+long long unsigned ?++( volatile long long unsigned int * ), ?++( _Atomic volatile long long unsigned int * );
+float ?++( volatile float * ), ?++( _Atomic volatile float * );
+double ?++( volatile double * ), ?++( _Atomic volatile double * );
+long double ?++( volatile long double * ), ?++( _Atomic volatile long double * );
+
+forall( otype T ) T * ?++( T * restrict volatile * ), * ?++( T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic T * ?++( _Atomic T * restrict volatile * ), * ?++( _Atomic T * _Atomic restrict volatile * );
+forall( otype T ) const T * ?++( const T * restrict volatile * ), * ?++( const T * _Atomic restrict volatile * );
+forall( otype T ) volatile T * ?++( volatile T * restrict volatile * ), * ?++( volatile T * _Atomic restrict volatile * );
+forall( otype T ) restrict T * ?++( restrict T * restrict volatile * ), * ?++( restrict T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic const T * ?++( _Atomic const T * restrict volatile * ),
 	* ?++( _Atomic const T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict T * ?++( _Atomic restrict T * restrict volatile * ),
+forall( otype T ) _Atomic restrict T * ?++( _Atomic restrict T * restrict volatile * ),
 	* ?++( _Atomic restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic volatile T * ?++( _Atomic volatile T * restrict volatile * ),
+forall( otype T ) _Atomic volatile T * ?++( _Atomic volatile T * restrict volatile * ),
 	* ?++( _Atomic volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict T * ?++( const restrict T * restrict volatile * ),
+forall( otype T ) const restrict T * ?++( const restrict T * restrict volatile * ),
 	* ?++( const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) const volatile T * ?++( const volatile T * restrict volatile * ),
+forall( otype T ) const volatile T * ?++( const volatile T * restrict volatile * ),
 	* ?++( const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) restrict volatile T * ?++( restrict volatile T * restrict volatile * ),
+forall( otype T ) restrict volatile T * ?++( restrict volatile T * restrict volatile * ),
 	* ?++( restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict T * ?++( _Atomic const restrict T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict T * ?++( _Atomic const restrict T * restrict volatile * ),
 	* ?++( _Atomic const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const volatile T * ?++( _Atomic const volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const volatile T * ?++( _Atomic const volatile T * restrict volatile * ),
 	* ?++( _Atomic const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict volatile T * ?++( _Atomic restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic restrict volatile T * ?++( _Atomic restrict volatile T * restrict volatile * ),
 	* ?++( _Atomic restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict volatile T * ?++( const restrict volatile T * restrict volatile * ),
+forall( otype T ) const restrict volatile T * ?++( const restrict volatile T * restrict volatile * ),
 	* ?++( const restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict volatile T * ?++( _Atomic const restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict volatile T * ?++( _Atomic const restrict volatile T * restrict volatile * ),
 	* ?++( _Atomic const restrict volatile T * _Atomic restrict volatile * );
 
-_Bool ?--( volatile _Bool * ),
-	?--( _Atomic volatile _Bool * );
-char ?--( volatile char * ),
-	?--( _Atomic volatile char * );
-signed char ?--( volatile signed char * ),
-	?--( _Atomic volatile signed char * );
-unsigned char ?--( volatile signed char * ),
-	?--( _Atomic volatile signed char * );
-short int ?--( volatile short int * ),
-	?--( _Atomic volatile short int * );
-unsigned short int ?--( volatile unsigned short int * ),
-	?--( _Atomic volatile unsigned short int * );
-int ?--( volatile int * ),
-	?--( _Atomic volatile int * );
-unsigned int ?--( volatile unsigned int * ),
-	?--( _Atomic volatile unsigned int * );
-long int ?--( volatile long int * ),
-	?--( _Atomic volatile long int * );
-long unsigned int ?--( volatile long unsigned int * ),
-	?--( _Atomic volatile long unsigned int * );
-long long int ?--( volatile long long int * ),
-	?--( _Atomic volatile long long int * );
-long long unsigned ?--( volatile long long unsigned int * ),
-	?--( _Atomic volatile long long unsigned int * );
-float ?--( volatile float * ),
-	?--( _Atomic volatile float * );
-double ?--( volatile double * ),
-	?--( _Atomic volatile double * );
-long double ?--( volatile long double * ),
-	?--( _Atomic volatile long double * );
-
-forall( type T ) T * ?--( T * restrict volatile * ),
-	* ?--( T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic T * ?--( _Atomic T * restrict volatile * ),
-	* ?--( _Atomic T * _Atomic restrict volatile * );
-
-forall( type T ) const T * ?--( const T * restrict volatile * ),
-	* ?--( const T * _Atomic restrict volatile * );
-
-forall( type T ) volatile T * ?--( volatile T * restrict volatile * ),
-	* ?--( volatile T * _Atomic restrict volatile * );
-
-forall( type T ) restrict T * ?--( restrict T * restrict volatile * ),
-	* ?--( restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const T * ?--( _Atomic const T * restrict volatile * ),
+_Bool ?--( volatile _Bool * ), ?--( _Atomic volatile _Bool * );
+char ?--( volatile char * ), ?--( _Atomic volatile char * );
+signed char ?--( volatile signed char * ), ?--( _Atomic volatile signed char * );
+unsigned char ?--( volatile signed char * ), ?--( _Atomic volatile signed char * );
+short int ?--( volatile short int * ), ?--( _Atomic volatile short int * );
+unsigned short int ?--( volatile unsigned short int * ), ?--( _Atomic volatile unsigned short int * );
+int ?--( volatile int * ), ?--( _Atomic volatile int * );
+unsigned int ?--( volatile unsigned int * ), ?--( _Atomic volatile unsigned int * );
+long int ?--( volatile long int * ), ?--( _Atomic volatile long int * );
+long unsigned int ?--( volatile long unsigned int * ), ?--( _Atomic volatile long unsigned int * );
+long long int ?--( volatile long long int * ), ?--( _Atomic volatile long long int * );
+long long unsigned ?--( volatile long long unsigned int * ), ?--( _Atomic volatile long long unsigned int * );
+float ?--( volatile float * ), ?--( _Atomic volatile float * );
+double ?--( volatile double * ), ?--( _Atomic volatile double * );
+long double ?--( volatile long double * ), ?--( _Atomic volatile long double * );
+
+forall( otype T ) T * ?--( T * restrict volatile * ), * ?--( T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic T * ?--( _Atomic T * restrict volatile * ), * ?--( _Atomic T * _Atomic restrict volatile * );
+forall( otype T ) const T * ?--( const T * restrict volatile * ), * ?--( const T * _Atomic restrict volatile * );
+forall( otype T ) volatile T * ?--( volatile T * restrict volatile * ), * ?--( volatile T * _Atomic restrict volatile * );
+forall( otype T ) restrict T * ?--( restrict T * restrict volatile * ), * ?--( restrict T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic const T * ?--( _Atomic const T * restrict volatile * ),
 	* ?--( _Atomic const T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict T * ?--( _Atomic restrict T * restrict volatile * ),
+forall( otype T ) _Atomic restrict T * ?--( _Atomic restrict T * restrict volatile * ),
 	* ?--( _Atomic restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic volatile T * ?--( _Atomic volatile T * restrict volatile * ),
+forall( otype T ) _Atomic volatile T * ?--( _Atomic volatile T * restrict volatile * ),
 	* ?--( _Atomic volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict T * ?--( const restrict T * restrict volatile * ),
+forall( otype T ) const restrict T * ?--( const restrict T * restrict volatile * ),
 	* ?--( const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) const volatile T * ?--( const volatile T * restrict volatile * ),
+forall( otype T ) const volatile T * ?--( const volatile T * restrict volatile * ),
 	* ?--( const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) restrict volatile T * ?--( restrict volatile T * restrict volatile * ),
+forall( otype T ) restrict volatile T * ?--( restrict volatile T * restrict volatile * ),
 	* ?--( restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict T * ?--( _Atomic const restrict T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict T * ?--( _Atomic const restrict T * restrict volatile * ),
 	* ?--( _Atomic const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const volatile T * ?--( _Atomic const volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const volatile T * ?--( _Atomic const volatile T * restrict volatile * ),
 	* ?--( _Atomic const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict volatile T * ?--( _Atomic restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic restrict volatile T * ?--( _Atomic restrict volatile T * restrict volatile * ),
 	* ?--( _Atomic restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict volatile T * ?--( const restrict volatile T * restrict volatile * ),
+forall( otype T ) const restrict volatile T * ?--( const restrict volatile T * restrict volatile * ),
 	* ?--( const restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict volatile T * ?--( _Atomic const restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict volatile T * ?--( _Atomic const restrict volatile T * restrict volatile * ),
 	* ?--( _Atomic const restrict volatile T * _Atomic restrict volatile * );
 \end{lstlisting}
@@ -1308,30 +1010,21 @@
 
 \begin{rationale}
-Note that ``\lstinline$++$'' and ``\lstinline$--$'' are rewritten as function calls that are given a
-pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald
-has pointed out, this forces the modified operand of such expressions to be an lvalue. This
-partially enforces the C semantic rule that such operands must be \emph{modifiable} lvalues.
-\end{rationale}
-
-\begin{rationale}
-In C, a semantic rule requires that pointer operands of increment and decrement be pointers to
-object types. Hence, \lstinline$void *$ objects cannot be incremented. In \CFA, the restriction
-follows from the use of a \lstinline$type$ parameter in the predefined function definitions, as
-opposed to \lstinline$dtype$, since only object types can be inferred arguments corresponding to the
-type parameter \lstinline$T$.
+Note that ``\lstinline$++$'' and ``\lstinline$--$'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue.
+This partially enforces the C semantic rule that such operands must be \emph{modifiable} lvalues.
+\end{rationale}
+
+\begin{rationale}
+In C, a semantic rule requires that pointer operands of increment and decrement be pointers to object types.
+Hence, \lstinline$void *$ objects cannot be incremented.
+In \CFA, the restriction follows from the use of a \lstinline$type$ parameter in the predefined function definitions, as opposed to \lstinline$dtype$, since only object types can be inferred arguments corresponding to the type parameter \lstinline$T$.
 \end{rationale}
 
 \semantics
-First, each interpretation of the operand of an increment or decrement expression is considered
-separately. For each interpretation that is a bit-field or is declared with the
-\lstinline$register$\index{register@{\lstinline$register$}} \index{Itorage-class specifier}, the
-expression has one valid interpretation, with the type of the operand, and the expression is
-ambiguous if the operand is.
-
-For the remaining interpretations, the expression is rewritten, and the interpretations of the
-expression are the interpretations of the corresponding function call. Finally, all interpretations
-of the expression produced for the different interpretations of the operand are combined to produce
-the interpretations of the expression as a whole; where interpretations have compatible result
-types, the best interpretations are selected in the manner described for function call expressions.
+First, each interpretation of the operand of an increment or decrement expression is considered separately.
+For each interpretation that is a bit-field or is declared with the
+\lstinline$register$\index{register@{\lstinline$register$}} \index{Itorage-class specifier}, the expression has one valid interpretation, with the type of the operand, and the expression is ambiguous if the operand is.
+
+For the remaining interpretations, the expression is rewritten, and the interpretations of the expression are the interpretations of the corresponding function call.
+Finally, all interpretations of the expression produced for the different interpretations of the operand are combined to produce the interpretations of the expression as a whole; where interpretations have compatible result types, the best interpretations are selected in the manner described for function call expressions.
 
 \examples
@@ -1346,87 +1039,70 @@
 \lstinline$vs++$ calls the \lstinline$?++$ function with the \lstinline$volatile short *$ parameter.
 \lstinline$s++$ does the same, applying the safe conversion from \lstinline$short int *$ to
-\lstinline$volatile short int *$. Note that there is no conversion that adds an \lstinline$_Atomic$
-qualifier, so the \lstinline$_Atomic volatile short int$ overloading does not provide a valid
-interpretation.
+\lstinline$volatile short int *$.
+Note that there is no conversion that adds an \lstinline$_Atomic$ qualifier, so the \lstinline$_Atomic volatile short int$ overloading does not provide a valid interpretation.
 \end{sloppypar}
 
-There is no safe conversion from \lstinline$const short int *$ to \lstinline$volatile short int *$,
-and no \lstinline$?++$ function that accepts a \lstinline$const *$ parameter, so \lstinline$cs++$
-has no valid interpretations.
-
-The best valid interpretation of \lstinline$as++$ calls the \lstinline$short ?++$ function with the
-\lstinline$_Atomic volatile short int *$ parameter, applying a safe conversion to add the
-\lstinline$volatile$ qualifier.
-
-\begin{lstlisting}
-char * const restrict volatile * restrict volatile pqpc; pqpc++
-char * * restrict volatile ppc; ppc++; 
-\end{lstlisting}
-Since \lstinline$&(pqpc)$ has type \lstinline$char * const restrict volatile * restrict volatile *$,
-the best valid interpretation of \lstinline$pqpc++$ calls the polymorphic \lstinline$?++$ function
-with the \lstinline$const restrict volatile T * restrict volatile *$ parameter, inferring
-\lstinline$T$ to be \lstinline$char *$.
-
-\begin{sloppypar}
-\lstinline$ppc++$ calls the same function, again inferring \lstinline$T$ to be \lstinline$char *$,
-and using the safe conversions from \lstinline$T$ to \lstinline$T const restrict volatile$.
-\end{sloppypar}
-
-\begin{rationale}
-Increment and decrement expressions show up a deficiency of \CFA's type system. There is no such
-thing as a pointer to a register object or bit-field\index{deficiencies!pointers to bit-fields}.
-Therefore, there is no way to define a function that alters them, and hence no way to define
-increment and decrement functions for them. As a result, the semantics of increment and decrement
-expressions must treat them specially. This holds true for all of the operators that may modify
-such objects.
-\end{rationale}
-
-\begin{rationale}
-The polymorphic overloadings for pointer increment and decrement can be understood by considering
-increasingly complex types.
+There is no safe conversion from \lstinline$const short int *$ to \lstinline$volatile short int *$, and no \lstinline$?++$ function that accepts a \lstinline$const *$ parameter, so \lstinline$cs++$ has no valid interpretations.
+
+The best valid interpretation of \lstinline$as++$ calls the \lstinline$short ?++$ function with the \lstinline$_Atomic volatile short int *$ parameter, applying a safe conversion to add the \lstinline$volatile$ qualifier.
+\begin{lstlisting}
+char * const restrict volatile * restrict volatile pqpc;
+pqpc++
+char * * restrict volatile ppc;
+ppc++;
+\end{lstlisting}
+Since \lstinline$&(pqpc)$ has type \lstinline$char * const restrict volatile * restrict volatile *$, the best valid interpretation of \lstinline$pqpc++$ calls the polymorphic \lstinline$?++$ function with the \lstinline$const restrict volatile T * restrict volatile *$ parameter, inferring \lstinline$T$ to be \lstinline$char *$.
+
+\lstinline$ppc++$ calls the same function, again inferring \lstinline$T$ to be \lstinline$char *$, and using the safe conversions from \lstinline$T$ to \lstinline$T const$ \lstinline$restrict volatile$.
+
+\begin{rationale}
+Increment and decrement expressions show up a deficiency of \CFA's type system.
+There is no such thing as a pointer to a register object or bit-field\index{deficiencies!pointers to bit-fields}.
+Therefore, there is no way to define a function that alters them, and hence no way to define increment and decrement functions for them.
+As a result, the semantics of increment and decrement expressions must treat them specially.
+This holds true for all of the operators that may modify such objects.
+\end{rationale}
+
+\begin{rationale}
+The polymorphic overloadings for pointer increment and decrement can be understood by considering increasingly complex types.
 \begin{enumerate}
 \item
-``\lstinline$char * p; p++;$''. The argument to \lstinline$?++$ has type \lstinline$char * *$, and
-the result has type \lstinline$char *$. The expression would be valid if \lstinline$?++$ were
-declared by
-\begin{lstlisting}
-forall( type T ) T * ?++( T * * );
-\end{lstlisting}
-with \lstinline$T$ inferred to be \lstinline$char$.
-
-\item
-``\lstinline$char *restrict volatile qp; qp++$''. The result again has type \lstinline$char *$, but
-the argument now has type \lstinline$char *restrict volatile *$, so it cannot be passed to the
-hypothetical function declared in point 1. Hence the actual predefined function is
-\begin{lstlisting}
-forall( type T ) T * ?++( T * restrict volatile * );
-\end{lstlisting}
-which also accepts a \lstinline$char * *$ argument, because of the safe conversions that add
-\lstinline$volatile$ and \lstinline$restrict$ qualifiers. (The parameter is not const-qualified, so
-constant pointers cannot be incremented.)
-
-\item
-``\lstinline$char *_Atomic ap; ap++$''. The result again has type \lstinline$char *$, but no safe
-conversion adds an \lstinline$_Atomic$ qualifier, so the function in point 2 is not applicable. A
-separate overloading of \lstinline$?++$ is required.
-
-\item
-``\lstinline$char const volatile * pq; pq++$''. Here the result has type
+``\lstinline$char * p; p++;$''.
+The argument to \lstinline$?++$ has type \lstinline$char * *$, and the result has type \lstinline$char *$.
+The expression would be valid if \lstinline$?++$ were declared by
+\begin{lstlisting}
+forall( otype T ) T * ?++( T * * );
+\end{lstlisting} with \lstinline$T$ inferred to be \lstinline$char$.
+
+\item
+``\lstinline$char *restrict volatile qp; qp++$''.
+The result again has type \lstinline$char *$, but the argument now has type \lstinline$char *restrict volatile *$, so it cannot be passed to the hypothetical function declared in point 1.
+Hence the actual predefined function is
+\begin{lstlisting}
+forall( otype T ) T * ?++( T * restrict volatile * );
+\end{lstlisting} which also accepts a \lstinline$char * *$ argument, because of the safe conversions that add
+\lstinline$volatile$ and \lstinline$restrict$ qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.)
+
+\item
+``\lstinline$char *_Atomic ap; ap++$''.
+The result again has type \lstinline$char *$, but no safe conversion adds an \lstinline$_Atomic$ qualifier, so the function in point 2 is not applicable.
+A separate overloading of \lstinline$?++$ is required.
+
+\item
+``\lstinline$char const volatile * pq; pq++$''.
+Here the result has type
 \lstinline$char const volatile *$, so a new overloading is needed:
 \begin{lstlisting}
-forall( type T ) T const volatile * ?++( T const volatile *restrict volatile * );
-\end{lstlisting}
-One overloading is needed for each combination of qualifiers in the pointed-at
-type\index{deficiencies!pointers to qualified types}.
+forall( otype T ) T const volatile * ?++( T const volatile *restrict volatile * );
+\end{lstlisting}
+One overloading is needed for each combination of qualifiers in the pointed-at type\index{deficiencies!pointers to qualified types}.
  
 \item
-``\lstinline$float *restrict * prp; prp++$''. The \lstinline$restrict$ qualifier is handled just
-like \lstinline$const$ and \lstinline$volatile$ in the previous case:
-\begin{lstlisting}
-forall( type T ) T restrict * ?++( T restrict *restrict volatile * );
-\end{lstlisting}
-with \lstinline$T$ inferred to be \lstinline$float *$. This looks odd, because {\c11} contains a
-constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline$T$
-is not syntactically a pointer type. \CFA loosens the constraint.
+``\lstinline$float *restrict * prp; prp++$''.
+The \lstinline$restrict$ qualifier is handled just like \lstinline$const$ and \lstinline$volatile$ in the previous case:
+\begin{lstlisting}
+forall( otype T ) T restrict * ?++( T restrict *restrict volatile * );
+\end{lstlisting} with \lstinline$T$ inferred to be \lstinline$float *$.
+This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline$T$ is not syntactically a pointer type. \CFA loosens the constraint.
 \end{enumerate}
 \end{rationale}
@@ -1436,6 +1112,5 @@
 
 \semantics 
-A compound literal has one interpretation, with the type given by the \nonterm{type-name} of the
-compound literal.
+A compound literal has one interpretation, with the type given by the \nonterm{type-name} of the compound literal.
 
 
@@ -1455,11 +1130,11 @@
 \rewriterules
 \begin{lstlisting}
-*a	@\rewrite@ *?(a) @\use{*?}@
-+a	@\rewrite@ +?(a) @\use{+?}@
--a	@\rewrite@ -?(a) @\use{-?}@
-~a	@\rewrite@ ~?(a) @\use{~?}@
-!a	@\rewrite@ !?(a) @\use{"!?}@
-++a	@\rewrite@ ++?(&(a)) @\use{++?}@
---a	@\rewrite@ --?(&(a)) @\use{--?}@
+*a	@\rewrite@ *?( a ) @\use{*?}@
++a	@\rewrite@ +?( a ) @\use{+?}@
+-a	@\rewrite@ -?( a ) @\use{-?}@
+~a	@\rewrite@ ~?( a ) @\use{~?}@
+!a	@\rewrite@ !?( a ) @\use{"!?}@
+++a	@\rewrite@ ++?(&( a )) @\use{++?}@
+--a	@\rewrite@ --?(&( a )) @\use{--?}@
 \end{lstlisting}
 
@@ -1469,160 +1144,90 @@
 \predefined
 \begin{lstlisting}
-_Bool ++?( volatile _Bool * ),
-	++?( _Atomic volatile _Bool * );
-char ++?( volatile char * ),
-	++?( _Atomic volatile char * );
-signed char ++?( volatile signed char * ),
-	++?( _Atomic volatile signed char * );
-unsigned char ++?( volatile signed char * ),
-	++?( _Atomic volatile signed char * );
-short int ++?( volatile short int * ),
-	++?( _Atomic volatile short int * );
-unsigned short int ++?( volatile unsigned short int * ),
-	++?( _Atomic volatile unsigned short int * );
-int ++?( volatile int * ),
-	++?( _Atomic volatile int * );
-unsigned int ++?( volatile unsigned int * ),
-	++?( _Atomic volatile unsigned int * );
-long int ++?( volatile long int * ),
-	++?( _Atomic volatile long int * );
-long unsigned int ++?( volatile long unsigned int * ),
-	++?( _Atomic volatile long unsigned int * );
-long long int ++?( volatile long long int * ),
-	++?( _Atomic volatile long long int * );
-long long unsigned ++?( volatile long long unsigned int * ),
-	++?( _Atomic volatile long long unsigned int * );
-float ++?( volatile float * ),
-	++?( _Atomic volatile float * );
-double ++?( volatile double * ),
-	++?( _Atomic volatile double * );
-long double ++?( volatile long double * ),
-	++?( _Atomic volatile long double * );
-
-forall( type T ) T * ++?( T * restrict volatile * ),
-	* ++?( T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic T * ++?( _Atomic T * restrict volatile * ),
-	* ++?( _Atomic T * _Atomic restrict volatile * );
-
-forall( type T ) const T * ++?( const T * restrict volatile * ),
-	* ++?( const T * _Atomic restrict volatile * );
-
-forall( type T ) volatile T * ++?( volatile T * restrict volatile * ),
-	* ++?( volatile T * _Atomic restrict volatile * );
-
-forall( type T ) restrict T * ++?( restrict T * restrict volatile * ),
-	* ++?( restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const T * ++?( _Atomic const T * restrict volatile * ),
+_Bool ++?( volatile _Bool * ), ++?( _Atomic volatile _Bool * );
+char ++?( volatile char * ), ++?( _Atomic volatile char * );
+signed char ++?( volatile signed char * ), ++?( _Atomic volatile signed char * );
+unsigned char ++?( volatile signed char * ), ++?( _Atomic volatile signed char * );
+short int ++?( volatile short int * ), ++?( _Atomic volatile short int * );
+unsigned short int ++?( volatile unsigned short int * ), ++?( _Atomic volatile unsigned short int * );
+int ++?( volatile int * ), ++?( _Atomic volatile int * );
+unsigned int ++?( volatile unsigned int * ), ++?( _Atomic volatile unsigned int * );
+long int ++?( volatile long int * ), ++?( _Atomic volatile long int * );
+long unsigned int ++?( volatile long unsigned int * ), ++?( _Atomic volatile long unsigned int * );
+long long int ++?( volatile long long int * ), ++?( _Atomic volatile long long int * );
+long long unsigned ++?( volatile long long unsigned int * ), ++?( _Atomic volatile long long unsigned int * );
+float ++?( volatile float * ), ++?( _Atomic volatile float * );
+double ++?( volatile double * ), ++?( _Atomic volatile double * );
+long double ++?( volatile long double * ), ++?( _Atomic volatile long double * );
+
+forall( otype T ) T * ++?( T * restrict volatile * ), * ++?( T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic T * ++?( _Atomic T * restrict volatile * ), * ++?( _Atomic T * _Atomic restrict volatile * );
+forall( otype T ) const T * ++?( const T * restrict volatile * ), * ++?( const T * _Atomic restrict volatile * );
+forall( otype T ) volatile T * ++?( volatile T * restrict volatile * ), * ++?( volatile T * _Atomic restrict volatile * );
+forall( otype T ) restrict T * ++?( restrict T * restrict volatile * ), * ++?( restrict T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic const T * ++?( _Atomic const T * restrict volatile * ),
 	* ++?( _Atomic const T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic volatile T * ++?( _Atomic volatile T * restrict volatile * ),
+forall( otype T ) _Atomic volatile T * ++?( _Atomic volatile T * restrict volatile * ),
 	* ++?( _Atomic volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict T * ++?( _Atomic restrict T * restrict volatile * ),
+forall( otype T ) _Atomic restrict T * ++?( _Atomic restrict T * restrict volatile * ),
 	* ++?( _Atomic restrict T * _Atomic restrict volatile * );
-
-forall( type T ) const volatile T * ++?( const volatile T * restrict volatile * ),
+forall( otype T ) const volatile T * ++?( const volatile T * restrict volatile * ),
 	* ++?( const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict T * ++?( const restrict T * restrict volatile * ),
+forall( otype T ) const restrict T * ++?( const restrict T * restrict volatile * ),
 	* ++?( const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) restrict volatile T * ++?( restrict volatile T * restrict volatile * ),
+forall( otype T ) restrict volatile T * ++?( restrict volatile T * restrict volatile * ),
 	* ++?( restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const volatile T * ++?( _Atomic const volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const volatile T * ++?( _Atomic const volatile T * restrict volatile * ),
 	* ++?( _Atomic const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict T * ++?( _Atomic const restrict T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict T * ++?( _Atomic const restrict T * restrict volatile * ),
 	* ++?( _Atomic const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict volatile T * ++?( _Atomic restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic restrict volatile T * ++?( _Atomic restrict volatile T * restrict volatile * ),
 	* ++?( _Atomic restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict volatile T * ++?( const restrict volatile T * restrict volatile * ),
+forall( otype T ) const restrict volatile T * ++?( const restrict volatile T * restrict volatile * ),
 	* ++?( const restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict volatile T * ++?( _Atomic const restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict volatile T * ++?( _Atomic const restrict volatile T * restrict volatile * ),
 	* ++?( _Atomic const restrict volatile T * _Atomic restrict volatile * );
 
-_Bool --?( volatile _Bool * ),
-	--?( _Atomic volatile _Bool * );
-char --?( volatile char * ),
-	--?( _Atomic volatile char * );
-signed char --?( volatile signed char * ),
-	--?( _Atomic volatile signed char * );
-unsigned char --?( volatile signed char * ),
-	--?( _Atomic volatile signed char * );
-short int --?( volatile short int * ),
-	--?( _Atomic volatile short int * );
-unsigned short int --?( volatile unsigned short int * ),
-	--?( _Atomic volatile unsigned short int * );
-int --?( volatile int * ),
-	--?( _Atomic volatile int * );
-unsigned int --?( volatile unsigned int * ),
-	--?( _Atomic volatile unsigned int * );
-long int --?( volatile long int * ),
-	--?( _Atomic volatile long int * );
-long unsigned int --?( volatile long unsigned int * ),
-	--?( _Atomic volatile long unsigned int * );
-long long int --?( volatile long long int * ),
-	--?( _Atomic volatile long long int * );
-long long unsigned --?( volatile long long unsigned int * ),
-	--?( _Atomic volatile long long unsigned int * );
-float --?( volatile float * ),
-	--?( _Atomic volatile float * );
-double --?( volatile double * ),
-	--?( _Atomic volatile double * );
-long double --?( volatile long double * ),
-	--?( _Atomic volatile long double * );
-
-forall( type T ) T * --?( T * restrict volatile * ),
-	* --?( T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic T * --?( _Atomic T * restrict volatile * ),
-	* --?( _Atomic T * _Atomic restrict volatile * );
-
-forall( type T ) const T * --?( const T * restrict volatile * ),
-	* --?( const T * _Atomic restrict volatile * );
-
-forall( type T ) volatile T * --?( volatile T * restrict volatile * ),
-	* --?( volatile T * _Atomic restrict volatile * );
-
-forall( type T ) restrict T * --?( restrict T * restrict volatile * ),
-	* --?( restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const T * --?( _Atomic const T * restrict volatile * ),
+_Bool --?( volatile _Bool * ), --?( _Atomic volatile _Bool * );
+char --?( volatile char * ), --?( _Atomic volatile char * );
+signed char --?( volatile signed char * ), --?( _Atomic volatile signed char * );
+unsigned char --?( volatile signed char * ), --?( _Atomic volatile signed char * );
+short int --?( volatile short int * ), --?( _Atomic volatile short int * );
+unsigned short int --?( volatile unsigned short int * ), --?( _Atomic volatile unsigned short int * );
+int --?( volatile int * ), --?( _Atomic volatile int * );
+unsigned int --?( volatile unsigned int * ), --?( _Atomic volatile unsigned int * );
+long int --?( volatile long int * ), --?( _Atomic volatile long int * );
+long unsigned int --?( volatile long unsigned int * ), --?( _Atomic volatile long unsigned int * );
+long long int --?( volatile long long int * ), --?( _Atomic volatile long long int * );
+long long unsigned --?( volatile long long unsigned int * ), --?( _Atomic volatile long long unsigned int * );
+float --?( volatile float * ), --?( _Atomic volatile float * );
+double --?( volatile double * ), --?( _Atomic volatile double * );
+long double --?( volatile long double * ), --?( _Atomic volatile long double * );
+
+forall( otype T ) T * --?( T * restrict volatile * ), * --?( T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic T * --?( _Atomic T * restrict volatile * ), * --?( _Atomic T * _Atomic restrict volatile * );
+forall( otype T ) const T * --?( const T * restrict volatile * ), * --?( const T * _Atomic restrict volatile * );
+forall( otype T ) volatile T * --?( volatile T * restrict volatile * ), * --?( volatile T * _Atomic restrict volatile * );
+forall( otype T ) restrict T * --?( restrict T * restrict volatile * ), * --?( restrict T * _Atomic restrict volatile * );
+forall( otype T ) _Atomic const T * --?( _Atomic const T * restrict volatile * ),
 	* --?( _Atomic const T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic volatile T * --?( _Atomic volatile T * restrict volatile * ),
+forall( otype T ) _Atomic volatile T * --?( _Atomic volatile T * restrict volatile * ),
 	* --?( _Atomic volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict T * --?( _Atomic restrict T * restrict volatile * ),
+forall( otype T ) _Atomic restrict T * --?( _Atomic restrict T * restrict volatile * ),
 	* --?( _Atomic restrict T * _Atomic restrict volatile * );
-
-forall( type T ) const volatile T * --?( const volatile T * restrict volatile * ),
+forall( otype T ) const volatile T * --?( const volatile T * restrict volatile * ),
 	* --?( const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict T * --?( const restrict T * restrict volatile * ),
+forall( otype T ) const restrict T * --?( const restrict T * restrict volatile * ),
 	* --?( const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) restrict volatile T * --?( restrict volatile T * restrict volatile * ),
+forall( otype T ) restrict volatile T * --?( restrict volatile T * restrict volatile * ),
 	* --?( restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const volatile T * --?( _Atomic const volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const volatile T * --?( _Atomic const volatile T * restrict volatile * ),
 	* --?( _Atomic const volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict T * --?( _Atomic const restrict T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict T * --?( _Atomic const restrict T * restrict volatile * ),
 	* --?( _Atomic const restrict T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic restrict volatile T * --?( _Atomic restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic restrict volatile T * --?( _Atomic restrict volatile T * restrict volatile * ),
 	* --?( _Atomic restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) const restrict volatile T * --?( const restrict volatile T * restrict volatile * ),
+forall( otype T ) const restrict volatile T * --?( const restrict volatile T * restrict volatile * ),
 	* --?( const restrict volatile T * _Atomic restrict volatile * );
-
-forall( type T ) _Atomic const restrict volatile T * --?( _Atomic const restrict volatile T * restrict volatile * ),
+forall( otype T ) _Atomic const restrict volatile T * --?( _Atomic const restrict volatile T * restrict volatile * ),
 	* --?( _Atomic const restrict volatile T * _Atomic restrict volatile * );
 \end{lstlisting}
@@ -1645,7 +1250,5 @@
 
 \semantics
-The interpretations of prefix increment and decrement expressions are
-determined in the same way as the interpretations of postfix increment and
-decrement expressions.
+The interpretations of prefix increment and decrement expressions are determined in the same way as the interpretations of postfix increment and decrement expressions.
 
 
@@ -1654,21 +1257,20 @@
 \predefined
 \begin{lstlisting}
-forall( type T ) lvalue T *?( T * );
-forall( type T ) _Atomic lvalue T *?( _Atomic T * );
-forall( type T ) const lvalue T *?( const T * );
-forall( type T ) volatile lvalue T *?( volatile T * );
-forall( type T ) restrict lvalue T *?( restrict T * );
-forall( type T ) _Atomic const lvalue T *?( _Atomic const T * );
-forall( type T ) _Atomic volatile lvalue T *?( _Atomic volatile T * );
-forall( type T ) _Atomic restrict lvalue T *?( _Atomic restrict T * );
-forall( type T ) const volatile lvalue T *?( const volatile T * );
-forall( type T ) const restrict lvalue T *?( const restrict T * );
-forall( type T ) restrict volatile lvalue T *?( restrict volatile T * );
-forall( type T ) _Atomic const volatile lvalue T *?( _Atomic const volatile T * );
-forall( type T ) _Atomic const restrict lvalue T *?( _Atomic const restrict T * );
-forall( type T ) _Atomic restrict volatile lvalue T *?( _Atomic restrict volatile T * );
-forall( type T ) const restrict volatile lvalue T *?( const restrict volatile T * );
-forall( type T ) _Atomic const restrict volatile lvalue T *?( _Atomic const restrict volatile T * );
-
+forall( otype T ) lvalue T *?( T * );
+forall( otype T ) _Atomic lvalue T *?( _Atomic T * );
+forall( otype T ) const lvalue T *?( const T * );
+forall( otype T ) volatile lvalue T *?( volatile T * );
+forall( otype T ) restrict lvalue T *?( restrict T * );
+forall( otype T ) _Atomic const lvalue T *?( _Atomic const T * );
+forall( otype T ) _Atomic volatile lvalue T *?( _Atomic volatile T * );
+forall( otype T ) _Atomic restrict lvalue T *?( _Atomic restrict T * );
+forall( otype T ) const volatile lvalue T *?( const volatile T * );
+forall( otype T ) const restrict lvalue T *?( const restrict T * );
+forall( otype T ) restrict volatile lvalue T *?( restrict volatile T * );
+forall( otype T ) _Atomic const volatile lvalue T *?( _Atomic const volatile T * );
+forall( otype T ) _Atomic const restrict lvalue T *?( _Atomic const restrict T * );
+forall( otype T ) _Atomic restrict volatile lvalue T *?( _Atomic restrict volatile T * );
+forall( otype T ) const restrict volatile lvalue T *?( const restrict volatile T * );
+forall( otype T ) _Atomic const restrict volatile lvalue T *?( _Atomic const restrict volatile T * );
 forall( ftype FT ) FT *?( FT * );
 \end{lstlisting}
@@ -1682,6 +1284,5 @@
 \lstinline$T$ is the type of the operand.
 
-The interpretations of an indirection expression are the interpretations of the corresponding
-function call.
+The interpretations of an indirection expression are the interpretations of the corresponding function call.
 
 
@@ -1690,66 +1291,25 @@
 \predefined
 \begin{lstlisting}
-int
-	+?( int ),
-	-?( int ),
-	~?( int );
-unsigned int
-	+?( unsigned int ),
-	-?( unsigned int ),
-	 ~?( unsigned int );
-long int
-	+?( long int ),
-	-?( long int ),
-	~?( long int );
-long unsigned int
-	+?( long unsigned int ),
-	-?( long unsigned int ),
-	~?( long unsigned int );
-long long int
-	+?( long long int ),
-	-?( long long int ),
-	~?( long long int );
-long long unsigned int
-	+?( long long unsigned int ),
-	-?( long long unsigned int ),
-	~?( long long unsigned int );
-float
-	+?( float ),
-	-?( float );
-double
-	+?( double ),
-	-?( double );
-long double
-	+?( long double ),
-	-?( long double );
-_Complex float
-	+?( _Complex float ),
-	-?( _Complex float );
-_Complex double
-	+?( _Complex double ),
-	-?( _Complex double );
-_Complex long double
-	+?( _Complex long double ),
-	-?( _Complex long double );
-
-int !?( int ),
-	!?( unsigned int ),
-	!?( long ),
-	!?( long unsigned int ),
-	!?( long long int ),
-	!?( long long unsigned int ),
-	!?( float ),
-	!?( double ),
-	!?( long double ),
-	!?( _Complex float ),
-	!?( _Complex double ),
-	!?( _Complex long double );
-
+int	+?( int ), -?( int ), ~?( int );
+unsigned int +?( unsigned int ), -?( unsigned int ), ~?( unsigned int );
+long int +?( long int ), -?( long int ), ~?( long int );
+long unsigned int +?( long unsigned int ), -?( long unsigned int ), ~?( long unsigned int );
+long long int +?( long long int ), -?( long long int ), ~?( long long int );
+long long unsigned int +?( long long unsigned int ), -?( long long unsigned int ), ~?( long long unsigned int );
+float +?( float ), -?( float );
+double +?( double ), -?( double );
+long double +?( long double ), -?( long double );
+_Complex float +?( _Complex float ), -?( _Complex float );
+_Complex double +?( _Complex double ), -?( _Complex double );
+_Complex long double +?( _Complex long double ), -?( _Complex long double );
+int !?( int ), !?( unsigned int ), !?( long ), !?( long unsigned int ),
+	!?( long long int ), !?( long long unsigned int ),
+	!?( float ), !?( double ), !?( long double ),
+	!?( _Complex float ), !?( _Complex double ), !?( _Complex long double );
 forall( dtype DT ) int !?( const restrict volatile DT * );
 forall( dtype DT ) int !?( _Atomic const restrict volatile DT * );
 forall( ftype FT ) int !?( FT * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1759,6 +1319,5 @@
 
 \semantics
-The interpretations of a unary arithmetic expression are the interpretations of the corresponding
-function call.
+The interpretations of a unary arithmetic expression are the interpretations of the corresponding function call.
 
 \examples
@@ -1766,11 +1325,9 @@
 long int li;
 void eat_double( double );@\use{eat_double}@
-
-eat_double(-li ); // @\rewrite@ eat_double( -?( li ) ); 
+eat_double(-li ); // @\rewrite@ eat_double( -?( li ) );
 \end{lstlisting}
 The valid interpretations of ``\lstinline$-li$'' (assuming no extended integer types exist) are
 \begin{center}
-\begin{tabular}{llc}
-interpretation & result type & expression conversion cost \\
+\begin{tabular}{llc} interpretation & result type & expression conversion cost \\
 \hline
 \lstinline$-?( (int)li )$					& \lstinline$int$					& (unsafe) \\
@@ -1788,9 +1345,7 @@
 \end{tabular}
 \end{center}
-The valid interpretations of the \lstinline$eat_double$ call, with the cost of the argument
-conversion and the cost of the entire expression, are
+The valid interpretations of the \lstinline$eat_double$ call, with the cost of the argument conversion and the cost of the entire expression, are
 \begin{center}
-\begin{tabular}{lcc}
-interpretation & argument cost & expression cost \\
+\begin{tabular}{lcc} interpretation & argument cost & expression cost \\
 \hline
 \lstinline$eat_double( (double)-?( (int)li) )$					& 7			& (unsafe) \\
@@ -1808,6 +1363,7 @@
 \end{tabular}
 \end{center}
-Each has result type \lstinline$void$, so the best must be selected. The interpretations involving
-unsafe conversions are discarded. The remainder have equal expression conversion costs, so the
+Each has result type \lstinline$void$, so the best must be selected.
+The interpretations involving unsafe conversions are discarded.
+The remainder have equal expression conversion costs, so the
 ``highest argument conversion cost'' rule is invoked, and the chosen interpretation is
 \lstinline$eat_double( (double)-?(li) )$.
@@ -1820,26 +1376,19 @@
 \lstinline$dtype$, or \lstinline$ftype$.
 
-When the \lstinline$sizeof$\use{sizeof} operator is applied to an expression, the expression shall
-have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall
-be unambiguous. \semantics A \lstinline$sizeof$ or \lstinline$_Alignof$ expression has one
-interpretation, of type \lstinline$size_t$.
+When the \lstinline$sizeof$\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A \lstinline$sizeof$ or \lstinline$_Alignof$ expression has one interpretation, of type \lstinline$size_t$.
 
 When \lstinline$sizeof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
-\nonterm{type-parameter}, it yields the size in bytes of the type that implements the operand. When
-the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the
-expression is not a constant expression.
+\nonterm{type-parameter}, it yields the size in bytes of the type that implements the operand.
+When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression.
 
 When \lstinline$_Alignof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
-\nonterm{type-parameter}, it yields the alignment requirement of the type that implements the
-operand. When the operand is an opaque type or an inferred type parameter\index{inferred
-parameter}, the expression is not a constant expression.
-\begin{rationale}
-\begin{lstlisting}
-type Pair = struct { int first, second; };
+\nonterm{type-parameter}, it yields the alignment requirement of the type that implements the operand.
+When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression.
+\begin{rationale}
+\begin{lstlisting}
+otype Pair = struct { int first, second; };
 size_t p_size = sizeof(Pair);		// constant expression 
-
-extern type Rational;@\use{Rational}@
+extern otype Rational;@\use{Rational}@
 size_t c_size = sizeof(Rational);	// non-constant expression 
-
 forall(type T) T f(T p1, T p2) {
 	size_t t_size = sizeof(T);		// non-constant expression 
@@ -1847,5 +1396,6 @@
 }
 \end{lstlisting}
-``\lstinline$sizeof Rational$'', although not statically known, is fixed. Within \lstinline$f()$,
+``\lstinline$sizeof Rational$'', although not statically known, is fixed.
+Within \lstinline$f()$,
 ``\lstinline$sizeof(T)$'' is fixed for each call of \lstinline$f()$, but may vary from call to call.
 \end{rationale}
@@ -1867,14 +1417,10 @@
 
 In a \Index{cast expression} ``\lstinline$($\nonterm{type-name}\lstinline$)e$'', if
-\nonterm{type-name} is the type of an interpretation of \lstinline$e$, then that interpretation is
-the only interpretation of the cast expression; otherwise, \lstinline$e$ shall have some
-interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast
-expression is the cast of the interpretation that can be converted at the lowest cost. The cast
-expression's interpretation is ambiguous\index{ambiguous interpretation} if more than one
-interpretation can be converted at the lowest cost or if the selected interpretation is ambiguous.
-
-\begin{rationale}
-Casts can be used to eliminate ambiguity in expressions by selecting interpretations of
-subexpressions, and to specialize polymorphic functions and values.
+\nonterm{type-name} is the type of an interpretation of \lstinline$e$, then that interpretation is the only interpretation of the cast expression;
+otherwise, \lstinline$e$ shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost.
+The cast expression's interpretation is ambiguous\index{ambiguous interpretation} if more than one interpretation can be converted at the lowest cost or if the selected interpretation is ambiguous.
+
+\begin{rationale}
+Casts can be used to eliminate ambiguity in expressions by selecting interpretations of subexpressions, and to specialize polymorphic functions and values.
 \end{rationale}
 
@@ -1899,49 +1445,27 @@
 \predefined
 \begin{lstlisting}
-int?*?( int, int ),
-	?/?( int, int ),
-	?%?( int, int );
-unsigned int?*?( unsigned int, unsigned int ),
-	?/?( unsigned int, unsigned int ),
-	?%?( unsigned int, unsigned int );
-long int?*?( long int, long int ),
-	?/?( long, long ),
-	?%?( long, long );
+int?*?( int, int ), ?/?( int, int ), ?%?( int, int );
+unsigned int?*?( unsigned int, unsigned int ), ?/?( unsigned int, unsigned int ), ?%?( unsigned int, unsigned int );
+long int?*?( long int, long int ), ?/?( long, long ), ?%?( long, long );
 long unsigned int?*?( long unsigned int, long unsigned int ),
-	?/?( long unsigned int, long unsigned int ),
-	?%?( long unsigned int, long unsigned int );
-long long int?*?( long long int, long long int ),
-	?/?( long long int, long long int ),
+	?/?( long unsigned int, long unsigned int ), ?%?( long unsigned int, long unsigned int );
+long long int?*?( long long int, long long int ), ?/?( long long int, long long int ),
 	?%?( long long int, long long int );
 long long unsigned int ?*?( long long unsigned int, long long unsigned int ),
-	?/?( long long unsigned int, long long unsigned int ),
-	?%?( long long unsigned int, long long unsigned int );
-float?*?( float, float ),
-	?/?( float, float );
-double?*?( double, double ),
-	?/?( double, double );
-long double?*?( long double, long double ),
-	?/?( long double, long double );
-_Complex float?*?( float, _Complex float ),
-	?/?( float, _Complex float ),
-	?*?( _Complex float, float ),
-	?/?( _Complex float, float ),
-	?*?( _Complex float, _Complex float ),
-	?/?( _Complex float, _Complex float );
-_Complex double?*?( double, _Complex double ),
-	?/?( double, _Complex double ),
-	?*?( _Complex double, double ),
-	?/?( _Complex double, double ),
-	?*?( _Complex double, _Complex double ),
-	?/?( _Complex double, _Complex double );
-_Complex long double?*?( long double, _Complex long double ),
-	?/?( long double, _Complex long double ),
-	?*?( _Complex long double, long double ),
-	?/?( _Complex long double, long double ),
-	?*?( _Complex long double, _Complex long double ),
-	?/?( _Complex long double, _Complex long double );
-\end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+	?/?( long long unsigned int, long long unsigned int ), ?%?( long long unsigned int, long long unsigned int );
+float?*?( float, float ), ?/?( float, float );
+double?*?( double, double ), ?/?( double, double );
+long double?*?( long double, long double ), ?/?( long double, long double );
+_Complex float?*?( float, _Complex float ), ?/?( float, _Complex float ),
+	?*?( _Complex float, float ), ?/?( _Complex float, float ),
+	?*?( _Complex float, _Complex float ), ?/?( _Complex float, _Complex float );
+_Complex double?*?( double, _Complex double ), ?/?( double, _Complex double ),
+	?*?( _Complex double, double ), ?/?( _Complex double, double ),
+	?*?( _Complex double, _Complex double ), ?/?( _Complex double, _Complex double );
+_Complex long double?*?( long double, _Complex long double ), ?/?( long double, _Complex long double ),
+	?*?( _Complex long double, long double ), ?/?( _Complex long double, long double ),
+	?*?( _Complex long double, _Complex long double ), ?/?( _Complex long double, _Complex long double );
+\end{lstlisting}
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -1951,11 +1475,9 @@
 \begin{rationale}
 {\c11} does not include conversions from the \Index{real type}s to \Index{complex type}s in the
-\Index{usual arithmetic conversion}s.  Instead it specifies conversion of the result of binary
-operations on arguments from mixed type domains. \CFA's predefined operators match that pattern.
+\Index{usual arithmetic conversion}s.  Instead it specifies conversion of the result of binary operations on arguments from mixed type domains. \CFA's predefined operators match that pattern.
 \end{rationale}
 
 \semantics
-The interpretations of multiplicative expressions are the interpretations of the corresponding
-function call.
+The interpretations of multiplicative expressions are the interpretations of the corresponding function call.
 
 \examples
@@ -1966,15 +1488,12 @@
 eat_double( li % i );
 \end{lstlisting}
-``\lstinline$li % i$'' is rewritten as ``\lstinline$?%?(li, i )$''. The valid interpretations
-of \lstinline$?%?(li, i )$, the cost\index{conversion cost} of converting their arguments, and
-the cost of converting the result to \lstinline$double$ (assuming no extended integer types are
-present ) are
+``\lstinline$li % i$'' is rewritten as ``\lstinline$?%?(li, i )$''.
+The valid interpretations of \lstinline$?%?(li, i )$, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to \lstinline$double$ (assuming no extended integer types are present ) are
 \begin{center}
-\begin{tabular}{lcc}
-interpretation & argument cost & result cost \\
+\begin{tabular}{lcc} interpretation & argument cost & result cost \\
 \hline 
 \lstinline$ ?%?( (int)li, i )$										& (unsafe)	& 6	\\
 \lstinline$ ?%?( (unsigned)li,(unsigned)i )$						& (unsafe)	& 5	\\
-\lstinline$ ?%?(li,(long)i )$										& 1			& 4	\\
+\lstinline$ ?%?( li, (long)i )$										& 1			& 4	\\
 \lstinline$ ?%?( (long unsigned)li,(long unsigned)i )$				& 3			& 3	\\
 \lstinline$ ?%?( (long long)li,(long long)i )$						& 5			& 2	\\
@@ -1983,17 +1502,16 @@
 \end{center}
 The best interpretation of \lstinline$eat_double( li, i )$ is
-\lstinline$eat_double( (double)?%?(li, (long)i ))$, which has no unsafe conversions and the
-lowest total cost.
-
-\begin{rationale}
-{\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that
-belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline$int$.If
+\lstinline$eat_double( (double)?%?(li, (long)i ))$, which has no unsafe conversions and the lowest total cost.
+
+\begin{rationale}
+{\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline$int$.If
 \lstinline$s$ is a \lstinline$short int$, ``\lstinline$s *s$'' does not have type \lstinline$short int$;
-it is treated as ``\lstinline$( (int)s ) * ( (int)s )$'', and has type \lstinline$int$. \CFA matches
-that pattern; it does not predefine ``\lstinline$short ?*?( short, short )$''.
-
-These ``missing'' operators limit polymorphism. Consider
-\begin{lstlisting}
-forall( type T | T ?*?( T, T ) ) T square( T );
+it is treated as ``\lstinline$( (int)s ) * ( (int)s )$'', and has type \lstinline$int$. \CFA matches that pattern;
+it does not predefine ``\lstinline$short ?*?( short, short )$''.
+
+These ``missing'' operators limit polymorphism.
+Consider
+\begin{lstlisting}
+forall( otype T | T ?*?( T, T ) ) T square( T );
 short s;
 square( s );
@@ -2001,15 +1519,16 @@
 Since \CFA does not define a multiplication operator for \lstinline$short int$,
 \lstinline$square( s )$ is treated as \lstinline$square( (int)s )$, and the result has type
-\lstinline$int$. This is mildly surprising, but it follows the {\c11} operator pattern.
+\lstinline$int$.
+This is mildly surprising, but it follows the {\c11} operator pattern.
 
 A more troubling example is
 \begin{lstlisting}
-forall( type T | ?*?( T, T ) ) T product( T[], int n );
+forall( otype T | ?*?( T, T ) ) T product( T[], int n );
 short sa[5];
 product( sa, 5);
 \end{lstlisting}
 This has no valid interpretations, because \CFA has no conversion from ``array of
-\lstinline$short int$'' to ``array of \lstinline$int$''. The alternatives in such situations
-include
+\lstinline$short int$'' to ``array of \lstinline$int$''.
+The alternatives in such situations include
 \begin{itemize}
 \item
@@ -2020,6 +1539,5 @@
 \lstinline$product$.
 \item
-Defining \lstinline$product$ to take as an argument a conversion function from the ``small'' type to
-the operator's argument type.
+Defining \lstinline$product$ to take as an argument a conversion function from the ``small'' type to the operator's argument type.
 \end{itemize}
 \end{rationale}
@@ -2043,107 +1561,53 @@
 \predefined
 \begin{lstlisting}
-int?+?( int, int ),
-	?-?( int, int );
-unsigned int?+?( unsigned int, unsigned int ),
-	?-?( unsigned int, unsigned int );
-long int?+?( long int, long int ),
-	?-?( long int, long int );
-long unsigned int?+?( long unsigned int, long unsigned int ),
-	?-?( long unsigned int, long unsigned int );
-long long int?+?( long long int, long long int ),
-	?-?( long long int, long long int );
+int?+?( int, int ), ?-?( int, int );
+unsigned int?+?( unsigned int, unsigned int ), ?-?( unsigned int, unsigned int );
+long int?+?( long int, long int ), ?-?( long int, long int );
+long unsigned int?+?( long unsigned int, long unsigned int ), ?-?( long unsigned int, long unsigned int );
+long long int?+?( long long int, long long int ), ?-?( long long int, long long int );
 long long unsigned int ?+?( long long unsigned int, long long unsigned int ),
 	?-?( long long unsigned int, long long unsigned int );
-float?+?( float, float ),
-	?-?( float, float );
-double?+?( double, double ),
-	?-?( double, double );
-long double?+?( long double, long double ),
-	?-?( long double, long double );
-_Complex float?+?( _Complex float, float ),
-	?-?( _Complex float, float ),
-	?+?( float, _Complex float ),
-	?-?( float, _Complex float ),
-	?+?( _Complex float, _Complex float ),
-	?-?( _Complex float, _Complex float );
-_Complex double?+?( _Complex double, double ),
-	?-?( _Complex double, double ),
-	?+?( double, _Complex double ),
-	?-?( double, _Complex double ),
-	?+?( _Complex double, _Complex double ),
-	?-?( _Complex double, _Complex double );
-_Complex long double?+?( _Complex long double, long double ),
-	?-?( _Complex long double, long double ),
-	?+?( long double, _Complex long double ),
-	?-?( long double, _Complex long double ),
-	?+?( _Complex long double, _Complex long double ),
-	?-?( _Complex long double, _Complex long double );
-
-forall( type T ) T
-	* ?+?( T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, T * ),
-	* ?-?( T *, ptrdiff_t );
-
-forall( type T ) _Atomic T
-	* ?+?( _Atomic T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, _Atomic T * ),
+float?+?( float, float ), ?-?( float, float );
+double?+?( double, double ), ?-?( double, double );
+long double?+?( long double, long double ), ?-?( long double, long double );
+_Complex float?+?( _Complex float, float ), ?-?( _Complex float, float ),
+	?+?( float, _Complex float ), ?-?( float, _Complex float ),
+	?+?( _Complex float, _Complex float ), ?-?( _Complex float, _Complex float );
+_Complex double?+?( _Complex double, double ), ?-?( _Complex double, double ),
+	?+?( double, _Complex double ), ?-?( double, _Complex double ),
+	?+?( _Complex double, _Complex double ), ?-?( _Complex double, _Complex double );
+_Complex long double?+?( _Complex long double, long double ), ?-?( _Complex long double, long double ),
+	?+?( long double, _Complex long double ), ?-?( long double, _Complex long double ),
+	?+?( _Complex long double, _Complex long double ), ?-?( _Complex long double, _Complex long double );
+
+forall( otype T ) T * ?+?( T *, ptrdiff_t ), * ?+?( ptrdiff_t, T * ), * ?-?( T *, ptrdiff_t );
+forall( otype T ) _Atomic T * ?+?( _Atomic T *, ptrdiff_t ), * ?+?( ptrdiff_t, _Atomic T * ),
 	* ?-?( _Atomic T *, ptrdiff_t );
-
-forall( type T ) const T
-	* ?+?( const T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, const T * ),
+forall( otype T ) const T * ?+?( const T *, ptrdiff_t ), * ?+?( ptrdiff_t, const T * ),
 	* ?-?( const T *, ptrdiff_t );
-
-forall( type T ) restrict T
-	* ?+?( restrict T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, restrict T * ),
+forall( otype T ) restrict T * ?+?( restrict T *, ptrdiff_t ), * ?+?( ptrdiff_t, restrict T * ),
 	* ?-?( restrict T *, ptrdiff_t );
-
-forall( type T ) volatile T
-	* ?+?( volatile T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, volatile T * ),
+forall( otype T ) volatile T * ?+?( volatile T *, ptrdiff_t ), * ?+?( ptrdiff_t, volatile T * ),
 	* ?-?( volatile T *, ptrdiff_t );
-
-forall( type T ) _Atomic const T
-	* ?+?( _Atomic const T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, _Atomic const T * ),
+forall( otype T ) _Atomic const T * ?+?( _Atomic const T *, ptrdiff_t ), * ?+?( ptrdiff_t, _Atomic const T * ),
 	* ?-?( _Atomic const T *, ptrdiff_t );
-
-forall( type T ) _Atomic restrict T
-	* ?+?( _Atomic restrict T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, _Atomic restrict T * ),
+forall( otype T ) _Atomic restrict T * ?+?( _Atomic restrict T *, ptrdiff_t ), * ?+?( ptrdiff_t, _Atomic restrict T * ),
 	* ?-?( _Atomic restrict T *, ptrdiff_t );
-
-forall( type T ) _Atomic volatile T
-	* ?+?( _Atomic volatile T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, _Atomic volatile T * ),
+forall( otype T ) _Atomic volatile T * ?+?( _Atomic volatile T *, ptrdiff_t ), * ?+?( ptrdiff_t, _Atomic volatile T * ),
 	* ?-?( _Atomic volatile T *, ptrdiff_t );
-
-forall( type T ) const restrict T
-	* ?+?( const restrict T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, const restrict T * ),
+forall( otype T ) const restrict T * ?+?( const restrict T *, ptrdiff_t ), * ?+?( ptrdiff_t, const restrict T * ),
 	* ?-?( const restrict T *, ptrdiff_t );
-
-forall( type T ) const volatile T
-	* ?+?( const volatile T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, const volatile T * ),
+forall( otype T ) const volatile T * ?+?( const volatile T *, ptrdiff_t ), * ?+?( ptrdiff_t, const volatile T * ),
 	* ?-?( const volatile T *, ptrdiff_t );
-
-forall( type T ) restrict volatile T
-	* ?+?( restrict volatile T *, ptrdiff_t ),
-	* ?+?( ptrdiff_t, restrict volatile T * ),
+forall( otype T ) restrict volatile T * ?+?( restrict volatile T *, ptrdiff_t ), * ?+?( ptrdiff_t, restrict volatile T * ),
 	* ?-?( restrict volatile T *, ptrdiff_t );
-
-forall( type T ) _Atomic const restrict T
-	* ?+?( _Atomic const restrict T *, ptrdiff_t ),
+forall( otype T ) _Atomic const restrict T * ?+?( _Atomic const restrict T *, ptrdiff_t ),
 	* ?+?( ptrdiff_t, _Atomic const restrict T * ),
 	* ?-?( _Atomic const restrict T *, ptrdiff_t );
-
-forall( type T ) ptrdiff_t
+forall( otype T ) ptrdiff_t
 	* ?-?( const restrict volatile T *, const restrict volatile T * ),
 	* ?-?( _Atomic const restrict volatile T *, _Atomic const restrict volatile T * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2152,16 +1616,10 @@
 
 \semantics
-The interpretations of additive expressions are the interpretations of the corresponding function
-calls.
-
-\begin{rationale}
-\lstinline$ptrdiff_t$ is an implementation-defined identifier defined in \lstinline$<stddef.h>$ that
-is synonymous with a signed integral type that is large enough to hold the difference between two
-pointers. It seems reasonable to use it for pointer addition as well. (This is technically a
-difference between \CFA and C, which only specifies that pointer addition uses an \emph{integral}
-argument.) Hence it is also used for subscripting, which is defined in terms of pointer addition.
-The {\c11} standard uses \lstinline$size_t$ in several cases where a library function takes an
-argument that is used as a subscript, but \lstinline$size_t$ is unsuitable here because it is an
-unsigned type.
+The interpretations of additive expressions are the interpretations of the corresponding function calls.
+
+\begin{rationale}
+\lstinline$ptrdiff_t$ is an implementation-defined identifier defined in \lstinline$<stddef.h>$ that is synonymous with a signed integral type that is large enough to hold the difference between two pointers.
+It seems reasonable to use it for pointer addition as well. (This is technically a difference between \CFA and C, which only specifies that pointer addition uses an \emph{integral} argument.) Hence it is also used for subscripting, which is defined in terms of pointer addition.
+The {\c11} standard uses \lstinline$size_t$ in several cases where a library function takes an argument that is used as a subscript, but \lstinline$size_t$ is unsuitable here because it is an unsigned type.
 \end{rationale}
 
@@ -2184,19 +1642,12 @@
 \predefined
 \begin{lstlisting}
-int ?<<?( int, int ),
-	 ?>>?( int, int );
-unsigned int ?<<?( unsigned int, int ),
-	 ?>>?( unsigned int, int );
-long int ?<<?( long int, int ),
-	 ?>>?( long int, int );
-long unsigned int ?<<?( long unsigned int, int ),
-	 ?>>?( long unsigned int, int );
-long long int ?<<?( long long int, int ),
-	 ?>>?( long long int, int );
-long long unsigned int ?<<?( long long unsigned int, int ),
-	 ?>>?( long long unsigned int, int);
-\end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+int ?<<?( int, int ), ?>>?( int, int );
+unsigned int ?<<?( unsigned int, int ), ?>>?( unsigned int, int );
+long int ?<<?( long int, int ), ?>>?( long int, int );
+long unsigned int ?<<?( long unsigned int, int ), ?>>?( long unsigned int, int );
+long long int ?<<?( long long int, int ), ?>>?( long long int, int );
+long long unsigned int ?<<?( long long unsigned int, int ), ?>>?( long long unsigned int, int);
+\end{lstlisting}
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2205,11 +1656,10 @@
 
 \begin{rationale}
-The bitwise shift operators break the usual pattern: they do not convert both operands to a common
-type. The right operand only undergoes \Index{integer promotion}.
+The bitwise shift operators break the usual pattern: they do not convert both operands to a common type.
+The right operand only undergoes \Index{integer promotion}.
 \end{rationale}
 
 \semantics
-The interpretations of a bitwise shift expression are the interpretations of the corresponding
-function calls.
+The interpretations of a bitwise shift expression are the interpretations of the corresponding function calls.
 
 
@@ -2235,43 +1685,23 @@
 \predefined
 \begin{lstlisting}
-int ?<?( int, int ),
-	?<=?( int, int ),
-	?>?( int, int ),
-	?>=?( int, int );
-int ?<?( unsigned int, unsigned int ),
-	?<=?( unsigned int, unsigned int ),
-	?>?( unsigned int, unsigned int ),
-	?>=?( unsigned int, unsigned int );
-int ?<?( long int, long int ),
-	?<=?( long int, long int ),
-	?>?( long int, long int ),
-	?>=?( long int, long int );
-int ?<?( long unsigned int, long unsigned ),
-	?<=?( long unsigned int, long unsigned ),
-	?>?( long unsigned int, long unsigned ),
-	?>=?( long unsigned int, long unsigned );
-int ?<?( long long int, long long int ),
-	?<=?( long long int, long long int ),
-	?>?( long long int, long long int ),
-	?>=?( long long int, long long int );
-int ?<?( long long unsigned int, long long unsigned ),
-	?<=?( long long unsigned int, long long unsigned ),
-	?>?( long long unsigned int, long long unsigned ),
-	?>=?( long long unsigned int, long long unsigned );
-int ?<?( float, float ),
-	?<=?( float, float ),
-	?>?( float, float ),
-	?>=?( float, float );
-int ?<?( double, double ),
-	?<=?( double, double ),
-	?>?( double, double ),
-	?>=?( double, double );
-int ?<?( long double, long double ),
-	?<=?( long double, long double ),
-	?>?( long double, long double ),
-	?>=?( long double, long double );
-
-forall( dtype DT ) int
-	?<?( const restrict volatile DT *, const restrict volatile DT * ),
+int ?<?( int, int ), ?<=?( int, int ),
+	?>?( int, int ), ?>=?( int, int );
+int ?<?( unsigned int, unsigned int ), ?<=?( unsigned int, unsigned int ),
+	?>?( unsigned int, unsigned int ), ?>=?( unsigned int, unsigned int );
+int ?<?( long int, long int ), ?<=?( long int, long int ),
+	?>?( long int, long int ), ?>=?( long int, long int );
+int ?<?( long unsigned int, long unsigned ), ?<=?( long unsigned int, long unsigned ),
+	?>?( long unsigned int, long unsigned ), ?>=?( long unsigned int, long unsigned );
+int ?<?( long long int, long long int ), ?<=?( long long int, long long int ),
+	?>?( long long int, long long int ), ?>=?( long long int, long long int );
+int ?<?( long long unsigned int, long long unsigned ), ?<=?( long long unsigned int, long long unsigned ),
+	?>?( long long unsigned int, long long unsigned ), ?>=?( long long unsigned int, long long unsigned );
+int ?<?( float, float ), ?<=?( float, float ),
+	?>?( float, float ), ?>=?( float, float );
+int ?<?( double, double ), ?<=?( double, double ),
+	?>?( double, double ), ?>=?( double, double );
+int ?<?( long double, long double ), ?<=?( long double, long double ),
+	?>?( long double, long double ), ?>=?( long double, long double );
+forall( dtype DT ) int ?<?( const restrict volatile DT *, const restrict volatile DT * ),
 	?<?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ),
 	?<=?( const restrict volatile DT *, const restrict volatile DT * ),
@@ -2282,6 +1712,5 @@
 	?>=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2293,6 +1722,5 @@
 
 \semantics
-The interpretations of a relational expression are the interpretations of the corresponding function
-call.
+The interpretations of a relational expression are the interpretations of the corresponding function call.
 
 
@@ -2314,41 +1742,22 @@
 \predefined
 \begin{lstlisting}
-int ?==?( int, int ),
-	?!=?( int, int ),
-	?==?( unsigned int, unsigned int ),
-	?!=?( unsigned int, unsigned int ),
-	?==?( long int, long int ),
-	?!=?( long int, long int ),
-	?==?( long unsigned int, long unsigned int ),
-	?!=?( long unsigned int, long unsigned int ),
-	?==?( long long int, long long int ),
-	?!=?( long long int, long long int ),
-	?==?( long long unsigned int, long long unsigned int ),
-	?!=?( long long unsigned int, long long unsigned int ),
-	?==?( float, float ),
-	?!=?( float, float ),
-	?==?( _Complex float, float ),
-	?!=?( _Complex float, float ),
-	?==?( float, _Complex float ),
-	?!=?( float, _Complex float ),
-	?==?( _Complex float, _Complex float ),
-	?!=?( _Complex float, _Complex float ),
-	?==?( double, double ),
-	?!=?( double, double ),
-	?==?( _Complex double, double ),
-	?!=?( _Complex double, double ),
-	?==?( double, _Complex double ),
-	?!=?( double, _Complex double ),
-	?==?( _Complex double, _Complex double ),
-	?!=?( _Complex double, _Complex double ),
-	?==?( long double, long double ),
-	?!=?( long double, long double ),
-	?==?( _Complex long double, long double ),
-	?!=?( _Complex long double, long double ),
-	?==?( long double, _Complex long double ),
-	?!=?( long double, _Complex long double ),
-	?==?( _Complex long double, _Complex long double ),
-	?!=?( _Complex long double, _Complex long double );
-
+int ?==?( int, int ), ?!=?( int, int ),
+	?==?( unsigned int, unsigned int ), ?!=?( unsigned int, unsigned int ),
+	?==?( long int, long int ), ?!=?( long int, long int ),
+	?==?( long unsigned int, long unsigned int ), ?!=?( long unsigned int, long unsigned int ),
+	?==?( long long int, long long int ), ?!=?( long long int, long long int ),
+	?==?( long long unsigned int, long long unsigned int ), ?!=?( long long unsigned int, long long unsigned int ),
+	?==?( float, float ), ?!=?( float, float ),
+	?==?( _Complex float, float ), ?!=?( _Complex float, float ),
+	?==?( float, _Complex float ), ?!=?( float, _Complex float ),
+	?==?( _Complex float, _Complex float ), ?!=?( _Complex float, _Complex float ),
+	?==?( double, double ), ?!=?( double, double ),
+	?==?( _Complex double, double ), ?!=?( _Complex double, double ),
+	?==?( double, _Complex double ), ?!=?( double, _Complex double ),
+	?==?( _Complex double, _Complex double ), ?!=?( _Complex double, _Complex double ),
+	?==?( long double, long double ), ?!=?( long double, long double ),
+	?==?( _Complex long double, long double ), ?!=?( _Complex long double, long double ),
+	?==?( long double, _Complex long double ), ?!=?( long double, _Complex long double ),
+	?==?( _Complex long double, _Complex long double ), ?!=?( _Complex long double, _Complex long double );
 forall( dtype DT ) int
 	?==?( const restrict volatile DT *, const restrict volatile DT * ),
@@ -2375,17 +1784,11 @@
 	?==?( forall( dtype DT2) const DT2*, _Atomic const restrict volatile DT * ),
 	?!=?( forall( dtype DT2) const DT2*, _Atomic const restrict volatile DT * );
-
 forall( ftype FT ) int
-	?==?( FT *, FT * ),
-	?!=?( FT *, FT * ),
-	?==?( FT *, forall( ftype FT2) FT2 * ),
-	?!=?( FT *, forall( ftype FT2) FT2 * ),
-	?==?( forall( ftype FT2) FT2*, FT * ),
-	?!=?( forall( ftype FT2) FT2*, FT * ),
-	?==?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ),
-	?!=?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * );
-\end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+	?==?( FT *, FT * ), ?!=?( FT *, FT * ),
+	?==?( FT *, forall( ftype FT2) FT2 * ), ?!=?( FT *, forall( ftype FT2) FT2 * ),
+	?==?( forall( ftype FT2) FT2*, FT * ), ?!=?( forall( ftype FT2) FT2*, FT * ),
+	?==?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ), ?!=?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * );
+\end{lstlisting}
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2395,23 +1798,17 @@
 
 \begin{rationale}
-The polymorphic equality operations come in three styles: comparisons between pointers of compatible
-types, between pointers to \lstinline$void$ and pointers to object types or incomplete types, and
-between the \Index{null pointer} constant and pointers to any type. In the last case, a special
-constraint rule for null pointer constant operands has been replaced by a consequence of the \CFA
-type system.
+The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to \lstinline$void$ and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type.
+In the last case, a special constraint rule for null pointer constant operands has been replaced by a consequence of the \CFA type system.
 \end{rationale}
 
 \semantics
-The interpretations of an equality expression are the interpretations of the corresponding function
-call.
+The interpretations of an equality expression are the interpretations of the corresponding function call.
 
 \begin{sloppypar}
-The result of an equality comparison between two pointers to predefined functions or predefined
-values is implementation-defined.
+The result of an equality comparison between two pointers to predefined functions or predefined values is implementation-defined.
 \end{sloppypar}
 \begin{rationale}
-The implementation-defined status of equality comparisons allows implementations to use one library
-routine to implement many predefined functions. These optimization are particularly important when
-the predefined functions are polymorphic, as is the case for most pointer operations
+The implementation-defined status of equality comparisons allows implementations to use one library routine to implement many predefined functions.
+These optimization are particularly important when the predefined functions are polymorphic, as is the case for most pointer operations
 \end{rationale}
 
@@ -2439,6 +1836,5 @@
 long long unsigned int ?&?( long long unsigned int, long long unsigned int );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2447,6 +1843,5 @@
 
 \semantics
-The interpretations of a bitwise AND expression are the interpretations of the corresponding
-function call.
+The interpretations of a bitwise AND expression are the interpretations of the corresponding function call.
 
 
@@ -2473,6 +1868,5 @@
 long long unsigned int ?^?( long long unsigned int, long long unsigned int );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2481,6 +1875,5 @@
 
 \semantics
-The interpretations of a bitwise exclusive OR expression are the interpretations of the
-corresponding function call.
+The interpretations of a bitwise exclusive OR expression are the interpretations of the corresponding function call.
 
 
@@ -2507,6 +1900,5 @@
 long long unsigned int ?|?( long long unsigned int, long long unsigned int );
 \end{lstlisting}
-For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the
-rank of \lstinline$int$ there exist
+For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
 % Don't use predefined: keep this out of prelude.cf.
 \begin{lstlisting}
@@ -2515,6 +1907,5 @@
 
 \semantics 
-The interpretations of a bitwise inclusive OR expression are the interpretations of the
-corresponding function call.
+The interpretations of a bitwise inclusive OR expression are the interpretations of the corresponding function call.
 
 
@@ -2528,28 +1919,23 @@
 
 \semantics The operands of the expression ``\lstinline$a && b$'' are treated as
-``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b)!=0)$'', which shall both be
-unambiguous. The expression has only one interpretation, which is of type \lstinline$int$.
-\begin{rationale}
-When the operands of a logical expression are values of built-in types, and ``\lstinline$!=$'' has
-not been redefined for those types, the compiler can optimize away the function calls.
+``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b)!=0)$'', which shall both be unambiguous.
+The expression has only one interpretation, which is of type \lstinline$int$.
+\begin{rationale}
+When the operands of a logical expression are values of built-in types, and ``\lstinline$!=$'' has not been redefined for those types, the compiler can optimize away the function calls.
 
 A common C idiom omits comparisons to \lstinline$0$ in the controlling expressions of loops and
-\lstinline$if$ statements. For instance, the loop below iterates as long as \lstinline$rp$ points
-at a \lstinline$Rational$ value that is non-zero.
-
-\begin{lstlisting}
-extern type Rational;@\use{Rational}@
+\lstinline$if$ statements.
+For instance, the loop below iterates as long as \lstinline$rp$ points at a \lstinline$Rational$ value that is non-zero.
+
+\begin{lstlisting}
+extern otype Rational;@\use{Rational}@
 extern const Rational 0;@\use{0}@
 extern int ?!=?( Rational, Rational );
 Rational *rp;
-
 while ( rp && *rp ) { ... }
 \end{lstlisting}
-The logical expression calls the \lstinline$Rational$ inequality operator, passing
-it \lstinline$*rp$ and the \lstinline$Rational 0$, and getting a 1 or 0 as a result. In
-contrast, {\CC} would apply a programmer-defined \lstinline$Rational$-to-\lstinline$int$
-conversion to \lstinline$*rp$ in the equivalent situation. The conversion to \lstinline$int$ would
-produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was
-not written with this situation in mind.
+The logical expression calls the \lstinline$Rational$ inequality operator, passing it \lstinline$*rp$ and the \lstinline$Rational 0$, and getting a 1 or 0 as a result.
+In contrast, {\CC} would apply a programmer-defined \lstinline$Rational$-to-\lstinline$int$ conversion to \lstinline$*rp$ in the equivalent situation.
+The conversion to \lstinline$int$ would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind.
 \end{rationale}
 
@@ -2565,7 +1951,6 @@
 \semantics
 
-The operands of the expression ``\lstinline$a || b$'' are treated as ``\lstinline$(int)((a)!=0)$''
-and ``\lstinline$(int)((b))!=0)$'', which shall both be unambiguous. The expression has only one
-interpretation, which is of type \lstinline$int$.
+The operands of the expression ``\lstinline$a || b$'' are treated as ``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b))!=0)$'', which shall both be unambiguous.
+The expression has only one interpretation, which is of type \lstinline$int$.
 
 
@@ -2580,92 +1965,52 @@
 
 \semantics
-In the conditional expression\use{?:} ``\lstinline$a?b:c$'', if the second and
-third operands both have an interpretation with \lstinline$void$ type, then the expression has an
-interpretation with type \lstinline$void$, equivalent to
+In the conditional expression\use{?:} ``\lstinline$a?b:c$'', if the second and third operands both have an interpretation with \lstinline$void$ type, then the expression has an interpretation with type \lstinline$void$, equivalent to
 \begin{lstlisting}
 ( int)(( a)!=0) ? ( void)( b) : ( void)( c)
 \end{lstlisting}
 
-If the second and third operands both have interpretations with non-\lstinline$void$ types, the
-expression is treated as if it were the call ``\lstinline$cond((a)!=0, b, c)$'',
-with \lstinline$cond$ declared as
-\begin{lstlisting}
-forall( type T ) T cond( int, T, T );
- 
-forall( dtype D ) void
-	* cond( int, D *, void * ),
-	* cond( int, void *, D * );
-	
-forall( dtype D ) _atomic void
-	* cond( int, _Atomic D *, _Atomic void * ),
-	* cond( int, _Atomic void *, _Atomic D * );
-
-forall( dtype D ) const void
-	* cond( int, const D *, const void * ),
-	* cond( int, const void *, const D * );
-
-forall( dtype D ) restrict void
-	* cond( int, restrict D *, restrict void * ),
-	* cond( int, restrict void *, restrict D * );
-
-forall( dtype D ) volatile void
-	* cond( int, volatile D *, volatile void * ),
-	* cond( int, volatile void *, volatile D * );
-
-forall( dtype D ) _Atomic const void
-	* cond( int, _Atomic const D *, _Atomic const void * ),
-	* cond( int, _Atomic const void *, _Atomic const D * );
-
-forall( dtype D ) _Atomic restrict void
-	* cond( int, _Atomic restrict D *, _Atomic restrict void * ),
-	* cond( int, _Atomic restrict void *, _Atomic restrict D * );
-
-forall( dtype D ) _Atomic volatile void
-	* cond( int, _Atomic volatile D *, _Atomic volatile void * ),
-	* cond( int, _Atomic volatile void *, _Atomic volatile D * );
-
-forall( dtype D ) const restrict void
-	* cond( int, const restrict D *, const restrict void * ),
-	* cond( int, const restrict void *, const restrict D * );
-
-forall( dtype D ) const volatile void
-	* cond( int, const volatile D *, const volatile void * ),
-	* cond( int, const volatile void *, const volatile D * );
-
-forall( dtype D ) restrict volatile void
-	* cond( int, restrict volatile D *, restrict volatile void * ),
-	* cond( int, restrict volatile void *, restrict volatile D * );
-
-forall( dtype D ) _Atomic const restrict void
-	* cond( int, _Atomic const restrict D *, _Atomic const restrict void * ),
+If the second and third operands both have interpretations with non-\lstinline$void$ types, the expression is treated as if it were the call ``\lstinline$cond((a)!=0, b, c)$'', with \lstinline$cond$ declared as
+\begin{lstlisting}
+forall( otype T ) T cond( int, T, T );
+forall( dtype D ) void * cond( int, D *, void * ), * cond( int, void *, D * );
+forall( dtype D ) _atomic void * cond(
+	int, _Atomic D *, _Atomic void * ), * cond( int, _Atomic void *, _Atomic D * );
+forall( dtype D ) const void * cond(
+	int, const D *, const void * ), * cond( int, const void *, const D * );
+forall( dtype D ) restrict void * cond(
+	int, restrict D *, restrict void * ), * cond( int, restrict void *, restrict D * );
+forall( dtype D ) volatile void * cond(
+	int, volatile D *, volatile void * ), * cond( int, volatile void *, volatile D * );
+forall( dtype D ) _Atomic const void * cond(
+	int, _Atomic const D *, _Atomic const void * ), * cond( int, _Atomic const void *, _Atomic const D * );
+forall( dtype D ) _Atomic restrict void * cond(
+	int, _Atomic restrict D *, _Atomic restrict void * ), * cond( int, _Atomic restrict void *, _Atomic restrict D * );
+forall( dtype D ) _Atomic volatile void * cond(
+	int, _Atomic volatile D *, _Atomic volatile void * ), * cond( int, _Atomic volatile void *, _Atomic volatile D * );
+forall( dtype D ) const restrict void * cond(
+	int, const restrict D *, const restrict void * ), * cond( int, const restrict void *, const restrict D * );
+forall( dtype D ) const volatile void * cond(
+	int, const volatile D *, const volatile void * ), * cond( int, const volatile void *, const volatile D * );
+forall( dtype D ) restrict volatile void * cond(
+	int, restrict volatile D *, restrict volatile void * ), * cond( int, restrict volatile void *, restrict volatile D * );
+forall( dtype D ) _Atomic const restrict void * cond(
+	int, _Atomic const restrict D *, _Atomic const restrict void * ),
 	* cond( int, _Atomic const restrict void *, _Atomic const restrict D * );
-
-forall( dtype D ) _Atomic const volatile void
-	* cond( int, _Atomic const volatile D *, _Atomic const volatile void * ),
+forall( dtype D ) _Atomic const volatile void * cond(
+	int, _Atomic const volatile D *, _Atomic const volatile void * ),
 	* cond( int, _Atomic const volatile void *, _Atomic const volatile D * );
-
-forall( dtype D ) _Atomic restrict volatile void
-	* cond( int, _Atomic restrict volatile D *,
-	 _Atomic restrict volatile void * ),
-	* cond( int, _Atomic restrict volatile void *,
-	 _Atomic restrict volatile D * );
-
-forall( dtype D ) const restrict volatile void
-	* cond( int, const restrict volatile D *,
-	 const restrict volatile void * ),
-	* cond( int, const restrict volatile void *,
-	 const restrict volatile D * );
-
-forall( dtype D ) _Atomic const restrict volatile void
-	* cond( int, _Atomic const restrict volatile D *,
-	 _Atomic const restrict volatile void * ),
-	* cond( int, _Atomic const restrict volatile void *,
-	 _Atomic const restrict volatile D * );
-\end{lstlisting}
-
-\begin{rationale}
-The object of the above is to apply the \Index{usual arithmetic conversion}s when the second and
-third operands have arithmetic type, and to combine the qualifiers of the second and third operands
-if they are pointers.
+forall( dtype D ) _Atomic restrict volatile void * cond(
+	int, _Atomic restrict volatile D *, _Atomic restrict volatile void * ),
+	* cond( int, _Atomic restrict volatile void *, _Atomic restrict volatile D * );
+forall( dtype D ) const restrict volatile void * cond(
+	int, const restrict volatile D *, const restrict volatile void * ),
+	* cond( int, const restrict volatile void *, const restrict volatile D * );
+forall( dtype D ) _Atomic const restrict volatile void * cond(
+	int, _Atomic const restrict volatile D *, _Atomic const restrict volatile void * ),
+	* cond( int, _Atomic const restrict volatile void *, _Atomic const restrict volatile D * );
+\end{lstlisting}
+
+\begin{rationale}
+The object of the above is to apply the \Index{usual arithmetic conversion}s when the second and third operands have arithmetic type, and to combine the qualifiers of the second and third operands if they are pointers.
 \end{rationale}
 
@@ -2685,6 +2030,5 @@
 rand() ? cip : vip;
 \end{lstlisting}
-The expression has type \lstinline$const volatile int *$, with safe conversions applied to the second
-and third operands to add \lstinline$volatile$ and \lstinline$const$ qualifiers, respectively.
+The expression has type \lstinline$const volatile int *$, with safe conversions applied to the second and third operands to add \lstinline$volatile$ and \lstinline$const$ qualifiers, respectively.
 
 \begin{lstlisting}
@@ -2708,5 +2052,6 @@
 
 \rewriterules
-Let ``\(\leftarrow\)'' be any of the assignment operators. Then
+Let ``\(\leftarrow\)'' be any of the assignment operators.
+Then
 \use{?=?}\use{?*=?}\use{?/=?}\use{?%=?}\use{?+=?}\use{?-=?}
 \use{?>>=?}\use{?&=?}\use{?^=?}\use{?"|=?}%use{?<<=?}
@@ -2716,14 +2061,10 @@
 
 \semantics
-Each interpretation of the left operand of an assignment expression is considered separately. For
-each interpretation that is a bit-field or is declared with the \lstinline$register$ storage class
-specifier, the expression has one valid interpretation, with the type of the left operand. The
-right operand is cast to that type, and the assignment expression is ambiguous if either operand is.
-For the remaining interpretations, the expression is rewritten, and the interpretations of the
-assignment expression are the interpretations of the corresponding function call. Finally, all
-interpretations of the expression produced for the different interpretations of the left operand are
-combined to produce the interpretations of the expression as a whole; where interpretations have
-compatible result types, the best interpretations are selected in the manner described for function
-call expressions.
+Each interpretation of the left operand of an assignment expression is considered separately.
+For each interpretation that is a bit-field or is declared with the \lstinline$register$ storage class specifier, the expression has one valid interpretation, with the type of the left operand.
+The right operand is cast to that type, and the assignment expression is ambiguous if either operand is.
+For the remaining interpretations, the expression is rewritten, and the interpretations of the assignment expression are the interpretations of the corresponding function call.
+Finally, all interpretations of the expression produced for the different interpretations of the left operand are combined to produce the interpretations of the expression as a whole;
+where interpretations have compatible result types, the best interpretations are selected in the manner described for function call expressions.
 
 
@@ -2790,21 +2131,16 @@
 	?=?( volatile _Complex long double *, _Complex long double ),
 	?=?( _Atomic volatile _Complex long double *, _Atomic _Complex long double );
-
 forall( ftype FT ) FT
 	* ?=?( FT * volatile *, FT * ),
 	* ?=?( FT * volatile *, forall( ftype F ) F * );
-
 forall( ftype FT ) FT const
 	* ?=?( FT const * volatile *, FT const * ),
 	* ?=?( FT const * volatile *, forall( ftype F ) F * );
-
 forall( ftype FT ) FT volatile
 	* ?=?( FT volatile * volatile *, FT * ),
 	* ?=?( FT volatile * volatile *, forall( ftype F ) F * );
-
 forall( ftype FT ) FT const
 	* ?=?( FT const volatile * volatile *, FT const * ),
 	* ?=?( FT const volatile * volatile *, forall( ftype F ) F * );
-
 forall( dtype DT ) DT
 	* ?=?( DT * restrict volatile *, DT * ),
@@ -2814,5 +2150,4 @@
 	* ?=?( DT * _Atomic restrict volatile *, void * ),
 	* ?=?( DT * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic
 	* ?=?( _Atomic DT * restrict volatile *, DT _Atomic * ),
@@ -2822,5 +2157,4 @@
 	* ?=?( _Atomic DT * _Atomic restrict volatile *, void * ),
 	* ?=?( _Atomic DT * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT const
 	* ?=?( DT const * restrict volatile *, DT const * ),
@@ -2830,5 +2164,4 @@
 	* ?=?( DT const * _Atomic restrict volatile *, void const * ),
 	* ?=?( DT const * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT restrict
 	* ?=?( restrict DT * restrict volatile *, DT restrict * ),
@@ -2838,5 +2171,4 @@
 	* ?=?( restrict DT * _Atomic restrict volatile *, void * ),
 	* ?=?( restrict DT * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT volatile
 	* ?=?( DT volatile * restrict volatile *, DT volatile * ),
@@ -2846,5 +2178,4 @@
 	* ?=?( DT volatile * _Atomic restrict volatile *, void volatile * ),
 	* ?=?( DT volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic const
 	* ?=?( DT _Atomic const * restrict volatile *, DT _Atomic const * ),
@@ -2854,5 +2185,4 @@
 	* ?=?( DT _Atomic const * _Atomic restrict volatile *, void const * ),
 	* ?=?( DT _Atomic const * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic restrict
 	* ?=?( _Atomic restrict DT * restrict volatile *, DT _Atomic restrict * ),
@@ -2862,5 +2192,4 @@
 	* ?=?( _Atomic restrict DT * _Atomic restrict volatile *, void * ),
 	* ?=?( _Atomic restrict DT * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic volatile
 	* ?=?( DT _Atomic volatile * restrict volatile *, DT _Atomic volatile * ),
@@ -2870,5 +2199,4 @@
 	* ?=?( DT _Atomic volatile * _Atomic restrict volatile *, void volatile * ),
 	* ?=?( DT _Atomic volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT const restrict
 	* ?=?( DT const restrict * restrict volatile *, DT const restrict * ),
@@ -2878,5 +2206,4 @@
 	* ?=?( DT const restrict * _Atomic restrict volatile *, void const * ),
 	* ?=?( DT const restrict * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT const volatile
 	* ?=?( DT const volatile * restrict volatile *, DT const volatile * ),
@@ -2886,5 +2213,4 @@
 	* ?=?( DT const volatile * _Atomic restrict volatile *, void const volatile * ),
 	* ?=?( DT const volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT restrict volatile
 	* ?=?( DT restrict volatile * restrict volatile *, DT restrict volatile * ),
@@ -2894,5 +2220,4 @@
 	* ?=?( DT restrict volatile * _Atomic restrict volatile *, void volatile * ),
 	* ?=?( DT restrict volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic const restrict
 	* ?=?( DT _Atomic const restrict * restrict volatile *,
@@ -2908,5 +2233,4 @@
 	* ?=?( DT _Atomic const restrict * _Atomic restrict volatile *,
 	 forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic const volatile
 	* ?=?( DT _Atomic const volatile * restrict volatile *,
@@ -2922,5 +2246,4 @@
 	* ?=?( DT _Atomic const volatile * _Atomic restrict volatile *,
 	 forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic restrict volatile
 	* ?=?( DT _Atomic restrict volatile * restrict volatile *,
@@ -2936,5 +2259,4 @@
 	* ?=?( DT _Atomic restrict volatile * _Atomic restrict volatile *,
 	 forall( dtype D ) D * );
-
 forall( dtype DT ) DT const restrict volatile
 	* ?=?( DT const restrict volatile * restrict volatile *,
@@ -2950,5 +2272,4 @@
 	* ?=?( DT const restrict volatile * _Atomic restrict volatile *,
 	 forall( dtype D ) D * );
-
 forall( dtype DT ) DT _Atomic const restrict volatile
 	* ?=?( DT _Atomic const restrict volatile * restrict volatile *,
@@ -2964,22 +2285,15 @@
 	* ?=?( DT _Atomic const restrict volatile * _Atomic restrict volatile *,
 	 forall( dtype D ) D * );
-
 forall( dtype DT ) void
 	* ?=?( void * restrict volatile *, DT * );
-
 forall( dtype DT ) void const
 	* ?=?( void const * restrict volatile *, DT const * );
-
 forall( dtype DT ) void volatile
 	* ?=?( void volatile * restrict volatile *, DT volatile * );
-
 forall( dtype DT ) void const volatile
 	* ?=?( void const volatile * restrict volatile *, DT const volatile * );
 \end{lstlisting}
 \begin{rationale}
-The pattern of overloadings for simple assignment resembles that of pointer increment and decrement,
-except that the polymorphic pointer assignment functions declare a \lstinline$dtype$ parameter,
-instead of a \lstinline$type$ parameter, because the left operand may be a pointer to an incomplete
-type.
+The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a \lstinline$dtype$ parameter, instead of a \lstinline$type$ parameter, because the left operand may be a pointer to an incomplete type.
 \end{rationale}
 
@@ -3006,11 +2320,9 @@
 
 \semantics
-The structure assignment functions provide member-wise assignment; each non-array member and each
-element of each array member of the right argument is assigned to the corresponding member or
-element of the left argument using the assignment function defined for its type. All other
-assignment functions have the same effect as the corresponding C assignment expression.
-\begin{rationale}
-Note that, by default, union assignment\index{deficiencies!union assignment} uses C semantics---that
-is, bitwise copy---even if some of the union members have programmer-defined assignment functions.
+The structure assignment functions provide member-wise assignment;
+each non-array member and each element of each array member of the right argument is assigned to the corresponding member or element of the left argument using the assignment function defined for its type.
+All other assignment functions have the same effect as the corresponding C assignment expression.
+\begin{rationale}
+Note that, by default, union assignment\index{deficiencies!union assignment} uses C semantics---that is, bitwise copy---even if some of the union members have programmer-defined assignment functions.
 \end{rationale}
 
@@ -3020,95 +2332,80 @@
 \predefined
 \begin{lstlisting}
-forall( type T ) T
+forall( otype T ) T
 	* ?+=?( T * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic
+forall( otype T ) T _Atomic
 	* ?+=?( T _Atomic * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T const
+forall( otype T ) T const
 	* ?+=?( T const * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T const * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T restrict
+forall( otype T ) T restrict
 	* ?+=?( T restrict * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T restrict * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T restrict * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T restrict * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T volatile
+forall( otype T ) T volatile
 	* ?+=?( T volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic const
+forall( otype T ) T _Atomic const
 	* ?+=?( T _Atomic const restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic const _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic restrict
+forall( otype T ) T _Atomic restrict
 	* ?+=?( T _Atomic restrict * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic restrict * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic restrict * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic restrict * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic volatile
+forall( otype T ) T _Atomic volatile
 	* ?+=?( T _Atomic volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T const restrict
+forall( otype T ) T const restrict
 	* ?+=?( T const restrict * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const restrict * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T const restrict * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const restrict * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T const volatile
+forall( otype T ) T const volatile
 	* ?+=?( T const volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T const volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T restrict volatile
+forall( otype T ) T restrict volatile
 	* ?+=?( T restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic const restrict
+forall( otype T ) T _Atomic const restrict
 	* ?+=?( T _Atomic const restrict * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const restrict * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic const restrict * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const restrict * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic const volatile
+forall( otype T ) T _Atomic const volatile
 	* ?+=?( T _Atomic const volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic const volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic restrict volatile
+forall( otype T ) T _Atomic restrict volatile
 	* ?+=?( T _Atomic restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T _Atomic restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T const restrict volatile
+forall( otype T ) T const restrict volatile
 	* ?+=?( T const restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?+=?( T const restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
 	* ?-=?( T const restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
-
-forall( type T ) T _Atomic const restrict volatile
+forall( otype T ) T _Atomic const restrict volatile
 	* ?+=?( T _Atomic const restrict volatile * restrict volatile *, ptrdiff_t ),
 	* ?-=?( T _Atomic const restrict volatile * restrict volatile *, ptrdiff_t ),
@@ -3321,6 +2618,6 @@
 \semantics
 In the comma expression ``\lstinline$a, b$'', the first operand is interpreted as
-``\lstinline$( void )(a)$'', which shall be unambiguous\index{ambiguous interpretation}. The
-interpretations of the expression are the interpretations of the second operand.
+``\lstinline$( void )(a)$'', which shall be unambiguous\index{ambiguous interpretation}.
+The interpretations of the expression are the interpretations of the second operand.
 
 
@@ -3337,31 +2634,24 @@
 
 \constraints
-If an identifier has \Index{no linkage}, there shall be no more than one declaration of the
-identifier ( in a declarator or type specifier ) with compatible types in the same scope and in the
-same name space, except that:
+If an identifier has \Index{no linkage}, there shall be no more than one declaration of the identifier ( in a declarator or type specifier ) with compatible types in the same scope and in the same name space, except that:
 \begin{itemize}
-\item
-a typedef name may be redefined to denote the same type as it currently does, provided that type is
-not a variably modified type;
-\item
-tags may be redeclared as specified in section 6.7.2.3 of the {\c11} standard.
+\item a typedef name may be redefined to denote the same type as it currently does, provided that type is not a variably modified type;
+\item tags may be redeclared as specified in section 6.7.2.3 of the {\c11} standard.
 \end{itemize}
 \begin{rationale}
-This constraint adds the phrase ``with compatible types'' to the {\c11} constraint, to allow
-overloading.
-\end{rationale}
-
-An identifier declared by a type declaration shall not be redeclared as a parameter in a function
-definition whose declarator includes an identifier list.
-\begin{rationale}
-This restriction echos {\c11}'s ban on the redeclaration of typedef names as parameters. This
-avoids an ambiguity between old-style function declarations and new-style function prototypes:
+This constraint adds the phrase ``with compatible types'' to the {\c11} constraint, to allow overloading.
+\end{rationale}
+
+An identifier declared by a type declaration shall not be redeclared as a parameter in a function definition whose declarator includes an identifier list.
+\begin{rationale}
+This restriction echos {\c11}'s ban on the redeclaration of typedef names as parameters.
+This avoids an ambiguity between old-style function declarations and new-style function prototypes:
 \begin{lstlisting}
 void f( Complex,	// ... 3000 characters ...
 void g( Complex,	// ... 3000 characters ...
-int Complex; { ... }
-\end{lstlisting}
-Without the rule, \lstinline$Complex$ would be a type in the first case, and a parameter name in the
-second.
+int Complex;
+{ ... }
+\end{lstlisting}
+Without the rule, \lstinline$Complex$ would be a type in the first case, and a parameter name in the second.
 \end{rationale}
 
@@ -3382,7 +2672,5 @@
 
 \semantics 
-\CFA extends the {\c11} definition of \define{anonymous structure} to include structure
-specifiers with tags, and extends the {\c11} definition of \define{anonymous union} to include union
-specifiers with tags.
+\CFA extends the {\c11} definition of \define{anonymous structure} to include structure specifiers with tags, and extends the {\c11} definition of \define{anonymous union} to include union specifiers with tags.
 \begin{rationale}
 This extension imitates an extension in the Plan 9 C compiler \cite{Thompson90new}.
@@ -3401,10 +2689,9 @@
 cp.x = 0;
 cp.color = RED;
-
 struct literal {@\impl{literal}@
 	enum { NUMBER, STRING } tag;
 	union {
-	 double n;
-	 char *s;
+		double n;
+		char *s;
 	};
 };
@@ -3428,21 +2715,17 @@
 \begin{comment}
 \constraints
-If the \nonterm{declaration-specifiers} of a declaration that contains a \nonterm{forall-specifier}
-declares a structure or union tag, the types of the members of the structure or union shall not use
-any of the type identifiers declared by the \nonterm{type-parameter-list}.
-\begin{rationale}
-This sort of declaration is illegal because the scope of the type identifiers ends at the end of the
-declaration, but the scope of the structure tag does not.
-\begin{lstlisting}
-forall( type T ) struct Pair { T a, b; } mkPair( T, T ); // illegal 
-\end{lstlisting}
-If an instance of \lstinline$struct Pair$ was declared later in the current scope, what would the
-members' type be?
+If the \nonterm{declaration-specifiers} of a declaration that contains a \nonterm{forall-specifier} declares a structure or union tag, the types of the members of the structure or union shall not use any of the type identifiers declared by the \nonterm{type-parameter-list}.
+\begin{rationale}
+This sort of declaration is illegal because the scope of the type identifiers ends at the end of the declaration, but the scope of the structure tag does not.
+\begin{lstlisting}
+forall( otype T ) struct Pair { T a, b;
+} mkPair( T, T ); // illegal 
+\end{lstlisting}
+If an instance of \lstinline$struct Pair$ was declared later in the current scope, what would the members' type be?
 \end{rationale}
 \end{comment}
 
 \semantics
-The \nonterm{type-parameter-list}s and assertions of the \nonterm{forall-specifier}s declare type
-identifiers, function and object identifiers with \Index{no linkage}.
+The \nonterm{type-parameter-list}s and assertions of the \nonterm{forall-specifier}s declare type identifiers, function and object identifiers with \Index{no linkage}.
 
 If, in the declaration ``\lstinline$T D$'', \lstinline$T$ contains \nonterm{forall-specifier}s and
@@ -3450,54 +2733,42 @@
 \begin{lstlisting}
 D( @\normalsize\nonterm{parameter-type-list}@ )
-\end{lstlisting}
-then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred
-parameter} of the function declarator if and only if it is not an inferred parameter of a function
-declarator in \lstinline$D$, and it is used in the type of a parameter in the following
+\end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in \lstinline$D$, and it is used in the type of a parameter in the following
 \nonterm{type-parameter-list} or it and an inferred parameter are used as arguments of a
-\Index{specification} in one of the \nonterm{forall-specifier}s. The identifiers declared by
-assertions that use an inferred parameter of a function declarator are \Index{assertion parameter}s
-of that function declarator.
+\Index{specification} in one of the \nonterm{forall-specifier}s.
+The identifiers declared by assertions that use an inferred parameter of a function declarator are \Index{assertion parameter}s of that function declarator.
 
 \begin{comment}
 \begin{rationale}
-Since every inferred parameter is used by some parameter, inference can be understood as a single
-bottom-up pass over the expression tree, that only needs to apply local reasoning at each node.
+Since every inferred parameter is used by some parameter, inference can be understood as a single bottom-up pass over the expression tree, that only needs to apply local reasoning at each node.
 
 If this restriction were lifted, it would be possible to write
 \begin{lstlisting}
-forall( type T ) T * alloc( void );@\use{alloc}@
-int *p = alloc();
+forall( otype T ) T * alloc( void );@\use{alloc}@ int *p = alloc();
 \end{lstlisting}
 Here \lstinline$alloc()$ would receive \lstinline$int$ as an inferred argument, and return an
-\lstinline$int *$. In general, if a call to \lstinline$alloc()$ is a subexpression of an expression
-involving polymorphic functions and overloaded identifiers, there could be considerable distance
-between the call and the subexpression that causes \lstinline$T$ to be bound.
+\lstinline$int *$.
+In general, if a call to \lstinline$alloc()$ is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes \lstinline$T$ to be bound.
 
 With the current restriction, \lstinline$alloc()$ must be given an argument that determines
 \lstinline$T$:
 \begin{lstlisting}
-forall( type T ) T * alloc( T initial_value );@\use{alloc}@
+forall( otype T ) T * alloc( T initial_value );@\use{alloc}@
 \end{lstlisting}
 \end{rationale}
 \end{comment}
 
-If a function declarator is part of a function definition, its inferred parameters and assertion
-parameters have \Index{block scope}; otherwise, identifiers declared by assertions have a
+If a function declarator is part of a function definition, its inferred parameters and assertion parameters have \Index{block scope};
+otherwise, identifiers declared by assertions have a
 \define{declaration scope}, which terminates at the end of the \nonterm{declaration}.
 
 A function type that has at least one inferred parameter is a \define{polymorphic function} type.
-Function types with no inferred parameters are \define{monomorphic function} types. One function
-type is \define{less polymorphic} than another if it has fewer inferred parameters, or if it has the
-same number of inferred parameters and fewer of its explicit parameters have types that depend on an
-inferred parameter.
-
-The names of inferred parameters and the order of identifiers in forall specifiers are not relevant
-to polymorphic function type compatibility. Let $f$ and $g$ be two polymorphic function types with
-the same number of inferred parameters, and let $f_i$ and $g_i$ be the inferred parameters of $f$
-and $g$ in their order of occurance in the function types' \nonterm{parameter-type-list}s. Let $f'$
-be $f$ with every occurrence of $f_i$ replaced by $g_i$, for all $i$. Then $f$ and $g$ are
-\Index{compatible type}s if $f'$'s and $g$'s return types and parameter lists are compatible, and if
-for every assertion parameter of $f'$ there is an assertion parameter in $g$ with the same
-identifier and compatible type, and vice versa.
+Function types with no inferred parameters are \define{monomorphic function} types.
+One function type is \define{less polymorphic} than another if it has fewer inferred parameters, or if it has the same number of inferred parameters and fewer of its explicit parameters have types that depend on an inferred parameter.
+
+The names of inferred parameters and the order of identifiers in forall specifiers are not relevant to polymorphic function type compatibility.
+Let $f$ and $g$ be two polymorphic function types with the same number of inferred parameters, and let $f_i$ and $g_i$ be the inferred parameters of $f$ and $g$ in their order of occurance in the function types' \nonterm{parameter-type-list}s.
+Let $f'$ be $f$ with every occurrence of $f_i$ replaced by $g_i$, for all $i$.
+Then $f$ and $g$ are
+\Index{compatible type}s if $f'$'s and $g$'s return types and parameter lists are compatible, and if for every assertion parameter of $f'$ there is an assertion parameter in $g$ with the same identifier and compatible type, and vice versa.
 
 \examples
@@ -3505,5 +2776,5 @@
 \begin{lstlisting}
 int fi( int );
-forall( type T ) T fT( T );
+forall( otype T ) T fT( T );
 \end{lstlisting}
 \lstinline$fi()$ takes an \lstinline$int$ and returns an \lstinline$int$. \lstinline$fT()$ takes a
@@ -3511,75 +2782,61 @@
 \begin{lstlisting}
 int (*pfi )( int ) = fi;
-forall( type T ) T (*pfT )( T ) = fT;
-\end{lstlisting}
-\lstinline$pfi$ and \lstinline$pfT$ are pointers to functions. \lstinline$pfT$ is not
-polymorphic, but the function it points at is.
+forall( otype T ) T (*pfT )( T ) = fT;
+\end{lstlisting}
+\lstinline$pfi$ and \lstinline$pfT$ are pointers to functions. \lstinline$pfT$ is not polymorphic, but the function it points at is.
 \begin{lstlisting}
 int (*fvpfi( void ))( int ) {
 	return pfi;
 }
-forall( type T ) T (*fvpfT( void ))( T ) {
+forall( otype T ) T (*fvpfT( void ))( T ) {
 	return pfT;
 }
 \end{lstlisting}
-\lstinline$fvpfi()$ and \lstinline$fvpfT()$ are functions taking no arguments and returning pointers
-to functions. \lstinline$fvpfT()$ is monomorphic, but the function that its return value points
-at is polymorphic.
-\begin{lstlisting}
-forall( type T ) int ( *fTpfi( T ) )( int );
-forall( type T ) T ( *fTpfT( T ) )( T );
-forall( type T, type U ) U ( *fTpfU( T ) )( U );
-\end{lstlisting}
-\lstinline$fTpfi()$ is a polymorphic function that returns a pointer to a monomorphic function
-taking an integer and returning an integer. It could return \lstinline$pfi$. \lstinline$fTpfT()$
-is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
-\lstinline$T$, where \lstinline$T$ is an inferred parameter of \lstinline$fTpfT()$. For instance,
-in the expression ``\lstinline$fTpfT(17)$'', \lstinline$T$ is inferred to be \lstinline$int$, and
-the returned value would have type \lstinline$int ( * )( int )$. ``\lstinline$fTpfT(17)(13)$'' and
+\lstinline$fvpfi()$ and \lstinline$fvpfT()$ are functions taking no arguments and returning pointers to functions. \lstinline$fvpfT()$ is monomorphic, but the function that its return value points at is polymorphic.
+\begin{lstlisting}
+forall( otype T ) int ( *fTpfi( T ) )( int );
+forall( otype T ) T ( *fTpfT( T ) )( T );
+forall( otype T, otype U ) U ( *fTpfU( T ) )( U );
+\end{lstlisting}
+\lstinline$fTpfi()$ is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer.
+It could return \lstinline$pfi$. \lstinline$fTpfT()$ is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
+\lstinline$T$, where \lstinline$T$ is an inferred parameter of \lstinline$fTpfT()$.
+For instance, in the expression ``\lstinline$fTpfT(17)$'', \lstinline$T$ is inferred to be \lstinline$int$, and the returned value would have type \lstinline$int ( * )( int )$. ``\lstinline$fTpfT(17)(13)$'' and
 ``\lstinline$fTpfT("yes")("no")$'' are legal, but ``\lstinline$fTpfT(17)("no")$'' is illegal.
-\lstinline$fTpfU()$ is polymorphic ( in type \lstinline$T$), and returns a pointer to a function that
-is polymorphic ( in type \lstinline$U$). ``\lstinline$f5(17)("no")$'' is a legal expression of type
+\lstinline$fTpfU()$ is polymorphic ( in type \lstinline$T$), and returns a pointer to a function that is polymorphic ( in type \lstinline$U$). ``\lstinline$f5(17)("no")$'' is a legal expression of type
 \lstinline$char *$.
 \begin{lstlisting}
-forall( type T, type U, type V ) U * f( T *, U, V * const );
-forall( type U, type V, type W ) U * g( V *, U, W * const );
-\end{lstlisting}
-The functions \lstinline$f()$ and \lstinline$g()$ have compatible types. Let \(f\) and \(g\) be
-their types; then \(f_1\) = \lstinline$T$, \(f_2\) = \lstinline$U$, \(f_3\) = \lstinline$V$, \(g_1\)
-= \lstinline$V$, \(g_2\) = \lstinline$U$, and \(g_3\) = \lstinline$W$. Replacing every \(f_i\)
-by \(g_i\) in \(f\) gives
-\begin{lstlisting}
-forall( type V, type U, type W ) U * f( V *, U, W * const );
-\end{lstlisting}
-which has a return type and parameter list that is compatible with \(g\).
-\begin{rationale}
-The word ``\lstinline$type$'' in a forall specifier is redundant at the moment, but I want to leave
-room for inferred parameters of ordinary types in case parameterized types get added one day.
+forall( otype T, otype U, otype V ) U * f( T *, U, V * const );
+forall( otype U, otype V, otype W ) U * g( V *, U, W * const );
+\end{lstlisting}
+The functions \lstinline$f()$ and \lstinline$g()$ have compatible types.
+Let \(f\) and \(g\) be their types;
+then \(f_1\) = \lstinline$T$, \(f_2\) = \lstinline$U$, \(f_3\) = \lstinline$V$, \(g_1\)
+= \lstinline$V$, \(g_2\) = \lstinline$U$, and \(g_3\) = \lstinline$W$.
+Replacing every \(f_i\) by \(g_i\) in \(f\) gives
+\begin{lstlisting}
+forall( otype V, otype U, otype W ) U * f( V *, U, W * const );
+\end{lstlisting} which has a return type and parameter list that is compatible with \(g\).
+\begin{rationale}
+The word ``\lstinline$type$'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day.
 
 Even without parameterized types, I might try to allow
 \begin{lstlisting}
 forall( int n ) int sum( int vector[n] );
-\end{lstlisting}
-but C currently rewrites array parameters as pointer parameters, so the effects of such a change
-require more thought.
-\end{rationale}
-
-\begin{rationale}
-A polymorphic declaration must do two things: it must introduce type parameters, and it must apply
-assertions to those types. Adding this to existing C declaration syntax and semantics was delicate,
-and not entirely successful.
-
-C depends on declaration-before-use, so a forall specifier must introduce type names before they can
-be used in the declaration specifiers. This could be done by making the forall specifier part of
-the declaration specifiers, or by making it a new introductory clause of declarations.
-
-Assertions are also part of polymorphic function types, because it must be clear which functions
-have access to the assertion parameters declared by the assertions. All attempts to put assertions
-inside an introductory clause produced complex semantics and confusing code. Building them into the
-declaration specifiers could be done by placing them in the function's parameter list, or in a
-forall specifier that is a declaration specifier. Assertions are also used with type parameters of
-specifications, and by type declarations. For consistency's sake it seems best to attach assertions
-to the type declarations in forall specifiers, which means that forall specifiers must be
-declaration specifiers.
+\end{lstlisting} but C currently rewrites array parameters as pointer parameters, so the effects of such a change require more thought.
+\end{rationale}
+
+\begin{rationale}
+A polymorphic declaration must do two things: it must introduce type parameters, and it must apply assertions to those types.
+Adding this to existing C declaration syntax and semantics was delicate, and not entirely successful.
+
+C depends on declaration-before-use, so a forall specifier must introduce type names before they can be used in the declaration specifiers.
+This could be done by making the forall specifier part of the declaration specifiers, or by making it a new introductory clause of declarations.
+
+Assertions are also part of polymorphic function types, because it must be clear which functions have access to the assertion parameters declared by the assertions.
+All attempts to put assertions inside an introductory clause produced complex semantics and confusing code.
+Building them into the declaration specifiers could be done by placing them in the function's parameter list, or in a forall specifier that is a declaration specifier.
+Assertions are also used with type parameters of specifications, and by type declarations.
+For consistency's sake it seems best to attach assertions to the type declarations in forall specifiers, which means that forall specifiers must be declaration specifiers.
 \end{rationale}
 %HERE
@@ -3595,32 +2852,28 @@
 
 \constraints
-\lstinline$restrict$\index{register@{\lstinline$restrict$}} Types other than type parameters and
-pointer types whose referenced type is an object type shall not be restrict-qualified.
+\lstinline$restrict$\index{register@{\lstinline$restrict$}} Types other than type parameters and pointer types whose referenced type is an object type shall not be restrict-qualified.
 
 \semantics
-An object's type may be a restrict-qualified type parameter. \lstinline$restrict$ does not
-establish any special semantics in that case.
-
-\begin{rationale}
-\CFA loosens the constraint on the restrict qualifier so that restrict-qualified pointers may be
-passed to polymorphic functions.
-\end{rationale}
-
-\lstinline$lvalue$ may be used to qualify the return type of a function type. Let \lstinline$T$ be
-an unqualified version of a type; then the result of calling a function with return type
+An object's type may be a restrict-qualified type parameter. \lstinline$restrict$ does not establish any special semantics in that case.
+
+\begin{rationale}
+\CFA loosens the constraint on the restrict qualifier so that restrict-qualified pointers may be passed to polymorphic functions.
+\end{rationale}
+
+\lstinline$lvalue$ may be used to qualify the return type of a function type.
+Let \lstinline$T$ be an unqualified version of a type;
+then the result of calling a function with return type
 \lstinline$lvalue T$ is a \Index{modifiable lvalue} of type \lstinline$T$.
-\lstinline$const$\use{const} and \lstinline$volatile$\use{volatile} qualifiers may also be added to
-indicate that the function result is a constant or volatile lvalue.
-\begin{rationale}
-The \lstinline$const$ and \lstinline$volatile$ qualifiers can only be sensibly used to qualify the
-return type of a function if the \lstinline$lvalue$ qualifier is also used.
-\end{rationale}
-
-An {lvalue}-qualified type may be used in a \Index{cast expression} if the operand is an lvalue; the
-result of the expression is an lvalue.
-
-\begin{rationale}
-\lstinline$lvalue$ provides some of the functionality of {\CC}'s ``\lstinline$T&$'' ( reference to
-object of type \lstinline$T$) type. Reference types have four uses in {\CC}.
+\lstinline$const$\use{const} and \lstinline$volatile$\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue.
+\begin{rationale}
+The \lstinline$const$ and \lstinline$volatile$ qualifiers can only be sensibly used to qualify the return type of a function if the \lstinline$lvalue$ qualifier is also used.
+\end{rationale}
+
+An {lvalue}-qualified type may be used in a \Index{cast expression} if the operand is an lvalue;
+the result of the expression is an lvalue.
+
+\begin{rationale}
+\lstinline$lvalue$ provides some of the functionality of {\CC}'s ``\lstinline$T&$'' ( reference to object of type \lstinline$T$) type.
+Reference types have four uses in {\CC}.
 \begin{itemize}
 \item
@@ -3629,7 +2882,6 @@
 
 \item
-A reference can be used to define an alias for a complicated lvalue expression, as a way of getting
-some of the functionality of the Pascal \lstinline$with$ statement. The following {\CC} code gives
-an example.
+A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal \lstinline$with$ statement.
+The following {\CC} code gives an example.
 \begin{lstlisting}
 {
@@ -3641,22 +2893,19 @@
 
 \item
-A reference parameter can be used to allow a function to modify an argument without forcing the
-caller to pass the address of the argument. This is most useful for user-defined assignment
-operators. In {\CC}, plain assignment is done by a function called ``\lstinline$operator=$'', and
-the two expressions
+A reference parameter can be used to allow a function to modify an argument without forcing the caller to pass the address of the argument.
+This is most useful for user-defined assignment operators.
+In {\CC}, plain assignment is done by a function called ``\lstinline$operator=$'', and the two expressions
 \begin{lstlisting}
 a = b;
 operator=( a, b );
-\end{lstlisting}
-are equivalent. If \lstinline$a$ and \lstinline$b$ are of type \lstinline$T$, then the first
-parameter of \lstinline$operator=$ must have type ``\lstinline$T&$''. It cannot have type
+\end{lstlisting} are equivalent.
+If \lstinline$a$ and \lstinline$b$ are of type \lstinline$T$, then the first parameter of \lstinline$operator=$ must have type ``\lstinline$T&$''.
+It cannot have type
 \lstinline$T$, because then assignment couldn't alter the variable, and it can't have type
 ``\lstinline$T *$'', because the assignment would have to be written ``\lstinline$&a = b;$''.
 
-In the case of user-defined operators, this could just as well be handled by using pointer types and
-by changing the rewrite rules so that ``\lstinline$a = b;$'' is equivalent to
-``\lstinline$operator=(&( a), b )$''. Reference parameters of ``normal'' functions are Bad Things,
-because they remove a useful property of C function calls: an argument can only be modified by a
-function if it is preceded by ``\lstinline$&$''.
+In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``\lstinline$a = b;$'' is equivalent to
+``\lstinline$operator=(&( a), b )$''.
+Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``\lstinline$&$''.
 
 \item
@@ -3668,23 +2917,17 @@
 void fiddle( const Thing & );
 \end{lstlisting}
-If the second form is used, then constructors and destructors are not invoked to create a temporary
-variable at the call site ( and it is bad style for the caller to make any assumptions about such
-things), and within \lstinline$fiddle$ the parameter is subject to the usual problems caused by
-aliases. The reference form might be chosen for efficiency's sake if \lstinline$Thing$s are too
-large or their constructors or destructors are too expensive. An implementation may switch between
-them without causing trouble for well-behaved clients. This leaves the implementor to define ``too
-large'' and ``too expensive''.
+If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within \lstinline$fiddle$ the parameter is subject to the usual problems caused by aliases.
+The reference form might be chosen for efficiency's sake if \lstinline$Thing$s are too large or their constructors or destructors are too expensive.
+An implementation may switch between them without causing trouble for well-behaved clients.
+This leaves the implementor to define ``too large'' and ``too expensive''.
 
 I propose to push this job onto the compiler by allowing it to implement
 \begin{lstlisting}
 void fiddle( const volatile Thing );
-\end{lstlisting}
-with call-by-reference. Since it knows all about the size of \lstinline$Thing$s and the parameter
-passing mechanism, it should be able to come up with a better definition of ``too large'', and may
-be able to make a good guess at ``too expensive''.
+\end{lstlisting} with call-by-reference.
+Since it knows all about the size of \lstinline$Thing$s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''.
 \end{itemize}
 
-In summary, since references are only really necessary for returning lvalues, I'll only provide
-lvalue functions.
+In summary, since references are only really necessary for returning lvalues, I'll only provide lvalue functions.
 \end{rationale}
 
@@ -3693,8 +2936,7 @@
 \subsection{Initialization}
 
-An expression that is used as an \nonterm{initializer} is treated as being cast to the type of the
-object being initialized. An expression used in an \nonterm{initializer-list} is treated as being
-cast to the type of the aggregate member that it initializes. In either case the cast must have a
-single unambiguous \Index{interpretation}.
+An expression that is used as an \nonterm{initializer} is treated as being cast to the type of the object being initialized.
+An expression used in an \nonterm{initializer-list} is treated as being cast to the type of the aggregate member that it initializes.
+In either case the cast must have a single unambiguous \Index{interpretation}.
 
 
@@ -3717,17 +2959,14 @@
 \end{syntax}
 \begin{rationale}
-The declarations allowed in a specification are much the same as those allowed in a structure,
-except that bit fields are not allowed, and \Index{incomplete type}s and function types are allowed.
+The declarations allowed in a specification are much the same as those allowed in a structure, except that bit fields are not allowed, and \Index{incomplete type}s and function types are allowed.
 \end{rationale}
 
 \semantics
-A \define{specification definition} defines a name for a \define{specification}: a parameterized
-collection of object and function declarations.
+A \define{specification definition} defines a name for a \define{specification}: a parameterized collection of object and function declarations.
 
 The declarations in a specification consist of the declarations in the
 \nonterm{spec-declaration-list} and declarations produced by any assertions in the
-\nonterm{spec-parameter-list}. If the collection contains two declarations that declare the same
-identifier and have compatible types, they are combined into one declaration with the composite type
-constructed from the two types.
+\nonterm{spec-parameter-list}.
+If the collection contains two declarations that declare the same identifier and have compatible types, they are combined into one declaration with the composite type constructed from the two types.
 
 
@@ -3747,11 +2986,10 @@
 
 \constraints
-The \nonterm{identifier} in an assertion that is not a \nonterm{spec-declaration} shall be the name
-of a specification. The \nonterm{type-name-list} shall contain one \nonterm{type-name} argument for
-each \nonterm{type-parameter} in that specification's \nonterm{spec-parameter-list}. If the
-\nonterm{type-parameter} uses type-class \lstinline$type$\use{type}, the argument shall be the type
-name of an \Index{object type}; if it uses \lstinline$dtype$, the argument shall be the type name of
-an object type or an \Index{incomplete type}; and if it uses \lstinline$ftype$, the argument shall
-be the type name of a \Index{function type}.
+The \nonterm{identifier} in an assertion that is not a \nonterm{spec-declaration} shall be the name of a specification.
+The \nonterm{type-name-list} shall contain one \nonterm{type-name} argument for each \nonterm{type-parameter} in that specification's \nonterm{spec-parameter-list}.
+If the
+\nonterm{type-parameter} uses type-class \lstinline$type$\use{type}, the argument shall be the type name of an \Index{object type};
+if it uses \lstinline$dtype$, the argument shall be the type name of an object type or an \Index{incomplete type};
+and if it uses \lstinline$ftype$, the argument shall be the type name of a \Index{function type}.
 
 \semantics
@@ -3759,25 +2997,20 @@
 \define{assertion parameters}.
 
-The assertion parameters produced by an assertion that applies the name of a specification to type
-arguments are found by taking the declarations specified in the specification and treating each of
-the specification's parameters as a synonym for the corresponding \nonterm{type-name} argument.
-
-The collection of assertion parameters produced by the \nonterm{assertion-list} are found by
-combining the declarations produced by each assertion. If the collection contains two declarations
-that declare the same identifier and have compatible types, they are combined into one declaration
-with the \Index{composite type} constructed from the two types.
+The assertion parameters produced by an assertion that applies the name of a specification to type arguments are found by taking the declarations specified in the specification and treating each of the specification's parameters as a synonym for the corresponding \nonterm{type-name} argument.
+
+The collection of assertion parameters produced by the \nonterm{assertion-list} are found by combining the declarations produced by each assertion.
+If the collection contains two declarations that declare the same identifier and have compatible types, they are combined into one declaration with the \Index{composite type} constructed from the two types.
 
 \examples
 \begin{lstlisting}
-forall( type T | T ?*?( T, T ))@\use{?*?}@
+forall( otype T | T ?*?( T, T ))@\use{?*?}@
 T square( T val ) {@\impl{square}@
 	return val + val;
 }
-
-context summable( type T ) {@\impl{summable}@
+trait summable( otype T ) {@\impl{summable}@
 	T ?+=?( T *, T );@\use{?+=?}@
 	const T 0;@\use{0}@
 };
-context list_of( type List, type Element ) {@\impl{list_of}@
+trait list_of( otype List, otype Element ) {@\impl{list_of}@
 	Element car( List );
 	List cdr( List );
@@ -3786,9 +3019,8 @@
 	int is_nil( List );
 };
-context sum_list( type List, type Element | summable( Element ) | list_of( List, Element ) ) {};
-\end{lstlisting}
-\lstinline$sum_list$ contains seven declarations, which describe a list whose elements can be added
-up. The assertion ``\lstinline$|sum_list( i_list, int )$''\use{sum_list} produces the assertion
-parameters
+trait sum_list( otype List, otype Element | summable( Element ) | list_of( List, Element ) ) {};
+\end{lstlisting}
+\lstinline$sum_list$ contains seven declarations, which describe a list whose elements can be added up.
+The assertion ``\lstinline$|sum_list( i_list, int )$''\use{sum_list} produces the assertion parameters
 \begin{lstlisting}
 int ?+=?( int *, int );
@@ -3825,116 +3057,102 @@
 
 \constraints
-If a type declaration has block scope, and the declared identifier has external or internal linkage,
-the declaration shall have no initializer for the identifier.
+If a type declaration has block scope, and the declared identifier has external or internal linkage, the declaration shall have no initializer for the identifier.
 
 \semantics
-A \nonterm{type-parameter} or a \nonterm{type-declarator} declares an identifier to be a \Index{type
-name} for a type incompatible with all other types.
-
-An identifier declared by a \nonterm{type-parameter} has \Index{no linkage}. Identifiers declared
-with type-class \lstinline$type$\use{type} are \Index{object type}s; those declared with type-class
-\lstinline$dtype$\use{dtype} are \Index{incomplete type}s; and those declared with type-class
-\lstinline$ftype$\use{ftype} are \Index{function type}s. The identifier has \Index{block scope} that
-terminates at the end of the \nonterm{spec-declaration-list} or polymorphic function that contains
-the \nonterm{type-parameter}.
-
-A \nonterm{type-declarator} with an \Index{initializer} is a \define{type definition}.  The declared
-identifier is an \Index{incomplete type} within the initializer, and an \Index{object type} after
-the end of the initializer. The type in the initializer is called the \define{implementation
-  type}. Within the scope of the declaration, \Index{implicit conversion}s can be performed between
-the defined type and the implementation type, and between pointers to the defined type and pointers
-to the implementation type.
-
-A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or
-with storage-class specifier \lstinline$static$\use{static} defines an \Index{incomplete type}. If a
-\Index{translation unit} or \Index{block} contains one or more such declarations for an identifier,
-it must contain exactly one definition of the identifier ( but not in an enclosed block, which would
-define a new type known only within that block).
+A \nonterm{type-parameter} or a \nonterm{type-declarator} declares an identifier to be a \Index{type name} for a type incompatible with all other types.
+
+An identifier declared by a \nonterm{type-parameter} has \Index{no linkage}.
+Identifiers declared with type-class \lstinline$type$\use{type} are \Index{object type}s;
+those declared with type-class
+\lstinline$dtype$\use{dtype} are \Index{incomplete type}s;
+and those declared with type-class
+\lstinline$ftype$\use{ftype} are \Index{function type}s.
+The identifier has \Index{block scope} that terminates at the end of the \nonterm{spec-declaration-list} or polymorphic function that contains the \nonterm{type-parameter}.
+
+A \nonterm{type-declarator} with an \Index{initializer} is a \define{type definition}.  The declared identifier is an \Index{incomplete type} within the initializer, and an \Index{object type} after the end of the initializer.
+The type in the initializer is called the \define{implementation
+  type}.
+Within the scope of the declaration, \Index{implicit conversion}s can be performed between the defined type and the implementation type, and between pointers to the defined type and pointers to the implementation type.
+
+A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier \lstinline$static$\use{static} defines an \Index{incomplete type}.
+If a
+\Index{translation unit} or \Index{block} contains one or more such declarations for an identifier, it must contain exactly one definition of the identifier ( but not in an enclosed block, which would define a new type known only within that block).
 \begin{rationale}
 Incomplete type declarations allow compact mutually-recursive types.
 \begin{lstlisting}
-type t1; // Incomplete type declaration. 
-type t2 = struct { t1 * p; ... };
-type t1 = struct { t2 * p; ... };
-\end{lstlisting}
-Without them, mutual recursion could be handled by declaring mutually recursive structures, then
-initializing the types to those structures.
+otype t1; // incomplete type declaration
+otype t2 = struct { t1 * p; ... };
+otype t1 = struct { t2 * p; ... };
+\end{lstlisting}
+Without them, mutual recursion could be handled by declaring mutually recursive structures, then initializing the types to those structures.
 \begin{lstlisting}
 struct s1;
-type t2 = struct s2 { struct s1 * p; ... };
-type t1 = struct s1 { struct s2 * p; ... };
-\end{lstlisting}
-This introduces extra names, and may force the programmer to cast between the types and their
-implementations.
+otype t2 = struct s2 { struct s1 * p; ... };
+otype t1 = struct s1 { struct s2 * p; ... };
+\end{lstlisting}
+This introduces extra names, and may force the programmer to cast between the types and their implementations.
 \end{rationale}
 
 A type declaration without an initializer and with \Index{storage-class specifier}
-\lstinline$extern$\use{extern} is an \define{opaque type declaration}. Opaque types are
-\Index{object type}s. An opaque type is not a \nonterm{constant-expression}; neither is a structure
-or union that has a member whose type is not a \nonterm{constant-expression}.  Every other
-\Index{object type} is a \nonterm{constant-expression}. Objects with static storage duration shall
-be declared with a type that is a \nonterm{constant-expression}.
-\begin{rationale}
-Type declarations can declare identifiers with external linkage, whereas typedef declarations
-declare identifiers that only exist within a translation unit. These opaque types can be used in
-declarations, but the implementation of the type is not visible.
-
-Static objects can not have opaque types because space for them would have to be allocated at
-program start-up. This is a deficiency\index{deficiencies!static opaque objects}, but I don't want
-to deal with ``module initialization'' code just now.
-\end{rationale}
-
-An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a
-value of \Index{type-class} \lstinline$dtype$. An object type\index{object types} which is not a
-qualified version of a type is a value of type-classes \lstinline$type$ and \lstinline$dtype$. A
+\lstinline$extern$\use{extern} is an \define{opaque type declaration}.
+Opaque types are
+\Index{object type}s.
+An opaque type is not a \nonterm{constant-expression};
+neither is a structure or union that has a member whose type is not a \nonterm{constant-expression}.  Every other
+\Index{object type} is a \nonterm{constant-expression}.
+Objects with static storage duration shall be declared with a type that is a \nonterm{constant-expression}.
+\begin{rationale}
+Type declarations can declare identifiers with external linkage, whereas typedef declarations declare identifiers that only exist within a translation unit.
+These opaque types can be used in declarations, but the implementation of the type is not visible.
+
+Static objects can not have opaque types because space for them would have to be allocated at program start-up.
+This is a deficiency\index{deficiencies!static opaque objects}, but I don't want to deal with ``module initialization'' code just now.
+\end{rationale}
+
+An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} \lstinline$dtype$.
+An object type\index{object types} which is not a qualified version of a type is a value of type-classes \lstinline$type$ and \lstinline$dtype$.
+A
 \Index{function type} is a value of type-class \lstinline$ftype$.
 \begin{rationale}
-Syntactically, a type value is a \nonterm{type-name}, which is a declaration for an object which
-omits the identifier being declared.
-
-Object types are precisely the types that can be instantiated. Type qualifiers are not included in
-type values because the compiler needs the information they provide at compile time to detect
-illegal statements or to produce efficient machine instructions. For instance, the code that a
-compiler must generate to manipulate an object that has volatile-qualified type may be different
-from the code to manipulate an ordinary object.
-
-Type qualifiers are a weak point of C's type system. Consider the standard library function
-\lstinline$strchr()$ which, given a string and a character, returns a pointer to the first
-occurrence of the character in the string.
+Syntactically, a type value is a \nonterm{type-name}, which is a declaration for an object which omits the identifier being declared.
+
+Object types are precisely the types that can be instantiated.
+Type qualifiers are not included in type values because the compiler needs the information they provide at compile time to detect illegal statements or to produce efficient machine instructions.
+For instance, the code that a compiler must generate to manipulate an object that has volatile-qualified type may be different from the code to manipulate an ordinary object.
+
+Type qualifiers are a weak point of C's type system.
+Consider the standard library function
+\lstinline$strchr()$ which, given a string and a character, returns a pointer to the first occurrence of the character in the string.
 \begin{lstlisting}
 char *strchr( const char *s, int c ) {@\impl{strchr}@
 	char real_c = c; // done because c was declared as int. 
 	for ( ; *s != real_c; s++ )
-	 if ( *s == '\0' ) return NULL;
+		if ( *s == '\0' ) return NULL;
 	return ( char * )s;
 }
 \end{lstlisting}
-The parameter \lstinline$s$ must be \lstinline$const char *$, because \lstinline$strchr()$ might be
-used to search a constant string, but the return type must be \lstinline$char *$, because the result
-might be used to modify a non-constant string. Hence the body must perform a cast, and ( even worse)
-\lstinline$strchr()$ provides a type-safe way to attempt to modify constant strings. What is needed
-is some way to say that \lstinline$s$'s type might contain qualifiers, and the result type has
-exactly the same qualifiers. Polymorphic functions do not provide a fix for this
-deficiency\index{deficiencies!pointers to qualified types}, because type qualifiers are not part of
-type values. Instead, overloading can be used to define \lstinline$strchr()$ for each combination
-of qualifiers.
-\end{rationale}
-
-\begin{rationale}
-Since \Index{incomplete type}s are not type values, they can not be used as the initializer in a
-type declaration, or as the type of a structure or union member. This prevents the declaration of
-types that contain each other.
-\begin{lstlisting}
-type t1;
-type t2 = t1; // illegal: incomplete type t1. 
-type t1 = t2;
-\end{lstlisting}
-
-The initializer in a file-scope declaration must be a constant expression. This means type
-declarations can not build on opaque types, which is a deficiency\index{deficiencies!nesting opaque
+The parameter \lstinline$s$ must be \lstinline$const char *$, because \lstinline$strchr()$ might be used to search a constant string, but the return type must be \lstinline$char *$, because the result might be used to modify a non-constant string.
+Hence the body must perform a cast, and ( even worse)
+\lstinline$strchr()$ provides a type-safe way to attempt to modify constant strings.
+What is needed is some way to say that \lstinline$s$'s type might contain qualifiers, and the result type has exactly the same qualifiers.
+Polymorphic functions do not provide a fix for this deficiency\index{deficiencies!pointers to qualified types}, because type qualifiers are not part of type values.
+Instead, overloading can be used to define \lstinline$strchr()$ for each combination of qualifiers.
+\end{rationale}
+
+\begin{rationale}
+Since \Index{incomplete type}s are not type values, they can not be used as the initializer in a type declaration, or as the type of a structure or union member.
+This prevents the declaration of types that contain each other.
+\begin{lstlisting}
+otype t1;
+otype t2 = t1; // illegal: incomplete type t1
+otype t1 = t2;
+\end{lstlisting}
+
+The initializer in a file-scope declaration must be a constant expression.
+This means type declarations can not build on opaque types, which is a deficiency\index{deficiencies!nesting opaque
  types}.
 \begin{lstlisting}
-extern type Huge; // extended-precision integer type. 
-type Rational = struct {
+extern otype Huge; // extended-precision integer type
+otype Rational = struct {
 	Huge numerator, denominator;	// illegal 
 };
@@ -3944,10 +3162,7 @@
 \end{lstlisting}
 Without this restriction, \CFA might require ``module initialization'' code ( since
-\lstinline$Rational$ has external linkage, it must be created before any other translation unit
-instantiates it), and would force an ordering on the initialization of the translation unit that
-defines \lstinline$Huge$ and the translation that declares \lstinline$Rational$.
-
-A benefit of the restriction is that it prevents the declaration in separate translation units of
-types that contain each other, which would be hard to prevent otherwise.
+\lstinline$Rational$ has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines \lstinline$Huge$ and the translation that declares \lstinline$Rational$.
+
+A benefit of the restriction is that it prevents the declaration in separate translation units of types that contain each other, which would be hard to prevent otherwise.
 \begin{lstlisting}
 //  File a.c:
@@ -3962,31 +3177,26 @@
 \begin{rationale}
 Since a \nonterm{type-declaration} is a \nonterm{declaration} and not a
-\nonterm{struct-declaration}, type declarations can not be structure members. The form of
+\nonterm{struct-declaration}, type declarations can not be structure members.
+The form of
 \nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline$type$.
-Hence the syntax of \nonterm{type-specifier} does not have to be extended to allow type-valued
-expressions. It also side-steps the problem of type-valued expressions producing different values
-in different declarations.
-
-Since a type declaration is not a \nonterm{parameter-declaration}, functions can not have explicit
-type parameters. This may be too restrictive, but it attempts to make compilation simpler. Recall
-that when traditional C scanners read in an identifier, they look it up in the symbol table to
-determine whether or not it is a typedef name, and return a ``type'' or ``identifier'' token
-depending on what they find. A type parameter would add a type name to the current scope. The
-scope manipulations involved in parsing the declaration of a function that takes function pointer
-parameters and returns a function pointer may just be too complicated.
-
-Explicit type parameters don't seem to be very useful, anyway, because their scope would not include
-the return type of the function. Consider the following attempt to define a type-safe memory
-allocation function.
+Hence the syntax of \nonterm{type-specifier} does not have to be extended to allow type-valued expressions.
+It also side-steps the problem of type-valued expressions producing different values in different declarations.
+
+Since a type declaration is not a \nonterm{parameter-declaration}, functions can not have explicit type parameters.
+This may be too restrictive, but it attempts to make compilation simpler.
+Recall that when traditional C scanners read in an identifier, they look it up in the symbol table to determine whether or not it is a typedef name, and return a ``type'' or ``identifier'' token depending on what they find.
+A type parameter would add a type name to the current scope.
+The scope manipulations involved in parsing the declaration of a function that takes function pointer parameters and returns a function pointer may just be too complicated.
+
+Explicit type parameters don't seem to be very useful, anyway, because their scope would not include the return type of the function.
+Consider the following attempt to define a type-safe memory allocation function.
 \begin{lstlisting}
 #include <stdlib.h>
-T * new( type T ) { return ( T * )malloc( sizeof( T) ); };
-@\ldots@
-int * ip = new( int );
-\end{lstlisting}
-This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline$T$'' in the
-function body refers to the parameter, but the ``\lstinline$T$'' in the return type refers to the
-meaning of \lstinline$T$ in the scope that contains \lstinline$new$; it could be undefined, or a
-type name, or a function or variable name. Nothing good can result from such a situation.
+T * new( otype T ) { return ( T * )malloc( sizeof( T) ); };
+@\ldots@ int * ip = new( int );
+\end{lstlisting}
+This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline$T$'' in the function body refers to the parameter, but the ``\lstinline$T$'' in the return type refers to the meaning of \lstinline$T$ in the scope that contains \lstinline$new$;
+it could be undefined, or a type name, or a function or variable name.
+Nothing good can result from such a situation.
 \end{rationale}
 
@@ -3994,7 +3204,7 @@
 Since type declarations create new types, instances of types are always passed by value.
 \begin{lstlisting}
-type A1 = int[2];
+otype A1 = int[2];
 void f1( A1 a ) { a[0] = 0; };
-typedef int A2[2];
+otypedef int A2[2];
 void f2( A2 a ) { a[0] = 0; };
 A1 v1;
@@ -4003,18 +3213,15 @@
 f2( v2 );
 \end{lstlisting}
-\lstinline$V1$ is passed by value, so \lstinline$f1()$'s assignment to \lstinline$a[0]$ does not
-modify v1.  \lstinline$V2$ is converted to a pointer, so \lstinline$f2()$ modifies
-\lstinline$v2[0]$.
+\lstinline$V1$ is passed by value, so \lstinline$f1()$'s assignment to \lstinline$a[0]$ does not modify v1.  \lstinline$V2$ is converted to a pointer, so \lstinline$f2()$ modifies \lstinline$v2[0]$.
 
 A translation unit containing the declarations
 \begin{lstlisting}
-extern type Complex;@\use{Complex}@ // opaque type declaration. 
+extern type Complex;@\use{Complex}@ // opaque type declaration
 extern float abs( Complex );@\use{abs}@
-\end{lstlisting}
-can contain declarations of complex numbers, which can be passed to \lstinline$abs$. Some other
-translation unit must implement \lstinline$Complex$ and \lstinline$abs$. That unit might contain
-the declarations
-\begin{lstlisting}
-type Complex = struct { float re, im; };@\impl{Complex}@
+\end{lstlisting} can contain declarations of complex numbers, which can be passed to \lstinline$abs$.
+Some other translation unit must implement \lstinline$Complex$ and \lstinline$abs$.
+That unit might contain the declarations
+\begin{lstlisting}
+otype Complex = struct { float re, im; };@\impl{Complex}@
 Complex cplx_i = { 0.0, 1.0 };@\impl{cplx_i}@
 float abs( Complex c ) {@\impl{abs( Complex )}@
@@ -4022,9 +3229,8 @@
 }
 \end{lstlisting}
-Note that \lstinline$c$ is implicitly converted to a \lstinline$struct$ so that its components can
-be retrieved.
-
-\begin{lstlisting}
-type Time_of_day = int;@\impl{Time_of_day}@ // seconds since midnight. 
+Note that \lstinline$c$ is implicitly converted to a \lstinline$struct$ so that its components can be retrieved.
+
+\begin{lstlisting}
+otype Time_of_day = int;@\impl{Time_of_day}@ // seconds since midnight. 
 Time_of_day ?+?( Time_of_day t1, int seconds ) {@\impl{?+?}@
 	return (( int)t1 + seconds ) % 86400;
@@ -4034,33 +3240,29 @@
 
 \begin{rationale}
-Within the scope of a type definition, an instance of the type can be viewed as having that type or
-as having the implementation type. In the \lstinline$Time_of_day$ example, the difference is
-important. Different languages have treated the distinction between the abstraction and the
-implementation in different ways.
+Within the scope of a type definition, an instance of the type can be viewed as having that type or as having the implementation type.
+In the \lstinline$Time_of_day$ example, the difference is important.
+Different languages have treated the distinction between the abstraction and the implementation in different ways.
 \begin{itemize}
 \item
-Inside a Clu cluster \cite{clu}, the declaration of an instance states which view applies. Two
-primitives called \lstinline$up$ and \lstinline$down$ can be used to convert between the views.
-\item
-The Simula class \cite{Simula87} is essentially a record type. Since the only operations on a
-record are member selection and assignment, which can not be overloaded, there is never any
-ambiguity as to whether the abstraction or the implementation view is being used. In {\CC}
-\cite{c++}, operations on class instances include assignment and ``\lstinline$&$'', which can be
-overloaded. A ``scope resolution'' operator can be used inside the class to specify whether the
-abstract or implementation version of the operation should be used.
-\item
-An Ada derived type definition \cite{ada} creates a new type from an old type, and also implicitly
-declares derived subprograms that correspond to the existing subprograms that use the old type as a
-parameter type or result type. The derived subprograms are clones of the existing subprograms with
-the old type replaced by the derived type. Literals and aggregates of the old type are also cloned.
+Inside a Clu cluster \cite{CLU}, the declaration of an instance states which view applies.
+Two primitives called \lstinline$up$ and \lstinline$down$ can be used to convert between the views.
+\item
+The Simula class \cite{SIMULA87} is essentially a record type.
+Since the only operations on a record are member selection and assignment, which can not be overloaded, there is never any ambiguity as to whether the abstraction or the implementation view is being used.
+In {\CC}
+\cite{C++}, operations on class instances include assignment and ``\lstinline$&$'', which can be overloaded.
+A ``scope resolution'' operator can be used inside the class to specify whether the abstract or implementation version of the operation should be used.
+\item
+An Ada derived type definition \cite{Ada} creates a new type from an old type, and also implicitly declares derived subprograms that correspond to the existing subprograms that use the old type as a parameter type or result type.
+The derived subprograms are clones of the existing subprograms with the old type replaced by the derived type.
+Literals and aggregates of the old type are also cloned.
 In other words, the abstract view provides exactly the same operations as the implementation view.
 This allows the abstract view to be used in all cases.
 
-The derived subprograms can be replaced by programmer-specified subprograms. This is an exception
-to the normal scope rules, which forbid duplicate definitions of a subprogram in a scope. In this
-case, explicit conversions between the derived type and the old type can be used.
+The derived subprograms can be replaced by programmer-specified subprograms.
+This is an exception to the normal scope rules, which forbid duplicate definitions of a subprogram in a scope.
+In this case, explicit conversions between the derived type and the old type can be used.
 \end{itemize}
-\CFA's rules are like Clu's, except that implicit conversions and
-conversion costs allow it to do away with most uses of \lstinline$up$ and \lstinline$down$. 
+\CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of \lstinline$up$ and \lstinline$down$. 
 \end{rationale}
 
@@ -4070,75 +3272,55 @@
 A declaration\index{type declaration} of a type identifier \lstinline$T$ with type-class
 \lstinline$type$ implicitly declares a \define{default assignment} function
-\lstinline$T ?=?( T *, T )$\use{?=?}, with the same \Index{scope} and \Index{linkage} as the
-identifier \lstinline$T$.
-\begin{rationale}
-Assignment is central to C's imperative programming style, and every existing C object type has
-assignment defined for it ( except for array types, which are treated as pointer types for purposes
-of assignment). Without this rule, nearly every inferred type parameter would need an accompanying
-assignment assertion parameter. If a type parameter should not have an assignment operation,
-\lstinline$dtype$ should be used. If a type should not have assignment defined, the user can define
-an assignment function that causes a run-time error, or provide an external declaration but no
-definition and thus cause a link-time error.
-\end{rationale}
-
-A definition\index{type definition} of a type identifier \lstinline$T$ with \Index{implementation
-type} \lstinline$I$ and type-class \lstinline$type$ implicitly defines a default assignment
-function. A definition\index{type definition} of a type identifier \lstinline$T$ with implementation
-type \lstinline$I$ and an assertion list implicitly defines \define{default function}s and
-\define{default object}s as declared by the assertion declarations. The default objects and
-functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$. Their
-values are determined as follows:
+\lstinline$T ?=?( T *, T )$\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$.
+\begin{rationale}
+Assignment is central to C's imperative programming style, and every existing C object type has assignment defined for it ( except for array types, which are treated as pointer types for purposes of assignment).
+Without this rule, nearly every inferred type parameter would need an accompanying assignment assertion parameter.
+If a type parameter should not have an assignment operation,
+\lstinline$dtype$ should be used.
+If a type should not have assignment defined, the user can define an assignment function that causes a run-time error, or provide an external declaration but no definition and thus cause a link-time error.
+\end{rationale}
+
+A definition\index{type definition} of a type identifier \lstinline$T$ with \Index{implementation type} \lstinline$I$ and type-class \lstinline$type$ implicitly defines a default assignment function.
+A definition\index{type definition} of a type identifier \lstinline$T$ with implementation type \lstinline$I$ and an assertion list implicitly defines \define{default function}s and
+\define{default object}s as declared by the assertion declarations.
+The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$.
+Their values are determined as follows:
 \begin{itemize}
 \item
-If at the definition of \lstinline$T$ there is visible a declaration of an object with the same name
-as the default object, and if the type of that object with all occurrence of \lstinline$I$ replaced
-by \lstinline$T$ is compatible with the type of the default object, then the default object is
-initialized with that object. Otherwise the scope of the declaration of \lstinline$T$ must contain
-a definition of the default object.
+If at the definition of \lstinline$T$ there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of \lstinline$I$ replaced by \lstinline$T$ is compatible with the type of the default object, then the default object is initialized with that object.
+Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default object.
 
 \item 
-If at the definition of \lstinline$T$ there is visible a declaration of a function with the same
-name as the default function, and if the type of that function with all occurrence of \lstinline$I$
-replaced by \lstinline$T$ is compatible with the type of the default function, then the default
-function calls that function after converting its arguments and returns the converted result.
-
-Otherwise, if \lstinline$I$ contains exactly one anonymous member\index{anonymous member} such that
-at the definition of \lstinline$T$ there is visible a declaration of a function with the same name
-as the default function, and the type of that function with all occurrences of the anonymous
-member's type in its parameter list replaced by \lstinline$T$ is compatible with the type of the
-default function, then the default function calls that function after converting its arguments and
-returns the result.
-
-Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default
-function.
+If at the definition of \lstinline$T$ there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of \lstinline$I$ replaced by \lstinline$T$ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result.
+
+Otherwise, if \lstinline$I$ contains exactly one anonymous member\index{anonymous member} such that at the definition of \lstinline$T$ there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by \lstinline$T$ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result.
+
+Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default function.
 \end{itemize}
 \begin{rationale}
-Note that a pointer to a default function will not compare as equal to a pointer to the inherited
-function.
-\end{rationale}
-
-A function or object with the same type and name as a default function or object that is declared
-within the scope of the definition of \lstinline$T$ replaces the default function or object.
+Note that a pointer to a default function will not compare as equal to a pointer to the inherited function.
+\end{rationale}
+
+A function or object with the same type and name as a default function or object that is declared within the scope of the definition of \lstinline$T$ replaces the default function or object.
 
 \examples
 \begin{lstlisting}
-context s( type T ) {
+trait s( otype T ) {
 	T a, b;
-}
-struct impl { int left, right; } a = { 0, 0 };
-type Pair | s( Pair ) = struct impl;
+} struct impl { int left, right; } a = { 0, 0 };
+otype Pair | s( Pair ) = struct impl;
 Pair b = { 1, 1 };
 \end{lstlisting}
 The definition of \lstinline$Pair$ implicitly defines two objects \lstinline$a$ and \lstinline$b$.
-\lstinline$Pair a$ inherits its value from the \lstinline$struct impl a$. The definition of
-\lstinline$Pair b$ is compulsory because there is no \lstinline$struct impl b$ to construct a value
-from.
-\begin{lstlisting}
-context ss( type T ) {
+\lstinline$Pair a$ inherits its value from the \lstinline$struct impl a$.
+The definition of
+\lstinline$Pair b$ is compulsory because there is no \lstinline$struct impl b$ to construct a value from.
+\begin{lstlisting}
+trait ss( otype T ) {
 	T clone( T );
 	void munge( T * );
 }
-type Whatsit | ss( Whatsit );@\use{Whatsit}@
-type Doodad | ss( Doodad ) = struct doodad {@\use{Doodad}@
+otype Whatsit | ss( Whatsit );@\use{Whatsit}@
+otype Doodad | ss( Doodad ) = struct doodad {@\use{Doodad}@
 	Whatsit; // anonymous member 
 	int extra;
@@ -4152,16 +3334,14 @@
 void munge( Doodad * );
 \end{lstlisting}
-The assignment function inherits \lstinline$struct doodad$'s assignment function because the types
-match when \lstinline$struct doodad$ is replaced by \lstinline$Doodad$ throughout.
+The assignment function inherits \lstinline$struct doodad$'s assignment function because the types match when \lstinline$struct doodad$ is replaced by \lstinline$Doodad$ throughout.
 \lstinline$munge()$ inherits \lstinline$Whatsit$'s \lstinline$munge()$ because the types match when
-\lstinline$Whatsit$ is replaced by \lstinline$Doodad$ in the parameter list. \lstinline$clone()$
-does \emph{not} inherit \lstinline$Whatsit$'s \lstinline$clone()$: replacement in the parameter
-list yields ``\lstinline$Whatsit clone( Doodad )$'', which is not compatible with
-\lstinline$Doodad$'s \lstinline$clone()$'s type. Hence the definition of
+\lstinline$Whatsit$ is replaced by \lstinline$Doodad$ in the parameter list. \lstinline$clone()$ does \emph{not} inherit \lstinline$Whatsit$'s \lstinline$clone()$: replacement in the parameter list yields ``\lstinline$Whatsit clone( Doodad )$'', which is not compatible with
+\lstinline$Doodad$'s \lstinline$clone()$'s type.
+Hence the definition of
 ``\lstinline$Doodad clone( Doodad )$'' is necessary.
 
 Default functions and objects are subject to the normal scope rules.
 \begin{lstlisting}
-type T = @\ldots@;
+otype T = @\ldots@;
 T a_T = @\ldots@;		// Default assignment used. 
 T ?=?( T *, T );
@@ -4173,11 +3353,11 @@
 
 \begin{rationale}
-The \emph{class} construct of object-oriented programming languages performs three independent
-functions. It \emph{encapsulates} a data structure; it defines a \emph{subtype} relationship, whereby
-instances of one class may be used in contexts that require instances of another; and it allows one
-class to \emph{inherit} the implementation of another.
-
-In \CFA, encapsulation is provided by opaque types and the scope rules, and subtyping is provided
-by specifications and assertions. Inheritance is provided by default functions and objects.
+The \emph{class} construct of object-oriented programming languages performs three independent functions.
+It \emph{encapsulates} a data structure;
+it defines a \emph{subtype} relationship, whereby instances of one class may be used in contexts that require instances of another;
+and it allows one class to \emph{inherit} the implementation of another.
+
+In \CFA, encapsulation is provided by opaque types and the scope rules, and subtyping is provided by specifications and assertions.
+Inheritance is provided by default functions and objects.
 \end{rationale}
 
@@ -4190,7 +3370,7 @@
 \end{syntax}
 
-Many statements contain expressions, which may have more than one interpretation. The following
-sections describe how the \CFA translator selects an interpretation. In all cases the result of the
-selection shall be a single unambiguous \Index{interpretation}.
+Many statements contain expressions, which may have more than one interpretation.
+The following sections describe how the \CFA translator selects an interpretation.
+In all cases the result of the selection shall be a single unambiguous \Index{interpretation}.
 
 
@@ -4239,6 +3419,5 @@
 switch ( E ) ...
 choose ( E ) ...
-\end{lstlisting}
-may have more than one interpretation, but it shall have only one interpretation with an integral type.
+\end{lstlisting} may have more than one interpretation, but it shall have only one interpretation with an integral type.
 An \Index{integer promotion} is performed on the expression if necessary.
 The constant expressions in \lstinline$case$ statements with the switch are converted to the promoted type.
@@ -4284,12 +3463,10 @@
 while ( E ) ...
 do ... while ( E );
-\end{lstlisting}
-is treated as ``\lstinline$( int )((E)!=0)$''.
+\end{lstlisting} is treated as ``\lstinline$( int )((E)!=0)$''.
 
 The statement 
 \begin{lstlisting}
 for ( a; b; c ) @\ldots@
-\end{lstlisting}
-is treated as
+\end{lstlisting} is treated as
 \begin{lstlisting}
 for ( ( void )( a ); ( int )(( b )!=0); ( void )( c ) ) ...
@@ -4413,9 +3590,8 @@
 
 The implementation shall define the macro names \lstinline$__LINE__$, \lstinline$__FILE__$,
-\lstinline$__DATE__$, and \lstinline$__TIME__$, as in the {\c11} standard. It shall not define the
-macro name \lstinline$__STDC__$.
-
-In addition, the implementation shall define the macro name \lstinline$__CFORALL__$ to be the
-decimal constant 1.
+\lstinline$__DATE__$, and \lstinline$__TIME__$, as in the {\c11} standard.
+It shall not define the macro name \lstinline$__STDC__$.
+
+In addition, the implementation shall define the macro name \lstinline$__CFORALL__$ to be the decimal constant 1.
 
 
@@ -4427,15 +3603,14 @@
 
 \section{C types}
-This section gives example specifications for some groups of types that are important in the C
-language, in terms of the predefined operations that can be applied to those types.
+This section gives example specifications for some groups of types that are important in the C language, in terms of the predefined operations that can be applied to those types.
 
 
 \subsection{Scalar, arithmetic, and integral types}
 
-The pointer, integral, and floating-point types are all \define{scalar types}. All of these types
-can be logically negated and compared. The assertion ``\lstinline$scalar( Complex )$'' should be read
-as ``type \lstinline$Complex$ is scalar''.
-\begin{lstlisting}
-context scalar( type T ) {@\impl{scalar}@
+The pointer, integral, and floating-point types are all \define{scalar types}.
+All of these types can be logically negated and compared.
+The assertion ``\lstinline$scalar( Complex )$'' should be read as ``type \lstinline$Complex$ is scalar''.
+\begin{lstlisting}
+trait scalar( otype T ) {@\impl{scalar}@
 	int !?( T );
 	int ?<?( T, T ), ?<=?( T, T ), ?==?( T, T ), ?>=?( T, T ), ?>?( T, T ), ?!=?( T, T );
@@ -4443,10 +3618,9 @@
 \end{lstlisting}
 
-The integral and floating-point types are \define{arithmetic types}, which support the basic
-arithmetic operators. The use of an assertion in the \nonterm{spec-parameter-list} declares that,
-in order to be arithmetic, a type must also be scalar ( and hence that scalar operations are
-available ). This is equivalent to inheritance of specifications.
-\begin{lstlisting}
-context arithmetic( type T | scalar( T ) ) {@\impl{arithmetic}@@\use{scalar}@
+The integral and floating-point types are \define{arithmetic types}, which support the basic arithmetic operators.
+The use of an assertion in the \nonterm{spec-parameter-list} declares that, in order to be arithmetic, a type must also be scalar ( and hence that scalar operations are available ).
+This is equivalent to inheritance of specifications.
+\begin{lstlisting}
+trait arithmetic( otype T | scalar( T ) ) {@\impl{arithmetic}@@\use{scalar}@
 	T +?( T ), -?( T );
 	T ?*?( T, T ), ?/?( T, T ), ?+?( T, T ), ?-?( T, T );
@@ -4457,5 +3631,5 @@
 \define{integral types}.
 \begin{lstlisting}
-context integral( type T | arithmetic( T ) ) {@\impl{integral}@@\use{arithmetic}@
+trait integral( otype T | arithmetic( T ) ) {@\impl{integral}@@\use{arithmetic}@
 	T ~?( T );
 	T ?&?( T, T ), ?|?( T, T ), ?^?( T, T );
@@ -4471,5 +3645,5 @@
 The only operation that can be applied to all modifiable lvalues is simple assignment.
 \begin{lstlisting}
-context m_lvalue( type T ) {@\impl{m_lvalue}@
+trait m_lvalue( otype T ) {@\impl{m_lvalue}@
 	T ?=?( T *, T );
 };
@@ -4477,8 +3651,9 @@
 
 Modifiable scalar lvalues are scalars and are modifiable lvalues, and assertions in the
-\nonterm{spec-parameter-list} reflect those relationships. This is equivalent to multiple
-inheritance of specifications. Scalars can also be incremented and decremented.
-\begin{lstlisting}
-context m_l_scalar( type T | scalar( T ) | m_lvalue( T ) ) {@\impl{m_l_scalar}@
+\nonterm{spec-parameter-list} reflect those relationships.
+This is equivalent to multiple inheritance of specifications.
+Scalars can also be incremented and decremented.
+\begin{lstlisting}
+trait m_l_scalar( otype T | scalar( T ) | m_lvalue( T ) ) {@\impl{m_l_scalar}@
 	T ?++( T * ), ?--( T * );@\use{scalar}@@\use{m_lvalue}@
 	T ++?( T * ), --?( T * );
@@ -4486,13 +3661,12 @@
 \end{lstlisting}
 
-Modifiable arithmetic lvalues are both modifiable scalar lvalues and arithmetic. Note that this
-results in the ``inheritance'' of \lstinline$scalar$ along both paths.
-\begin{lstlisting}
-context m_l_arithmetic( type T | m_l_scalar( T ) | arithmetic( T ) ) {@\impl{m_l_arithmetic}@
+Modifiable arithmetic lvalues are both modifiable scalar lvalues and arithmetic.
+Note that this results in the ``inheritance'' of \lstinline$scalar$ along both paths.
+\begin{lstlisting}
+trait m_l_arithmetic( otype T | m_l_scalar( T ) | arithmetic( T ) ) {@\impl{m_l_arithmetic}@
 	T ?/=?( T *, T ), ?*=?( T *, T );@\use{m_l_scalar}@@\use{arithmetic}@
 	T ?+=?( T *, T ), ?-=?( T *, T );
 };
-
-context m_l_integral( type T | m_l_arithmetic( T ) | integral( T ) ) {@\impl{m_l_integral}@
+trait m_l_integral( otype T | m_l_arithmetic( T ) | integral( T ) ) {@\impl{m_l_integral}@
 	T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );@\use{m_l_arithmetic}@
 	T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );@\use{integral}@
@@ -4503,22 +3677,20 @@
 \subsection{Pointer and array types}
 
-Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a
-constant pointer to the first element of the array, and the subscript expression
+Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a constant pointer to the first element of the array, and the subscript expression
 ``\lstinline$a[i]$'' is equivalent to the dereferencing expression ``\lstinline$(*( a+( i )))$''.
 Technically, pointer arithmetic and pointer comparisons other than ``\lstinline$==$'' and
-``\lstinline$!=$'' are only defined for pointers to array elements, but the type system does not
-enforce those restrictions. Consequently, there is no need for a separate ``array type''
-specification.
-
-Pointer types are scalar types. Like other scalar types, they have ``\lstinline$+$'' and
+``\lstinline$!=$'' are only defined for pointers to array elements, but the type system does not enforce those restrictions.
+Consequently, there is no need for a separate ``array type'' specification.
+
+Pointer types are scalar types.
+Like other scalar types, they have ``\lstinline$+$'' and
 ``\lstinline$-$'' operators, but the types do not match the types of the operations in
 \lstinline$arithmetic$, so these operators cannot be consolidated in \lstinline$scalar$.
 \begin{lstlisting}
-context pointer( type P | scalar( P ) ) {@\impl{pointer}@@\use{scalar}@
+trait pointer( type P | scalar( P ) ) {@\impl{pointer}@@\use{scalar}@
 	P ?+?( P, long int ), ?+?( long int, P ), ?-?( P, long int );
 	ptrdiff_t ?-?( P, P );
 };
-
-context m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {@\impl{m_l_pointer}@
+trait m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {@\impl{m_l_pointer}@
 	P ?+=?( P *, long int ), ?-=?( P *, long int );
 	P ?=?( P *, void * );
@@ -4527,24 +3699,22 @@
 \end{lstlisting}
 
-Specifications that define the dereference operator ( or subscript operator ) require two
-parameters, one for the pointer type and one for the pointed-at ( or element ) type. Different
-specifications are needed for each set of \Index{type qualifier}s, because qualifiers are not
-included in types. The assertion ``\lstinline$|ptr_to( Safe_pointer, int )$'' should be read as
+Specifications that define the dereference operator ( or subscript operator ) require two parameters, one for the pointer type and one for the pointed-at ( or element ) type.
+Different specifications are needed for each set of \Index{type qualifier}s, because qualifiers are not included in types.
+The assertion ``\lstinline$|ptr_to( Safe_pointer, int )$'' should be read as
 ``\lstinline$Safe_pointer$ acts like a pointer to \lstinline$int$''.
 \begin{lstlisting}
-context ptr_to( type P | pointer( P ), type T ) {@\impl{ptr_to}@@\use{pointer}@
-	lvalue T *?( P ); lvalue T ?[?]( P, long int );
+trait ptr_to( otype P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@
+	lvalue T *?( P );
+	lvalue T ?[?]( P, long int );
 };
-
-context ptr_to_const( type P | pointer( P ), type T ) {@\impl{ptr_to_const}@
-	const lvalue T *?( P ); const lvalue T ?[?]( P, long int );@\use{pointer}@
+trait ptr_to_const( otype P | pointer( P ), otype T ) {@\impl{ptr_to_const}@
+	const lvalue T *?( P );
+	const lvalue T ?[?]( P, long int );@\use{pointer}@
 };
-
-context ptr_to_volatile( type P | pointer( P ), type T ) }@\impl{ptr_to_volatile}@
-	volatile lvalue T *?( P ); volatile lvalue T ?[?]( P, long int );@\use{pointer}@
+trait ptr_to_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@
+	volatile lvalue T *?( P );
+	volatile lvalue T ?[?]( P, long int );@\use{pointer}@
 };
-\end{lstlisting}
-\begin{lstlisting}
-context ptr_to_const_volatile( type P | pointer( P ), type T ) }@\impl{ptr_to_const_volatile}@
+trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@
 	const volatile lvalue T *?( P );@\use{pointer}@
 	const volatile lvalue T ?[?]( P, long int );
@@ -4552,27 +3722,22 @@
 \end{lstlisting}
 
-Assignment to pointers is more complicated than is the case with other types, because the target's
-type can have extra type qualifiers in the pointed-at type: a ``\lstinline$T *$'' can be assigned to
-a ``\lstinline$const T *$'', a ``\lstinline$volatile T *$'', and a ``\lstinline$const volatile T *$''.
+Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``\lstinline$T *$'' can be assigned to a ``\lstinline$const T *$'', a ``\lstinline$volatile T *$'', and a ``\lstinline$const volatile T *$''.
 Again, the pointed-at type is passed in, so that assertions can connect these specifications to the
 ``\lstinline$ptr_to$'' specifications.
 \begin{lstlisting}
-context m_l_ptr_to( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ type T | ptr_to( P, T )@\use{ptr_to}@ {
+trait m_l_ptr_to( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ otype T | ptr_to( P, T )@\use{ptr_to}@ {
 	P ?=?( P *, T * );
 	T * ?=?( T **, P );
 };
-
-context m_l_ptr_to_const( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ type T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
+trait m_l_ptr_to_const( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ otype T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
 	P ?=?( P *, const T * );
 	const T * ?=?( const T **, P );
 };
-
-context m_l_ptr_to_volatile( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ type T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
+trait m_l_ptr_to_volatile( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ otype T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
 	P ?=?( P *, volatile T * );
 	volatile T * ?=?( volatile T **, P );
 };
-
-context m_l_ptr_to_const_volatile( type P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
-		type T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {@\use{m_l_ptr_to_const}@@\use{m_l_ptr_to_volatile}@
+trait m_l_ptr_to_const_volatile( otype P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
+		otype T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {@\use{m_l_ptr_to_const}@@\use{m_l_ptr_to_volatile}@
 	P ?=?( P *, const volatile T * );
 	const volatile T * ?=?( const volatile T **, P );
@@ -4580,9 +3745,8 @@
 \end{lstlisting}
 
-Note the regular manner in which type qualifiers appear in those specifications. An alternative
-specification can make use of the fact that qualification of the pointed-at type is part of a
-pointer type to capture that regularity.
-\begin{lstlisting}
-context m_l_ptr_like( type MyP | m_l_pointer( MyP ),@\use{m_l_pointer}@@\impl{m_l_ptr_like}@ type CP | m_l_pointer( CP ) ) {
+Note the regular manner in which type qualifiers appear in those specifications.
+An alternative specification can make use of the fact that qualification of the pointed-at type is part of a pointer type to capture that regularity.
+\begin{lstlisting}
+trait m_l_ptr_like( type MyP | m_l_pointer( MyP ),@\use{m_l_pointer}@@\impl{m_l_ptr_like}@ type CP | m_l_pointer( CP ) ) {
 	MyP ?=?( MyP *, CP );
 	CP ?=?( CP *, MyP );
@@ -4590,48 +3754,40 @@
 \end{lstlisting}
 The assertion ``\lstinline$| m_l_ptr_like( Safe_ptr, const int * )$'' should be read as
-``\lstinline$Safe_ptr$ is a pointer type like \lstinline$const int *$''. This specification has two
-defects, compared to the original four: there is no automatic assertion that dereferencing a
+``\lstinline$Safe_ptr$ is a pointer type like \lstinline$const int *$''.
+This specification has two defects, compared to the original four: there is no automatic assertion that dereferencing a
 \lstinline$MyP$ produces an lvalue of the type that \lstinline$CP$ points at, and the
-``\lstinline$|m_l_pointer( CP )$'' assertion provides only a weak assurance that the argument passed
-to \lstinline$CP$ really is a pointer type.
+``\lstinline$|m_l_pointer( CP )$'' assertion provides only a weak assurance that the argument passed to \lstinline$CP$ really is a pointer type.
 
 
 \section{Relationships between operations}
 
-Different operators often have related meanings; for instance, in C, ``\lstinline$+$'',
+Different operators often have related meanings;
+for instance, in C, ``\lstinline$+$'',
 ``\lstinline$+=$'', and the two versions of ``\lstinline$++$'' perform variations of addition.
-Languages like {\CC} and Ada allow programmers to define operators for new types, but do not
-require that these relationships be preserved, or even that all of the operators be implemented.
-Completeness and consistency is left to the good taste and discretion of the programmer. It is
-possible to encourage these attributes by providing generic operator functions, or member functions
-of abstract classes, that are defined in terms of other, related operators.
-
-In \CFA, polymorphic functions provide the equivalent of these generic operators, and
-specifications explicitly define the minimal implementation that a programmer should provide. This
-section shows a few examples.
+Languages like {\CC} and Ada allow programmers to define operators for new types, but do not require that these relationships be preserved, or even that all of the operators be implemented.
+Completeness and consistency is left to the good taste and discretion of the programmer.
+It is possible to encourage these attributes by providing generic operator functions, or member functions of abstract classes, that are defined in terms of other, related operators.
+
+In \CFA, polymorphic functions provide the equivalent of these generic operators, and specifications explicitly define the minimal implementation that a programmer should provide.
+This section shows a few examples.
 
 
 \subsection{Relational and equality operators}
 
-The different comparison operators have obvious relationships, but there is no obvious subset of the
-operations to use in the implementation of the others. However, it is usually convenient to
-implement a single comparison function that returns a negative integer, 0, or a positive integer if
-its first argument is respectively less than, equal to, or greater than its second argument; the
-library function \lstinline$strcmp$ is an example.
-
-C and \CFA have an extra, non-obvious comparison operator: ``\lstinline$!$'', logical negation,
-returns 1 if its operand compares equal to 0, and 0 otherwise.
-\begin{lstlisting}
-context comparable( type T ) {
+The different comparison operators have obvious relationships, but there is no obvious subset of the operations to use in the implementation of the others.
+However, it is usually convenient to implement a single comparison function that returns a negative integer, 0, or a positive integer if its first argument is respectively less than, equal to, or greater than its second argument;
+the library function \lstinline$strcmp$ is an example.
+
+C and \CFA have an extra, non-obvious comparison operator: ``\lstinline$!$'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise.
+\begin{lstlisting}
+trait comparable( otype T ) {
 	const T 0;
 	int compare( T, T );
 }
-
-forall( type T | comparable( T ) ) int ?<?( T l, T r ) {
+forall( otype T | comparable( T ) ) int ?<?( T l, T r ) {
 	return compare( l, r ) < 0;
 }
 // ... similarly for <=, ==, >=, >, and !=. 
-
-forall( type T | comparable( T ) ) int !?( T operand ) {
+forall( otype T | comparable( T ) ) int !?( T operand ) {
 	return !compare( operand, 0 );
 }
@@ -4641,36 +3797,29 @@
 \subsection{Arithmetic and integer operations}
 
-A complete arithmetic type would provide the arithmetic operators and the corresponding assignment
-operators. Of these, the assignment operators are more likely to be implemented directly, because
-it is usually more efficient to alter the contents of an existing object than to create and return a
-new one. Similarly, a complete integral type would provide integral operations based on integral
-assignment operations.
-\begin{lstlisting}
-context arith_base( type T ) {
+A complete arithmetic type would provide the arithmetic operators and the corresponding assignment operators.
+Of these, the assignment operators are more likely to be implemented directly, because it is usually more efficient to alter the contents of an existing object than to create and return a new one.
+Similarly, a complete integral type would provide integral operations based on integral assignment operations.
+\begin{lstlisting}
+trait arith_base( otype T ) {
 	const T 1;
 	T ?+=?( T *, T ), ?-=?( T *, T ), ?*=?( T *, T ), ?/=?( T *, T );
 }
-
-forall( type T | arith_base( T ) ) T ?+?( T l, T r ) {
+forall( otype T | arith_base( T ) ) T ?+?( T l, T r ) {
 	return l += r;
 }
-
-forall( type T | arith_base( T ) ) T ?++( T * operand ) {
+forall( otype T | arith_base( T ) ) T ?++( T * operand ) {
 	T temporary = *operand;
 	*operand += 1;
 	return temporary;
 }
-
-forall( type T | arith_base( T ) ) T ++?( T * operand ) {
+forall( otype T | arith_base( T ) ) T ++?( T * operand ) {
 	return *operand += 1;
 }
 // ... similarly for -, --, *, and /. 
-
-context int_base( type T ) {
+trait int_base( otype T ) {
 	T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );
 	T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );
 }
-
-forall( type T | int_base( T ) ) T ?&?( T l, T r ) {
+forall( otype T | int_base( T ) ) T ?&?( T l, T r ) {
 	return l &= r;
 }
@@ -4678,9 +3827,8 @@
 \end{lstlisting}
 
-Note that, although an arithmetic type would certainly provide comparison functions, and an integral
-type would provide arithmetic operations, there does not have to be any relationship among
-\lstinline$int_base$, \lstinline$arith_base$ and \lstinline$comparable$. Note also that these
-declarations provide guidance and assistance, but they do not define an absolutely minimal set of
-requirements. A truly minimal implementation of an arithmetic type might only provide
+Note that, although an arithmetic type would certainly provide comparison functions, and an integral type would provide arithmetic operations, there does not have to be any relationship among
+\lstinline$int_base$, \lstinline$arith_base$ and \lstinline$comparable$.
+Note also that these declarations provide guidance and assistance, but they do not define an absolutely minimal set of requirements.
+A truly minimal implementation of an arithmetic type might only provide
 \lstinline$0$, \lstinline$1$, and \lstinline$?-=?$, which would be used by polymorphic
 \lstinline$?+=?$, \lstinline$?*=?$, and \lstinline$?/=?$ functions.
@@ -4692,34 +3840,40 @@
 Review index entries.
 
-Restrict allowed to qualify anything, or type/dtype parameters, but only affects pointers. This gets
-into \lstinline$noalias$ territory. Qualifying anything (``\lstinline$short restrict rs$'') means
-pointer parameters of \lstinline$?++$, etc, would need restrict qualifiers.
-
-Enumerated types. Constants are not ints. Overloading. Definition should be ``representable as an
-integer type'', not ``as an int''. C11 usual conversions freely convert to and from ordinary
-integer types via assignment, which works between any integer types. Does enum Color ?*?( enum
+Restrict allowed to qualify anything, or type/dtype parameters, but only affects pointers.
+This gets into \lstinline$noalias$ territory.
+Qualifying anything (``\lstinline$short restrict rs$'') means pointer parameters of \lstinline$?++$, etc, would need restrict qualifiers.
+
+Enumerated types.
+Constants are not ints.
+Overloading.
+Definition should be ``representable as an integer type'', not ``as an int''.
+C11 usual conversions freely convert to and from ordinary integer types via assignment, which works between any integer types.
+Does enum Color ?*?( enum
 Color, enum Color ) really make sense? ?++ does, but it adds (int)1.
 
-Operators on {,signed,unsigned} char and other small types. ?<? harmless; ?*? questionable for
-chars. Generic selections make these choices visible. Safe conversion operators? Predefined
+Operators on {,signed,unsigned} char and other small types. ?<? harmless;
+?*? questionable for chars.
+Generic selections make these choices visible.
+Safe conversion operators? Predefined
 ``promotion'' function?
 
-\lstinline$register$ assignment might be handled as assignment to a temporary with copying back and
-forth, but copying must not be done by assignment.
+\lstinline$register$ assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment.
 
 Don't use ptrdiff\_t by name in the predefineds.
 
-Polymorphic objects. Polymorphic typedefs and type declarations.
+Polymorphic objects.
+Polymorphic typedefs and type declarations.
 
 
 \bibliographystyle{plain}
-\bibliography{refrat}
+\bibliography{cfa}
 
 
 \addcontentsline{toc}{chapter}{\indexname} % add index name to table of contents
 \begin{theindex}
-Italic page numbers give the location of the main entry for the referenced term. Plain page numbers
-denote uses of the indexed term. Entries for grammar non-terminals are italicized. A typewriter
-font is used for grammar terminals and program identifiers.
+Italic page numbers give the location of the main entry for the referenced term.
+Plain page numbers denote uses of the indexed term.
+Entries for grammar non-terminals are italicized.
+A typewriter font is used for grammar terminals and program identifiers.
 \indexspace
 \input{refrat.ind}
Index: doc/user/Makefile
===================================================================
--- doc/user/Makefile	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ doc/user/Makefile	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,74 @@
+## Define the appropriate configuration variables.
+
+TeXLIB = .:../bibliography/:../LaTeXmacros/:
+LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex
+BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
+
+## Define the text source files.
+
+SOURCES = ${addsuffix .tex, \
+user \
+}
+
+FIGURES = ${addsuffix .tex, \
+}
+
+PICTURES = ${addsuffix .pstex, \
+}
+
+PROGRAMS = ${addsuffix .tex, \
+}
+
+GRAPHS = ${addsuffix .tex, \
+}
+
+## Define the documents that need to be made.
+
+DOCUMENT = user.pdf
+
+# Directives #
+
+all : ${DOCUMENT}
+
+clean :
+	rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf \
+		${FIGURES} ${PICTURES} ${PROGRAMS} ${GRAPHS} ${basename ${DOCUMENT}}.ps ${DOCUMENT}
+
+# File Dependencies #
+
+${DOCUMENT} : ${basename ${DOCUMENT}}.ps
+	ps2pdf $<
+
+${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi
+	dvips $< -o $@
+
+${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \
+		../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib
+	# Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
+	if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi
+	# Must have *.aux file containing citations for bibtex
+	if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi
+	-${BibTeX} ${basename $@}
+	# Some citations reference others so run steps again to resolve these citations
+	${LaTeX} ${basename $@}.tex
+	-${BibTeX} ${basename $@}
+	# Make index from *.aux entries and input index at end of document
+	makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx
+	${LaTeX} ${basename $@}.tex
+	# Run again to get index title into table of contents
+	${LaTeX} ${basename $@}.tex
+
+predefined :
+	sed -f predefined.sed ${basename ${DOCUMENT}}.tex > ${basename $@}.cf
+
+## Define the default recipes.
+
+%.tex : %.fig
+	fig2dev -L eepic $< > $@
+
+%.ps : %.fig
+	fig2dev -L ps $< > $@
+
+# Local Variables: #
+# compile-command: "make" #
+# End: #
Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ doc/user/user.tex	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,4480 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% 
+%% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+%%
+%% The contents of this file are covered under the licence agreement in the
+%% file "LICENCE" distributed with Cforall.
+%% 
+%% user.tex -- 
+%% 
+%% Author           : Peter A. Buhr
+%% Created On       : Wed Apr  6 14:53:29 2016
+%% Last Modified By : Peter A. Buhr
+%% Last Modified On : Sun Apr 10 22:50:15 2016
+%% Update Count     : 72
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
+
+\documentclass[openright,twoside]{article}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Latex packages used in the document.
+\usepackage[T1]{fontenc}                                % allow Latin1 (extended ASCII) characters
+\usepackage{textcomp}
+\usepackage[latin1]{inputenc}
+\usepackage{upquote}
+\usepackage{fullpage,times}
+\usepackage{xspace}
+\usepackage{varioref}
+\usepackage{listings}
+\usepackage{footmisc}
+\usepackage{comment}
+\usepackage{latexsym}                                   % \Box
+\usepackage{mathptmx}                                   % better math font with "times"
+\usepackage[pagewise]{lineno}
+\renewcommand{\linenumberfont}{\scriptsize\sffamily}
+\usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
+\usepackage{breakurl}
+\renewcommand{\UrlFont}{\small\sf}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Bespoke macros used in the document.
+\input{common}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Names used in the document.
+
+\newcommand{\CS}{C\raisebox{-0.9ex}{\large$^\sharp$}\xspace}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\setcounter{secnumdepth}{3}                             % number subsubsections
+\setcounter{tocdepth}{3}                                % subsubsections in table of contents
+\makeindex
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{document}
+\pagestyle{headings}
+\linenumbers                                            % comment out to turn off line numbering
+
+\title{\Huge
+\vspace*{1in}
+\CFA (\CFL) User Manual				\\
+Version 1.0						 	\\
+\vspace*{0.25in}
+\huge``describe not prescribe''		\\
+\vspace*{1in}
+}% title
+\author{\huge
+Peter A. Buhr and ...				\\
+}% author
+\date{
+DRAFT \\
+\today
+}% date
+
+\pagenumbering{roman}
+\pagestyle{plain}
+
+\maketitle
+
+\vspace*{\fill}
+\thispagestyle{empty}
+\noindent
+\copyright\,2016 \CFA Project \\ \\
+\noindent
+This work is licensed under the Creative Commons Attribution 4.0 International License.
+To view a copy of this license, visit {\small\url{http://creativecommons.org/licenses/by/4.0}}.
+\vspace*{1in}
+
+\clearpage
+\pdfbookmark[1]{Contents}{section}
+\tableofcontents
+
+\clearpage
+\pagenumbering{arabic}
+
+
+\section{Introduction}
+
+\CFA\footnote{Pronounced ``C-for-all'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed an as evolutionary step forward from the C programming language.
+The syntax of the \CFA language builds from C, and should look immediately familiar to C programmers.
+% Any language feature that is not described here can be assumed to be using the standard C11 syntax.
+\CFA adds many modern programming-language features, which directly leads to increased safety and productivity, while maintaining interoperability with existing C programs and maintaining C-like performance.
+Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global garbage-collection.
+The primary new features include parametric-polymorphism routines and types, exceptions, concurrency, and modules.
+
+One of the main design philosophies of \CFA is to ``describe not prescribe'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
+Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming features.
+A programmer is always free to reach back to C from \CFA for any reason, and in many cases, new \CFA features have a fallback to a C mechanism.
+There is no notion or requirement for rewriting a legacy C program in \CFA;
+instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features.
+New programs can be written in \CFA using a combination of C and \CFA features.
+\CC had a similar goal 30 years ago, but has struggled over the intervening time to incorporate modern programming-language features because of early design choices.
+\CFA has 30 years of hindsight and clean starting point.
+
+Like \CC, there may be both an old and new ways to achieve the same effect.
+For example, the following programs compare the \CFA and C I/O mechanisms.
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+#include <fstream>
+int main( void ) {
+	int x = 0, y = 1, z = 2;
+	sout | x | y | z | endl;
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+#include <stdio.h>
+int main( void ) {
+	int x = 0, y = 1, z = 2;
+	printf( "%d %d %d\n", x, y, z );
+}
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+Both programs output the same result.
+While the \CFA I/O looks similar to the \CC output style, there are several important differences, such as automatic spacing between variables as in Python (see also~\VRef{s:IOLibrary}).
+
+This document is a reference manual for the \CFA programming language, targeted at \CFA programmers.
+Implementers may refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
+In its current state, this document covers the intended core features of the language.
+Changes to the syntax and additional features are expected to be included in later revisions.
+% For additional information, see \url{http://wiki.do-lang.org}.
+
+
+\section{History}
+
+The \CFA project started with K-W C~\cite{Till89,Buhr94a}, which extended C with new declaration syntax, multiple return values from routines, and extended assignment capabilities using the notion of tuples.
+(See~\cite{Werther96} for some similar work, but for \CC.)
+The original \CFA project~\cite{Ditchfield92} extended the C type system with parametric polymorphism and overloading, as opposed to the \CC approach of object-oriented extensions to the C type-system.
+A first implementation of the core Cforall language was created~\cite{Bilson03,Esteves04}, but at the time there was little interesting in extending C, so work did not continue.
+As the saying goes, ``What goes around, comes around'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.
+
+
+\section{Why fix C?}
+
+Even with all its problems, C is a very popular programming language because it allows writing software at virtually any level in a computer system without restriction.
+For systems programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice.
+As well, there are millions of lines of C legacy code, forming the base for many software development projects (especially on UNIX systems).
+The TIOBE index (\url{http://www.tiobe.com/tiobe_index}) for March 2016 shows programming-language popularity, with Java 20.5\%, C 14.5\%, \CC 6.7\%, \CS 4.3\%, Python 4.3\%, and all other programming languages below 3\%.
+Hence, C is still an extremely important programming language, with double the usage of \CC, where \CC itself is largely C code.
+Finally, love it or hate it, C has been an important and influential part of computer science for 40 years and it appears it will continue to be for many more years.
+Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs.
+
+The goal of this project is to engineer modern language features into C in an evolutionary rather than revolutionary way.
+\CC~\cite{c++,ANSI14:C++} is an example of a similar project;
+however, it largely extended the language, and did not address existing problems.\footnote{%
+Two important existing problems addressed were changing the type of character literals from \lstinline@int@ to \lstinline@char@ and enumerator from \lstinline@int@ to the type of its enumerators.}
+Fortran~\cite{Fortran08}, Ada~\cite{Ada12}, and Cobol~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features are added and problems fixed within the framework of the existing language.
+Java~\cite{Java8}, Go~\cite{Go}, Rust~\cite{Rust} and D~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
+These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection.
+As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten.
+These costs can be prohibitive for many companies with a large software base in C/\CC, and many programmers that require retraining to a new programming language.
+
+The result of this project is a language that is largely backwards compatible with C11~\cite{C11}, but containing many modern language features and fixing some of the well known C problems.
+Without significant extension to the C programming language, C will be unable to cope with the needs of modern programming problems and programmers;
+as a result, it will fade into disuse.
+Considering the large body of existing C code and programmers, there is significant impetus to ensure C is transformed into a modern programming language.
+While C11 made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language features.
+While some may argue that modern language features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
+
+
+\section{Interoperability}
+
+\CFA is designed to integrate well with existing C programs and libraries.
+The most important feature of interoperability is to use the same calling conventions, so there is no overhead to call existing C routines.
+This feature allows users of \CFA to take advantage of the existing panoply of C libraries from inside their \CFA code.
+In fact, one of the biggest issues for any new programming language is establishing a minimum level of library code to support a large body of activities.
+Programming-language developers often state that adequate library support takes more work than designing and implementing the language itself.
+Like \CC, \CFA starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost.
+
+However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC.
+For example, the C math-library provides the following routines for computing the absolute value of the basic type: \lstinline@abs@, \lstinline@labs@, \lstinline@llabs@, \lstinline@fabs@, \lstinline@fabsf@, \lstinline@fabsl@, \lstinline@cabsf@, \lstinline@cabs@, and \lstinline@cabsl@.
+Whereas, \CFA wraps each of these routines into one with the common name \lstinline@abs@.
+\begin{lstlisting}
+char abs( char );
+extern "C" {
+int abs( int );				// use default C routine for int
+} // extern "C"
+long int abs( long int );
+long long int abs( long long int );
+float abs( float );
+double abs( double );
+long double abs( long double );
+float _Complex abs( float _Complex );
+double _Complex abs( double _Complex );
+long double _Complex abs( long double _Complex );
+\end{lstlisting}
+The problem is the name clash between the library routine \lstinline@abs@ and the \CFA names \lstinline@abs@.
+Hence, names appearing in an \lstinline@extern "C"@ block have \newterm{C linkage}.
+Then overloading polymorphism uses a mechanism called \newterm{name mangling} to create unique names that are different from C names, which are not mangled.
+Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed.
+There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type.
+This example strongly illustrates a core idea in \CFA: \emph{the power of a name}.
+The name ``\lstinline@abs@'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value.
+Hence, knowing the name \lstinline@abs@ should be sufficient to apply it to any type where it is applicable.
+The time savings and safety of using one name uniformly versus $N$ unique names should not be underestimated.
+
+
+\section{Compiling \CFA}
+
+The command \lstinline@cfa@ is used to compile \CFA program(s).
+This command works like the GNU \lstinline@gcc@\index{gcc} command, e.g.:
+\begin{lstlisting}
+cfa [ gcc-options ] C/@{\CFA}@-files [ assembler/loader-files ]
+\end{lstlisting}
+By default, \CFA programs having the following \lstinline@gcc@ flags turned on:
+\begin{description}
+\item
+\hspace*{-4pt}\lstinline@-std=gnu99@
+The 1999 C standard plus GNU extensions.
+\end{description}
+The following new \CFA option is available:
+\begin{description}
+\item
+\hspace*{-4pt}\lstinline@-CFA@
+Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
+\end{description}
+
+
+\section{Underscores in Constants}
+
+Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:
+\begin{lstlisting}
+2`_`147`_`483`_`648;				// decimal constant
+56_ul;						// decimal unsigned long constant
+0_377;						// octal constant
+0x_ff_ff;					// hexadecimal constant
+0x_ef3d_aa5c;				// hexadecimal constant
+3.141_592_654;				// floating point constant
+10_e_+1_00;					// floating point constant
+0x_ff_ff_p_3;				// hexadecimal floating point
+0x_1.ffff_ffff_p_128_l;		// hexadecimal floating point long constant
+L_"\x_ff_ee";				// wide character constant
+\end{lstlisting}
+The rules for placement of underscores is as follows:
+\begin{enumerate}
+\item
+A sequence of underscores is disallowed, e.g., \lstinline@12__34@ is invalid.
+\item
+Underscores may only appear within a sequence of digits (regardless of the digit radix).
+In other words, an underscore cannot start or end a sequence of digits, e.g., \lstinline@_1@, \lstinline@1_@ and \lstinline@_1_@ are invalid (actually, the 1st and 3rd examples are identifier names).
+\item
+A numeric prefix may end with an underscore;
+a numeric infix may begin and/or end with an underscore;
+a numeric suffix may begin with an underscore.
+For example, the octal \lstinline@0@ or hexadecimal \lstinline@0x@ prefix may end with an underscore \lstinline@0_377@ or \lstinline@0x_ff@;
+the exponent infix \lstinline@E@ may start or end with an underscore \lstinline@1.0_E10@, \lstinline@1.0E_10@ or \lstinline@1.0_E_10@;
+the type suffixes \lstinline@U@, \lstinline@L@, etc. may start with an underscore \lstinline@1_U@, \lstinline@1_ll@ or \lstinline@1.0E10_f@.
+\end{enumerate}
+It is significantly easier to read and enter long constants when they are broken up into smaller groupings (most cultures use comma or period among digits for the same purpose).
+This extension is backwards compatible, matches with the use of underscore in variable names, and appears in Ada and Java.
+
+
+\section{Declarations}
+\label{s:Declarations}
+
+C declaration syntax is notoriously confusing and error prone.
+For example, many C programmers are confused by a declaration as simple as:
+\begin{lstlisting}
+int *x[ 10 ]
+\end{lstlisting}
+Is this a pointer to an array of 10 integers or an array of 10 pointers to integers?
+Another example of confusion results from the fact that a routine name and its parameters are embedded within the return type, mimicking the way the return value is used at the routine's call site.
+For example, a routine returning a pointer to an array of integers is defined and used in the following way:
+\begin{lstlisting}
+int (*f())[ 10 ] {...};
+... (*f())[  3 ] += 1;	// definition mimics usage
+\end{lstlisting}
+Essentially, the return type is wrapped around the routine name in successive layers (like an onion).
+While attempting to make the two contexts consistent was a laudable goal, it has not worked out in practice.
+
+\CFA provides its own type, variable and routine declarations, using a slightly different syntax.
+The new declarations place modifiers to the left of the base type, while C declarations place modifiers to the right of the base type.
+The only exception is bit field specification, which always appear to the right of the base type.
+C and the new \CFA declarations may appear together in the same program block, but cannot be mixed within a specific declaration.
+
+In \CFA declarations, the same tokens are used as in C: the character \lstinline@*@ is used to indicate a pointer, square brackets \lstinline@[@\,\lstinline@]@ are used to represent an array, and parentheses \lstinline@()@ are used to indicate a routine parameter.
+However, unlike C, \CFA type declaration tokens are specified from left to right and the entire type specification is distributed across all variables in the declaration list.
+For instance, variables \lstinline@x@ and \lstinline@y@ of type pointer to integer are defined in \CFA as follows:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+`* int x, y;`
+\end{lstlisting}
+&
+\begin{lstlisting}
+int *x, *y;
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+Other examples are:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}}	\\
+\begin{lstlisting}
+[ 10 ] int z;
+[ 10 ] * char w;
+* [ 10 ] double v;
+struct s {
+	int f0:3;
+	* int f1;
+	[ 10 ] * int f2;
+};
+\end{lstlisting}
+&
+\begin{lstlisting}
+int z[ 10 ];
+char *w[ 10 ];
+double (*v)[ 10 ];
+struct s {
+	int f0:3;
+	int *f1;
+	int *f2[ 10 ]
+};
+\end{lstlisting}
+&
+\begin{lstlisting}
+// array of 10 integers
+// array of 10 pointers to char
+// pointer to array of 10 doubles
+
+// common bit field syntax
+
+
+
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+
+All type qualifiers, i.e., \lstinline@const@ and \lstinline@volatile@, are used in the normal way with the new declarations but appear left to right, e.g.:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}}	\\
+\begin{lstlisting}
+const * const int x;
+const * [ 10 ] const int y;
+\end{lstlisting}
+&
+\begin{lstlisting}
+int const * const x;
+const int (* const y)[ 10 ]
+\end{lstlisting}
+&
+\begin{lstlisting}
+// const pointer to const integer
+// const pointer to array of 10 const integers
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+All declaration qualifiers, i.e., \lstinline@extern@, \lstinline@static@, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}
+The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} e.g.:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}}	\\
+\begin{lstlisting}
+extern [ 10 ] int x;
+static * const int y;
+\end{lstlisting}
+&
+\begin{lstlisting}
+int extern x[ 10 ];
+const int static *y;
+\end{lstlisting}
+&
+\begin{lstlisting}
+// externally visible array of 10 integers
+// internally visible pointer to constant int
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+
+Unsupported are K\&R C declarations where the base type defaults to \lstinline@int@, if no type is specified\footnote{
+At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}},
+e.g.:
+\begin{lstlisting}
+x;						// int x
+*y;						// int *y
+f( p1, p2 );			// int f( int p1, int p2 );
+f( p1, p2 ) {}			// int f( int p1, int p2 ) {}
+\end{lstlisting}
+
+As stated above, the two styles of declaration may appear together in the same block.
+Therefore, a programmer has the option of either continuing to use traditional C declarations or take advantage of the new style.
+Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX systems.
+
+
+\section{Type Operators}
+
+The new declaration syntax can be used in other contexts where types are required, e.g., casts and the pseudo-routine \lstinline@sizeof@:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+y = (* int)x;
+i = sizeof([ 10 ] * int);
+\end{lstlisting}
+&
+\begin{lstlisting}
+y = (int *)x;
+i = sizeof(int *[ 10 ]);
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+
+
+\section{Routine Definition}
+
+\CFA also supports a new syntax for routine definition, as well as ISO C and K\&R routine syntax.
+The point of the new syntax is to allow returning multiple values from a routine~\cite{CLU,Galletly96}, e.g.:
+\begin{lstlisting}
+`[ int o1, int o2, char o3 ]` f( int i1, char i2, char i3 ) {
+	@\emph{routine body}@
+}
+\end{lstlisting}
+where routine \lstinline@f@ has three output (return values) and three input parameters.
+Existing C syntax cannot be extended with multiple return types because it is impossible to embed a single routine name within multiple return type specifications.
+
+In detail, the brackets, \lstinline@[]@, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{
+Michael Tiemann, with help from Doug Lea, provided named return values in g++, circa 1989.}
+The value of each local return variable is automatically returned at routine termination.
+Declaration qualifiers can only appear at the start of a routine definition, e.g.:
+\begin{lstlisting}
+extern [ int x ] g( int y ) {@\,@}
+\end{lstlisting}
+Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified;
+in both cases the type is assumed to be void as opposed to old style C defaults of int return type and unknown parameter types, respectively, as in:
+\begin{lstlisting}
+[@\,@] g(@\,@);				// no input or output parameters
+[ void ] g( void );			// no input or output parameters
+\end{lstlisting}
+
+Routine f is called as follows:
+\begin{lstlisting}
+[ i, j, ch ] = f( 3, 'a', ch );
+\end{lstlisting}
+The list of return values from f and the grouping on the left-hand side of the assignment is called a tuple and discussed in Section 12.
+
+\CFA style declarations cannot be used to declare parameters for K\&R style routine definitions because of the following ambiguity:
+\begin{lstlisting}
+int (*f(x))[ 10 ] int x; {}
+\end{lstlisting}
+The string ``\lstinline@int (*f(x))[ 10 ]@'' declares a K\&R style routine of type returning a pointer to an array of 10 integers, while the string ``\lstinline@[ 10 ] int x@'' declares a \CFA style parameter x of type array of 10 integers.
+Since the strings overlap starting with the open bracket, \lstinline@[@, there is an ambiguous interpretation for the string.
+As well, \CFA-style declarations cannot be used to declare parameters for C-style routine-definitions because of the following ambiguity:
+\begin{lstlisting}
+typedef int foo;
+int f( int (* foo) );		// foo is redefined as a parameter name
+\end{lstlisting}
+The string ``\lstinline@int (* foo)@'' declares a C-style named-parameter of type pointer to an integer (the parenthesis are superfluous), while the same string declares a \CFA style unnamed parameter of type routine returning integer with unnamed parameter of type pointer to foo.
+The redefinition of a type name in a parameter list is the only context in C where the character \lstinline@*@ can appear to the left of a type name, and \CFA relies on all type modifier characters appearing to the right of the type name.
+The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts.
+
+C-style declarations can be used to declare parameters for \CFA style routine definitions, e.g.:
+\begin{lstlisting}
+[ int ] f( * int, int * );	// returns an integer, accepts 2 pointers to integers
+[ * int, int * ] f( int );	// returns 2 pointers to integers, accepts an integer
+\end{lstlisting}
+The reason for allowing both declaration styles in the new context is for backwards compatibility with existing preprocessor macros that generate C-style declaration-syntax, as in:
+\begin{lstlisting}
+#define ptoa( n, d ) int (*n)[ d ]
+int f( ptoa(p,10) ) ...		// expands to int f( int (*p)[ 10 ] )
+[ int ] f( ptoa(p,10) ) ...	// expands to [ int ] f( int (*p)[ 10 ] )
+\end{lstlisting}
+Again, programmers are highly encouraged to use one declaration form or the other, rather than mixing the forms.
+
+
+\subsection{Returning Values}
+
+Named return values handle the case where it is necessary to define a local variable whose value is then returned in a \lstinline@return@ statement, as in:
+\begin{lstlisting}
+int f() {
+	int x;
+	... x = 0; ... x = y; ...
+	return x;
+}
+\end{lstlisting}
+Because the value in the return variable is automatically returned when a \CFA routine terminates, the \lstinline@return@ statement \emph{does not} contain an expression, as in:
+\begin{lstlisting}
+`[ int x ]` f() {
+	... x = 0; ... x = y; ...
+	`return;` // implicitly return x
+}
+\end{lstlisting}
+When the return is encountered, the current value of \lstinline@x@ is returned to the calling routine.
+As well, ``falling off the end'' of a routine without a \lstinline@return@ statement is permitted, as in:
+\begin{lstlisting}
+[ int x ] f() {
+	... x = 0; ... x = y; ...
+} // implicitly return x
+\end{lstlisting}
+In this case, the current value of \lstinline@x@ is returned to the calling routine just as if a \lstinline@return@ had been encountered.
+
+
+\subsection{Routine Prototype}
+
+The syntax of the new routine prototype declaration follows directly from the new routine definition syntax;
+as well, parameter names are optional, e.g.:
+\begin{lstlisting}
+[ int x ] f ();				// returning int with no parameters
+[ * int ] g (int y);		// returning pointer to int with int parameter
+[ ] h (int,char);			// returning no result with int and char parameters
+[ * int,int ] j (int);		// returning pointer to int and int, with int parameter
+\end{lstlisting}
+This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa).
+It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), e.g.:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+[ int ] f(int), g;
+\end{lstlisting}
+&
+\begin{lstlisting}
+int f(int), g(int);
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} e.g.:
+\begin{lstlisting}
+extern [ int ] f (int);
+static [ int ] g (int);
+\end{lstlisting}
+
+
+\section{Routine Pointers}
+
+The syntax for pointers to \CFA routines specifies the pointer name on the right, e.g.:
+\begin{lstlisting}
+* [ int x ] () fp;			// pointer to routine returning int with no parameters
+* [ * int ] (int y) gp;		// pointer to routine returning pointer to int with int parameter
+* [ ] (int,char) hp;		// pointer to routine returning no result with int and char parameters
+* [ * int,int ] (int) jp;	// pointer to routine returning pointer to int and int, with int parameter
+\end{lstlisting}
+While parameter names are optional, \emph{a routine name cannot be specified};
+for example, the following is incorrect:
+\begin{lstlisting}
+* [ int x ] f () fp;		// routine name "f" is not allowed
+\end{lstlisting}
+
+
+\section{Named and Default Arguments}
+
+Named and default arguments~\cite{Hardgrave76}\footnote{
+Francez~\cite{Francez77} proposed a further extension to the named-parameter passing style, which specifies what type of communication (by value, by reference, by name) the argument is passed to the routine.}
+are two mechanisms to simplify routine call.
+Both mechanisms are discussed with respect to \CFA.
+\begin{description}
+\item[Named (or Keyword) Arguments:]
+provide the ability to specify an argument to a routine call using the parameter name rather than the position of the parameter.
+For example, given the routine:
+\begin{lstlisting}
+void p( int x, int y, int z ) {...}
+\end{lstlisting}
+a positional call is:
+\begin{lstlisting}
+p( 4, 7, 3 );
+\end{lstlisting}
+whereas a named (keyword) call may be:
+\begin{lstlisting}
+p( z : 3, x : 4, y : 7 ); // rewrite $\Rightarrow$ p( 4, 7, 3 )
+\end{lstlisting}
+Here the order of the arguments is unimportant, and the names of the parameters are used to associate argument values with the corresponding parameters.
+The compiler rewrites a named call into a positional call.
+The advantages of named parameters are:
+\begin{itemize}
+\item
+Remembering the names of the parameters may be easier than the order in the routine definition.
+\item
+Parameter names provide documentation at the call site (assuming the names are descriptive).
+\item
+Changes can be made to the order or number of parameters without affecting the call (although the call must still be recompiled).
+\end{itemize}
+
+Unfortunately, named arguments do not work in C-style programming-languages because a routine prototype is not required to specify parameter names, nor do the names in the prototype have to match with the actual definition.
+For example, the following routine prototypes and definition are all valid.
+\begin{lstlisting}
+void p( int, int, int );			// equivalent prototypes
+void p( int x, int y, int z );
+void p( int y, int x, int z );
+void p( int z, int y, int x );
+void p( int q, int r, int s ) {}	// match with this definition
+\end{lstlisting}
+Forcing matching parameter names in routine prototypes with corresponding routine definitions is possible, but goes against a strong tradition in C programming.
+Alternatively, prototype definitions can be eliminated by using a two-pass compilation, and implicitly creating header files for exports.
+The former is easy to do, while the latter is more complex.
+Currently, \CFA does \emph{not} attempt to support named arguments.
+
+\item[Default Arguments]
+provide the ability to associate a default value with a parameter so it can be optionally specified in the argument list.
+For example, given the routine:
+\begin{lstlisting}
+void p( int x = 1, int y = 2, int z = 3 ) {...}
+\end{lstlisting}
+the allowable positional calls are:
+\begin{lstlisting}
+p();				// rewrite $\Rightarrow$ p( 1, 2, 3 )
+p( 4 );				// rewrite $\Rightarrow$ p( 4, 2, 3 )
+p( 4, 4 );			// rewrite $\Rightarrow$ p( 4, 4, 3 )
+p( 4, 4, 4 );		// rewrite $\Rightarrow$ p( 4, 4, 4 )
+// empty arguments
+p(  , 4, 4 );		// rewrite $\Rightarrow$ p( 1, 4, 4 )
+p( 4,  , 4 );		// rewrite $\Rightarrow$ p( 4, 2, 4 )
+p( 4, 4,   );		// rewrite $\Rightarrow$ p( 4, 4, 3 )
+p( 4,  ,   );		// rewrite $\Rightarrow$ p( 4, 2, 3 )
+p(  , 4,   );		// rewrite $\Rightarrow$ p( 1, 4, 3 )
+p(  ,  , 4 );		// rewrite $\Rightarrow$ p( 1, 2, 4 )
+p(  ,  ,   );		// rewrite $\Rightarrow$ p( 1, 2, 3 )
+\end{lstlisting}
+Here the missing arguments are inserted from the default values in the parameter list.
+The compiler rewrites missing default values into explicit positional arguments.
+The advantages of default values are:
+\begin{itemize}
+\item
+Routines with a large number of parameters are often very generalized, giving a programmer a number of different options on how a computation is performed.
+For many of these kinds of routines, there are standard or default settings that work for the majority of computations.
+Without default values for parameters, a programmer is forced to specify these common values all the time, resulting in long argument lists that are error prone.
+\item
+When a routine's interface is augmented with new parameters, it extends the interface providing generalizability\footnote{
+``It should be possible for the implementor of an abstraction to increase its generality.
+So long as the modified abstraction is a generalization of the original, existing uses of the abstraction will not require change.
+It might be possible to modify an abstraction in a manner which is not a generalization without affecting existing uses, but, without inspecting the modules in which the uses occur, this possibility cannot be determined.
+This criterion precludes the addition of parameters, unless these parameters have default or inferred values that are valid for all possible existing applications.''~\cite[p.~128]{Cormack90}}
+(somewhat like the generalization provided by inheritance for classes).
+That is, all existing calls are still valid, although the call must still be recompiled.
+\end{itemize}
+The only disadvantage of default arguments is that unintentional omission of an argument may not result in a compiler-time error.
+Instead, a default value is used, which may not be the programmer's intent.
+
+Default values may only appear in a prototype versus definition context:
+\begin{lstlisting}
+void p( int x, int y = 2, int z = 3 );		// prototype: allowed
+void p( int, int = 2, int = 3 );			// prototype: allowed
+void p( int x, int y = 2, int z = 3 ) {}	// definition: not allowed
+\end{lstlisting}
+The reason for this restriction is to allow separate compilation.
+Multiple prototypes with different default values is an error.
+\end{description}
+
+Ellipse (``...'') arguments present problems when used with default arguments.
+The conflict occurs because both named and ellipse arguments must appear after positional arguments, giving two possibilities:
+\begin{lstlisting}
+p( /* positional */, . . ., /* named */ );
+p( /* positional */, /* named */, . . . );
+\end{lstlisting}
+While it is possible to implement both approaches, the first possibly is more complex than the second, e.g.:
+\begin{lstlisting}
+p( int x, int y, int z, . . . );
+p( 1, 4, 5, 6, z : 3, y : 2 ); // assume p( /* positional */, . . ., /* named */ );
+p( 1, z : 3, y : 2, 4, 5, 6 ); // assume p( /* positional */, /* named */, . . . );
+\end{lstlisting}
+In the first call, it is necessary for the programmer to conceptually rewrite the call, changing named arguments into positional, before knowing where the ellipse arguments begin.
+Hence, this approach seems significantly more difficult, and hence, confusing and error prone.
+In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
+
+The problem is exacerbated with default arguments, e.g.:
+\begin{lstlisting}
+void p( int x, int y = 2, int z = 3. . . );
+p( 1, 4, 5, 6, z : 3 );		// assume p( /* positional */, . . ., /* named */ );
+p( 1, z : 3, 4, 5, 6 );		// assume p( /* positional */, /* named */, . . . );
+\end{lstlisting}
+The first call is an error because arguments 4 and 5 are actually positional not ellipse arguments;
+therefore, argument 5 subsequently conflicts with the named argument z : 3.
+In the second call, the default value for y is implicitly inserted after argument 1 and the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
+For these reasons, \CFA requires named arguments before ellipse arguments.
+Finally, while ellipse arguments are needed for a small set of existing C routines, like printf, the extended \CFA type system largely eliminates the need for ellipse arguments (see Section 24), making much of this discussion moot.
+
+Default arguments and overloading (see Section 24) are complementary.
+While in theory default arguments can be simulated with overloading, as in:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{default arguments}}	& \multicolumn{1}{c}{\textbf{overloading}}	\\
+\begin{lstlisting}
+void p( int x, int y = 2, int z = 3 ) {...}
+
+
+\end{lstlisting}
+&
+\begin{lstlisting}
+void p( int x, int y, int z ) {...}
+void p( int x ) { p( x, 2, 3 ); }
+void p( int x, int y ) { p( x, y, 3 ); }
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+the number of required overloaded routines is linear in the number of default values, which is unacceptable growth.
+In general, overloading should only be used over default arguments if the body of the routine is significantly different.
+Furthermore, overloading cannot handle accessing default arguments in the middle of a positional list, via a missing argument, such as:
+\begin{lstlisting}
+p( 1, /* default */, 5 );		// rewrite $\Rightarrow$ p( 1, 2, 5 )
+\end{lstlisting}
+
+Given the \CFA restrictions above, both named and default arguments are backwards compatible.
+\CC only supports default arguments;
+Ada supports both named and default arguments.
+
+
+\section{Type/Routine Nesting}
+
+Nesting of types and routines is useful for controlling name visibility (\newterm{name hiding}).
+
+
+\subsection{Type Nesting}
+
+\CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type!hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l|l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{C Type Nesting}}	& \multicolumn{1}{c}{\textbf{C Implicit Hoisting}}	& \multicolumn{1}{|c}{\textbf{\CFA}}	\\
+\hline
+\begin{lstlisting}
+struct S {
+	enum C { R, G, B };
+	struct T {
+		union U { int i, j; };
+		enum C c;
+		short int i, j;
+	};
+	struct T t;
+} s;
+
+int fred() {
+	s.t.c = R;
+	struct T t = { R, 1, 2 };
+	enum C c;
+	union U u;
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+enum C { R, G, B };
+union U { int i, j; };
+struct T {
+	enum C c;
+	short int i, j;
+};
+struct S {
+	struct T t;
+} s;
+	
+
+
+
+
+
+
+\end{lstlisting}
+&
+\begin{lstlisting}
+struct S {
+	enum C { R, G, B };
+	struct T {
+		union U { int i, j; };
+		enum C c;
+		short int i, j;
+	};
+	struct T t;
+} s;
+
+int fred() {
+	s.t.c = `S.`R;	// type qualification
+	struct `S.`T t = { `S.`R, 1, 2 };
+	enum `S.`C c;
+	union `S.T.`U u;
+}
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+In the left example in C, types \lstinline@C@, \lstinline@U@ and \lstinline@T@ are implicitly hoisted outside of type \lstinline@S@ into the containing block scope.
+In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``\lstinline@.@'' for type qualification, as does Java, rather than the \CC type-selection operator ``\lstinline@::@''.
+
+
+\subsection{Routine Nesting}
+
+While \CFA does not provide object programming by putting routines into structures, it does rely heavily on locally nested routines to redefine operations at or close to a call site.
+For example, the C quick-sort is wrapped into the following polymorphic \CFA routine:
+\begin{lstlisting}
+forall( otype T | { int ?<?( T, T ); } )
+void qsort( const T * arr, size_t dimension );
+\end{lstlisting}
+which can be used to sort in ascending and descending order by locally redefining the less-than operator into greater-than.
+\begin{lstlisting}
+const unsigned int size = 10;
+int ia[size];
+...						// assign values to array ia
+qsort( ia, size );		// sort ascending order using builtin ?<?
+{
+	`int ?<?( int x, int y ) { return x > y; }` // nested routine
+	qsort( ia, size );	// sort descending order by local redefinition
+}
+\end{lstlisting}
+
+Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks;
+the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program.
+The following program in undefined in \CFA (and \lstinline@gcc@\index{gcc})
+\begin{lstlisting}
+[* [int]( int )] foo() {		// int (*foo())( int )
+	int `i` = 7;
+	int bar( int p ) {
+		`i` += 1;					// dependent on local variable
+		sout | `i` | endl;
+	}
+	return bar;					// undefined because of local dependence
+}
+int main() {
+	* [int](int) fp = foo();	// int (*fp)(int)
+    sout | fp( 3 ) | endl;
+}
+\end{lstlisting}
+because 
+
+Currently, there are no \Index{lambda} expressions, i.e., unnamed routines because routine names are very important to properly select the correct routine.
+
+
+\section{Tuples}
+
+In C and \CFA, lists of elements appear in several contexts, such as the parameter list for a routine call.
+(More contexts are added shortly.)
+A list of such elements is called a tuple.
+The general syntax of a tuple is:
+\begin{lstlisting}
+[ $\emph{exprlist}$ ]
+\end{lstlisting}
+where \lstinline@$\emph{exprlist}$@ is a list of one or more expressions separated by commas.
+The brackets, \lstinline$[]$, allow differentiating between tuples and expressions containing the C comma operator.
+The following are examples of tuples:
+\begin{lstlisting}
+[ x, y, z ]
+[ 2 ]
+[ v+w, x*y, 3.14159, f() ]
+\end{lstlisting}
+Tuples are permitted to contain sub-tuples (i.e., nesting), such as \lstinline@[ [ 14, 21 ], 9 ]@, which is a 2-element tuple whose first element is itself a tuple.
+Note, a tuple is not a record (structure);
+a record denotes a single value with substructure, whereas a tuple is multiple values with no substructure (see flattening coercion in Section 12.1).
+In essence, tuples are largely a compile time phenomenon, having little or no runtime presence.
+
+Tuples can be organized into compile-time tuple variables;
+these variables are of \newterm{tuple type}.
+Tuple variables and types can be used anywhere lists of conventional variables and types can be used.
+The general syntax of a tuple type is:
+\begin{lstlisting}
+[ @\emph{typelist}@ ]
+\end{lstlisting}
+where \lstinline@$\emph{typelist}$@ is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications.
+Examples of tuple types include:
+\begin{lstlisting}
+[ unsigned int, char ]
+[ double, double, double ]
+[ * int, int * ]		// mix of CFA and ANSI
+[ * [ 10 ] int, * * char, * [ [ int, int ] ] (int, int) ]
+\end{lstlisting}
+Like tuples, tuple types may be nested, such as \lstinline@[ [ int, int ], int ]@, which is a 2-element tuple type whose first element is itself a tuple type.
+
+Examples of declarations using tuple types are:
+\begin{lstlisting}
+[ int, int ] x;			// 2 element tuple, each element of type int
+* [ char, char ] y;		// pointer to a 2 element tuple
+[ [ int, int ] ] z ([ int, int ]);
+\end{lstlisting}
+The last example declares an external routine that expects a 2 element tuple as an input parameter and returns a 2 element tuple as its result.
+
+As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call.
+In unambiguous situations, the tuple brackets may be omitted, e.g., a tuple that appears as an argument may have its
+square brackets omitted for convenience; therefore, the following routine invocations are equivalent:
+\begin{lstlisting}
+f( [ 1, x+2, fred() ] );
+f( 1, x+2, fred() );
+\end{lstlisting}
+Also, a tuple or a tuple variable may be used to supply all or part of an argument list for a routine expecting multiple input parameters or for a routine expecting a tuple as an input parameter.
+For example, the following are all legal:
+\begin{lstlisting}
+[ int, int ] w1;
+[ int, int, int ] w2;
+[ void ] f (int, int, int); /* three input parameters of type int */
+[ void ] g ([ int, int, int ]); /* 3 element tuple as input */
+f( [ 1, 2, 3 ] );
+f( w1, 3 );
+f( 1, w1 );
+f( w2 );
+g( [ 1, 2, 3 ] );
+g( w1, 3 );
+g( 1, w1 );
+g( w2 );
+\end{lstlisting}
+Note, in all cases 3 arguments are supplied even though the syntax may appear to supply less than 3. As mentioned, a
+tuple does not have structure like a record; a tuple is simply converted into a list of components.
+\begin{rationale}
+The present implementation of \CFA does not support nested routine calls when the inner routine returns multiple values; i.e., a statement such as \lstinline@g( f() )@ is not supported.
+Using a temporary variable to store the  results of the inner routine and then passing this variable to the outer routine works, however.
+\end{rationale}
+
+A tuple can contain a C comma expression, provided the expression containing the comma operator is enclosed in parentheses.
+For instance, the following tuples are equivalent:
+\begin{lstlisting}
+[ 1, 3, 5 ]
+[ 1, (2, 3), 5 ]
+\end{lstlisting}
+The second element of the second tuple is the expression (2, 3), which yields the result 3.
+This requirement is the same as for comma expressions in argument lists.
+
+Type qualifiers, i.e., const and volatile, may modify a tuple type.
+The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], i.e., the qualifier is distributed across all of the types in the tuple, e.g.:
+\begin{lstlisting}
+const volatile [ int, float, const int ] x;
+\end{lstlisting}
+is equivalent to:
+\begin{lstlisting}
+[ const volatile int, const volatile float, const volatile int ] x;
+\end{lstlisting}
+Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, e.g.:
+\begin{lstlisting}
+extern [ int, int ] w1;
+static [ int, int, int ] w2;
+\end{lstlisting}
+\begin{rationale}
+Unfortunately, C's syntax for subscripts precluded treating them as tuples.
+The C subscript list has the form \lstinline@[i][j]...@ and not \lstinline@i, j, ...]@.
+Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, e.g., \lstinline@f[g()]@ always means a single subscript value because there is only one set of brackets.
+Fixing this requires a major change to C because the syntactic form \lstinline@M[i, j, k]@ already has a particular meaning: \lstinline@i, j, k@ is a comma expression.
+\end{rationale}
+
+
+\subsection{Tuple Coercions}
+
+There are four coercions that can be performed on tuples and tuple variables: closing, opening, flattening and structuring.
+In addition, the coercion of dereferencing can be performed on a tuple variable to yield its value(s), as for other variables.
+A \newterm{closing coercion} takes a set of values and converts it into a tuple value, which is a contiguous set of values, as in:
+\begin{lstlisting}
+[ int, int, int, int ] w;
+w = [ 1, 2, 3, 4 ];
+\end{lstlisting}
+First the right-hand tuple is closed into a tuple value and then the tuple value is assigned.
+
+An \newterm{opening coercion} is the opposite of closing; a tuple value is converted into a tuple of values, as in:
+\begin{lstlisting}
+[ a, b, c, d ] = w
+\end{lstlisting}
+\lstinline@w@ is implicitly opened to yield a tuple of four values, which are then assigned individually.
+
+A \newterm{flattening coercion} coerces a nested tuple, i.e., a tuple with one or more components, which are themselves tuples, into a flattened tuple, which is a tuple whose components are not tuples, as in:
+\begin{lstlisting}
+[ a, b, c, d ] = [ 1, [ 2, 3 ], 4 ];
+\end{lstlisting}
+First the right-hand tuple is flattened and then the values are assigned individually.
+Flattening is also performed on tuple types.
+For example, the type \lstinline@[ int, [ int, int ], int ]@ can be coerced, using flattening, into the type \lstinline@[ int, int, int, int ]@.
+
+A \newterm{structuring coercion} is the opposite of flattening;
+a tuple is structured into a more complex nested tuple.
+For example, structuring the tuple \lstinline@[ 1, 2, 3, 4 ]@ into the tuple \lstinline@[ 1, [ 2, 3 ], 4 ]@ or the tuple type \lstinline@[ int, int, int, int ]@ into the tuple type \lstinline@[ int, [ int, int ], int ]@.
+In the following example, the last assignment illustrates all the tuple coercions:
+\begin{lstlisting}
+[ int, int, int, int ] w = [ 1, 2, 3, 4 ];
+int x = 5;
+[ x, w ] = [ w, x ];		// all four tuple coercions
+\end{lstlisting}
+Starting on the right-hand tuple in the last assignment statement, w is opened, producing a tuple of four values;
+therefore, the right-hand tuple is now the tuple \lstinline@[ [ 1, 2, 3, 4 ], 5 ]@.
+This tuple is then flattened, yielding \lstinline@[ 1, 2, 3, 4, 5 ]@, which is structured into \lstinline@[ 1, [ 2, 3, 4, 5 ] ]@ to match the tuple type of the left-hand side.
+The tuple \lstinline@[ 2, 3, 4, 5 ]@ is then closed to create a tuple value.
+Finally, \lstinline@x@ is assigned \lstinline@1@ and \lstinline@w@ is assigned the tuple value using multiple assignment (see Section 14).
+\begin{rationale}
+A possible additional language extension is to use the structuring coercion for tuples to initialize a complex record with a tuple.
+\end{rationale}
+
+
+\section{Mass Assignment}
+
+\CFA permits assignment to several variables at once using mass assignment~\cite{CLU}.
+Mass assignment has the following form:
+\begin{lstlisting}
+[ @\emph{lvalue}@, ..., @\emph{lvalue}@ ] = @\emph{expr}@;
+\end{lstlisting}
+The left-hand side is a tuple of \lstinline@$\emph{lvalues}$@, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement.
+\lstinline@$\emph{expr}$@ is any standard arithmetic expression.
+Clearly, the types of the entities being assigned must be type compatible with the value of the expression.
+
+Mass assignment has parallel semantics, e.g., the statement:
+\begin{lstlisting}
+[ x, y, z ] = 1.5;
+\end{lstlisting}
+is equivalent to:
+\begin{lstlisting}
+x = 1.5; y = 1.5; z = 1.5;
+\end{lstlisting}
+This semantics is not the same as the following in C:
+\begin{lstlisting}
+x = y = z = 1.5;
+\end{lstlisting}
+as conversions between intermediate assignments may lose information.
+A more complex example is:
+\begin{lstlisting}
+[ i, y[i], z ] = a + b;
+\end{lstlisting}
+which is equivalent to:
+\begin{lstlisting}
+t = a + b;
+a1 = &i; a2 = &y[i]; a3 = &z;
+*a1 = t; *a2 = t; *a3 = t;
+\end{lstlisting}
+The temporary \lstinline@t@ is necessary to store the value of the expression to eliminate conversion issues.
+The temporaries for the addresses are needed so that locations on the left-hand side do not change as the values are assigned.
+In this case, \lstinline@y[i]@ uses the previous value of \lstinline@i@ and not the new value set at the beginning of the mass assignment.
+
+
+\section{Multiple Assignment}
+
+\CFA also supports the assignment of several values at once, known as multiple assignment~\cite{CLU,Galletly96}.
+Multiple assignment has the following form:
+\begin{lstlisting}
+[ @\emph{lvalue}@, . . ., @\emph{lvalue}@ ] = [ @\emph{expr}@, . . ., @\emph{expr}@ ];
+\end{lstlisting}
+The left-hand side is a tuple of \lstinline@$\emph{lvalues}$@, and the right-hand side is a tuple of \lstinline@$\emph{expr}$@s.
+Each \lstinline@$\emph{expr}$@ appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \lstinline@$\emph{lvalues}$@ on the left-hand side of the statement using parallel semantics for each assignment.
+An example of multiple assignment is:
+\begin{lstlisting}
+[ x, y, z ] = [ 1, 2, 3 ];
+\end{lstlisting}
+Here, the values \lstinline@1@, \lstinline@2@ and \lstinline@3@ are assigned, respectively, to the variables \lstinline@x@, \lstinline@y@ and \lstinline@z@.
+ A more complex example is:
+\begin{lstlisting}
+[ i, y[ i ], z ] = [ 1, i, a + b ];
+\end{lstlisting}
+Here, the values \lstinline@1@, \lstinline@i@ and \lstinline@a + b@ are assigned to the variables \lstinline@i@, \lstinline@y[i]@ and \lstinline@z@, respectively.
+ Note, the parallel semantics of
+multiple assignment ensures:
+\begin{lstlisting}
+[ x, y ] = [ y, x ];
+\end{lstlisting}
+correctly interchanges (swaps) the values stored in \lstinline@x@ and \lstinline@y@.
+The following cases are errors:
+\begin{lstlisting}
+[ a, b, c ] = [ 1, 2, 3, 4 ];
+[ a, b, c ] = [ 1, 2 ];
+\end{lstlisting}
+because the number of entities in the left-hand tuple is unequal with the right-hand tuple.
+
+As for all tuple contexts in C, side effects should not be used because C does not define an ordering for the evaluation of the elements of a tuple;
+both these examples produce indeterminate results:
+\begin{lstlisting}
+f( x++, x++ );				// C routine call with side effects in arguments
+[ v1, v2 ] = [ x++, x++ ];	// side effects in righthand side of multiple assignment
+\end{lstlisting}
+
+
+\section{Cascade Assignment}
+
+As in C, \CFA mass and multiple assignments can be cascaded, producing cascade assignment.
+Cascade assignment has the following form:
+\begin{lstlisting}
+@\emph{tuple}@ = @\emph{tuple}@ = ... = @\emph{tuple}@;
+\end{lstlisting}
+and it has the same parallel semantics as for mass and multiple assignment.
+Some examples of cascade assignment are:
+\begin{lstlisting}
+x1 = y1 = x2 = y2 = 0;
+[ x1, y1 ] = [ x2, y2 ] = [ x3, y3 ];
+[ x1, y1 ] = [ x2, y2 ] = 0;
+[ x1, y1 ] = z = 0;
+\end{lstlisting}
+As in C, the rightmost assignment is performed first, i.e., assignment parses right to left.
+
+
+\section{Field Tuples}
+
+Tuples may be used to select multiple fields of a record by field name.
+Its general form is:
+\begin{lstlisting}
+@\emph{expr}@ . [ @\emph{fieldlist}@ ]
+@\emph{expr}@ -> [ @\emph{fieldlist}@ ]
+\end{lstlisting}
+\lstinline@$\emph{expr}$@ is any expression yielding a value of type record, e.g., \lstinline@struct@, \lstinline@union@.
+Each element of \lstinline@$\emph{ fieldlist}$@ is an element of the record specified by \lstinline@$\emph{expr}$@.
+A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is
+the following:
+\begin{lstlisting}
+struct s {
+	int f1, f2;
+	char f3;
+	double f4;
+} v;
+v.[ f3, f1, f2 ] = ['x', 11, 17 ];	// equivalent to v.f3 = 'x', v.f1 = 11, v.f2 = 17
+f( v.[ f3, f1, f2 ] );				// equivalent to f( v.f3, v.f1, v.f2 )
+\end{lstlisting}
+Note, the fields appearing in a record-field tuple may be specified in any order;
+also, it is unnecessary to specify all the fields of a struct in a multiple record-field tuple.
+
+If a field of a \lstinline@struct@ is itself another \lstinline@struct@, multiple fields of this subrecord can be specified using a nested record-field tuple, as in the following example:
+\begin{lstlisting}
+struct inner {
+	int f2, f3;
+};
+struct outer {
+	int f1;
+	struct inner i;
+	double f4;
+} o;
+
+o.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ];
+\end{lstlisting}
+
+
+\section{Labelled Break/Continue}
+
+While C provides \lstinline@break@ and \lstinline@continue@ statements for altering control flow, both are restricted to one level of nesting for a particular control structure.
+Unfortunately, this restriction forces programmers to use \lstinline@goto@ to achieve the equivalent for more than one level of nesting.
+To prevent having to make this switch, the \lstinline@break@ and \lstinline@continue@ are extended with a target label to support static multi-level exit~\cite{Buhr85,Java}.
+For the labelled \lstinline@break@, it is possible to specify which control structure is the target for exit, as in:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+`L1:` for ( ... ) {
+	`L2:` for ( ... ) {
+		`L3:` for ( ... ) {
+			... break `L1`; ...
+			... break `L2`; ...
+			... break `L3`; // or break
+		}
+	}
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+for ( ... ) {
+	for ( ... ) {
+		for ( ... ) {
+			... goto L1; ...
+			... goto L2; ...
+			... goto L3; // or break
+		} L3: ;
+	} L2: ;
+} L1: ;
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+The inner most loop has three exit points, which cause termination of one or more of the three nested loops, respectively.
+For the labelled \lstinline@continue@, it is possible to specify which control structure is the target for the next loop iteration, as in:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+`L1`: for ( ... ) {
+	`L2`: for ( ... ) {
+		`L3`: for ( ... ) {
+			... continue `L1`; ...
+			... continue `L2`; ...
+			... continue `L3`; ...
+
+		}
+
+	}
+
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+for ( ... ) {
+	for ( ... ) {
+		for ( ... ) {
+			... goto L1; ...
+			... goto L2; ...
+			... goto L3; ...
+		  L3: ;
+		}
+	  L2: ;
+	}
+  L1: ;
+}
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+The inner most loop has three restart points, which cause the next loop iteration to begin, respectively.
+For both \lstinline@break@ and \lstinline@continue@, the target label must be directly associated with a \lstinline@for@, \lstinline@while@ or \lstinline@do@ statement;
+for \lstinline@break@, the target label can also be associated with a \lstinline@switch@ statement.
+Both \lstinline@break@ and \lstinline@continue@ with target labels are simply a \lstinline@goto@ restricted in the following ways:
+\begin{itemize}
+\item
+They cannot be used to create a loop.
+This means that only the looping construct can be used to create a loop.
+This restriction is important since all situations that can result in repeated execution of statements in a program are clearly delineated.
+\item
+Since they always transfers out of containing control structures, they cannot be used to branch into a control structure.
+\end{itemize}
+The advantage of the labelled \lstinline@break@/\lstinline@continue@ is that it allows static multi-level exits without having to use the \lstinline@goto@ statement and ties control flow to the target control structure rather than an arbitrary point in a program.
+Furthermore, the location of the label at the beginning of the target control structure informs the reader that complex control-flow is occurring in the body of the control structure.
+With \lstinline@goto@, the label at the end of the control structure fails to convey this important clue early enough to the reader.
+Finally, using an explicit target for the transfer instead of an implicit target allows new nested loop or switch constructs to be added or removed without affecting other constructs.
+The implicit targets of the current \lstinline@break@ and \lstinline@continue@, i.e., the closest enclosing loop or \lstinline@switch@, change as certain constructs are added or removed.
+
+
+\section{Switch Statement}
+
+C allows a number of questionable forms for the \lstinline@switch@ statement:
+\begin{enumerate}
+\item
+By default, the end of a \lstinline@case@ clause\footnote{
+In this section, the term \emph{case clause} refers to either a \lstinline@case@ or \lstinline@default@ clause.}
+\emph{falls through} to the next \lstinline@case@ clause in the \lstinline@switch@ statement;
+to exit a \lstinline@switch@ statement from a \lstinline@case@ clause requires explicitly terminating the clause with a transfer statement, most commonly \lstinline@break@, as in:
+\begin{lstlisting}
+switch ( i ) {
+  case 1:
+	...
+	// fall-through
+  case 2:
+	...
+	break;	// exit switch statement
+}
+\end{lstlisting}
+The ability to fall-through to the next clause is a useful form of control flow, specifically when a sequence of case actions compound, as in:
+\begin{lstlisting}
+switch ( argc ) {
+  case 3:
+	// open output file
+	// fall-through
+  case 2:
+	// open input file
+	break;	// exit switch statement
+  default:
+	// usage message
+}
+\end{lstlisting}
+In this example, case 2 is always done if case 3 is done.
+This control flow is difficult to simulate with if statements or a \lstinline@switch@ statement without fall-through as code must be duplicated or placed in a separate routine.
+C also uses fall-through to handle multiple case-values resulting in the same action, as in:
+\begin{lstlisting}
+switch ( i ) {
+  case 1: case 3: case 5:	// odd values
+	// same action
+	break;
+  case 2: case 4: case 6:	// even values
+	// same action
+	break;
+}
+\end{lstlisting}
+However, this situation is handled in other languages without fall-through by allowing a list of case values.
+While fall-through itself is not a problem, the problem occurs when fall-through is the \lstinline@default@, as this semantics is not intuitive to most programmers and is different from virtually all other programming languages with a \lstinline@switch@ statement.
+Hence, \lstinline@default@ fall-through semantics results in a large number of programming errors as programmers often forget the \lstinline@break@ statement at the end of a \lstinline@case@ clause, resulting in inadvertent fall-through.
+
+\item
+It is possible to place \lstinline@case@ clauses on statements nested \emph{within} the body of the \lstinline@switch@ statement, as in:
+\begin{lstlisting}
+switch ( i ) {
+  case 0:
+	if ( j < k ) {
+		...
+	  case 1:		// transfer into "if" statement
+		if ( j < m ) {
+			...
+		  case 2:	// transfer into "if" statement
+			...
+		}
+	}
+  case 3:
+	while ( j < 5 ) {
+		...
+	  case 4:		// transfer into "while" statement
+		...
+	}
+}
+\end{lstlisting}
+The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties.
+The comprehension problem occurs from the inability to determine how control reaches a particular point due to the number of branches leading to it.
+The technical problem results from the inability to ensure allocation and initialization of variables when blocks are not entered at the beginning.
+Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors.
+There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
+Nevertheless, C does have an idiom where this capability is used, known as ``Duff's device''~\cite{Duff83}:
+\begin{lstlisting}
+register int n = (count + 7) / 8;
+switch ( count % 8 ) {
+case 0: do{ *to = *from++;
+case 7:		*to = *from++;
+case 6:		*to = *from++;
+case 5:		*to = *from++;
+case 4:		*to = *from++;
+case 3:		*to = *from++;
+case 2:		*to = *from++;
+case 1:		*to = *from++;
+		} while ( --n > 0 );
+}
+\end{lstlisting}
+which unrolls a loop N times (N = 8 above) and uses the \lstinline@switch@ statement to deal with any iterations not a multiple of N.
+While efficient, this sort of special purpose usage is questionable:
+\begin{quote}
+Disgusting, no? But it compiles and runs just fine. I feel a combination of pride and revulsion at this
+discovery.~\cite{Duff83}
+\end{quote}
+\item
+It is possible to place the \lstinline@default@ clause anywhere in the list of labelled clauses for a \lstinline@switch@ statement, rather than only at the end.
+Virtually all programming languages with a \lstinline@switch@ statement require the \lstinline@default@ clause to appear last in the case-clause list.
+The logic for this semantics is that after checking all the \lstinline@case@ clauses without success, the \lstinline@default@ clause is selected;
+hence, physically placing the \lstinline@default@ clause at the end of the \lstinline@case@ clause list matches with this semantics.
+This physical placement can be compared to the physical placement of an \lstinline@else@ clause at the end of a series of connected \lstinline@if@/\lstinline@else@ statements.
+
+\item
+It is possible to place unreachable code at the start of a \lstinline@switch@ statement, as in:
+\begin{lstlisting}
+switch ( x ) {
+	int y = 1;			// unreachable initialization
+	x = 7;				// unreachable code
+  case 3: ...
+	y = 3;
+	...
+}
+\end{lstlisting}
+While the declaration of the local variable \lstinline@y@ is useful and its scope is across all \lstinline@case@ clauses, the initialization for such a variable is defined to never be executed because control always transfers over it.
+Furthermore, any statements before the first \lstinline@case@ clause can only be executed if labelled and transfered to using a \lstinline@goto@, either from outside or inside of the \lstinline@switch@.
+As mentioned, transfer into control structures should be forbidden.
+Transfers from within the \lstinline@switch@ body using a \lstinline@goto@ are equally unpalatable.
+\end{enumerate}
+Before discussing potential language changes to deal with these problems, it is worth observing that in a typical C program:
+\begin{itemize}
+\item
+the number of \lstinline@switch@ statements is small,
+\item
+most \lstinline@switch@ statements are well formed (i.e., no Duff's device),
+\item
+the \lstinline@default@ clause is usually written as the last case-clause,
+\item
+and there is only a medium amount of fall-through from one \lstinline@case@ clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.
+\end{itemize}
+These observations should help to put the effects of suggested changes into perspective.
+% Figure 1 shows the grammar change that attempts to minimize the effect on existing C programs.
+\begin{enumerate}
+\item
+Eliminating the \lstinline@default@ fall-through problem has the greatest potential for affecting existing code.
+However, even if fall-through is removed, most \lstinline@switch@ statements would continue to work because of the explicit transfers already present at the end of each \lstinline@case@ clause, and the common placement of the \lstinline@default@ clause at the end of the case list.
+In addition, the above grammar provides for the most common use of fall-through, i.e., a list of \lstinline@case@ clauses executing common code, e.g.:
+\begin{lstlisting}
+case 1:  case 2:  case 3: ...
+\end{lstlisting}
+Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments.
+Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of \lstinline@switch@ statement, called \lstinline@choose@, with no fall-through semantics.
+The \lstinline@choose@ statement is identical to the new \lstinline@switch@ statement, except there is no implicit fall-through between case-clauses and the \lstinline@break@ statement applies to the enclosing loop construct (as for the continue statement in a \lstinline@switch@ statement).
+It is still possible to fall-through if a case-clause ends with the new keyword fallthru, e.g.:
+\begin{lstlisting}
+choose ( i ) {
+	int i;
+  case 3, 4:
+	i = 3;
+	fallthru;
+  case 8, 10:
+  default:
+	j = 3;
+}
+\end{lstlisting}
+The ability to fall-through is retained because it is a sufficient C-idiom that most C programmers simply expect it, and its absence might discourage these programmers from using the choose statement.
+\item
+Eliminating Duff's device is straightforward and only invalidates a small amount of very questionable code.
+The solution is to allow \lstinline@case@ clauses to only appear at the same nesting level as the \lstinline@switch@ body, as is done in most other programming languages with \lstinline@switch@ statements.
+\item
+The issue of \lstinline@default@ at locations other than at the end of the cause clause can be solved by using good programming style, and there are a few reasonable situations involving fall-through where the \lstinline@default@ clause may appear is locations other than at the end.
+Therefore, no language change is made for this issue.
+\item
+Dealing with unreachable code at the start of a \lstinline@switch@ statement is solved by defining the declaration-list, including any associated initialization, at the start of a \lstinline@switch@ statement body to be executed before the transfer to the appropriate \lstinline@case@ clause.
+This semantics is the same as for declarations at the start of a loop body, which are executed before each iteration of the loop body.
+As well, this grammar does not allow statements to appear before the first \lstinline@case@ clause.
+The change is compatible for declarations with initialization in this context because existing code cannot assume the initialization has occurred.
+The change is incompatible for statements, but any existing code using it is highly questionable, as in:
+\begin{lstlisting}
+switch ( i ) {
+	L: x = 5;		// questionable code
+  case 0:
+	...
+}
+\end{lstlisting}
+The statement after the \lstinline@switch@ can never be executed unless it is labelled.
+If it is labelled, it must be transfered to from outside or inside the \lstinline@switch@ statement, neither of which is acceptable control flow.
+\end{enumerate}
+
+
+\section{Case Clause}
+
+C restricts the \lstinline@case@ clause of a \lstinline@switch@ statement to a single value.
+For multiple \lstinline@case@ clauses associated with the same statement, it is necessary to have multiple \lstinline@case@ clauses rather than multiple values.
+Requiring a \lstinline@case@ clause for each value does not seem to be in the spirit of brevity normally associated with C.
+Therefore, the \lstinline@case@ clause is extended with a list of values, as in:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}}	\\
+\begin{lstlisting}
+switch ( i ) {
+  `case 1, 3, 5`:
+	...
+  `case 2, 4, 6`:
+	...
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+switch ( i ) {
+  case 1: case 3 : case 5:
+	...
+  case 2: case 4 : case 6:
+	...
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+
+// odd values
+
+// even values
+
+
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+In addition, two forms of subranges are allowed to specify case values: the GNU C form and a new \CFA form.
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{GNU C}}	\\
+\begin{lstlisting}
+switch ( i ) {
+  `case 1~5:`
+	...
+  `case 10~15:`
+	...
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+switch ( i )
+  case 1 ... 5:
+	...
+  case 10 ... 15:
+	...
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+
+// 1, 2, 3, 4, 5
+
+// 10, 11, 12, 13, 14, 15
+
+
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+
+
+\section{Unnamed Structure Fields}
+
+C requires each field of a structure to have a name, except for a bit field associated with a basic type, e.g.:
+\begin{lstlisting}
+struct {
+	int f1;			// named field
+	int f2 : 4;		// named field with bit field size
+	int : 3;		// unnamed field for basic type with bit field size
+	int ;			// disallowed, unnamed field
+	int *;			// disallowed, unnamed field
+	int (*)(int);	// disallowed, unnamed field
+};
+\end{lstlisting}
+This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed.
+As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size.
+A list of unnamed fields is also supported, e.g.:
+\begin{lstlisting}
+struct {
+	int , , ;		// 3 unnamed fields
+}
+\end{lstlisting}
+
+
+\section{Exception Handling}
+
+Exception handling provides two mechanim: change of control flow from a raise to a handler, and commumication from the riase to the handler.
+\begin{lstlisting}
+exception void h( int i );
+exception int h( int i, double d );
+
+void f(...) {
+	... throw h( 3 );
+	... i = resume h( 3, 5.1 );
+}
+
+try {
+	f(...);
+} catch h( int w ) {
+	// reset
+} resume h( int p, double x ) {
+	return 17;  // recover
+} finally {
+}
+\end{lstlisting}
+So the type raised would be the mangled name of the exception prototype and that name would be matched at the handler clauses by comparing the strings.
+The arguments for the call would have to be packed in a message and unpacked at handler clause and then a call made to the handler.
+
+
+\section{Types}
+
+\subsection{Type Definitions}
+
+\CFA allows users to define new types using the keyword type.
+
+\begin{lstlisting}
+// SensorValue is a distinct type and represented as an int
+type SensorValue = int;
+\end{lstlisting}
+
+A type definition is different from a typedef in C because a typedef just creates an alias for a type,  while Do.s type definition creates a distinct type.
+This means that users can define distinct function overloads for the new type (see Overloading for more information).
+For example:
+
+\begin{lstlisting}
+type SensorValue = int;
+void printValue(int v) {...}
+void printValue(SensorValue v) {...}
+void process(int v) {...}
+
+SensorValue s = ...;
+
+printValue(s); // calls version with SensorValue argument
+
+printValue((int) s); // calls version with int argument
+
+process(s); // implicit conversion to int
+\end{lstlisting}
+
+If SensorValue was defined with a typedef, then these two print functions would not have unique signatures.
+This can be very useful to create a distinct type that has the same representation as another type.
+
+The compiler will assume it can safely convert from the old type to the new type, implicitly.
+Users may override this and define a function that must be called to convert from one type to another.
+
+\begin{lstlisting}
+type SensorValue = int;
+// ()? is the overloaded conversion operator identifier
+// This function converts an int to a SensorValue
+SensorValue ()?(int val) {
+	...
+}
+void process(int v) {...}
+
+SensorValue s = ...;
+process(s); // implicit call to conversion operator
+\end{lstlisting}
+
+In many cases, it is not desired for the compiler to do this implicit conversion.
+To avoid that, the user can use the explicit modifier on the conversion operator.
+Any places where the conversion is needed but not explicit (with a cast), will result in a compile-time error.
+
+\begin{lstlisting}
+type SensorValue = int;
+
+// conversion from int to SensorValue; must be explicit
+explicit SensorValue ()?(int val) {
+	...
+}
+
+void process(int v) {...}
+
+SensorValue s = ...;
+process(s); // implicit cast to int: compile-time error
+process((int) s); // explicit cast to int: calls conversion func
+\end{lstlisting}
+
+The conversion may not require any code, but still need to be explicit; in that case, the syntax can be simplified to:
+\begin{lstlisting}
+type SensorValue = int;
+explicit SensorValue ()?(int);
+void process(int v) {...}
+
+SensorValue s = ...;
+process(s); // compile-time error
+process((int) s); // type is converted, no function is called
+\end{lstlisting}
+
+
+\subsection{Structures}
+
+Structures in \CFA are basically the same as structures in C.
+A structure is defined with the same syntax as in C.
+When referring to a structure in \CFA, users may omit the struct keyword.
+\begin{lstlisting}
+struct Point {
+	double x;
+	double y;
+};
+
+Point p = {0.0, 0.0};
+\end{lstlisting}
+
+\CFA does not support inheritance among types, but instead uses composition to enable reuse of structure fields.
+Composition is achieved by embedding one type into another.
+When type A is embedded in type B, an object with type B may be used as an object of type A, and the fields of type A are directly accessible.
+Embedding types is achieved using anonymous members.
+For example, using Point from above:
+\begin{lstlisting}
+void foo(Point p);
+
+struct ColoredPoint {
+	Point; // anonymous member (no identifier)
+	int Color;
+};
+...
+	ColoredPoint cp = ...;
+	cp.x = 10.3; // x from Point is accessed directly
+	cp.color = 0x33aaff; // color is accessed normally
+	foo(cp); // cp can be used directly as a Point
+\end{lstlisting}
+
+
+\subsection{Constructors and Destructors}
+
+\CFA supports C initialization of structures, but it also adds constructors for more advanced initialization.
+Additionally, \CFA adds destructors that are called when a variable is de-allocated (variable goes out of scope or object is deleted).
+These functions take a reference to the structure as a parameter (see
+References for more information).
+
+\begin{figure}
+\begin{lstlisting}
+struct Widget {
+	int id;
+	float size;
+	Parts *optionalParts;
+};
+
+// ?{} is the constructor operator identifier
+// The first argument is a reference to the type to initialize
+// Subsequent arguments can be specified for initialization
+
+void ?{}(Widget &w) { // default constructor
+	w.id = -1;
+	w.size = 0.0;
+	w.optionalParts = 0;
+}
+
+// constructor with values (does not need to include all fields)
+void ?{}(Widget &w, int id, float size) {
+	w.id = id;
+	w.size = size;
+	w.optionalParts = 0;
+}
+
+// ^? is the destructor operator identifier
+void ^?(Widget &w) { // destructor
+	w.id = 0;
+	w.size = 0.0;
+	if (w.optionalParts != 0) {
+	// This is the only pointer to optionalParts, free it
+	free(w.optionalParts);
+	w.optionalParts = 0;
+	}
+}
+
+Widget baz; // reserve space only
+Widget foo{}; // calls default constructor
+Widget bar{23, 2.45}; // calls constructor with values
+baz{24, 0.91}; // calls constructor with values
+?{}(baz, 24, 0.91}; // explicit call to constructor
+^bar; // explicit call to destructor
+^?(bar); // explicit call to destructor
+\end{lstlisting}
+\caption{Constructors and Destructors}
+\end{figure}
+
+
+\begin{comment}
+\section{References}
+
+\CFA supports reference types similar to rvalue references in \CC.
+A reference is essentially an alias for a variable, allowing multiple names to refer to the same object.
+A reference can be used as a safer alternative to a pointer, because it can be used to pass a variable by reference, but it must always reference an object.
+It cannot be NULL, it must be assigned a value at initialization, and the object it references cannot change once it is set.
+By introducing references in parameter types, users are given an easy way to pass a value by reference, without the need for NULL pointer checks.
+In structures, a reference can replace a pointer to an object that should always have a valid value.
+When a structure contains a reference, all of its constructors must initialize the reference and all instances of this structure must initialize it upon definition.
+
+The syntax for using references in \CFA is the same as \CC with the exception of reference initialization.
+Use \lstinline@&@ to specify a reference, and access references just like regular objects, not like pointers (use dot notation to access fields).
+When initializing a reference, \CFA uses a different syntax which differentiates reference initialization from assignment to a reference.
+The \lstinline@&@ is used on both sides of the expression to clarify that the address of the reference is being set to the address of the variable to which it refers.
+
+\begin{figure}
+\begin{lstlisting}
+// parameter p is a reference to a Point
+void movePointUp(Point &p) {
+	p.y += 1.0; // Uses dot-notation to access fields
+}
+
+Point p1 = ...;
+ColoredPoint cp1 = ...;
+movePoint(p1); // reference to p1 passed to movePoint
+movePoint(cp1); // reference to cp1 passed to movePoint
+
+// a ListElement cannot be created without a valid list
+
+struct ListElement {
+	int element;
+	List &list; // a list element has a reference to the list
+}
+
+// The constructor must initialize the reference
+void ?{}(ListElement &le, int e, List &l) {
+	le.element = e;
+	&le.list = &l; // initialize the reference
+}
+
+ListElement e1{88, numberList}; // uses constructor
+ListElement e2; // compiler error: uninitialized reference
+Listing 10: References
+\end{lstlisting}
+\end{figure}
+\end{comment}
+
+
+\section{Overloading}
+
+Overloading refers to the capability of a programmer to define and use multiple objects in a program with the same name.
+In \CFA, a declaration may overload declarations from outer scopes with the same name, instead of hiding them as is the case in C.
+This may cause identical C and \CFA programs to behave differently.
+The compiler selects the appropriate object (overload resolution) based on context information at the place where it is used.
+Overloading allows programmers to give functions with different signatures but similar semantics the same name, simplifying the interface to users.
+Disadvantages of overloading are that it can be used to give functions with different semantics the same name, causing confusion, or that the compiler may resolve to a different function from what the programmer expected.
+\CFA allows overloading of functions, operators, variables, and even the constants 0 and 1.
+
+The compiler follows some overload resolution rules to determine the best interpretation of all of these overloads.
+The best valid interpretations are the valid interpretations that use the fewest unsafe conversions.
+Of these, the best are those where the functions and objects involved are the least polymorphic.
+Of these, the best have the lowest total conversion cost, including all implicit conversions in the argument expressions.
+Of these, the best have the highest total conversion cost for the implicit conversions (if any) applied to the argument expressions.
+If there is no single best valid interpretation, or if the best valid interpretation is ambiguous, then the resulting interpretation is ambiguous.
+For details about type inference and overload resolution, please see the \CFA Language Specification.
+\begin{lstlisting}
+int foo(int a, int b) {
+	float sum = 0.0;
+	float special = 1.0;
+	{
+		int sum = 0;
+		// both the float and int versions of sum are available
+		float special = 4.0;
+		// this inner special hides the outer version
+		...
+	}
+	...
+}
+\end{lstlisting}
+
+
+\subsection{Overloaded Constant}
+
+The constants 0 and 1 have special meaning.
+In \CFA, as in C, all scalar types can be incremented and
+decremented, which is defined in terms of adding or subtracting 1.
+The operations \lstinline@&&@, \lstinline@||@, and \lstinline@!@ can be applied to any scalar arguments and are defined in terms of comparison against 0 (ex. \lstinline@(a && b)@ becomes \lstinline@(a != 0 && b != 0)@).
+
+In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any
+arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a
+special case.
+However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their
+functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their
+polymorphic parameters, and user-defined pointer-like types may need a null value.
+Defining special
+constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline@_Bool@.
+
+Why just 0 and 1? Why not other integers? No other integers have special status in C.
+A facility that let programmers declare specific constants..const Rational 12., for instance. would not be much of an improvement.
+Some facility for defining the creation of values of programmer-defined types from arbitrary integer tokens would be needed.
+The complexity of such a feature doesn.t seem worth the gain.
+
+For example, to define the constants for a complex type, the programmer would define the following:
+
+\begin{lstlisting}
+struct Complex {
+	double real;
+	double imaginary;
+}
+
+const Complex 0 = {0, 0};
+const Complex 1 = {1, 0};
+...
+
+	Complex a = 0;
+...
+
+	a++;
+...
+	if (a) { // same as if (a == 0)
+...
+}
+\end{lstlisting}
+
+
+\subsection{Variable Overloading}
+
+The overload rules of \CFA allow a programmer to define multiple variables with the same name, but different types.
+Allowing overloading of variable names enables programmers to use the same name across multiple types, simplifying naming conventions and is compatible with the other overloading that is allowed.
+For example, a developer may want to do the following:
+\begin{lstlisting}
+int pi = 3;
+float pi = 3.14;
+char pi = .p.;
+\end{lstlisting}
+
+
+\subsection{Function Overloading}
+
+Overloaded functions in \CFA are resolved based on the number and type of arguments, type of return value, and the level of specialization required (specialized functions are preferred over generic).
+
+The examples below give some basic intuition about how the resolution works.
+\begin{lstlisting}
+// Choose the one with less conversions
+int doSomething(int value) {...} // option 1
+int doSomething(short value) {...} // option 2
+
+int a, b = 4;
+short c = 2;
+
+a = doSomething(b); // chooses option 1
+a = doSomething(c); // chooses option 2
+
+// Choose the specialized version over the generic
+
+generic(type T)
+T bar(T rhs, T lhs) {...} // option 3
+float bar(float rhs, float lhs){...} // option 4
+float a, b, c;
+double d, e, f;
+c = bar(a, b); // chooses option 4
+
+// specialization is preferred over unsafe conversions
+
+f = bar(d, e); // chooses option 5
+\end{lstlisting}
+
+
+\subsection{Operator Overloading}
+
+\CFA also allows operators to be overloaded, to simplify the use of user-defined types.
+Overloading the operators allows the users to use the same syntax for their custom types that they use for built-in types, increasing readability and improving productivity.
+\CFA uses the following special identifiers to name overloaded operators:
+
+\begin{table}[hbt]
+\hfil
+\begin{tabular}[t]{ll}
+%identifier & operation \\ \hline
+\lstinline@?[?]@ & subscripting \impl{?[?]}\\
+\lstinline@?()@ & function call \impl{?()}\\
+\lstinline@?++@ & postfix increment \impl{?++}\\
+\lstinline@?--@ & postfix decrement \impl{?--}\\
+\lstinline@++?@ & prefix increment \impl{++?}\\
+\lstinline@--?@ & prefix decrement \impl{--?}\\
+\lstinline@*?@ & dereference \impl{*?}\\
+\lstinline@+?@ & unary plus \impl{+?}\\
+\lstinline@-?@ & arithmetic negation \impl{-?}\\
+\lstinline@~?@ & bitwise negation \impl{~?}\\
+\lstinline@!?@ & logical complement \impl{"!?}\\
+\lstinline@?*?@ & multiplication \impl{?*?}\\
+\lstinline@?/?@ & division \impl{?/?}\\
+\end{tabular}\hfil
+\begin{tabular}[t]{ll}
+%identifier & operation \\ \hline
+\lstinline@?%?@ & remainder \impl{?%?}\\
+\lstinline@?+?@ & addition \impl{?+?}\\
+\lstinline@?-?@ & subtraction \impl{?-?}\\
+\lstinline@?<<?@ & left shift \impl{?<<?}\\
+\lstinline@?>>?@ & right shift \impl{?>>?}\\
+\lstinline@?<?@ & less than \impl{?<?}\\
+\lstinline@?<=?@ & less than or equal \impl{?<=?}\\
+\lstinline@?>=?@ & greater than or equal \impl{?>=?}\\
+\lstinline@?>?@ & greater than \impl{?>?}\\
+\lstinline@?==?@ & equality \impl{?==?}\\
+\lstinline@?!=?@ & inequality \impl{?"!=?}\\
+\lstinline@?&?@ & bitwise AND \impl{?&?}\\
+\end{tabular}\hfil
+\begin{tabular}[t]{ll}
+%identifier & operation \\ \hline
+\lstinline@?^?@ & exclusive OR \impl{?^?}\\
+\lstinline@?|?@ & inclusive OR \impl{?"|?}\\
+\lstinline@?=?@ & simple assignment \impl{?=?}\\
+\lstinline@?*=?@ & multiplication assignment \impl{?*=?}\\
+\lstinline@?/=?@ & division assignment \impl{?/=?}\\
+\lstinline@?%=?@ & remainder assignment \impl{?%=?}\\
+\lstinline@?+=?@ & addition assignment \impl{?+=?}\\
+\lstinline@?-=?@ & subtraction assignment \impl{?-=?}\\
+\lstinline@?<<=?@ & left-shift assignment \impl{?<<=?}\\
+\lstinline@?>>=?@ & right-shift assignment \impl{?>>=?}\\
+\lstinline@?&=?@ & bitwise AND assignment \impl{?&=?}\\
+\lstinline@?^=?@ & exclusive OR assignment \impl{?^=?}\\
+\lstinline@?|=?@ & inclusive OR assignment \impl{?"|=?}\\
+\end{tabular}
+\hfil
+\caption{Operator Identifiers}
+\label{opids}
+\end{table}
+
+These identifiers are defined such that the question marks in the name identify the location of the operands.
+These operands represent the parameters to the functions, and define how the operands are mapped to the function call.
+For example, \lstinline@a + b@ becomes \lstinline@?+?(a, b)@.
+
+In the example below, a new type, myComplex, is defined with an overloaded constructor, + operator, and string operator.
+These operators are called using the normal C syntax.
+
+\begin{lstlisting}
+type Complex = struct { // define a Complex type
+	double real;
+	double imag;
+}
+
+// Constructor with default values
+
+void ?{}(Complex &c, double real = 0.0, double imag = 0.0) {
+	c.real = real;
+	c.imag = imag;
+}
+
+Complex ?+?(Complex lhs, Complex rhs) {
+	Complex sum;
+	sum.real = lhs.real + rhs.real;
+	sum.imag = lhs.imag + rhs.imag;
+	return sum;
+}
+
+String ()?(const Complex c) {
+	// use the string conversions for the structure members
+	return (String)c.real + . + . + (String)c.imag + .i.;
+}
+...
+
+Complex a, b, c = {1.0}; // constructor for c w/ default imag
+...
+c = a + b;
+print(.sum = . + c);
+\end{lstlisting}
+
+
+\section{Auto Type-Inferencing}
+
+Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization expression type.
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}ll@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CC}}	& \multicolumn{1}{c}{\lstinline@gcc@}\index{gcc} \\
+\begin{lstlisting}
+
+auto j = 3.0 * 4;
+int i;
+auto k = i;
+\end{lstlisting}
+&
+\begin{lstlisting}
+#define expr 3.0 * i
+typeof(expr) j = expr;
+int i;
+typeof(i) k = i;
+\end{lstlisting}
+&
+\begin{lstlisting}
+
+// use type of initialization expression
+
+// use type of primary variable
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+The two important capabilities are:
+\begin{itemize}
+\item
+preventing having to determine or write out long generic types,
+\item
+ensure secondary variables, related to a primary variable, always have the same type.
+\end{itemize}
+
+In \CFA, \lstinline@typedef@ provides a mechanism to alias long type names with short ones, both globally and locally, but not eliminate the use of the short name.
+\lstinline@gcc@ provides \lstinline@typeof@ to declare a secondary variable from a primary variable.
+\CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression.
+Only for overloaded routines with the same return type is variable type-inferencing possible.
+Finally, \lstinline@auto@ presents the programming problem of tracking down a type when the type is actually needed.
+For example, given
+\begin{lstlisting}
+auto j = `...`
+\end{lstlisting}
+and the need to write a routine to compute using \lstinline@j@
+\begin{lstlisting}
+void rtn( `...` parm );
+rtn( j );
+\end{lstlisting}
+A programmer must work backwards to determine the type of \lstinline@j@'s initialization expression, reconstructing the possibly long generic type-name.
+In this situation, having the type name or a short alias is very useful.
+
+There is also the conundrum in type inferencing of when to \emph{\Index{brand}} a type.
+That is, when is the type of the variable more important than the type of its initialization expression.
+For example, if a change is made in an initialization expression, it can cause hundreds or thousands of cascading type changes and/or errors.
+At some point, a programmer wants the type of the variable to remain constant and the expression to be in error when it changes.
+
+Given \lstinline@typedef@ and \lstinline@typeof@ in \CFA, and the strong need to use the type of left-hand side in inferencing, auto type-inferencing is not supported at this time.
+Should a significant need arise, this feature can be revisited.
+
+
+\section{Generics}
+
+\CFA supports parametric polymorphism to allow users to define generic functions and types.
+Generics allow programmers to use type variables in place of concrete types so that the code can be reused with multiple types.
+The type parameters can be restricted to satisfy a set of constraints.
+This enables \CFA to build fully compiled generic functions and types, unlike other languages like \CC where templates are expanded or must be explicitly instantiated.
+
+
+\subsection{Generic Functions}
+
+Generic functions in \CFA are similar to template functions in \CC, and will sometimes be expanded into specialized versions, just like in \CC.
+The difference, however, is that generic functions in \CFA can also be separately compiled, using function pointers for callers to pass in all needed functionality for the given type.
+This means that compiled libraries can contain generic functions that can be used by programs linked with them (statically or dynamically).
+Another advantage over \CC templates is unlike templates, generic functions are statically checked, even without being instantiated.
+
+A simple example of using Do.s parametric polymorphism to create a generic swap function would look like this:
+
+\begin{lstlisting}
+generic(type T)
+void swap(T &a, T &b) {
+	T tmp = a;
+	a = b;
+	b = a;
+}
+
+int a, b;
+swap(a, b);
+
+Point p1, p2;
+swap(p1, p2);
+\end{lstlisting}
+
+Here, instead of specifying types for the parameters a and b, the function has a generic type parameter, type T.
+This function can be called with any type, and the compiler will handle generating the proper code for that type, using call site inference to determine the appropriate value for T.
+
+
+\subsection{Bounded Quantification}
+
+Some generic functions only work (or make sense) for any type that satisfies a given property.
+For example, here is a function to pick the minimum of two values of some type.
+\begin{lstlisting}
+generic (type T | bool ?<?(T, T) )
+
+T min(T a, T b) {
+	return a < b ? a : b;
+}
+\end{lstlisting}
+
+It only makes sense to call min with values of a type that has an ordering: a way to decide whether one value is less than another.
+The ordering function used here is the less than operator, <.
+The syntax used to reference the operator is discussed in further detail in Operator Overloading.
+In \CFA, this assertion on the type of a generic is written as the bound, (type T | bool ?<?(T, T)).
+The \CFA compiler enforces that minis only called with types for which the less than operator is defined, and reports a compile-time error otherwise.
+
+Bounds can also involve multiple types, and multiple requirements, as shown below:
+\begin{lstlisting}
+generic (type T, type U | { T foo(T, U); U bar(U); })
+
+T baz(T t, U u) {
+	return foo(t, bar(u));
+}
+\end{lstlisting}
+
+
+\subsection{Interfaces}
+
+Type bounds as shown above are not very informative, merely requiring that a function exists with the right name and type.
+Suppose you try to call a polymorphic function and \CFA gives you an error that int combine(int, int) is not defined.
+Can you define it? What is it supposed to do? Perhaps it should compute the sum, or the bitwise and, or the maximum, or the least common multiple; or perhaps it's an operation that can't be defined for integers.
+The function signature doesn't say.
+
+Interfaces gather together a set of function signatures under a common name, which solves two problems.
+First, an interface name can be used in type bounds instead of function signatures.
+This avoids repetition when a bound is used in many functions.
+Second, interfaces explicitly document the existence of a commonly used set of functionality, making programs easier to understand.
+\begin{lstlisting}
+generic (type T)
+interface Orderable {
+	bool ?<?(T, T);
+};
+
+generic (type T | Orderable(T))
+T min(T a, T b) {
+	return a < b ? a : b;
+}
+\end{lstlisting}
+
+This definition of the interface Orderable makes the generic function min easier to read and understand.
+Orderable can also be reused for other generic functions, max for example.
+Interfaces can also build on top of other interfaces.
+For example:
+\begin{lstlisting}
+generic (type T | Orderable(T)
+interface FooBarable {
+	int foo(T, T);
+	int Bar(T, T);
+};
+\end{lstlisting}
+
+The FooBarable interface specifies all of the bounds of the Orderable interface, plus the additional bounds specified in its definition.
+A type does not need to specify that it satisfies any interface, the compiler can figure this out at compile time.
+For example, there is no need to add some special syntax to show that a type implements the Orderable interface, just define a ?<? operator and it is satisfied.
+
+
+\subsection{Generic Typedefs}
+
+Type synonyms can be defined generically using the typedef keyword together with a generic type annotation.
+These can be used to abbreviate complicated type expressions, especially in generic code.
+\begin{lstlisting}
+// typedef the generic function pointers for later use
+
+generic(type T)
+typedef int (*predicate)(T);
+generic(type Captured, type T)
+typedef void (*callback)(Captured, T);
+
+generic(type T)
+void find(int length, T *array,
+	predicate(T) p, callback(void *, T)f) {
+	int i;
+	for (i = 0; i < length; i++)
+	if (p(array[i])) f(NULL, array[i]);
+}
+\end{lstlisting}
+
+
+\subsection{Generic Types}
+
+Generic types are defined using the same mechanisms as those described above for generic functions.
+This feature allows users to create types that have one or more fields that use generic parameters as types, similar to a template classes in \CC.
+For example, to make a generic linked list, a placeholder is created for the type of the elements, so that the specific type of the elements in the list need not be specified when defining the list.
+In C, something like this would have to be done using void pointers and unsafe casting.
+As in generic functions, Do.s generic types are different from \CC templates in that they can be fully compiled, while \CC templates are more like macro expansions.
+This means that a \CFA generic type from a compiled library can be used with any type that satisfies the bounds.
+
+The syntax for defining a generic type looks very similar to that of a generic function.
+Generic types support bounds and interfaces, using the same syntax as generic functions.
+\begin{lstlisting}
+generic (type T)
+struct LinkedListElem {
+	T elem;
+	LinkedListElem(T) *next;
+};
+
+LinkedListElem *++?(LinkedListElem **elem) {
+	return *elem = elem->next;
+}
+
+generic (type T)
+struct LinkedList {
+	LinkedListElem(T) *head;
+	unsigned int size;
+}
+
+generic (type T | bool ?==?(T, T))
+bool contains(LinkedList(T) *list, T elem) {
+	for(LinkedListElem *iter = list->head; iter != 0; ++iter) {
+	if (iter->elem == elem) return true;
+	}
+	return false;
+}
+\end{lstlisting}
+
+
+\section{Safety}
+
+Safety, along with productivity, is a key goal of Do.
+This section discusses the safety features that have been included in \CFA to help programmers create more stable, reliable, and secure code.
+
+
+\subsection{Exceptions}
+
+\CFA introduces support for exceptions as an easier way to recover from exceptional conditions that may be detected within a block of code.
+In C, developers can use error codes and special return values to report to a caller that an error occurred in a function.
+The major problem with error codes is that they can be easily ignored by the caller.
+Failure to properly check for errors can result in the caller making incorrect assumptions about the current state or about the return value that are very likely to result in errors later on in the program, making the source of the problem more difficult to find when debugging.
+An unhandled exception on the other hand will cause a crash, revealing the original source of the erroneous state.
+
+Exceptions in \CFA allow a different type of control flow.
+Throwing an exception terminates execution of the current block, invokes the destructors of variables that are local to the block, and propagates the exception to the parent block.
+The exception is immediately re-thrown from the parent block unless it is caught as described below.
+\CFA uses keywords similar to \CC for exception handling.
+An exception is thrown using a throw statement, which accepts one argument.
+
+\begin{lstlisting}
+	...
+
+	throw 13;
+
+	...
+\end{lstlisting}
+
+An exception can be caught using a catch statement, which specifies the type of the exception it can catch.
+A catch is specified immediately after a guarded block to signify that it can catch an exception from that block.
+A guarded block is specified using the try keyword, followed by a block of code inside of curly braces.
+
+\begin{lstlisting}
+	...
+
+	try {
+	throw 13;
+	}
+	catch(int e) {
+	printf(.caught an exception: %d\n., e);
+	}
+\end{lstlisting}
+
+
+\subsection{Memory Management}
+
+
+\subsubsection{Manual Memory Management}
+
+Using malloc and free to dynamically allocate memory exposes several potential, and common, errors.
+First, malloc breaks type safety because it returns a pointer to void.
+There is no relationship between the type that the returned pointer is cast to, and the amount of memory allocated.
+This problem is solved with a type-safe malloc.
+Do.s type-safe malloc does not take any arguments for size.
+Instead, it infers the type based on the return value, and then allocates space for the inferred type.
+
+\begin{lstlisting}
+float *f = malloc(); // allocates the size of a float
+
+struct S {
+	int i, j, k;
+};
+
+struct S *s = malloc(); // allocates the size of a struct S
+\end{lstlisting}
+
+In addition to the improved malloc, \CFA also provides a technique for combining allocation and initialization into one step, using the new function.
+For all constructors defined for a given type (see Operator Overloading), a corresponding call to new can be used to allocate and construct that type.
+
+\begin{lstlisting}
+type Complex = struct {
+	float real;
+	float imag;
+};
+
+// default constructor
+
+void ?{}(Complex &c) {
+	c.real = 0.0;
+	c.imag = 0.0;
+}
+
+
+
+// 2 parameter constructor
+
+void ?{}(Complex &c, float real, float imag) {
+	c.real = real;
+	c.imag = imag;
+}
+
+
+int main() {
+	Complex c1; // No constructor is called
+	Complex c2{}; // Default constructor called
+	Complex c3{1.0, -1.0}; // 2 parameter constructor is called
+
+	Complex *p1 = malloc(); // allocate
+	Complex *p2 = new(); // allocate + default constructor
+	Complex *p3 = new(0.5, 1.0); // allocate + 2 param constructor
+}
+
+\end{lstlisting}
+
+
+\subsubsection{Automatic Memory Management}
+
+\CFA may also support automatic memory management to further improve safety.
+If the compiler can insert all of the code needed to manage dynamically allocated memory (automatic reference counting), then developers can avoid problems with dangling pointers, double frees, memory leaks, etc.
+This feature requires further investigation.
+\CFA will not have a garbage collector, but might use some kind of region-based memory management.
+
+
+\subsection{Unsafe C Constructs}
+
+C programmers are able to access all of the low-level tricks that are sometimes needed for close-to-the-hardware programming.
+Some of these practices however are often error-prone and difficult to read and maintain.
+Since \CFA is designed to be safer than C, such constructs are disallowed in \CFA code.
+If a programmer wants to use one of these unsafe C constructs, the unsafe code must be contained in a C linkage block (see Interoperability), which will be compiled like C code.
+This block means that the user is telling the tools, .I know this is unsafe, but I.m going to do it anyway..
+
+The exact set of unsafe C constructs that will be disallowed in \CFA has not yet been decided, but is sure to include pointer arithmetic, pointer casting, etc.
+Once the full set is decided, the rules will be listed here.
+
+
+\section{Syntactic Anomalies}
+
+The number 0 and 1 are treated specially in \CFA, and can be redefined as variables.
+One syntactic anomaly is when a field in an structure is names 0 or 1:
+\begin{lstlisting}
+struct S {
+	int 0, 1;
+} s;
+\end{lstlisting}
+The problem occurs in accesing these fields using the selection operation ``\lstinline@.@'':
+\begin{lstlisting}
+s.0 = 0;	// ambiguity with floating constant .0
+s.1 = 1;	// ambiguity with floating constant .1
+\end{lstlisting}
+To make this work, a space is required after the field selection:
+\begin{lstlisting}
+`s.@\textvisiblespace@0` = 0;
+`s.@\textvisiblespace@1` = 1;
+\end{lstlisting}
+While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1.
+Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int`>>`@, this issue can be solved with a more powerful lexer/parser.
+
+There are several ambiguous cases with operator identifiers, e.g., \lstinline@int *?*?()@, where the string \lstinline@*?*?@ can be lexed as \lstinline@*@/\lstinline@?*?@ or \lstinline@*?@/\lstinline@*?@.
+Since it is common practise to put a unary operator juxtaposed to an identifier, e.g., \lstinline@*i@, users will be annoyed if they cannot do this with respect to operator identifiers.
+Even with this special hack, there are 5 general cases that cannot be handled.
+The first case is for the function-call identifier \lstinline@?()@:
+\begin{lstlisting}
+int *@\textvisiblespace@?()();	// declaration: space required after '*'
+*@\textvisiblespace@?()();		// expression: space required after '*'
+\end{lstlisting}
+Without the space, the string \lstinline@*?()@ is ambiguous without N character look ahead;
+it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument/parameter list.
+
+The 4 remaining cases occur in expressions:
+\begin{lstlisting}
+i++@\textvisiblespace@?i:0;		// space required before '?'
+i--@\textvisiblespace@?i:0;		// space required before '?'
+i@\textvisiblespace@?++i:0;		// space required after '?'
+i@\textvisiblespace@?--i:0;		// space required after '?'
+\end{lstlisting}
+In the first two cases, the string \lstinline@i++?@ is ambiguous, where this string can be lexed as \lstinline@i@ / \lstinline@++?@ or \lstinline@i++@ / \lstinline@?@;
+it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument list.
+In the second two cases, the string \lstinline@?++x@ is ambiguous, where this string can be lexed as \lstinline@?++@ / \lstinline@x@ or \lstinline@?@ / y\lstinline@++x@;
+it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument list.
+
+
+\section{Concurrency}
+
+Today's processors for nearly all use cases, ranging from embedded systems to large cloud computing servers, are composed of multiple cores, often heterogeneous.
+As machines grow in complexity, it becomes more difficult for a program to make the most use of the hardware available.
+\CFA includes built-in concurrency features to enable high performance and improve programmer productivity on these multi-/many-core machines.
+
+Concurrency support in \CFA is implemented on top of a highly efficient runtime system of light-weight, M:N, user level threads.
+The model integrates concurrency features into the language by making the structure type the core unit of concurrency.
+All communication occurs through method calls, where data is sent via method arguments, and received via the return value.
+This enables a very familiar interface to all programmers, even those with no parallel programming experience.
+It also allows the compiler to do static type checking of all communication, a very important safety feature.
+This controlled communication with type safety has some similarities with channels in Go, and can actually implement
+channels exactly, as well as create additional communication patterns that channels cannot.
+Mutex objects, monitors, are used to contain mutual exclusion within an object and synchronization across concurrent threads.
+
+Three new keywords are added to support these features:
+
+monitor creates a structure with implicit locking when accessing fields
+
+mutex implies use of a monitor requiring the implicit locking
+
+task creates a type with implicit locking, separate stack, and a thread
+
+
+\subsection{Monitors}
+
+A monitor is a structure in \CFA which includes implicit locking of its fields.
+Users of a monitor interact with it just like any structure, but the compiler handles code as needed to ensure mutual exclusion.
+An example of the definition of a monitor is shown here:
+\begin{lstlisting}
+type Account = monitor {
+	const unsigned long number; // account number
+	float balance; // account balance
+};
+\end{lstlisting}
+
+Since a monitor structure includes an implicit locking mechanism, it does not make sense to copy a monitor;
+it is always passed by reference.
+Users can specify to the compiler whether or not a function will require mutual exclusion of the monitor using the mutex modifier on the parameter.
+When mutex is specified, the compiler inserts locking before executing the body of the function, and unlocking after the body.
+This means that a function requiring mutual exclusion could block if the lock is already held by another thread.
+Blocking on a monitor lock does not block the kernel thread, it simply blocks the user thread, which yields its kernel thread while waiting to obtain the lock.
+If multiple mutex parameters are specified, they will be locked in parameter order (i.e. first parameter is locked first) and unlocked in the
+reverse order.
+\begin{lstlisting}
+// This function accesses a constant field, it does not require
+// mutual exclusion
+
+export unsigned long getAccountNumber(Account &a) {
+	return a.number;
+}
+
+// This function accesses and modifies a shared field; it
+// requires mutual exclusion
+
+export float withdrawal(mutex Account &a, float amount) {
+	a.balance -= amount;
+	return a.balance;
+}
+\end{lstlisting}
+
+Often, one function using a monitor will call another function using that same monitor.
+If both require mutual exclusion, then the thread would be waiting for itself to release the lock when it calls the inner function.
+This situation is resolved by allowing recursive entry (reentrant locks), meaning that if the lock is already held by the caller, it can be locked again.
+It will still be unlocked the same number of times.
+An example of this situation is shown below:
+
+\begin{lstlisting}
+// deleting a job from a worker requires mutual exclusion
+
+void deleteJob(mutex Worker &w, Job &j) {
+	...
+}
+
+// transferring requires mutual exclusion and calls deleteJob
+
+void transferJob(mutex Worker &from, Worker &to) {
+	...
+	deleteJob(j);
+	...
+}
+\end{lstlisting}
+
+
+\subsection{Tasks}
+
+\CFA also provides a simple mechanism for creating and utilizing user level threads.
+A task provides mutual exclusion like a monitor, and also has its own execution state and a thread of control.
+Similar to a monitor, a task is defined like a structure:
+\begin{lstlisting}
+type Adder = task {
+	int *row;
+	int size;
+	int &subtotal;
+}
+\end{lstlisting}
+
+A task may define a constructor, which will be called upon allocation and run on the caller.s thread.
+A destructor may also be defined, which is called at de-allocation (when a dynamic object is deleted or when a local object goes out of scope).
+After a task is allocated and initialized, its thread is spawned implicitly and begins executing in its function call method.
+All tasks must define this function call method, with a void return value and no additional parameters, or the compiler will report an error.
+Below are example functions for the above Adder task, and its usage to sum up a matrix on multiple threads.
+(Note that this example is designed to display the syntax and functionality, not the best method to solve this problem)
+\begin{lstlisting}
+void ?{}(Adder &a, int r[], int s, int &st) { // constructor
+	a.row = r;
+	a.size = s;
+	a.subtotal = st;
+}
+
+// implicitly spawn thread and begin execution here
+
+void ?()(Adder &a) {
+	int c;
+	subtotal = 0;
+	for (c=0; c<a.size; ++c) {
+	subtotal += row[c];
+	}
+}
+
+int main() {
+	const int rows = 100, cols = 1000000;
+	int matrix[rows][cols];
+	int subtotals[rows];
+	int total = 0;
+	int r;
+
+	{ // create a new scope here for our adders
+	Adder adders[rows];
+	// read in the matrix
+	...
+	for (r=0; r<rows; ++r) {
+	// tasks are initialized on this thread
+	Adders[r] = {matrix[r], cols, subtotals[r]};
+	Adders[r](); // spawn thread and begin execution
+	}
+	} // adders go out of scope; block here until they all finish
+	total += subtotals[r];
+	printf(.total is %d\n., total);
+}
+\end{lstlisting}
+
+
+\subsection{Cooperative Scheduling}
+
+Tasks in \CFA are cooperatively scheduled, meaning that a task will not be interrupted by another task, except at specific yield points.
+In Listing 31, there are no yield points, so each task runs to completion with no interruptions.
+Places where a task could yield include waiting for a lock (explicitly or implicitly), waiting for I/O, or waiting for a specific function (or one of a set of functions) to be called.
+This last option is introduced with the yield function. yield is used to indicate that this task should yield its thread until the specified function is called.
+For example, the code below defines a monitor that maintains a generic list.
+When a task tries to pop from the list, but it is empty, the task should yield until another task puts something into the list, with the push function.
+Similarly, when a task tries to push something onto the list, but it is full, it will yield until another task frees some space with the pop function.
+
+\begin{lstlisting}
+// type T is used as a generic type for all definitions inside
+// the curly brackets
+
+generic(type T) {
+	type Channel = monitor {
+	List(T) list; // list is a simple generic list type
+	};
+
+	T pop(mutex &Channel(T) ch) {
+	if (ch.list.empty()) {
+	// yield until push is called for this channel
+	yield(push);
+	}
+	return ch.list.pop();
+	}
+
+	void push(mutex &Channel(T)ch, T val) {
+	if (ch.list.full()) {
+	// yield until pop is called for this channel
+	yield(pop);
+	}
+	ch.list.push(val);
+	}
+}
+\end{lstlisting}
+
+A task can also yield indefinitely by calling yield with no arguments.
+This will tell the scheduler to yield this task until it is resumed by some other task.
+A task can resume another task by using its functional call operator.
+The code below shows a simple ping-pong example, where two tasks yield back and forth to each other using these methods.
+
+\begin{lstlisting}
+type Ping = task {
+	Pong *partner;
+};
+
+void ?{}(Ping &p, Pong *partner = 0) {
+	p.partner = partner;
+}
+
+void ?()(Ping &p) {
+	for(;;) { // loop forever
+	printf(.ping\n.);
+	partner(); // resumes the partner task
+	yield(); // yields this task
+	}
+}
+
+type Pong = task {
+	Ping *partner;
+};
+
+void ?{}(Pong &p, Ping *partner = 0) {
+	p.partner = partner;
+}
+
+void ?()(Pong &p) {
+	for(;;) { // loop forever
+	yield(); // yields this task
+	printf(.pong/n.);
+	partner(); // resumes the partner task
+	}
+}
+
+void main() {
+	Ping ping; // allocate ping
+	Pong pong{ping}; // allocate, initialize, and start pong
+	Ping{pong}; // initialize and start ping
+}
+\end{lstlisting}
+
+The same functionality can be accomplished by providing functions to be called by the partner task.
+\begin{lstlisting}
+type Pingpong = task {
+	String msg;
+	Pingpong *partner;
+};
+
+void ?{}(Pingpong &p, String msg, Pingpong *partner = 0) {
+	p.msg = msg;
+	p.partner = partner;
+}
+
+void ?()(Pingpong &p) {
+	for(;;) {
+	yield(go);
+	}
+}
+
+void go(Pingpong &p) {
+	print(.%(p.msg)\n.);
+	go(p.partner);
+}
+
+void main() {
+	Pingpong ping = {.ping.};
+	Pingpong pong = {.pong., ping};
+	ping.partner = pong;
+	go(ping);
+}
+\end{lstlisting}
+
+
+\section{Modules and Packages }
+
+\begin{comment}
+High-level encapsulation is useful for organizing code into reusable units, and accelerating compilation speed.
+\CFA provides a convenient mechanism for creating, building and sharing groups of functionality that enhances productivity and improves compile time.
+
+There are two levels of encapsulation in \CFA, module and package.
+A module is a logical grouping of functionality that can be easily pulled into another project, much like a module in Python or a package in Go.
+A module forms a namespace to limit the visibility and prevent naming conflicts of variables.
+Furthermore, a module is an independent translation unit, which can be compiled separately to accelerate the compilation speed.
+
+A package is a physical grouping of one or more modules that is used for code distribution and version management.
+Package is also the level of granularity at which dependences are managed.
+A package is similar to the Crate in Rust.
+
+
+\subsection{No Declarations, No Header Files}
+
+In C and \CC, it is necessary to declare or define every global variable, global function, and type before it is used in each file.
+Header files and a preprocessor are normally used to avoid repeating code.
+Thus, many variables, functions, and types are described twice, which exposes an opportunity for errors and causes additional maintenance work.
+Instead of following this model, the \CFA tools can extract all of the same information from the code automatically.
+This information is then stored in the object files for each module, in a format that can quickly be read by the compiler, and stored at the top of the file, for quick access.
+In addition to the user productivity improvements, this simple change also improves compile time, by saving the information in a simple machine readable format, instead of making the compiler parse the same information over and over from a header file.
+This seems like a minor change, but according to (Pike, Go at Google: Language Design in the Service of Software Engineering), this simple change can cause massive reductions in compile time.
+
+In \CFA, multiple definitions are not necessary.
+Within a module, all of the module's global definitions are visible throughout the module.
+For example, the following code compiles, even though isOdd was not declared before being called:
+\begin{lstlisting}
+bool isEven(unsigned int x) {
+	if (x == 0) return true;
+	else return !isOdd(x);
+}
+
+bool isOdd(unsigned int x) {
+	if (x == 1) return true;
+	else return !isEven(x - 2);
+}
+\end{lstlisting}
+
+Header files in C are used to expose the declarations from a library, so that they can be used externally.
+With \CFA, this functionality is replaced with module exports, discussed below.
+When building a \CFA module which needs to be callable from C code, users can use the tools to generate a header file suitable for including in these C files with all of the needed declarations.
+
+In order to interoperate with existing C code, \CFA files can still include header files, the contents of which will be enclosed in a C linkage section to indicate C calling conventions (see Interoperability for more information).
+
+
+\subsection{Modules}
+
+A module typically contains a set of related types and methods, with some objects accessible from outside the package, and some limited to use inside the module.
+These modules can then be easily shared and reused in multiple projects.
+As modules are intended to be distributed for reuse, they should generally have stable, well-defined interfaces.
+
+\CFA adds the following keywords to express the module systems: module, export, import, as.
+
+
+\subsubsection{Module Declaration}
+
+The syntax to declare a module is module moduleName;.
+
+The module declaration must be at the beginning of a file, and each file can only belong to one module.
+If there is no module declaration at the beginning of a file, the file belongs to the global module.
+A module can span several files.
+By convention, a module and the files belonging to the module have additional mapping relationship which is described in the Do-Lang Tooling documentation.
+
+The moduleName follows the same rules of a variable name, except that it can use slash "/" to indicate the module/sub-module relationship.
+For example, container/vector is a valid module name, where container is the parent module name, and vector is the sub-module under container.
+
+Only the interfaces of a module are visible from outside, when the module is imported. export is a type decorator to declare a module interface.
+A method, a global variable or a type can be declared as a module interface.
+Types defined in a module and referenced by an exported function or a variable must be exported, too.
+
+The following code is a simple module declaration example.
+\begin{lstlisting}
+module M;
+
+//visible outside module M
+
+export int f(int i) { return i + 1; }
+export double aCounter;
+
+//not visible outside module M
+
+int g(int i) { return i - 1; }
+
+double bCounter;
+\end{lstlisting}
+
+export module moduleName; can be use to re-export all the visible (exported) names in moduleName from the current module.
+
+
+\subsubsection{Module Import}
+
+The syntax to import a module is import moduleName; or import moduleName as anotherName;.
+One package cannot be imported with both of the two types of syntax in one file.
+A package imported in one file will only be visible in this file.
+For example, two files, A and B belong to the same module.
+If file A imports another module, M, the exported names in M are not visible in file B.
+
+All of the exported names are visible in the file that imports the module.
+The exported names can be accessed within a namespace based on the module name in the first syntax (ex moduleName.foo).
+If moduleName has several elements separated by '/' to describe a sub-module (ex. import container/vector;), the last element in the moduleName is used as the namespace to access the visible names in that module (ex vector.add(...);).
+The as keyword is used to confine the imported names in a unique namespace (ex. anotherName.foo). anotherName must be a valid identifier (same rules as a variable name) which means it cannot have '/' in it.
+Conflicts in namespaces will be reported by the compiler.
+The second method can be used to solve conflicting name problems.
+The following code snippets show the two situations.
+
+\begin{lstlisting}
+module util/counter;
+export int f(int i) { return i+1; }
+
+import util/counter;
+
+int main() {
+	return counter.f(200); // f() from the package counter
+}
+
+import util/counter as ct;
+int main() {
+	return ct.f(200); // f() from the package counter
+}
+\end{lstlisting}
+
+
+Additionally, using the .as. syntax, a user can force the compiler to add the imported names into the current namespace using .as ..With these module rules, the following module definitions and imports can be achieved without any problem.
+
+\begin{lstlisting}
+module M1;
+export int f(int i) { return i+1;} // visible outside
+
+int g(int i) { return i-1;} // not visible outside
+
+module M2;
+int f(int i) { return i * 2; } // not visible outside
+export int g(int g) { return i / 2; } // visible outside
+
+import M1 as .;
+
+import M2 as .;
+
+
+int main() {
+	return f(3) + g(4); //f() from M1 and g() from M2;
+}
+\end{lstlisting}
+
+
+\subsubsection{Sub-Module and Module Aggregation}
+
+Several modules can be organized in a parent module and sub-modules relationship.
+The sub-module names are based on hierarchical naming, and use slash, "/", to indicate the relationship.
+For example, std/vector and std/io are sub-modules of module std.
+The exported names in a sub-module are NOT visible if the parent module is imported, which means the exported names in the sub-module are
+not implicitly exported in the parent module.
+
+Aggregation is a mechanism to support components and simplified importing.
+The mechanism is not based on naming but based on manual declaration.
+For example, the following is the aggregated sequence module.
+The export {...} is syntactic sugar for many lines of export module aModule;.
+If an aggregated module is imported, all the included modules in the aggregation are imported.
+
+\begin{lstlisting}
+module std/sequence;
+
+export {
+	module std/vector;
+	module std/list;
+	module std/array;
+	module std/deque;
+	module std/forward_list;
+	module std/queue;
+	module std/stack;
+};
+\end{lstlisting}
+
+After importing the aggregated module, each individual name is still contained in the original name space.
+For example, vector.add() and list.add() should be used to reference the add methods if there are add methods in both the vector module and the list module.
+
+
+\subsubsection{Import from Repository}
+
+When a module is imported, the tools locate the module in the one of the accessible package paths (defined by command line flag or environment variable).
+The tools also support retrieving modules of a package from external repositories.
+See Listing 40: Package directory structure
+
+
+\subsubsection{Package Import}
+
+Because packages are the places where the building tool looks for modules, there is no code required in the \CFA source file to import a package.
+In order to use modules in a package, the programmer needs to guide the building tool to locate the right package by 1) Adding the package's parent path into \$DOPATH;
+or 2) Adding the package dependence into the current project's Do.prj.
+More details about locating a module in a package are explained in the next section.
+
+
+\subsubsection{Package Versioning}
+
+A package must have a version number.
+The version number is a string.
+For example "1.0", "1.a", "A1", and "1ec5fab753eb979d3886a491845b8ae152d58c8f" are all valid version numbers.
+By convention, a package is stored in a directory named packageName-packageVersion.
+For example, the util package with version 1.1 is stored in a directory named util-1.1.
+
+The project description file can optionally specify the version of the package used in the current project.
+If not defined, because the version number is a string, and all the different versions for the same package will be sorted in increasing order, the package with the largest version number will be used in the compilation.
+The builder tool will record the specific package version used in the build in the project's "Do.lock" file to enable fully repeatable builds.
+
+
+\subsection{Module and Package Organization}
+
+\CFA has two level of encapsulations, module and package.
+This section explains the object model of modules, packages and other language concepts.
+It also explains how programmers should organize their code, and the method used by the build tools to locate packages, and import modules for compilation.
+
+
+\subsubsection{Object Model}
+
+There are several concepts in Do.
+\begin{itemize}
+\item
+File: a \CFA source file
+\item
+Module: a container to organize a set of related types and methods; It has a module name, and several interfaces visible from outside
+\item
+Package: a container to organize modules for distribution; It has attributes like name, author,
+version, dependences, etc.
+\item
+Project: a working set for a \CFA project; It has attributes like name, author, version, dependences, etc.
+\end{itemize}
+
+The following rules summarize the object model of all the above concepts:
+\begin{itemize}
+\item
+A module contains one or more files
+\begin{itemize}
+\item
+One file can only belong to one module
+\item
+A module has its name and interfaces exported
+\item
+A file without a module declaration at the beginning belongs to the global module
+\item
+\end{itemize}
+
+\item
+A package contains one or more modules
+\begin{itemize}
+\item
+A package has additional meta info described in Do.prj file
+\item
+A package may be dependent on other packages.
+\end{itemize}
+
+\item
+A project contains one or more modules in its source code
+\begin{itemize}
+\item
+A project has additional meta info described in Do.prj file
+\item
+A project may be dependent on other packages
+\item
+A project can be transformed into a package for distribution
+\item
+A project can generate one or more executable binaries
+\end{itemize}
+\end{itemize}
+
+
+\subsubsection{Module File Organization}
+
+The rules of this section are the conventions to organize module files in one package.
+
+The file location of a module in a package must match the module/submodule naming hierarchy.
+The names separated by slash "/" must match the directory levels.
+If only one file is used to implement one module, there is no need to put the module implementation file inside a sub-directory.
+The file can be put inside its parent module's sub-directory with the sub module's name as the file name.
+
+Here is an example of a package, util.
+\begin{lstlisting}
++ util
+Do.prj #package description file
+	heap.do #Case 1: module heap;
+	list.do #Case 1: mdoule list;
+	ring.do #Case 1: module ring;
+	+ string #Case 2
+	impl1.do #module string;
+	+ std
+	vector.do
+	list.do
+	+ array #Case 3
+	array1.do #module std/array;
+	array2.do #module std/array;
+	sequence.do #Case 4, module std/sequence;
+	test.do #Case 5
+\end{lstlisting}
+
+\begin{itemize}
+\item
+Case 1: Each individual file implements a module
+\item
+Case 2: Put the implementation of a module under the sub-directory, but there is only one file
+\item
+Case 3: Put the implementation of a module under the sub-directory; There are several files to
+implement one module
+\item
+Case 4: One file to express one aggregation
+\item
+Case 5: The file does not belong to any module; It is used for testing purpose
+\end{itemize}
+
+The example only uses source code, ".do" files, to show the module file organization.
+Other module packaging formats, like binary, must also follow the same rules.
+
+
+\subsection{Module File Format}
+
+\CFA supports different types of module file formats.
+
+\begin{itemize}
+\item
+Pure source code format: The files should be organized following the previous section's definition.
+\item
+IR format (TBD): The \CFA compiler IR format, similar to the source code format
+\item
+Binary format, including ".a" static library or ".so" dynamic linkage library
+\begin{itemize}
+\item
+The file's name must match the right level's module name defined in the previous section
+\item
+E.g. "util.so" includes all modules for the package util.
+\item
+E.g. "string.so" under the package directory to include files belonging to "module string;"
+\end{itemize}
+\item.
+Archive format
+\begin{itemize}
+\item
+The archive is named as ".dar", and is a zip archive of the source code or the binary for a package
+\item
+E.g. "util.dar" is the whole package for util package including the package direction file
+\end{itemize}
+\item
+Hybrid format
+\begin{itemize}
+\item
+A package can be distributed partly in source code, partly in binary format, and/or packaged in the archive format
+\item
+The only limitation is that the names of the files must match the module location names defined in previous section
+\end{itemize}
+\end{itemize}
+Package and Module Locating and the \CFA Language Tooling documentation for more details.
+
+
+\subsection{Packages}
+
+A package is synonymous with a library in other languages.
+The intent of the package level encapsulation is to facilitate code distribution, version control, and dependence management.
+A package is a physical grouping of one or more modules in a directory (an archive file for a directory).
+The concept of a package is the convention for grouping code, and the contract between the language and the building tool to search for imported modules.
+
+
+\subsubsection{Package Definition}
+
+A package is defined by putting a project description file, Do.prj, with one or more modules into a directory.
+This project description file contains the package's meta data, including package name, author, version, dependences, etc.
+It should be in the root of the package directory.
+
+The modules in the package could be either source code, or compiled binary format.
+The location of the module files should follow the module name's path.
+
+Here is a simple example of the directory structure of a package, core.
+It contains a module std and several sub-modules under std.
+\begin{lstlisting}
++ core
+	Do.prj
+	+ std
+	+ io
+	file.do # module std/io/file;
+	network.do #module std/io/network;
+	+ container
+	vector.do #module std/container/vector;
+	list.do #module std/container/list;
+\end{lstlisting}
+
+
+\subsubsection{Package Import}
+
+Because packages are the places where the building tool looks for modules, there is no code required in the \CFA source file to import a package.
+In order to use modules in a package, the programmer needs to guide the building tool to locate the right package by 1) Adding the package's parent path into \$DOPATH; or 2) Adding the package dependence into the current project's Do.prj.
+More details about locating a module in a package are explained in the next section.
+
+
+\subsubsection{Package Versioning}
+
+A package must have a version number.
+The version number is a string.
+For example "1.0", "1.a", "A1", and "1ec5fab753eb979d3886a491845b8ae152d58c8f" are all valid version numbers.
+By convention, a package is stored in a directory named packageName-packageVersion.
+For example, the util package with version 1.1 is stored in a directory named util-1.1.
+
+The project description file can optionally specify the version of the package used in the current project.
+If not defined, because the version number is a string, and all the different versions for the same package will be sorted in increasing order, the package with the largest version number will be used in the compilation.
+The builder tool will record the specific package version used in the build in the project's "Do.lock" file to enable fully repeatable builds.
+
+
+\subsection{Module and Package Organization}
+
+\CFA has two level of encapsulations, module and package.
+This section explains the object model of modules, packages and other language concepts.
+It also explains how programmers should organize their code, and the method used by the build tools to locate packages, and import modules for compilation.
+
+
+\subsubsection{Object Model}
+
+There are several concepts in Do.
+\begin{itemize}
+\item
+File: a \CFA source file
+\item
+Module: a container to organize a set of related types and methods; It has a module name, and several interfaces visible from outside
+\item
+Package: a container to organize modules for distribution; It has attributes like name, author, version, dependences, etc.
+\item
+Project: a working set for a \CFA project; It has attributes like name, author, version, dependences, etc.
+\end{itemize}
+
+The following rules summarize the object model of all the above concepts:
+\begin{itemize}
+\item
+A module contains one or more files
+\begin{itemize}
+\item
+One file can only belong to one module
+\item
+A module has its name and interfaces exported
+\item
+A file without a module declaration at the beginning belongs to the global module
+\end{itemize}
+\item
+A package contains one or more modules
+\begin{itemize}
+\item
+A package has additional meta info described in Do.prj file
+\item
+A package may be dependent on other packages.
+\end{itemize}
+\item
+A project contains one or more modules in its source code
+\begin{itemize}
+\item
+A project has additional meta info described in Do.prj file
+\item
+A project may be dependent on other packages
+\item
+A project can be transformed into a package for distribution
+\item
+A project can generate one or more executable binaries
+\end{itemize}
+\end{itemize}
+
+
+\subsubsection{Module File Organization}
+
+The rules of this section are the conventions to organize module files in one package.
+
+The file location of a module in a package must match the module/submodule naming hierarchy.
+The names separated by slash "/" must match the directory levels.
+If only one file is used to implement one module, there is no need to put the module implementation file inside a sub-directory.
+The file can be put inside its parent module's sub-directory with the sub module's name as the file name.
+
+Here is an example of a package, util.
+\begin{lstlisting}
++ util
+	Do.prj #package description file
+	heap.do #Case 1: module heap;
+	list.do #Case 1: mdoule list;
+	ring.do #Case 1: module ring;
+	+ string #Case 2
+	impl1.do #module string;
+	+ std
+	vector.do
+	list.do
+	+ array #Case 3
+	array1.do #module std/array;
+	array2.do #module std/array;
+	sequence.do #Case 4, module std/sequence;
+	test.do #Case 5
+\end{lstlisting}
+
+
+\begin{itemize}
+\item
+Case 1: Each individual file implements a module
+\item
+Case 2: Put the implementation of a module under the sub-directory, but there is only one file
+\item
+Case 3: Put the implementation of a module under the sub-directory; There are several files to implement one module
+\item
+Case 4: One file to express one aggregation
+\item
+Case 5: The file does not belong to any module; It is used for testing purpose
+\end{itemize}
+
+The example only uses source code, ".do" files, to show the module file organization.
+Other module packaging formats, like binary, must also follow the same rules.
+
+
+\subsubsection{Module File Format}
+
+\CFA supports different types of module file formats.
+
+\begin{itemize}
+\item
+Pure source code format: The files should be organized following the previous section's definition.
+\item
+IR format (TBD): The \CFA compiler IR format, similar to the source code format
+\item
+Binary format, including ".a" static library or ".so" dynamic linkage library
+\begin{itemize}
+\item
+The file's name must match the right level's module name defined in the previous section
+\item
+E.g. "util.so" includes all modules for the package util.
+\item
+E.g. "string.so" under the package directory to include files belonging to "module string;"
+\end{itemize}
+\item
+Archive format
+\begin{itemize}
+\item
+The archive is named as ".dar", and is a zip archive of the source code or the binary for a package
+\item
+E.g. "util.dar" is the whole package for util package including the package direction file
+\end{itemize}
+\item
+Hybrid format
+\begin{itemize}
+\item
+A package can be distributed partly in source code, partly in binary format, and/or packaged in the archive format
+\item
+The only limitation is that the names of the files must match the module location names defined in previous section
+\end{itemize}
+\end{itemize}
+
+
+\subsection{Package and Module Locating}
+
+The high-level build tools provided by \CFA will handle finding a package in your local filesystem or retrieving it from a repository if necessary, building it if necessary, and linking with it.
+If a programmer prefers, one can directly call the compiler, docc to build the source files and create and link to static libraries.
+
+When a source file imports a module, the \CFA build tool and docc compiler will locate the module according to the following order:
+
+\begin{enumerate}
+\item
+This source file's directory tree, which is typically the project's src directory
+\item
+All of the dependent packages (in a directory or in an archive file) under the current \CFA project's pkg directory
+\item
+The dependent packages (in a directory or in an archive file) inside the paths defined in the DOPATH environment variable
+\item
+The dependent packages (in a directory or in an archive file) inside the global \CFA SDK installation's pkg directory
+\item
+If one dependent package is still not found, the builder tool will automatically retrieve it from the repository defined in the SDK installation's configuration, and store it in the SDK's pkg directory
+\end{enumerate}
+
+The module found first in a package will shadow the modules with the same name in the later packages in the search sequence.
+
+
+\subsubsection{Dependent Package}
+
+Dependent packages are those packages containing modules that the current project's source code will import from.
+Dependent packages are defined implicitly or explicitly in one \CFA project.
+All of the packages under the current project's pkg directory are implicitly dependent packages.
+For others, the dependent packages must be defined in the project's Do.prj file.
+
+
+\subsubsection{Package and Module Locating Example}
+
+\begin{lstlisting}
+# A project's source code tree
+
+--------------------------------------
+
++ testProject
+	Do.prj
+	+ src
+	main.do
+	+ pkg
+	+ security-1.1
+	Do.prj
+	security.do #module security
+
+--------------------------------------
+
+# Do.prj
+
+--------------------------------------
+
+[dependences]
+std
+util = "0.2"
+
+--------------------------------------
+
+# main.do
+
+---------------------------------------
+
+import security;
+import std/vector;
+import container;
+
+----------------------------------------
+\end{lstlisting}
+
+
+\begin{lstlisting}
+# pkg directory's source code tree
+
+-----------------------------------------
+
++ pkg
+	+ std-1.0
+	Do.prj
+	vector.do #module std/vector;
+	queue.do #module std/queue;
+	+ std-1.1
+	Do.prj
+	vector.do #module std/vector;
+	queue.do #module std/queue;
+	list.do #module std/list;
+	+ util-0.1
+	Do.prj
+	container.do #module container;
+	+ security-1.0
+	security.do #module security;
+------------------------------------------
+\end{lstlisting}
+
+
+During the compiling of main.do file import security;
+The security module appears in both the local security-1.1 package, and the global security-1.0 package.
+According to the locating sequence, the local security module in security-1.1 will be used.
+And because the security-1.1 package is under local's pkg directory.
+No dependence description is required in the project Do.prj file.
+
+import std/vector;
+
+The std/vector package appears in two different versions' packages in the global path and the project dependence doesn't specify the version. std-1.1 is used in this case.
+
+import container;
+
+The Do.prj specifies the version 0.2 should be used to locate container module from util package but only version 0.1 is available in the local file system.
+The builder tool then will try to retrieve it from the web and store it in the global pkg directory.
+After that, the container module from the newly downloaded package will be used in the compilation.
+\end{comment}
+
+
+\section{Comparison with Other Languages}
+
+\CFA is one of many languages that attempts to improve upon C.
+In developing \CFA, many other languages were consulted for ideas, constructs, and syntax.
+Therefore, it is important to show how these languages each compare with Do.
+In this section, \CFA is compared with what the writers of this document consider to be the closest competitors of Do: \CC, Go, Rust, and D.
+
+
+\subsection{Comparing Key Features of \CFA}
+
+
+\subsubsection{Constructors and Destructors}
+
+\lstset{basicstyle=\sf\relsize{-2}}
+
+\begin{flushleft}
+\begin{tabular}{@{}l|l|l|l@{}}
+\multicolumn{1}{c|}{\textbf{\CFA}}	& \multicolumn{1}{c|}{\textbf{\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}}	\\
+\hline
+\begin{lstlisting}
+struct Line {
+	float length;
+}
+// default constructor
+void ?{}( Line * l ) {
+	sout | "default" | endl;
+	l.length = 0.0;
+}
+
+
+// constructor with length
+void ?{}( Line * l, float length ) {
+	sout | "length" | length | endl;
+
+	l.length = length;
+}
+
+// destructor
+void ^?(Line &l) {
+	sout | "destroyed" | endl;
+	l.length = 0.0;
+}
+
+// usage
+Line line1;
+Line line2{ 3.4 };
+\end{lstlisting}
+&
+\begin{lstlisting}[language=C++]
+class Line {
+	float length;
+
+	// default constructor
+	Line() {
+		cout << "default" << endl;
+		length = 0.0;
+	}
+
+
+	// constructor with length
+	Line( float l ) {
+		cout << "length " << length
+			 << endl;
+		length = l;
+	}
+
+	// destructor
+	~Line() {
+		cout << "destroyed" << endl;
+		length = 0.0;
+	}
+}
+// usage
+Line line1;
+Line line2( 3.4 );
+\end{lstlisting}
+&
+\begin{lstlisting}[language=Golang]
+type Line struct {
+	length float32
+}
+// default constructor
+func makeLine() Line {
+	fmt.PrintLn( "default" )
+	return Line{0.0}
+}
+
+
+// constructor with length
+func makeLine( length float32 ) Line {
+	fmt.Printf( "length %v", length )
+
+	return Line{length}
+}
+
+// no destructor
+
+
+
+
+
+// usage
+line1 := makeLine()
+line2 := makeLine( 3.4 )
+\end{lstlisting}
+&
+\begin{lstlisting}
+struct Line {
+	length: f32
+}
+// default constructor
+impl Default for Line {
+	fn default () -> Line {
+		println!( "default" );
+		Line{ length: 0.0 }
+	}
+}
+// constructor with length
+impl Line {
+	fn make( len: f32 ) -> Line {
+		println!( "length: {}", len );
+		Line{ length: len }
+	}
+}
+// destructor
+impl Drop for Line {
+	fn drop( &mut self ) {
+		self.length = 0.0
+	}
+}
+// usage
+let line1:Line = Default::default();
+Line line2( 3.4 );
+\end{lstlisting}
+\end{tabular}
+\end{flushleft}
+
+
+\subsubsection{Operator Overloading}
+
+\begin{flushleft}
+\begin{tabular}{@{}l|l|l|l@{}}
+\multicolumn{1}{c|}{\textbf{\CFA}}	& \multicolumn{1}{c|}{\textbf{\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}}	\\
+\hline
+\begin{lstlisting}
+struct Cpx {
+	double re, im;
+};
+// overload addition operator
+Cpx ?+?( Cpx l, const Cpx r ) {
+	return (Cpx){l.re+l.im, l.im+r.im};
+}
+Cpx a, b, c;
+c = a + b;
+\end{lstlisting}
+&
+\begin{lstlisting}
+struct Cpx {
+	double re, im;
+};
+// overload addition operator
+Cpx operator+( Cpx l, const Cpx r ) {
+	return (Cpx){l.re+l.im, l.im+r.im};
+}
+Cpx a, b, c;
+c = a + b;
+\end{lstlisting}
+&
+\begin{lstlisting}
+// no operator overloading
+
+
+
+
+
+
+
+\end{lstlisting}
+&
+\begin{lstlisting}
+struct Cpx {
+	re: f32,
+	im: f32
+}
+// overload addition operator
+impl Add for Cpx {
+	type Output = Cpx
+	fn add(self, r: Cpx) -> Cpx {
+		let mut res = Cpx{re: 0.0, im: 0.0};
+		res.re = self.re + r.re;
+		res.im = self.im + r.im;
+		return res
+	}
+}
+let (a, b, mut c) = ...;
+c = a + b
+\end{lstlisting}
+\end{tabular}
+\end{flushleft}
+
+
+\subsubsection{Calling C Functions}
+
+\begin{flushleft}
+\begin{tabular}{@{}l|l|l@{}}
+\multicolumn{1}{c|}{\textbf{\CFA/\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}}	\\
+\hline
+\begin{lstlisting}[boxpos=t]
+extern "C" {
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+}
+size_t fileSize( const char *path ) {
+	struct stat s;
+	stat(path, &s);
+	return s.st_size;
+}
+\end{lstlisting}
+&
+\begin{lstlisting}[boxpos=t]
+/*
+#cgo
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+*/
+import "C"
+import "unsafe"
+
+func fileSize(path string) C.size_t {
+	var buf C.struct_stat
+	c_string := C.CString(path)
+	C.stat(p, &buf)
+	C.free(unsafe.Pointer(c_string))
+	return buf._st_size
+}
+\end{lstlisting}
+&
+\begin{lstlisting}[boxpos=t]
+use libc::{c_int, size_t};
+// translated from sys/stat.h
+#[repr(C)]
+struct stat_t {
+	...
+	st_size: size_t,
+	...
+}
+#[link(name = "libc")]
+extern {
+	fn stat(path: *const u8,
+	buf: *mut stat_t) -> c_int;
+}
+fn fileSize(path: *const u8) -> size_t
+{
+	unsafe {
+		let mut buf: stat_t = uninit();
+		stat(path, &mut buf);
+		buf.st_size
+	}
+}
+\end{lstlisting}
+\end{tabular}
+\end{flushleft}
+
+
+\subsubsection{Generic Functions}
+
+\begin{flushleft}
+\begin{tabular}{@{}l|l|l|l@{}}
+\multicolumn{1}{c|}{\textbf{\CFA}}	& \multicolumn{1}{c|}{\textbf{\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}}	\\
+\hline
+\begin{lstlisting}
+generic(type T, type N |
+	{ int ?<?(N, N); })
+T *maximize(N (*f)(const T&),
+	int n, T *a) {
+	T *bestX = NULL;
+	N bestN;
+	for (int i = 0; i < n; i++) {
+	N curN = f(a[i]);
+	if (bestX == NULL ||
+	curN > bestN) {
+	bestX = &a[i]; bestN = curN;
+	}
+	}
+	return bestX;
+}
+
+string *longest(int n, string *p)
+{
+	return maximize(length, n, p);
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+template<typename T, typename F>
+T *maximize(const F &f,
+	int n, T *a) {
+	typedef decltype(f(a[0])) N;
+	T *bestX = NULL;
+	N bestN;
+	for (int i = 0; i < n; i++) {
+	N curN = f(a[i]);
+	if (bestX == NULL || curN > bestN)
+	{
+	bestX = &a[i]; bestN = curN;
+	}
+	}
+	return bestX;
+}
+
+string *longest(int n, string *p) {
+	return maximize(
+	[](const string &s) {
+	return s.length();
+	}, n, p);
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+// Go does not support generics!
+func maximize(
+	gt func(interface{}, interface{}) bool,
+	f func(interface{}) interface{},
+	a []interface{}) interface{} {
+	var bestX interface{} = nil
+	var bestN interface{} = nil
+	for _, x := range a {
+	curN := f(x)
+	if bestX == nil || gt(curN, bestN)
+	{
+	bestN = curN
+	bestX = x
+	}
+	}
+	return bestX
+}
+
+func longest(
+	a []interface{}) interface{} {
+	return maximize(
+	func(a, b interface{}) bool {
+	return a.(int) > b.(int) },
+	func(s interface{}) interface{} {
+	return len(s.(string)) },
+	a).(string)
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+use std::cmp::Ordering;
+
+fn maximize<N: Ord + Copy, T, F:
+Fn(&T) -> N>(f: F, a: &Vec<T>) ->
+Option<&T> {
+	let mut best_x: Option<&T> = None;
+	let mut best_n: Option<N> = None;
+	for x in a {
+	let n = f(x);
+	if (match best_n { None => true,
+	Some(bn) =>
+	n.cmp(&bn) == Ordering::Greater })
+	{
+	best_x = Some(x);
+	best_n = Some(n);
+	}
+	}
+	return best_x
+}
+
+fn longest(a: &Vec<String>) ->
+	Option<&String> {
+	return
+	maximize(|x: &String| x.len(), a)
+}
+\end{lstlisting}
+\end{tabular}
+\end{flushleft}
+
+
+\begin{comment}
+\subsubsection{Modules/Packages}
+
+\begin{lstlisting}
+\CFA
+\CC
+
+
+module example/M;
+
+export int inc(int val) {
+	return val + 1;
+}
+
+
+
+
+--------------------------------------
+//Use the module in another file
+import example/M;
+int main() {
+	print(M.inc(100));
+	return 0;
+}
+// Using \CC17 module proposal
+
+module example.M;
+
+export {
+	int inc(int val);
+}
+
+int inc(inv val) {
+	return val + 1;
+}
+--------------------------------------
+// Use the module in another file
+import example.M;
+int main() {
+	cout << inc(100) << endl;
+	return 0;
+}
+
+Go
+Rust
+package example/M;
+
+func Inc(val int32) int32 {
+	// Capitalization indicates exported
+	return val + 100
+}
+
+
+--------------------------------------
+//Use the package in another file
+package main
+import .fmt.
+import "example/M"
+
+func main() int32 {
+	fmt.Printf(.%v., M.Inc(100))
+}
+pub mod example {
+	pub mod M {
+	pub inc(val i32) -> i32 {
+	return val + 100;
+	}
+	}
+}
+
+--------------------------------------
+//Use the module in another file
+use example::M;
+
+
+
+fn main() {
+	println!(.{}., M::inc(100));
+}
+\end{lstlisting}
+\end{comment}
+
+
+\subsubsection{Parallel Tasks}
+
+\begin{flushleft}
+\begin{tabular}{@{}l|l|l|l@{}}
+\multicolumn{1}{c|}{\textbf{\CFA}}	& \multicolumn{1}{c|}{\textbf{\CC}} & \multicolumn{1}{c|}{\textbf{Go}} & \multicolumn{1}{c}{\textbf{Rust}}	\\
+\hline
+\begin{lstlisting}
+task Nonzero {
+	int *data;
+	int start;
+	int end;
+	int* res;
+};
+
+void ?{}(Nonzero &a, int d[], int s,
+	int e, int* subres) {
+	// constructor
+	a.data = d;
+	a.start = s;
+	a.end = e;
+	a.res = subres;
+}
+
+// implicitly spawn thread here
+void ?()(NonzeroCounter &a) {
+	int i;
+	int nonzero = 0;
+	for (i=start; c<end; ++i) {
+	if(a.data[i]!=0){ nonzero++;}
+	}
+	*a.res = nonzero;
+}
+
+int main() {
+	int sz = ...
+	int data[sz] = ...;
+	int r1 = 0, r2=0;
+	int res;
+	{ // create a scope for Nonzero
+	Nonzero n1{data, 0, sz/2, &n1};
+	Nonzero n2{data, sz/2, sz, &n2};
+	n1();//spawn
+	n2();//spawn
+	}
+	res = r1+r2;
+	return res;
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+#include <thread>
+#include <mutex>
+
+std::mutex m;
+
+
+
+
+
+
+
+
+
+
+
+
+void task(const vector<int>&v,
+	int* res, size_t s,
+	size_t e) {
+	int non_zero = 0;
+	for(size_t i = s; i < e; ++i){
+	if(v[i]!=0) { non_zero++;}
+	}
+	std::unique_lock<mutex> lck {m};
+	*res += non_zero;
+}
+
+int main() {
+	vector<int> data = ...; //data
+	int res = 0;
+	std::thread t1 {task, ref(data),
+	&res, 0,
+	data.size()/2};
+	std::thread t2 {task, ref(data),
+	&res, data.size()/2,
+	data.size()};
+	t1.join();
+	t2.join();
+	return res;
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+package main
+
+import "fmt"
+
+func nonzero(data []int, c chan int) {
+	nz := 0
+	for _, v:=range data {
+	if(v!=0) { nz := nz+1 }
+	}
+	c <- nz
+}
+
+func main() {
+	sz := ...
+	data := make([]int, sz)
+	... // data init
+	go nonzero(data[:len(data)/2], c)
+	go nonzero(data[len(data)/2:], c)
+	n1, n2 := <-c, <-c
+	res := n1 + n2
+	fmt.Println(res)
+}
+\end{lstlisting}
+&
+\begin{lstlisting}
+use std::thread;
+use std::sync:mpsc::channel;
+
+fn main() {
+	let sz = ...;
+	let mut data:Vec<i32> =
+	Vec::with_capacity(sz as usize);
+	... //init data
+	let (tx, rx) = channel();
+	for i in 0..1 {
+	let tx = tx.clone();
+	let data = data.clone()
+	thread::spawn(move|| {
+	let mut nz := 0;
+	let mut s = 0;
+	let mut e = sz / 2;
+	if i == 1 {
+	s = sz/2;
+	e = data.len();
+	}
+	for i in s..(e - 1) {
+	if data[i] != 0 (
+	nz = nz + 1
+	}
+	}
+	tx.send(nz).unwrap();
+	});
+	}
+	let res = rx.recv().unwrap() +
+	rx.recv().unwrap();
+	println!(.{}., res);
+}
+\end{lstlisting}
+\end{tabular}
+\end{flushleft}
+
+\lstset{basicstyle=\sf\relsize{-1}}
+
+
+\subsection{Summary of Language Comparison}
+
+
+\subsubsection{\CC}
+
+\CC is a general-purpose programming language.
+It has imperative, object-oriented and generic programming features, while also providing facilities for low-level memory manipulation. (Wikipedia)
+
+The primary focus of \CC seems to be adding object-oriented programming to C, and this is the primary difference between \CC and Do.
+\CC uses classes to encapsulate data and the functions that operate on that data, and to hide the internal representation of the data.
+\CFA uses modules instead to perform these same tasks.
+Classes in \CC also enable inheritance among types.
+Instead of inheritance, \CFA embraces composition and interfaces to achieve the same goals with more flexibility.
+There are many studies and articles comparing inheritance and composition (or is-a versus has-a relationships), so we will not go into more detail here (Venners, 1998) (Pike, Go at Google: Language Design in the Service of Software Engineering , 2012).
+
+Overloading in \CFA is very similar to overloading in \CC, with the exception of the additional use, in \CFA, of the return type to differentiate between overloaded functions.
+References and exceptions in \CFA are heavily based on the same features from \CC.
+The mechanism for interoperating with C code in \CFA is also borrowed from \CC.
+
+Both \CFA and \CC provide generics, and the syntax is quite similar.
+The key difference between the two, is that in \CC templates are expanded at compile time for each type for which the template is instantiated, while in \CFA, function pointers are used to make the generic fully compilable.
+This means that a generic function can be defined in a compiled library, and still be used as expected from source.
+
+
+\subsubsection{Go}
+
+Go, also commonly referred to as golang, is a programming language developed at Google in 2007 [.].
+It is a statically typed language with syntax loosely derived from that of C, adding garbage collection, type
+safety, some structural typing capabilities, additional built-in types such as variable-length arrays and key-value maps, and a large standard library. (Wikipedia)
+
+Go and \CFA differ significantly in syntax and implementation, but the underlying core concepts of the two languages are aligned.
+Both Go and \CFA use composition and interfaces as opposed to inheritance to enable encapsulation and abstraction.
+Both languages (along with their tooling ecosystem) provide a simple packaging mechanism for building units of code for easy sharing and reuse.
+Both languages also include built-in light weight, user level threading concurrency features that attempt to simplify the effort and thought process required for writing parallel programs while maintaining high performance.
+
+Go has a significant runtime which handles the scheduling of its light weight threads, and performs garbage collection, among other tasks.
+\CFA uses a cooperative scheduling algorithm for its tasks, and uses automatic reference counting to enable advanced memory management without garbage collection.
+This results in Go requiring significant overhead to interface with C libraries while \CFA has no overhead.
+
+
+\subsubsection{Rust}
+
+Rust is a general-purpose, multi-paradigm, compiled programming language developed by Mozilla Research.
+It is designed to be a "safe, concurrent, practical language", supporting pure-functional, concurrent-actor[dubious . discuss][citation needed], imperative-procedural, and object-oriented styles.
+
+The primary focus of Rust is in safety, especially in concurrent programs.
+To enforce a high level of safety, Rust has added ownership as a core feature of the language to guarantee memory safety.
+This safety comes at the cost of a difficult learning curve, a change in the thought model of the program, and often some runtime overhead.
+
+Aside from those key differences, Rust and \CFA also have several similarities.
+Both languages support no overhead interoperability with C and have minimal runtimes.
+Both languages support inheritance and polymorphism through the use of interfaces (traits).
+
+
+\subsubsection{D}
+
+The D programming language is an object-oriented, imperative, multi-paradigm system programming
+language created by Walter Bright of Digital Mars and released in 2001. [.]
+Though it originated as a re-engineering of \CC, D is a distinct language, having redesigned some core \CC features while also taking inspiration from other languages, notably Java, Python, Ruby, C\#, and Eiffel.
+
+D and \CFA both start with C and add productivity features.
+The obvious difference is that D uses classes and inheritance while \CFA uses composition and interfaces.
+D is closer to \CFA than \CC since it is limited to single inheritance and also supports interfaces.
+Like \CC, and unlike \CFA, D uses garbage collection and has compile-time expanded templates.
+D does not have any built-in concurrency constructs in the
+language, though it does have a standard library for concurrency which includes the low-level primitives for concurrency.
+
+
+\appendix
+
+
+\section{Incompatible}
+
+The following incompatibles exist between C and \CFA, and are similar to Annex C for \CC~\cite{ANSI14:C++}.
+
+\begin{enumerate}
+\item
+Change type of character literal \lstinline@int@ to \lstinline@char@.
+This change allows overloading differentiation argument type matching, e.g.:
+\begin{lstlisting}
+int function( int i );
+int function( char c );
+function( 'x' );
+\end{lstlisting}
+It is preferable that this call match the second version of function rather than the first. \\
+Effect on original feature: Change to semantics of well-defined feature. ISO C programs which depend on
+\begin{lstlisting}
+sizeof('x') == sizeof(int)
+\end{lstlisting}
+will not work the same as C++ programs. \\
+Difficulty of converting: Simple. \\
+How widely used: Programs which depend upon sizeof('x') are probably rare.
+
+\item
+Change: String literals made \lstinline@const@ \\
+The type of a string literal is changed from \lstinline@array of char@ to \lstinline@array of const char@.
+The type of a wide string literal is changed from \lstinline@array of wchar_t@ to \lstinline@array of const wchar_t@. \\
+Rationale: This avoids calling an inappropriate overloaded function, which might expect to be able to modify its argument.
+Effect on original feature: Change to semantics of well-defined feature. \\
+Difficulty of converting: Simple syntactic transformation, because string literals can be converted to \lstinline@char*;@ (4.2).
+The most common cases are handled by a new but deprecated standard conversion:
+\begin{lstlisting}
+char* p = "abc"; // valid in C, deprecated in C++
+char* q = expr ? "abc" : "de"; // valid in C, invalid in C++
+\end{lstlisting}
+How widely used: Programs that have a legitimate reason to treat string literals as pointers to potentially modifiable memory are probably rare.
+
+\item
+Change: C++ does not have \emph{tentative definitions} as in C.
+E.g., at file scope,
+\begin{lstlisting}
+int i;
+int i;
+\end{lstlisting}
+is valid in C, invalid in C++.
+This makes it impossible to define mutually referential file-local static
+objects, if initializers are restricted to the syntactic forms of C. For example,
+\begin{lstlisting}
+struct X { int i; struct X *next; };
+static struct X a;
+static struct X b = { 0, &a };
+static struct X a = { 1, &b };
+\end{lstlisting}
+Rationale: This avoids having different initialization rules for builtin types and userdefined types.
+Effect on original feature: Deletion of semantically welldefined feature. \\
+Difficulty of converting: Semantic transformation.
+In C++, the initializer for one of a set of mutuallyreferential filelocal static objects must invoke a function call to achieve the initialization.
+How widely used: Seldom.
+
+\item
+Change: A struct is a scope in C++, not in C \\
+Rationale: Class scope is crucial to C++, and a struct is a class. \\
+Effect on original feature: Change to semantics of well-defined feature. \\
+Difficulty of converting: Semantic transformation. \\
+How widely used: C programs use struct extremely frequently, but the change is only noticeable when struct, enumeration, or enumerator names are referred to outside the struct.
+The latter is probably rare.
+
+\CFA is C \emph{incompatible} on this issue, and provides semantics similar to \CC.
+Nested types are not hoisted and can be referenced using the field selection operator ``\lstinline@.@'', unlike the \CC scope-resolution operator ``\lstinline@::@''.
+Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
+
+
+\item
+Change: In C++, the name of a nested class is local to its enclosing class.
+In C the name of the nested class belongs to the same scope as the name of the outermost enclosing class
+Example:
+\begin{lstlisting}
+struct X {
+struct Y { /* ... */ } y;
+};
+struct Y yy; // valid C, invalid C++
+\end{lstlisting}
+Rationale: C++ classes have member functions which require that classes establish scopes. The C rule
+would leave classes as an incomplete scope mechanism which would prevent C++ programmers from maintaining
+locality within a class. A coherent set of scope rules for C++ based on the C rule would be very
+complicated and C++ programmers would be unable to predict reliably the meanings of nontrivial examples
+involving nested or local functions.
+Effect on original feature: Change of semantics of welldefined
+feature.
+Difficulty of converting: Semantic transformation. To make the struct type name visible in the scope of
+the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing
+struct is defined. Example:
+\begin{lstlisting}
+struct Y; // struct Y and struct X are at the same scope
+struct X {
+struct Y { /* ... */ } y;
+};
+\end{lstlisting}
+All the definitions of C struct types enclosed in other struct definitions and accessed outside the scope of
+the enclosing struct could be exported to the scope of the enclosing struct. Note: this is a consequence of
+the difference in scope rules, which is documented in 3.3.
+How widely used: Seldom.
+\end{enumerate}
+
+
+\section{I/O Library}
+\label{s:IOLibrary}
+\index{input/output library}
+
+The goal for \CFA I/O is to make I/O as simple as possible for the general case, while fully supporting polmorphism and user defined types in a consistent way.
+The general case is printing out a sequence of variables separated by whitespace.
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{30pt}}l@{}}
+\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{\CC}}	\\
+\begin{lstlisting}
+int x = 0, y = 1, z = 2;
+`sout` `|` x `|` y `|` z `| endl`;
+\end{lstlisting}
+&
+\begin{lstlisting}
+
+cout << x << " " << y << " " << z << endl;
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+The \CFA form is half as many characters, and is similar to Python I/O with respect to implicit separators.
+
+The logical-or operator is used because it is the lowest-priority overloadable operator, other than assignment.
+Therefore, fewer output expressions require parenthesis.
+\begin{quote2}
+\begin{tabular}{@{}ll@{}}
+\textbf{\CFA:}
+&
+\begin{lstlisting}
+sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
+\end{lstlisting}
+\\
+\textbf{\CC:}
+&
+\begin{lstlisting}
+cout << x * 3 << y + 1 << (z << 2) << (x == y) << (x | y) << (x || y) << (x > z ? 1 : 2) << endl;
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+Finally, the logical-or operator has a link with the Shell pipe-operator for moving data, although data flows in the opposite direction.
+
+The implicit seperator\index{I/O separator} character (space/blank) is a separator not a terminator.
+The rules for implicitly adding the separator are:
+\begin{enumerate}
+\item
+A seperator does not appear at the start or end of a line.
+\begin{lstlisting}[belowskip=0pt]
+sout 1 | 2 | 3 | endl;
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+1 2 3
+\end{lstlisting}
+\item
+A seperator does not appear before or after a character literal or variable.
+\begin{lstlisting}
+sout | '1' | '2' | '3' | endl;
+123
+\end{lstlisting}
+\item
+A seperator does not appear before or after a null (empty) C string
+\begin{lstlisting}
+sout | 1 | "" | 2 | "" | 3 | endl;
+123
+\end{lstlisting}
+which is a local mechanism to disable insertion of the separator character.
+\item
+A seperator does not appear before a C string starting with the \Index{extended ASCII}\index{ASCII} characters: \lstinline[mathescape=off]@([{$£¥¿«@
+%$
+\begin{lstlisting}[mathescape=off]
+sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¿" | 7 | "x «" | 8 | endl;
+\end{lstlisting}
+%$
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+x (1 x [2 x {3 x $4 x £5 x ¥6 x ¿7 x «8
+\end{lstlisting}
+%$
+\item
+A seperator does not appear after a C string ending with the extended ASCII characters: \lstinline@,.:;!?)]}%¢»@
+\begin{lstlisting}[belowskip=0pt]
+sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
+	 | 10 | "% x" | 11 | L"¢ x" | 12 | L"» x" | endl;
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+1, x 2. x 3: x 4; x 5! x 6? x 7) x 8] x 9} x 10% x 11¢ 12»
+\end{lstlisting}
+\item
+A seperator does not appear before or after a C string begining/ending with the characters: \lstinline@\f\n\r\t\v\`'"@
+\begin{lstlisting}[belowskip=0pt]
+sout | "x '" | 1 | "' x \`" | 2 | "\` x \"" | 3 | "\" x" | endl;
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+x '1' x \`2\` x "3" x
+\end{lstlisting}
+\begin{lstlisting}[showtabs=true,aboveskip=0pt]
+sout | "x\t" | 1 | "\tx" | endl;
+x	1	x
+\end{lstlisting}
+\end{enumerate}
+The following \CC-style \Index{manipulator}s allow further control over implicit seperation.
+\begin{lstlisting}[mathescape=off,belowskip=0pt]
+sout | sepOn | 1 | 2 | 3 | sepOn | endl;	// separator at start of line
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+ 1 2 3
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
+sout | 1 | sepOff | 2 | 3 | endl;			// turn off implicit separator temporarily
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+12 3
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
+sout | sepDisable | 1 | 2 | 3 | endl;		// turn off implicit separation, affects all subsequent prints
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+123
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
+sout | 1 | sepOn | 2 | 3 | endl;			// turn on implicit separator temporarily
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+1 23
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
+sout | sepEnable | 1 | 2 | 3 | endl;		// turn on implicit separation, affects all subsequent prints
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
+1 2 3
+\end{lstlisting}
+\begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt]
+sepSet( sout, ", $" );						// change separator from " " to ", $"
+sout | 1 | 2 | 3 | endl;
+\end{lstlisting}
+%$
+\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt]
+1, $2, $3
+\end{lstlisting}
+%$
+\VRef[Figure]{f:ExampleIO} shows an example of input and output I/O in \CFA.
+
+\begin{figure}
+\begin{lstlisting}[mathescape=off]
+#include <fstream>
+
+int main() {
+	char c;														// basic types
+	short int si;
+	unsigned short int usi;
+	int i;
+	unsigned int ui;
+	long int li;
+	unsigned long int uli;
+	long long int lli;
+	unsigned long long int ulli;
+	float f;
+	double d;
+	long double ld;
+	float _Complex fc;
+	double _Complex dc;
+	long double _Complex ldc;
+	char s1[10], s2[10];
+
+	ifstream in;												// create / open file
+	open( &in, "input.data", "r" );
+
+	&in | &c													// character
+		| &si | &usi | &i | &ui | &li | &uli | &lli | &ulli		// integral
+		| &f | &d | &ld											// floating point
+		| &fc | &dc | &ldc										// floating-point complex
+		| cstr( s1 ) | cstr( s2, 10 );							// C string, length unchecked and checked
+
+	sout | c | ' ' | endl										// character
+		 | si | usi | i | ui | li | uli | lli | ulli | endl		// integral
+		 | f | d | ld | endl									// floating point
+		 | fc | dc | ldc | endl;								// complex
+	sout | endl;
+	sout | f | "" | d | "" | ld | endl							// floating point without separator
+		 | sepDisable | fc | dc | ldc | sepEnable | endl		// complex without separator
+		 | sepOn | s1 | sepOff | s2 | endl						// local separator removal
+		 | s1 | "" | s2 | endl;									// C string withou separator
+	sout | endl;
+	sepSet( sout, ", $" );										// change separator, maximum of 15 characters
+	sout | f | d | ld | endl									// floating point without separator
+		 | fc | dc | ldc | endl									// complex without separator
+		 | s1 | s2 | endl;
+}
+
+$ cat input.data 
+A 1 2 3 4 5 6 7 8 1.1 1.2 1.3 1.1+2.3 1.1-2.3 1.1-2.3 abc xyz
+$ a.out
+A 
+1 2 3 4 5 6 7 8
+1.1 1.2 1.3
+1.1+2.3i 1.1-2.3i 1.1-2.3i
+
+1.11.21.3
+1.1+2.3i1.1-2.3i1.1-2.3i
+ abcxyz
+abcxyz
+
+1.1, $1.2, $1.3
+1.1+2.3i, $1.1-2.3i, $1.1-2.3i
+abc, $xyz
+\end{lstlisting}
+\caption{Example I/O}
+\label{f:ExampleIO}
+\end{figure}
+
+
+\section{Standard Library}
+\label{s:StandardLibrary}
+
+The goal of the \CFA standard-library is to wrap many of the existing C library-routines that are explicitly polymorphic into implicitly polymorphic versions.
+
+
+\subsection{malloc}
+
+\begin{lstlisting}
+forall( otype T ) T * malloc( void );
+forall( otype T ) T * malloc( char fill );
+forall( otype T ) T * malloc( T * ptr, size_t size );
+forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill );
+forall( otype T ) T * calloc( size_t size );
+forall( otype T ) T * realloc( T * ptr, size_t size );
+forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill );
+
+forall( otype T ) T * aligned_alloc( size_t alignment );
+forall( otype T ) T * memalign( size_t alignment );		// deprecated
+forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
+
+forall( otype T ) T * memset( T * ptr, unsigned char fill ); // use default value '\0' for fill
+forall( otype T ) T * memset( T * ptr );				// remove when default value available
+\end{lstlisting}
+
+
+\subsection{ato/strto}
+
+\begin{lstlisting}
+int ato( const char * ptr );
+unsigned int ato( const char * ptr );
+long int ato( const char * ptr );
+unsigned long int ato( const char * ptr );
+long long int ato( const char * ptr );
+unsigned long long int ato( const char * ptr );
+float ato( const char * ptr );
+double ato( const char * ptr );
+long double ato( const char * ptr );
+float _Complex ato( const char * ptr );
+double _Complex ato( const char * ptr );
+long double _Complex ato( const char * ptr );
+
+int strto( const char * sptr, char ** eptr, int base );
+unsigned int strto( const char * sptr, char ** eptr, int base );
+long int strto( const char * sptr, char ** eptr, int base );
+unsigned long int strto( const char * sptr, char ** eptr, int base );
+long long int strto( const char * sptr, char ** eptr, int base );
+unsigned long long int strto( const char * sptr, char ** eptr, int base );
+float strto( const char * sptr, char ** eptr );
+double strto( const char * sptr, char ** eptr );
+long double strto( const char * sptr, char ** eptr );
+float _Complex strto( const char * sptr, char ** eptr );
+double _Complex strto( const char * sptr, char ** eptr );
+long double _Complex strto( const char * sptr, char ** eptr );
+\end{lstlisting}
+
+
+\subsection{bsearch/qsort}
+
+\begin{lstlisting}
+forall( otype T | { int ?<?( T, T ); } )
+T * bsearch( const T key, const T * arr, size_t dimension );
+
+forall( otype T | { int ?<?( T, T ); } )
+void qsort( const T * arr, size_t dimension );
+\end{lstlisting}
+
+
+\subsection{abs}
+
+\begin{lstlisting}
+char abs( char );
+extern "C" {
+int abs( int );				// use default C routine for int
+} // extern "C"
+long int abs( long int );
+long long int abs( long long int );
+float abs( float );
+double abs( double );
+long double abs( long double );
+float _Complex abs( float _Complex );
+double _Complex abs( double _Complex );
+long double _Complex abs( long double _Complex );
+\end{lstlisting}
+
+
+\subsection{floor/ceil}
+
+\begin{lstlisting}
+float floor( float );
+extern "C" {
+double floor( double );		// use C routine for double
+} // extern "C"
+long double floor( long double );
+
+float ceil( float );
+extern "C" {
+double ceil( double );		// use C routine for double
+} // extern "C"
+long double ceil( long double );
+\end{lstlisting}
+
+
+\subsection{random}
+
+\begin{lstlisting}
+void rand48seed( long int s );
+char rand48();
+int rand48();
+unsigned int rand48();
+long int rand48();
+unsigned long int rand48();
+float rand48();
+double rand48();
+float _Complex rand48();
+double _Complex rand48();
+long double _Complex rand48();
+\end{lstlisting}
+
+
+\subsection{min/max/swap}
+
+\begin{lstlisting}
+forall( otype T | { int ?<?( T, T ); } )
+T min( const T t1, const T t2 );
+
+forall( otype T | { int ?>?( T, T ); } )
+T max( const T t1, const T t2 );
+
+forall( otype T )
+void swap( T * t1, T * t2 );
+\end{lstlisting}
+
+
+\section{Rational Numbers}
+\label{s:RationalNumbers}
+
+Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers.
+When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible.
+
+\begin{lstlisting}
+// implementation
+struct Rational {
+	long int numerator, denominator;					// invariant: denominator > 0
+}; // Rational
+
+// constants
+extern struct Rational 0;
+extern struct Rational 1;
+
+// constructors
+Rational rational();
+Rational rational( long int n );
+Rational rational( long int n, long int d );
+
+// getter/setter for numerator/denominator
+long int numerator( Rational r );
+long int numerator( Rational r, long int n );
+long int denominator( Rational r );
+long int denominator( Rational r, long int d );
+
+// comparison
+int ?==?( Rational l, Rational r );
+int ?!=?( Rational l, Rational r );
+int ?<?( Rational l, Rational r );
+int ?<=?( Rational l, Rational r );
+int ?>?( Rational l, Rational r );
+int ?>=?( Rational l, Rational r );
+
+// arithmetic
+Rational -?( Rational r );
+Rational ?+?( Rational l, Rational r );
+Rational ?-?( Rational l, Rational r );
+Rational ?*?( Rational l, Rational r );
+Rational ?/?( Rational l, Rational r );
+
+// conversion
+double widen( Rational r );
+Rational narrow( double f, long int md );
+
+// I/O
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, Rational * );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, Rational );
+\end{lstlisting}
+
+
+\bibliographystyle{plain}
+\bibliography{cfa}
+
+
+\addcontentsline{toc}{section}{\indexname} % add index name to table of contents
+\begin{theindex}
+Italic page numbers give the location of the main entry for the referenced term.
+Plain page numbers denote uses of the indexed term.
+Entries for grammar non-terminals are italicized.
+A typewriter font is used for grammar terminals and program identifiers.
+\indexspace
+\input{user.ind}
+\end{theindex}
+
+
+\end{document}
+
+% Local Variables: %
+% tab-width: 4 %
+% fill-column: 100 %
+% compile-command: "make" %
+% End: %
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/CodeGen/CodeGenerator.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan 25 21:22:00 2016
-// Update Count     : 242
+// Last Modified On : Wed Mar  2 17:32:16 2016
+// Update Count     : 243
 //
 
@@ -21,8 +21,9 @@
 #include "Parser/ParseNode.h"
 
-#include "SynTree/Type.h"
+#include "SynTree/Declaration.h"
 #include "SynTree/Expression.h"
 #include "SynTree/Initializer.h"
 #include "SynTree/Statement.h"
+#include "SynTree/Type.h"
 
 #include "Common/utility.h"
@@ -170,5 +171,5 @@
 	}
   
-	void CodeGenerator::visit( ContextDecl *aggregateDecl ) {}
+	void CodeGenerator::visit( TraitDecl *aggregateDecl ) {}
   
 	void CodeGenerator::visit( TypedefDecl *typeDecl ) {
@@ -454,5 +455,5 @@
 
 	void CodeGenerator::visit( UntypedOffsetofExpr *offsetofExpr ) {
-		assert( false );
+		assert( false && "UntypedOffsetofExpr should not reach code generation" );
 	}
 
@@ -463,4 +464,8 @@
 		output << ", " << mangleName( offsetofExpr->get_member() );
 		output << ")";
+	}
+
+	void CodeGenerator::visit( OffsetPackExpr *offsetPackExpr ) {
+		assert( false && "OffsetPackExpr should not reach code generation" );
 	}
   
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/CodeGen/CodeGenerator.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Aug 12 14:27:14 2015
-// Update Count     : 27
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:32:24 2016
+// Update Count     : 28
 //
 
@@ -19,6 +19,8 @@
 #include <list>
 
+#include "SynTree/Declaration.h"
 #include "SynTree/SynTree.h"
 #include "SynTree/Visitor.h"
+
 #include "SymTab/Indexer.h"
 
@@ -38,5 +40,5 @@
 		virtual void visit( UnionDecl *aggregateDecl );
 		virtual void visit( EnumDecl *aggregateDecl );
-		virtual void visit( ContextDecl *aggregateDecl );
+		virtual void visit( TraitDecl *aggregateDecl );
 		virtual void visit( TypedefDecl *typeDecl );
 		virtual void visit( TypeDecl *typeDecl );
@@ -63,4 +65,5 @@
 		virtual void visit( UntypedOffsetofExpr *offsetofExpr );
 		virtual void visit( OffsetofExpr *offsetofExpr );
+		virtual void visit( OffsetPackExpr *offsetPackExpr );
 		virtual void visit( LogicalExpr *logicalExpr );
 		virtual void visit( ConditionalExpr *conditionalExpr );
Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/CodeGen/GenType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -19,7 +19,9 @@
 #include "GenType.h"
 #include "CodeGenerator.h"
+
+#include "SynTree/Declaration.h"
+#include "SynTree/Expression.h"
+#include "SynTree/Type.h"
 #include "SynTree/Visitor.h"
-#include "SynTree/Type.h"
-#include "SynTree/Expression.h"
 
 namespace CodeGen {
@@ -39,4 +41,5 @@
 		virtual void visit( EnumInstType *enumInst );
 		virtual void visit( TypeInstType *typeInst );
+		virtual void visit( VarArgsType *varArgsType );
   
 	  private:
@@ -191,4 +194,9 @@
 	}
 
+	void GenType::visit( VarArgsType *varArgsType ) {
+		typeString = "__builtin_va_list " + typeString;
+		handleQualifiers( varArgsType );
+	}
+
 	void GenType::handleQualifiers( Type *type ) {
 		if ( type->get_isConst() ) {
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/Box.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -14,15 +14,21 @@
 //
 
+#include <algorithm>
+#include <iterator>
+#include <list>
+#include <map>
 #include <set>
 #include <stack>
 #include <string>
-#include <iterator>
-#include <algorithm>
+#include <utility>
+#include <vector>
 #include <cassert>
 
 #include "Box.h"
-#include "InstantiateGeneric.h"
+#include "DeclMutator.h"
 #include "PolyMutator.h"
 #include "FindFunction.h"
+#include "ScopedMap.h"
+#include "ScopedSet.h"
 #include "ScrubTyVars.h"
 
@@ -30,9 +36,11 @@
 
 #include "SynTree/Constant.h"
-#include "SynTree/Type.h"
+#include "SynTree/Declaration.h"
 #include "SynTree/Expression.h"
 #include "SynTree/Initializer.h"
+#include "SynTree/Mutator.h"
 #include "SynTree/Statement.h"
-#include "SynTree/Mutator.h"
+#include "SynTree/Type.h"
+#include "SynTree/TypeSubstitution.h"
 
 #include "ResolvExpr/TypeEnvironment.h"
@@ -40,4 +48,5 @@
 #include "ResolvExpr/typeops.h"
 
+#include "SymTab/Indexer.h"
 #include "SymTab/Mangler.h"
 
@@ -54,4 +63,102 @@
 		FunctionType *makeAdapterType( FunctionType *adaptee, const TyVarMap &tyVars );
 
+		/// Abstracts type equality for a list of parameter types
+		struct TypeList {
+			TypeList() : params() {}
+			TypeList( const std::list< Type* > &_params ) : params() { cloneAll(_params, params); }
+			TypeList( std::list< Type* > &&_params ) : params( _params ) {}
+
+			TypeList( const TypeList &that ) : params() { cloneAll(that.params, params); }
+			TypeList( TypeList &&that ) : params( std::move( that.params ) ) {}
+
+			/// Extracts types from a list of TypeExpr*
+			TypeList( const std::list< TypeExpr* >& _params ) : params() {
+				for ( std::list< TypeExpr* >::const_iterator param = _params.begin(); param != _params.end(); ++param ) {
+					params.push_back( (*param)->get_type()->clone() );
+				}
+			}
+
+			TypeList& operator= ( const TypeList &that ) {
+				deleteAll( params );
+
+				params.clear();
+				cloneAll( that.params, params );
+
+				return *this;
+			}
+
+			TypeList& operator= ( TypeList &&that ) {
+				deleteAll( params );
+
+				params = std::move( that.params );
+
+				return *this;
+			}
+
+			~TypeList() { deleteAll( params ); }
+
+			bool operator== ( const TypeList& that ) const {
+				if ( params.size() != that.params.size() ) return false;
+
+				SymTab::Indexer dummy;
+				for ( std::list< Type* >::const_iterator it = params.begin(), jt = that.params.begin(); it != params.end(); ++it, ++jt ) {
+					if ( ! ResolvExpr::typesCompatible( *it, *jt, dummy ) ) return false;
+				}
+				return true;
+			}
+
+			std::list< Type* > params;  ///< Instantiation parameters
+		};
+
+		/// Maps a key and a TypeList to the some value, accounting for scope
+		template< typename Key, typename Value >
+		class InstantiationMap {
+			/// Wraps value for a specific (Key, TypeList) combination
+			typedef std::pair< TypeList, Value* > Instantiation;
+			/// List of TypeLists paired with their appropriate values
+			typedef std::vector< Instantiation > ValueList;
+			/// Underlying map type; maps keys to a linear list of corresponding TypeLists and values
+			typedef ScopedMap< Key*, ValueList > InnerMap;
+
+			InnerMap instantiations;  ///< instantiations
+
+		public:
+			/// Starts a new scope
+			void beginScope() { instantiations.beginScope(); }
+
+			/// Ends a scope
+			void endScope() { instantiations.endScope(); }
+
+			/// Gets the value for the (key, typeList) pair, returns NULL on none such.
+			Value *lookup( Key *key, const std::list< TypeExpr* >& params ) const {
+ 				TypeList typeList( params );
+ 				
+				// scan scopes for matches to the key
+				for ( typename InnerMap::const_iterator insts = instantiations.find( key ); insts != instantiations.end(); insts = instantiations.findNext( insts, key ) ) {
+					for ( typename ValueList::const_reverse_iterator inst = insts->second.rbegin(); inst != insts->second.rend(); ++inst ) {
+						if ( inst->first == typeList ) return inst->second;
+					}
+				}
+				// no matching instantiations found
+				return 0;
+			}
+
+			/// Adds a value for a (key, typeList) pair to the current scope
+			void insert( Key *key, const std::list< TypeExpr* > &params, Value *value ) {
+				instantiations[ key ].push_back( Instantiation( TypeList( params ), value ) );
+			}
+		};
+
+		/// Adds layout-generation functions to polymorphic types
+		class LayoutFunctionBuilder : public DeclMutator {
+			unsigned int functionNesting;  // current level of nested functions
+		public:
+			LayoutFunctionBuilder() : functionNesting( 0 ) {}
+
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
+			virtual Declaration *mutate( StructDecl *structDecl );
+			virtual Declaration *mutate( UnionDecl *unionDecl );
+		};
+		
 		/// Replaces polymorphic return types with out-parameters, replaces calls to polymorphic functions with adapter calls as needed, and adds appropriate type variables to the function call
 		class Pass1 : public PolyMutator {
@@ -72,6 +179,4 @@
 			virtual void doEndScope();
 		  private:
-			/// Makes a new temporary array holding the offsets of the fields of `type`, and returns a new variable expression referencing it
-			Expression *makeOffsetArray( StructInstType *type );
 			/// Pass the extra type parameters from polymorphic generic arguments or return types into a function application
 			void passArgTypeVars( ApplicationExpr *appExpr, Type *parmType, Type *argBaseType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars, std::set< std::string > &seenTypes );
@@ -100,8 +205,8 @@
 			ObjectDecl *makeTemporary( Type *type );
 
-			typedef std::map< std::string, DeclarationWithType *> AdapterMap;
-			std::map< std::string, DeclarationWithType *> assignOps;
-			ResolvExpr::TypeMap< DeclarationWithType > scopedAssignOps;
-			std::stack< AdapterMap > adapters;
+			ScopedMap< std::string, DeclarationWithType *> assignOps;    ///< Currently known type variable assignment operators
+			ResolvExpr::TypeMap< DeclarationWithType > scopedAssignOps;  ///< Currently known assignment operators
+			ScopedMap< std::string, DeclarationWithType* > adapters;     ///< Set of adapter functions in the current scope
+			
 			DeclarationWithType *retval;
 			bool useRetval;
@@ -109,5 +214,6 @@
 		};
 
-		/// Moves polymorphic returns in function types to pointer-type parameters, adds type size and assertion parameters to parameter lists as well
+		/// * Moves polymorphic returns in function types to pointer-type parameters
+		/// * adds type size and assertion parameters to parameter lists
 		class Pass2 : public PolyMutator {
 		  public:
@@ -120,4 +226,5 @@
 			virtual Type *mutate( PointerType *pointerType );
 			virtual Type *mutate( FunctionType *funcType );
+			
 		  private:
 			void addAdapters( FunctionType *functionType );
@@ -126,8 +233,38 @@
 		};
 
-		/// Replaces member expressions for polymorphic types with calculated add-field-offset-and-dereference;
-		/// also fixes offsetof expressions.
-		class MemberExprFixer : public PolyMutator {
-		  public:
+		/// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
+		class GenericInstantiator : public DeclMutator {
+			/// Map of (generic type, parameter list) pairs to concrete type instantiations
+			InstantiationMap< AggregateDecl, AggregateDecl > instantiations;
+			/// Namer for concrete types
+			UniqueName typeNamer;
+
+		public:
+			GenericInstantiator() : DeclMutator(), instantiations(), typeNamer("_conc_") {}
+
+			virtual Type* mutate( StructInstType *inst );
+			virtual Type* mutate( UnionInstType *inst );
+
+	// 		virtual Expression* mutate( MemberExpr *memberExpr );
+
+			virtual void doBeginScope();
+			virtual void doEndScope();
+		private:
+			/// Wrap instantiation lookup for structs
+			StructDecl* lookup( StructInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (StructDecl*)instantiations.lookup( inst->get_baseStruct(), typeSubs ); }
+			/// Wrap instantiation lookup for unions
+			UnionDecl* lookup( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (UnionDecl*)instantiations.lookup( inst->get_baseUnion(), typeSubs ); }
+			/// Wrap instantiation insertion for structs
+			void insert( StructInstType *inst, const std::list< TypeExpr* > &typeSubs, StructDecl *decl ) { instantiations.insert( inst->get_baseStruct(), typeSubs, decl ); }
+			/// Wrap instantiation insertion for unions
+			void insert( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs, UnionDecl *decl ) { instantiations.insert( inst->get_baseUnion(), typeSubs, decl ); }
+		};
+
+		/// Replaces member and size/align/offsetof expressions on polymorphic generic types with calculated expressions.
+		/// * Replaces member expressions for polymorphic types with calculated add-field-offset-and-dereference
+		/// * Calculates polymorphic offsetof expressions from offset array
+		/// * Inserts dynamic calculation of polymorphic type layouts where needed
+		class PolyGenericCalculator : public PolyMutator {
+		public:
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
@@ -140,5 +277,27 @@
 			virtual Type *mutate( FunctionType *funcType );
 			virtual Expression *mutate( MemberExpr *memberExpr );
+			virtual Expression *mutate( SizeofExpr *sizeofExpr );
+			virtual Expression *mutate( AlignofExpr *alignofExpr );
 			virtual Expression *mutate( OffsetofExpr *offsetofExpr );
+			virtual Expression *mutate( OffsetPackExpr *offsetPackExpr );
+
+			virtual void doBeginScope();
+			virtual void doEndScope();
+
+		private:
+			/// Makes a new variable in the current scope with the given name, type & optional initializer
+			ObjectDecl *makeVar( const std::string &name, Type *type, Initializer *init = 0 );
+			/// returns true if the type has a dynamic layout; such a layout will be stored in appropriately-named local variables when the function returns
+			bool findGeneric( Type *ty );
+			/// adds type parameters to the layout call; will generate the appropriate parameters if needed
+			void addOtypeParamsToLayoutCall( UntypedExpr *layoutCall, const std::list< Type* > &otypeParams );
+
+			/// Enters a new scope for type-variables, adding the type variables from ty
+			void beginTypeScope( Type *ty );
+			/// Exits the type-variable scope
+			void endTypeScope();
+			
+			ScopedSet< std::string > knownLayouts;          ///< Set of generic type layouts known in the current scope, indexed by sizeofName
+			ScopedSet< std::string > knownOffsets;          ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName
 		};
 
@@ -159,13 +318,4 @@
 	} // anonymous namespace
 
-	void printAllNotBuiltin( const std::list< Declaration *>& translationUnit, std::ostream &os ) {
-		for ( std::list< Declaration *>::const_iterator i = translationUnit.begin(); i != translationUnit.end(); ++i ) {
-			if ( ! LinkageSpec::isBuiltin( (*i)->get_linkage() ) ) {
-				(*i)->print( os );
-				os << std::endl;
-			} // if
-		} // for
-	}
-
 	/// version of mutateAll with special handling for translation unit so you can check the end of the prelude when debugging
 	template< typename MutatorType >
@@ -195,15 +345,218 @@
 
 	void box( std::list< Declaration *>& translationUnit ) {
+		LayoutFunctionBuilder layoutBuilder;
 		Pass1 pass1;
 		Pass2 pass2;
-		MemberExprFixer memberFixer;
+		GenericInstantiator instantiator;
+		PolyGenericCalculator polyCalculator;
 		Pass3 pass3;
+		
+		layoutBuilder.mutateDeclarationList( translationUnit );
 		mutateTranslationUnit/*All*/( translationUnit, pass1 );
 		mutateTranslationUnit/*All*/( translationUnit, pass2 );
-		instantiateGeneric( translationUnit );
-		mutateTranslationUnit/*All*/( translationUnit, memberFixer );
+		instantiator.mutateDeclarationList( translationUnit );
+		mutateTranslationUnit/*All*/( translationUnit, polyCalculator );
 		mutateTranslationUnit/*All*/( translationUnit, pass3 );
 	}
 
+	////////////////////////////////// LayoutFunctionBuilder ////////////////////////////////////////////
+
+	DeclarationWithType *LayoutFunctionBuilder::mutate( FunctionDecl *functionDecl ) {
+		functionDecl->set_functionType( maybeMutate( functionDecl->get_functionType(), *this ) );
+		mutateAll( functionDecl->get_oldDecls(), *this );
+		++functionNesting;
+		functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
+		--functionNesting;
+		return functionDecl;
+	}
+	
+	/// Get a list of type declarations that will affect a layout function
+	std::list< TypeDecl* > takeOtypeOnly( std::list< TypeDecl* > &decls ) {
+		std::list< TypeDecl * > otypeDecls;
+
+		for ( std::list< TypeDecl* >::const_iterator decl = decls.begin(); decl != decls.end(); ++decl ) {
+			if ( (*decl)->get_kind() == TypeDecl::Any ) {
+				otypeDecls.push_back( *decl );
+			}
+		}
+		
+		return otypeDecls;
+	}
+
+	/// Adds parameters for otype layout to a function type
+	void addOtypeParams( FunctionType *layoutFnType, std::list< TypeDecl* > &otypeParams ) {
+		BasicType sizeAlignType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+		
+		for ( std::list< TypeDecl* >::const_iterator param = otypeParams.begin(); param != otypeParams.end(); ++param ) {
+			TypeInstType paramType( Type::Qualifiers(), (*param)->get_name(), *param );
+			std::string paramName = mangleType( &paramType );
+			layoutFnType->get_parameters().push_back( new ObjectDecl( sizeofName( paramName ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) );
+			layoutFnType->get_parameters().push_back( new ObjectDecl( alignofName( paramName ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignType.clone(), 0 ) );
+		}
+	}
+
+	/// Builds a layout function declaration
+	FunctionDecl *buildLayoutFunctionDecl( AggregateDecl *typeDecl, unsigned int functionNesting, FunctionType *layoutFnType ) {
+		// Routines at global scope marked "static" to prevent multiple definitions is separate translation units
+		// because each unit generates copies of the default routines for each aggregate.
+		FunctionDecl *layoutDecl = new FunctionDecl(
+			layoutofName( typeDecl ), functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, layoutFnType, new CompoundStmt( noLabels ), true, false );
+		layoutDecl->fixUniqueId();
+		return layoutDecl;
+	}
+
+	/// Makes a unary operation
+	Expression *makeOp( const std::string &name, Expression *arg ) {
+		UntypedExpr *expr = new UntypedExpr( new NameExpr( name ) );
+		expr->get_args().push_back( arg );
+		return expr;
+	}
+
+	/// Makes a binary operation
+	Expression *makeOp( const std::string &name, Expression *lhs, Expression *rhs ) {
+		UntypedExpr *expr = new UntypedExpr( new NameExpr( name ) );
+		expr->get_args().push_back( lhs );
+		expr->get_args().push_back( rhs );
+		return expr;
+	}
+
+	/// Returns the dereference of a local pointer variable
+	Expression *derefVar( ObjectDecl *var ) {
+		return makeOp( "*?", new VariableExpr( var ) );
+	}
+
+	/// makes an if-statement with a single-expression if-block and no then block
+	Statement *makeCond( Expression *cond, Expression *ifPart ) {
+		return new IfStmt( noLabels, cond, new ExprStmt( noLabels, ifPart ), 0 );
+	}
+
+	/// makes a statement that assigns rhs to lhs if lhs < rhs
+	Statement *makeAssignMax( Expression *lhs, Expression *rhs ) {
+		return makeCond( makeOp( "?<?", lhs, rhs ), makeOp( "?=?", lhs->clone(), rhs->clone() ) );
+	}
+
+	/// makes a statement that aligns lhs to rhs (rhs should be an integer power of two)
+	Statement *makeAlignTo( Expression *lhs, Expression *rhs ) {
+		// check that the lhs is zeroed out to the level of rhs
+		Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "1" ) ) ) );
+		// if not aligned, increment to alignment
+		Expression *ifExpr = makeOp( "?+=?", lhs->clone(), makeOp( "?-?", rhs->clone(), ifCond->clone() ) );
+		return makeCond( ifCond, ifExpr );
+	}
+	
+	/// adds an expression to a compound statement
+	void addExpr( CompoundStmt *stmts, Expression *expr ) {
+		stmts->get_kids().push_back( new ExprStmt( noLabels, expr ) );
+	}
+
+	/// adds a statement to a compound statement
+	void addStmt( CompoundStmt *stmts, Statement *stmt ) {
+		stmts->get_kids().push_back( stmt );
+	}
+	
+	Declaration *LayoutFunctionBuilder::mutate( StructDecl *structDecl ) {
+		// do not generate layout function for "empty" tag structs
+		if ( structDecl->get_members().empty() ) return structDecl;
+
+		// get parameters that can change layout, exiting early if none
+		std::list< TypeDecl* > otypeParams = takeOtypeOnly( structDecl->get_parameters() );
+		if ( otypeParams.empty() ) return structDecl;
+
+		// build layout function signature
+		FunctionType *layoutFnType = new FunctionType( Type::Qualifiers(), false );
+		BasicType *sizeAlignType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+		PointerType *sizeAlignOutType = new PointerType( Type::Qualifiers(), sizeAlignType );
+		
+		ObjectDecl *sizeParam = new ObjectDecl( sizeofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 );
+		layoutFnType->get_parameters().push_back( sizeParam );
+		ObjectDecl *alignParam = new ObjectDecl( alignofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 );
+		layoutFnType->get_parameters().push_back( alignParam );
+		ObjectDecl *offsetParam = new ObjectDecl( offsetofName( structDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 );
+		layoutFnType->get_parameters().push_back( offsetParam );
+		addOtypeParams( layoutFnType, otypeParams );
+
+		// build function decl
+		FunctionDecl *layoutDecl = buildLayoutFunctionDecl( structDecl, functionNesting, layoutFnType );
+
+		// calculate struct layout in function body
+
+		// initialize size and alignment to 0 and 1 (will have at least one member to re-edit size
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "0" ) ) ) );
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
+		unsigned long n_members = 0;
+		bool firstMember = true;
+		for ( std::list< Declaration* >::const_iterator member = structDecl->get_members().begin(); member != structDecl->get_members().end(); ++member ) {
+			DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member );
+			assert( dwt );
+			Type *memberType = dwt->get_type();
+
+			if ( firstMember ) {
+				firstMember = false;
+			} else {
+				// make sure all members after the first (automatically aligned at 0) are properly padded for alignment
+				addStmt( layoutDecl->get_statements(), makeAlignTo( derefVar( sizeParam ), new AlignofExpr( memberType->clone() ) ) );
+			}
+			
+			// place current size in the current offset index
+			addExpr( layoutDecl->get_statements(), makeOp( "?=?", makeOp( "?[?]", new VariableExpr( offsetParam ), new ConstantExpr( Constant::from( n_members ) ) ),
+			                                                      derefVar( sizeParam ) ) );
+			++n_members;
+
+			// add member size to current size
+			addExpr( layoutDecl->get_statements(), makeOp( "?+=?", derefVar( sizeParam ), new SizeofExpr( memberType->clone() ) ) );
+			
+			// take max of member alignment and global alignment
+			addStmt( layoutDecl->get_statements(), makeAssignMax( derefVar( alignParam ), new AlignofExpr( memberType->clone() ) ) );
+		}
+		// make sure the type is end-padded to a multiple of its alignment
+		addStmt( layoutDecl->get_statements(), makeAlignTo( derefVar( sizeParam ), derefVar( alignParam ) ) );
+
+		addDeclarationAfter( layoutDecl );
+		return structDecl;
+	}
+	
+	Declaration *LayoutFunctionBuilder::mutate( UnionDecl *unionDecl ) {
+		// do not generate layout function for "empty" tag unions
+		if ( unionDecl->get_members().empty() ) return unionDecl;
+		
+		// get parameters that can change layout, exiting early if none
+		std::list< TypeDecl* > otypeParams = takeOtypeOnly( unionDecl->get_parameters() );
+		if ( otypeParams.empty() ) return unionDecl;
+
+		// build layout function signature
+		FunctionType *layoutFnType = new FunctionType( Type::Qualifiers(), false );
+		BasicType *sizeAlignType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+		PointerType *sizeAlignOutType = new PointerType( Type::Qualifiers(), sizeAlignType );
+		
+		ObjectDecl *sizeParam = new ObjectDecl( sizeofName( unionDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType, 0 );
+		layoutFnType->get_parameters().push_back( sizeParam );
+		ObjectDecl *alignParam = new ObjectDecl( alignofName( unionDecl->get_name() ), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, sizeAlignOutType->clone(), 0 );
+		layoutFnType->get_parameters().push_back( alignParam );
+		addOtypeParams( layoutFnType, otypeParams );
+
+		// build function decl
+		FunctionDecl *layoutDecl = buildLayoutFunctionDecl( unionDecl, functionNesting, layoutFnType );
+
+		// calculate union layout in function body
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
+		addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) );
+		for ( std::list< Declaration* >::const_iterator member = unionDecl->get_members().begin(); member != unionDecl->get_members().end(); ++member ) {
+			DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member );
+			assert( dwt );
+			Type *memberType = dwt->get_type();
+			
+			// take max member size and global size
+			addStmt( layoutDecl->get_statements(), makeAssignMax( derefVar( sizeParam ), new SizeofExpr( memberType->clone() ) ) );
+			
+			// take max of member alignment and global alignment
+			addStmt( layoutDecl->get_statements(), makeAssignMax( derefVar( alignParam ), new AlignofExpr( memberType->clone() ) ) );
+		}
+		// make sure the type is end-padded to a multiple of its alignment
+		addStmt( layoutDecl->get_statements(), makeAlignTo( derefVar( sizeParam ), derefVar( alignParam ) ) );
+
+		addDeclarationAfter( layoutDecl );
+		return unionDecl;
+	}
+	
 	////////////////////////////////////////// Pass1 ////////////////////////////////////////////////////
 
@@ -245,7 +598,5 @@
 		}
 
-		Pass1::Pass1() : useRetval( false ), tempNamer( "_temp" ) {
-			adapters.push(AdapterMap());
-		}
+		Pass1::Pass1() : useRetval( false ), tempNamer( "_temp" ) {}
 
 		/// Returns T if the given declaration is (*?=?)(T *, T) for some TypeInstType T (return not checked, but maybe should be), NULL otherwise
@@ -309,5 +660,5 @@
 
 		DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) {
-			// if this is a polymorphic assignment function, put it in the map for this scope
+			// if this is a assignment function, put it in the map for this scope
 			if ( Type *assignedType = isAssignment( functionDecl ) ) {
 				if ( ! dynamic_cast< TypeInstType* >( assignedType ) ) {
@@ -318,6 +669,6 @@
 			if ( functionDecl->get_statements() ) {		// empty routine body ?
 				doBeginScope();
-				TyVarMap oldtyVars = scopeTyVars;
-				std::map< std::string, DeclarationWithType *> oldassignOps = assignOps;
+				scopeTyVars.beginScope();
+				assignOps.beginScope();
 				DeclarationWithType *oldRetval = retval;
 				bool oldUseRetval = useRetval;
@@ -350,5 +701,4 @@
 				} // for
 
-				AdapterMap & adapters = Pass1::adapters.top();
 				for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) {
 					std::string mangleName = mangleAdapterName( *funType, scopeTyVars );
@@ -361,11 +711,6 @@
 				functionDecl->set_statements( functionDecl->get_statements()->acceptMutator( *this ) );
 
-				scopeTyVars = oldtyVars;
-				assignOps = oldassignOps;
-				// std::cerr << "end FunctionDecl: ";
-				// for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) {
-				// 	std::cerr << i->first << " ";
-				// }
-				// std::cerr << "\n";
+				scopeTyVars.endScope();
+				assignOps.endScope();
 				retval = oldRetval;
 				useRetval = oldUseRetval;
@@ -400,36 +745,9 @@
 		}
 
-		Expression *Pass1::makeOffsetArray( StructInstType *ty ) {
-			std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members();
-
-			// make a new temporary array
-			Type *offsetType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
-			std::stringstream lenGen;
-			lenGen << baseMembers.size();
-			ConstantExpr *lenExpr = new ConstantExpr( Constant( offsetType->clone(), lenGen.str() ) );
-			ObjectDecl *arrayTemp = makeTemporary( new ArrayType( Type::Qualifiers(), offsetType, lenExpr, false, false ) );
-
-			// build initializer list for temporary
-			std::list< Initializer* > inits;
-			for ( std::list< Declaration* >::const_iterator member = baseMembers.begin(); member != baseMembers.end(); ++member ) {
-				DeclarationWithType *memberDecl;
-				if ( DeclarationWithType *origMember = dynamic_cast< DeclarationWithType* >( *member ) ) {
-					memberDecl = origMember->clone();
-				} else {
-					memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 );
-				}
-				inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) );
-			}
-			arrayTemp->set_init( new ListInit( inits ) );
-
-			// return variable pointing to temporary
-			return new VariableExpr( arrayTemp );
-		}
-
 		void Pass1::passArgTypeVars( ApplicationExpr *appExpr, Type *parmType, Type *argBaseType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars, std::set< std::string > &seenTypes ) {
-			Type *polyBase = hasPolyBase( parmType, exprTyVars );
-			if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) {
-				std::string sizeName = sizeofName( polyBase );
-				if ( seenTypes.count( sizeName ) ) return;
+			Type *polyType = isPolyType( parmType, exprTyVars );
+			if ( polyType && ! dynamic_cast< TypeInstType* >( polyType ) ) {
+				std::string typeName = mangleType( polyType );
+				if ( seenTypes.count( typeName ) ) return;
 
 				arg = appExpr->get_args().insert( arg, new SizeofExpr( argBaseType->clone() ) );
@@ -437,8 +755,11 @@
 				arg = appExpr->get_args().insert( arg, new AlignofExpr( argBaseType->clone() ) );
 				arg++;
-				if ( dynamic_cast< StructInstType* >( polyBase ) ) {
+				if ( dynamic_cast< StructInstType* >( polyType ) ) {
 					if ( StructInstType *argBaseStructType = dynamic_cast< StructInstType* >( argBaseType ) ) {
-						arg = appExpr->get_args().insert( arg, makeOffsetArray( argBaseStructType ) );
-						arg++;
+						// zero-length arrays are forbidden by C, so don't pass offset for empty struct
+						if ( ! argBaseStructType->get_baseStruct()->get_members().empty() ) {
+							arg = appExpr->get_args().insert( arg, new OffsetPackExpr( argBaseStructType->clone() ) );
+							arg++;
+						}
 					} else {
 						throw SemanticError( "Cannot pass non-struct type for generic struct" );
@@ -446,5 +767,5 @@
 				}
 
-				seenTypes.insert( sizeName );
+				seenTypes.insert( typeName );
 			}
 		}
@@ -588,6 +909,10 @@
 					return;
 				} else if ( arg->get_results().front()->get_isLvalue() ) {
-					// VariableExpr and MemberExpr are lvalues
-					arg = new AddressExpr( arg );
+					// VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue)
+					if ( CommaExpr *commaArg = dynamic_cast< CommaExpr* >( arg ) ) {
+						commaArg->set_arg2( new AddressExpr( commaArg->get_arg2() ) );
+					} else {
+						arg = new AddressExpr( arg );
+					}
 				} else {
 					// use type computed in unification to declare boxed variables
@@ -684,6 +1009,4 @@
 			} // for
 		}
-
-
 
 		FunctionDecl *Pass1::makeAdapter( FunctionType *adaptee, FunctionType *realType, const std::string &mangleName, const TyVarMap &tyVars ) {
@@ -772,10 +1095,11 @@
 					mangleName += makePolyMonoSuffix( originalFunction, exprTyVars );
 
-					AdapterMap & adapters = Pass1::adapters.top();
-					AdapterMap::iterator adapter = adapters.find( mangleName );
+					typedef ScopedMap< std::string, DeclarationWithType* >::iterator AdapterIter;
+					AdapterIter adapter = adapters.find( mangleName );
 					if ( adapter == adapters.end() ) {
 						// adapter has not been created yet in the current scope, so define it
 						FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars );
-						adapter = adapters.insert( adapters.begin(), std::pair< std::string, DeclarationWithType *>( mangleName, newAdapter ) );
+						std::pair< AdapterIter, bool > answer = adapters.insert( std::pair< std::string, DeclarationWithType *>( mangleName, newAdapter ) );
+						adapter = answer.first;
 						stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) );
 					} // if
@@ -801,5 +1125,5 @@
 				addAssign->get_args().push_back( appExpr->get_args().front() );
 			} // if
-			addAssign->get_args().push_back( new NameExpr( sizeofName( polyType ) ) );
+			addAssign->get_args().push_back( new NameExpr( sizeofName( mangleType( polyType ) ) ) );
 			addAssign->get_results().front() = appExpr->get_results().front()->clone();
 			if ( appExpr->get_env() ) {
@@ -828,5 +1152,5 @@
 							UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) );
 							multiply->get_args().push_back( appExpr->get_args().back() );
-							multiply->get_args().push_back( new NameExpr( sizeofName( baseType1 ) ) );
+							multiply->get_args().push_back( new SizeofExpr( baseType1->clone() ) );
 							ret->get_args().push_back( appExpr->get_args().front() );
 							ret->get_args().push_back( multiply );
@@ -834,5 +1158,5 @@
 							UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) );
 							multiply->get_args().push_back( appExpr->get_args().front() );
-							multiply->get_args().push_back( new NameExpr( sizeofName( baseType2 ) ) );
+							multiply->get_args().push_back( new SizeofExpr( baseType2->clone() ) );
 							ret->get_args().push_back( multiply );
 							ret->get_args().push_back( appExpr->get_args().back() );
@@ -897,5 +1221,5 @@
 							UntypedExpr *divide = new UntypedExpr( new NameExpr( "?/?" ) );
 							divide->get_args().push_back( appExpr );
-							divide->get_args().push_back( new NameExpr( sizeofName( baseType1 ) ) );
+							divide->get_args().push_back( new SizeofExpr( baseType1->clone() ) );
 							divide->get_results().push_front( appExpr->get_results().front()->clone() );
 							if ( appExpr->get_env() ) {
@@ -907,10 +1231,10 @@
 							UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) );
 							multiply->get_args().push_back( appExpr->get_args().back() );
-							multiply->get_args().push_back( new NameExpr( sizeofName( baseType1 ) ) );
+							multiply->get_args().push_back( new SizeofExpr( baseType1->clone() ) );
 							appExpr->get_args().back() = multiply;
 						} else if ( baseType2 ) {
 							UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) );
 							multiply->get_args().push_back( appExpr->get_args().front() );
-							multiply->get_args().push_back( new NameExpr( sizeofName( baseType2 ) ) );
+							multiply->get_args().push_back( new SizeofExpr( baseType2->clone() ) );
 							appExpr->get_args().front() = multiply;
 						} // if
@@ -922,5 +1246,5 @@
 							UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) );
 							multiply->get_args().push_back( appExpr->get_args().back() );
-							multiply->get_args().push_back( new NameExpr( sizeofName( baseType ) ) );
+							multiply->get_args().push_back( new SizeofExpr( baseType->clone() ) );
 							appExpr->get_args().back() = multiply;
 						} // if
@@ -959,5 +1283,5 @@
 			std::list< Expression *>::iterator paramBegin = appExpr->get_args().begin();
 
-			TyVarMap exprTyVars;
+			TyVarMap exprTyVars( (TypeDecl::Kind)-1 );
 			makeTyVarMap( function, exprTyVars );
 			ReferenceToType *polyRetType = isPolyRet( function );
@@ -982,5 +1306,4 @@
 
 			boxParams( appExpr, function, arg, exprTyVars );
-
 			passAdapters( appExpr, function, exprTyVars );
 
@@ -1062,5 +1385,5 @@
 				if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() ) ) {
 					// find assignment operator for type variable
-					std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() );
+					ScopedMap< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() );
 					if ( assignIter == assignOps.end() ) {
 						throw SemanticError( "Attempt to return dtype or ftype object in ", returnStmt->get_expr() );
@@ -1084,19 +1407,17 @@
 					std::list< TypeDecl* >::const_iterator forallIt = forallParams.begin();
 					for ( ; tyIt != tyParams.end() && forallIt != forallParams.end(); ++tyIt, ++forallIt ) {
-						if ( (*forallIt)->get_kind() != TypeDecl::Any ) continue; // skip types with no assign op (ftype/dtype)
-
-						std::list< DeclarationWithType* > &asserts = (*forallIt)->get_assertions();
-						assert( ! asserts.empty() && "Type param needs assignment operator assertion" );
-						DeclarationWithType *actualDecl = asserts.front();
-						TypeInstType *actualType = isTypeInstAssignment( actualDecl );
-						assert( actualType && "First assertion of type with assertions should be assignment operator" );
+						// Add appropriate mapping to assignment expression environment
 						TypeExpr *formalTypeExpr = dynamic_cast< TypeExpr* >( *tyIt );
 						assert( formalTypeExpr && "type parameters must be type expressions" );
 						Type *formalType = formalTypeExpr->get_type();
-						assignExpr->get_env()->add( actualType->get_name(), formalType );
-						
+						assignExpr->get_env()->add( (*forallIt)->get_name(), formalType );
+
+						// skip types with no assign op (ftype/dtype)
+						if ( (*forallIt)->get_kind() != TypeDecl::Any ) continue;
+
+						// find assignment operator for formal type
 						DeclarationWithType *assertAssign = 0;
 						if ( TypeInstType *formalTypeInstType = dynamic_cast< TypeInstType* >( formalType ) ) {
-							std::map< std::string, DeclarationWithType *>::const_iterator assertAssignIt = assignOps.find( formalTypeInstType->get_name() );
+							ScopedMap< std::string, DeclarationWithType *>::const_iterator assertAssignIt = assignOps.find( formalTypeInstType->get_name() );
 							if ( assertAssignIt == assignOps.end() ) {
 								throw SemanticError( "No assignment operation found for ", formalTypeInstType );
@@ -1109,6 +1430,9 @@
 							}
 						}
-						
-
+
+						// add inferred parameter for field assignment operator to assignment expression
+						std::list< DeclarationWithType* > &asserts = (*forallIt)->get_assertions();
+						assert( ! asserts.empty() && "Type param needs assignment operator assertion" );
+						DeclarationWithType *actualDecl = asserts.front();
 						assignExpr->get_inferParams()[ actualDecl->get_uniqueId() ]
 							= ParamEntry( assertAssign->get_uniqueId(), assertAssign->get_type()->clone(), actualDecl->get_type()->clone(), wrapFunctionDecl( assertAssign ) );
@@ -1136,31 +1460,30 @@
 
 		Type * Pass1::mutate( PointerType *pointerType ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( pointerType, scopeTyVars );
 
 			Type *ret = Mutator::mutate( pointerType );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return ret;
 		}
 
 		Type * Pass1::mutate( FunctionType *functionType ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( functionType, scopeTyVars );
 
 			Type *ret = Mutator::mutate( functionType );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return ret;
 		}
 
 		void Pass1::doBeginScope() {
-			// push a copy of the current map
-			adapters.push(adapters.top());
+			adapters.beginScope();
 			scopedAssignOps.beginScope();
 		}
 
 		void Pass1::doEndScope() {
-			adapters.pop();
+			adapters.endScope();
 			scopedAssignOps.endScope();
 		}
@@ -1217,15 +1540,15 @@
 
 		Type * Pass2::mutate( PointerType *pointerType ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( pointerType, scopeTyVars );
 
 			Type *ret = Mutator::mutate( pointerType );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return ret;
 		}
 
 		Type *Pass2::mutate( FunctionType *funcType ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( funcType, scopeTyVars );
 
@@ -1244,5 +1567,4 @@
 			ObjectDecl newPtr( "", DeclarationNode::NoStorageClass, LinkageSpec::C, 0,
 			                   new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ), 0 );
-//   ObjectDecl *newFunPtr = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ), 0 );
 			for ( std::list< TypeDecl *>::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) {
 				ObjectDecl *sizeParm, *alignParm;
@@ -1250,12 +1572,13 @@
 				if ( (*tyParm)->get_kind() == TypeDecl::Any ) {
 					TypeInstType parmType( Type::Qualifiers(), (*tyParm)->get_name(), *tyParm );
+					std::string parmName = mangleType( &parmType );
 
 					sizeParm = newObj.clone();
-					sizeParm->set_name( sizeofName( &parmType ) );
+					sizeParm->set_name( sizeofName( parmName ) );
 					last = funcType->get_parameters().insert( last, sizeParm );
 					++last;
 
 					alignParm = newObj.clone();
-					alignParm->set_name( alignofName( &parmType ) );
+					alignParm->set_name( alignofName( parmName ) );
 					last = funcType->get_parameters().insert( last, alignParm );
 					++last;
@@ -1272,28 +1595,31 @@
 			std::set< std::string > seenTypes; // sizeofName for generic types we've seen
 			for ( std::list< DeclarationWithType* >::const_iterator fnParm = last; fnParm != funcType->get_parameters().end(); ++fnParm ) {
-				Type *polyBase = hasPolyBase( (*fnParm)->get_type(), scopeTyVars );
-				if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) {
-					std::string sizeName = sizeofName( polyBase );
-					if ( seenTypes.count( sizeName ) ) continue;
+				Type *polyType = isPolyType( (*fnParm)->get_type(), scopeTyVars );
+				if ( polyType && ! dynamic_cast< TypeInstType* >( polyType ) ) {
+					std::string typeName = mangleType( polyType );
+					if ( seenTypes.count( typeName ) ) continue;
 
 					ObjectDecl *sizeParm, *alignParm, *offsetParm;
 					sizeParm = newObj.clone();
-					sizeParm->set_name( sizeName );
+					sizeParm->set_name( sizeofName( typeName ) );
 					last = funcType->get_parameters().insert( last, sizeParm );
 					++last;
 
 					alignParm = newObj.clone();
-					alignParm->set_name( alignofName( polyBase ) );
+					alignParm->set_name( alignofName( typeName ) );
 					last = funcType->get_parameters().insert( last, alignParm );
 					++last;
 
-					if ( dynamic_cast< StructInstType* >( polyBase ) ) {
-						offsetParm = newPtr.clone();
-						offsetParm->set_name( offsetofName( polyBase ) );
-						last = funcType->get_parameters().insert( last, offsetParm );
-						++last;
+					if ( StructInstType *polyBaseStruct = dynamic_cast< StructInstType* >( polyType ) ) {
+						// NOTE zero-length arrays are illegal in C, so empty structs have no offset array
+						if ( ! polyBaseStruct->get_baseStruct()->get_members().empty() ) {
+							offsetParm = newPtr.clone();
+							offsetParm->set_name( offsetofName( typeName ) );
+							last = funcType->get_parameters().insert( last, offsetParm );
+							++last;
+						}
 					}
 
-					seenTypes.insert( sizeName );
+					seenTypes.insert( typeName );
 				}
 			}
@@ -1305,66 +1631,274 @@
 			mutateAll( funcType->get_parameters(), *this );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return funcType;
 		}
 
-////////////////////////////////////////// MemberExprFixer ////////////////////////////////////////////////////
+//////////////////////////////////////// GenericInstantiator //////////////////////////////////////////////////
+
+		/// Makes substitutions of params into baseParams; returns true if all parameters substituted for a concrete type
+		bool makeSubstitutions( const std::list< TypeDecl* >& baseParams, const std::list< Expression* >& params, std::list< TypeExpr* >& out ) {
+			bool allConcrete = true;  // will finish the substitution list even if they're not all concrete
+
+			// substitute concrete types for given parameters, and incomplete types for placeholders
+			std::list< TypeDecl* >::const_iterator baseParam = baseParams.begin();
+			std::list< Expression* >::const_iterator param = params.begin();
+			for ( ; baseParam != baseParams.end() && param != params.end(); ++baseParam, ++param ) {
+	// 			switch ( (*baseParam)->get_kind() ) {
+	// 			case TypeDecl::Any: {   // any type is a valid substitution here; complete types can be used to instantiate generics
+					TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
+					assert(paramType && "Aggregate parameters should be type expressions");
+					out.push_back( paramType->clone() );
+					// check that the substituted type isn't a type variable itself
+					if ( dynamic_cast< TypeInstType* >( paramType->get_type() ) ) {
+						allConcrete = false;
+					}
+	// 				break;
+	// 			}
+	// 			case TypeDecl::Dtype:  // dtype can be consistently replaced with void [only pointers, which become void*]
+	// 				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
+	// 				break;
+	// 			case TypeDecl::Ftype:  // pointer-to-ftype can be consistently replaced with void (*)(void) [similar to dtype]
+	// 				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
+	// 				break;
+	// 			}
+			}
+
+			// if any parameters left over, not done
+			if ( baseParam != baseParams.end() ) return false;
+	// 		// if not enough parameters given, substitute remaining incomplete types for placeholders
+	// 		for ( ; baseParam != baseParams.end(); ++baseParam ) {
+	// 			switch ( (*baseParam)->get_kind() ) {
+	// 			case TypeDecl::Any:    // no more substitutions here, fail early
+	// 				return false;
+	// 			case TypeDecl::Dtype:  // dtype can be consistently replaced with void [only pointers, which become void*]
+	// 				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
+	// 				break;
+	// 			case TypeDecl::Ftype:  // pointer-to-ftype can be consistently replaced with void (*)(void) [similar to dtype]
+	// 				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
+	// 				break;
+	// 			}
+	// 		}
+
+			return allConcrete;
+		}
+
+		/// Substitutes types of members of in according to baseParams => typeSubs, appending the result to out
+		void substituteMembers( const std::list< Declaration* >& in, const std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs,
+								std::list< Declaration* >& out ) {
+			// substitute types into new members
+			TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() );
+			for ( std::list< Declaration* >::const_iterator member = in.begin(); member != in.end(); ++member ) {
+				Declaration *newMember = (*member)->clone();
+				subs.apply(newMember);
+				out.push_back( newMember );
+			}
+		}
+
+		Type* GenericInstantiator::mutate( StructInstType *inst ) {
+			// mutate subtypes
+			Type *mutated = Mutator::mutate( inst );
+			inst = dynamic_cast< StructInstType* >( mutated );
+			if ( ! inst ) return mutated;
+
+			// exit early if no need for further mutation
+			if ( inst->get_parameters().empty() ) return inst;
+			assert( inst->get_baseParameters() && "Base struct has parameters" );
+
+			// check if type can be concretely instantiated; put substitutions into typeSubs
+			std::list< TypeExpr* > typeSubs;
+			if ( ! makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs ) ) {
+				deleteAll( typeSubs );
+				return inst;
+			}
+
+			// make concrete instantiation of generic type
+			StructDecl *concDecl = lookup( inst, typeSubs );
+			if ( ! concDecl ) {
+				// set concDecl to new type, insert type declaration into statements to add
+				concDecl = new StructDecl( typeNamer.newName( inst->get_name() ) );
+				substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, 	concDecl->get_members() );
+				DeclMutator::addDeclaration( concDecl );
+				insert( inst, typeSubs, concDecl );
+			}
+			StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
+			newInst->set_baseStruct( concDecl );
+
+			deleteAll( typeSubs );
+			delete inst;
+			return newInst;
+		}
+
+		Type* GenericInstantiator::mutate( UnionInstType *inst ) {
+			// mutate subtypes
+			Type *mutated = Mutator::mutate( inst );
+			inst = dynamic_cast< UnionInstType* >( mutated );
+			if ( ! inst ) return mutated;
+
+			// exit early if no need for further mutation
+			if ( inst->get_parameters().empty() ) return inst;
+			assert( inst->get_baseParameters() && "Base union has parameters" );
+
+			// check if type can be concretely instantiated; put substitutions into typeSubs
+			std::list< TypeExpr* > typeSubs;
+			if ( ! makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs ) ) {
+				deleteAll( typeSubs );
+				return inst;
+			}
+
+			// make concrete instantiation of generic type
+			UnionDecl *concDecl = lookup( inst, typeSubs );
+			if ( ! concDecl ) {
+				// set concDecl to new type, insert type declaration into statements to add
+				concDecl = new UnionDecl( typeNamer.newName( inst->get_name() ) );
+				substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
+				DeclMutator::addDeclaration( concDecl );
+				insert( inst, typeSubs, concDecl );
+			}
+			UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
+			newInst->set_baseUnion( concDecl );
+
+			deleteAll( typeSubs );
+			delete inst;
+			return newInst;
+		}
+
+	// 	/// Gets the base struct or union declaration for a member expression; NULL if not applicable
+	// 	AggregateDecl* getMemberBaseDecl( MemberExpr *memberExpr ) {
+	// 		// get variable for member aggregate
+	// 		VariableExpr *varExpr = dynamic_cast< VariableExpr* >( memberExpr->get_aggregate() );
+	// 		if ( ! varExpr ) return NULL;
+	//
+	// 		// get object for variable
+	// 		ObjectDecl *objectDecl = dynamic_cast< ObjectDecl* >( varExpr->get_var() );
+	// 		if ( ! objectDecl ) return NULL;
+	//
+	// 		// get base declaration from object type
+	// 		Type *objectType = objectDecl->get_type();
+	// 		StructInstType *structType = dynamic_cast< StructInstType* >( objectType );
+	// 		if ( structType ) return structType->get_baseStruct();
+	// 		UnionInstType *unionType = dynamic_cast< UnionInstType* >( objectType );
+	// 		if ( unionType ) return unionType->get_baseUnion();
+	//
+	// 		return NULL;
+	// 	}
+	//
+	// 	/// Finds the declaration with the given name, returning decls.end() if none such
+	// 	std::list< Declaration* >::const_iterator findDeclNamed( const std::list< Declaration* > &decls, const std::string &name ) {
+	// 		for( std::list< Declaration* >::const_iterator decl = decls.begin(); decl != decls.end(); ++decl ) {
+	// 			if ( (*decl)->get_name() == name ) return decl;
+	// 		}
+	// 		return decls.end();
+	// 	}
+	//
+	// 	Expression* Instantiate::mutate( MemberExpr *memberExpr ) {
+	// 		// mutate, exiting early if no longer MemberExpr
+	// 		Expression *expr = Mutator::mutate( memberExpr );
+	// 		memberExpr = dynamic_cast< MemberExpr* >( expr );
+	// 		if ( ! memberExpr ) return expr;
+	//
+	// 		// get declaration of member and base declaration of member, exiting early if not found
+	// 		AggregateDecl *memberBase = getMemberBaseDecl( memberExpr );
+	// 		if ( ! memberBase ) return memberExpr;
+	// 		DeclarationWithType *memberDecl = memberExpr->get_member();
+	// 		std::list< Declaration* >::const_iterator baseIt = findDeclNamed( memberBase->get_members(), memberDecl->get_name() );
+	// 		if ( baseIt == memberBase->get_members().end() ) return memberExpr;
+	// 		DeclarationWithType *baseDecl = dynamic_cast< DeclarationWithType* >( *baseIt );
+	// 		if ( ! baseDecl ) return memberExpr;
+	//
+	// 		// check if stated type of the member is not the type of the member's declaration; if so, need a cast
+	// 		// this *SHOULD* be safe, I don't think anything but the void-replacements I put in for dtypes would make it past the typechecker
+	// 		SymTab::Indexer dummy;
+	// 		if ( ResolvExpr::typesCompatible( memberDecl->get_type(), baseDecl->get_type(), dummy ) ) return memberExpr;
+	// 		else return new CastExpr( memberExpr, memberDecl->get_type() );
+	// 	}
+
+		void GenericInstantiator::doBeginScope() {
+			DeclMutator::doBeginScope();
+			instantiations.beginScope();
+		}
+
+		void GenericInstantiator::doEndScope() {
+			DeclMutator::doEndScope();
+			instantiations.endScope();
+		}
+
+////////////////////////////////////////// PolyGenericCalculator ////////////////////////////////////////////////////
+
+		void PolyGenericCalculator::beginTypeScope( Type *ty ) {
+			scopeTyVars.beginScope();
+			makeTyVarMap( ty, scopeTyVars );
+		}
+
+		void PolyGenericCalculator::endTypeScope() {
+			scopeTyVars.endScope();
+		}
 
 		template< typename DeclClass >
-		DeclClass * MemberExprFixer::handleDecl( DeclClass *decl, Type *type ) {
-			TyVarMap oldtyVars = scopeTyVars;
-			makeTyVarMap( type, scopeTyVars );
+		DeclClass * PolyGenericCalculator::handleDecl( DeclClass *decl, Type *type ) {
+			beginTypeScope( type );
+			knownLayouts.beginScope();
+			knownOffsets.beginScope();
 
 			DeclClass *ret = static_cast< DeclClass *>( Mutator::mutate( decl ) );
 
-			scopeTyVars = oldtyVars;
+			knownOffsets.endScope();
+			knownLayouts.endScope();
+			endTypeScope();
 			return ret;
 		}
 
-		ObjectDecl * MemberExprFixer::mutate( ObjectDecl *objectDecl ) {
+		ObjectDecl * PolyGenericCalculator::mutate( ObjectDecl *objectDecl ) {
 			return handleDecl( objectDecl, objectDecl->get_type() );
 		}
 
-		DeclarationWithType * MemberExprFixer::mutate( FunctionDecl *functionDecl ) {
+		DeclarationWithType * PolyGenericCalculator::mutate( FunctionDecl *functionDecl ) {
 			return handleDecl( functionDecl, functionDecl->get_functionType() );
 		}
 
-		TypedefDecl * MemberExprFixer::mutate( TypedefDecl *typedefDecl ) {
+		TypedefDecl * PolyGenericCalculator::mutate( TypedefDecl *typedefDecl ) {
 			return handleDecl( typedefDecl, typedefDecl->get_base() );
 		}
 
-		TypeDecl * MemberExprFixer::mutate( TypeDecl *typeDecl ) {
+		TypeDecl * PolyGenericCalculator::mutate( TypeDecl *typeDecl ) {
 			scopeTyVars[ typeDecl->get_name() ] = typeDecl->get_kind();
 			return Mutator::mutate( typeDecl );
 		}
 
-		Type * MemberExprFixer::mutate( PointerType *pointerType ) {
-			TyVarMap oldtyVars = scopeTyVars;
-			makeTyVarMap( pointerType, scopeTyVars );
+		Type * PolyGenericCalculator::mutate( PointerType *pointerType ) {
+			beginTypeScope( pointerType );
 
 			Type *ret = Mutator::mutate( pointerType );
 
-			scopeTyVars = oldtyVars;
+			endTypeScope();
 			return ret;
 		}
 
-		Type * MemberExprFixer::mutate( FunctionType *functionType ) {
-			TyVarMap oldtyVars = scopeTyVars;
-			makeTyVarMap( functionType, scopeTyVars );
-
-			Type *ret = Mutator::mutate( functionType );
-
-			scopeTyVars = oldtyVars;
+		Type * PolyGenericCalculator::mutate( FunctionType *funcType ) {
+			beginTypeScope( funcType );
+
+			// make sure that any type information passed into the function is accounted for
+			for ( std::list< DeclarationWithType* >::const_iterator fnParm = funcType->get_parameters().begin(); fnParm != funcType->get_parameters().end(); ++fnParm ) {
+				// condition here duplicates that in Pass2::mutate( FunctionType* )
+				Type *polyType = isPolyType( (*fnParm)->get_type(), scopeTyVars );
+				if ( polyType && ! dynamic_cast< TypeInstType* >( polyType ) ) {
+					knownLayouts.insert( mangleType( polyType ) );
+				}
+			}
+			
+			Type *ret = Mutator::mutate( funcType );
+
+			endTypeScope();
 			return ret;
 		}
 
-		Statement *MemberExprFixer::mutate( DeclStmt *declStmt ) {
+		Statement *PolyGenericCalculator::mutate( DeclStmt *declStmt ) {
 			if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) {
-				if ( isPolyType( objectDecl->get_type(), scopeTyVars ) ) {
+				if ( findGeneric( objectDecl->get_type() ) ) {
 					// change initialization of a polymorphic value object
 					// to allocate storage with alloca
 					Type *declType = objectDecl->get_type();
 					UntypedExpr *alloc = new UntypedExpr( new NameExpr( "__builtin_alloca" ) );
-					alloc->get_args().push_back( new NameExpr( sizeofName( declType ) ) );
+					alloc->get_args().push_back( new NameExpr( sizeofName( mangleType( declType ) ) ) );
 
 					delete objectDecl->get_init();
@@ -1398,5 +1932,5 @@
 			ConstantExpr *fieldIndex = new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), offset_namer.str() ) );
 			UntypedExpr *fieldOffset = new UntypedExpr( new NameExpr( "?[?]" ) );
-			fieldOffset->get_args().push_back( new NameExpr( offsetofName( objectType ) ) );
+			fieldOffset->get_args().push_back( new NameExpr( offsetofName( mangleType( objectType ) ) ) );
 			fieldOffset->get_args().push_back( fieldIndex );
 			return fieldOffset;
@@ -1413,5 +1947,5 @@
 		}
 		
-		Expression *MemberExprFixer::mutate( MemberExpr *memberExpr ) {
+		Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) {
 			// mutate, exiting early if no longer MemberExpr
 			Expression *expr = Mutator::mutate( memberExpr );
@@ -1430,4 +1964,5 @@
 			Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth );
 			if ( ! objectType ) return memberExpr;
+			findGeneric( objectType ); // ensure layout for this type is available
 
 			Expression *newMemberExpr = 0;
@@ -1461,5 +1996,144 @@
 		}
 
-		Expression *MemberExprFixer::mutate( OffsetofExpr *offsetofExpr ) {
+		ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) {
+			ObjectDecl *newObj = new ObjectDecl( name, DeclarationNode::NoStorageClass, LinkageSpec::C, 0, type, init );
+			stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) );
+			return newObj;
+		}
+
+		void PolyGenericCalculator::addOtypeParamsToLayoutCall( UntypedExpr *layoutCall, const std::list< Type* > &otypeParams ) {
+			for ( std::list< Type* >::const_iterator param = otypeParams.begin(); param != otypeParams.end(); ++param ) {
+				if ( findGeneric( *param ) ) {
+					// push size/align vars for a generic parameter back
+					std::string paramName = mangleType( *param );
+					layoutCall->get_args().push_back( new NameExpr( sizeofName( paramName ) ) );
+					layoutCall->get_args().push_back( new NameExpr( alignofName( paramName ) ) );
+				} else {
+					layoutCall->get_args().push_back( new SizeofExpr( (*param)->clone() ) );
+					layoutCall->get_args().push_back( new AlignofExpr( (*param)->clone() ) );
+				}
+			}
+		}
+
+		/// returns true if any of the otype parameters have a dynamic layout and puts all otype parameters in the output list
+		bool findGenericParams( std::list< TypeDecl* > &baseParams, std::list< Expression* > &typeParams, std::list< Type* > &out ) {
+			bool hasDynamicLayout = false;
+
+			std::list< TypeDecl* >::const_iterator baseParam = baseParams.begin();
+			std::list< Expression* >::const_iterator typeParam = typeParams.begin();
+			for ( ; baseParam != baseParams.end() && typeParam != typeParams.end(); ++baseParam, ++typeParam ) {
+				// skip non-otype parameters
+				if ( (*baseParam)->get_kind() != TypeDecl::Any ) continue;
+				TypeExpr *typeExpr = dynamic_cast< TypeExpr* >( *typeParam );
+				assert( typeExpr && "all otype parameters should be type expressions" );
+
+				Type *type = typeExpr->get_type();
+				out.push_back( type );
+				if ( isPolyType( type ) ) hasDynamicLayout = true;
+			}
+			assert( baseParam == baseParams.end() && typeParam == typeParams.end() );
+
+			return hasDynamicLayout;
+		}
+
+		bool PolyGenericCalculator::findGeneric( Type *ty ) {
+			if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) {
+				// duplicate logic from isPolyType()
+				if ( env ) {
+					if ( Type *newType = env->lookup( typeInst->get_name() ) ) {
+						return findGeneric( newType );
+					} // if
+				} // if
+				if ( scopeTyVars.find( typeInst->get_name() ) != scopeTyVars.end() ) {
+					// NOTE assumes here that getting put in the scopeTyVars included having the layout variables set
+					return true;
+				}
+				return false;
+			} else if ( StructInstType *structTy = dynamic_cast< StructInstType* >( ty ) ) {
+				// check if this type already has a layout generated for it
+				std::string typeName = mangleType( ty );
+				if ( knownLayouts.find( typeName ) != knownLayouts.end() ) return true;
+
+				// check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized
+				std::list< Type* > otypeParams;
+				if ( ! findGenericParams( *structTy->get_baseParameters(), structTy->get_parameters(), otypeParams ) ) return false;
+
+				// insert local variables for layout and generate call to layout function
+				knownLayouts.insert( typeName );  // done early so as not to interfere with the later addition of parameters to the layout call
+				Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+
+				int n_members = structTy->get_baseStruct()->get_members().size();
+				if ( n_members == 0 ) {
+					// all empty structs have the same layout - size 1, align 1
+					makeVar( sizeofName( typeName ), layoutType, new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) );
+					makeVar( alignofName( typeName ), layoutType->clone(), new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) );
+					// NOTE zero-length arrays are forbidden in C, so empty structs have no offsetof array
+				} else {
+					ObjectDecl *sizeVar = makeVar( sizeofName( typeName ), layoutType );
+					ObjectDecl *alignVar = makeVar( alignofName( typeName ), layoutType->clone() );
+					ObjectDecl *offsetVar = makeVar( offsetofName( typeName ), new ArrayType( Type::Qualifiers(), layoutType->clone(), new ConstantExpr( Constant::from( n_members ) ), false, false ) );
+
+					// generate call to layout function
+					UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( layoutofName( structTy->get_baseStruct() ) ) );
+					layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( sizeVar ) ) );
+					layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( alignVar ) ) );
+					layoutCall->get_args().push_back( new VariableExpr( offsetVar ) );
+					addOtypeParamsToLayoutCall( layoutCall, otypeParams );
+
+					stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) );
+				}
+
+				return true;
+			} else if ( UnionInstType *unionTy = dynamic_cast< UnionInstType* >( ty ) ) {
+				// check if this type already has a layout generated for it
+				std::string typeName = mangleType( ty );
+				if ( knownLayouts.find( typeName ) != knownLayouts.end() ) return true;
+
+				// check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized
+				std::list< Type* > otypeParams;
+				if ( ! findGenericParams( *unionTy->get_baseParameters(), unionTy->get_parameters(), otypeParams ) ) return false;
+
+				// insert local variables for layout and generate call to layout function
+				knownLayouts.insert( typeName );  // done early so as not to interfere with the later addition of parameters to the layout call
+				Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+
+				ObjectDecl *sizeVar = makeVar( sizeofName( typeName ), layoutType );
+				ObjectDecl *alignVar = makeVar( alignofName( typeName ), layoutType->clone() );
+
+				// generate call to layout function
+				UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( layoutofName( unionTy->get_baseUnion() ) ) );
+				layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( sizeVar ) ) );
+				layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( alignVar ) ) );
+				addOtypeParamsToLayoutCall( layoutCall, otypeParams );
+
+				stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) );
+
+				return true;
+			}
+
+			return false;
+		}
+
+		Expression *PolyGenericCalculator::mutate( SizeofExpr *sizeofExpr ) {
+			Type *ty = sizeofExpr->get_type();
+			if ( findGeneric( ty ) ) {
+				Expression *ret = new NameExpr( sizeofName( mangleType( ty ) ) );
+				delete sizeofExpr;
+				return ret;
+			}
+			return sizeofExpr;
+		}
+
+		Expression *PolyGenericCalculator::mutate( AlignofExpr *alignofExpr ) {
+			Type *ty = alignofExpr->get_type();
+			if ( findGeneric( ty ) ) {
+				Expression *ret = new NameExpr( alignofName( mangleType( ty ) ) );
+				delete alignofExpr;
+				return ret;
+			}
+			return alignofExpr;
+		}
+
+		Expression *PolyGenericCalculator::mutate( OffsetofExpr *offsetofExpr ) {
 			// mutate, exiting early if no longer OffsetofExpr
 			Expression *expr = Mutator::mutate( offsetofExpr );
@@ -1468,7 +2142,7 @@
 
 			// only mutate expressions for polymorphic structs/unions
-			Type *ty = isPolyType( offsetofExpr->get_type(), scopeTyVars );
-			if ( ! ty ) return offsetofExpr;
-
+			Type *ty = offsetofExpr->get_type();
+			if ( ! findGeneric( ty ) ) return offsetofExpr;
+			
 			if ( StructInstType *structType = dynamic_cast< StructInstType* >( ty ) ) {
 				// replace offsetof expression by index into offset array
@@ -1486,9 +2160,60 @@
 		}
 
+		Expression *PolyGenericCalculator::mutate( OffsetPackExpr *offsetPackExpr ) {
+			StructInstType *ty = offsetPackExpr->get_type();
+
+			Expression *ret = 0;
+			if ( findGeneric( ty ) ) {
+				// pull offset back from generated type information
+				ret = new NameExpr( offsetofName( mangleType( ty ) ) );
+			} else {
+				std::string offsetName = offsetofName( mangleType( ty ) );
+				if ( knownOffsets.find( offsetName ) != knownOffsets.end() ) {
+					// use the already-generated offsets for this type
+					ret = new NameExpr( offsetName );
+				} else {
+					knownOffsets.insert( offsetName );
+
+					std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members();
+					Type *offsetType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+
+					// build initializer list for offset array
+					std::list< Initializer* > inits;
+					for ( std::list< Declaration* >::const_iterator member = baseMembers.begin(); member != baseMembers.end(); ++member ) {
+						DeclarationWithType *memberDecl;
+						if ( DeclarationWithType *origMember = dynamic_cast< DeclarationWithType* >( *member ) ) {
+							memberDecl = origMember->clone();
+						} else {
+							memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 );
+						}
+						inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) );
+					}
+
+					// build the offset array and replace the pack with a reference to it
+					ObjectDecl *offsetArray = makeVar( offsetName, new ArrayType( Type::Qualifiers(), offsetType, new ConstantExpr( Constant::from( baseMembers.size() ) ), false, false ),
+							new ListInit( inits ) );
+					ret = new VariableExpr( offsetArray );
+				}
+			}
+
+			delete offsetPackExpr;
+			return ret;
+		}
+
+		void PolyGenericCalculator::doBeginScope() {
+			knownLayouts.beginScope();
+			knownOffsets.beginScope();
+		}
+
+		void PolyGenericCalculator::doEndScope() {
+			knownLayouts.endScope();
+			knownOffsets.endScope();
+		}
+
 ////////////////////////////////////////// Pass3 ////////////////////////////////////////////////////
 
 		template< typename DeclClass >
 		DeclClass * Pass3::handleDecl( DeclClass *decl, Type *type ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( type, scopeTyVars );
 
@@ -1496,5 +2221,5 @@
 			ScrubTyVars::scrub( decl, scopeTyVars );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return ret;
 		}
@@ -1526,20 +2251,20 @@
 
 		Type * Pass3::mutate( PointerType *pointerType ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( pointerType, scopeTyVars );
 
 			Type *ret = Mutator::mutate( pointerType );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return ret;
 		}
 
 		Type * Pass3::mutate( FunctionType *functionType ) {
-			TyVarMap oldtyVars = scopeTyVars;
+			scopeTyVars.beginScope();
 			makeTyVarMap( functionType, scopeTyVars );
 
 			Type *ret = Mutator::mutate( functionType );
 
-			scopeTyVars = oldtyVars;
+			scopeTyVars.endScope();
 			return ret;
 		}
Index: src/GenPoly/DeclMutator.cc
===================================================================
--- src/GenPoly/DeclMutator.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/DeclMutator.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -24,10 +24,15 @@
 	}
 
-	DeclMutator::DeclMutator() : Mutator(), declsToAdd(1) {}
+	DeclMutator::DeclMutator() : Mutator(), declsToAdd(1), declsToAddAfter(1) {}
 
 	DeclMutator::~DeclMutator() {}
 	
 	void DeclMutator::mutateDeclarationList( std::list< Declaration* > &decls ) {
-		for ( std::list< Declaration* >::iterator decl = decls.begin(); decl != decls.end(); ++decl ) {
+		for ( std::list< Declaration* >::iterator decl = decls.begin(); ; ++decl ) {
+			// splice in new declarations after previous decl
+			decls.splice( decl, declsToAddAfter.back() );
+
+			if ( decl == decls.end() ) break;
+			
 			// run mutator on declaration
 			*decl = maybeMutate( *decl, *this );
@@ -39,6 +44,7 @@
 
 	void DeclMutator::doBeginScope() {
-		// add new decl list for inside of scope
+		// add new decl lists for inside of scope
 		declsToAdd.resize( declsToAdd.size()+1 );
+		declsToAddAfter.resize( declsToAddAfter.size()+1 );
 	}
 
@@ -49,4 +55,9 @@
 		newBack->splice( newBack->end(), *back );
 		declsToAdd.pop_back();
+		
+		back = declsToAddAfter.rbegin();
+		newBack = back + 1;
+		newBack->splice( newBack->end(), *back );
+		declsToAddAfter.pop_back();
 	}
 
@@ -61,5 +72,8 @@
 		stmt = maybeMutate( stmt, *this );
 		// return if no declarations to add
-		if ( declsToAdd.back().empty() ) return stmt;
+		if ( declsToAdd.back().empty() && declsToAddAfter.back().empty() ) {
+			doEndScope();
+			return stmt;
+		}
 
 		// otherwise add declarations to new compound statement
@@ -71,8 +85,15 @@
 		declsToAdd.back().clear();
 
+		// add mutated statement
+		compound->get_kids().push_back( stmt );
+
+		// add declarations after to new compound statement
+		for ( std::list< Declaration* >::iterator decl = declsToAddAfter.back().begin(); decl != declsToAddAfter.back().end(); ++decl ) {
+			DeclStmt *declStmt = new DeclStmt( noLabels, *decl );
+			compound->get_kids().push_back( declStmt );
+		}
+		declsToAddAfter.back().clear();
+
 		doEndScope();
-
-		// add mutated statement and return
-		compound->get_kids().push_back( stmt );
 		return compound;
 	}
@@ -80,6 +101,16 @@
 	void DeclMutator::mutateStatementList( std::list< Statement* > &stmts ) {
 		doBeginScope();
+
 		
-		for ( std::list< Statement* >::iterator stmt = stmts.begin(); stmt != stmts.end(); ++stmt ) {
+		for ( std::list< Statement* >::iterator stmt = stmts.begin(); ; ++stmt ) {
+			// add any new declarations after the previous statement
+			for ( std::list< Declaration* >::iterator decl = declsToAddAfter.back().begin(); decl != declsToAddAfter.back().end(); ++decl ) {
+				DeclStmt *declStmt = new DeclStmt( noLabels, *decl );
+				stmts.insert( stmt, declStmt );
+			}
+			declsToAddAfter.back().clear();
+
+			if ( stmt == stmts.end() ) break;
+			
 			// run mutator on statement
 			*stmt = maybeMutate( *stmt, *this );
@@ -92,5 +123,5 @@
 			declsToAdd.back().clear();
 		}
-
+		
 		doEndScope();
 	}
@@ -98,4 +129,8 @@
 	void DeclMutator::addDeclaration( Declaration *decl ) {
 		declsToAdd.back().push_back( decl );
+	}
+
+	void DeclMutator::addDeclarationAfter( Declaration *decl ) {
+		declsToAddAfter.back().push_back( decl );
 	}
 
Index: src/GenPoly/DeclMutator.h
===================================================================
--- src/GenPoly/DeclMutator.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/DeclMutator.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -55,7 +55,11 @@
 		/// Add a declaration to the list to be added before the current position
 		void addDeclaration( Declaration* decl );
+		/// Add a declaration to the list to be added after the current position
+		void addDeclarationAfter( Declaration* decl );
 	private:
 		/// A stack of declarations to add before the current declaration or statement
 		std::vector< std::list< Declaration* > > declsToAdd;
+		/// A stack of declarations to add after the current declaration or statement
+		std::vector< std::list< Declaration* > > declsToAddAfter;
 	};
 } // namespace
Index: src/GenPoly/ErasableScopedMap.h
===================================================================
--- src/GenPoly/ErasableScopedMap.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/GenPoly/ErasableScopedMap.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,286 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ScopedMap.h --
+//
+// Author           : Aaron B. Moss
+// Created On       : Wed Dec 2 11:37:00 2015
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Wed Dec 2 11:37:00 2015
+// Update Count     : 1
+//
+
+#ifndef _ERASABLESCOPEDMAP_H
+#define _ERASABLESCOPEDMAP_H
+
+#include <cassert>
+#include <iterator>
+#include <map>
+#include <utility>
+#include <vector>
+
+namespace GenPoly {
+	/// A map where the items are placed into nested scopes;
+	/// inserted items are placed into the innermost scope, lookup looks from the innermost scope outward;
+	/// erasing a key means that find() will no longer report any instance of the key in a scope further
+	/// out, but the erasure itself is scoped. Key erasure works by inserting a sentinal value into the
+	/// value field, and thus only works for Value types where a meaningful sentinal can be chosen.
+	template<typename Key, typename Value>
+	class ErasableScopedMap {
+		typedef std::map< Key, Value > Scope;
+		typedef std::vector< Scope > ScopeList;
+
+		ScopeList scopes; ///< scoped list of maps
+		Value erased;     ///< sentinal value for erased keys
+	public:
+		typedef typename Scope::key_type key_type;
+		typedef typename Scope::mapped_type mapped_type;
+		typedef typename Scope::value_type value_type;
+		typedef typename ScopeList::size_type size_type;
+		typedef typename ScopeList::difference_type difference_type;
+		typedef typename Scope::reference reference;
+		typedef typename Scope::const_reference const_reference;
+		typedef typename Scope::pointer pointer;
+		typedef typename Scope::const_pointer const_pointer;
+
+		class iterator : public std::iterator< std::bidirectional_iterator_tag,
+		                                       value_type > {
+		friend class ErasableScopedMap;
+		friend class const_iterator;
+			typedef typename std::map< Key, Value >::iterator wrapped_iterator;
+			typedef typename std::vector< std::map< Key, Value > > scope_list;
+			typedef typename scope_list::size_type size_type;
+
+			/// Checks if this iterator points to a valid item
+			bool is_valid() const {
+				return it != map->scopes[i].end() && it->second != map->erased;
+			}
+
+			/// Increments on invalid
+			iterator& next_valid() {
+				if ( ! is_valid() ) { ++(*this); }
+				return *this;
+			}
+
+			/// Decrements on invalid
+			iterator& prev_valid() {
+				if ( ! is_valid() ) { --(*this); }
+				return *this;
+			}
+			
+			iterator(ErasableScopedMap< Key, Value > const &_map, const wrapped_iterator &_it, size_type _i)
+					: map(&_map), it(_it), i(_i) {}
+			
+		public:
+			iterator(const iterator &that) : map(that.map), it(that.it), i(that.i) {}
+			iterator& operator= (const iterator &that) {
+				map = that.map; i = that.i; it = that.it;
+				return *this;
+			}
+
+			reference operator* () { return *it; }
+			pointer operator-> () { return it.operator->(); }
+
+			iterator& operator++ () {
+				if ( it == map->scopes[i].end() ) {
+					if ( i == 0 ) return *this;
+					--i;
+					it = map->scopes[i].begin();
+				} else {
+					++it;
+				}
+				return next_valid();
+			}
+			iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
+
+			iterator& operator-- () {
+				// may fail if this is the begin iterator; allowed by STL spec
+				if ( it == map->scopes[i].begin() ) {
+					++i;
+					it = map->scopes[i].end();
+				}
+				--it;
+				return prev_valid();
+			}
+			iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
+
+			bool operator== (const iterator &that) {
+				return map == that.map && i == that.i && it == that.it;
+			}
+			bool operator!= (const iterator &that) { return !( *this == that ); }
+
+		private:
+			ErasableScopedMap< Key, Value > const *map;
+			wrapped_iterator it;
+			size_type i;
+		};
+
+		class const_iterator : public std::iterator< std::bidirectional_iterator_tag,
+		                                             value_type > {
+		friend class ErasableScopedMap;
+			typedef typename std::map< Key, Value >::iterator wrapped_iterator;
+			typedef typename std::map< Key, Value >::const_iterator wrapped_const_iterator;
+			typedef typename std::vector< std::map< Key, Value > > scope_list;
+			typedef typename scope_list::size_type size_type;
+
+			/// Checks if this iterator points to a valid item
+			bool is_valid() const {
+				return it != map->scopes[i].end() && it->second != map->erased;
+			}
+
+			/// Increments on invalid
+			const_iterator& next_valid() {
+				if ( ! is_valid() ) { ++(*this); }
+				return *this;
+			}
+
+			/// Decrements on invalid
+			const_iterator& prev_valid() {
+				if ( ! is_valid() ) { --(*this); }
+				return *this;
+			}
+			
+			const_iterator(ErasableScopedMap< Key, Value > const &_map, const wrapped_const_iterator &_it, size_type _i)
+					: map(&_map), it(_it), i(_i) {}
+		public:
+			const_iterator(const iterator &that) : map(that.map), it(that.it), i(that.i) {}
+			const_iterator(const const_iterator &that) : map(that.map), it(that.it), i(that.i) {}
+			const_iterator& operator= (const iterator &that) {
+				map = that.map; i = that.i; it = that.it;
+				return *this;
+			}
+			const_iterator& operator= (const const_iterator &that) {
+				map = that.map; i = that.i; it = that.it;
+				return *this;
+			}
+
+			const_reference operator* () { return *it; }
+			const_pointer operator-> () { return it.operator->(); }
+
+			const_iterator& operator++ () {
+				if ( it == map->scopes[i].end() ) {
+					if ( i == 0 ) return *this;
+					--i;
+					it = map->scopes[i].begin();
+				} else {
+					++it;
+				}
+				return next_valid();
+			}
+			const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
+
+			const_iterator& operator-- () {
+				// may fail if this is the begin iterator; allowed by STL spec
+				if ( it == map->scopes[i].begin() ) {
+					++i;
+					it = map->scopes[i].end();
+				}
+				--it;
+				return prev_valid();
+			}
+			const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
+
+			bool operator== (const const_iterator &that) {
+				return map == that.map && i == that.i && it == that.it;
+			}
+			bool operator!= (const const_iterator &that) { return !( *this == that ); }
+
+		private:
+			ErasableScopedMap< Key, Value > const *map;
+			wrapped_const_iterator it;
+			size_type i;
+		};
+
+		/// Starts a new scope
+		void beginScope() {
+			Scope scope;
+			scopes.push_back(scope);
+		}
+
+		/// Ends a scope; invalidates any iterators pointing to elements of that scope
+		void endScope() {
+			scopes.pop_back();
+			assert( ! scopes.empty() );
+		}
+
+		/// Default constructor initializes with one scope
+		ErasableScopedMap( const Value &erased_ ) : erased( erased_ ) { beginScope(); }
+
+		iterator begin() { return iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		const_iterator begin() const { return const_iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		const_iterator cbegin() const { return const_iterator(*this, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		iterator end() { return iterator(*this, scopes[0].end(), 0); }
+		const_iterator end() const { return const_iterator(*this, scopes[0].end(), 0); }
+		const_iterator cend() const { return const_iterator(*this, scopes[0].end(), 0); }
+
+		/// Gets the index of the current scope (counted from 1)
+		size_type currentScope() const { return scopes.size(); }
+
+		/// Finds the given key in the outermost scope it occurs; returns end() for none such
+		iterator find( const Key &key ) {
+			for ( size_type i = scopes.size() - 1; ; --i ) {
+				typename Scope::iterator val = scopes[i].find( key );
+				if ( val != scopes[i].end() ) {
+					return val->second == erased ? end() : iterator( *this, val, i );
+				}
+				if ( i == 0 ) break;
+			}
+			return end();
+		}
+		const_iterator find( const Key &key ) const {
+				return const_iterator( const_cast< ErasableScopedMap< Key, Value >* >(this)->find( key ) );
+		}
+
+		/// Finds the given key in the outermost scope inside the given scope where it occurs
+		iterator findNext( const_iterator &it, const Key &key ) {
+			if ( it.i == 0 ) return end();
+			for ( size_type i = it.i - 1; ; --i ) {
+				typename Scope::iterator val = scopes[i].find( key );
+				if ( val != scopes[i].end() ) {
+					return val->second == erased ? end() : iterator( *this, val, i );
+				}
+				if ( i == 0 ) break;
+			}
+			return end();
+		}
+		const_iterator findNext( const_iterator &it, const Key &key ) const {
+				return const_iterator( const_cast< ErasableScopedMap< Key, Value >* >(this)->findNext( it, key ) );
+		}
+
+		/// Inserts the given key-value pair into the outermost scope
+		std::pair< iterator, bool > insert( const value_type &value ) {
+			std::pair< typename Scope::iterator, bool > res = scopes.back().insert( value );
+			return std::make_pair( iterator(*this, res.first, scopes.size()-1), res.second );
+		}
+		std::pair< iterator, bool > insert( const Key &key, const Value &value ) { return insert( std::make_pair( key, value ) ); }
+
+		/// Marks the given element as erased from this scope inward; returns 1 for erased an element, 0 otherwise
+		size_type erase( const Key &key ) {
+			typename Scope::iterator val = scopes.back().find( key );
+			if ( val != scopes.back().end() ) {
+				val->second = erased;
+				return 1;
+			} else {
+				scopes.back().insert( val, std::make_pair( key, erased ) );
+				return 0;
+			}
+		}
+
+		Value& operator[] ( const Key &key ) {
+			iterator slot = find( key );
+			if ( slot != end() ) return slot->second;
+			return insert( key, Value() ).first->second;
+		}
+	};
+} // namespace GenPoly
+
+#endif // _ERASABLESCOPEDMAP_H
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/GenPoly/FindFunction.cc
===================================================================
--- src/GenPoly/FindFunction.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/FindFunction.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -55,5 +55,5 @@
 			TyVarMap::iterator var = tyVars.find( (*i)->get_name() );
 			if ( var != tyVars.end() ) {
-				tyVars.erase( var );
+				tyVars.erase( var->first );
 			} // if
 		} // for
@@ -61,5 +61,5 @@
 
 	Type * FindFunction::mutate( FunctionType *functionType ) {
-		TyVarMap oldTyVars = tyVars;
+		tyVars.beginScope();
 		handleForall( functionType->get_forall() );
 		mutateAll( functionType->get_returnVals(), *this );
@@ -72,13 +72,13 @@
 			} // if
 		} // if
-		tyVars = oldTyVars;
+		tyVars.endScope();
 		return ret;
 	}
 
 	Type * FindFunction::mutate( PointerType *pointerType ) {
-		TyVarMap oldTyVars = tyVars;
+		tyVars.beginScope();
 		handleForall( pointerType->get_forall() );
 		Type *ret = Mutator::mutate( pointerType );
-		tyVars = oldTyVars;
+		tyVars.endScope();
 		return ret;
 	}
Index: src/GenPoly/GenPoly.cc
===================================================================
--- src/GenPoly/GenPoly.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/GenPoly.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -16,5 +16,4 @@
 #include "GenPoly.h"
 
-#include "SymTab/Mangler.h"
 #include "SynTree/Expression.h"
 #include "SynTree/Type.h"
@@ -38,5 +37,5 @@
 	ReferenceToType *isPolyRet( FunctionType *function ) {
 		if ( ! function->get_returnVals().empty() ) {
-			TyVarMap forallTypes;
+			TyVarMap forallTypes( (TypeDecl::Kind)-1 );
 			makeTyVarMap( function, forallTypes );
 			return (ReferenceToType*)isPolyType( function->get_returnVals().front()->get_type(), forallTypes );
@@ -218,16 +217,4 @@
 	}
 
-	std::string sizeofName( Type *ty ) {
-		return std::string( "_sizeof_" ) + SymTab::Mangler::mangleType( ty );
-	}
-
-	std::string alignofName( Type *ty ) {
-		return std::string( "_alignof_" ) + SymTab::Mangler::mangleType( ty );
-	}
-
-	std::string offsetofName( Type* ty ) {
-		return std::string( "_offsetof_" ) + SymTab::Mangler::mangleType( ty );
-	}
-
 } // namespace GenPoly
 
Index: src/GenPoly/GenPoly.h
===================================================================
--- src/GenPoly/GenPoly.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/GenPoly.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -17,8 +17,11 @@
 #define GENPOLY_H
 
-#include <map>
 #include <string>
 #include <iostream>
 #include <utility>
+
+#include "ErasableScopedMap.h"
+
+#include "SymTab/Mangler.h"
 
 #include "SynTree/Declaration.h"
@@ -27,5 +30,5 @@
 
 namespace GenPoly {
-	typedef std::map< std::string, TypeDecl::Kind > TyVarMap;
+	typedef ErasableScopedMap< std::string, TypeDecl::Kind > TyVarMap;
 
 	/// A function needs an adapter if it returns a polymorphic value or if any of its
@@ -69,12 +72,19 @@
 	void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap );
 
-	/// Gets the name of the sizeof parameter for the type
-	std::string sizeofName( Type *ty );
+	/// Gets the mangled name of this type; alias for SymTab::Mangler::mangleType().
+	inline std::string mangleType( Type *ty ) { return SymTab::Mangler::mangleType( ty ); }
+	
+	/// Gets the name of the sizeof parameter for the type, given its mangled name
+	inline std::string sizeofName( const std::string &name ) { return std::string( "_sizeof_" ) + name; }
 
-	/// Gets the name of the alignof parameter for the type
-	std::string alignofName( Type *ty );
+	/// Gets the name of the alignof parameter for the type, given its mangled name
+	inline std::string alignofName( const std::string &name ) { return std::string( "_alignof_" ) + name; }
 
-	/// Gets the name of the offsetof parameter for the type
-	std::string offsetofName( Type *ty );
+	/// Gets the name of the offsetof parameter for the type, given its mangled name
+	inline std::string offsetofName( const std::string &name ) { return std::string( "_offsetof_" ) + name; }
+
+	/// Gets the name of the layout function for a given aggregate type, given its declaration
+	inline std::string layoutofName( AggregateDecl *decl ) { return std::string( "_layoutof_" ) + decl->get_name(); }
+	
 } // namespace GenPoly
 
Index: c/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,360 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// InstantiateGeneric.cc --
-//
-// Author           : Aaron B. Moss
-// Created On       : Wed Nov 11 14:55:01 2015
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed Nov 11 14:55:01 2015
-// Update Count     : 1
-//
-
-#include <list>
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "InstantiateGeneric.h"
-#include "DeclMutator.h"
-
-#include "ResolvExpr/typeops.h"
-#include "SymTab/Indexer.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Mutator.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Type.h"
-#include "SynTree/TypeSubstitution.h"
-
-#include "Common/UniqueName.h"
-#include "Common/utility.h"
-
-namespace GenPoly {
-
-	/// Key for a unique concrete type; generic base type paired with type parameter list
-	struct ConcreteType {
-		ConcreteType() : base(NULL), params() {}
-
-		ConcreteType(AggregateDecl *_base, const std::list< Type* >& _params) : base(_base), params() { cloneAll(_params, params); }
-
-		ConcreteType(const ConcreteType& that) : base(that.base), params() { cloneAll(that.params, params); }
-
-		/// Extracts types from a list of TypeExpr*
-		ConcreteType(AggregateDecl *_base, const std::list< TypeExpr* >& _params) : base(_base), params() {
-			for ( std::list< TypeExpr* >::const_iterator param = _params.begin(); param != _params.end(); ++param ) {
-				params.push_back( (*param)->get_type()->clone() );
-			}
-		}
-
-		ConcreteType& operator= (const ConcreteType& that) {
-			deleteAll( params );
-			params.clear();
-
-			base = that.base;
-			cloneAll( that.params, params );
-
-			return *this;
-		}
-
-		~ConcreteType() { deleteAll( params ); }
-
-		bool operator== (const ConcreteType& that) const {
-			if ( base != that.base ) return false;
-
-			SymTab::Indexer dummy;
-			if ( params.size() != that.params.size() ) return false;
-			for ( std::list< Type* >::const_iterator it = params.begin(), jt = that.params.begin(); it != params.end(); ++it, ++jt ) {
-				if ( ! ResolvExpr::typesCompatible( *it, *jt, dummy ) ) return false;
-			}
-			return true;
-		}
-
-		AggregateDecl *base;        ///< Base generic type
-		std::list< Type* > params;  ///< Instantiation parameters
-	};
-	
-	/// Maps a concrete type to the instantiated struct type, accounting for scope
-	class InstantiationMap {
-		/// Instantiation of a generic type, with key information to find it
-		struct Instantiation {
-			ConcreteType key;     ///< Instantiation parameters for this type
-			AggregateDecl *decl;  ///< Declaration of the instantiated generic type
-
-			Instantiation() : key(), decl(0) {}
-			Instantiation(const ConcreteType &_key, AggregateDecl *_decl) : key(_key), decl(_decl) {}
-		};
-		/// Map of generic types to instantiations of them
-		typedef std::map< AggregateDecl*, std::vector< Instantiation > > Scope;
-
-		std::vector< Scope > scopes;  ///< list of scopes, from outermost to innermost
-
-	public:
-		/// Starts a new scope
-		void beginScope() {
-			Scope scope;
-			scopes.push_back(scope);
-		}
-
-		/// Ends a scope
-		void endScope() {
-			scopes.pop_back();
-		}
-
-		/// Default constructor initializes with one scope
-		InstantiationMap() { beginScope(); }
-
-	private:
-		/// Gets the declaration for the concrete instantiation of this type, assuming it has already been instantiated in the current scope.
-		/// Returns NULL on none such.
-		AggregateDecl* lookup( AggregateDecl *generic, const std::list< TypeExpr* >& params ) {
-			ConcreteType key(generic, params);
-			// scan scopes from innermost out
-			for ( std::vector< Scope >::const_reverse_iterator scope = scopes.rbegin(); scope != scopes.rend(); ++scope ) {
-				// skip scope if no instantiations of this generic type
-				Scope::const_iterator insts = scope->find( generic );
-				if ( insts == scope->end() ) continue;
-				// look through instantiations for matches to concrete type
-				for ( std::vector< Instantiation >::const_iterator inst = insts->second.begin(); inst != insts->second.end(); ++inst ) {
-					if ( inst->key == key ) return inst->decl;
-				}
-			}
-			// no matching instantiation found
-			return NULL;
-		}
-	public:
-		StructDecl* lookup( StructInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (StructDecl*)lookup( inst->get_baseStruct(), typeSubs ); }
-		UnionDecl* lookup( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (UnionDecl*)lookup( inst->get_baseUnion(), typeSubs ); }
-
-	private:
-		/// Adds a declaration for a concrete type to the current scope
-		void insert( AggregateDecl *generic, const std::list< TypeExpr* > &params, AggregateDecl *decl ) {
-			ConcreteType key(generic, params);
-			scopes.back()[generic].push_back( Instantiation( key, decl ) );
-		}
-	public:
-		void insert( StructInstType *inst, const std::list< TypeExpr* > &typeSubs, StructDecl *decl ) { insert( inst->get_baseStruct(), typeSubs, decl ); }
-		void insert( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs, UnionDecl *decl ) { insert( inst->get_baseUnion(), typeSubs, decl ); }
-	};
-
-	/// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
-	class Instantiate : public DeclMutator {
-		/// Map of (generic type, parameter list) pairs to concrete type instantiations
-		InstantiationMap instantiations;
-		/// Namer for concrete types
-		UniqueName typeNamer;
-
-	public:
-		Instantiate() : DeclMutator(), instantiations(), typeNamer("_conc_") {}
-
-		virtual Type* mutate( StructInstType *inst );
-		virtual Type* mutate( UnionInstType *inst );
-
-// 		virtual Expression* mutate( MemberExpr *memberExpr );
-		
-		virtual void doBeginScope();
-		virtual void doEndScope();
-	};
-	
-	void instantiateGeneric( std::list< Declaration* >& translationUnit ) {
-		Instantiate instantiator;
-		instantiator.mutateDeclarationList( translationUnit );
-	}
-
-	/// Makes substitutions of params into baseParams; returns true if all parameters substituted for a concrete type
-	bool makeSubstitutions( const std::list< TypeDecl* >& baseParams, const std::list< Expression* >& params, std::list< TypeExpr* >& out ) {
- 		bool allConcrete = true;  // will finish the substitution list even if they're not all concrete
-
-		// substitute concrete types for given parameters, and incomplete types for placeholders
-		std::list< TypeDecl* >::const_iterator baseParam = baseParams.begin();
-		std::list< Expression* >::const_iterator param = params.begin();
-		for ( ; baseParam != baseParams.end() && param != params.end(); ++baseParam, ++param ) {
-// 			switch ( (*baseParam)->get_kind() ) {
-// 			case TypeDecl::Any: {   // any type is a valid substitution here; complete types can be used to instantiate generics
-				TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
-				assert(paramType && "Aggregate parameters should be type expressions");
-				out.push_back( paramType->clone() );
-				// check that the substituted type isn't a type variable itself
-				if ( dynamic_cast< TypeInstType* >( paramType->get_type() ) ) {
- 					allConcrete = false;
-				}
-// 				break;
-// 			}
-// 			case TypeDecl::Dtype:  // dtype can be consistently replaced with void [only pointers, which become void*]
-// 				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
-// 				break;
-// 			case TypeDecl::Ftype:  // pointer-to-ftype can be consistently replaced with void (*)(void) [similar to dtype]
-// 				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
-// 				break;
-// 			}
-		}
-
-		// if any parameters left over, not done
-		if ( baseParam != baseParams.end() ) return false;
-// 		// if not enough parameters given, substitute remaining incomplete types for placeholders
-// 		for ( ; baseParam != baseParams.end(); ++baseParam ) {
-// 			switch ( (*baseParam)->get_kind() ) {
-// 			case TypeDecl::Any:    // no more substitutions here, fail early
-// 				return false;
-// 			case TypeDecl::Dtype:  // dtype can be consistently replaced with void [only pointers, which become void*]
-// 				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
-// 				break;
-// 			case TypeDecl::Ftype:  // pointer-to-ftype can be consistently replaced with void (*)(void) [similar to dtype]
-// 				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
-// 				break;
-// 			}
-// 		}
-
- 		return allConcrete;
-	}
-
-	/// Substitutes types of members of in according to baseParams => typeSubs, appending the result to out
-	void substituteMembers( const std::list< Declaration* >& in, const std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs, 
-						    std::list< Declaration* >& out ) {
-		// substitute types into new members
-		TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() );
-		for ( std::list< Declaration* >::const_iterator member = in.begin(); member != in.end(); ++member ) {
-			Declaration *newMember = (*member)->clone();
-			subs.apply(newMember);
-			out.push_back( newMember );
-		}
-	}
-
-	Type* Instantiate::mutate( StructInstType *inst ) {
-		// mutate subtypes
-		Type *mutated = Mutator::mutate( inst );
-		inst = dynamic_cast< StructInstType* >( mutated );
-		if ( ! inst ) return mutated;
-
-		// exit early if no need for further mutation
-		if ( inst->get_parameters().empty() ) return inst;
-		assert( inst->get_baseParameters() && "Base struct has parameters" );
-
-		// check if type can be concretely instantiated; put substitutions into typeSubs
-		std::list< TypeExpr* > typeSubs;
-		if ( ! makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs ) ) {
-			deleteAll( typeSubs );
-			return inst;
-		}
-		
-		// make concrete instantiation of generic type
-		StructDecl *concDecl = instantiations.lookup( inst, typeSubs );
-		if ( ! concDecl ) {
-			// set concDecl to new type, insert type declaration into statements to add
-			concDecl = new StructDecl( typeNamer.newName( inst->get_name() ) );
-			substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, 	concDecl->get_members() );
-			DeclMutator::addDeclaration( concDecl );
-			instantiations.insert( inst, typeSubs, concDecl );
-		}
-		StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
-		newInst->set_baseStruct( concDecl );
-
-		deleteAll( typeSubs );
-		delete inst;
-		return newInst;
-	}
-	
-	Type* Instantiate::mutate( UnionInstType *inst ) {
-		// mutate subtypes
-		Type *mutated = Mutator::mutate( inst );
-		inst = dynamic_cast< UnionInstType* >( mutated );
-		if ( ! inst ) return mutated;
-
-		// exit early if no need for further mutation
-		if ( inst->get_parameters().empty() ) return inst;
-		assert( inst->get_baseParameters() && "Base union has parameters" );
-
-		// check if type can be concretely instantiated; put substitutions into typeSubs
-		std::list< TypeExpr* > typeSubs;
-		if ( ! makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs ) ) {
-			deleteAll( typeSubs );
-			return inst;
-		}
-		
-		// make concrete instantiation of generic type
-		UnionDecl *concDecl = instantiations.lookup( inst, typeSubs );
-		if ( ! concDecl ) {
-			// set concDecl to new type, insert type declaration into statements to add
-			concDecl = new UnionDecl( typeNamer.newName( inst->get_name() ) );
-			substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-			DeclMutator::addDeclaration( concDecl );
-			instantiations.insert( inst, typeSubs, concDecl );
-		}
-		UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
-		newInst->set_baseUnion( concDecl );
-
-		deleteAll( typeSubs );
-		delete inst;
-		return newInst;
-	}
-
-// 	/// Gets the base struct or union declaration for a member expression; NULL if not applicable
-// 	AggregateDecl* getMemberBaseDecl( MemberExpr *memberExpr ) {
-// 		// get variable for member aggregate
-// 		VariableExpr *varExpr = dynamic_cast< VariableExpr* >( memberExpr->get_aggregate() );
-// 		if ( ! varExpr ) return NULL;
-// 
-// 		// get object for variable
-// 		ObjectDecl *objectDecl = dynamic_cast< ObjectDecl* >( varExpr->get_var() );
-// 		if ( ! objectDecl ) return NULL;
-// 
-// 		// get base declaration from object type
-// 		Type *objectType = objectDecl->get_type();
-// 		StructInstType *structType = dynamic_cast< StructInstType* >( objectType );
-// 		if ( structType ) return structType->get_baseStruct();
-// 		UnionInstType *unionType = dynamic_cast< UnionInstType* >( objectType );
-// 		if ( unionType ) return unionType->get_baseUnion();
-// 
-// 		return NULL;
-// 	}
-// 
-// 	/// Finds the declaration with the given name, returning decls.end() if none such
-// 	std::list< Declaration* >::const_iterator findDeclNamed( const std::list< Declaration* > &decls, const std::string &name ) {
-// 		for( std::list< Declaration* >::const_iterator decl = decls.begin(); decl != decls.end(); ++decl ) {
-// 			if ( (*decl)->get_name() == name ) return decl;
-// 		}
-// 		return decls.end();
-// 	}
-// 	
-// 	Expression* Instantiate::mutate( MemberExpr *memberExpr ) {
-// 		// mutate, exiting early if no longer MemberExpr
-// 		Expression *expr = Mutator::mutate( memberExpr );
-// 		memberExpr = dynamic_cast< MemberExpr* >( expr );
-// 		if ( ! memberExpr ) return expr;
-// 
-// 		// get declaration of member and base declaration of member, exiting early if not found
-// 		AggregateDecl *memberBase = getMemberBaseDecl( memberExpr );
-// 		if ( ! memberBase ) return memberExpr;
-// 		DeclarationWithType *memberDecl = memberExpr->get_member();
-// 		std::list< Declaration* >::const_iterator baseIt = findDeclNamed( memberBase->get_members(), memberDecl->get_name() );
-// 		if ( baseIt == memberBase->get_members().end() ) return memberExpr;
-// 		DeclarationWithType *baseDecl = dynamic_cast< DeclarationWithType* >( *baseIt );
-// 		if ( ! baseDecl ) return memberExpr;
-// 
-// 		// check if stated type of the member is not the type of the member's declaration; if so, need a cast
-// 		// this *SHOULD* be safe, I don't think anything but the void-replacements I put in for dtypes would make it past the typechecker
-// 		SymTab::Indexer dummy;
-// 		if ( ResolvExpr::typesCompatible( memberDecl->get_type(), baseDecl->get_type(), dummy ) ) return memberExpr;
-// 		else return new CastExpr( memberExpr, memberDecl->get_type() );
-// 	}
-	
-	void Instantiate::doBeginScope() {
-		DeclMutator::doBeginScope();
-		instantiations.beginScope();
-	}
-
-	void Instantiate::doEndScope() {
-		DeclMutator::doEndScope();
-		instantiations.endScope();
-	}
-	
-}  // namespace GenPoly
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/GenPoly/InstantiateGeneric.h
===================================================================
--- src/GenPoly/InstantiateGeneric.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// InstantiateGeneric.h --
-//
-// Author           : Aaron B. Moss
-// Created On       : Wed Nov 11 14:55:01 2015
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Wed Nov 11 14:55:01 2015
-// Update Count     : 1
-//
-
-#ifndef _INSTANTIATEGENERIC_H
-#define _INSTANTIATEGENERIC_H
-
-#include <list>
-#include "SynTree/SynTree.h"
-
-namespace GenPoly {
-	/// Replaces generic structs used outside polymorphic contexts with their concrete instantiations
-	void instantiateGeneric( std::list< Declaration* >& translationUnit );
-} // namespace GenPoly
-
-#endif // _INSTANTIATEGENERIC_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/Lvalue.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -17,4 +17,6 @@
 
 #include "Lvalue.h"
+
+#include "GenPoly.h"
 
 #include "SynTree/Declaration.h"
@@ -63,10 +65,8 @@
 
 	namespace {
-		bool isLvalueRet( FunctionType *function ) {
-			if ( ! function->get_returnVals().empty() ) {
-				return function->get_returnVals().front()->get_type()->get_isLvalue();
-			} else {
-				return false;
-			} // if
+		Type* isLvalueRet( FunctionType *function ) {
+			if ( function->get_returnVals().empty() ) return 0;
+			Type *ty = function->get_returnVals().front()->get_type();
+			return ty->get_isLvalue() ? ty : 0;
 		}
 
@@ -107,10 +107,16 @@
 			assert( function );
 
-			std::string typeName;
-			if ( isLvalueRet( function ) && ! isIntrinsicApp( appExpr ) ) {
+			Type *funType = isLvalueRet( function );
+			if ( funType && ! isIntrinsicApp( appExpr ) ) {
+				Expression *expr = appExpr;
+				Type *appType = appExpr->get_results().front();
+				if ( isPolyType( funType ) && ! isPolyType( appType ) ) {
+					// make sure cast for polymorphic type is inside dereference
+					expr = new CastExpr( appExpr, new PointerType( Type::Qualifiers(), appType->clone() ) );
+				}
 				UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
-				deref->get_results().push_back( appExpr->get_results().front() );
-				appExpr->get_results().front() = new PointerType( Type::Qualifiers(), deref->get_results().front()->clone() );
-				deref->get_args().push_back( appExpr );
+				deref->get_results().push_back( appType->clone() );
+				appExpr->get_results().front() = new PointerType( Type::Qualifiers(), appType );
+				deref->get_args().push_back( expr );
 				return deref;
 			} else {
Index: src/GenPoly/PolyMutator.cc
===================================================================
--- src/GenPoly/PolyMutator.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/PolyMutator.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -27,6 +27,5 @@
 	}
 
-	PolyMutator::PolyMutator() : env( 0 ) {
-	}
+	PolyMutator::PolyMutator() : scopeTyVars( (TypeDecl::Kind)-1 ), env( 0 ) {}
 
 	void PolyMutator::mutateStatementList( std::list< Statement* > &statements ) {
Index: src/GenPoly/ScopedMap.h
===================================================================
--- src/GenPoly/ScopedMap.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/ScopedMap.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -17,4 +17,5 @@
 #define _SCOPEDMAP_H
 
+#include <cassert>
 #include <iterator>
 #include <map>
@@ -50,4 +51,21 @@
 			typedef typename scope_list::size_type size_type;
 
+			/// Checks if this iterator points to a valid item
+			bool is_valid() const {
+				return it != (*scopes)[i].end();
+			}
+
+			/// Increments on invalid
+			iterator& next_valid() {
+				if ( ! is_valid() ) { ++(*this); }
+				return *this;
+			}
+
+			/// Decrements on invalid
+			iterator& prev_valid() {
+				if ( ! is_valid() ) { --(*this); }
+				return *this;
+			}
+
 			iterator(scope_list const &_scopes, const wrapped_iterator &_it, size_type _i)
 				: scopes(&_scopes), it(_it), i(_i) {}
@@ -67,8 +85,8 @@
 					--i;
 					it = (*scopes)[i].begin();
-					return *this;
-				}
-				++it;
-				return *this;
+				} else {
+					++it;
+				}
+				return next_valid();
 			}
 			iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
@@ -81,5 +99,5 @@
 				}
 				--it;
-				return *this;
+				return prev_valid();
 			}
 			iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
@@ -104,4 +122,21 @@
 			typedef typename scope_list::size_type size_type;
 
+			/// Checks if this iterator points to a valid item
+			bool is_valid() const {
+				return it != (*scopes)[i].end();
+			}
+
+			/// Increments on invalid
+			const_iterator& next_valid() {
+				if ( ! is_valid() ) { ++(*this); }
+				return *this;
+			}
+
+			/// Decrements on invalid
+			const_iterator& prev_valid() {
+				if ( ! is_valid() ) { --(*this); }
+				return *this;
+			}
+
 			const_iterator(scope_list const &_scopes, const wrapped_const_iterator &_it, size_type _i)
 				: scopes(&_scopes), it(_it), i(_i) {}
@@ -126,8 +161,8 @@
 					--i;
 					it = (*scopes)[i].begin();
-					return *this;
-				}
-				++it;
-				return *this;
+				} else {
+					++it;
+				}
+				return next_valid();
 			}
 			const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
@@ -140,5 +175,5 @@
 				}
 				--it;
-				return *this;
+				return prev_valid();
 			}
 			const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
@@ -164,4 +199,5 @@
 		void endScope() {
 			scopes.pop_back();
+			assert( ! scopes.empty() );
 		}
 
@@ -169,7 +205,7 @@
 		ScopedMap() { beginScope(); }
 
-		iterator begin() { return iterator(scopes, scopes.back().begin(), scopes.size()-1); }
-		const_iterator begin() const { return const_iterator(scopes, scopes.back().begin(), scopes.size()-1); }
-		const_iterator cbegin() const { return const_iterator(scopes, scopes.back().begin(), scopes.size()-1); }
+		iterator begin() { return iterator(scopes, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		const_iterator begin() const { return const_iterator(scopes, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		const_iterator cbegin() const { return const_iterator(scopes, scopes.back().begin(), scopes.size()-1).next_valid(); }
 		iterator end() { return iterator(scopes, scopes[0].end(), 0); }
 		const_iterator end() const { return const_iterator(scopes, scopes[0].end(), 0); }
@@ -188,5 +224,7 @@
 			return end();
 		}
-		const_iterator find( const Key &key ) const { return const_iterator( find( key ) ); }
+		const_iterator find( const Key &key ) const {
+				return const_iterator( const_cast< ScopedMap< Key, Value >* >(this)->find( key ) );
+		}
 		
 		/// Finds the given key in the outermost scope inside the given scope where it occurs
@@ -200,5 +238,7 @@
 			return end();
 		}
-		const_iterator findNext( const_iterator &it, const Key &key ) const { return const_iterator( findNext( it, key ) ); }
+		const_iterator findNext( const_iterator &it, const Key &key ) const {
+				return const_iterator( const_cast< ScopedMap< Key, Value >* >(this)->findNext( it, key ) );
+		}
 
 		/// Inserts the given key-value pair into the outermost scope
@@ -208,5 +248,10 @@
 		}
 		std::pair< iterator, bool > insert( const Key &key, const Value &value ) { return insert( std::make_pair( key, value ) ); }
-		
+
+		Value& operator[] ( const Key &key ) {
+			iterator slot = find( key );
+			if ( slot != end() ) return slot->second;
+			return insert( key, Value() ).first->second;
+		}
 	};
 } // namespace GenPoly
Index: src/GenPoly/ScopedSet.h
===================================================================
--- src/GenPoly/ScopedSet.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/GenPoly/ScopedSet.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,255 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// ScopedSet.h --
+//
+// Author           : Aaron B. Moss
+// Created On       : Thu Dec 3 11:51:00 2015
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Thu Dec 3 11:51:00 2015
+// Update Count     : 1
+//
+
+#ifndef _SCOPEDSET_H
+#define _SCOPEDSET_H
+
+#include <iterator>
+#include <set>
+#include <vector>
+
+namespace GenPoly {
+	/// A set where the items are placed into nested scopes;
+	/// inserted items are placed into the innermost scope, lookup looks from the innermost scope outward
+	template<typename Value>
+	class ScopedSet {
+		typedef std::set< Value > Scope;
+		typedef std::vector< Scope > ScopeList;
+
+		ScopeList scopes; ///< scoped list of sets
+	public:
+		typedef typename Scope::key_type key_type;
+		typedef typename Scope::value_type value_type;
+		typedef typename ScopeList::size_type size_type;
+		typedef typename ScopeList::difference_type difference_type;
+		typedef typename Scope::reference reference;
+		typedef typename Scope::const_reference const_reference;
+		typedef typename Scope::pointer pointer;
+		typedef typename Scope::const_pointer const_pointer;
+		
+		class iterator : public std::iterator< std::bidirectional_iterator_tag,
+		                                       value_type > {
+		friend class ScopedSet;
+		friend class const_iterator;
+			typedef typename std::set< Value >::iterator wrapped_iterator;
+			typedef typename std::vector< std::set< Value > > scope_list;
+			typedef typename scope_list::size_type size_type;
+
+			/// Checks if this iterator points to a valid item
+			bool is_valid() const {
+				return it != (*scopes)[i].end();
+			}
+
+			/// Increments on invalid
+			iterator& next_valid() {
+				if ( ! is_valid() ) { ++(*this); }
+				return *this;
+			}
+
+			/// Decrements on invalid
+			iterator& prev_valid() {
+				if ( ! is_valid() ) { --(*this); }
+				return *this;
+			}
+
+			iterator(scope_list const &_scopes, const wrapped_iterator &_it, size_type _i)
+				: scopes(&_scopes), it(_it), i(_i) {}
+		public:
+			iterator(const iterator &that) : scopes(that.scopes), it(that.it), i(that.i) {}
+			iterator& operator= (const iterator &that) {
+				scopes = that.scopes; i = that.i; it = that.it;
+				return *this;
+			}
+			
+			reference operator* () { return *it; }
+			pointer operator-> () { return it.operator->(); }
+
+			iterator& operator++ () {
+				if ( it == (*scopes)[i].end() ) {
+					if ( i == 0 ) return *this;
+					--i;
+					it = (*scopes)[i].begin();
+				} else {
+					++it;
+				}
+				return next_valid();
+			}
+			iterator& operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
+
+			iterator& operator-- () {
+				// may fail if this is the begin iterator; allowed by STL spec
+				if ( it == (*scopes)[i].begin() ) {
+					++i;
+					it = (*scopes)[i].end();
+				}
+				--it;
+				return prev_valid();
+			}
+			iterator& operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
+
+			bool operator== (const iterator &that) {
+				return scopes == that.scopes && i == that.i && it == that.it;
+			}
+			bool operator!= (const iterator &that) { return !( *this == that ); }
+
+		private:
+			scope_list const *scopes;
+			wrapped_iterator it;
+			size_type i;
+		};
+
+		class const_iterator : public std::iterator< std::bidirectional_iterator_tag,
+		                                             value_type > {
+		friend class ScopedSet;
+			typedef typename std::set< Value >::iterator wrapped_iterator;
+			typedef typename std::set< Value >::const_iterator wrapped_const_iterator;
+			typedef typename std::vector< std::set< Value > > scope_list;
+			typedef typename scope_list::size_type size_type;
+
+			/// Checks if this iterator points to a valid item
+			bool is_valid() const {
+				return it != (*scopes)[i].end();
+			}
+
+			/// Increments on invalid
+			const_iterator& next_valid() {
+				if ( ! is_valid() ) { ++(*this); }
+				return *this;
+			}
+
+			/// Decrements on invalid
+			const_iterator& prev_valid() {
+				if ( ! is_valid() ) { --(*this); }
+				return *this;
+			}
+
+			const_iterator(scope_list const &_scopes, const wrapped_const_iterator &_it, size_type _i)
+				: scopes(&_scopes), it(_it), i(_i) {}
+		public:
+			const_iterator(const iterator &that) : scopes(that.scopes), it(that.it), i(that.i) {}
+			const_iterator(const const_iterator &that) : scopes(that.scopes), it(that.it), i(that.i) {}
+			const_iterator& operator= (const iterator &that) {
+				scopes = that.scopes; i = that.i; it = that.it;
+				return *this;
+			}
+			const_iterator& operator= (const const_iterator &that) {
+				scopes = that.scopes; i = that.i; it = that.it;
+				return *this;
+			}
+
+			const_reference operator* () { return *it; }
+			const_pointer operator-> () { return it.operator->(); }
+
+			const_iterator& operator++ () {
+				if ( it == (*scopes)[i].end() ) {
+					if ( i == 0 ) return *this;
+					--i;
+					it = (*scopes)[i].begin();
+				} else {
+					++it;
+				}
+				return next_valid();
+			}
+			const_iterator& operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
+
+			const_iterator& operator-- () {
+				// may fail if this is the begin iterator; allowed by STL spec
+				if ( it == (*scopes)[i].begin() ) {
+					++i;
+					it = (*scopes)[i].end();
+				}
+				--it;
+				return prev_valid();
+			}
+			const_iterator& operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
+
+			bool operator== (const const_iterator &that) {
+				return scopes == that.scopes && i == that.i && it == that.it;
+			}
+			bool operator!= (const const_iterator &that) { return !( *this == that ); }
+
+		private:
+			scope_list const *scopes;
+			wrapped_const_iterator it;
+			size_type i;
+		};
+		
+		/// Starts a new scope
+		void beginScope() {
+			Scope scope;
+			scopes.push_back(scope);
+		}
+
+		/// Ends a scope; invalidates any iterators pointing to elements of that scope
+		void endScope() {
+			scopes.pop_back();
+		}
+
+		/// Default constructor initializes with one scope
+		ScopedSet() { beginScope(); }
+
+		iterator begin() { return iterator(scopes, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		const_iterator begin() const { return const_iterator(scopes, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		const_iterator cbegin() const { return const_iterator(scopes, scopes.back().begin(), scopes.size()-1).next_valid(); }
+		iterator end() { return iterator(scopes, scopes[0].end(), 0); }
+		const_iterator end() const { return const_iterator(scopes, scopes[0].end(), 0); }
+		const_iterator cend() const { return const_iterator(scopes, scopes[0].end(), 0); }
+
+		/// Gets the index of the current scope (counted from 1)
+		size_type currentScope() const { return scopes.size(); }
+
+		/// Finds the given key in the outermost scope it occurs; returns end() for none such
+		iterator find( const Value &key ) {
+			for ( size_type i = scopes.size() - 1; ; --i ) {
+				typename Scope::iterator val = scopes[i].find( key );
+				if ( val != scopes[i].end() ) return iterator( scopes, val, i );
+				if ( i == 0 ) break;
+			}
+			return end();
+		}
+		const_iterator find( const Value &key ) const {
+			return const_iterator( const_cast< ScopedSet< Value >* >(this)->find( key ) );
+		}
+		
+		/// Finds the given key in the outermost scope inside the given scope where it occurs
+		iterator findNext( const_iterator &it, const Value &key ) {
+			if ( it.i == 0 ) return end();
+			for ( size_type i = it.i - 1; ; --i ) {
+				typename Scope::iterator val = scopes[i].find( key );
+				if ( val != scopes[i].end() ) return iterator( scopes, val, i );
+				if ( i == 0 ) break;
+			}
+			return end();
+		}
+		const_iterator findNext( const_iterator &it, const Value &key ) const {
+			return const_iterator( const_cast< ScopedSet< Value >* >(this)->findNext( it, key ) );
+		}
+
+		/// Inserts the given value into the outermost scope
+		std::pair< iterator, bool > insert( const value_type &value ) {
+			std::pair< typename Scope::iterator, bool > res = scopes.back().insert( value );
+			return std::make_pair( iterator(scopes, res.first, scopes.size()-1), res.second );
+		}
+		
+	};
+} // namespace GenPoly
+
+#endif // _SCOPEDSET_H
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/ScrubTyVars.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -64,5 +64,5 @@
 		// sizeof( T ) => _sizeof_T parameter, which is the size of T
 		if ( Type *polyType = isPolyType( szeof->get_type() ) ) {
-			Expression *expr = new NameExpr( sizeofName( polyType ) );
+			Expression *expr = new NameExpr( sizeofName( mangleType( polyType ) ) );
 			return expr;
 		} else {
@@ -74,5 +74,5 @@
 		// alignof( T ) => _alignof_T parameter, which is the alignment of T
 		if ( Type *polyType = isPolyType( algnof->get_type() ) ) {
-			Expression *expr = new NameExpr( alignofName( polyType ) );
+			Expression *expr = new NameExpr( alignofName( mangleType( polyType ) ) );
 			return expr;
 		} else {
Index: src/GenPoly/module.mk
===================================================================
--- src/GenPoly/module.mk	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/GenPoly/module.mk	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -23,4 +23,3 @@
        GenPoly/CopyParams.cc \
        GenPoly/FindFunction.cc \
-       GenPoly/InstantiateGeneric.cc \
        GenPoly/DeclMutator.cc
Index: src/InitTweak/InitModel.h
===================================================================
--- src/InitTweak/InitModel.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/InitTweak/InitModel.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -75,4 +75,5 @@
 			void visit( UntypedOffsetofExpr * ) { throw 0; }
 			void visit( OffsetofExpr * ) { throw 0; }
+			void visit( OffsetPackExpr * ) { throw 0; }
 			void visit( AttrExpr * ) { throw 0; }
 			void visit( LogicalExpr * ) { throw 0; }
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Makefile.am	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:51:46 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Thu Jan 28 16:50:26 2016
-## Update Count     : 55
+## Last Modified On : Fri Feb 26 17:19:16 2016
+## Update Count     : 57
 ###############################################################################
 
@@ -46,5 +46,5 @@
 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL
 
-CXXFLAGS = -g	# remove default -O2 to allow better debugging
+CXXFLAGS = -g -std=c++11		# remove default -O2 to allow better debugging
 
 MAINTAINERCLEANFILES += ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Makefile.in	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -122,5 +122,4 @@
 	GenPoly/driver_cfa_cpp-CopyParams.$(OBJEXT) \
 	GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT) \
-	GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT) \
 	GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT) \
 	InitTweak/driver_cfa_cpp-RemoveInit.$(OBJEXT) \
@@ -154,5 +153,4 @@
 	ResolvExpr/driver_cfa_cpp-Occurs.$(OBJEXT) \
 	ResolvExpr/driver_cfa_cpp-TypeEnvironment.$(OBJEXT) \
-	SymTab/driver_cfa_cpp-IdTable.$(OBJEXT) \
 	SymTab/driver_cfa_cpp-Indexer.$(OBJEXT) \
 	SymTab/driver_cfa_cpp-Mangler.$(OBJEXT) \
@@ -171,4 +169,5 @@
 	SynTree/driver_cfa_cpp-TypeofType.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-AttrType.$(OBJEXT) \
+	SynTree/driver_cfa_cpp-VarArgsType.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Constant.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Expression.$(OBJEXT) \
@@ -191,5 +190,4 @@
 	SynTree/driver_cfa_cpp-Visitor.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Mutator.$(OBJEXT) \
-	SynTree/driver_cfa_cpp-CodeGenVisitor.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-TypeSubstitution.$(OBJEXT) \
 	Tuples/driver_cfa_cpp-Mutate.$(OBJEXT) \
@@ -247,5 +245,5 @@
 CXX = @CXX@
 CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = -g	# remove default -O2 to allow better debugging
+CXXFLAGS = -g -std=c++11		# remove default -O2 to allow better debugging
 CYGPATH_W = @CYGPATH_W@
 DEFS = @DEFS@
@@ -347,11 +345,10 @@
 	GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \
 	GenPoly/CopyParams.cc GenPoly/FindFunction.cc \
-	GenPoly/InstantiateGeneric.cc GenPoly/DeclMutator.cc \
-	InitTweak/RemoveInit.cc Parser/parser.yy Parser/lex.ll \
-	Parser/TypedefTable.cc Parser/ParseNode.cc \
-	Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
-	Parser/StatementNode.cc Parser/InitializerNode.cc \
-	Parser/TypeData.cc Parser/LinkageSpec.cc \
-	Parser/parseutility.cc Parser/Parser.cc \
+	GenPoly/DeclMutator.cc InitTweak/RemoveInit.cc \
+	Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \
+	Parser/ParseNode.cc Parser/DeclarationNode.cc \
+	Parser/ExpressionNode.cc Parser/StatementNode.cc \
+	Parser/InitializerNode.cc Parser/TypeData.cc \
+	Parser/LinkageSpec.cc Parser/parseutility.cc Parser/Parser.cc \
 	ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \
 	ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \
@@ -362,12 +359,12 @@
 	ResolvExpr/RenameVars.cc ResolvExpr/FindOpenVars.cc \
 	ResolvExpr/PolyCost.cc ResolvExpr/Occurs.cc \
-	ResolvExpr/TypeEnvironment.cc SymTab/IdTable.cc \
-	SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \
-	SymTab/FixFunction.cc SymTab/ImplementationType.cc \
-	SymTab/TypeEquality.cc SynTree/Type.cc SynTree/VoidType.cc \
-	SynTree/BasicType.cc SynTree/PointerType.cc \
-	SynTree/ArrayType.cc SynTree/FunctionType.cc \
-	SynTree/ReferenceToType.cc SynTree/TupleType.cc \
-	SynTree/TypeofType.cc SynTree/AttrType.cc SynTree/Constant.cc \
+	ResolvExpr/TypeEnvironment.cc SymTab/Indexer.cc \
+	SymTab/Mangler.cc SymTab/Validate.cc SymTab/FixFunction.cc \
+	SymTab/ImplementationType.cc SymTab/TypeEquality.cc \
+	SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \
+	SynTree/PointerType.cc SynTree/ArrayType.cc \
+	SynTree/FunctionType.cc SynTree/ReferenceToType.cc \
+	SynTree/TupleType.cc SynTree/TypeofType.cc SynTree/AttrType.cc \
+	SynTree/VarArgsType.cc SynTree/Constant.cc \
 	SynTree/Expression.cc SynTree/TupleExpr.cc \
 	SynTree/CommaExpr.cc SynTree/TypeExpr.cc \
@@ -379,8 +376,8 @@
 	SynTree/NamedTypeDecl.cc SynTree/TypeDecl.cc \
 	SynTree/Initializer.cc SynTree/Visitor.cc SynTree/Mutator.cc \
-	SynTree/CodeGenVisitor.cc SynTree/TypeSubstitution.cc \
-	Tuples/Mutate.cc Tuples/AssignExpand.cc \
-	Tuples/FunctionFixer.cc Tuples/TupleAssignment.cc \
-	Tuples/FunctionChecker.cc Tuples/NameMatcher.cc
+	SynTree/TypeSubstitution.cc Tuples/Mutate.cc \
+	Tuples/AssignExpand.cc Tuples/FunctionFixer.cc \
+	Tuples/TupleAssignment.cc Tuples/FunctionChecker.cc \
+	Tuples/NameMatcher.cc
 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
 	${cfa_cpplib_PROGRAMS}}
@@ -410,7 +407,7 @@
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu src/Makefile
+	  $(AUTOMAKE) --foreign src/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@@ -555,6 +552,4 @@
 	GenPoly/$(DEPDIR)/$(am__dirstamp)
 GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT):  \
-	GenPoly/$(am__dirstamp) GenPoly/$(DEPDIR)/$(am__dirstamp)
-GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT):  \
 	GenPoly/$(am__dirstamp) GenPoly/$(DEPDIR)/$(am__dirstamp)
 GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT): GenPoly/$(am__dirstamp) \
@@ -663,6 +658,4 @@
 	@$(MKDIR_P) SymTab/$(DEPDIR)
 	@: > SymTab/$(DEPDIR)/$(am__dirstamp)
-SymTab/driver_cfa_cpp-IdTable.$(OBJEXT): SymTab/$(am__dirstamp) \
-	SymTab/$(DEPDIR)/$(am__dirstamp)
 SymTab/driver_cfa_cpp-Indexer.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
@@ -702,4 +695,6 @@
 	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/driver_cfa_cpp-AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/driver_cfa_cpp-VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/driver_cfa_cpp-Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
@@ -743,6 +738,4 @@
 SynTree/driver_cfa_cpp-Mutator.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/driver_cfa_cpp-CodeGenVisitor.$(OBJEXT):  \
-	SynTree/$(am__dirstamp) SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/driver_cfa_cpp-TypeSubstitution.$(OBJEXT):  \
 	SynTree/$(am__dirstamp) SynTree/$(DEPDIR)/$(am__dirstamp)
@@ -795,5 +788,4 @@
 	-rm -f GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT)
 	-rm -f GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT)
-	-rm -f GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT)
 	-rm -f GenPoly/driver_cfa_cpp-Lvalue.$(OBJEXT)
 	-rm -f GenPoly/driver_cfa_cpp-PolyMutator.$(OBJEXT)
@@ -831,5 +823,4 @@
 	-rm -f ResolvExpr/driver_cfa_cpp-Unify.$(OBJEXT)
 	-rm -f SymTab/driver_cfa_cpp-FixFunction.$(OBJEXT)
-	-rm -f SymTab/driver_cfa_cpp-IdTable.$(OBJEXT)
 	-rm -f SymTab/driver_cfa_cpp-ImplementationType.$(OBJEXT)
 	-rm -f SymTab/driver_cfa_cpp-Indexer.$(OBJEXT)
@@ -843,5 +834,4 @@
 	-rm -f SynTree/driver_cfa_cpp-AttrType.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-BasicType.$(OBJEXT)
-	-rm -f SynTree/driver_cfa_cpp-CodeGenVisitor.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-CommaExpr.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-CompoundStmt.$(OBJEXT)
@@ -867,4 +857,5 @@
 	-rm -f SynTree/driver_cfa_cpp-TypeSubstitution.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-TypeofType.$(OBJEXT)
+	-rm -f SynTree/driver_cfa_cpp-VarArgsType.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-Visitor.$(OBJEXT)
 	-rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT)
@@ -902,5 +893,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-FindFunction.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-GenPoly.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-Lvalue.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-PolyMutator.Po@am__quote@
@@ -938,5 +928,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Unify.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-FixFunction.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@
@@ -950,5 +939,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-AttrType.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-BasicType.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-CommaExpr.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-CompoundStmt.Po@am__quote@
@@ -974,4 +962,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-TypeSubstitution.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-TypeofType.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-Visitor.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@
@@ -1363,18 +1352,4 @@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-FindFunction.obj `if test -f 'GenPoly/FindFunction.cc'; then $(CYGPATH_W) 'GenPoly/FindFunction.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/FindFunction.cc'; fi`
 
-GenPoly/driver_cfa_cpp-InstantiateGeneric.o: GenPoly/InstantiateGeneric.cc
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-InstantiateGeneric.o -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.o `test -f 'GenPoly/InstantiateGeneric.cc' || echo '$(srcdir)/'`GenPoly/InstantiateGeneric.cc
-@am__fastdepCXX_TRUE@	$(am__mv) GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='GenPoly/InstantiateGeneric.cc' object='GenPoly/driver_cfa_cpp-InstantiateGeneric.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.o `test -f 'GenPoly/InstantiateGeneric.cc' || echo '$(srcdir)/'`GenPoly/InstantiateGeneric.cc
-
-GenPoly/driver_cfa_cpp-InstantiateGeneric.obj: GenPoly/InstantiateGeneric.cc
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-InstantiateGeneric.obj -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.obj `if test -f 'GenPoly/InstantiateGeneric.cc'; then $(CYGPATH_W) 'GenPoly/InstantiateGeneric.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/InstantiateGeneric.cc'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='GenPoly/InstantiateGeneric.cc' object='GenPoly/driver_cfa_cpp-InstantiateGeneric.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.obj `if test -f 'GenPoly/InstantiateGeneric.cc'; then $(CYGPATH_W) 'GenPoly/InstantiateGeneric.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/InstantiateGeneric.cc'; fi`
-
 GenPoly/driver_cfa_cpp-DeclMutator.o: GenPoly/DeclMutator.cc
 @am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-DeclMutator.o -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-DeclMutator.Tpo -c -o GenPoly/driver_cfa_cpp-DeclMutator.o `test -f 'GenPoly/DeclMutator.cc' || echo '$(srcdir)/'`GenPoly/DeclMutator.cc
@@ -1811,18 +1786,4 @@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-TypeEnvironment.obj `if test -f 'ResolvExpr/TypeEnvironment.cc'; then $(CYGPATH_W) 'ResolvExpr/TypeEnvironment.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/TypeEnvironment.cc'; fi`
 
-SymTab/driver_cfa_cpp-IdTable.o: SymTab/IdTable.cc
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-IdTable.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Tpo -c -o SymTab/driver_cfa_cpp-IdTable.o `test -f 'SymTab/IdTable.cc' || echo '$(srcdir)/'`SymTab/IdTable.cc
-@am__fastdepCXX_TRUE@	$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='SymTab/IdTable.cc' object='SymTab/driver_cfa_cpp-IdTable.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-IdTable.o `test -f 'SymTab/IdTable.cc' || echo '$(srcdir)/'`SymTab/IdTable.cc
-
-SymTab/driver_cfa_cpp-IdTable.obj: SymTab/IdTable.cc
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-IdTable.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Tpo -c -o SymTab/driver_cfa_cpp-IdTable.obj `if test -f 'SymTab/IdTable.cc'; then $(CYGPATH_W) 'SymTab/IdTable.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/IdTable.cc'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-IdTable.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='SymTab/IdTable.cc' object='SymTab/driver_cfa_cpp-IdTable.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-IdTable.obj `if test -f 'SymTab/IdTable.cc'; then $(CYGPATH_W) 'SymTab/IdTable.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/IdTable.cc'; fi`
-
 SymTab/driver_cfa_cpp-Indexer.o: SymTab/Indexer.cc
 @am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-Indexer.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Tpo -c -o SymTab/driver_cfa_cpp-Indexer.o `test -f 'SymTab/Indexer.cc' || echo '$(srcdir)/'`SymTab/Indexer.cc
@@ -2049,4 +2010,18 @@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-AttrType.obj `if test -f 'SynTree/AttrType.cc'; then $(CYGPATH_W) 'SynTree/AttrType.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/AttrType.cc'; fi`
 
+SynTree/driver_cfa_cpp-VarArgsType.o: SynTree/VarArgsType.cc
+@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-VarArgsType.o -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Tpo -c -o SynTree/driver_cfa_cpp-VarArgsType.o `test -f 'SynTree/VarArgsType.cc' || echo '$(srcdir)/'`SynTree/VarArgsType.cc
+@am__fastdepCXX_TRUE@	$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='SynTree/VarArgsType.cc' object='SynTree/driver_cfa_cpp-VarArgsType.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-VarArgsType.o `test -f 'SynTree/VarArgsType.cc' || echo '$(srcdir)/'`SynTree/VarArgsType.cc
+
+SynTree/driver_cfa_cpp-VarArgsType.obj: SynTree/VarArgsType.cc
+@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-VarArgsType.obj -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Tpo -c -o SynTree/driver_cfa_cpp-VarArgsType.obj `if test -f 'SynTree/VarArgsType.cc'; then $(CYGPATH_W) 'SynTree/VarArgsType.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/VarArgsType.cc'; fi`
+@am__fastdepCXX_TRUE@	$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-VarArgsType.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='SynTree/VarArgsType.cc' object='SynTree/driver_cfa_cpp-VarArgsType.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-VarArgsType.obj `if test -f 'SynTree/VarArgsType.cc'; then $(CYGPATH_W) 'SynTree/VarArgsType.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/VarArgsType.cc'; fi`
+
 SynTree/driver_cfa_cpp-Constant.o: SynTree/Constant.cc
 @am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-Constant.o -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-Constant.Tpo -c -o SynTree/driver_cfa_cpp-Constant.o `test -f 'SynTree/Constant.cc' || echo '$(srcdir)/'`SynTree/Constant.cc
@@ -2328,18 +2303,4 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-Mutator.obj `if test -f 'SynTree/Mutator.cc'; then $(CYGPATH_W) 'SynTree/Mutator.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/Mutator.cc'; fi`
-
-SynTree/driver_cfa_cpp-CodeGenVisitor.o: SynTree/CodeGenVisitor.cc
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-CodeGenVisitor.o -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Tpo -c -o SynTree/driver_cfa_cpp-CodeGenVisitor.o `test -f 'SynTree/CodeGenVisitor.cc' || echo '$(srcdir)/'`SynTree/CodeGenVisitor.cc
-@am__fastdepCXX_TRUE@	$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='SynTree/CodeGenVisitor.cc' object='SynTree/driver_cfa_cpp-CodeGenVisitor.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-CodeGenVisitor.o `test -f 'SynTree/CodeGenVisitor.cc' || echo '$(srcdir)/'`SynTree/CodeGenVisitor.cc
-
-SynTree/driver_cfa_cpp-CodeGenVisitor.obj: SynTree/CodeGenVisitor.cc
-@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-CodeGenVisitor.obj -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Tpo -c -o SynTree/driver_cfa_cpp-CodeGenVisitor.obj `if test -f 'SynTree/CodeGenVisitor.cc'; then $(CYGPATH_W) 'SynTree/CodeGenVisitor.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/CodeGenVisitor.cc'; fi`
-@am__fastdepCXX_TRUE@	$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-CodeGenVisitor.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='SynTree/CodeGenVisitor.cc' object='SynTree/driver_cfa_cpp-CodeGenVisitor.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SynTree/driver_cfa_cpp-CodeGenVisitor.obj `if test -f 'SynTree/CodeGenVisitor.cc'; then $(CYGPATH_W) 'SynTree/CodeGenVisitor.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/CodeGenVisitor.cc'; fi`
 
 SynTree/driver_cfa_cpp-TypeSubstitution.o: SynTree/TypeSubstitution.cc
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/DeclarationNode.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 14 14:46:32 2015
-// Update Count     : 126
+// Last Modified On : Wed Apr 13 16:53:17 2016
+// Update Count     : 161
 //
 
@@ -34,12 +34,13 @@
 const char *DeclarationNode::storageName[] = { "extern", "static", "auto", "register", "inline", "fortran", "_Noreturn", "_Thread_local", "" };
 const char *DeclarationNode::qualifierName[] = { "const", "restrict", "volatile", "lvalue", "_Atomic" };
-const char *DeclarationNode::basicTypeName[] = { "char", "int", "float", "double", "void", "_Bool", "_Complex", "_Imaginary" };
+const char *DeclarationNode::basicTypeName[] = { "char", "int", "float", "double", "void", "_Bool", "_Complex", "_Imaginary",  };
 const char *DeclarationNode::modifierName[]  = { "signed", "unsigned", "short", "long" };
 const char *DeclarationNode::aggregateName[] = { "struct", "union", "context" };
 const char *DeclarationNode::typeClassName[] = { "type", "dtype", "ftype" };
+const char *DeclarationNode::builtinTypeName[] = { "__builtin_va_list" };
 
 UniqueName DeclarationNode::anonymous( "__anonymous" );
 
-extern LinkageSpec::Type linkage;		/* defined in cfa.y */
+extern LinkageSpec::Type linkage;						// defined in parser.yy
 
 DeclarationNode *DeclarationNode::clone() const {
@@ -54,5 +55,5 @@
 	newnode->linkage = linkage;
 	return newnode;
-}
+} // DeclarationNode::clone
 
 DeclarationNode::DeclarationNode() : type( 0 ), bitfieldWidth( 0 ), initializer( 0 ), hasEllipsis( false ), linkage( ::linkage ) {
@@ -116,4 +117,5 @@
 	newnode->type->function->newStyle = newStyle;
 	newnode->type->function->body = body;
+	typedefTable.addToEnclosingScope( newnode->name, TypedefTable::ID );
 
 	if ( body ) {
@@ -128,5 +130,5 @@
 
 	return newnode;
-}
+} // DeclarationNode::newFunction
 
 DeclarationNode *DeclarationNode::newQualifier( Qualifier q ) {
@@ -135,5 +137,5 @@
 	newnode->type->qualifiers.push_back( q );
 	return newnode;
-}
+} // DeclarationNode::newQualifier
 
 DeclarationNode *DeclarationNode::newStorageClass( DeclarationNode::StorageClass sc ) {
@@ -141,5 +143,5 @@
 	newnode->storageClasses.push_back( sc );
 	return newnode;
-}
+} // DeclarationNode::newStorageClass
 
 DeclarationNode *DeclarationNode::newBasicType( BasicType bt ) {
@@ -148,5 +150,12 @@
 	newnode->type->basic->typeSpec.push_back( bt );
 	return newnode;
-}
+} // DeclarationNode::newBasicType
+
+DeclarationNode *DeclarationNode::newBuiltinType( BuiltinType bt ) {
+	DeclarationNode *newnode = new DeclarationNode;
+	newnode->type = new TypeData( TypeData::Builtin );
+	newnode->type->builtin->type = bt;
+	return newnode;
+} // DeclarationNode::newBuiltinType
 
 DeclarationNode *DeclarationNode::newModifier( Modifier mod ) {
@@ -155,5 +164,5 @@
 	newnode->type->basic->modifiers.push_back( mod );
 	return newnode;
-}
+} // DeclarationNode::newModifier
 
 DeclarationNode *DeclarationNode::newForall( DeclarationNode *forall ) {
@@ -162,5 +171,5 @@
 	newnode->type->forall = forall;
 	return newnode;
-}
+} // DeclarationNode::newForall
 
 DeclarationNode *DeclarationNode::newFromTypedef( std::string *name ) {
@@ -171,5 +180,5 @@
 	newnode->type->symbolic->params = 0;
 	return newnode;
-}
+} // DeclarationNode::newFromTypedef
 
 DeclarationNode *DeclarationNode::newAggregate( Aggregate kind, const std::string *name, ExpressionNode *actuals, DeclarationNode *fields ) {
@@ -179,17 +188,10 @@
 	newnode->type->aggregate->name = assign_strptr( name );
 	if ( newnode->type->aggregate->name == "" ) {		// anonymous aggregate ?
-		newnode->type->aggregate->name = DeclarationNode::anonymous.newName();
-	} else {
-		// SKULLDUGGERY: generate a typedef for the aggregate name so that the aggregate does not have to be qualified
-		// by "struct"
-		typedefTable.addToEnclosingScope( newnode->type->aggregate->name, TypedefTable::TD );
-		DeclarationNode *typedf = new DeclarationNode;
-		typedf->name = newnode->type->aggregate->name;
-		newnode->appendList( typedf->addType( newnode->clone() )->addTypedef() );
+		newnode->type->aggregate->name = anonymous.newName();
 	} // if
 	newnode->type->aggregate->actuals = actuals;
 	newnode->type->aggregate->fields = fields;
 	return newnode;
-}
+} // DeclarationNode::newAggregate
 
 DeclarationNode *DeclarationNode::newEnum( std::string *name, DeclarationNode *constants ) {
@@ -200,22 +202,16 @@
 	if ( newnode->type->enumeration->name == "" ) {		// anonymous enumeration ?
 		newnode->type->enumeration->name = DeclarationNode::anonymous.newName();
-	} else {
-		// SKULLDUGGERY: generate a typedef for the enumeration name so that the enumeration does not have to be
-		// qualified by "enum"
-		typedefTable.addToEnclosingScope( newnode->type->enumeration->name, TypedefTable::TD );
-		DeclarationNode *typedf = new DeclarationNode;
-		typedf->name = newnode->type->enumeration->name;
-		newnode->appendList( typedf->addType( newnode->clone() )->addTypedef() );
 	} // if
 	newnode->type->enumeration->constants = constants;
 	return newnode;
-}
+} // DeclarationNode::newEnum
 
 DeclarationNode *DeclarationNode::newEnumConstant( std::string *name, ExpressionNode *constant ) {
 	DeclarationNode *newnode = new DeclarationNode;
 	newnode->name = assign_strptr( name );
-	// do something with the constant
-	return newnode;
-}
+	newnode->enumeratorValue = constant;
+	typedefTable.addToEnclosingScope( newnode->name, TypedefTable::ID );
+	return newnode;
+} // DeclarationNode::newEnumConstant
 
 DeclarationNode *DeclarationNode::newName( std::string *name ) {
@@ -223,5 +219,5 @@
 	newnode->name = assign_strptr( name );
 	return newnode;
-}
+} // DeclarationNode::newName
 
 DeclarationNode *DeclarationNode::newFromTypeGen( std::string *name, ExpressionNode *params ) {
@@ -232,5 +228,5 @@
 	newnode->type->symbolic->actuals = params;
 	return newnode;
-}
+} // DeclarationNode::newFromTypeGen
 
 DeclarationNode *DeclarationNode::newTypeParam( TypeClass tc, std::string *name ) {
@@ -241,25 +237,25 @@
 	newnode->type->variable->name = newnode->name;
 	return newnode;
-}
-
-DeclarationNode *DeclarationNode::newContext( std::string *name, DeclarationNode *params, DeclarationNode *asserts ) {
+} // DeclarationNode::newTypeParam
+
+DeclarationNode *DeclarationNode::newTrait( std::string *name, DeclarationNode *params, DeclarationNode *asserts ) {
 	DeclarationNode *newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Aggregate );
-	newnode->type->aggregate->kind = Context;
+	newnode->type->aggregate->kind = Trait;
 	newnode->type->aggregate->params = params;
 	newnode->type->aggregate->fields = asserts;
 	newnode->type->aggregate->name = assign_strptr( name );
 	return newnode;
-}
-
-DeclarationNode *DeclarationNode::newContextUse( std::string *name, ExpressionNode *params ) {
+} // DeclarationNode::newTrait
+
+DeclarationNode *DeclarationNode::newTraitUse( std::string *name, ExpressionNode *params ) {
 	DeclarationNode *newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::AggregateInst );
 	newnode->type->aggInst->aggregate = new TypeData( TypeData::Aggregate );
-	newnode->type->aggInst->aggregate->aggregate->kind = Context;
+	newnode->type->aggInst->aggregate->aggregate->kind = Trait;
 	newnode->type->aggInst->aggregate->aggregate->name = assign_strptr( name );
 	newnode->type->aggInst->params = params;
 	return newnode;
-}
+} // DeclarationNode::newTraitUse
 
 DeclarationNode *DeclarationNode::newTypeDecl( std::string *name, DeclarationNode *typeParams ) {
@@ -271,5 +267,5 @@
 	newnode->type->symbolic->name = newnode->name;
 	return newnode;
-}
+} // DeclarationNode::newTypeDecl
 
 DeclarationNode *DeclarationNode::newPointer( DeclarationNode *qualifiers ) {
@@ -277,5 +273,5 @@
 	newnode->type = new TypeData( TypeData::Pointer );
 	return newnode->addQualifiers( qualifiers );
-}
+} // DeclarationNode::newPointer
 
 DeclarationNode *DeclarationNode::newArray( ExpressionNode *size, DeclarationNode *qualifiers, bool isStatic ) {
@@ -290,5 +286,5 @@
 	} // if
 	return newnode->addQualifiers( qualifiers );
-}
+} // DeclarationNode::newArray
 
 DeclarationNode *DeclarationNode::newVarArray( DeclarationNode *qualifiers ) {
@@ -794,5 +790,5 @@
 			errors.append( e );
 		} // try
-		cur = dynamic_cast< DeclarationNode *>( cur->get_link() );
+		cur = dynamic_cast<DeclarationNode *>( cur->get_link() );
 	} // while
 	if ( ! errors.isEmpty() ) {
@@ -881,6 +877,6 @@
 			  ret = new UnionInstType( type->buildQualifiers(), type->aggregate->name );
 			  break;
-			case DeclarationNode::Context:
-			  ret = new ContextInstType( type->buildQualifiers(), type->aggregate->name );
+			case DeclarationNode::Trait:
+			  ret = new TraitInstType( type->buildQualifiers(), type->aggregate->name );
 			  break;
 			default:
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/ExpressionNode.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb  1 13:32:30 2016
-// Update Count     : 271
+// Last Modified On : Fri Apr  8 15:43:05 2016
+// Update Count     : 296
 // 
 
@@ -22,6 +22,8 @@
 
 #include "ParseNode.h"
+#include "TypeData.h"
 #include "SynTree/Constant.h"
 #include "SynTree/Expression.h"
+#include "SynTree/Declaration.h"
 #include "Common/UnimplementedError.h"
 #include "parseutility.h"
@@ -487,8 +489,7 @@
 		args.front() = new AddressExpr( args.front() );
 		break;
-	  default:
-		/* do nothing */
+	  default:		// do nothing
 		;
-	}
+	} // switch
 
 	switch ( op->get_type() ) {
@@ -873,4 +874,54 @@
 }
 
+
+CompoundLiteralNode::CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ) : type( type ), kids( kids ) {}
+CompoundLiteralNode::CompoundLiteralNode( const CompoundLiteralNode &other ) : ExpressionNode( other ), type( other.type ), kids( other.kids ) {}
+
+CompoundLiteralNode::~CompoundLiteralNode() {
+	delete kids;
+	delete type;
+}
+
+CompoundLiteralNode *CompoundLiteralNode::clone() const {
+	return new CompoundLiteralNode( *this );
+}
+
+void CompoundLiteralNode::print( std::ostream &os, int indent ) const {
+	os << string( indent,' ' ) << "CompoundLiteralNode:" << endl;
+
+	os << string( indent + 2, ' ' ) << "type:" << endl;
+	if ( type != 0 )
+		type->print( os, indent + 4 );
+
+	os << string( indent + 2, ' ' ) << "initialization:" << endl;
+	if ( kids != 0 )
+		kids->printList( os, indent + 4 );
+}
+
+void CompoundLiteralNode::printOneLine( std::ostream &os, int indent ) const {
+	os << "( ";
+	if ( type ) type->print( os );
+	os << ", ";
+	if ( kids ) kids->printOneLine( os );
+	os << ") ";
+}
+
+Expression *CompoundLiteralNode::build() const {
+	Declaration * newDecl = type->build();				// compound literal type
+	if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type
+		return new CompoundLiteralExpr( newDeclWithType->get_type(), kids->build() );
+	// these types do not have associated type information
+	} else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl )  ) {
+		return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), kids->build() );
+	} else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl )  ) {
+		return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), kids->build() );
+	} else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl )  ) {
+		return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), kids->build() );
+	} else {
+		assert( false );
+	} // if
+}
+
+
 ExpressionNode *flattenCommas( ExpressionNode *list ) {
 	if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/ParseNode.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -5,11 +5,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// ParseNode.h -- 
+// ParseNode.h --
 //
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:28:16 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb  1 13:32:32 2016
-// Update Count     : 184
+// Last Modified By : Rob Schluntz
+// Last Modified On : Mon Apr 11 11:50:52 2016
+// Update Count     : 205
 //
 
@@ -108,5 +108,5 @@
 
 	ConstantNode( Type, std::string * );
-	ConstantNode( const ConstantNode &other ) : value( *new std::string( other.value ) ) {};
+	ConstantNode( const ConstantNode &other ) : type( other.type ), btype( other.btype), value( *new std::string( other.value ) ) {};
 	~ConstantNode() { delete &value; }
 
@@ -177,8 +177,8 @@
 	enum Type { TupleC, Comma, TupleFieldSel, // n-adic
 				// triadic
-				Cond, NCond, 
+				Cond, NCond,
 				// diadic
-				SizeOf, AlignOf, OffsetOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And, 
-				BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 
+				SizeOf, AlignOf, OffsetOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And,
+				BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
 				Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
 				Index, FieldSel, PFieldSel, Range,
@@ -309,5 +309,5 @@
 	ValofExprNode( const ValofExprNode &other );
 	~ValofExprNode();
-  
+
 	virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); }
 
@@ -329,8 +329,9 @@
 	enum BasicType { Char, Int, Float, Double, Void, Bool, Complex, Imaginary };
 	enum Modifier  { Signed, Unsigned, Short, Long };
-	enum Aggregate { Struct, Union, Context };
+	enum Aggregate { Struct, Union, Trait };
 	enum TypeClass { Type, Dtype, Ftype };
-
-	static const char *storageName[];  
+	enum BuiltinType { Valist };
+
+	static const char *storageName[];
 	static const char *qualifierName[];
 	static const char *basicTypeName[];
@@ -338,4 +339,5 @@
 	static const char *aggregateName[];
 	static const char *typeClassName[];
+	static const char *builtinTypeName[];
 
 	static DeclarationNode *newFunction( std::string *name, DeclarationNode *ret, DeclarationNode *param, StatementNode *body, bool newStyle = false );
@@ -352,6 +354,6 @@
 	static DeclarationNode *newFromTypeGen( std::string *, ExpressionNode *params );
 	static DeclarationNode *newTypeParam( TypeClass, std::string *);
-	static DeclarationNode *newContext( std::string *name, DeclarationNode *params, DeclarationNode *asserts );
-	static DeclarationNode *newContextUse( std::string *name, ExpressionNode *params );
+	static DeclarationNode *newTrait( std::string *name, DeclarationNode *params, DeclarationNode *asserts );
+	static DeclarationNode *newTraitUse( std::string *name, ExpressionNode *params );
 	static DeclarationNode *newTypeDecl( std::string *name, DeclarationNode *typeParams );
 	static DeclarationNode *newPointer( DeclarationNode *qualifiers );
@@ -363,4 +365,5 @@
 	static DeclarationNode *newAttr( std::string *, ExpressionNode *expr );
 	static DeclarationNode *newAttr( std::string *, DeclarationNode *type );
+	static DeclarationNode *newBuiltinType( BuiltinType );
 
 	DeclarationNode *addQualifiers( DeclarationNode *);
@@ -401,4 +404,5 @@
 	LinkageSpec::Type get_linkage() const { return linkage; }
 	DeclarationNode *extractAggregate() const;
+	ExpressionNode *get_enumeratorValue() const { return enumeratorValue; }
 
 	DeclarationNode();
@@ -413,4 +417,5 @@
 	std::list< std::string > attributes;
 	ExpressionNode *bitfieldWidth;
+	ExpressionNode *enumeratorValue;
 	InitializerNode *initializer;
 	bool hasEllipsis;
@@ -422,5 +427,5 @@
 class StatementNode : public ParseNode {
   public:
-	enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru, 
+	enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru,
 				While, Do,        For,
 				Goto,  Continue,  Break,   Return,  Throw,
@@ -530,4 +535,27 @@
 	bool aggregate;
 	ExpressionNode *designator; // may be list
+	InitializerNode *kids;
+};
+
+class CompoundLiteralNode : public ExpressionNode {
+  public:
+	CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids );
+	CompoundLiteralNode( const CompoundLiteralNode &type );
+	~CompoundLiteralNode();
+
+	virtual CompoundLiteralNode *clone() const;
+
+	DeclarationNode *get_type() const { return type; }
+	CompoundLiteralNode *set_type( DeclarationNode *t ) { type = t; return this; }
+
+	InitializerNode *get_initializer() const { return kids; }
+	CompoundLiteralNode *set_initializer( InitializerNode *k ) { kids = k; return this; }
+
+	void print( std::ostream &, int indent = 0 ) const;
+	void printOneLine( std::ostream &, int indent = 0 ) const;
+
+	virtual Expression *build() const;
+  private:
+	DeclarationNode *type;
 	InitializerNode *kids;
 };
Index: src/Parser/Parser.cc
===================================================================
--- src/Parser/Parser.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/Parser.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,12 +10,12 @@
 // Created On       : Sat May 16 14:54:28 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 31 23:45:19 2015
-// Update Count     : 4
+// Last Modified On : Mon Mar 21 18:04:47 2016
+// Update Count     : 5
 // 
 
 #include "Parser.h"
-#include "TypedefTable.h"
 #include "lex.h"
 #include "parser.h"
+#include "TypedefTable.h"
 
 // global variables in cfa.y
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/TypeData.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 14 14:57:23 2015
-// Update Count     : 32
+// Last Modified On : Wed Mar  2 17:26:45 2016
+// Update Count     : 49
 //
 
@@ -23,4 +23,5 @@
 #include "SynTree/Expression.h"
 #include "SynTree/Statement.h"
+#include "SynTree/Initializer.h"
 
 TypeData::TypeData( Kind k ) : kind( k ), base( 0 ), forall( 0 ) {
@@ -84,4 +85,7 @@
 		typeexpr->expr = 0;
 		break;
+	  case Builtin:
+		builtin = new Builtin_t;
+		break;
 	  case Attr:
 		attr = new Attr_t;
@@ -149,4 +153,7 @@
 		delete typeexpr->expr;
 		delete typeexpr;
+		break;
+	  case Builtin:
+		delete builtin;
 		break;
 	  case Attr:
@@ -221,4 +228,7 @@
 		newtype->typeexpr->expr = maybeClone( typeexpr->expr );
 		break;
+	  case Builtin:
+		newtype->builtin->type = builtin->type;
+		break;
 	  case Attr:
 		newtype->attr->expr = maybeClone( attr->expr );
@@ -396,4 +406,7 @@
 			attr->type->print( os, indent + 2 );
 		} // if
+		break;
+	  case Builtin:
+		os << "gcc builtin type";
 		break;
 	  default:
@@ -506,4 +519,6 @@
 	  case Typeof:
 		return buildTypeof();
+	  case Builtin:
+		return new VarArgsType( buildQualifiers() );
 	  case Attr:
 		return buildAttr();
@@ -805,6 +820,6 @@
 		buildForall( aggregate->params, at->get_parameters() );
 		break;
-	  case DeclarationNode::Context:
-		at = new ContextDecl( aggregate->name );
+	  case DeclarationNode::Trait:
+		at = new TraitDecl( aggregate->name );
 		buildList( aggregate->params, at->get_parameters() );
 		break;
@@ -845,6 +860,6 @@
 			ret = new UnionInstType( buildQualifiers(), aggInst->aggregate->aggregate->name );
 			break;
-		  case DeclarationNode::Context:
-			ret = new ContextInstType( buildQualifiers(), aggInst->aggregate->aggregate->name );
+		  case DeclarationNode::Trait:
+			ret = new TraitInstType( buildQualifiers(), aggInst->aggregate->aggregate->name );
 			break;
 		  default:
@@ -883,4 +898,11 @@
 	EnumDecl *ret = new EnumDecl( enumeration->name );
 	buildList( enumeration->constants, ret->get_members() );
+	std::list< Declaration * >::iterator members = ret->get_members().begin();
+	for ( const DeclarationNode *cur = enumeration->constants; cur != NULL; cur = dynamic_cast<DeclarationNode *>( cur->get_link() ), ++members ) {
+		if ( cur->get_enumeratorValue() != NULL ) {
+			ObjectDecl *member = dynamic_cast<ObjectDecl *>(*members);
+			member->set_init( new SingleInit( maybeBuild< Expression >( cur->get_enumeratorValue() ) ) );
+		} // if
+	} // for
 	return ret;
 }
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/TypeData.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jan 14 23:31:15 2016
-// Update Count     : 17
+// Last Modified On : Fri Feb 26 14:21:38 2016
+// Update Count     : 19
 //
 
@@ -24,5 +24,5 @@
 struct TypeData {
 	enum Kind { Unknown, Basic, Pointer, Array, Function, Aggregate, AggregateInst,
-				Enum, EnumConstant, Symbolic, SymbolicInst, Variable, Tuple, Typeof, Attr } kind;
+				Enum, EnumConstant, Symbolic, SymbolicInst, Variable, Tuple, Typeof, Builtin, Attr } kind;
 
 	TypeData( Kind k = Unknown );
@@ -98,4 +98,8 @@
 	};
 
+	struct Builtin_t {
+		DeclarationNode::BuiltinType type;
+	};
+
 	struct Attr_t {
 		std::string name;
@@ -116,4 +120,5 @@
 		Typeof_t * typeexpr;
 		Attr_t * attr;
+		Builtin_t * builtin;
 	};
 
Index: src/Parser/TypedefTable.cc
===================================================================
--- src/Parser/TypedefTable.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/TypedefTable.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,12 +10,12 @@
 // Created On       : Sat May 16 15:20:13 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 26 07:30:16 2015
-// Update Count     : 19
+// Last Modified On : Wed Apr 13 16:57:30 2016
+// Update Count     : 24
 //
 
 #include <map>
 #include <list>
+#include <cassert>
 #include "TypedefTable.h"
-#include <cassert>
 using namespace std;
 
@@ -29,39 +29,34 @@
 TypedefTable::TypedefTable() : currentScope( 0 ) {}
 
+bool TypedefTable::exists( const string &identifier ) {
+	return table.count( identifier ) > 0;
+}
+
+int TypedefTable::isKind( const string &identifier ) const {
+	tableType::const_iterator id_pos = table.find( identifier );
+	// Name lookup defaults to identifier, and then the identifier's kind is set by the parser.
+	if ( id_pos == table.end() ) return IDENTIFIER;
+	return id_pos->second.begin()->kind;
+}
+
 void TypedefTable::changeKind( const string &identifier, kind_t kind ) {
 	tableType::iterator id_pos = table.find( identifier );
-	if ( id_pos == table.end() ) {
-		return;
-	} else {
-		(*((*id_pos ).second.begin())).kind = kind;
-		return;
+	if ( id_pos == table.end() ) return;
+	id_pos->second.begin()->kind = kind;
+}
+
+// SKULLDUGGERY: Generate a typedef for the aggregate name so the aggregate does not have to be qualified by
+// "struct". Only generate the typedef, if the name is not in use. The typedef is implicitly (silently) removed
+// if the name is explicitly used.
+void TypedefTable::makeTypedef( const string &name ) {
+	if ( ! typedefTable.exists( name ) ) {
+		typedefTable.addToEnclosingScope( name, TypedefTable::TD );
 	} // if
 }
 
-bool TypedefTable::isKind( const string &identifier, kind_t kind ) const {
-	tableType::const_iterator id_pos = table.find( identifier );
-	if ( id_pos == table.end() ) {
-		return true;
-	} else {
-		return (*((*id_pos ).second.begin())).kind == kind;
-	} // if
-}
-
-bool TypedefTable::isIdentifier( const string &identifier ) const {
-	return isKind( identifier, ID );
-}
-
-bool TypedefTable::isTypedef( const string &identifier ) const {
-	return isKind( identifier, TD );
-}
-
-bool TypedefTable::isTypegen( const string &identifier ) const {
-	return isKind( identifier, TG );
-}
-
 void TypedefTable::addToScope( const std::string &identifier, kind_t kind, int scope ) {
-	if ( currentContext != "" && scope == contextScope ) {
+	if ( currentTrait != "" && scope == contextScope ) {
 		DeferredEntry entry = { identifier, kind };
-		contexts[currentContext].push_back( entry );
+		contexts[currentTrait].push_back( entry );
 	} else {
 		debugPrint( "Adding " << identifier << " as kind " << kind << " scope " << scope << " from scope " << currentScope << endl );
@@ -112,5 +107,5 @@
 }
 
-void TypedefTable::openContext( const std::string &contextName ) {
+void TypedefTable::openTrait( const std::string &contextName ) {
 	map< string, deferListType >::iterator i = contexts.find( contextName );
 	if ( i != contexts.end() ) {
@@ -150,11 +145,11 @@
 }
 
-void TypedefTable::enterContext( const std::string &contextName ) {
-	currentContext = contextName;
+void TypedefTable::enterTrait( const std::string &contextName ) {
+	currentTrait = contextName;
 	contextScope = currentScope;
 }
 
-void TypedefTable::leaveContext() {
-	currentContext = "";
+void TypedefTable::leaveTrait() {
+	currentTrait = "";
 }
 
Index: src/Parser/TypedefTable.h
===================================================================
--- src/Parser/TypedefTable.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/TypedefTable.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:24:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun 25 22:52:15 2015
-// Update Count     : 11
+// Last Modified On : Wed Apr 13 16:59:56 2016
+// Update Count     : 27
 //
 
@@ -22,7 +22,10 @@
 #include <stack>
 
+#include "lex.h"
+#include "parser.h"
+
 class TypedefTable {
   public:
-	enum kind_t { ID, TD, TG };
+	enum kind_t { ID = IDENTIFIER, TD = TYPEDEFname, TG = TYPEGENname };
   private:
 	struct Entry {
@@ -40,5 +43,5 @@
 
 	int currentScope;
-	std::string currentContext;
+	std::string currentTrait;
 	int contextScope;
 	
@@ -49,15 +52,14 @@
 	std::stack< std::string > nextIdentifiers;
 
-	bool isKind( const std::string &identifier, kind_t kind ) const;
 	void addToScope( const std::string &identifier, kind_t kind, int scope );
   public:
 	TypedefTable();
 
-	bool isIdentifier( const std::string &identifier ) const;
-	bool isTypedef( const std::string &identifier ) const;
-	bool isTypegen( const std::string &identifier ) const;
+	bool exists( const std::string &identifier );
+	int isKind( const std::string &identifier ) const;
+	void changeKind( const std::string &identifier, kind_t kind );
 
-	void changeKind( const std::string &identifier, kind_t kind );
-	
+	void makeTypedef( const std::string &name );
+
 	// "addToCurrentScope" adds the identifier/type pair to the current scope. This does less than you think it does,
 	// since each declaration is within its own scope.  Mostly useful for type parameters.
@@ -79,10 +81,10 @@
 	
 	// dump the definitions from a pre-defined context into the current scope
-	void openContext( const std::string &contextName );
+	void openTrait( const std::string &contextName );
 	
 	void enterScope();
 	void leaveScope();
-	void enterContext( const std::string &contextName );
-	void leaveContext();
+	void enterTrait( const std::string &contextName );
+	void leaveTrait();
 
 	void print() const;
Index: src/Parser/lex.cc
===================================================================
--- src/Parser/lex.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/lex.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -382,6 +382,6 @@
 	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 179
-#define YY_END_OF_BUFFER 180
+#define YY_NUM_RULES 180
+#define YY_END_OF_BUFFER 181
 /* This struct is not used in this scanner,
    but its presence is necessary. */
@@ -391,102 +391,103 @@
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[876] =
+static yyconst flex_int16_t yy_accept[888] =
     {   0,
-        0,    0,    0,    0,    0,    0,  114,  114,  117,  117,
-      180,  178,    7,    9,    8,  137,  116,  101,  142,  145,
-      113,  124,  125,  140,  138,  128,  139,  131,  141,  106,
-      107,  108,  129,  130,  147,  149,  148,  150,  178,  101,
-      122,  178,  123,  143,  101,  103,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  126,  146,  127,  144,    7,  178,    4,    4,  179,
-      104,  179,  105,  114,  115,  121,  117,  118,    7,    9,
-        0,    8,  154,  173,  101,    0,  166,  136,  159,  167,
-      164,  151,  162,  152,  163,  161,    0,  111,    3,    0,
-
-      165,  111,  109,    0,    0,  109,  109,    0,    0,  109,
-      108,  108,  108,    0,  108,  134,  135,  133,  155,  157,
-      153,  158,  156,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  102,  172,
-        0,  116,  113,  101,    0,    0,  169,    0,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,   39,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,   57,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  168,  160,    7,    0,    0,    0,    2,    0,
-
-        5,  104,    0,    0,    0,  114,    0,  120,  119,  119,
-        0,    0,    0,  117,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  132,
-      111,  111,    0,  111,  111,  111,    0,    6,  111,  109,
-        0,    0,    0,  111,    0,  109,  109,  109,  109,    0,
-      110,    0,    0,  108,  108,  108,  108,    0,  170,  171,
-        0,  176,  174,    0,    0,    0,  102,    0,    0,    0,
-        0,    0,    0,    0,    0,  101,   17,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,   14,  101,  101,  101,  101,
-
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,   51,  101,  101,  101,   64,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,   88,  101,  101,  101,  101,  101,  101,  101,    0,
-        0,    0,    0,    0,    0,    0,    0,  119,    0,    0,
-        0,    0,    0,  119,    0,    0,  177,    0,    0,    0,
-        0,    0,    0,    0,  111,    0,  111,    0,  111,    0,
-        0,  111,  111,  109,  109,    0,    0,  110,  110,    0,
-      110,    0,  110,  108,  108,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  175,  101,  101,  101,  101,
-
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,   21,
-      101,   24,  101,   27,  101,  101,  101,  101,  101,  101,
-      101,   42,  101,   44,  101,  101,  101,  101,  101,  101,
-      101,   56,  101,   67,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,   89,  101,  101,   96,  101,
-      101,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  119,    0,    0,    0,    0,
-        0,  111,  111,    0,    0,    0,    0,    0,  110,  110,
-        0,  112,    0,  110,  110,    0,    0,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,  101,  101,
-       22,  101,  101,  101,  101,  101,  101,  101,   15,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,   23,   25,  101,   32,  101,  101,  101,
-      101,  101,   41,  101,  101,  101,  101,   49,  101,  101,
-       54,  101,  101,  101,  101,  101,   76,  101,  101,  101,
-      101,  101,   86,  101,  101,   94,  101,  101,  100,    0,
+        0,    0,    0,    0,    0,    0,  115,  115,  118,  118,
+      181,  179,    7,    9,    8,  138,  117,  102,  143,  146,
+      114,  125,  126,  141,  139,  129,  140,  132,  142,  107,
+      108,  109,  130,  131,  148,  150,  149,  151,  179,  102,
+      123,  179,  124,  144,  102,  104,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  127,  147,  128,  145,    7,  179,    4,    4,
+      180,  105,  180,  106,  115,  116,  122,  118,  119,    7,
+        9,    0,    8,  155,  174,  102,    0,  167,  137,  160,
+      168,  165,  152,  163,  153,  164,  162,    0,  112,    3,
+
+        0,  166,  112,  110,    0,    0,  110,  110,    0,    0,
+      110,  109,  109,  109,    0,  109,  135,  136,  134,  156,
+      158,  154,  159,  157,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  103,
+      173,    0,  117,  114,  102,    0,    0,  170,    0,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,   38,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,   56,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  169,  161,    7,    0,    0,    0,
+
+        2,    0,    5,  105,    0,    0,    0,  115,    0,  121,
+      120,  120,    0,    0,    0,  118,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  112,    0,
-        0,  110,  112,  112,  112,  112,  112,  110,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,  101,    0,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,   59,  101,  101,  101,
-      101,  101,  101,  101,  101,   28,  101,  101,  101,  101,
-       40,   43,   46,  101,  101,   52,  101,   61,   68,  101,
-      101,   75,   77,   80,   81,   83,   84,  101,  101,   91,
-      101,  101,    0,    1,    0,    0,    0,    0,    0,    0,
-      104,    0,    0,    0,  119,    0,    0,    0,    0,  112,
-      112,  112,  112,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  101,  101,   18,  101,  101,  101,  101,  101,
-
-      101,  101,   16,  101,  101,  101,   33,  101,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,   35,  101,
-       37,   38,  101,   48,   53,  101,  101,  101,   90,  101,
-      101,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   10,   11,   29,   55,  101,  101,
-      101,  101,  101,  101,  101,  101,  101,  101,  101,   60,
-       62,   65,  101,  101,   78,   92,  101,  101,   36,   47,
-       71,   72,  101,   95,   97,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  101,   69,  101,
-      101,   12,  101,  101,   30,   34,  101,  101,  101,   66,
-
-      101,  101,  101,  101,  101,  101,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   58,
-      101,  101,  101,  101,  101,  101,  101,   50,   63,   73,
-       79,   93,   98,  101,  101,    0,    0,    0,    0,    0,
-        0,    0,    0,  101,  101,   13,   19,  101,   31,  101,
-      101,  101,   26,   87,    0,    0,  101,  101,  101,  101,
-      101,   74,   99,  101,   85,   20,  101,   45,   82,  101,
-      101,  101,  101,   70,    0
+        0,  133,  112,  112,    0,  112,  112,    0,    0,    6,
+        0,  110,    0,    0,    0,  112,    0,  110,  110,  110,
+      110,    0,  111,    0,    0,  109,  109,  109,  109,    0,
+      171,  172,    0,  177,  175,    0,    0,    0,  103,    0,
+        0,    0,    0,    0,    0,    0,    0,  102,   17,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,   14,  102,  102,
+
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,   50,  102,  102,  102,
+       63,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,   89,  102,  102,  102,  102,
+      102,  102,  102,    0,    0,    0,    0,    0,    0,    0,
+        0,  120,    0,    0,    0,    0,    0,  120,    0,    0,
+      178,    0,    0,    0,    0,    0,    0,    0,  112,    0,
+      112,    0,  112,    0,    0,  112,    0,  110,  110,    0,
+        0,  111,  111,    0,  111,    0,  111,  109,  109,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  176,
+
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,   21,  102,   24,  102,   27,  102,  102,
+      102,  102,  102,  102,  102,   41,  102,   43,  102,  102,
+      102,  102,  102,  102,  102,   55,  102,   66,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,   97,  102,  102,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  120,    0,    0,    0,    0,    0,  112,    0,    0,
+        0,    0,    0,    0,  111,  111,    0,  113,    0,  111,
+
+      111,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  102,  102,   22,  102,  102,  102,
+      102,  102,  102,  102,   15,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,   23,
+       25,  102,   32,  102,  102,  102,  102,   40,  102,  102,
+      102,  102,   48,  102,  102,   53,  102,  102,   70,  102,
+      102,  102,   76,  102,  102,  102,  102,  102,   86,   88,
+      102,  102,   94,  102,  102,  101,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  113,    0,    0,  111,  113,
+
+      113,  113,  113,    0,  111,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  102,    0,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,   58,  102,  102,  102,  102,  102,  102,
+      102,  102,   28,  102,  102,  102,   39,   42,   45,  102,
+      102,   51,  102,   60,   67,  102,  102,   75,   77,   80,
+       81,   83,   84,  102,  102,   91,  102,  102,    0,    1,
+        0,    0,    0,    0,    0,    0,  105,    0,    0,    0,
+      120,    0,    0,    0,    0,  113,    0,  113,  113,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  102,  102,
+
+       18,  102,  102,  102,  102,  102,  102,  102,   16,  102,
+      102,  102,   33,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,   36,   37,  102,   47,   52,
+      102,  102,  102,   90,  102,  102,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   10,
+       11,   29,   54,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,   59,   61,   64,  102,  102,   78,
+       92,  102,  102,   35,   46,   71,   72,  102,   95,   98,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  102,   68,  102,  102,   12,  102,  102,   30,
+
+       34,  102,  102,  102,   65,  102,  102,  102,  102,  102,
+      102,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   57,  102,  102,  102,  102,  102,
+      102,  102,   49,   62,   73,   79,   93,   99,  102,  102,
+        0,    0,    0,    0,    0,    0,    0,    0,  102,  102,
+       13,   19,  102,  102,   31,  102,  102,  102,   26,   87,
+        0,    0,  102,  102,  102,  102,  102,  102,   74,  100,
+      102,   85,   20,  102,  102,   44,   82,  102,  102,  102,
+      102,  102,  102,  102,   96,   69,    0
     } ;
 
@@ -499,12 +500,12 @@
        16,   17,   18,   19,   20,   21,   22,   23,   24,   25,
        26,   26,   26,   26,   26,   27,   28,   29,   30,   31,
-       32,   33,   34,   35,   36,   37,   38,   39,   40,   39,
-       41,   11,   42,   11,   11,   43,   11,   44,   11,   45,
-       11,   46,   47,   48,   49,   11,   11,   50,   11,   11,
-       51,   52,   53,   54,   55,   56,   57,   58,   59,   60,
-
-       61,   62,   63,   64,   65,   11,   66,   67,   68,   69,
-       70,   71,   11,   72,   73,   74,   75,   76,   77,   78,
-       79,   80,   81,   82,   83,   84,    1,    1,    1,    1,
+       32,   33,   34,   35,   36,   37,   38,   39,   40,   41,
+       42,   11,   43,   11,   11,   44,   11,   45,   11,   46,
+       11,   47,   48,   49,   50,   11,   11,   51,   11,   11,
+       52,   53,   54,   55,   56,   57,   58,   59,   60,   61,
+
+       62,   63,   64,   65,   66,   11,   67,   68,   69,   70,
+       71,   72,   11,   73,   74,   75,   76,   77,   78,   79,
+       80,   81,   82,   83,   84,   85,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -523,5 +524,5 @@
     } ;
 
-static yyconst flex_int32_t yy_meta[85] =
+static yyconst flex_int32_t yy_meta[86] =
     {   0,
         1,    1,    2,    1,    1,    1,    1,    1,    3,    1,
@@ -529,250 +530,254 @@
         6,    1,    7,    7,    7,    7,    7,    7,    1,    1,
         1,    8,    1,    1,    1,    9,    9,    9,    9,    9,
-        4,    4,   10,    4,   11,    4,    4,    4,   10,    4,
-        1,   12,    1,    1,   13,    1,    9,    9,    9,    9,
-        9,    9,    4,    4,    4,    4,   10,    4,    4,    4,
-       11,    4,    4,    4,   10,    4,    4,    4,    4,    4,
-        1,    1,    1,    1
+        9,    4,    4,   10,    4,   11,    4,    4,    4,   10,
+        4,    1,   12,    1,    1,   13,    1,    9,    9,    9,
+        9,    9,    9,    4,    4,    4,    4,   10,    4,    4,
+        4,   11,    4,    4,    4,   10,    4,    4,    4,    4,
+        4,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[1050] =
+static yyconst flex_int16_t yy_base[1062] =
     {   0,
-        0,   83, 2238, 2237,   93,    0,  175,  176,  177,  178,
-     2252, 2782,  189, 2782,  195,   54, 2782, 2197,   59,  171,
-     2782, 2782, 2782,   55,  186, 2782,  189,  187,  202,  214,
-      272,    0, 2213, 2782,  214, 2213,  150,  340,  153,  222,
-     2782,  157, 2782,  215,  224, 2782,  207,  181,  221,  249,
-      235,  289,  155,  255,  218,  206,  266,  256,  323,  259,
-      192, 2782,  223, 2782, 2210,  377,  342, 2782, 2220, 2782,
-     2187,  234, 2782,    0, 2782,  421,    0, 2782,  393, 2782,
-      399,  405, 2782,  492, 2184,  241, 2782, 2782, 2782, 2782,
-     2782, 2201, 2782, 2200, 2782, 2782, 2211,  552, 2782, 2226,
-
-     2782,  413,  393,  437,  493,  377,  318,  195,  430,  382,
-        0,  384,  321,  196,  427, 2782, 2782, 2782, 2194, 2782,
-     2782, 2782, 2193, 2192,  252,  302, 2206,  342,  435,  422,
-      381,  455,  400,  494, 2185,  440, 2133,  469, 2163, 2782,
-      276, 2782, 2782,  520, 2159, 2157, 2782, 2128,  414,  463,
-      470,  325,  254,  479,  432,  274,  480,  423,  483,  498,
-      492,  503,  499,  509,  341,  455,  484,  377,  510,  512,
-      517,  518,  529,  530,  531,  537, 2154,  541,  536,  544,
-      557,  546,  566,  569,  538,  552,  548,  554,  588,  571,
-      570,  580, 2782, 2782,  645,  651, 2202,  657, 2782,  663,
-
-     2782, 2152,  593, 2147, 2144,    0,  631, 2782, 2782,  669,
-     2141, 2140, 2139,    0, 2160,  629,  635,  639,  678,  677,
-      666,  670,  671,  674, 2138,  681,  682, 2115, 2114, 2782,
-        0,  597,  702,  678,  676, 2111, 2160, 2782,  693,    0,
-      710,  723,  743,  762,  788,  707, 2782, 2119, 2094,    0,
-      776, 2138,  768,  723, 2782, 2113, 2086,  809, 2782, 2782,
-     2118, 2782, 2782,  705,  710, 2098, 2097,  724, 2091, 2088,
-     2087,    0, 2086,    0, 2056,  709,  682,  707,  712,  710,
-      724,  647,  750,  671,  786,  751,  748,  731,  778,  787,
-      789,  788,  792,  790,  758, 2084,  796,  806,  800,  813,
-
-      798,  810,  802,  816,  822,  819,  815,  826,  830,  829,
-      831,  832,  833,  837,  839,  841,  846,  843, 2081,  848,
-      850,  849,  851,  852,  854,  853,  857,  855,  858,  863,
-      868, 2080,  867,  912,  871,  878,  872,  879,  882,  937,
-      939, 2076, 2074, 2071,    0, 2070,    0,  927,  931, 2069,
-        0, 2067,    0, 2064,    0, 2084, 2782,  913,  926, 2064,
-     2060,    0, 2057,    0, 2782,  942,  960,  953, 2782,  966,
-      981, 1005, 2053, 2782, 2782,  955,  968,  995,  968, 1028,
-      892, 1014,  970, 2782, 2782, 2049, 2047, 2045,    0, 2042,
-        0, 2040,    0, 2038,    0, 2782,  909,  944,  982,  943,
-
-     1006,  911, 1012,  923, 1013, 1019, 1009, 1016, 1023, 1024,
-     1020,  972, 1030, 1028,  989, 1026, 1034, 1027, 1039, 2038,
-     1044, 2035, 1048, 2034, 1049, 1051, 1052, 1053, 1056, 1057,
-     1055, 2033, 1059, 2031,  946, 1063, 1066, 1067, 1068, 1071,
-     1069, 2028, 1075, 2025, 1077, 1080, 1079, 1082, 1084, 1086,
-     1087, 1090, 1097, 1107, 1088, 1108, 1093, 1098, 2024, 1096,
-     1111, 1164, 2020,    0, 2018,    0, 2015,    0, 2012,    0,
-     1151, 2011,    0, 2010,    0, 2008, 2005, 2002,    0, 2001,
-        0, 1156, 2000, 1162, 1148, 1182, 1149, 1126, 1147, 2782,
-     1201, 1215, 1241, 2010, 1983, 1992, 1991,    0, 1990,    0,
-
-     1988,    0, 1985,    0, 1982,    0, 1981,    0, 1161, 1149,
-     1983, 1179, 1140, 1180, 1117, 1182, 1192, 1199, 1181, 1163,
-     1196, 1200, 1201, 1220, 1198, 1221, 1224,  604, 1226, 1227,
-     1231, 1233, 1234, 1981, 1244, 1236, 1978, 1240, 1241, 1246,
-     1247, 1243, 1975, 1250, 1251, 1253, 1254, 1974, 1255, 1267,
-     1973, 1264, 1271, 1256, 1263, 1257, 1971, 1275, 1277, 1279,
-     1260, 1281, 1290, 1285, 1288, 1968, 1289, 1291, 1967, 2015,
-     1961,    0, 1958,    0, 1957,    0, 1956,    0, 1954,    0,
-     1921,    0, 1919,    0, 1918,    0, 1336, 1342, 1369, 1353,
-     1915, 2782, 1359, 1307, 1359, 1309, 1912, 2782, 1911,    0,
-
-     1910,    0, 1908,    0, 1905,    0,    0,    0, 1905,    0,
-     1347, 1295, 1292, 1323, 1337, 1338, 1296, 1349, 1351, 1355,
-     1353, 1348, 1363, 1364, 1371, 1373, 1380, 1375, 1403, 1381,
-     1385, 1389, 1094, 1387, 1390, 1904, 1391, 1393, 1397, 1401,
-     1903, 1901, 1898, 1394, 1400, 1897, 1404, 1896, 1894, 1402,
-     1408, 1891, 1890, 1889, 1887, 1884, 1880, 1417, 1412, 1876,
-     1420, 1418, 1921, 2782, 1853,    0, 1852,    0,    0,    0,
-     1854,    0,    0,    0, 2782,    0,    0,    0,    0, 1463,
-     1849, 2782, 2782, 1469, 1846,    0, 1845,    0,    0,    0,
-        0, 1844, 1407, 1446, 1845, 1406, 1423, 1300, 1431, 1449,
-
-     1455, 1447, 1842, 1457, 1448, 1459, 1464, 1460, 1490, 1474,
-     1470, 1494, 1480, 1475, 1484, 1485, 1486, 1482, 1841, 1487,
-     1840, 1838, 1489, 1835, 1834, 1491, 1493, 1497, 1833, 1498,
-     1500,    0,    0,    0, 1828, 1825, 1824, 1548,    0, 1823,
-     1821, 1818, 1817, 1816, 1817, 1814, 1813, 1812, 1505, 1510,
-     1502, 1501, 1504, 1508, 1513, 1517, 1526, 1528, 1559, 1810,
-     1533, 1807, 1534, 1535, 1544, 1545, 1538, 1539, 1806, 1805,
-     1803, 1800, 1540, 1799, 1798, 1793, 1786, 1784, 1783, 1780,
-     1779, 1778, 1776, 1759, 1750, 1749, 1746, 1546, 1742, 1549,
-     1550, 1552, 1554, 1557, 1558, 1739, 1556, 1589, 1566, 1732,
-
-     1565, 1572, 1577, 1579, 1567, 1578, 1727, 1726, 1705, 1704,
-     1703, 1696, 1694, 1693, 1650, 1649, 1647, 1645, 1644, 1646,
-     1571, 1584, 1582, 1581, 1586, 1593, 1595, 1645, 1644, 1597,
-     1642, 1641, 1598, 1599, 1602, 1636, 1635, 1633, 1422, 1421,
-     1205, 1201,  946, 1605, 1610,  910, 1603, 1607,  768, 1613,
-     1618, 1619,  723,  605,  503,  370, 1609, 1620, 1623, 1624,
-     1625,  338,  337, 1627,  290,  251, 1630,  200,  196, 1631,
-     1632, 1637, 1633,  136, 2782, 1707, 1720, 1733, 1743, 1753,
-     1766, 1776, 1789, 1802, 1815, 1823, 1833, 1840, 1847, 1854,
-     1861, 1868, 1875, 1882, 1889, 1896, 1909, 1916, 1920, 1928,
-
-     1931, 1938, 1945, 1952, 1955, 1962, 1968, 1981, 1994, 2001,
-     2008, 2015, 2022, 2025, 2032, 2035, 2042, 2045, 2052, 2055,
-     2062, 2065, 2072, 2075, 2082, 2085, 2092, 2100, 2107, 2114,
-     2121, 2128, 2131, 2138, 2141, 2148, 2151, 2158, 2164, 2177,
-     2184, 2191, 2194, 2201, 2204, 2211, 2214, 2221, 2224, 2231,
-     2234, 2241, 2244, 2251, 2258, 2261, 2268, 2271, 2278, 2285,
-     2292, 2295, 2302, 2305, 2312, 2315, 2322, 2325, 2332, 2335,
-     2342, 2348, 2361, 2368, 2375, 2378, 2385, 2388, 2395, 2398,
-     2405, 2408, 2415, 2418, 2425, 2428, 2435, 2438, 2445, 2448,
-     2455, 2462, 2465, 2472, 2475, 2482, 2485, 2492, 2495, 2498,
-
-     2504, 2511, 2520, 2527, 2534, 2537, 2544, 2547, 2550, 2556,
-     2563, 2566, 2569, 2572, 2575, 2578, 2581, 2584, 2591, 2594,
-     2601, 2604, 2607, 2610, 2613, 2623, 2630, 2633, 2636, 2639,
-     2646, 2653, 2660, 2663, 2670, 2677, 2684, 2691, 2698, 2705,
-     2712, 2719, 2726, 2733, 2740, 2747, 2754, 2761, 2768
+        0,   84, 2272, 2269,   94,    0,  177,  178,  179,  180,
+     2285, 2822,  191, 2822,  197,   55, 2822, 2231,   60,  173,
+     2822, 2822, 2822,   56,  188, 2822,  191,  189,  204,  216,
+      275,    0, 2249, 2822,  216, 2247,  152,  344,  155,  220,
+     2822,  159, 2822,  217,  226, 2822,  185,  154,  212,  251,
+      237,  270,  235,  257,  241,  205,  193,  305,  314,  333,
+      238,  228, 2822,  225, 2822, 2242,  402,  390, 2822, 2253,
+     2822, 2221,  235, 2822,    0, 2822,  426,    0, 2822,  417,
+     2822,  439,  451, 2822,  498, 2219,  264, 2822, 2822, 2822,
+     2822, 2822, 2235, 2822, 2232, 2822, 2822, 2244,  559, 2822,
+
+     2261, 2822,  438,  444,  511,  534,  289,  253,  197,  380,
+      305,    0,  319,  280,  198,  322, 2822, 2822, 2822, 2230,
+     2822, 2822, 2822, 2227, 2224,  218,  255, 2239,  298,  350,
+      368,  312,  440,  398,  405, 2220,  441, 2168,  446, 2196,
+     2822,  335, 2822, 2822,  468, 2190, 2189, 2822, 2162,  439,
+      282,  433,  372,  281,  437,  434,  428,  570,  444,  466,
+      464,  469,  475,  321,  492,  438,  471,  445,  474,  512,
+      489,  503,  496,  521,  276,  515,  516, 2189,  526,  510,
+      519,  525,  543,  522,  560,  553,  523,  561,  551,  544,
+      599,  582,  593,  584, 2822, 2822,  660,  651, 2236,  666,
+
+     2822,  678, 2822, 2183,  607, 2179, 2178,    0,  693, 2822,
+     2822,  684, 2176, 2156, 2154,    0, 2177,  578,  608,  617,
+      654,  679,  650,  683,  684,  687, 2172,  690,  691, 2147,
+     2146, 2822,    0,  683,  710,  686,  700, 2145, 2196, 2822,
+      714,    0,  427,  746,  764,  786,  808,  621, 2822, 2152,
+     2125,    0,  794, 2171,  795,  709, 2822, 2147, 2121,  832,
+     2822, 2822, 2152, 2822, 2822,  711,  714, 2129, 2129,  717,
+     2125, 2123, 2120,    0, 2117,    0, 2088,  694,  679,  712,
+      709,  711,  698,  566,  726,  743,  771,  741,  790,  784,
+      800,  795,  742,  744,  814,  816,  818, 2118,  819,  745,
+
+      820,  821,  822,  823,  824,  746,  825,  748,  659,  831,
+      826,  833,  838,  839,  848,  850,  851,  844,  834,  857,
+     2116,  858,  859,  860,  862,  861,  864,  865,  867,  868,
+      866,  871,  876,  872,  878, 2113,  880,  689,  881,  882,
+      892,  896,  893,  953,  954, 2109, 2108, 2106,    0, 2103,
+        0,  941,  945, 2102,    0, 2101,    0, 2099,    0, 2118,
+     2822,  940,  941, 2094, 2088,    0, 2086,    0, 2822,  953,
+      975,  964, 2822,  981,  997, 1021, 2084, 2822, 2822,  939,
+      940, 1006,  982, 1041,  310, 1039, 1004, 2822, 2822, 2081,
+     2079, 2077,    0, 2074,    0, 2071,    0, 2070,    0, 2822,
+
+      886,  941,  960,  962,  977,  976,  980,  982, 1017, 1010,
+     1002,  998, 1022, 1031, 1028, 1033, 1034, 1037, 1040, 1043,
+     1038, 1041, 1053, 2072, 1055, 2070, 1045, 2067, 1056, 1061,
+     1063, 1065, 1066, 1067, 1070, 2064, 1071, 2063, 1073, 1074,
+     1075, 1078, 1080, 1081, 1085, 2062, 1087, 2060, 1084, 1089,
+     1091, 1097, 1099, 1092, 1102, 1103, 1105, 1106, 1108,  905,
+     1109, 1116, 1110, 1122, 2057, 1120, 1123, 1179, 2051,    0,
+     2050,    0, 2049,    0, 2047,    0, 1166, 2044,    0, 2041,
+        0, 2040, 2039, 2037,    0, 2034,    0, 1173, 2031, 1179,
+     1137, 1195, 1181, 1178, 1176, 2822, 1219, 1231, 1253, 2042,
+
+     2017, 2027, 2024,    0, 2021,    0, 2020,    0, 2019,    0,
+     2017,    0, 2014,    0, 1141, 1172, 2014, 1180, 1155, 1196,
+     1157, 1216, 1207, 1231, 1125, 1210, 1232, 1214, 1187, 1236,
+     1235, 1237, 1238, 1272, 1249, 1252, 1250, 1253, 1254, 2013,
+     1261, 1256, 2012, 1260, 1263, 1264, 1257, 2010, 1271, 1268,
+     1269, 1273, 2007, 1275, 1282, 2006, 1283, 1284, 2005, 1276,
+     1286, 1289, 2003, 1294, 1291, 1296, 1295, 1297, 1310, 2000,
+     1305, 1308, 1999, 1307, 1300, 1998, 2046, 1960,    0, 1958,
+        0, 1957,    0, 1954,    0, 1951,    0, 1950,    0, 1949,
+        0, 1947,    0, 1355, 1361, 1389, 1372, 1944, 2822, 1378,
+
+     1325, 1365, 1379, 1941, 2822, 1940,    0, 1939,    0, 1937,
+        0, 1934,    0,    0,    0, 1936,    0, 1366, 1312, 1311,
+     1341, 1323, 1368, 1369, 1374, 1356, 1383, 1372, 1388, 1390,
+     1393, 1395, 1396, 1398, 1400, 1431, 1406, 1407, 1411, 1408,
+     1413, 1414, 1935, 1409, 1416, 1419, 1933, 1930, 1929, 1422,
+     1424, 1928, 1429, 1926, 1923, 1425, 1430, 1919, 1915, 1911,
+     1895, 1894, 1893, 1436, 1433, 1891, 1439, 1440, 1938, 2822,
+     1884,    0, 1883,    0,    0,    0, 1884,    0,    0,    0,
+     2822,    0,    0,    0,    0, 1486, 1878, 2822, 2822, 1492,
+     1877,    0, 1876,    0,    0,    0,    0, 1874, 1447, 1444,
+
+     1874, 1449, 1471, 1479, 1450, 1480, 1482, 1469, 1873, 1486,
+     1490, 1488, 1502, 1452, 1510, 1504, 1491, 1519, 1506, 1498,
+     1508, 1512, 1513, 1514, 1515, 1872, 1870, 1517, 1867, 1866,
+     1518, 1520, 1523, 1865, 1521, 1525,    0,    0,    0, 1860,
+     1857, 1856, 1575,    0, 1855, 1853, 1850, 1849, 1848, 1849,
+     1846, 1845, 1844, 1531, 1536, 1527, 1528, 1552, 1533, 1537,
+     1539, 1555, 1557, 1569, 1842, 1560, 1839, 1561, 1559, 1568,
+     1572, 1567, 1573, 1838, 1837, 1835, 1828, 1574, 1826, 1825,
+     1819, 1818, 1817, 1815, 1798, 1789, 1788, 1785, 1778, 1775,
+     1768, 1766, 1576, 1768, 1577, 1581, 1580, 1579, 1584, 1585,
+
+     1747, 1586, 1615, 1590, 1746, 1591, 1592, 1602, 1600, 1594,
+     1606, 1742, 1735, 1733, 1732, 1690, 1689, 1686, 1685, 1683,
+     1682, 1678, 1677, 1674, 1676, 1607, 1611, 1614, 1612, 1608,
+     1616, 1620, 1675, 1623, 1624, 1530, 1453, 1630, 1625, 1629,
+     1438, 1354, 1319, 1318, 1267, 1212, 1210, 1208, 1631, 1636,
+     1178, 1639, 1635, 1643, 1177, 1644, 1646, 1650, 1126,  964,
+      937,  903, 1651, 1652, 1654, 1655, 1656, 1658,  788,  752,
+     1660,  607,  487, 1662, 1663,  394,  357, 1664, 1666, 1668,
+     1670, 1669, 1672, 1674,  233,  137, 2822, 1747, 1760, 1773,
+     1783, 1793, 1806, 1816, 1829, 1842, 1855, 1863, 1873, 1880,
+
+     1887, 1894, 1901, 1908, 1915, 1922, 1929, 1936, 1949, 1956,
+     1960, 1968, 1971, 1978, 1985, 1992, 1995, 2002, 2008, 2021,
+     2034, 2041, 2048, 2055, 2062, 2065, 2072, 2075, 2082, 2085,
+     2092, 2095, 2102, 2105, 2112, 2115, 2122, 2125, 2132, 2140,
+     2147, 2154, 2161, 2168, 2171, 2178, 2181, 2188, 2191, 2198,
+     2204, 2217, 2224, 2231, 2234, 2241, 2244, 2251, 2254, 2261,
+     2264, 2271, 2274, 2281, 2284, 2291, 2298, 2301, 2308, 2311,
+     2318, 2325, 2332, 2335, 2342, 2345, 2352, 2355, 2362, 2365,
+     2372, 2375, 2382, 2388, 2401, 2408, 2415, 2418, 2425, 2428,
+     2435, 2438, 2445, 2448, 2455, 2458, 2465, 2468, 2475, 2478,
+
+     2485, 2488, 2495, 2502, 2505, 2512, 2515, 2522, 2525, 2532,
+     2535, 2538, 2544, 2551, 2560, 2567, 2574, 2577, 2584, 2587,
+     2590, 2596, 2603, 2606, 2609, 2612, 2615, 2618, 2621, 2624,
+     2631, 2634, 2641, 2644, 2647, 2650, 2653, 2663, 2670, 2673,
+     2676, 2679, 2686, 2693, 2700, 2703, 2710, 2717, 2724, 2731,
+     2738, 2745, 2752, 2759, 2766, 2773, 2780, 2787, 2794, 2801,
+     2808
     } ;
 
-static yyconst flex_int16_t yy_def[1050] =
+static yyconst flex_int16_t yy_def[1062] =
     {   0,
-      875,    1,  876,  876,  875,    5,  877,  877,  878,  878,
-      875,  875,  875,  875,  875,  875,  875,  879,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,   31,  875,  875,  875,  875,  875,  875,  880,  879,
-      875,  875,  875,  875,  879,  875,  879,  879,  879,  879,
-      879,  879,  879,  879,  879,  879,  879,  879,  879,  879,
-      879,  875,  875,  875,  875,  875,  881,  875,  875,  875,
-      882,  875,  875,  883,  875,  875,  884,  875,  875,  875,
-      875,  875,  875,  875,  879,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  885,
-
-      875,   98,   30,  875,  875,  875,  875,  886,   30,  875,
-       31,  875,  875,   31,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  887,  875,
-      875,  875,  875,  879,  888,  889,  875,  875,  879,  879,
-      879,  879,  879,  879,  879,  879,  879,  879,  879,  879,
-      879,  879,  879,  879,  879,  879,  879,  879,  879,  879,
-      879,  879,  879,  879,  879,  879,  879,  879,  879,  879,
-      879,  879,  879,  879,  879,  879,  879,  879,  879,  879,
-      879,  879,  875,  875,  875,  881,  881,  881,  875,  881,
-
-      875,  882,  875,  890,  891,  883,  875,  875,  875,  875,
-      892,  893,  894,  884,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  895,  896,  875,
-       98,  875,  875,  875,  875,   98,  897,  875,  875,  103,
-      103,  875,  875,  875,  875,  875,  875,  875,  875,  898,
-      899,  900,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  887,  875,  901,  902,
-      903,  904,  905,  906,  875,  907,  907,  907,  907,  907,
-      907,  907,  907,  907,  907,  907,  907,  907,  907,  907,
-      907,  907,  907,  907,  907,  907,  907,  907,  907,  907,
-
-      907,  907,  907,  907,  907,  907,  907,  907,  907,  907,
-      907,  907,  907,  907,  907,  907,  907,  907,  907,  907,
-      907,  907,  907,  907,  907,  907,  907,  907,  907,  907,
-      907,  907,  907,  907,  907,  907,  907,  907,  907,  908,
-      909,  910,  911,  912,  913,  914,  915,  875,  875,  916,
-      917,  918,  919,  920,  921,  875,  875,  875,  875,  875,
-      922,  923,  924,  925,  875,  875,  875,  875,  875,  875,
-      875,  367,  372,  875,  875,  926,  927,  928,  875,  875,
-      875,  928,  875,  875,  875,  929,  930,  931,  932,  933,
-      934,  935,  936,  937,  938,  875,  939,  939,  939,  939,
-
-      939,  939,  939,  939,  939,  939,  939,  939,  939,  939,
-      939,  939,  939,  939,  939,  939,  939,  939,  939,  939,
-      939,  939,  939,  939,  939,  939,  939,  939,  939,  939,
-      939,  939,  939,  939,  939,  939,  939,  939,  939,  939,
-      939,  939,  939,  939,  939,  939,  939,  939,  939,  939,
-      939,  939,  939,  939,  939,  939,  939,  939,  939,  939,
-      939,  940,  941,  942,  943,  944,  945,  946,  947,  948,
-      875,  949,  950,  951,  952,  953,  953,  954,  955,  956,
-      957,  875,  482,  875,  958,  875,  958,  875,  875,  875,
-      875,  875,  875,  875,  875,  959,  960,  961,  962,  963,
-
-      964,  965,  966,  967,  968,  969,  970,  971,  972,  972,
-      972,  972,  972,  972,  972,  972,  972,  972,  972,  972,
-      972,  972,  972,  972,  972,  972,  972,  972,  972,  972,
-      972,  972,  972,  972,  972,  972,  972,  972,  972,  972,
-      972,  972,  972,  972,  972,  972,  972,  972,  972,  972,
-      972,  972,  972,  972,  972,  972,  972,  972,  972,  972,
-      972,  972,  972,  972,  972,  972,  972,  972,  972,  973,
-      974,  975,  976,  977,  978,  979,  980,  981,  982,  983,
-      984,  985,  986,  987,  988,  989,  875,  875,  875,  875,
-      990,  875,  589,  875,  875,  875,  593,  875,  991,  992,
-
-      993,  994,  995,  996,  997,  998,  999, 1000, 1001, 1002,
-     1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
-     1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
-     1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
-     1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
-     1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
-     1001, 1001, 1003,  875, 1004, 1005, 1006, 1007, 1008, 1009,
-     1010, 1011, 1012, 1013,  875, 1014, 1015, 1016, 1017,  875,
-      680,  875,  875,  875, 1018, 1019, 1020, 1021, 1022, 1023,
-     1024, 1025, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1027, 1028, 1029, 1030, 1031, 1032,  875, 1033, 1018,
-     1020, 1034, 1035, 1025, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1036, 1037, 1030, 1038, 1031,
-     1039, 1032, 1040, 1041, 1034, 1042, 1035, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-
-     1026, 1026, 1026, 1026, 1026, 1026, 1043, 1036, 1044, 1037,
-     1045, 1038, 1046, 1039, 1047, 1040, 1048, 1041, 1042, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1049, 1043, 1044, 1045, 1046,
-     1020, 1047, 1048, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1049, 1020, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
-     1026, 1026, 1026, 1026,    0,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875
+      887,    1,  888,  888,  887,    5,  889,  889,  890,  890,
+      887,  887,  887,  887,  887,  887,  887,  891,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,   31,  887,  887,  887,  887,  887,  887,  892,  891,
+      887,  887,  887,  887,  891,  887,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  887,  887,  887,  887,  887,  893,  887,  887,
+      887,  894,  887,  887,  895,  887,  887,  896,  887,  887,
+      887,  887,  887,  887,  887,  891,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      897,  887,   99,   30,  887,  887,  887,  887,  898,   30,
+      887,   31,  887,  887,   31,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  899,
+      887,  887,  887,  887,  891,  900,  901,  887,  887,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  887,  887,  887,  893,  893,  893,
+
+      887,  893,  887,  894,  887,  902,  903,  895,  887,  887,
+      887,  887,  904,  905,  906,  896,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  907,
+      908,  887,   99,  887,  887,  887,  887,   99,  909,  887,
+      887,  104,  104,  887,  887,  887,  887,  887,  887,  887,
+      887,  910,  911,  912,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  899,  887,
+      913,  914,  915,  916,  917,  918,  887,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
+      919,  919,  919,  920,  921,  922,  923,  924,  925,  926,
+      927,  887,  887,  928,  929,  930,  931,  932,  933,  887,
+      887,  887,  887,  887,  934,  935,  936,  937,  887,  887,
+      887,  887,  887,  887,  887,  371,  376,  887,  887,  938,
+      939,  940,  887,  887,  887,  940,  887,  887,  887,  941,
+      942,  943,  944,  945,  946,  947,  948,  949,  950,  887,
+
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
+      951,  951,  951,  951,  951,  951,  951,  952,  953,  954,
+      955,  956,  957,  958,  959,  960,  887,  961,  962,  963,
+      964,  965,  965,  966,  967,  968,  969,  887,  488,  887,
+      970,  887,  970,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  971,  972,  973,  974,  975,  976,  977,  978,  979,
+      980,  981,  982,  983,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
+      984,  984,  984,  984,  984,  984,  985,  986,  987,  988,
+      989,  990,  991,  992,  993,  994,  995,  996,  997,  998,
+      999, 1000, 1001,  887,  887,  887,  887, 1002,  887,  596,
+
+      887,  887,  887,  600,  887, 1003, 1004, 1005, 1006, 1007,
+     1008, 1009, 1010, 1011, 1012, 1013, 1014, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1015,  887,
+     1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025,
+      887, 1026, 1027, 1028, 1029,  887,  686,  887,  887,  887,
+     1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1038,
+
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1039, 1040, 1041, 1042,
+     1043, 1044,  887, 1045, 1030, 1032, 1046, 1047, 1037, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1048, 1049, 1042, 1050, 1043, 1051, 1044, 1052, 1053, 1046,
+     1054, 1047, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1055, 1048, 1056, 1049, 1057, 1050, 1058, 1051, 1059,
+     1052, 1060, 1053, 1054, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1061, 1055, 1056, 1057, 1058, 1032, 1059, 1060, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1061, 1032, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
+     1038, 1038, 1038, 1038, 1038, 1038,    0,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887
     } ;
 
-static yyconst flex_int16_t yy_nxt[2867] =
+static yyconst flex_int16_t yy_nxt[2908] =
     {   0,
        12,   13,   14,   15,   15,   15,   13,   16,   17,   12,
@@ -780,318 +785,323 @@
        28,   29,   30,   31,   32,   32,   32,   32,   33,   34,
        35,   36,   37,   38,   39,   18,   18,   18,   18,   18,
-       18,   18,   40,   18,   18,   18,   18,   18,   40,   18,
-       41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
-       51,   52,   53,   18,   54,   18,   55,   18,   18,   18,
-       18,   56,   57,   58,   59,   60,   61,   18,   18,   18,
-       62,   63,   64,   65,   66,   83,   91,   84,   84,   66,
-       87,   88,   67,   70,   70,   70,   70,   70,   70,   70,
-
-       70,   70,   70,   71,   70,   70,   70,   70,   70,   70,
-       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
-       70,   70,   70,   70,   70,   70,   70,   70,   71,   71,
+       18,   18,   18,   40,   18,   18,   18,   18,   18,   40,
+       18,   41,   42,   43,   44,   45,   46,   47,   48,   49,
+       50,   51,   52,   53,   18,   54,   18,   55,   18,   18,
+       56,   18,   57,   58,   59,   60,   61,   62,   18,   18,
+       18,   63,   64,   65,   66,   67,   84,   92,   85,   85,
+       67,   88,   89,   68,   71,   71,   71,   71,   71,   71,
+
+       71,   71,   71,   71,   72,   71,   71,   71,   71,   71,
        71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
-       71,   71,   71,   70,   72,   70,   70,   71,   73,   71,
-       71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
-       71,   71,   71,   71,   71,   71,   71,   71,   71,   71,
-       71,   71,   71,   70,   70,   70,   70,   75,   75,   78,
-       78,  122,  123,   89,  140,   78,   78,   86,   75,   75,
-       79,   80,   81,   81,   81,   79,   81,   80,   82,   82,
-
-       82,   81,   90,   92,  141,  145,   86,   97,   94,   98,
-       98,   98,   98,   98,   98,  250,  875,   93,   99,   84,
-       95,   96,   84,  100,  176,  117,   76,   76,   76,   76,
-      142,  146,   86,  101,  102,  143,  103,  103,  103,  103,
-      104,  104,  118,   86,  119,  120,  147,   86,  148,  252,
-      258,   86,  160,  105,  193,  192,  106,   86,   86,  149,
-      150,  151,  107,  108,  152,  153,  181,  154,  109,   86,
-      155,  156,   86,   86,  105,   86,  144,  161,  157,  158,
-      110,  159,  204,  261,  162,  262,   86,  179,  107,  228,
-      163,  108,  102,  180,  111,  111,  111,  111,  111,  111,
-
-       86,  168,   86,  169,  194,   86,   86,   86,  205,  164,
-       86,  105,  170,  165,  112,  229,  177,   86,  166,  186,
-      113,  281,  167,  178,  269,   86,  114,  187,  191,  182,
-      183,  142,  105,  261,  188,  262,  143,  284,  115,  184,
-       86,   86,  185,  198,  199,  171,  113,  124,  198,  189,
-      270,  125,  126,  172,  127,  173,  128,  129,  174,  130,
-      248,  131,  175,  256,  200,  200,  200,  200,  200,  200,
-      132,  133,  134,  261,   86,  262,   86,  144,  195,   80,
-       81,   81,   81,  195,  249,  280,  196,  257,   86,   86,
-      135,  190,   86,  136,   79,   80,   81,   81,   81,   79,
-
-       81,   80,   81,   81,   81,   81,   81,   80,   82,   82,
-       82,   81,  261,  305,  262,  240,  240,  240,  240,  246,
-      137,  138,  207,  208,  875,  247,  254,  207,   86,  209,
-      247,  261,  255,  262,  209,   98,   98,   98,   98,   98,
-       98,  263,  875,  210,  210,  210,  210,  241,  246,  308,
-      875,  247,  263,  261,  209,  262,  247,  102,  255,  104,
-      104,  104,  104,  104,  104,   86,  261,  239,  262,  211,
-      875,  261,  209,  262,   86,  255,  105,  209,  209,  875,
-      276,  209,  209,   86,  253,  264,  261,  277,  262,  209,
-      296,  242,  209,  254,  209,  212,  209,  105,  213,  215,
-
-      261,  255,  262,  216,  217,  283,   86,  875,  218,  219,
-      243,  220,  243,  221,   86,  244,  244,  244,  244,  244,
-      244,   86,  222,  223,  224,  261,  265,  262,  142,  306,
-       86,   86,  278,  143,   86,   86,  285,  286,  287,  279,
-      288,  289,  225,   86,  290,  226,  291,  245,  282,   86,
-       86,  292,  293,  294,   86,  295,  297,  875,  298,  301,
-       86,   86,  307,   86,  299,  300,  309,  303,   86,   86,
-      304,   86,  302,  227,  231,  231,  231,  231,  231,  231,
-       86,   86,   86,  312,  310,  311,  313,   86,   86,   86,
-      232,  233,   86,  234,  235,   86,  142,   86,  314,   86,
-
-      321,  315,  330,   86,  320,   86,  236,  318,   86,  316,
-      317,  232,  233,  232,  319,  325,  234,   86,  235,  322,
-       86,   86,   86,  331,  333,  328,  332,  629,  326,  323,
-      324,   86,  207,  208,  337,  335,  338,  207,  365,   86,
-      329,  342,  334,  336,  339,  327,  195,   80,   81,   81,
-       81,  195,  198,  199,  196,   86,   86,  198,  198,  199,
-      356,  365,  357,  198,  340,  199,  356,  343,  357,  340,
-      356,  341,  357,  200,  200,  200,  200,  200,  200,  200,
-      200,  200,  200,  200,  200,  200,  200,  200,  200,  200,
-      200,  348,  348,  348,  348,  357,  357,  356,   86,  357,
-
-      358,  356,  356,  357,  357,  356,  359,  357,  356,  356,
-      357,  357,  356,  356,  357,  357,  369,  365,  403,  366,
-      369,  366,   86,  349,  367,  367,  367,  367,  367,  367,
-      875,  232,  233,   86,  234,  235,  261,  369,  262,  369,
-      365,  261,  405,  262,  369,  104,  104,  104,  104,  104,
-      104,  398,  232,  233,  232,  374,  368,  234,   86,  235,
-       86,   86,  105,   86,  371,  244,  244,  244,  244,  244,
-      244,  384,  386,  397,   86,   86,  399,  253,  401,  400,
-      402,  374,   86,  105,  372,  372,  372,  372,  372,  372,
-      104,  104,  104,  104,  104,  104,  377,  384,  387,   86,
-
-      232,   86,   86,  234,  235,  243,  404,  243,  411,   86,
-      244,  244,  244,  244,  244,  244,  373,  410,  379,   86,
-      380,  232,  253,  232,  381,  409,  234,  419,  235,   86,
-      382,  111,  111,  111,  111,  111,  111,   86,   86,   86,
-       86,   86,  383,   86,  412,  415,  380,   86,  416,   86,
-      381,   86,  406,   86,  413,  414,  417,   86,  407,  408,
-      422,   86,  421,  258,   86,  420,   86,   86,  418,  424,
-       86,  423,  428,   86,  426,  427,  430,   86,  429,  425,
-       86,   86,   86,   86,   86,  431,  432,  433,   86,  437,
-       86,  435,   86,  438,   86,  439,  434,   86,  436,   86,
-
-       86,   86,   86,   86,   86,   86,   86,  443,   86,   86,
-      444,  441,  440,  446,   86,  442,  445,  451,   86,   86,
-      142,  450,   86,   86,  447,  449,  448,  456,  452,   86,
-       86,  459,  453,   86,  494,  460,  454,  455,  340,  199,
-      457,  199,  458,  340,  356,  341,  357,  197,  461,  209,
-      209,  209,  209,  348,  348,  348,  348,  356,  495,  357,
-       86,   86,   86,   86,  367,  367,  367,  367,  367,  367,
-      366,  509,  366,  514,   86,  367,  367,  367,  367,  367,
-      367,  471,  482,  482,  482,  482,  482,  482,  231,  231,
-      231,  231,  231,  231,   86,   86,  516,   86,  232,  486,
-
-      875,  234,  235,  240,  240,  240,  240,  104,  104,  487,
-      489,  510,  486,  512,  483,  377,  490,  545,  490,  232,
-      370,  232,  488,   86,  234,  486,  235,  372,  372,  372,
-      372,  372,  372,   86,  875,  371,  489,  379,  486,  380,
-       86,  525,  490,  381,  490,  491,  529,  491,  511,  382,
-      492,  492,  492,  492,  492,  492,  379,   86,  380,  373,
-       86,  383,  381,   86,   86,  380,  513,   86,  496,  381,
-       86,   86,  515,  517,   86,   86,  519,   86,   86,   86,
-      383,   86,  493,  518,  380,   86,  526,  521,  381,  520,
-       86,  522,  523,  524,  527,   86,  531,  532,  530,   86,
-
-       86,  528,   86,   86,   86,  533,   86,   86,   86,  534,
-       86,  535,  538,  541,   86,  543,  539,   86,   86,   86,
-       86,  536,   86,  542,  537,  544,   86,  540,   86,  551,
-       86,   86,  547,   86,  549,   86,  546,   86,   86,   86,
-      548,   86,  550,  552,   86,   86,  558,   86,   86,   86,
-      555,  553,  554,  556,  560,  561,  559,  557,   86,   86,
-      567,  566,   86,  716,  563,  562,  199,  564,   86,  568,
-      486,  569,  570,  209,  209,  209,  209,  565,  482,  482,
-      482,  482,  482,  482,  372,  372,  372,  372,  372,  372,
-      616,   86,  486,  486,  232,  592,  486,  234,  235,  588,
-
-       86,  588,  487,  591,  589,  589,  589,  589,  589,  589,
-      483,  614,   86,  612,   86,  232,  484,  232,  486,  486,
-      234,  592,  235,  492,  492,  492,  492,  492,  492,  611,
-       86,   86,   86,   86,  621,  620,  590,  593,  593,  593,
-      593,  593,  593,   86,  615,  613,  617,   86,  618,   86,
-       86,   86,   86,  594,  626,  875,  595,  596,  491,  856,
-      491,  619,  622,  492,  492,  492,  492,  492,  492,  597,
-      623,   86,   86,  624,  594,   86,  594,   86,   86,  595,
-      625,  596,   86,  627,   86,   86,  630,   86,  628,  635,
-      634,   86,   86,  633,   86,   86,  636,   86,   86,  632,
-
-      631,   86,   86,  641,   86,   86,   86,   86,   86,  638,
-      642,   86,  639,  640,   86,   86,  644,  637,   86,  643,
-      645,  646,   86,  647,  648,  652,   86,  651,   86,  650,
-       86,  649,   86,  656,  653,  658,   86,  655,  654,   86,
-       86,   86,   86,   86,  657,  659,   86,   86,  682,  660,
-      682,   86,  696,  695,  700,  662,  749,  661,  482,  482,
-      482,  482,  482,  482,  589,  589,  589,  589,  589,  589,
-      588,  682,  588,  682,   86,  589,  589,  589,  589,  589,
-      589,  593,  593,  593,  593,  593,  593,  697,   86,   86,
-      587,  680,  680,  680,  680,  680,  680,  683,   86,   86,
-
-       86,  683,   86,  693,   86,  698,   86,  594,  701,  703,
-      595,  596,  699,  597,   86,   86,  694,  704,  683,  702,
-      683,  705,   86,  681,   86,  683,   86,  712,  594,  706,
-      594,   86,   86,  595,  710,  596,   86,  707,   86,  708,
-       86,   86,   86,  711,   86,   86,  709,  713,   86,  715,
-      718,   86,   86,   86,   86,   86,  714,   86,   86,   86,
-      717,  722,  726,   86,  719,  723,  727,  720,   86,   86,
-      721,   86,  725,  729,   86,  875,  875,  728,  724,  745,
-      730,  748,   86,  747,  731,  680,  680,  680,  680,  680,
-      680,  593,  593,  593,  593,  593,  593,   86,   86,   86,
-
-       86,  594,  750,  751,  595,  596,   86,  746,   86,  752,
-       86,   86,  755,  759,  754,   86,  753,  681,  757,  756,
-      762,   86,  594,  684,  594,   86,   86,  595,  760,  596,
-      761,   86,  758,   86,  763,   86,   86,   86,   86,  764,
-       86,   86,   86,  765,   86,   86,  766,  769,   86,   86,
-      767,   86,   86,   86,  768,   86,   86,  774,  790,   86,
-      775,   86,  771,  770,   86,  792,  772,  791,   86,  773,
-      680,  680,  680,  680,  680,  680,  788,   86,  789,   86,
-      796,  794,  793,  798,   86,   86,   86,  799,  800,   86,
-       86,   86,  797,  801,  795,   86,   86,   86,  802,  803,
-
-       86,   86,  738,   86,  804,   86,  823,   86,   86,   86,
-       86,  825,  826,  805,  806,  828,   86,   86,   86,  822,
-      829,  821,   86,   86,  820,  827,  831,  824,   86,   86,
-       86,  832,   86,   86,  834,   86,  846,   86,  830,  833,
-       86,  847,  845,  844,   86,  835,   86,  849,   86,   86,
-       86,  851,  852,   86,   86,  848,   86,  859,   86,  853,
-       86,   86,  854,  850,   86,  857,  858,  861,  860,   86,
-       86,   86,  862,  863,   86,   86,   86,  866,   86,  868,
-      864,   86,   86,   86,   86,  867,  865,  875,   86,  875,
-      855,  871,   86,   86,  874,   86,   86,   86,  875,  875,
-
-      869,  843,  870,  875,  842,  872,  873,   68,   68,   68,
-       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
-       74,   74,   74,   74,   74,   74,   74,   74,   74,   74,
-       74,   74,   74,   77,   77,   77,   77,   77,   77,   77,
-       77,   77,   77,   77,   77,   77,   85,  875,  840,   85,
-      875,   85,   85,   85,   85,   85,  139,  839,  875,  838,
-      139,  139,  139,  139,  139,  139,  197,  197,  197,  197,
-      197,  197,  197,  197,  197,  197,  197,  197,  197,  202,
-      875,  837,  202,   86,  202,  202,  202,  202,  202,  206,
-       86,  206,  206,   86,  206,  206,  206,  206,  206,  206,
-
-      875,  206,  214,  819,  875,  214,  214,  214,  214,  214,
-      214,  214,  214,  818,  214,  237,  237,  237,  237,  237,
-      237,  237,  237,  237,  237,  237,  237,  237,  251,  251,
-      816,  251,  875,  814,  875,  251,  267,  812,  875,  267,
-      810,  267,  267,  267,  267,  267,  271,  808,  271,   86,
-       86,   86,  271,  273,   86,  273,   86,   86,   86,  273,
-      344,   86,  344,   86,   86,   86,  344,  346,   86,  346,
-      875,  787,  785,  346,  350,  875,  350,  875,  782,  780,
-      350,  352,  778,  352,   86,   86,   86,  352,  354,   86,
-      354,   86,   86,   86,  354,  361,   86,  361,  744,  741,
-
-      740,  361,  363,  738,  363,  203,  734,  733,  363,  237,
-      237,  237,  237,  237,  237,  237,  237,  237,  237,  237,
-      237,  237,  376,  664,  376,  378,  378,   86,  378,  378,
-      378,   86,  378,  251,  251,   86,  251,  388,   86,  388,
-       86,   86,   86,  388,  390,   86,  390,   86,   86,   86,
-      390,  392,   86,  392,   86,   86,   86,  392,  271,  691,
-      271,  394,  690,  394,  688,  686,  684,  394,  273,  591,
-      273,   85,  679,  678,   85,  676,   85,   85,   85,   85,
-       85,  197,  197,  197,  197,  197,  197,  197,  197,  197,
-      197,  197,  197,  197,  462,  462,  462,  462,  462,  462,
-
-      462,  462,  462,  462,  462,  462,  462,  463,  674,  463,
-      672,  670,  668,  463,  465,  666,  465,  664,   86,   86,
-      465,  467,   86,  467,   86,   86,   86,  467,  344,   86,
-      344,  469,   86,  469,   86,  610,  608,  469,  346,  606,
-      346,  472,  604,  472,  602,  600,  496,  472,  350,  598,
-      350,  474,  598,  474,  587,  586,  584,  474,  352,  477,
-      352,  476,  477,  476,  582,  580,  578,  476,  354,  576,
-      354,  478,  574,  478,  572,   86,   86,  478,  361,   86,
-      361,  480,   86,  480,   86,   86,   86,  480,  363,   86,
-      363,  485,  508,  485,  506,  485,  504,  485,  376,  502,
-
-      376,  500,  376,  498,  376,  378,  378,  484,  378,  378,
-      378,  481,  378,  497,  479,  497,  357,  357,  477,  497,
-      499,  475,  499,  473,  470,  468,  499,  501,  466,  501,
-      464,   86,   86,  501,  388,   86,  388,  503,  396,  503,
-      395,  393,  391,  503,  390,  389,  390,  505,  268,  505,
-      263,  262,  385,  505,  392,  385,  392,  507,  250,  507,
-      375,  375,  238,  507,  394,  370,  394,   85,  364,  362,
-       85,  360,   85,   85,   85,   85,   85,  462,  462,  462,
-      462,  462,  462,  462,  462,  462,  462,  462,  462,  462,
-      571,  356,  571,  355,  353,  351,  571,  463,  347,  463,
-
-      573,  345,  573,  203,  199,   86,  573,  465,  275,  465,
-      575,  274,  575,  272,  268,  263,  575,  467,  266,  467,
-      577,  263,  577,  261,  260,  259,  577,  469,  238,  469,
-      579,  230,  579,   84,   84,   86,  579,  472,  203,  472,
-      581,  201,  581,   84,  121,  116,  581,  474,   86,  474,
-      476,  875,  476,   69,   69,  875,  476,  583,  875,  583,
-      875,  875,  875,  583,  478,  875,  478,  585,  875,  585,
-      875,  875,  875,  585,  480,  875,  480,  485,  875,  485,
-      875,  485,  875,  485,  378,  875,  378,  875,  875,  875,
-      378,  599,  875,  599,  875,  875,  875,  599,  497,  875,
-
-      497,  601,  875,  601,  875,  875,  875,  601,  499,  875,
-      499,  603,  875,  603,  875,  875,  875,  603,  501,  875,
-      501,  605,  875,  605,  875,  875,  875,  605,  503,  875,
-      503,  607,  875,  607,  875,  875,  875,  607,  505,  875,
-      505,  609,  875,  609,  875,  875,  875,  609,  507,  875,
-      507,   85,  875,  875,   85,  875,   85,   85,   85,   85,
-       85,  663,  663,  663,  663,  663,  663,  663,  663,  663,
-      663,  663,  663,  663,  665,  875,  665,  875,  875,  875,
-      665,  571,  875,  571,  667,  875,  667,  875,  875,  875,
-      667,  573,  875,  573,  669,  875,  669,  875,  875,  875,
-
-      669,  575,  875,  575,  671,  875,  671,  875,  875,  875,
-      671,  577,  875,  577,  673,  875,  673,  875,  875,  875,
-      673,  579,  875,  579,  675,  875,  675,  875,  875,  875,
-      675,  581,  875,  581,  677,  875,  677,  875,  875,  875,
-      677,  583,  875,  583,   85,  875,   85,  875,  875,  875,
-       85,  585,  875,  585,  485,  875,  485,  875,  875,  875,
-      485,  685,  875,  685,  875,  875,  875,  685,  599,  875,
-      599,  687,  875,  687,  875,  875,  875,  687,  601,  875,
-      601,  689,  875,  689,  875,  875,  875,  689,  603,  875,
-      603,  139,  875,  139,  875,  875,  875,  139,  605,  875,
-
-      605,  692,  875,  692,  607,  875,  607,   85,  875,  875,
-       85,  875,   85,   85,   85,   85,   85,  609,  875,  609,
-      663,  663,  663,  663,  663,  663,  663,  663,  663,  663,
-      663,  663,  663,  732,  875,  732,  875,  875,  875,  732,
-      665,  875,  665,  202,  875,  202,  875,  875,  875,  202,
-      667,  875,  667,  735,  875,  735,  669,  875,  669,  202,
-      875,  875,  202,  875,  202,  202,  202,  202,  202,  671,
-      875,  671,  736,  875,  736,  673,  875,  673,  675,  875,
-      675,  737,  875,  737,  677,  875,  677,   85,  875,   85,
-      739,  875,  739,  875,  875,  875,  739,  685,  875,  685,
-
-      267,  875,  267,  875,  875,  875,  267,  687,  875,  687,
-      742,  875,  742,  689,  875,  689,  139,  875,  139,  743,
-      875,  743,  875,  875,  875,  743,   85,  875,  875,   85,
-      875,   85,   85,   85,   85,   85,  776,  875,  776,  732,
-      875,  732,  202,  875,  202,  777,  875,  777,  875,  875,
-      875,  777,  779,  875,  779,  875,  875,  875,  779,  781,
-      875,  781,  875,  875,  875,  781,  783,  875,  783,  784,
-      875,  784,  875,  875,  875,  784,  786,  875,  786,  875,
-      875,  875,  786,  807,  875,  807,  875,  875,  875,  807,
-      809,  875,  809,  875,  875,  875,  809,  811,  875,  811,
-
-      875,  875,  875,  811,  813,  875,  813,  875,  875,  875,
-      813,  815,  875,  815,  875,  875,  875,  815,  817,  875,
-      817,  875,  875,  875,  817,  609,  875,  609,  875,  875,
-      875,  609,  836,  875,  836,  875,  875,  875,  836,  671,
-      875,  671,  875,  875,  875,  671,  675,  875,  675,  875,
-      875,  875,  675,   85,  875,   85,  875,  875,  875,   85,
-      841,  875,  841,  875,  875,  875,  841,  139,  875,  139,
-      875,  875,  875,  139,  202,  875,  202,  875,  875,  875,
-      202,   11,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875
+       71,   71,   71,   71,   71,   71,   71,   71,   71,   72,
+       72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   71,   73,   71,   71,   72,
+       74,   72,   72,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   72,   72,   72,   72,   72,
+       72,   72,   72,   72,   72,   71,   71,   71,   71,   76,
+       76,   79,   79,  123,  124,   90,  141,   79,   79,   87,
+       76,   76,   80,   81,   82,   82,   82,   80,   82,   81,
+
+       83,   83,   83,   82,   91,   93,   87,  142,  146,   98,
+       95,   99,   99,   99,   99,   99,   99,  252,  887,   94,
+      100,   85,   96,   97,   85,  101,  161,  118,  143,   77,
+       77,   77,   77,  144,  147,  102,  103,   87,  104,  104,
+      104,  104,  105,  105,  119,   87,  120,  121,  148,  263,
+      149,  264,  254,  260,  183,  106,  195,   87,  159,  107,
+      160,  150,  151,  152,   87,  108,  109,  153,  154,  162,
+      155,  110,   87,  156,  157,  145,  163,  106,   87,  182,
+       87,  158,  164,  111,  206,   87,  263,   87,  264,   87,
+       87,  108,  194,   87,  109,  103,  250,  112,  112,  112,
+
+      112,  112,  112,   87,  169,  177,  170,  196,  193,   87,
+      207,  180,  165,  230,  106,  171,  166,  181,  113,  178,
+      251,  167,   87,  258,  114,  168,  179,  172,   87,  263,
+      115,  264,  248,   87,   87,  173,  106,  174,  249,  231,
+      175,  143,  116,  263,  176,  264,  144,  259,  317,  283,
+      114,  125,  280,  500,  249,  126,  127,   87,  128,  191,
+      129,  130,  256,  131,  249,  132,   87,  265,  257,  184,
+      185,  257,  248,   87,  133,  134,  135,  501,  188,  186,
+      249,  263,  187,  264,  271,   87,  189,  265,  145,  256,
+      305,  200,  201,  190,  257,  136,  200,  257,  137,  263,
+
+      887,  264,  192,  197,   81,   82,   82,   82,  197,   87,
+      272,  198,  202,  202,  202,  202,  202,  202,   80,   81,
+       82,   82,   82,   80,   87,  138,  139,  209,  210,  263,
+      887,  264,  209,  282,  211,  255,  263,  267,  264,  211,
+       82,   81,   82,   82,   82,   82,   87,  887,  212,  212,
+      212,  212,   82,   81,   83,   83,   83,   82,  887,  211,
+       99,   99,   99,   99,   99,   99,  242,  242,  242,  242,
+      266,  263,  263,  264,  264,  213,  143,  263,  211,  264,
+       87,  144,  375,  211,  211,   87,   87,  211,  211,   87,
+       87,   87,  286,  241,  887,  211,   87,   87,  211,  243,
+
+      211,  214,  211,  281,  215,  217,  278,  284,  285,  218,
+      219,  307,  298,  279,  220,  221,   87,  222,   87,  223,
+       87,   87,  887,   87,  309,  300,   87,   87,  224,  225,
+      226,  103,  303,  105,  105,  105,  105,  105,  105,   87,
+      299,   87,  301,  302,   87,  304,  308,  310,   87,  227,
+      106,  245,  228,  245,  306,   87,  246,  246,  246,  246,
+      246,  246,   87,  313,   87,  315,  244,   87,   87,  311,
+      314,   87,  106,   87,   87,   87,  323,   87,   87,  322,
+      229,  233,  233,  233,  233,  233,  233,  312,  333,  247,
+      319,  316,  328,  320,  318,   87,   87,  234,  235,  236,
+
+      321,  237,  236,   87,  324,   87,  325,  143,  335,  360,
+      331,  361,   87,   87,  238,  337,  326,  327,   87,  236,
+      235,  236,   87,  329,  237,  332,  236,  287,  288,  289,
+      336,  290,  291,  334,   87,  292,   87,  293,  407,  360,
+      330,  361,  294,  295,  296,   87,  297,  339,  360,  343,
+      361,   87,  200,  201,  338,  340,  346,  200,  341,   87,
+      342,  197,   81,   82,   82,   82,  197,  200,  201,  198,
+      378,  361,  200,  202,  202,  202,  202,  202,  202,  344,
+      201,  360,  347,  361,  344,  360,  345,  361,  202,  202,
+      202,  202,  202,  202,  209,  210,  378,  143,  361,  209,
+
+      202,  202,  202,  202,  202,  202,  352,  352,  352,  352,
+      360,   87,  361,  362,  360,  360,  361,  361,  360,  363,
+      361,  360,  360,  361,  361,  369,  369,  370,  369,  370,
+      435,   87,  371,  371,  371,  371,  371,  371,  373,  353,
+      373,   87,  263,  373,  264,  263,   87,  264,  369,  402,
+       87,  369,  234,  235,  236,  406,  237,  236,  388,  401,
+      373,   87,  373,   87,   87,  372,  390,  373,  105,  105,
+      105,  105,  105,  105,  236,  235,  236,  404,   87,  237,
+      405,  236,  403,  408,  388,  106,  246,  246,  246,  246,
+      246,  246,  391,   87,   87,   87,   87,   87,   87,  419,
+
+       87,  255,  425,  432,   87,  420,  434,  106,  376,  376,
+      376,  376,  376,  376,  381,  409,  413,  105,  105,  105,
+      105,  105,  105,   87,  234,  245,  236,  245,  237,  236,
+      246,  246,  246,  246,  246,  246,   87,  383,  410,  384,
+       87,  377,   87,  385,  411,  412,  236,   87,  236,  386,
+      255,  237,   87,  236,  112,  112,  112,  112,  112,  112,
+      414,  387,  415,  417,  418,  384,   87,  416,   87,  385,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,  421,
+      427,  426,  433,   87,  437,   87,   87,  260,  423,  424,
+       87,   87,  436,  429,  428,  422,   87,  430,  431,  439,
+
+       87,  438,   87,   87,  446,  441,  440,  442,  443,   87,
+       87,   87,   87,   87,   87,  445,   87,   87,   87,   87,
+       87,  448,  447,   87,   87,  444,  449,  451,   87,  456,
+       87,  450,   87,   87,   87,  452,  455,  454,   87,  453,
+      457,  462,  460,  461,   87,   87,  458,  464,   87,  515,
+      459,  463,  465,  466,  344,  201,  201,   87,  887,  344,
+      467,  345,  199,  211,  211,  211,  211,  352,  352,  352,
+      352,  360,  360,  361,  361,  371,  371,  371,  371,  371,
+      371,  370,  569,  370,  492,  492,  371,  371,  371,  371,
+      371,  371,  887,   87,  493,  494,  477,  488,  488,  488,
+
+      488,  488,  488,  233,  233,  233,  233,  233,  233,  516,
+      492,  492,   87,  234,   87,  236,   87,  237,  236,  242,
+      242,  242,  242,  105,  105,  495,  381,  517,   87,   87,
+      489,  496,   87,  518,   87,  236,  374,  236,  519,  520,
+      237,  521,  236,  376,  376,  376,  376,  376,  376,  383,
+       87,  384,  375,  496,   87,  385,  522,  496,  497,  887,
+      497,  386,   87,  498,  498,  498,  498,  498,  498,   87,
+      525,  495,  526,  387,   87,  524,  377,  384,  523,  496,
+       87,  385,  383,   87,  384,   87,   87,  527,  385,   87,
+       87,  532,   87,   87,  502,   87,  499,   87,  535,  528,
+
+      529,  537,  530,  531,  533,   87,  387,   87,   87,  541,
+      384,  534,  538,   87,  385,   87,  536,   87,   87,   87,
+      539,  540,   87,   87,  546,   87,   87,   87,  544,  542,
+       87,  548,   87,   87,  547,  543,   87,   87,  549,   87,
+      545,   87,  552,   87,   87,  550,  556,  554,  551,   87,
+      559,   87,  553,  555,   87,   87,  557,   87,   87,  558,
+       87,   87,   87,  564,  560,  567,  563,  568,   87,  561,
+      566,  562,   87,  565,   87,   87,  571,   87,   87,  573,
+      627,  201,  492,  570,  576,  574,  572,  577,  211,  211,
+      211,  211,  493,   87,  575,  488,  488,  488,  488,  488,
+
+      488,  376,  376,  376,  376,  376,  376,   87,  492,   87,
+      618,  234,  595,  236,  595,  237,  236,  596,  596,  596,
+      596,  596,  596,  492,   87,  599,  492,  621,  489,   87,
+       87,  623,   87,  236,  490,  236,  598,  619,  237,   87,
+      236,  498,  498,  498,  498,  498,  498,  620,   87,  492,
+      597,  599,  492,  600,  600,  600,  600,  600,  600,   87,
+      631,  622,   87,  887,  625,  887,   87,  862,   87,  601,
+      497,  602,  497,  603,  602,  498,  498,  498,  498,  498,
+      498,  624,  628,   87,   87,  630,  604,   87,   87,   87,
+       87,  602,  633,  602,  626,  636,  603,  632,  602,  629,
+
+      634,   87,   87,  635,   87,   87,   87,  642,   87,   87,
+      637,  641,   87,   87,  640,   87,   87,  643,  647,  639,
+       87,   87,  887,   87,   87,   87,  638,   87,   87,  644,
+      645,  646,  648,  650,   87,   87,   87,  649,   87,  653,
+      651,   87,  652,   87,  654,  655,   87,   87,   87,   87,
+      656,  657,   87,  660,  659,  661,  664,   87,  658,   87,
+       87,  663,   87,   87,   87,  668,  665,  688,  688,  662,
+      666,  701,  702,  887,  887,   87,  667,  488,  488,  488,
+      488,  488,  488,  596,  596,  596,  596,  596,  596,  595,
+      688,  595,  704,   87,  596,  596,  596,  596,  596,  596,
+
+      600,  600,  600,  600,  600,  600,  703,  688,   87,  887,
+      594,  686,  686,  686,  686,  686,  686,  689,   87,  689,
+       87,   87,  689,  699,   87,  708,   87,  601,  706,  602,
+      688,  603,  602,  604,  707,   87,  700,  710,  709,  689,
+       87,  689,   87,  705,  687,   87,  689,   87,   87,  602,
+       87,  602,   87,  716,  603,  718,  602,  712,   87,   87,
+       87,   87,  711,   87,  714,   87,   87,  713,   87,  717,
+      715,   87,  721,  719,   87,  724,   87,   87,  722,  720,
+      727,   87,   87,   87,  725,   87,  731,  723,   87,  732,
+      726,   87,   87,  861,  728,  734,   87,  733,  730,   87,
+
+      735,   87,   87,  729,   87,   87,  751,  736,  686,  686,
+      686,  686,  686,  686,  600,  600,  600,  600,  600,  600,
+      750,   87,  755,   87,  601,  763,  602,  752,  603,  602,
+      753,   87,   87,  764,   87,  756,  754,  757,   87,  758,
+       87,  687,   87,   87,  759,  767,  602,  690,  602,  761,
+       87,  603,  766,  602,   87,  760,   87,  762,   87,  765,
+       87,  768,   87,  769,   87,   87,   87,   87,  770,   87,
+       87,   87,   87,   87,  771,   87,  774,   87,  772,   87,
+       87,  779,   87,   87,  795,   87,  780,  773,   87,   87,
+      776,   87,  775,  803,  777,  796,  778,  686,  686,  686,
+
+      686,  686,  686,  793,   87,  794,  799,   87,  798,   87,
+      801,   87,   87,   87,  797,  804,  805,  800,  806,   87,
+       87,   87,  802,  807,   87,   87,   87,  808,   87,   87,
+      743,   87,   87,   87,  809,  828,   87,   87,   87,  830,
+      831,  833,   87,   87,   87,  834,   87,  836,  810,  811,
+      826,  827,   87,  829,   87,  825,  832,  837,   87,   87,
+       87,  838,  839,   87,   87,  835,   87,   87,   87,  851,
+      850,  855,   87,  852,  840,   87,   87,   87,  853,  857,
+      849,   87,   87,   87,  854,  858,  859,   87,   87,  856,
+      860,   87,  863,  864,  865,   87,   87,  866,   87,  868,
+
+      867,  869,   87,   87,   87,  870,   87,   87,   87,  873,
+       87,  875,   87,  876,   87,   87,   87,  874,   87,  872,
+       87,   87,   87,  871,   87,  880,   87,   87,   87,  887,
+      879,  881,  887,  848,  877,  878,  886,  887,  847,  884,
+      887,  845,  882,  883,  887,  844,  885,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       75,   75,   75,   75,   75,   75,   75,   75,   75,   75,
+       75,   75,   75,   78,   78,   78,   78,   78,   78,   78,
+       78,   78,   78,   78,   78,   78,   86,  887,  843,   86,
+      887,   86,   86,   86,   86,   86,  140,  842,   87,   87,
+
+      140,  140,  140,  140,  140,  140,  199,  199,  199,  199,
+      199,  199,  199,  199,  199,  199,  199,  199,  199,  204,
+       87,  887,  204,  824,  204,  204,  204,  204,  204,  208,
+      887,  208,  208,  823,  208,  208,  208,  208,  208,  208,
+      821,  208,  216,  887,  819,  216,  216,  216,  216,  216,
+      216,  216,  216,  887,  216,  239,  239,  239,  239,  239,
+      239,  239,  239,  239,  239,  239,  239,  239,  253,  253,
+      817,  253,  887,  815,  813,  253,  269,   87,   87,  269,
+       87,  269,  269,  269,  269,  269,  273,   87,  273,   87,
+       87,   87,  273,  275,   87,  275,   87,   87,   87,  275,
+
+      348,   87,  348,  887,  792,  790,  348,  350,  887,  350,
+      887,  787,  785,  350,  354,  783,  354,   87,   87,   87,
+      354,  356,   87,  356,   87,   87,   87,  356,  358,  749,
+      358,  746,  745,  743,  358,  365,  205,  365,  739,  738,
+      670,  365,  367,   87,  367,   87,   87,   87,  367,  239,
+      239,  239,  239,  239,  239,  239,  239,  239,  239,  239,
+      239,  239,  380,   87,  380,  382,  382,   87,  382,  382,
+      382,   87,  382,  253,  253,   87,  253,  392,   87,  392,
+       87,   87,   87,  392,  394,   87,  394,   87,   87,  697,
+      394,  396,  696,  396,  694,  692,  690,  396,  273,  598,
+
+      273,  398,  685,  398,  684,  682,  680,  398,  275,  678,
+      275,   86,  676,  674,   86,  672,   86,   86,   86,   86,
+       86,  199,  199,  199,  199,  199,  199,  199,  199,  199,
+      199,  199,  199,  199,  468,  468,  468,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  468,  469,  670,  469,
+       87,   87,   87,  469,  471,   87,  471,   87,   87,   87,
+      471,  473,   87,  473,   87,   87,   87,  473,  348,  617,
+      348,  475,  615,  475,  613,  611,  609,  475,  350,  607,
+      350,  478,  502,  478,  605,  605,  594,  478,  354,  593,
+      354,  480,  591,  480,  483,  483,  589,  480,  356,  587,
+
+      356,  482,  585,  482,  583,  581,  579,  482,  358,   87,
+      358,  484,   87,  484,   87,   87,   87,  484,  365,   87,
+      365,  486,   87,  486,   87,  514,  512,  486,  367,  510,
+      367,  491,  508,  491,  506,  491,  504,  491,  380,  490,
+      380,  487,  380,  485,  380,  382,  382,  361,  382,  382,
+      382,  361,  382,  503,  483,  503,  481,  479,  476,  503,
+      505,  474,  505,  472,  470,   87,  505,  507,   87,  507,
+       87,  400,  399,  507,  392,  397,  392,  509,  395,  509,
+      393,  270,  265,  509,  394,  264,  394,  511,  389,  511,
+      389,  252,  379,  511,  396,  379,  396,  513,  240,  513,
+
+      374,  368,  366,  513,  398,  364,  398,   86,  360,  359,
+       86,  357,   86,   86,   86,   86,   86,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  468,  468,  468,  468,
+      578,  355,  578,  351,  349,  205,  578,  469,  201,  469,
+      580,   87,  580,  277,  276,  274,  580,  471,  270,  471,
+      582,  265,  582,  268,  265,  263,  582,  473,  262,  473,
+      584,  261,  584,  240,  232,   85,  584,  475,   85,  475,
+      586,   87,  586,  205,  203,   85,  586,  478,  122,  478,
+      588,  117,  588,   87,  887,   70,  588,  480,   70,  480,
+      482,  887,  482,  887,  887,  887,  482,  590,  887,  590,
+
+      887,  887,  887,  590,  484,  887,  484,  592,  887,  592,
+      887,  887,  887,  592,  486,  887,  486,  491,  887,  491,
+      887,  491,  887,  491,  382,  887,  382,  887,  887,  887,
+      382,  606,  887,  606,  887,  887,  887,  606,  503,  887,
+      503,  608,  887,  608,  887,  887,  887,  608,  505,  887,
+      505,  610,  887,  610,  887,  887,  887,  610,  507,  887,
+      507,  612,  887,  612,  887,  887,  887,  612,  509,  887,
+      509,  614,  887,  614,  887,  887,  887,  614,  511,  887,
+      511,  616,  887,  616,  887,  887,  887,  616,  513,  887,
+      513,   86,  887,  887,   86,  887,   86,   86,   86,   86,
+
+       86,  669,  669,  669,  669,  669,  669,  669,  669,  669,
+      669,  669,  669,  669,  671,  887,  671,  887,  887,  887,
+      671,  578,  887,  578,  673,  887,  673,  887,  887,  887,
+      673,  580,  887,  580,  675,  887,  675,  887,  887,  887,
+      675,  582,  887,  582,  677,  887,  677,  887,  887,  887,
+      677,  584,  887,  584,  679,  887,  679,  887,  887,  887,
+      679,  586,  887,  586,  681,  887,  681,  887,  887,  887,
+      681,  588,  887,  588,  683,  887,  683,  887,  887,  887,
+      683,  590,  887,  590,   86,  887,   86,  887,  887,  887,
+       86,  592,  887,  592,  491,  887,  491,  887,  887,  887,
+
+      491,  691,  887,  691,  887,  887,  887,  691,  606,  887,
+      606,  693,  887,  693,  887,  887,  887,  693,  608,  887,
+      608,  695,  887,  695,  887,  887,  887,  695,  610,  887,
+      610,  140,  887,  140,  887,  887,  887,  140,  612,  887,
+      612,  698,  887,  698,  614,  887,  614,   86,  887,  887,
+       86,  887,   86,   86,   86,   86,   86,  616,  887,  616,
+      669,  669,  669,  669,  669,  669,  669,  669,  669,  669,
+      669,  669,  669,  737,  887,  737,  887,  887,  887,  737,
+      671,  887,  671,  204,  887,  204,  887,  887,  887,  204,
+      673,  887,  673,  740,  887,  740,  675,  887,  675,  204,
+
+      887,  887,  204,  887,  204,  204,  204,  204,  204,  677,
+      887,  677,  741,  887,  741,  679,  887,  679,  681,  887,
+      681,  742,  887,  742,  683,  887,  683,   86,  887,   86,
+      744,  887,  744,  887,  887,  887,  744,  691,  887,  691,
+      269,  887,  269,  887,  887,  887,  269,  693,  887,  693,
+      747,  887,  747,  695,  887,  695,  140,  887,  140,  748,
+      887,  748,  887,  887,  887,  748,   86,  887,  887,   86,
+      887,   86,   86,   86,   86,   86,  781,  887,  781,  737,
+      887,  737,  204,  887,  204,  782,  887,  782,  887,  887,
+      887,  782,  784,  887,  784,  887,  887,  887,  784,  786,
+
+      887,  786,  887,  887,  887,  786,  788,  887,  788,  789,
+      887,  789,  887,  887,  887,  789,  791,  887,  791,  887,
+      887,  887,  791,  812,  887,  812,  887,  887,  887,  812,
+      814,  887,  814,  887,  887,  887,  814,  816,  887,  816,
+      887,  887,  887,  816,  818,  887,  818,  887,  887,  887,
+      818,  820,  887,  820,  887,  887,  887,  820,  822,  887,
+      822,  887,  887,  887,  822,  616,  887,  616,  887,  887,
+      887,  616,  841,  887,  841,  887,  887,  887,  841,  677,
+      887,  677,  887,  887,  887,  677,  681,  887,  681,  887,
+      887,  887,  681,   86,  887,   86,  887,  887,  887,   86,
+
+      846,  887,  846,  887,  887,  887,  846,  140,  887,  140,
+      887,  887,  887,  140,  204,  887,  204,  887,  887,  887,
+      204,   11,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887
     } ;
 
-static yyconst flex_int16_t yy_chk[2867] =
+static yyconst flex_int16_t yy_chk[2908] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1103,6 +1113,6 @@
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    2,   16,   24,   16,   24,    2,
-       19,   19,    2,    5,    5,    5,    5,    5,    5,    5,
+        1,    1,    1,    1,    1,    2,   16,   24,   16,   24,
+        2,   19,   19,    2,    5,    5,    5,    5,    5,    5,
 
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
@@ -1113,305 +1123,310 @@
         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,    5,    5,    7,    8,    9,
-       10,   37,   37,   20,   39,    9,   10,  874,    7,    8,
-       13,   13,   13,   13,   13,   13,   15,   15,   15,   15,
-
-       15,   15,   20,   25,   39,   42,   53,   28,   27,   28,
-       28,   28,   28,   28,   28,  108,  114,   25,   29,   25,
-       27,   27,   27,   29,   53,   35,    7,    8,    9,   10,
-       40,   42,   48,   29,   30,   40,   30,   30,   30,   30,
-       30,   30,   35,   61,   35,   35,   44,  869,   44,  108,
-      114,  868,   48,   30,   63,   61,   30,   56,   47,   45,
-       45,   45,   30,   30,   45,   45,   56,   45,   30,   55,
-       45,   45,   49,   40,   30,   45,   40,   49,   45,   47,
-       30,   47,   72,  125,   49,  125,   51,   55,   30,   86,
-       49,   30,   31,   55,   31,   31,   31,   31,   31,   31,
-
-       50,   51,  866,   51,   63,  153,   54,   58,   72,   50,
-       60,   31,   51,   50,   31,   86,   54,   57,   50,   58,
-       31,  153,   50,   54,  141,  156,   31,   58,   60,   57,
-       57,   59,   31,  126,   58,  126,   59,  156,   31,   57,
-       52,  865,   57,   67,   67,   52,   31,   38,   67,   59,
-      141,   38,   38,   52,   38,   52,   38,   38,   52,   38,
-      107,   38,   52,  113,   67,   67,   67,   67,   67,   67,
-       38,   38,   38,  128,   59,  128,  152,   59,   66,   66,
-       66,   66,   66,   66,  107,  152,   66,  113,  863,  862,
-       38,   59,  165,   38,   79,   79,   79,   79,   79,   79,
-
-       81,   81,   81,   81,   81,   81,   82,   82,   82,   82,
-       82,   82,  131,  165,  131,  103,  103,  103,  103,  106,
-       38,   38,   76,   76,  856,  106,  112,   76,  168,   76,
-      110,  133,  112,  133,   76,  102,  102,  102,  102,  102,
-      102,  130,  103,   76,   76,   76,   76,  103,  110,  168,
-      109,  106,  129,  130,   76,  130,  110,  104,  112,  104,
-      104,  104,  104,  104,  104,  149,  129,  102,  129,   76,
-      103,  136,   76,  136,  158,  115,  104,   76,   76,  109,
-      149,   76,   76,  155,  109,  132,  132,  149,  132,   76,
-      158,  104,   76,  115,   76,   76,   76,  104,   76,   84,
-
-      138,  115,  138,   84,   84,  155,  166,  109,   84,   84,
-      105,   84,  105,   84,  150,  105,  105,  105,  105,  105,
-      105,  151,   84,   84,   84,  134,  134,  134,  144,  166,
-      154,  157,  150,  144,  159,  167,  157,  157,  157,  151,
-      157,  157,   84,  161,  157,   84,  157,  105,  154,  160,
-      163,  157,  157,  157,  162,  157,  159,  855,  160,  162,
-      164,  169,  167,  170,  161,  161,  169,  163,  171,  172,
-      164,  144,  162,   84,   98,   98,   98,   98,   98,   98,
-      173,  174,  175,  171,  169,  170,  172,  179,  176,  185,
-       98,   98,  178,   98,   98,  180,  189,  182,  173,  187,
-
-      180,  174,  185,  186,  179,  188,   98,  178,  181,  175,
-      176,   98,   98,   98,  178,  182,   98,  183,   98,  181,
-      184,  191,  190,  186,  188,  184,  187,  528,  183,  181,
-      181,  192,  207,  207,  191,  190,  191,  207,  232,  189,
-      184,  203,  189,  190,  192,  183,  195,  195,  195,  195,
-      195,  195,  196,  196,  195,  528,  854,  196,  198,  198,
-      216,  232,  216,  198,  200,  200,  217,  203,  217,  200,
-      218,  200,  218,  196,  196,  196,  196,  196,  196,  198,
-      198,  198,  198,  198,  198,  200,  200,  200,  200,  200,
-      200,  210,  210,  210,  210,  219,  220,  221,  282,  221,
-
-      222,  222,  223,  222,  223,  224,  224,  224,  220,  219,
-      220,  219,  226,  227,  226,  227,  234,  235,  282,  233,
-      234,  233,  284,  210,  233,  233,  233,  233,  233,  233,
-      241,  239,  239,  277,  239,  239,  264,  234,  264,  234,
-      235,  265,  284,  265,  234,  242,  242,  242,  242,  242,
-      242,  277,  239,  239,  239,  246,  233,  239,  278,  239,
-      276,  280,  242,  279,  241,  243,  243,  243,  243,  243,
-      243,  254,  268,  276,  853,  281,  278,  242,  280,  279,
-      281,  246,  288,  242,  244,  244,  244,  244,  244,  244,
-      253,  253,  253,  253,  253,  253,  251,  254,  268,  287,
-
-      244,  283,  286,  244,  244,  245,  283,  245,  288,  295,
-      245,  245,  245,  245,  245,  245,  244,  287,  251,  849,
-      251,  244,  253,  244,  251,  286,  244,  295,  244,  289,
-      251,  258,  258,  258,  258,  258,  258,  285,  290,  292,
-      291,  294,  251,  293,  289,  291,  251,  297,  292,  301,
-      251,  299,  285,  303,  290,  290,  293,  298,  285,  285,
-      299,  302,  298,  258,  300,  297,  307,  304,  294,  301,
-      306,  300,  304,  305,  303,  303,  306,  308,  305,  302,
-      310,  309,  311,  312,  313,  307,  308,  309,  314,  313,
-      315,  311,  316,  314,  318,  315,  310,  317,  312,  320,
-
-      322,  321,  323,  324,  326,  325,  328,  318,  327,  329,
-      320,  316,  315,  322,  330,  317,  321,  327,  333,  331,
-      334,  326,  335,  337,  323,  325,  324,  333,  328,  336,
-      338,  337,  329,  339,  381,  338,  330,  331,  340,  340,
-      335,  341,  336,  340,  358,  340,  358,  341,  339,  348,
-      348,  348,  348,  349,  349,  349,  349,  359,  381,  359,
-      397,  846,  402,  334,  366,  366,  366,  366,  366,  366,
-      368,  397,  368,  402,  404,  368,  368,  368,  368,  368,
-      368,  348,  367,  367,  367,  367,  367,  367,  370,  370,
-      370,  370,  370,  370,  400,  398,  404,  435,  367,  376,
-
-      843,  367,  367,  371,  371,  371,  371,  371,  371,  376,
-      379,  398,  377,  400,  367,  378,  379,  435,  383,  367,
-      370,  367,  377,  412,  367,  376,  367,  372,  372,  372,
-      372,  372,  372,  399,  382,  371,  383,  378,  377,  378,
-      415,  412,  379,  378,  383,  380,  415,  380,  399,  378,
-      380,  380,  380,  380,  380,  380,  382,  401,  382,  372,
-      407,  378,  382,  403,  405,  378,  401,  408,  382,  378,
-      406,  411,  403,  405,  409,  410,  407,  416,  418,  414,
-      382,  413,  380,  406,  382,  417,  413,  409,  382,  408,
-      419,  410,  410,  411,  414,  421,  417,  418,  416,  423,
-
-      425,  414,  426,  427,  428,  419,  431,  429,  430,  421,
-      433,  423,  427,  429,  436,  431,  427,  437,  438,  439,
-      441,  425,  440,  430,  426,  433,  443,  428,  445,  441,
-      447,  446,  437,  448,  439,  449,  436,  450,  451,  455,
-      438,  452,  440,  443,  457,  633,  450,  460,  453,  458,
-      447,  445,  446,  448,  452,  453,  451,  449,  454,  456,
-      458,  457,  461,  633,  455,  454,  462,  456,  515,  460,
-      488,  461,  462,  471,  471,  471,  471,  456,  482,  482,
-      482,  482,  482,  482,  484,  484,  484,  484,  484,  484,
-      515,  513,  485,  487,  482,  489,  488,  482,  482,  486,
-
-      510,  486,  485,  487,  486,  486,  486,  486,  486,  486,
-      482,  513,  509,  510,  520,  482,  484,  482,  485,  487,
-      482,  489,  482,  491,  491,  491,  491,  491,  491,  509,
-      512,  514,  519,  516,  520,  519,  486,  492,  492,  492,
-      492,  492,  492,  517,  514,  512,  516,  521,  517,  525,
-      518,  522,  523,  492,  525,  842,  492,  492,  493,  841,
-      493,  518,  521,  493,  493,  493,  493,  493,  493,  492,
-      522,  524,  526,  523,  492,  527,  492,  529,  530,  492,
-      524,  492,  531,  526,  532,  533,  529,  536,  527,  535,
-      533,  538,  539,  532,  542,  535,  536,  540,  541,  531,
-
-      530,  544,  545,  542,  546,  547,  549,  554,  556,  539,
-      544,  561,  540,  541,  555,  552,  546,  538,  550,  545,
-      547,  549,  553,  550,  552,  556,  558,  555,  559,  554,
-      560,  553,  562,  561,  558,  563,  564,  560,  559,  565,
-      567,  563,  568,  613,  562,  564,  612,  617,  594,  565,
-      596,  698,  613,  612,  617,  568,  698,  567,  587,  587,
-      587,  587,  587,  587,  588,  588,  588,  588,  588,  588,
-      590,  594,  590,  596,  614,  590,  590,  590,  590,  590,
-      590,  593,  593,  593,  593,  593,  593,  614,  615,  616,
-      587,  589,  589,  589,  589,  589,  589,  595,  611,  622,
-
-      618,  595,  619,  611,  621,  615,  620,  589,  618,  620,
-      589,  589,  616,  593,  623,  624,  611,  621,  595,  619,
-      595,  622,  625,  589,  626,  595,  628,  629,  589,  623,
-      589,  627,  630,  589,  627,  589,  631,  624,  634,  625,
-      632,  635,  637,  628,  638,  644,  626,  630,  639,  632,
-      635,  645,  640,  650,  629,  647,  631,  696,  693,  651,
-      634,  640,  650,  659,  637,  644,  651,  638,  658,  662,
-      639,  661,  647,  659,  697,  840,  839,  658,  645,  693,
-      661,  697,  699,  696,  662,  680,  680,  680,  680,  680,
-      680,  684,  684,  684,  684,  684,  684,  694,  702,  705,
-
-      700,  680,  699,  700,  680,  680,  701,  694,  704,  701,
-      706,  708,  705,  709,  704,  707,  702,  680,  707,  706,
-      712,  711,  680,  684,  680,  710,  714,  680,  710,  680,
-      711,  713,  708,  718,  713,  715,  716,  717,  720,  714,
-      723,  709,  726,  715,  727,  712,  716,  720,  728,  730,
-      717,  731,  752,  751,  718,  753,  749,  730,  751,  754,
-      731,  750,  726,  723,  755,  753,  727,  752,  756,  728,
-      738,  738,  738,  738,  738,  738,  749,  757,  750,  758,
-      757,  755,  754,  759,  761,  763,  764,  761,  763,  767,
-      768,  773,  758,  764,  756,  765,  766,  788,  765,  766,
-
-      790,  791,  738,  792,  767,  793,  792,  797,  794,  795,
-      759,  794,  795,  768,  773,  798,  801,  799,  805,  791,
-      799,  790,  821,  802,  788,  797,  802,  793,  803,  806,
-      804,  803,  824,  823,  805,  822,  823,  825,  801,  804,
-      798,  824,  822,  821,  826,  806,  827,  826,  830,  833,
-      834,  830,  833,  835,  847,  825,  844,  847,  848,  834,
-      857,  845,  835,  827,  850,  844,  845,  850,  848,  851,
-      852,  858,  851,  852,  859,  860,  861,  859,  864,  861,
-      857,  867,  870,  871,  873,  860,  858,  838,  872,  837,
-      836,  870,  832,  831,  873,  829,  828,  820,  819,  818,
-
-      864,  817,  867,  816,  815,  871,  872,  876,  876,  876,
-      876,  876,  876,  876,  876,  876,  876,  876,  876,  876,
-      877,  877,  877,  877,  877,  877,  877,  877,  877,  877,
-      877,  877,  877,  878,  878,  878,  878,  878,  878,  878,
-      878,  878,  878,  878,  878,  878,  879,  814,  813,  879,
-      812,  879,  879,  879,  879,  879,  880,  811,  810,  809,
-      880,  880,  880,  880,  880,  880,  881,  881,  881,  881,
-      881,  881,  881,  881,  881,  881,  881,  881,  881,  882,
-      808,  807,  882,  800,  882,  882,  882,  882,  882,  883,
-      796,  883,  883,  789,  883,  883,  883,  883,  883,  883,
-
-      787,  883,  884,  786,  785,  884,  884,  884,  884,  884,
-      884,  884,  884,  784,  884,  885,  885,  885,  885,  885,
-      885,  885,  885,  885,  885,  885,  885,  885,  886,  886,
-      783,  886,  782,  781,  780,  886,  887,  779,  778,  887,
-      777,  887,  887,  887,  887,  887,  888,  776,  888,  775,
-      774,  772,  888,  889,  771,  889,  770,  769,  762,  889,
-      890,  760,  890,  748,  747,  746,  890,  891,  745,  891,
-      744,  743,  742,  891,  892,  741,  892,  740,  737,  736,
-      892,  893,  735,  893,  729,  725,  724,  893,  894,  722,
-      894,  721,  719,  703,  894,  895,  695,  895,  692,  687,
-
-      685,  895,  896,  681,  896,  671,  667,  665,  896,  897,
-      897,  897,  897,  897,  897,  897,  897,  897,  897,  897,
-      897,  897,  898,  663,  898,  899,  899,  660,  899,  899,
-      899,  657,  899,  900,  900,  656,  900,  901,  655,  901,
-      654,  653,  652,  901,  902,  649,  902,  648,  646,  643,
-      902,  903,  642,  903,  641,  636,  609,  903,  904,  605,
-      904,  905,  603,  905,  601,  599,  597,  905,  906,  591,
-      906,  907,  585,  583,  907,  581,  907,  907,  907,  907,
-      907,  908,  908,  908,  908,  908,  908,  908,  908,  908,
-      908,  908,  908,  908,  909,  909,  909,  909,  909,  909,
-
-      909,  909,  909,  909,  909,  909,  909,  910,  579,  910,
-      577,  575,  573,  910,  911,  571,  911,  570,  569,  566,
-      911,  912,  557,  912,  551,  548,  543,  912,  913,  537,
-      913,  914,  534,  914,  511,  507,  505,  914,  915,  503,
-      915,  916,  501,  916,  499,  497,  496,  916,  917,  495,
-      917,  918,  494,  918,  483,  480,  478,  918,  919,  477,
-      919,  920,  476,  920,  474,  472,  469,  920,  921,  467,
-      921,  922,  465,  922,  463,  459,  444,  922,  923,  442,
-      923,  924,  434,  924,  432,  424,  422,  924,  925,  420,
-      925,  926,  394,  926,  392,  926,  390,  926,  927,  388,
-
-      927,  387,  927,  386,  927,  928,  928,  373,  928,  928,
-      928,  363,  928,  929,  361,  929,  360,  356,  354,  929,
-      930,  352,  930,  350,  346,  344,  930,  931,  343,  931,
-      342,  332,  319,  931,  932,  296,  932,  933,  275,  933,
-      273,  271,  270,  933,  934,  269,  934,  935,  267,  935,
-      266,  261,  257,  935,  936,  256,  936,  937,  252,  937,
-      249,  248,  237,  937,  938,  236,  938,  939,  229,  228,
-      939,  225,  939,  939,  939,  939,  939,  940,  940,  940,
-      940,  940,  940,  940,  940,  940,  940,  940,  940,  940,
-      941,  215,  941,  213,  212,  211,  941,  942,  205,  942,
-
-      943,  204,  943,  202,  197,  177,  943,  944,  148,  944,
-      945,  146,  945,  145,  139,  137,  945,  946,  135,  946,
-      947,  127,  947,  124,  123,  119,  947,  948,  100,  948,
-      949,   97,  949,   94,   92,   85,  949,  950,   71,  950,
-      951,   69,  951,   65,   36,   33,  951,  952,   18,  952,
-      953,   11,  953,    4,    3,    0,  953,  954,    0,  954,
-        0,    0,    0,  954,  955,    0,  955,  956,    0,  956,
-        0,    0,    0,  956,  957,    0,  957,  958,    0,  958,
-        0,  958,    0,  958,  959,    0,  959,    0,    0,    0,
-      959,  960,    0,  960,    0,    0,    0,  960,  961,    0,
-
-      961,  962,    0,  962,    0,    0,    0,  962,  963,    0,
-      963,  964,    0,  964,    0,    0,    0,  964,  965,    0,
-      965,  966,    0,  966,    0,    0,    0,  966,  967,    0,
-      967,  968,    0,  968,    0,    0,    0,  968,  969,    0,
-      969,  970,    0,  970,    0,    0,    0,  970,  971,    0,
-      971,  972,    0,    0,  972,    0,  972,  972,  972,  972,
-      972,  973,  973,  973,  973,  973,  973,  973,  973,  973,
-      973,  973,  973,  973,  974,    0,  974,    0,    0,    0,
-      974,  975,    0,  975,  976,    0,  976,    0,    0,    0,
-      976,  977,    0,  977,  978,    0,  978,    0,    0,    0,
-
-      978,  979,    0,  979,  980,    0,  980,    0,    0,    0,
-      980,  981,    0,  981,  982,    0,  982,    0,    0,    0,
-      982,  983,    0,  983,  984,    0,  984,    0,    0,    0,
-      984,  985,    0,  985,  986,    0,  986,    0,    0,    0,
+        5,    5,    5,    5,    5,    5,    5,    5,    5,    7,
+        8,    9,   10,   37,   37,   20,   39,    9,   10,  886,
+        7,    8,   13,   13,   13,   13,   13,   13,   15,   15,
+
+       15,   15,   15,   15,   20,   25,   48,   39,   42,   28,
+       27,   28,   28,   28,   28,   28,   28,  109,  115,   25,
+       29,   25,   27,   27,   27,   29,   48,   35,   40,    7,
+        8,    9,   10,   40,   42,   29,   30,   47,   30,   30,
+       30,   30,   30,   30,   35,   57,   35,   35,   44,  126,
+       44,  126,  109,  115,   57,   30,   64,   56,   47,   30,
+       47,   45,   45,   45,   49,   30,   30,   45,   45,   49,
+       45,   30,   40,   45,   45,   40,   49,   30,   45,   56,
+       62,   45,   49,   30,   73,  885,  127,   53,  127,   51,
+       61,   30,   62,   55,   30,   31,  108,   31,   31,   31,
+
+       31,   31,   31,   50,   51,   53,   51,   64,   61,   54,
+       73,   55,   50,   87,   31,   51,   50,   55,   31,   54,
+      108,   50,   52,  114,   31,   50,   54,   52,  175,  129,
+       31,  129,  107,  154,  151,   52,   31,   52,  107,   87,
+       52,   60,   31,  132,   52,  132,   60,  114,  175,  154,
+       31,   38,  151,  385,  111,   38,   38,   58,   38,   60,
+       38,   38,  113,   38,  107,   38,   59,  130,  113,   58,
+       58,  116,  111,  164,   38,   38,   38,  385,   59,   58,
+      111,  130,   58,  130,  142,   60,   59,  131,   60,  116,
+      164,   68,   68,   59,  113,   38,   68,  116,   38,  131,
+
+      110,  131,   60,   67,   67,   67,   67,   67,   67,  877,
+      142,   67,   68,   68,   68,   68,   68,   68,   80,   80,
+       80,   80,   80,   80,  153,   38,   38,   77,   77,  134,
+      110,  134,   77,  153,   77,  110,  135,  135,  135,   77,
+       82,   82,   82,   82,   82,   82,  876,  243,   77,   77,
+       77,   77,   83,   83,   83,   83,   83,   83,  110,   77,
+      103,  103,  103,  103,  103,  103,  104,  104,  104,  104,
+      133,  133,  137,  133,  137,   77,  145,  139,   77,  139,
+      157,  145,  243,   77,   77,  152,  156,   77,   77,  155,
+      166,  150,  157,  103,  104,   77,  159,  168,   77,  104,
+
+       77,   77,   77,  152,   77,   85,  150,  155,  156,   85,
+       85,  166,  159,  150,   85,   85,  161,   85,  160,   85,
+      145,  162,  104,  167,  168,  161,  169,  163,   85,   85,
+       85,  105,  163,  105,  105,  105,  105,  105,  105,  873,
+      160,  171,  162,  162,  165,  163,  167,  169,  173,   85,
+      105,  106,   85,  106,  165,  172,  106,  106,  106,  106,
+      106,  106,  180,  171,  170,  173,  105,  176,  177,  170,
+      172,  181,  105,  174,  184,  187,  181,  182,  179,  180,
+       85,   99,   99,   99,   99,   99,   99,  170,  187,  106,
+      177,  174,  184,  179,  176,  183,  190,   99,   99,   99,
+
+      179,   99,   99,  189,  182,  186,  183,  191,  189,  218,
+      186,  218,  185,  188,   99,  190,  183,  183,  284,   99,
+       99,   99,  158,  185,   99,  186,   99,  158,  158,  158,
+      189,  158,  158,  188,  192,  158,  194,  158,  284,  219,
+      185,  219,  158,  158,  158,  193,  158,  192,  220,  194,
+      220,  191,  198,  198,  191,  192,  205,  198,  193,  872,
+      193,  197,  197,  197,  197,  197,  197,  200,  200,  197,
+      248,  221,  200,  198,  198,  198,  198,  198,  198,  202,
+      202,  223,  205,  223,  202,  221,  202,  221,  200,  200,
+      200,  200,  200,  200,  209,  209,  248,  338,  222,  209,
+
+      202,  202,  202,  202,  202,  202,  212,  212,  212,  212,
+      222,  309,  222,  224,  224,  225,  224,  225,  226,  226,
+      226,  228,  229,  228,  229,  234,  234,  235,  236,  235,
+      309,  279,  235,  235,  235,  235,  235,  235,  237,  212,
+      237,  338,  266,  237,  266,  267,  278,  267,  234,  279,
+      283,  236,  241,  241,  241,  283,  241,  241,  256,  278,
+      237,  281,  237,  282,  280,  235,  270,  237,  244,  244,
+      244,  244,  244,  244,  241,  241,  241,  281,  285,  241,
+      282,  241,  280,  285,  256,  244,  245,  245,  245,  245,
+      245,  245,  270,  288,  293,  286,  294,  300,  306,  293,
+
+      308,  244,  300,  306,  870,  294,  308,  244,  246,  246,
+      246,  246,  246,  246,  253,  286,  288,  255,  255,  255,
+      255,  255,  255,  287,  246,  247,  246,  247,  246,  246,
+      247,  247,  247,  247,  247,  247,  290,  253,  287,  253,
+      869,  246,  289,  253,  287,  287,  246,  292,  246,  253,
+      255,  246,  291,  246,  260,  260,  260,  260,  260,  260,
+      289,  253,  290,  292,  292,  253,  295,  291,  296,  253,
+      297,  299,  301,  302,  303,  304,  305,  307,  311,  295,
+      302,  301,  307,  310,  311,  312,  319,  260,  297,  299,
+      313,  314,  310,  304,  303,  296,  318,  305,  305,  313,
+
+      315,  312,  316,  317,  319,  315,  314,  316,  317,  320,
+      322,  323,  324,  326,  325,  318,  327,  328,  331,  329,
+      330,  322,  320,  332,  334,  317,  323,  325,  333,  330,
+      335,  324,  337,  339,  340,  326,  329,  328,  401,  327,
+      331,  337,  334,  335,  341,  343,  332,  340,  342,  401,
+      333,  339,  341,  342,  344,  344,  345,  460,  862,  344,
+      343,  344,  345,  352,  352,  352,  352,  353,  353,  353,
+      353,  362,  363,  362,  363,  370,  370,  370,  370,  370,
+      370,  372,  460,  372,  380,  381,  372,  372,  372,  372,
+      372,  372,  861,  402,  380,  381,  352,  371,  371,  371,
+
+      371,  371,  371,  374,  374,  374,  374,  374,  374,  402,
+      380,  381,  403,  371,  404,  371,  860,  371,  371,  375,
+      375,  375,  375,  375,  375,  383,  382,  403,  406,  405,
+      371,  383,  407,  404,  408,  371,  374,  371,  405,  406,
+      371,  407,  371,  376,  376,  376,  376,  376,  376,  382,
+      412,  382,  375,  387,  411,  382,  408,  383,  384,  386,
+      384,  382,  410,  384,  384,  384,  384,  384,  384,  409,
+      411,  387,  412,  382,  413,  410,  376,  382,  409,  387,
+      415,  382,  386,  414,  386,  416,  417,  413,  386,  418,
+      421,  417,  419,  422,  386,  420,  384,  427,  419,  414,
+
+      414,  421,  415,  416,  418,  423,  386,  425,  429,  427,
+      386,  418,  422,  430,  386,  431,  420,  432,  433,  434,
+      423,  425,  435,  437,  433,  439,  440,  441,  431,  429,
+      442,  435,  443,  444,  434,  430,  449,  445,  437,  447,
+      432,  450,  441,  451,  454,  439,  445,  443,  440,  452,
+      450,  453,  442,  444,  455,  456,  447,  457,  458,  449,
+      459,  461,  463,  455,  451,  458,  454,  459,  462,  452,
+      457,  453,  466,  456,  464,  467,  462,  525,  859,  463,
+      525,  468,  491,  461,  467,  464,  462,  468,  477,  477,
+      477,  477,  491,  515,  466,  488,  488,  488,  488,  488,
+
+      488,  490,  490,  490,  490,  490,  490,  519,  491,  521,
+      515,  488,  492,  488,  492,  488,  488,  492,  492,  492,
+      492,  492,  492,  494,  516,  495,  493,  519,  488,  855,
+      851,  521,  518,  488,  490,  488,  493,  516,  488,  529,
+      488,  497,  497,  497,  497,  497,  497,  518,  520,  494,
+      492,  495,  493,  498,  498,  498,  498,  498,  498,  523,
+      529,  520,  526,  848,  523,  847,  528,  846,  522,  498,
+      499,  498,  499,  498,  498,  499,  499,  499,  499,  499,
+      499,  522,  526,  524,  527,  528,  498,  531,  530,  532,
+      533,  498,  531,  498,  524,  534,  498,  530,  498,  527,
+
+      532,  535,  537,  533,  536,  538,  539,  541,  542,  547,
+      535,  539,  544,  541,  538,  545,  546,  542,  547,  537,
+      550,  551,  845,  549,  534,  552,  536,  554,  560,  544,
+      545,  546,  549,  551,  555,  557,  558,  550,  561,  555,
+      552,  562,  554,  565,  557,  558,  564,  567,  566,  568,
+      560,  561,  575,  565,  564,  566,  569,  571,  562,  574,
+      572,  568,  569,  620,  619,  575,  571,  601,  601,  567,
+      572,  619,  620,  844,  843,  622,  574,  594,  594,  594,
+      594,  594,  594,  595,  595,  595,  595,  595,  595,  597,
+      601,  597,  622,  621,  597,  597,  597,  597,  597,  597,
+
+      600,  600,  600,  600,  600,  600,  621,  602,  626,  842,
+      594,  596,  596,  596,  596,  596,  596,  603,  618,  603,
+      623,  624,  603,  618,  628,  626,  625,  596,  624,  596,
+      602,  596,  596,  600,  625,  627,  618,  628,  627,  603,
+      629,  603,  630,  623,  596,  631,  603,  632,  633,  596,
+      634,  596,  635,  634,  596,  636,  596,  630,  637,  638,
+      640,  644,  629,  639,  632,  641,  642,  631,  645,  635,
+      633,  646,  639,  637,  650,  642,  651,  656,  640,  638,
+      646,  653,  657,  636,  644,  665,  656,  641,  664,  657,
+      645,  667,  668,  841,  650,  665,  700,  664,  653,  699,
+
+      667,  702,  705,  651,  714,  837,  700,  668,  686,  686,
+      686,  686,  686,  686,  690,  690,  690,  690,  690,  690,
+      699,  708,  705,  703,  686,  714,  686,  702,  686,  686,
+      703,  704,  706,  715,  707,  706,  704,  707,  710,  708,
+      712,  686,  711,  717,  710,  718,  686,  690,  686,  712,
+      720,  686,  717,  686,  713,  711,  716,  713,  719,  716,
+      721,  719,  715,  720,  722,  723,  724,  725,  721,  728,
+      731,  718,  732,  735,  722,  733,  725,  736,  723,  756,
+      757,  735,  836,  754,  756,  759,  736,  724,  755,  760,
+      731,  761,  728,  764,  732,  757,  733,  743,  743,  743,
+
+      743,  743,  743,  754,  758,  755,  760,  762,  759,  763,
+      762,  769,  766,  768,  758,  766,  768,  761,  769,  772,
+      770,  764,  763,  770,  771,  773,  778,  771,  793,  795,
+      743,  798,  797,  796,  772,  797,  799,  800,  802,  799,
+      800,  803,  804,  806,  807,  804,  810,  807,  773,  778,
+      795,  796,  809,  798,  808,  793,  802,  808,  811,  826,
+      830,  809,  810,  827,  829,  806,  828,  803,  831,  828,
+      827,  831,  832,  829,  811,  834,  835,  839,  830,  835,
+      826,  840,  838,  849,  830,  838,  839,  853,  850,  832,
+      840,  852,  849,  850,  852,  854,  856,  853,  857,  856,
+
+      854,  857,  858,  863,  864,  858,  865,  866,  867,  865,
+      868,  867,  871,  868,  874,  875,  878,  866,  879,  864,
+      880,  882,  881,  863,  883,  878,  884,  833,  825,  824,
+      875,  879,  823,  822,  871,  874,  884,  821,  820,  882,
+      819,  818,  880,  881,  817,  816,  883,  888,  888,  888,
+      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
+      889,  889,  889,  889,  889,  889,  889,  889,  889,  889,
+      889,  889,  889,  890,  890,  890,  890,  890,  890,  890,
+      890,  890,  890,  890,  890,  890,  891,  815,  814,  891,
+      813,  891,  891,  891,  891,  891,  892,  812,  805,  801,
+
+      892,  892,  892,  892,  892,  892,  893,  893,  893,  893,
+      893,  893,  893,  893,  893,  893,  893,  893,  893,  894,
+      794,  792,  894,  791,  894,  894,  894,  894,  894,  895,
+      790,  895,  895,  789,  895,  895,  895,  895,  895,  895,
+      788,  895,  896,  787,  786,  896,  896,  896,  896,  896,
+      896,  896,  896,  785,  896,  897,  897,  897,  897,  897,
+      897,  897,  897,  897,  897,  897,  897,  897,  898,  898,
+      784,  898,  783,  782,  781,  898,  899,  780,  779,  899,
+      777,  899,  899,  899,  899,  899,  900,  776,  900,  775,
+      774,  767,  900,  901,  765,  901,  753,  752,  751,  901,
+
+      902,  750,  902,  749,  748,  747,  902,  903,  746,  903,
+      745,  742,  741,  903,  904,  740,  904,  734,  730,  729,
+      904,  905,  727,  905,  726,  709,  701,  905,  906,  698,
+      906,  693,  691,  687,  906,  907,  677,  907,  673,  671,
+      669,  907,  908,  666,  908,  663,  662,  661,  908,  909,
+      909,  909,  909,  909,  909,  909,  909,  909,  909,  909,
+      909,  909,  910,  660,  910,  911,  911,  659,  911,  911,
+      911,  658,  911,  912,  912,  655,  912,  913,  654,  913,
+      652,  649,  648,  913,  914,  647,  914,  643,  616,  612,
+      914,  915,  610,  915,  608,  606,  604,  915,  916,  598,
+
+      916,  917,  592,  917,  590,  588,  586,  917,  918,  584,
+      918,  919,  582,  580,  919,  578,  919,  919,  919,  919,
+      919,  920,  920,  920,  920,  920,  920,  920,  920,  920,
+      920,  920,  920,  920,  921,  921,  921,  921,  921,  921,
+      921,  921,  921,  921,  921,  921,  921,  922,  577,  922,
+      576,  573,  570,  922,  923,  563,  923,  559,  556,  553,
+      923,  924,  548,  924,  543,  540,  517,  924,  925,  513,
+      925,  926,  511,  926,  509,  507,  505,  926,  927,  503,
+      927,  928,  502,  928,  501,  500,  489,  928,  929,  486,
+      929,  930,  484,  930,  483,  482,  480,  930,  931,  478,
+
+      931,  932,  475,  932,  473,  471,  469,  932,  933,  465,
+      933,  934,  448,  934,  446,  438,  436,  934,  935,  428,
+      935,  936,  426,  936,  424,  398,  396,  936,  937,  394,
+      937,  938,  392,  938,  391,  938,  390,  938,  939,  377,
+      939,  367,  939,  365,  939,  940,  940,  364,  940,  940,
+      940,  360,  940,  941,  358,  941,  356,  354,  350,  941,
+      942,  348,  942,  347,  346,  336,  942,  943,  321,  943,
+      298,  277,  275,  943,  944,  273,  944,  945,  272,  945,
+      271,  269,  268,  945,  946,  263,  946,  947,  259,  947,
+      258,  254,  251,  947,  948,  250,  948,  949,  239,  949,
+
+      238,  231,  230,  949,  950,  227,  950,  951,  217,  215,
+      951,  214,  951,  951,  951,  951,  951,  952,  952,  952,
+      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
+      953,  213,  953,  207,  206,  204,  953,  954,  199,  954,
+      955,  178,  955,  149,  147,  146,  955,  956,  140,  956,
+      957,  138,  957,  136,  128,  125,  957,  958,  124,  958,
+      959,  120,  959,  101,   98,   95,  959,  960,   93,  960,
+      961,   86,  961,   72,   70,   66,  961,  962,   36,  962,
+      963,   33,  963,   18,   11,    4,  963,  964,    3,  964,
+      965,    0,  965,    0,    0,    0,  965,  966,    0,  966,
+
+        0,    0,    0,  966,  967,    0,  967,  968,    0,  968,
+        0,    0,    0,  968,  969,    0,  969,  970,    0,  970,
+        0,  970,    0,  970,  971,    0,  971,    0,    0,    0,
+      971,  972,    0,  972,    0,    0,    0,  972,  973,    0,
+      973,  974,    0,  974,    0,    0,    0,  974,  975,    0,
+      975,  976,    0,  976,    0,    0,    0,  976,  977,    0,
+      977,  978,    0,  978,    0,    0,    0,  978,  979,    0,
+      979,  980,    0,  980,    0,    0,    0,  980,  981,    0,
+      981,  982,    0,  982,    0,    0,    0,  982,  983,    0,
+      983,  984,    0,    0,  984,    0,  984,  984,  984,  984,
+
+      984,  985,  985,  985,  985,  985,  985,  985,  985,  985,
+      985,  985,  985,  985,  986,    0,  986,    0,    0,    0,
       986,  987,    0,  987,  988,    0,  988,    0,    0,    0,
       988,  989,    0,  989,  990,    0,  990,    0,    0,    0,
-      990,  991,    0,  991,    0,    0,    0,  991,  992,    0,
-      992,  993,    0,  993,    0,    0,    0,  993,  994,    0,
-      994,  995,    0,  995,    0,    0,    0,  995,  996,    0,
-      996,  997,    0,  997,    0,    0,    0,  997,  998,    0,
-
-      998,  999,    0,  999, 1000,    0, 1000, 1001,    0,    0,
-     1001,    0, 1001, 1001, 1001, 1001, 1001, 1002,    0, 1002,
-     1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
-     1003, 1003, 1003, 1004,    0, 1004,    0,    0,    0, 1004,
-     1005,    0, 1005, 1006,    0, 1006,    0,    0,    0, 1006,
-     1007,    0, 1007, 1008,    0, 1008, 1009,    0, 1009, 1010,
-        0,    0, 1010,    0, 1010, 1010, 1010, 1010, 1010, 1011,
-        0, 1011, 1012,    0, 1012, 1013,    0, 1013, 1014,    0,
-     1014, 1015,    0, 1015, 1016,    0, 1016, 1017,    0, 1017,
-     1018,    0, 1018,    0,    0,    0, 1018, 1019,    0, 1019,
-
-     1020,    0, 1020,    0,    0,    0, 1020, 1021,    0, 1021,
-     1022,    0, 1022, 1023,    0, 1023, 1024,    0, 1024, 1025,
-        0, 1025,    0,    0,    0, 1025, 1026,    0,    0, 1026,
-        0, 1026, 1026, 1026, 1026, 1026, 1027,    0, 1027, 1028,
-        0, 1028, 1029,    0, 1029, 1030,    0, 1030,    0,    0,
-        0, 1030, 1031,    0, 1031,    0,    0,    0, 1031, 1032,
-        0, 1032,    0,    0,    0, 1032, 1033,    0, 1033, 1034,
-        0, 1034,    0,    0,    0, 1034, 1035,    0, 1035,    0,
-        0,    0, 1035, 1036,    0, 1036,    0,    0,    0, 1036,
-     1037,    0, 1037,    0,    0,    0, 1037, 1038,    0, 1038,
-
-        0,    0,    0, 1038, 1039,    0, 1039,    0,    0,    0,
-     1039, 1040,    0, 1040,    0,    0,    0, 1040, 1041,    0,
-     1041,    0,    0,    0, 1041, 1042,    0, 1042,    0,    0,
+      990,  991,    0,  991,  992,    0,  992,    0,    0,    0,
+      992,  993,    0,  993,  994,    0,  994,    0,    0,    0,
+      994,  995,    0,  995,  996,    0,  996,    0,    0,    0,
+      996,  997,    0,  997,  998,    0,  998,    0,    0,    0,
+      998,  999,    0,  999, 1000,    0, 1000,    0,    0,    0,
+     1000, 1001,    0, 1001, 1002,    0, 1002,    0,    0,    0,
+
+     1002, 1003,    0, 1003,    0,    0,    0, 1003, 1004,    0,
+     1004, 1005,    0, 1005,    0,    0,    0, 1005, 1006,    0,
+     1006, 1007,    0, 1007,    0,    0,    0, 1007, 1008,    0,
+     1008, 1009,    0, 1009,    0,    0,    0, 1009, 1010,    0,
+     1010, 1011,    0, 1011, 1012,    0, 1012, 1013,    0,    0,
+     1013,    0, 1013, 1013, 1013, 1013, 1013, 1014,    0, 1014,
+     1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
+     1015, 1015, 1015, 1016,    0, 1016,    0,    0,    0, 1016,
+     1017,    0, 1017, 1018,    0, 1018,    0,    0,    0, 1018,
+     1019,    0, 1019, 1020,    0, 1020, 1021,    0, 1021, 1022,
+
+        0,    0, 1022,    0, 1022, 1022, 1022, 1022, 1022, 1023,
+        0, 1023, 1024,    0, 1024, 1025,    0, 1025, 1026,    0,
+     1026, 1027,    0, 1027, 1028,    0, 1028, 1029,    0, 1029,
+     1030,    0, 1030,    0,    0,    0, 1030, 1031,    0, 1031,
+     1032,    0, 1032,    0,    0,    0, 1032, 1033,    0, 1033,
+     1034,    0, 1034, 1035,    0, 1035, 1036,    0, 1036, 1037,
+        0, 1037,    0,    0,    0, 1037, 1038,    0,    0, 1038,
+        0, 1038, 1038, 1038, 1038, 1038, 1039,    0, 1039, 1040,
+        0, 1040, 1041,    0, 1041, 1042,    0, 1042,    0,    0,
         0, 1042, 1043,    0, 1043,    0,    0,    0, 1043, 1044,
-        0, 1044,    0,    0,    0, 1044, 1045,    0, 1045,    0,
-        0,    0, 1045, 1046,    0, 1046,    0,    0,    0, 1046,
-     1047,    0, 1047,    0,    0,    0, 1047, 1048,    0, 1048,
-        0,    0,    0, 1048, 1049,    0, 1049,    0,    0,    0,
-     1049,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875,  875,  875,  875,  875,
-      875,  875,  875,  875,  875,  875
+
+        0, 1044,    0,    0,    0, 1044, 1045,    0, 1045, 1046,
+        0, 1046,    0,    0,    0, 1046, 1047,    0, 1047,    0,
+        0,    0, 1047, 1048,    0, 1048,    0,    0,    0, 1048,
+     1049,    0, 1049,    0,    0,    0, 1049, 1050,    0, 1050,
+        0,    0,    0, 1050, 1051,    0, 1051,    0,    0,    0,
+     1051, 1052,    0, 1052,    0,    0,    0, 1052, 1053,    0,
+     1053,    0,    0,    0, 1053, 1054,    0, 1054,    0,    0,
+        0, 1054, 1055,    0, 1055,    0,    0,    0, 1055, 1056,
+        0, 1056,    0,    0,    0, 1056, 1057,    0, 1057,    0,
+        0,    0, 1057, 1058,    0, 1058,    0,    0,    0, 1058,
+
+     1059,    0, 1059,    0,    0,    0, 1059, 1060,    0, 1060,
+        0,    0,    0, 1060, 1061,    0, 1061,    0,    0,    0,
+     1061,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
+
+      887,  887,  887,  887,  887,  887,  887
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[180] =
+static yyconst flex_int32_t yy_rule_can_match_eol[181] =
     {   0,
 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1420,9 +1435,9 @@
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 
+    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-        };
+    0,     };
 
 static yy_state_type yy_last_accepting_state;
@@ -1452,6 +1467,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Tue Feb  2 15:06:54 2016
- * Update Count     : 426
+ * Last Modified On : Mon Mar 21 23:33:46 2016
+ * Update Count     : 450
  */
 #line 20 "lex.ll"
@@ -1465,6 +1480,7 @@
 
 #include "lex.h"
+#include "parser.h"										// YACC generated definitions based on C++ grammar
 #include "ParseNode.h"
-#include "parser.h"										// YACC generated definitions based on C++ grammar
+#include "TypedefTable.h"
 
 char *yyfilename;
@@ -1482,5 +1498,5 @@
 #define NUMERIC_RETURN(x)	rm_underscore(); RETURN_VAL( x ) // numeric constant
 #define KEYWORD_RETURN(x)	RETURN_CHAR( x )			// keyword
-#define IDENTIFIER_RETURN()	RETURN_VAL( (typedefTable.isIdentifier( yytext ) ? IDENTIFIER : typedefTable.isTypedef( yytext ) ? TYPEDEFname : TYPEGENname ) )
+#define IDENTIFIER_RETURN()	RETURN_VAL( typedefTable.isKind( yytext ) )
 #define ATTRIBUTE_RETURN()	RETURN_VAL( ATTR_IDENTIFIER )
 
@@ -1502,5 +1518,6 @@
 // attribute identifier, GCC: $ in identifier
 // numeric constants, CFA: '_' in constant
-// GCC: D (double), LD (long double) and iI (imaginary) suffixes
+// GCC: D (double), DL (long double) and iI (imaginary) suffixes
+//floating_suffix "_"?([fFdD]|[lL]|[D][L])|([iI][lLfFdD])|([lLfFdD][iI]))
 // character escape sequence, GCC: \e => esc character
 // ' stop highlighting
@@ -1511,5 +1528,5 @@
 
 
-#line 1514 "Parser/lex.cc"
+#line 1531 "Parser/lex.cc"
 
 #define INITIAL 0
@@ -1703,8 +1720,8 @@
 	register int yy_act;
     
-#line 137 "lex.ll"
+#line 139 "lex.ll"
 
 				   /* line directives */
-#line 1709 "Parser/lex.cc"
+#line 1726 "Parser/lex.cc"
 
 	if ( !(yy_init) )
@@ -1760,5 +1777,5 @@
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 876 )
+				if ( yy_current_state >= 888 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
@@ -1766,5 +1783,5 @@
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 2782 );
+		while ( yy_base[yy_current_state] != 2822 );
 
 yy_find_action:
@@ -1803,5 +1820,5 @@
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 139 "lex.ll"
+#line 141 "lex.ll"
 {
 	/* " stop highlighting */
@@ -1830,5 +1847,5 @@
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 162 "lex.ll"
+#line 164 "lex.ll"
 ;
 	YY_BREAK
@@ -1836,5 +1853,5 @@
 case 3:
 YY_RULE_SETUP
-#line 165 "lex.ll"
+#line 167 "lex.ll"
 { BEGIN COMMENT; }
 	YY_BREAK
@@ -1842,10 +1859,10 @@
 /* rule 4 can match eol */
 YY_RULE_SETUP
-#line 166 "lex.ll"
+#line 168 "lex.ll"
 ;
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 167 "lex.ll"
+#line 169 "lex.ll"
 { BEGIN 0; }
 	YY_BREAK
@@ -1854,5 +1871,5 @@
 /* rule 6 can match eol */
 YY_RULE_SETUP
-#line 170 "lex.ll"
+#line 172 "lex.ll"
 ;
 	YY_BREAK
@@ -1860,10 +1877,10 @@
 case 7:
 YY_RULE_SETUP
-#line 173 "lex.ll"
+#line 175 "lex.ll"
 { WHITE_RETURN(' '); }
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 174 "lex.ll"
+#line 176 "lex.ll"
 { WHITE_RETURN(' '); }
 	YY_BREAK
@@ -1871,5 +1888,5 @@
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 175 "lex.ll"
+#line 177 "lex.ll"
 { NEWLINE_RETURN(); }
 	YY_BREAK
@@ -1877,849 +1894,854 @@
 case 10:
 YY_RULE_SETUP
-#line 178 "lex.ll"
+#line 180 "lex.ll"
 { KEYWORD_RETURN(ALIGNAS); }			// C11
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 179 "lex.ll"
+#line 181 "lex.ll"
 { KEYWORD_RETURN(ALIGNOF); }			// C11
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 180 "lex.ll"
+#line 182 "lex.ll"
 { KEYWORD_RETURN(ALIGNOF); }			// GCC
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 181 "lex.ll"
+#line 183 "lex.ll"
 { KEYWORD_RETURN(ALIGNOF); }			// GCC
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 182 "lex.ll"
+#line 184 "lex.ll"
 { KEYWORD_RETURN(ASM); }
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 183 "lex.ll"
+#line 185 "lex.ll"
 { KEYWORD_RETURN(ASM); }				// GCC
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 184 "lex.ll"
+#line 186 "lex.ll"
 { KEYWORD_RETURN(ASM); }				// GCC
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 185 "lex.ll"
+#line 187 "lex.ll"
 { KEYWORD_RETURN(AT); }					// CFA
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 186 "lex.ll"
+#line 188 "lex.ll"
 { KEYWORD_RETURN(ATOMIC); }				// C11
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 187 "lex.ll"
+#line 189 "lex.ll"
 { KEYWORD_RETURN(ATTRIBUTE); }			// GCC
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 188 "lex.ll"
+#line 190 "lex.ll"
 { KEYWORD_RETURN(ATTRIBUTE); }			// GCC
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 189 "lex.ll"
+#line 191 "lex.ll"
 { KEYWORD_RETURN(AUTO); }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 190 "lex.ll"
+#line 192 "lex.ll"
 { KEYWORD_RETURN(BOOL); }				// C99
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 191 "lex.ll"
+#line 193 "lex.ll"
 { KEYWORD_RETURN(BREAK); }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 192 "lex.ll"
+#line 194 "lex.ll"
 { KEYWORD_RETURN(CASE); }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 193 "lex.ll"
+#line 195 "lex.ll"
 { KEYWORD_RETURN(CATCH); }				// CFA
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 194 "lex.ll"
+#line 196 "lex.ll"
 { KEYWORD_RETURN(CATCHRESUME); }		// CFA
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 195 "lex.ll"
+#line 197 "lex.ll"
 { KEYWORD_RETURN(CHAR); }
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 196 "lex.ll"
+#line 198 "lex.ll"
 { KEYWORD_RETURN(CHOOSE); }				// CFA
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 197 "lex.ll"
+#line 199 "lex.ll"
 { KEYWORD_RETURN(COMPLEX); }			// C99
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 198 "lex.ll"
+#line 200 "lex.ll"
 { KEYWORD_RETURN(COMPLEX); }			// GCC
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 199 "lex.ll"
+#line 201 "lex.ll"
 { KEYWORD_RETURN(COMPLEX); }			// GCC
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 200 "lex.ll"
+#line 202 "lex.ll"
 { KEYWORD_RETURN(CONST); }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 201 "lex.ll"
+#line 203 "lex.ll"
 { KEYWORD_RETURN(CONST); }				// GCC
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 202 "lex.ll"
+#line 204 "lex.ll"
 { KEYWORD_RETURN(CONST); }				// GCC
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 203 "lex.ll"
-{ KEYWORD_RETURN(CONTEXT); }			// CFA
+#line 205 "lex.ll"
+{ KEYWORD_RETURN(CONTINUE); }
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 204 "lex.ll"
-{ KEYWORD_RETURN(CONTINUE); }
+#line 206 "lex.ll"
+{ KEYWORD_RETURN(DEFAULT); }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 205 "lex.ll"
-{ KEYWORD_RETURN(DEFAULT); }
+#line 207 "lex.ll"
+{ KEYWORD_RETURN(DISABLE); }			// CFA
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 206 "lex.ll"
-{ KEYWORD_RETURN(DISABLE); }			// CFA
+#line 208 "lex.ll"
+{ KEYWORD_RETURN(DO); }
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 207 "lex.ll"
-{ KEYWORD_RETURN(DO); }
+#line 209 "lex.ll"
+{ KEYWORD_RETURN(DOUBLE); }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 208 "lex.ll"
-{ KEYWORD_RETURN(DOUBLE); }
+#line 210 "lex.ll"
+{ KEYWORD_RETURN(DTYPE); }				// CFA
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 209 "lex.ll"
-{ KEYWORD_RETURN(DTYPE); }				// CFA
+#line 211 "lex.ll"
+{ KEYWORD_RETURN(ELSE); }
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 210 "lex.ll"
-{ KEYWORD_RETURN(ELSE); }
+#line 212 "lex.ll"
+{ KEYWORD_RETURN(ENABLE); }				// CFA
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 211 "lex.ll"
-{ KEYWORD_RETURN(ENABLE); }				// CFA
+#line 213 "lex.ll"
+{ KEYWORD_RETURN(ENUM); }
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 212 "lex.ll"
-{ KEYWORD_RETURN(ENUM); }
+#line 214 "lex.ll"
+{ KEYWORD_RETURN(EXTENSION); }			// GCC
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 213 "lex.ll"
-{ KEYWORD_RETURN(EXTENSION); }			// GCC
+#line 215 "lex.ll"
+{ KEYWORD_RETURN(EXTERN); }
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 214 "lex.ll"
-{ KEYWORD_RETURN(EXTERN); }
+#line 216 "lex.ll"
+{ KEYWORD_RETURN(FALLTHRU); }			// CFA
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 215 "lex.ll"
-{ KEYWORD_RETURN(FALLTHRU); }			// CFA
+#line 217 "lex.ll"
+{ KEYWORD_RETURN(FINALLY); }			// CFA
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 216 "lex.ll"
-{ KEYWORD_RETURN(FINALLY); }			// CFA
+#line 218 "lex.ll"
+{ KEYWORD_RETURN(FLOAT); }
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 217 "lex.ll"
-{ KEYWORD_RETURN(FLOAT); }
+#line 219 "lex.ll"
+{ KEYWORD_RETURN(FLOAT); }				// GCC
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 218 "lex.ll"
-{ KEYWORD_RETURN(FLOAT); }				// GCC
+#line 220 "lex.ll"
+{ KEYWORD_RETURN(FOR); }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 219 "lex.ll"
-{ KEYWORD_RETURN(FOR); }
+#line 221 "lex.ll"
+{ KEYWORD_RETURN(FORALL); }				// CFA
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 220 "lex.ll"
-{ KEYWORD_RETURN(FORALL); }				// CFA
+#line 222 "lex.ll"
+{ KEYWORD_RETURN(FORTRAN); }
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 221 "lex.ll"
-{ KEYWORD_RETURN(FORTRAN); }
+#line 223 "lex.ll"
+{ KEYWORD_RETURN(FTYPE); }				// CFA
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 222 "lex.ll"
-{ KEYWORD_RETURN(FTYPE); }				// CFA
+#line 224 "lex.ll"
+{ KEYWORD_RETURN(GENERIC); }			// C11
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 223 "lex.ll"
-{ KEYWORD_RETURN(GENERIC); }			// C11
+#line 225 "lex.ll"
+{ KEYWORD_RETURN(GOTO); }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 224 "lex.ll"
-{ KEYWORD_RETURN(GOTO); }
+#line 226 "lex.ll"
+{ KEYWORD_RETURN(IF); }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 225 "lex.ll"
-{ KEYWORD_RETURN(IF); }
+#line 227 "lex.ll"
+{ KEYWORD_RETURN(IMAGINARY); }			// C99
 	YY_BREAK
 case 58:
-YY_RULE_SETUP
-#line 226 "lex.ll"
-{ KEYWORD_RETURN(IMAGINARY); }			// C99
-	YY_BREAK
-case 59:
-YY_RULE_SETUP
-#line 227 "lex.ll"
-{ KEYWORD_RETURN(IMAGINARY); }			// GCC
-	YY_BREAK
-case 60:
 YY_RULE_SETUP
 #line 228 "lex.ll"
 { KEYWORD_RETURN(IMAGINARY); }			// GCC
 	YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 229 "lex.ll"
+{ KEYWORD_RETURN(IMAGINARY); }			// GCC
+	YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 230 "lex.ll"
+{ KEYWORD_RETURN(INLINE); }				// C99
+	YY_BREAK
 case 61:
-YY_RULE_SETUP
-#line 229 "lex.ll"
-{ KEYWORD_RETURN(INLINE); }				// C99
-	YY_BREAK
-case 62:
-YY_RULE_SETUP
-#line 230 "lex.ll"
-{ KEYWORD_RETURN(INLINE); }				// GCC
-	YY_BREAK
-case 63:
 YY_RULE_SETUP
 #line 231 "lex.ll"
 { KEYWORD_RETURN(INLINE); }				// GCC
 	YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 232 "lex.ll"
+{ KEYWORD_RETURN(INLINE); }				// GCC
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 233 "lex.ll"
+{ KEYWORD_RETURN(INT); }
+	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 232 "lex.ll"
-{ KEYWORD_RETURN(INT); }
+#line 234 "lex.ll"
+{ KEYWORD_RETURN(INT); }				// GCC
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 233 "lex.ll"
-{ KEYWORD_RETURN(INT); }				// GCC
+#line 235 "lex.ll"
+{ KEYWORD_RETURN(LABEL); }				// GCC
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 234 "lex.ll"
-{ KEYWORD_RETURN(LABEL); }				// GCC
+#line 236 "lex.ll"
+{ KEYWORD_RETURN(LONG); }
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 235 "lex.ll"
-{ KEYWORD_RETURN(LONG); }
+#line 237 "lex.ll"
+{ KEYWORD_RETURN(LVALUE); }				// CFA
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 236 "lex.ll"
-{ KEYWORD_RETURN(LVALUE); }				// CFA
+#line 238 "lex.ll"
+{ KEYWORD_RETURN(NORETURN); }			// C11
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 237 "lex.ll"
-{ KEYWORD_RETURN(NORETURN); }			// C11
+#line 239 "lex.ll"
+{ KEYWORD_RETURN(OFFSETOF); }		// GCC
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 238 "lex.ll"
-{ KEYWORD_RETURN(OFFSETOF); }		// GCC
+#line 240 "lex.ll"
+{ KEYWORD_RETURN(OTYPE); }				// CFA
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 239 "lex.ll"
+#line 241 "lex.ll"
 { KEYWORD_RETURN(REGISTER); }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 240 "lex.ll"
+#line 242 "lex.ll"
 { KEYWORD_RETURN(RESTRICT); }			// C99
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 241 "lex.ll"
+#line 243 "lex.ll"
 { KEYWORD_RETURN(RESTRICT); }			// GCC
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 242 "lex.ll"
+#line 244 "lex.ll"
 { KEYWORD_RETURN(RESTRICT); }			// GCC
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 243 "lex.ll"
+#line 245 "lex.ll"
 { KEYWORD_RETURN(RETURN); }
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 244 "lex.ll"
+#line 246 "lex.ll"
 { KEYWORD_RETURN(SHORT); }
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 245 "lex.ll"
+#line 247 "lex.ll"
 { KEYWORD_RETURN(SIGNED); }
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 246 "lex.ll"
+#line 248 "lex.ll"
 { KEYWORD_RETURN(SIGNED); }				// GCC
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 247 "lex.ll"
+#line 249 "lex.ll"
 { KEYWORD_RETURN(SIGNED); }				// GCC
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 248 "lex.ll"
+#line 250 "lex.ll"
 { KEYWORD_RETURN(SIZEOF); }
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 249 "lex.ll"
+#line 251 "lex.ll"
 { KEYWORD_RETURN(STATIC); }
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 250 "lex.ll"
+#line 252 "lex.ll"
 { KEYWORD_RETURN(STATICASSERT); }		// C11
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 251 "lex.ll"
+#line 253 "lex.ll"
 { KEYWORD_RETURN(STRUCT); }
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 252 "lex.ll"
+#line 254 "lex.ll"
 { KEYWORD_RETURN(SWITCH); }
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 253 "lex.ll"
+#line 255 "lex.ll"
 { KEYWORD_RETURN(THREADLOCAL); }		// C11
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 254 "lex.ll"
+#line 256 "lex.ll"
 { KEYWORD_RETURN(THROW); }				// CFA
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 255 "lex.ll"
+#line 257 "lex.ll"
 { KEYWORD_RETURN(THROWRESUME); }		// CFA
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 256 "lex.ll"
+#line 258 "lex.ll"
+{ KEYWORD_RETURN(TRAIT); }				// CFA
+	YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 259 "lex.ll"
 { KEYWORD_RETURN(TRY); }				// CFA
 	YY_BREAK
-case 89:
-YY_RULE_SETUP
-#line 257 "lex.ll"
-{ KEYWORD_RETURN(TYPE); }				// CFA
-	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 258 "lex.ll"
+#line 260 "lex.ll"
 { KEYWORD_RETURN(TYPEDEF); }
 	YY_BREAK
 case 91:
-YY_RULE_SETUP
-#line 259 "lex.ll"
-{ KEYWORD_RETURN(TYPEOF); }				// GCC
-	YY_BREAK
-case 92:
-YY_RULE_SETUP
-#line 260 "lex.ll"
-{ KEYWORD_RETURN(TYPEOF); }				// GCC
-	YY_BREAK
-case 93:
 YY_RULE_SETUP
 #line 261 "lex.ll"
 { KEYWORD_RETURN(TYPEOF); }				// GCC
 	YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 262 "lex.ll"
+{ KEYWORD_RETURN(TYPEOF); }				// GCC
+	YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 263 "lex.ll"
+{ KEYWORD_RETURN(TYPEOF); }				// GCC
+	YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 262 "lex.ll"
+#line 264 "lex.ll"
 { KEYWORD_RETURN(UNION); }
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 263 "lex.ll"
+#line 265 "lex.ll"
 { KEYWORD_RETURN(UNSIGNED); }
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 264 "lex.ll"
+#line 266 "lex.ll"
+{ KEYWORD_RETURN(VALIST); }			// GCC
+	YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 267 "lex.ll"
 { KEYWORD_RETURN(VOID); }
 	YY_BREAK
-case 97:
-YY_RULE_SETUP
-#line 265 "lex.ll"
+case 98:
+YY_RULE_SETUP
+#line 268 "lex.ll"
 { KEYWORD_RETURN(VOLATILE); }
 	YY_BREAK
-case 98:
-YY_RULE_SETUP
-#line 266 "lex.ll"
+case 99:
+YY_RULE_SETUP
+#line 269 "lex.ll"
 { KEYWORD_RETURN(VOLATILE); }			// GCC
 	YY_BREAK
-case 99:
-YY_RULE_SETUP
-#line 267 "lex.ll"
+case 100:
+YY_RULE_SETUP
+#line 270 "lex.ll"
 { KEYWORD_RETURN(VOLATILE); }			// GCC
 	YY_BREAK
-case 100:
-YY_RULE_SETUP
-#line 268 "lex.ll"
+case 101:
+YY_RULE_SETUP
+#line 271 "lex.ll"
 { KEYWORD_RETURN(WHILE); }
 	YY_BREAK
 /* identifier */
-case 101:
-YY_RULE_SETUP
-#line 271 "lex.ll"
-{ IDENTIFIER_RETURN(); }
-	YY_BREAK
 case 102:
-YY_RULE_SETUP
-#line 272 "lex.ll"
-{ ATTRIBUTE_RETURN(); }
-	YY_BREAK
-case 103:
-YY_RULE_SETUP
-#line 273 "lex.ll"
-{ BEGIN BKQUOTE; }
-	YY_BREAK
-case 104:
 YY_RULE_SETUP
 #line 274 "lex.ll"
 { IDENTIFIER_RETURN(); }
 	YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 275 "lex.ll"
+{ ATTRIBUTE_RETURN(); }
+	YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 276 "lex.ll"
+{ BEGIN BKQUOTE; }
+	YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 275 "lex.ll"
+#line 277 "lex.ll"
+{ IDENTIFIER_RETURN(); }
+	YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 278 "lex.ll"
 { BEGIN 0; }
 	YY_BREAK
 /* numeric constants */
-case 106:
-YY_RULE_SETUP
-#line 278 "lex.ll"
+case 107:
+YY_RULE_SETUP
+#line 281 "lex.ll"
 { NUMERIC_RETURN(ZERO); }				// CFA
 	YY_BREAK
-case 107:
-YY_RULE_SETUP
-#line 279 "lex.ll"
+case 108:
+YY_RULE_SETUP
+#line 282 "lex.ll"
 { NUMERIC_RETURN(ONE); }				// CFA
 	YY_BREAK
-case 108:
-YY_RULE_SETUP
-#line 280 "lex.ll"
+case 109:
+YY_RULE_SETUP
+#line 283 "lex.ll"
 { NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
-case 109:
-YY_RULE_SETUP
-#line 281 "lex.ll"
+case 110:
+YY_RULE_SETUP
+#line 284 "lex.ll"
 { NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
-case 110:
-YY_RULE_SETUP
-#line 282 "lex.ll"
+case 111:
+YY_RULE_SETUP
+#line 285 "lex.ll"
 { NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
-case 111:
-YY_RULE_SETUP
-#line 283 "lex.ll"
+case 112:
+YY_RULE_SETUP
+#line 286 "lex.ll"
 { NUMERIC_RETURN(FLOATINGconstant); }
 	YY_BREAK
-case 112:
-YY_RULE_SETUP
-#line 284 "lex.ll"
+case 113:
+YY_RULE_SETUP
+#line 287 "lex.ll"
 { NUMERIC_RETURN(FLOATINGconstant); }
 	YY_BREAK
 /* character constant, allows empty value */
-case 113:
-YY_RULE_SETUP
-#line 287 "lex.ll"
+case 114:
+YY_RULE_SETUP
+#line 290 "lex.ll"
 { BEGIN QUOTE; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
 	YY_BREAK
-case 114:
-YY_RULE_SETUP
-#line 288 "lex.ll"
+case 115:
+YY_RULE_SETUP
+#line 291 "lex.ll"
 { *strtext += std::string( yytext ); }
 	YY_BREAK
-case 115:
-/* rule 115 can match eol */
-YY_RULE_SETUP
-#line 289 "lex.ll"
+case 116:
+/* rule 116 can match eol */
+YY_RULE_SETUP
+#line 292 "lex.ll"
 { BEGIN 0; *strtext += std::string( yytext); RETURN_STR(CHARACTERconstant); }
 	YY_BREAK
 /* ' stop highlighting */
 /* string constant */
-case 116:
-YY_RULE_SETUP
-#line 293 "lex.ll"
+case 117:
+YY_RULE_SETUP
+#line 296 "lex.ll"
 { BEGIN STRING; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
 	YY_BREAK
-case 117:
-YY_RULE_SETUP
-#line 294 "lex.ll"
+case 118:
+YY_RULE_SETUP
+#line 297 "lex.ll"
 { *strtext += std::string( yytext ); }
 	YY_BREAK
-case 118:
-/* rule 118 can match eol */
-YY_RULE_SETUP
-#line 295 "lex.ll"
+case 119:
+/* rule 119 can match eol */
+YY_RULE_SETUP
+#line 298 "lex.ll"
 { BEGIN 0; *strtext += std::string( yytext ); RETURN_STR(STRINGliteral); }
 	YY_BREAK
 /* " stop highlighting */
 /* common character/string constant */
-case 119:
-YY_RULE_SETUP
-#line 299 "lex.ll"
+case 120:
+YY_RULE_SETUP
+#line 302 "lex.ll"
 { rm_underscore(); *strtext += std::string( yytext ); }
 	YY_BREAK
-case 120:
-/* rule 120 can match eol */
-YY_RULE_SETUP
-#line 300 "lex.ll"
+case 121:
+/* rule 121 can match eol */
+YY_RULE_SETUP
+#line 303 "lex.ll"
 {}						// continuation (ALSO HANDLED BY CPP)
 	YY_BREAK
-case 121:
-YY_RULE_SETUP
-#line 301 "lex.ll"
+case 122:
+YY_RULE_SETUP
+#line 304 "lex.ll"
 { *strtext += std::string( yytext ); } // unknown escape character
 	YY_BREAK
 /* punctuation */
-case 122:
-YY_RULE_SETUP
-#line 304 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
 case 123:
-YY_RULE_SETUP
-#line 305 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
-case 124:
-YY_RULE_SETUP
-#line 306 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
-case 125:
 YY_RULE_SETUP
 #line 307 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 126:
+case 124:
 YY_RULE_SETUP
 #line 308 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 127:
+case 125:
 YY_RULE_SETUP
 #line 309 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 128:
+case 126:
 YY_RULE_SETUP
 #line 310 "lex.ll"
-{ ASCIIOP_RETURN(); }					// also operator
-	YY_BREAK
-case 129:
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 127:
 YY_RULE_SETUP
 #line 311 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 130:
+case 128:
 YY_RULE_SETUP
 #line 312 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 131:
+case 129:
 YY_RULE_SETUP
 #line 313 "lex.ll"
 { ASCIIOP_RETURN(); }					// also operator
 	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 314 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 131:
+YY_RULE_SETUP
+#line 315 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 314 "lex.ll"
+#line 316 "lex.ll"
+{ ASCIIOP_RETURN(); }					// also operator
+	YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 317 "lex.ll"
 { NAMEDOP_RETURN(ELLIPSIS); }
 	YY_BREAK
 /* alternative C99 brackets, "<:" & "<:<:" handled by preprocessor */
-case 133:
-YY_RULE_SETUP
-#line 317 "lex.ll"
+case 134:
+YY_RULE_SETUP
+#line 320 "lex.ll"
 { RETURN_VAL('['); }
 	YY_BREAK
-case 134:
-YY_RULE_SETUP
-#line 318 "lex.ll"
+case 135:
+YY_RULE_SETUP
+#line 321 "lex.ll"
 { RETURN_VAL(']'); }
 	YY_BREAK
-case 135:
-YY_RULE_SETUP
-#line 319 "lex.ll"
+case 136:
+YY_RULE_SETUP
+#line 322 "lex.ll"
 { RETURN_VAL('{'); }
 	YY_BREAK
-case 136:
-YY_RULE_SETUP
-#line 320 "lex.ll"
+case 137:
+YY_RULE_SETUP
+#line 323 "lex.ll"
 { RETURN_VAL('}'); }
 	YY_BREAK
 /* operators */
-case 137:
-YY_RULE_SETUP
-#line 323 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
 case 138:
-YY_RULE_SETUP
-#line 324 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
-case 139:
-YY_RULE_SETUP
-#line 325 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
-case 140:
 YY_RULE_SETUP
 #line 326 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 141:
+case 139:
 YY_RULE_SETUP
 #line 327 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 142:
+case 140:
 YY_RULE_SETUP
 #line 328 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 143:
+case 141:
 YY_RULE_SETUP
 #line 329 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 144:
+case 142:
 YY_RULE_SETUP
 #line 330 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 145:
+case 143:
 YY_RULE_SETUP
 #line 331 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 146:
+case 144:
 YY_RULE_SETUP
 #line 332 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 147:
+case 145:
 YY_RULE_SETUP
 #line 333 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 148:
+case 146:
 YY_RULE_SETUP
 #line 334 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 149:
+case 147:
 YY_RULE_SETUP
 #line 335 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
-case 150:
+case 148:
 YY_RULE_SETUP
 #line 336 "lex.ll"
 { ASCIIOP_RETURN(); }
 	YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 337 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 338 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
 case 151:
 YY_RULE_SETUP
-#line 338 "lex.ll"
+#line 339 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 341 "lex.ll"
 { NAMEDOP_RETURN(ICR); }
 	YY_BREAK
-case 152:
-YY_RULE_SETUP
-#line 339 "lex.ll"
+case 153:
+YY_RULE_SETUP
+#line 342 "lex.ll"
 { NAMEDOP_RETURN(DECR); }
 	YY_BREAK
-case 153:
-YY_RULE_SETUP
-#line 340 "lex.ll"
+case 154:
+YY_RULE_SETUP
+#line 343 "lex.ll"
 { NAMEDOP_RETURN(EQ); }
 	YY_BREAK
-case 154:
-YY_RULE_SETUP
-#line 341 "lex.ll"
+case 155:
+YY_RULE_SETUP
+#line 344 "lex.ll"
 { NAMEDOP_RETURN(NE); }
 	YY_BREAK
-case 155:
-YY_RULE_SETUP
-#line 342 "lex.ll"
+case 156:
+YY_RULE_SETUP
+#line 345 "lex.ll"
 { NAMEDOP_RETURN(LS); }
 	YY_BREAK
-case 156:
-YY_RULE_SETUP
-#line 343 "lex.ll"
+case 157:
+YY_RULE_SETUP
+#line 346 "lex.ll"
 { NAMEDOP_RETURN(RS); }
 	YY_BREAK
-case 157:
-YY_RULE_SETUP
-#line 344 "lex.ll"
+case 158:
+YY_RULE_SETUP
+#line 347 "lex.ll"
 { NAMEDOP_RETURN(LE); }
 	YY_BREAK
-case 158:
-YY_RULE_SETUP
-#line 345 "lex.ll"
+case 159:
+YY_RULE_SETUP
+#line 348 "lex.ll"
 { NAMEDOP_RETURN(GE); }
 	YY_BREAK
-case 159:
-YY_RULE_SETUP
-#line 346 "lex.ll"
+case 160:
+YY_RULE_SETUP
+#line 349 "lex.ll"
 { NAMEDOP_RETURN(ANDAND); }
 	YY_BREAK
-case 160:
-YY_RULE_SETUP
-#line 347 "lex.ll"
+case 161:
+YY_RULE_SETUP
+#line 350 "lex.ll"
 { NAMEDOP_RETURN(OROR); }
 	YY_BREAK
-case 161:
-YY_RULE_SETUP
-#line 348 "lex.ll"
+case 162:
+YY_RULE_SETUP
+#line 351 "lex.ll"
 { NAMEDOP_RETURN(ARROW); }
 	YY_BREAK
-case 162:
-YY_RULE_SETUP
-#line 349 "lex.ll"
+case 163:
+YY_RULE_SETUP
+#line 352 "lex.ll"
 { NAMEDOP_RETURN(PLUSassign); }
 	YY_BREAK
-case 163:
-YY_RULE_SETUP
-#line 350 "lex.ll"
+case 164:
+YY_RULE_SETUP
+#line 353 "lex.ll"
 { NAMEDOP_RETURN(MINUSassign); }
 	YY_BREAK
-case 164:
-YY_RULE_SETUP
-#line 351 "lex.ll"
+case 165:
+YY_RULE_SETUP
+#line 354 "lex.ll"
 { NAMEDOP_RETURN(MULTassign); }
 	YY_BREAK
-case 165:
-YY_RULE_SETUP
-#line 352 "lex.ll"
+case 166:
+YY_RULE_SETUP
+#line 355 "lex.ll"
 { NAMEDOP_RETURN(DIVassign); }
 	YY_BREAK
-case 166:
-YY_RULE_SETUP
-#line 353 "lex.ll"
+case 167:
+YY_RULE_SETUP
+#line 356 "lex.ll"
 { NAMEDOP_RETURN(MODassign); }
 	YY_BREAK
-case 167:
-YY_RULE_SETUP
-#line 354 "lex.ll"
+case 168:
+YY_RULE_SETUP
+#line 357 "lex.ll"
 { NAMEDOP_RETURN(ANDassign); }
 	YY_BREAK
-case 168:
-YY_RULE_SETUP
-#line 355 "lex.ll"
+case 169:
+YY_RULE_SETUP
+#line 358 "lex.ll"
 { NAMEDOP_RETURN(ORassign); }
 	YY_BREAK
-case 169:
-YY_RULE_SETUP
-#line 356 "lex.ll"
+case 170:
+YY_RULE_SETUP
+#line 359 "lex.ll"
 { NAMEDOP_RETURN(ERassign); }
 	YY_BREAK
-case 170:
-YY_RULE_SETUP
-#line 357 "lex.ll"
+case 171:
+YY_RULE_SETUP
+#line 360 "lex.ll"
 { NAMEDOP_RETURN(LSassign); }
 	YY_BREAK
-case 171:
-YY_RULE_SETUP
-#line 358 "lex.ll"
+case 172:
+YY_RULE_SETUP
+#line 361 "lex.ll"
 { NAMEDOP_RETURN(RSassign); }
 	YY_BREAK
-case 172:
-YY_RULE_SETUP
-#line 360 "lex.ll"
+case 173:
+YY_RULE_SETUP
+#line 363 "lex.ll"
 { NAMEDOP_RETURN(ATassign); }
 	YY_BREAK
 /* CFA, operator identifier */
-case 173:
-YY_RULE_SETUP
-#line 363 "lex.ll"
+case 174:
+YY_RULE_SETUP
+#line 366 "lex.ll"
 { IDENTIFIER_RETURN(); }				// unary
 	YY_BREAK
-case 174:
-YY_RULE_SETUP
-#line 364 "lex.ll"
+case 175:
+YY_RULE_SETUP
+#line 367 "lex.ll"
 { IDENTIFIER_RETURN(); }
 	YY_BREAK
-case 175:
-YY_RULE_SETUP
-#line 365 "lex.ll"
+case 176:
+YY_RULE_SETUP
+#line 368 "lex.ll"
 { IDENTIFIER_RETURN(); }
 	YY_BREAK
-case 176:
-YY_RULE_SETUP
-#line 366 "lex.ll"
+case 177:
+YY_RULE_SETUP
+#line 369 "lex.ll"
 { IDENTIFIER_RETURN(); }		// binary
 	YY_BREAK
@@ -2750,7 +2772,7 @@
 	  an argument list.
 	*/
-case 177:
-YY_RULE_SETUP
-#line 393 "lex.ll"
+case 178:
+YY_RULE_SETUP
+#line 396 "lex.ll"
 {
 	// 1 or 2 character unary operator ?
@@ -2765,15 +2787,15 @@
 	YY_BREAK
 /* unknown characters */
-case 178:
-YY_RULE_SETUP
-#line 405 "lex.ll"
+case 179:
+YY_RULE_SETUP
+#line 408 "lex.ll"
 { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }
 	YY_BREAK
-case 179:
-YY_RULE_SETUP
-#line 407 "lex.ll"
+case 180:
+YY_RULE_SETUP
+#line 410 "lex.ll"
 ECHO;
 	YY_BREAK
-#line 2778 "Parser/lex.cc"
+#line 2800 "Parser/lex.cc"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
@@ -3072,5 +3094,5 @@
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 876 )
+			if ( yy_current_state >= 888 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
@@ -3100,9 +3122,9 @@
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 876 )
+		if ( yy_current_state >= 888 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 875);
+	yy_is_jam = (yy_current_state == 887);
 
 	return yy_is_jam ? 0 : yy_current_state;
@@ -3750,5 +3772,5 @@
 #define YYTABLES_NAME "yytables"
 
-#line 407 "lex.ll"
+#line 410 "lex.ll"
 
 
Index: src/Parser/lex.h
===================================================================
--- src/Parser/lex.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/lex.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep 22 08:58:10 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 20:28:48 2015
-// Update Count     : 341
+// Last Modified On : Mon Mar 21 18:18:06 2016
+// Update Count     : 346
 //
 
@@ -20,6 +20,8 @@
 void yyerror( const char * );
 
+#include <string>
+#include "ParseNode.h"
 // External declarations for information sharing between lexer and scanner
-#include "TypedefTable.h"
+class TypedefTable;
 extern TypedefTable typedefTable;
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/lex.ll	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Tue Feb  2 15:06:54 2016
- * Update Count     : 426
+ * Last Modified On : Mon Mar 21 23:33:46 2016
+ * Update Count     : 450
  */
 
@@ -27,6 +27,7 @@
 
 #include "lex.h"
+#include "parser.h"										// YACC generated definitions based on C++ grammar
 #include "ParseNode.h"
-#include "parser.h"										// YACC generated definitions based on C++ grammar
+#include "TypedefTable.h"
 
 char *yyfilename;
@@ -44,5 +45,5 @@
 #define NUMERIC_RETURN(x)	rm_underscore(); RETURN_VAL( x ) // numeric constant
 #define KEYWORD_RETURN(x)	RETURN_CHAR( x )			// keyword
-#define IDENTIFIER_RETURN()	RETURN_VAL( (typedefTable.isIdentifier( yytext ) ? IDENTIFIER : typedefTable.isTypedef( yytext ) ? TYPEDEFname : TYPEGENname ) )
+#define IDENTIFIER_RETURN()	RETURN_VAL( typedefTable.isKind( yytext ) )
 #define ATTRIBUTE_RETURN()	RETURN_VAL( ATTR_IDENTIFIER )
 
@@ -95,6 +96,7 @@
 fractional_constant ({decimal_digits}?"."{decimal_digits})|({decimal_digits}".")
 exponent "_"?[eE]"_"?[+-]?{decimal_digits}
-				// GCC: D (double), LD (long double) and iI (imaginary) suffixes
-floating_suffix "_"?([fFdD]?|([lL]?)|([iI][lLfFdD]?)|([lLfFdD][iI]))
+				// GCC: D (double), DL (long double) and iI (imaginary) suffixes
+floating_suffix "_"?([fFdDlL][iI]?|"DL"|[iI][lLfFdD]?)
+				//floating_suffix "_"?([fFdD]|[lL]|[D][L])|([iI][lLfFdD])|([lLfFdD][iI]))
 floating_constant (({fractional_constant}{exponent}?)|({decimal_digits}{exponent})){floating_suffix}?
 
@@ -137,5 +139,5 @@
 %%
 				   /* line directives */
-^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["][^\n]*"\n" {
+^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["].*"\n" {
 	/* " stop highlighting */
 	char *end_num;
@@ -201,5 +203,4 @@
 __const			{ KEYWORD_RETURN(CONST); }				// GCC
 __const__		{ KEYWORD_RETURN(CONST); }				// GCC
-context			{ KEYWORD_RETURN(CONTEXT); }			// CFA
 continue		{ KEYWORD_RETURN(CONTINUE); }
 default			{ KEYWORD_RETURN(DEFAULT); }
@@ -237,4 +238,5 @@
 _Noreturn		{ KEYWORD_RETURN(NORETURN); }			// C11
 __builtin_offsetof { KEYWORD_RETURN(OFFSETOF); }		// GCC
+otype			{ KEYWORD_RETURN(OTYPE); }				// CFA
 register		{ KEYWORD_RETURN(REGISTER); }
 restrict		{ KEYWORD_RETURN(RESTRICT); }			// C99
@@ -254,6 +256,6 @@
 throw			{ KEYWORD_RETURN(THROW); }				// CFA
 throwResume		{ KEYWORD_RETURN(THROWRESUME); }		// CFA
+trait			{ KEYWORD_RETURN(TRAIT); }				// CFA
 try				{ KEYWORD_RETURN(TRY); }				// CFA
-type			{ KEYWORD_RETURN(TYPE); }				// CFA
 typedef			{ KEYWORD_RETURN(TYPEDEF); }
 typeof			{ KEYWORD_RETURN(TYPEOF); }				// GCC
@@ -262,4 +264,5 @@
 union			{ KEYWORD_RETURN(UNION); }
 unsigned		{ KEYWORD_RETURN(UNSIGNED); }
+__builtin_va_list { KEYWORD_RETURN(VALIST); }			// GCC
 void			{ KEYWORD_RETURN(VOID); }
 volatile		{ KEYWORD_RETURN(VOLATILE); }
Index: src/Parser/parser.cc
===================================================================
--- src/Parser/parser.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/parser.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -77,7 +77,8 @@
 #include <cstdio>
 #include <stack>
+#include "lex.h"
+#include "parser.h"
+#include "ParseNode.h"
 #include "TypedefTable.h"
-#include "lex.h"
-#include "ParseNode.h"
 #include "TypeData.h"
 #include "LinkageSpec.h"
@@ -90,5 +91,5 @@
 
 /* Line 268 of yacc.c  */
-#line 93 "Parser/parser.cc"
+#line 94 "Parser/parser.cc"
 
 /* Enabling traces.  */
@@ -138,88 +139,89 @@
      SIGNED = 277,
      UNSIGNED = 278,
-     BOOL = 279,
-     COMPLEX = 280,
-     IMAGINARY = 281,
-     TYPEOF = 282,
-     LABEL = 283,
-     ENUM = 284,
-     STRUCT = 285,
-     UNION = 286,
-     TYPE = 287,
-     FTYPE = 288,
-     DTYPE = 289,
-     CONTEXT = 290,
-     SIZEOF = 291,
-     OFFSETOF = 292,
-     ATTRIBUTE = 293,
-     EXTENSION = 294,
-     IF = 295,
-     ELSE = 296,
-     SWITCH = 297,
-     CASE = 298,
-     DEFAULT = 299,
-     DO = 300,
-     WHILE = 301,
-     FOR = 302,
-     BREAK = 303,
-     CONTINUE = 304,
-     GOTO = 305,
-     RETURN = 306,
-     CHOOSE = 307,
-     DISABLE = 308,
-     ENABLE = 309,
-     FALLTHRU = 310,
-     TRY = 311,
-     CATCH = 312,
-     CATCHRESUME = 313,
-     FINALLY = 314,
-     THROW = 315,
-     THROWRESUME = 316,
-     AT = 317,
-     ASM = 318,
-     ALIGNAS = 319,
-     ALIGNOF = 320,
-     ATOMIC = 321,
-     GENERIC = 322,
-     NORETURN = 323,
-     STATICASSERT = 324,
-     THREADLOCAL = 325,
-     IDENTIFIER = 326,
-     QUOTED_IDENTIFIER = 327,
-     TYPEDEFname = 328,
-     TYPEGENname = 329,
-     ATTR_IDENTIFIER = 330,
-     ATTR_TYPEDEFname = 331,
-     ATTR_TYPEGENname = 332,
-     INTEGERconstant = 333,
-     FLOATINGconstant = 334,
-     CHARACTERconstant = 335,
-     STRINGliteral = 336,
-     ZERO = 337,
-     ONE = 338,
-     ARROW = 339,
-     ICR = 340,
-     DECR = 341,
-     LS = 342,
-     RS = 343,
-     LE = 344,
-     GE = 345,
-     EQ = 346,
-     NE = 347,
-     ANDAND = 348,
-     OROR = 349,
-     ELLIPSIS = 350,
-     MULTassign = 351,
-     DIVassign = 352,
-     MODassign = 353,
-     PLUSassign = 354,
-     MINUSassign = 355,
-     LSassign = 356,
-     RSassign = 357,
-     ANDassign = 358,
-     ERassign = 359,
-     ORassign = 360,
-     ATassign = 361,
-     THEN = 362
+     VALIST = 279,
+     BOOL = 280,
+     COMPLEX = 281,
+     IMAGINARY = 282,
+     TYPEOF = 283,
+     LABEL = 284,
+     ENUM = 285,
+     STRUCT = 286,
+     UNION = 287,
+     OTYPE = 288,
+     FTYPE = 289,
+     DTYPE = 290,
+     TRAIT = 291,
+     SIZEOF = 292,
+     OFFSETOF = 293,
+     ATTRIBUTE = 294,
+     EXTENSION = 295,
+     IF = 296,
+     ELSE = 297,
+     SWITCH = 298,
+     CASE = 299,
+     DEFAULT = 300,
+     DO = 301,
+     WHILE = 302,
+     FOR = 303,
+     BREAK = 304,
+     CONTINUE = 305,
+     GOTO = 306,
+     RETURN = 307,
+     CHOOSE = 308,
+     DISABLE = 309,
+     ENABLE = 310,
+     FALLTHRU = 311,
+     TRY = 312,
+     CATCH = 313,
+     CATCHRESUME = 314,
+     FINALLY = 315,
+     THROW = 316,
+     THROWRESUME = 317,
+     AT = 318,
+     ASM = 319,
+     ALIGNAS = 320,
+     ALIGNOF = 321,
+     ATOMIC = 322,
+     GENERIC = 323,
+     NORETURN = 324,
+     STATICASSERT = 325,
+     THREADLOCAL = 326,
+     IDENTIFIER = 327,
+     QUOTED_IDENTIFIER = 328,
+     TYPEDEFname = 329,
+     TYPEGENname = 330,
+     ATTR_IDENTIFIER = 331,
+     ATTR_TYPEDEFname = 332,
+     ATTR_TYPEGENname = 333,
+     INTEGERconstant = 334,
+     FLOATINGconstant = 335,
+     CHARACTERconstant = 336,
+     STRINGliteral = 337,
+     ZERO = 338,
+     ONE = 339,
+     ARROW = 340,
+     ICR = 341,
+     DECR = 342,
+     LS = 343,
+     RS = 344,
+     LE = 345,
+     GE = 346,
+     EQ = 347,
+     NE = 348,
+     ANDAND = 349,
+     OROR = 350,
+     ELLIPSIS = 351,
+     MULTassign = 352,
+     DIVassign = 353,
+     MODassign = 354,
+     PLUSassign = 355,
+     MINUSassign = 356,
+     LSassign = 357,
+     RSassign = 358,
+     ANDassign = 359,
+     ERassign = 360,
+     ORassign = 361,
+     ATassign = 362,
+     THEN = 363
    };
 #endif
@@ -246,88 +248,89 @@
 #define SIGNED 277
 #define UNSIGNED 278
-#define BOOL 279
-#define COMPLEX 280
-#define IMAGINARY 281
-#define TYPEOF 282
-#define LABEL 283
-#define ENUM 284
-#define STRUCT 285
-#define UNION 286
-#define TYPE 287
-#define FTYPE 288
-#define DTYPE 289
-#define CONTEXT 290
-#define SIZEOF 291
-#define OFFSETOF 292
-#define ATTRIBUTE 293
-#define EXTENSION 294
-#define IF 295
-#define ELSE 296
-#define SWITCH 297
-#define CASE 298
-#define DEFAULT 299
-#define DO 300
-#define WHILE 301
-#define FOR 302
-#define BREAK 303
-#define CONTINUE 304
-#define GOTO 305
-#define RETURN 306
-#define CHOOSE 307
-#define DISABLE 308
-#define ENABLE 309
-#define FALLTHRU 310
-#define TRY 311
-#define CATCH 312
-#define CATCHRESUME 313
-#define FINALLY 314
-#define THROW 315
-#define THROWRESUME 316
-#define AT 317
-#define ASM 318
-#define ALIGNAS 319
-#define ALIGNOF 320
-#define ATOMIC 321
-#define GENERIC 322
-#define NORETURN 323
-#define STATICASSERT 324
-#define THREADLOCAL 325
-#define IDENTIFIER 326
-#define QUOTED_IDENTIFIER 327
-#define TYPEDEFname 328
-#define TYPEGENname 329
-#define ATTR_IDENTIFIER 330
-#define ATTR_TYPEDEFname 331
-#define ATTR_TYPEGENname 332
-#define INTEGERconstant 333
-#define FLOATINGconstant 334
-#define CHARACTERconstant 335
-#define STRINGliteral 336
-#define ZERO 337
-#define ONE 338
-#define ARROW 339
-#define ICR 340
-#define DECR 341
-#define LS 342
-#define RS 343
-#define LE 344
-#define GE 345
-#define EQ 346
-#define NE 347
-#define ANDAND 348
-#define OROR 349
-#define ELLIPSIS 350
-#define MULTassign 351
-#define DIVassign 352
-#define MODassign 353
-#define PLUSassign 354
-#define MINUSassign 355
-#define LSassign 356
-#define RSassign 357
-#define ANDassign 358
-#define ERassign 359
-#define ORassign 360
-#define ATassign 361
-#define THEN 362
+#define VALIST 279
+#define BOOL 280
+#define COMPLEX 281
+#define IMAGINARY 282
+#define TYPEOF 283
+#define LABEL 284
+#define ENUM 285
+#define STRUCT 286
+#define UNION 287
+#define OTYPE 288
+#define FTYPE 289
+#define DTYPE 290
+#define TRAIT 291
+#define SIZEOF 292
+#define OFFSETOF 293
+#define ATTRIBUTE 294
+#define EXTENSION 295
+#define IF 296
+#define ELSE 297
+#define SWITCH 298
+#define CASE 299
+#define DEFAULT 300
+#define DO 301
+#define WHILE 302
+#define FOR 303
+#define BREAK 304
+#define CONTINUE 305
+#define GOTO 306
+#define RETURN 307
+#define CHOOSE 308
+#define DISABLE 309
+#define ENABLE 310
+#define FALLTHRU 311
+#define TRY 312
+#define CATCH 313
+#define CATCHRESUME 314
+#define FINALLY 315
+#define THROW 316
+#define THROWRESUME 317
+#define AT 318
+#define ASM 319
+#define ALIGNAS 320
+#define ALIGNOF 321
+#define ATOMIC 322
+#define GENERIC 323
+#define NORETURN 324
+#define STATICASSERT 325
+#define THREADLOCAL 326
+#define IDENTIFIER 327
+#define QUOTED_IDENTIFIER 328
+#define TYPEDEFname 329
+#define TYPEGENname 330
+#define ATTR_IDENTIFIER 331
+#define ATTR_TYPEDEFname 332
+#define ATTR_TYPEGENname 333
+#define INTEGERconstant 334
+#define FLOATINGconstant 335
+#define CHARACTERconstant 336
+#define STRINGliteral 337
+#define ZERO 338
+#define ONE 339
+#define ARROW 340
+#define ICR 341
+#define DECR 342
+#define LS 343
+#define RS 344
+#define LE 345
+#define GE 346
+#define EQ 347
+#define NE 348
+#define ANDAND 349
+#define OROR 350
+#define ELLIPSIS 351
+#define MULTassign 352
+#define DIVassign 353
+#define MODassign 354
+#define PLUSassign 355
+#define MINUSassign 356
+#define LSassign 357
+#define RSassign 358
+#define ANDassign 359
+#define ERassign 360
+#define ORassign 361
+#define ATassign 362
+#define THEN 363
 
 
@@ -339,5 +342,5 @@
 
 /* Line 293 of yacc.c  */
-#line 110 "parser.yy"
+#line 112 "parser.yy"
 
 	Token tok;
@@ -356,5 +359,5 @@
 
 /* Line 293 of yacc.c  */
-#line 359 "Parser/parser.cc"
+#line 362 "Parser/parser.cc"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
@@ -368,5 +371,5 @@
 
 /* Line 343 of yacc.c  */
-#line 371 "Parser/parser.cc"
+#line 374 "Parser/parser.cc"
 
 #ifdef short
@@ -585,20 +588,20 @@
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  248
+#define YYFINAL  249
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   11042
+#define YYLAST   11449
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  132
+#define YYNTOKENS  133
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  238
+#define YYNNTS  240
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  751
+#define YYNRULES  754
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  1578
+#define YYNSTATES  1581
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   362
+#define YYMAXUTOK   363
 
 #define YYTRANSLATE(YYX)						\
@@ -611,14 +614,14 @@
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   117,     2,     2,     2,   124,   119,     2,
-     108,   109,   118,   120,   115,   121,   112,   123,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   116,   131,
-     125,   130,   126,   129,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   118,     2,     2,     2,   125,   120,     2,
+     109,   110,   119,   121,   116,   122,   113,   124,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   117,   132,
+     126,   131,   127,   130,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   110,     2,   111,   127,     2,     2,     2,     2,     2,
+       2,   111,     2,   112,   128,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   113,   128,   114,   122,     2,     2,     2,
+       2,     2,     2,   114,   129,   115,   123,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -644,5 +647,5 @@
       85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107
+     105,   106,   107,   108
 };
 
@@ -685,47 +688,47 @@
     1156,  1158,  1161,  1163,  1165,  1167,  1169,  1171,  1173,  1175,
     1177,  1179,  1181,  1183,  1185,  1187,  1189,  1191,  1193,  1195,
-    1197,  1199,  1201,  1203,  1205,  1208,  1211,  1215,  1219,  1221,
-    1225,  1227,  1230,  1233,  1236,  1241,  1246,  1251,  1256,  1258,
-    1261,  1264,  1268,  1270,  1273,  1276,  1278,  1281,  1284,  1288,
-    1290,  1293,  1296,  1298,  1300,  1305,  1308,  1314,  1322,  1325,
-    1328,  1331,  1333,  1336,  1339,  1343,  1346,  1350,  1352,  1355,
-    1359,  1362,  1365,  1370,  1371,  1373,  1376,  1379,  1381,  1382,
-    1384,  1387,  1390,  1396,  1403,  1406,  1409,  1414,  1415,  1418,
-    1419,  1421,  1423,  1425,  1431,  1437,  1443,  1445,  1451,  1457,
-    1467,  1469,  1475,  1476,  1478,  1480,  1486,  1488,  1490,  1496,
-    1502,  1504,  1508,  1512,  1517,  1519,  1521,  1523,  1525,  1528,
-    1530,  1534,  1538,  1540,  1543,  1545,  1549,  1551,  1553,  1555,
-    1557,  1559,  1561,  1563,  1565,  1567,  1569,  1571,  1574,  1576,
-    1578,  1580,  1583,  1584,  1587,  1590,  1592,  1597,  1598,  1600,
-    1603,  1607,  1612,  1615,  1618,  1620,  1623,  1625,  1628,  1634,
-    1640,  1648,  1655,  1657,  1660,  1663,  1667,  1669,  1672,  1675,
-    1680,  1683,  1688,  1689,  1694,  1697,  1699,  1701,  1703,  1704,
-    1707,  1713,  1719,  1733,  1735,  1737,  1741,  1745,  1748,  1752,
-    1756,  1759,  1764,  1766,  1773,  1783,  1784,  1796,  1798,  1802,
-    1806,  1810,  1812,  1814,  1820,  1823,  1829,  1830,  1832,  1834,
-    1838,  1839,  1841,  1843,  1845,  1847,  1848,  1855,  1858,  1860,
-    1863,  1868,  1871,  1875,  1879,  1883,  1888,  1894,  1900,  1906,
-    1913,  1915,  1917,  1919,  1923,  1924,  1930,  1931,  1933,  1935,
-    1938,  1945,  1947,  1951,  1952,  1954,  1959,  1961,  1963,  1965,
-    1967,  1970,  1972,  1975,  1978,  1980,  1984,  1987,  1991,  1995,
-    1998,  2003,  2008,  2012,  2021,  2025,  2028,  2030,  2033,  2040,
-    2049,  2053,  2056,  2060,  2064,  2069,  2074,  2078,  2080,  2082,
-    2084,  2089,  2096,  2100,  2103,  2107,  2111,  2116,  2121,  2125,
-    2128,  2130,  2133,  2136,  2138,  2142,  2145,  2149,  2153,  2156,
-    2161,  2166,  2170,  2177,  2186,  2190,  2193,  2195,  2198,  2201,
-    2204,  2208,  2212,  2215,  2220,  2225,  2229,  2236,  2245,  2249,
-    2252,  2254,  2257,  2260,  2262,  2264,  2267,  2271,  2275,  2278,
-    2283,  2290,  2299,  2301,  2304,  2307,  2309,  2312,  2315,  2319,
-    2323,  2325,  2330,  2335,  2339,  2345,  2354,  2358,  2361,  2365,
-    2367,  2373,  2379,  2386,  2393,  2395,  2398,  2401,  2403,  2406,
-    2409,  2413,  2417,  2419,  2424,  2429,  2433,  2439,  2448,  2452,
-    2454,  2457,  2459,  2462,  2469,  2475,  2482,  2490,  2498,  2500,
-    2503,  2506,  2508,  2511,  2514,  2518,  2522,  2524,  2529,  2534,
-    2538,  2547,  2551,  2553,  2555,  2558,  2560,  2562,  2565,  2569,
-    2572,  2576,  2579,  2583,  2587,  2590,  2595,  2599,  2602,  2606,
-    2609,  2614,  2618,  2621,  2628,  2635,  2642,  2650,  2652,  2655,
-    2657,  2659,  2661,  2664,  2668,  2671,  2675,  2678,  2682,  2686,
-    2691,  2694,  2698,  2703,  2706,  2712,  2718,  2725,  2732,  2733,
-    2735,  2736
+    1197,  1199,  1201,  1203,  1205,  1207,  1210,  1213,  1217,  1221,
+    1223,  1227,  1229,  1232,  1235,  1238,  1243,  1248,  1253,  1258,
+    1260,  1263,  1266,  1270,  1272,  1275,  1278,  1280,  1283,  1286,
+    1290,  1292,  1295,  1298,  1300,  1302,  1307,  1310,  1311,  1318,
+    1326,  1329,  1332,  1335,  1337,  1340,  1343,  1347,  1350,  1354,
+    1356,  1359,  1363,  1366,  1369,  1374,  1375,  1377,  1380,  1383,
+    1385,  1386,  1388,  1391,  1394,  1400,  1403,  1404,  1412,  1415,
+    1420,  1421,  1424,  1425,  1427,  1429,  1431,  1437,  1443,  1449,
+    1451,  1457,  1463,  1473,  1475,  1481,  1482,  1484,  1486,  1492,
+    1494,  1496,  1502,  1508,  1510,  1514,  1518,  1523,  1525,  1527,
+    1529,  1531,  1534,  1536,  1540,  1544,  1546,  1549,  1551,  1555,
+    1557,  1559,  1561,  1563,  1565,  1567,  1569,  1571,  1573,  1575,
+    1577,  1580,  1582,  1584,  1586,  1589,  1590,  1593,  1596,  1598,
+    1603,  1604,  1606,  1609,  1613,  1618,  1621,  1624,  1626,  1629,
+    1631,  1634,  1640,  1646,  1654,  1661,  1663,  1666,  1669,  1673,
+    1675,  1678,  1681,  1686,  1689,  1694,  1695,  1700,  1703,  1705,
+    1707,  1709,  1710,  1713,  1719,  1725,  1739,  1741,  1743,  1747,
+    1751,  1754,  1758,  1762,  1765,  1770,  1772,  1779,  1789,  1790,
+    1802,  1804,  1808,  1812,  1816,  1818,  1820,  1826,  1829,  1835,
+    1836,  1838,  1840,  1844,  1845,  1847,  1849,  1851,  1853,  1854,
+    1861,  1864,  1866,  1869,  1874,  1877,  1881,  1885,  1889,  1894,
+    1900,  1906,  1912,  1919,  1921,  1923,  1925,  1929,  1930,  1936,
+    1937,  1939,  1941,  1944,  1951,  1953,  1957,  1958,  1960,  1965,
+    1967,  1969,  1971,  1973,  1976,  1978,  1981,  1984,  1986,  1990,
+    1993,  1997,  2001,  2004,  2009,  2014,  2018,  2027,  2031,  2034,
+    2036,  2039,  2046,  2055,  2059,  2062,  2066,  2070,  2075,  2080,
+    2084,  2086,  2088,  2090,  2095,  2102,  2106,  2109,  2113,  2117,
+    2122,  2127,  2131,  2134,  2136,  2139,  2142,  2144,  2148,  2151,
+    2155,  2159,  2162,  2167,  2172,  2176,  2183,  2192,  2196,  2199,
+    2201,  2204,  2207,  2210,  2214,  2218,  2221,  2226,  2231,  2235,
+    2242,  2251,  2255,  2258,  2260,  2263,  2266,  2268,  2270,  2273,
+    2277,  2281,  2284,  2289,  2296,  2305,  2307,  2310,  2313,  2315,
+    2318,  2321,  2325,  2329,  2331,  2336,  2341,  2345,  2351,  2360,
+    2364,  2367,  2371,  2373,  2379,  2385,  2392,  2399,  2401,  2404,
+    2407,  2409,  2412,  2415,  2419,  2423,  2425,  2430,  2435,  2439,
+    2445,  2454,  2458,  2460,  2463,  2465,  2468,  2475,  2481,  2488,
+    2496,  2504,  2506,  2509,  2512,  2514,  2517,  2520,  2524,  2528,
+    2530,  2535,  2540,  2544,  2553,  2557,  2559,  2561,  2564,  2566,
+    2568,  2571,  2575,  2578,  2582,  2585,  2589,  2593,  2596,  2601,
+    2605,  2608,  2612,  2615,  2620,  2624,  2627,  2634,  2641,  2648,
+    2656,  2658,  2661,  2663,  2665,  2667,  2670,  2674,  2677,  2681,
+    2684,  2688,  2692,  2697,  2700,  2704,  2709,  2712,  2718,  2724,
+    2731,  2738,  2739,  2741,  2742
 };
 
@@ -733,278 +736,279 @@
 static const yytype_int16 yyrhs[] =
 {
-     298,     0,    -1,    -1,    -1,    78,    -1,    79,    -1,    80,
-      -1,    71,    -1,    75,    -1,   139,    -1,    71,    -1,    75,
-      -1,    71,    -1,   139,    -1,    82,    -1,    83,    -1,    81,
-      -1,   140,    81,    -1,    71,    -1,   139,    -1,   108,   167,
-     109,    -1,   108,   171,   109,    -1,   141,    -1,   142,   110,
-     133,   162,   134,   111,    -1,   142,   108,   143,   109,    -1,
-     142,   112,   138,    -1,   142,   112,   110,   133,   145,   134,
-     111,    -1,   142,    84,   138,    -1,   142,    84,   110,   133,
-     145,   134,   111,    -1,   142,    85,    -1,   142,    86,    -1,
-     108,   271,   109,   113,   275,   368,   114,    -1,   142,   113,
-     143,   114,    -1,   144,    -1,   143,   115,   144,    -1,    -1,
-     162,    -1,   138,   116,   162,    -1,   110,   133,   162,   134,
-     111,   116,   162,    -1,   110,   133,   162,   115,   165,   134,
-     111,   116,   162,    -1,   146,    -1,   145,   115,   146,    -1,
-     138,    -1,   138,   112,   146,    -1,   138,   112,   110,   133,
-     145,   134,   111,    -1,   138,    84,   146,    -1,   138,    84,
-     110,   133,   145,   134,   111,    -1,   142,    -1,   135,    -1,
-     140,    -1,    85,   147,    -1,    86,   147,    -1,    39,   149,
-      -1,   148,   149,    -1,   117,   149,    -1,   118,   149,    -1,
-      36,   147,    -1,    36,   108,   271,   109,    -1,    37,   108,
-     271,   115,   138,   109,    -1,    75,    -1,    75,   108,   272,
-     109,    -1,    75,   108,   144,   109,    -1,    65,   147,    -1,
-      65,   108,   271,   109,    -1,    93,   138,    -1,   119,    -1,
-     120,    -1,   121,    -1,   122,    -1,   147,    -1,   108,   271,
-     109,   149,    -1,   108,   271,   109,   164,    -1,   149,    -1,
-     150,   118,   149,    -1,   150,   123,   149,    -1,   150,   124,
-     149,    -1,   150,    -1,   151,   120,   150,    -1,   151,   121,
-     150,    -1,   151,    -1,   152,    87,   151,    -1,   152,    88,
-     151,    -1,   152,    -1,   153,   125,   152,    -1,   153,   126,
-     152,    -1,   153,    89,   152,    -1,   153,    90,   152,    -1,
-     153,    -1,   154,    91,   153,    -1,   154,    92,   153,    -1,
-     154,    -1,   155,   119,   154,    -1,   155,    -1,   156,   127,
-     155,    -1,   156,    -1,   157,   128,   156,    -1,   157,    -1,
-     158,    93,   157,    -1,   158,    -1,   159,    94,   158,    -1,
-     159,    -1,   159,   129,   167,   116,   160,    -1,   159,   129,
-     116,   160,    -1,   159,   129,   167,   116,   164,    -1,   160,
-      -1,   160,    -1,   147,   130,   162,    -1,   147,   166,   162,
-      -1,   164,   369,    -1,    -1,   162,    -1,   110,   111,    -1,
-     110,   133,   162,   134,   111,    -1,   110,   133,   115,   165,
-     134,   111,    -1,   110,   133,   162,   115,   165,   134,   111,
-      -1,   163,    -1,   165,   115,   163,    -1,    96,    -1,    97,
-      -1,    98,    -1,    99,    -1,   100,    -1,   101,    -1,   102,
-      -1,   103,    -1,   104,    -1,   105,    -1,   162,    -1,   167,
-     115,   162,    -1,    -1,   167,    -1,   170,    -1,   171,    -1,
-     175,    -1,   176,    -1,   188,    -1,   190,    -1,   191,    -1,
-     196,    -1,   127,   142,   113,   143,   114,   131,    -1,   138,
-     116,   308,   169,    -1,   113,   114,    -1,   113,   133,   133,
-     207,   172,   134,   114,    -1,   173,    -1,   172,   133,   173,
-      -1,   210,    -1,    39,   210,    -1,   304,    -1,   169,   134,
-      -1,   169,    -1,   174,   169,    -1,   168,   131,    -1,    40,
-     108,   167,   109,   169,    -1,    40,   108,   167,   109,   169,
-      41,   169,    -1,    42,   108,   167,   109,   181,    -1,    42,
-     108,   167,   109,   113,   133,   203,   182,   114,    -1,    52,
-     108,   167,   109,   181,    -1,    52,   108,   167,   109,   113,
-     133,   203,   184,   114,    -1,   161,    -1,   161,    95,   161,
-      -1,   306,    -1,   177,    -1,   178,   115,   177,    -1,    43,
-     178,   116,    -1,    44,   116,    -1,   179,    -1,   180,   179,
-      -1,   180,   169,    -1,    -1,   183,    -1,   180,   174,    -1,
-     183,   180,   174,    -1,    -1,   185,    -1,   180,   187,    -1,
-     180,   174,   186,    -1,   185,   180,   187,    -1,   185,   180,
-     174,   186,    -1,    -1,   187,    -1,    55,    -1,    55,   131,
-      -1,    46,   108,   167,   109,   169,    -1,    45,   169,    46,
-     108,   167,   109,   131,    -1,    47,   108,   133,   189,   109,
-     169,    -1,   168,   134,   131,   168,   131,   168,    -1,   210,
-     168,   131,   168,    -1,    50,   138,   131,    -1,    50,   118,
-     167,   131,    -1,    49,   131,    -1,    49,   138,   131,    -1,
-      48,   131,    -1,    48,   138,   131,    -1,    51,   168,   131,
-      -1,    60,   163,   131,    -1,    61,   163,   131,    -1,    61,
-     163,    62,   162,   131,    -1,    56,   171,   192,    -1,    56,
-     171,   194,    -1,    56,   171,   192,   194,    -1,   193,    -1,
-      57,   108,    95,   109,   171,    -1,   193,    57,   108,    95,
-     109,   171,    -1,    58,   108,    95,   109,   171,    -1,   193,
-      58,   108,    95,   109,   171,    -1,    57,   108,   133,   133,
-     195,   134,   109,   171,   134,    -1,   193,    57,   108,   133,
-     133,   195,   134,   109,   171,   134,    -1,    58,   108,   133,
-     133,   195,   134,   109,   171,   134,    -1,   193,    58,   108,
-     133,   133,   195,   134,   109,   171,   134,    -1,    59,   171,
-      -1,   223,    -1,   223,   305,    -1,   223,   353,    -1,   362,
-     138,    -1,   362,    -1,    63,   197,   108,   140,   109,   131,
-      -1,    63,   197,   108,   140,   116,   198,   109,   131,    -1,
-      63,   197,   108,   140,   116,   198,   116,   198,   109,   131,
-      -1,    63,   197,   108,   140,   116,   198,   116,   198,   116,
-     201,   109,   131,    -1,    63,   197,    50,   108,   140,   116,
-     116,   198,   116,   201,   116,   202,   109,   131,    -1,    -1,
-      11,    -1,    -1,   199,    -1,   200,    -1,   199,   115,   200,
-      -1,   140,   108,   161,   109,    -1,   110,   161,   111,   140,
-     108,   161,   109,    -1,    -1,   140,    -1,   201,   115,   140,
-      -1,   138,    -1,   202,   115,   138,    -1,   134,    -1,   204,
-      -1,   210,    -1,   204,   133,   210,    -1,   134,    -1,   206,
-      -1,   220,    -1,   206,   133,   220,    -1,    -1,   208,    -1,
-      28,   209,   131,    -1,   208,    28,   209,   131,    -1,   270,
-      -1,   209,   115,   270,    -1,   211,    -1,   220,    -1,   212,
-     134,   131,    -1,   217,   134,   131,    -1,   214,   134,   131,
-      -1,   289,   134,   131,    -1,   292,   134,   131,    -1,   213,
-     273,    -1,   229,   213,   273,    -1,   212,   134,   115,   133,
-     268,   273,    -1,   363,   268,   307,    -1,   366,   268,   307,
-      -1,   225,   366,   268,   307,    -1,   215,    -1,   225,   215,
-      -1,   229,   215,    -1,   229,   225,   215,    -1,   214,   134,
-     115,   133,   268,    -1,   110,   111,   268,   108,   133,   256,
-     134,   109,    -1,   366,   268,   108,   133,   256,   134,   109,
-      -1,   216,   268,   108,   133,   256,   134,   109,    -1,   110,
-     133,   258,   134,   111,    -1,   110,   133,   258,   134,   115,
-     133,   259,   134,   111,    -1,     3,   213,    -1,     3,   215,
-      -1,   217,   134,   115,   133,   138,    -1,     3,   223,   305,
-      -1,   218,   134,   115,   133,   305,    -1,   225,     3,   223,
-     305,    -1,   223,     3,   305,    -1,   223,     3,   225,   305,
-      -1,     3,   138,   130,   162,    -1,   219,   134,   115,   133,
-     138,   130,   162,    -1,   221,   134,   131,    -1,   218,   134,
-     131,    -1,   219,   134,   131,    -1,   238,   134,   131,    -1,
-     222,   305,   307,   273,    -1,   221,   115,   308,   305,   307,
-     273,    -1,   234,    -1,   238,    -1,   240,    -1,   279,    -1,
-     235,    -1,   239,    -1,   241,    -1,   280,    -1,    -1,   225,
-      -1,   226,    -1,   225,   226,    -1,   227,    -1,   310,    -1,
-      10,    -1,    12,    -1,    11,    -1,    14,    -1,    66,    -1,
-      -1,    13,   108,   228,   282,   109,    -1,   230,    -1,   225,
-     230,    -1,   229,   225,   230,    -1,   231,    -1,   230,   231,
-      -1,   232,    -1,     5,    -1,     7,    -1,     4,    -1,     6,
-      -1,     8,    -1,     9,    -1,    68,    -1,    70,    -1,    16,
+     301,     0,    -1,    -1,    -1,    79,    -1,    80,    -1,    81,
+      -1,    72,    -1,    76,    -1,   140,    -1,    72,    -1,    76,
+      -1,    72,    -1,   140,    -1,    83,    -1,    84,    -1,    82,
+      -1,   141,    82,    -1,    72,    -1,   140,    -1,   109,   168,
+     110,    -1,   109,   172,   110,    -1,   142,    -1,   143,   111,
+     134,   163,   135,   112,    -1,   143,   109,   144,   110,    -1,
+     143,   113,   139,    -1,   143,   113,   111,   134,   146,   135,
+     112,    -1,   143,    85,   139,    -1,   143,    85,   111,   134,
+     146,   135,   112,    -1,   143,    86,    -1,   143,    87,    -1,
+     109,   274,   110,   114,   278,   371,   115,    -1,   143,   114,
+     144,   115,    -1,   145,    -1,   144,   116,   145,    -1,    -1,
+     163,    -1,   139,   117,   163,    -1,   111,   134,   163,   135,
+     112,   117,   163,    -1,   111,   134,   163,   116,   166,   135,
+     112,   117,   163,    -1,   147,    -1,   146,   116,   147,    -1,
+     139,    -1,   139,   113,   147,    -1,   139,   113,   111,   134,
+     146,   135,   112,    -1,   139,    85,   147,    -1,   139,    85,
+     111,   134,   146,   135,   112,    -1,   143,    -1,   136,    -1,
+     141,    -1,    86,   148,    -1,    87,   148,    -1,    40,   150,
+      -1,   149,   150,    -1,   118,   150,    -1,   119,   150,    -1,
+      37,   148,    -1,    37,   109,   274,   110,    -1,    38,   109,
+     274,   116,   139,   110,    -1,    76,    -1,    76,   109,   275,
+     110,    -1,    76,   109,   145,   110,    -1,    66,   148,    -1,
+      66,   109,   274,   110,    -1,    94,   139,    -1,   120,    -1,
+     121,    -1,   122,    -1,   123,    -1,   148,    -1,   109,   274,
+     110,   150,    -1,   109,   274,   110,   165,    -1,   150,    -1,
+     151,   119,   150,    -1,   151,   124,   150,    -1,   151,   125,
+     150,    -1,   151,    -1,   152,   121,   151,    -1,   152,   122,
+     151,    -1,   152,    -1,   153,    88,   152,    -1,   153,    89,
+     152,    -1,   153,    -1,   154,   126,   153,    -1,   154,   127,
+     153,    -1,   154,    90,   153,    -1,   154,    91,   153,    -1,
+     154,    -1,   155,    92,   154,    -1,   155,    93,   154,    -1,
+     155,    -1,   156,   120,   155,    -1,   156,    -1,   157,   128,
+     156,    -1,   157,    -1,   158,   129,   157,    -1,   158,    -1,
+     159,    94,   158,    -1,   159,    -1,   160,    95,   159,    -1,
+     160,    -1,   160,   130,   168,   117,   161,    -1,   160,   130,
+     117,   161,    -1,   160,   130,   168,   117,   165,    -1,   161,
+      -1,   161,    -1,   148,   131,   163,    -1,   148,   167,   163,
+      -1,   165,   372,    -1,    -1,   163,    -1,   111,   112,    -1,
+     111,   134,   163,   135,   112,    -1,   111,   134,   116,   166,
+     135,   112,    -1,   111,   134,   163,   116,   166,   135,   112,
+      -1,   164,    -1,   166,   116,   164,    -1,    97,    -1,    98,
+      -1,    99,    -1,   100,    -1,   101,    -1,   102,    -1,   103,
+      -1,   104,    -1,   105,    -1,   106,    -1,   163,    -1,   168,
+     116,   163,    -1,    -1,   168,    -1,   171,    -1,   172,    -1,
+     176,    -1,   177,    -1,   189,    -1,   191,    -1,   192,    -1,
+     197,    -1,   128,   143,   114,   144,   115,   132,    -1,   139,
+     117,   311,   170,    -1,   114,   115,    -1,   114,   134,   134,
+     208,   173,   135,   115,    -1,   174,    -1,   173,   134,   174,
+      -1,   211,    -1,    40,   211,    -1,   307,    -1,   170,   135,
+      -1,   170,    -1,   175,   170,    -1,   169,   132,    -1,    41,
+     109,   168,   110,   170,    -1,    41,   109,   168,   110,   170,
+      42,   170,    -1,    43,   109,   168,   110,   182,    -1,    43,
+     109,   168,   110,   114,   134,   204,   183,   115,    -1,    53,
+     109,   168,   110,   182,    -1,    53,   109,   168,   110,   114,
+     134,   204,   185,   115,    -1,   162,    -1,   162,    96,   162,
+      -1,   309,    -1,   178,    -1,   179,   116,   178,    -1,    44,
+     179,   117,    -1,    45,   117,    -1,   180,    -1,   181,   180,
+      -1,   181,   170,    -1,    -1,   184,    -1,   181,   175,    -1,
+     184,   181,   175,    -1,    -1,   186,    -1,   181,   188,    -1,
+     181,   175,   187,    -1,   186,   181,   188,    -1,   186,   181,
+     175,   187,    -1,    -1,   188,    -1,    56,    -1,    56,   132,
+      -1,    47,   109,   168,   110,   170,    -1,    46,   170,    47,
+     109,   168,   110,   132,    -1,    48,   109,   134,   190,   110,
+     170,    -1,   169,   135,   132,   169,   132,   169,    -1,   211,
+     169,   132,   169,    -1,    51,   139,   132,    -1,    51,   119,
+     168,   132,    -1,    50,   132,    -1,    50,   139,   132,    -1,
+      49,   132,    -1,    49,   139,   132,    -1,    52,   169,   132,
+      -1,    61,   164,   132,    -1,    62,   164,   132,    -1,    62,
+     164,    63,   163,   132,    -1,    57,   172,   193,    -1,    57,
+     172,   195,    -1,    57,   172,   193,   195,    -1,   194,    -1,
+      58,   109,    96,   110,   172,    -1,   194,    58,   109,    96,
+     110,   172,    -1,    59,   109,    96,   110,   172,    -1,   194,
+      59,   109,    96,   110,   172,    -1,    58,   109,   134,   134,
+     196,   135,   110,   172,   135,    -1,   194,    58,   109,   134,
+     134,   196,   135,   110,   172,   135,    -1,    59,   109,   134,
+     134,   196,   135,   110,   172,   135,    -1,   194,    59,   109,
+     134,   134,   196,   135,   110,   172,   135,    -1,    60,   172,
+      -1,   224,    -1,   224,   308,    -1,   224,   356,    -1,   365,
+     139,    -1,   365,    -1,    64,   198,   109,   141,   110,   132,
+      -1,    64,   198,   109,   141,   117,   199,   110,   132,    -1,
+      64,   198,   109,   141,   117,   199,   117,   199,   110,   132,
+      -1,    64,   198,   109,   141,   117,   199,   117,   199,   117,
+     202,   110,   132,    -1,    64,   198,    51,   109,   141,   117,
+     117,   199,   117,   202,   117,   203,   110,   132,    -1,    -1,
+      11,    -1,    -1,   200,    -1,   201,    -1,   200,   116,   201,
+      -1,   141,   109,   162,   110,    -1,   111,   162,   112,   141,
+     109,   162,   110,    -1,    -1,   141,    -1,   202,   116,   141,
+      -1,   139,    -1,   203,   116,   139,    -1,   135,    -1,   205,
+      -1,   211,    -1,   205,   134,   211,    -1,   135,    -1,   207,
+      -1,   221,    -1,   207,   134,   221,    -1,    -1,   209,    -1,
+      29,   210,   132,    -1,   209,    29,   210,   132,    -1,   273,
+      -1,   210,   116,   273,    -1,   212,    -1,   221,    -1,   213,
+     135,   132,    -1,   218,   135,   132,    -1,   215,   135,   132,
+      -1,   292,   135,   132,    -1,   295,   135,   132,    -1,   214,
+     276,    -1,   230,   214,   276,    -1,   213,   135,   116,   134,
+     271,   276,    -1,   366,   271,   310,    -1,   369,   271,   310,
+      -1,   226,   369,   271,   310,    -1,   216,    -1,   226,   216,
+      -1,   230,   216,    -1,   230,   226,   216,    -1,   215,   135,
+     116,   134,   271,    -1,   111,   112,   271,   109,   134,   259,
+     135,   110,    -1,   369,   271,   109,   134,   259,   135,   110,
+      -1,   217,   271,   109,   134,   259,   135,   110,    -1,   111,
+     134,   261,   135,   112,    -1,   111,   134,   261,   135,   116,
+     134,   262,   135,   112,    -1,     3,   214,    -1,     3,   216,
+      -1,   218,   135,   116,   134,   139,    -1,     3,   224,   308,
+      -1,   219,   135,   116,   134,   308,    -1,   226,     3,   224,
+     308,    -1,   224,     3,   308,    -1,   224,     3,   226,   308,
+      -1,     3,   139,   131,   163,    -1,   220,   135,   116,   134,
+     139,   131,   163,    -1,   222,   135,   132,    -1,   219,   135,
+     132,    -1,   220,   135,   132,    -1,   239,   135,   132,    -1,
+     223,   308,   310,   276,    -1,   222,   116,   311,   308,   310,
+     276,    -1,   235,    -1,   239,    -1,   241,    -1,   282,    -1,
+     236,    -1,   240,    -1,   242,    -1,   283,    -1,    -1,   226,
+      -1,   227,    -1,   226,   227,    -1,   228,    -1,   313,    -1,
+      10,    -1,    12,    -1,    11,    -1,    14,    -1,    67,    -1,
+      -1,    13,   109,   229,   285,   110,    -1,   231,    -1,   226,
+     231,    -1,   230,   226,   231,    -1,   232,    -1,   231,   232,
+      -1,   233,    -1,     5,    -1,     7,    -1,     4,    -1,     6,
+      -1,     8,    -1,     9,    -1,    69,    -1,    71,    -1,    16,
       -1,    21,    -1,    20,    -1,    18,    -1,    19,    -1,    17,
-      -1,    22,    -1,    23,    -1,    15,    -1,    24,    -1,    25,
-      -1,    26,    -1,   235,    -1,   229,   235,    -1,   234,   231,
-      -1,   234,   231,   225,    -1,   234,   231,   235,    -1,   236,
-      -1,   224,   237,   224,    -1,   233,    -1,   225,   233,    -1,
-     236,   226,    -1,   236,   233,    -1,    27,   108,   272,   109,
-      -1,    27,   108,   167,   109,    -1,    77,   108,   272,   109,
-      -1,    77,   108,   167,   109,    -1,   239,    -1,   229,   239,
-      -1,   238,   231,    -1,   238,   231,   225,    -1,   242,    -1,
-     225,   242,    -1,   239,   226,    -1,   241,    -1,   229,   241,
-      -1,   240,   231,    -1,   240,   231,   225,    -1,    73,    -1,
-     225,    73,    -1,   241,   226,    -1,   243,    -1,   253,    -1,
-     244,   113,   245,   114,    -1,   244,   270,    -1,   244,   270,
-     113,   245,   114,    -1,   244,   108,   288,   109,   113,   245,
-     114,    -1,   244,   281,    -1,    30,   308,    -1,    31,   308,
-      -1,   246,    -1,   245,   246,    -1,   247,   131,    -1,    39,
-     247,   131,    -1,   248,   131,    -1,    39,   248,   131,    -1,
-     362,    -1,   362,   270,    -1,   247,   115,   270,    -1,   247,
-     115,    -1,   223,   249,    -1,   248,   115,   308,   249,    -1,
-      -1,   251,    -1,   314,   250,    -1,   327,   250,    -1,   353,
-      -1,    -1,   251,    -1,   116,   161,    -1,    29,   308,    -1,
-     252,   113,   254,   368,   114,    -1,   252,   270,   113,   254,
-     368,   114,    -1,   252,   270,    -1,   270,   255,    -1,   254,
-     115,   270,   255,    -1,    -1,   130,   161,    -1,    -1,   257,
-      -1,   259,    -1,   258,    -1,   258,   134,   115,   133,   259,
-      -1,   259,   134,   115,   133,    95,    -1,   258,   134,   115,
-     133,    95,    -1,   263,    -1,   259,   134,   115,   133,   263,
-      -1,   258,   134,   115,   133,   263,    -1,   258,   134,   115,
-     133,   259,   134,   115,   133,   263,    -1,   264,    -1,   259,
-     134,   115,   133,   264,    -1,    -1,   261,    -1,   262,    -1,
-     262,   134,   115,   133,    95,    -1,   266,    -1,   265,    -1,
-     262,   134,   115,   133,   266,    -1,   262,   134,   115,   133,
-     265,    -1,   265,    -1,   358,   268,   369,    -1,   366,   268,
-     369,    -1,   225,   366,   268,   369,    -1,   215,    -1,   266,
-      -1,   358,    -1,   366,    -1,   225,   366,    -1,   367,    -1,
-     222,   332,   369,    -1,   222,   336,   369,    -1,   222,    -1,
-     222,   347,    -1,   138,    -1,   267,   115,   138,    -1,   136,
-      -1,    73,    -1,    74,    -1,   137,    -1,    73,    -1,    74,
-      -1,   138,    -1,    73,    -1,    74,    -1,   362,    -1,   223,
-      -1,   223,   353,    -1,   362,    -1,   367,    -1,   223,    -1,
-     223,   341,    -1,    -1,   130,   274,    -1,   106,   274,    -1,
-     162,    -1,   113,   275,   368,   114,    -1,    -1,   274,    -1,
-     276,   274,    -1,   275,   115,   274,    -1,   275,   115,   276,
-     274,    -1,   277,   116,    -1,   270,   116,    -1,   278,    -1,
-     277,   278,    -1,    79,    -1,   112,   270,    -1,   110,   133,
-     162,   134,   111,    -1,   110,   133,   306,   134,   111,    -1,
-     110,   133,   161,    95,   161,   134,   111,    -1,   112,   110,
-     133,   145,   134,   111,    -1,   280,    -1,   229,   280,    -1,
-     279,   231,    -1,   279,   231,   225,    -1,   281,    -1,   225,
-     281,    -1,   280,   226,    -1,    74,   108,   288,   109,    -1,
-     283,   369,    -1,   282,   115,   283,   369,    -1,    -1,   285,
-     270,   284,   286,    -1,   223,   332,    -1,    32,    -1,    34,
-      -1,    33,    -1,    -1,   286,   287,    -1,   128,   270,   108,
-     288,   109,    -1,   128,   113,   133,   294,   114,    -1,   128,
-     108,   133,   282,   134,   109,   113,   133,   294,   114,   108,
-     288,   109,    -1,   272,    -1,   162,    -1,   288,   115,   272,
-      -1,   288,   115,   162,    -1,    32,   290,    -1,   230,    32,
-     290,    -1,   289,   115,   290,    -1,   291,   286,    -1,   291,
-     286,   130,   272,    -1,   270,    -1,   269,   108,   133,   282,
-     134,   109,    -1,    35,   270,   108,   133,   282,   134,   109,
-     113,   114,    -1,    -1,    35,   270,   108,   133,   282,   134,
-     109,   113,   293,   294,   114,    -1,   295,    -1,   294,   133,
-     295,    -1,   296,   134,   131,    -1,   297,   134,   131,    -1,
-     213,    -1,   215,    -1,   296,   134,   115,   133,   268,    -1,
-     223,   305,    -1,   297,   134,   115,   133,   305,    -1,    -1,
-     299,    -1,   301,    -1,   299,   133,   301,    -1,    -1,   299,
-      -1,   210,    -1,   303,    -1,   196,    -1,    -1,     5,    81,
-     302,   113,   300,   114,    -1,    39,   301,    -1,   304,    -1,
-     319,   171,    -1,   323,   133,   205,   171,    -1,   214,   171,
-      -1,   222,   319,   171,    -1,   225,   319,   171,    -1,   229,
-     319,   171,    -1,   229,   225,   319,   171,    -1,   222,   323,
-     133,   205,   171,    -1,   225,   323,   133,   205,   171,    -1,
-     229,   323,   133,   205,   171,    -1,   229,   225,   323,   133,
-     205,   171,    -1,   314,    -1,   319,    -1,   327,    -1,   161,
-     122,   161,    -1,    -1,    63,   108,   140,   109,   308,    -1,
-      -1,   309,    -1,   310,    -1,   309,   310,    -1,    38,   108,
-     108,   311,   109,   109,    -1,   312,    -1,   311,   115,   312,
-      -1,    -1,   313,    -1,   313,   108,   168,   109,    -1,   268,
-      -1,   232,    -1,   233,    -1,   226,    -1,   315,   308,    -1,
-     316,    -1,   317,   308,    -1,   318,   308,    -1,   136,    -1,
-     108,   315,   109,    -1,   118,   314,    -1,   118,   225,   314,
-      -1,   108,   316,   109,    -1,   315,   345,    -1,   108,   316,
-     109,   345,    -1,   108,   317,   109,   346,    -1,   108,   317,
-     109,    -1,   108,   316,   109,   108,   133,   260,   134,   109,
-      -1,   108,   318,   109,    -1,   320,   308,    -1,   321,    -1,
-     322,   308,    -1,   315,   108,   133,   260,   134,   109,    -1,
-     108,   321,   109,   108,   133,   260,   134,   109,    -1,   108,
-     320,   109,    -1,   118,   319,    -1,   118,   225,   319,    -1,
-     108,   321,   109,    -1,   108,   321,   109,   345,    -1,   108,
-     322,   109,   346,    -1,   108,   322,   109,    -1,   324,    -1,
-     325,    -1,   326,    -1,   315,   108,   267,   109,    -1,   108,
-     325,   109,   108,   267,   109,    -1,   108,   324,   109,    -1,
-     118,   323,    -1,   118,   225,   323,    -1,   108,   325,   109,
-      -1,   108,   325,   109,   345,    -1,   108,   326,   109,   346,
-      -1,   108,   326,   109,    -1,   328,   308,    -1,   329,    -1,
-     330,   308,    -1,   331,   308,    -1,   337,    -1,   108,   328,
-     109,    -1,   118,   327,    -1,   118,   225,   327,    -1,   108,
-     329,   109,    -1,   328,   345,    -1,   108,   329,   109,   345,
-      -1,   108,   330,   109,   346,    -1,   108,   330,   109,    -1,
-     328,   108,   133,   260,   134,   109,    -1,   108,   329,   109,
-     108,   133,   260,   134,   109,    -1,   108,   331,   109,    -1,
-     315,   308,    -1,   333,    -1,   334,   308,    -1,   335,   308,
-      -1,   118,   332,    -1,   118,   225,   332,    -1,   108,   333,
-     109,    -1,   315,   351,    -1,   108,   333,   109,   345,    -1,
-     108,   334,   109,   346,    -1,   108,   334,   109,    -1,   315,
-     108,   133,   260,   134,   109,    -1,   108,   333,   109,   108,
-     133,   260,   134,   109,    -1,   108,   335,   109,    -1,   337,
-     308,    -1,   338,    -1,   339,   308,    -1,   340,   308,    -1,
-      73,    -1,    74,    -1,   118,   336,    -1,   118,   225,   336,
-      -1,   108,   338,   109,    -1,   337,   351,    -1,   108,   338,
-     109,   351,    -1,   337,   108,   133,   260,   134,   109,    -1,
-     108,   338,   109,   108,   133,   260,   134,   109,    -1,   342,
-      -1,   343,   308,    -1,   344,   308,    -1,   118,    -1,   118,
-     225,    -1,   118,   341,    -1,   118,   225,   341,    -1,   108,
-     342,   109,    -1,   345,    -1,   108,   342,   109,   345,    -1,
-     108,   343,   109,   346,    -1,   108,   343,   109,    -1,   108,
-     133,   260,   134,   109,    -1,   108,   342,   109,   108,   133,
-     260,   134,   109,    -1,   108,   344,   109,    -1,   110,   111,
-      -1,   110,   111,   346,    -1,   346,    -1,   110,   133,   162,
-     134,   111,    -1,   110,   133,   118,   134,   111,    -1,   346,
-     110,   133,   162,   134,   111,    -1,   346,   110,   133,   118,
-     134,   111,    -1,   348,    -1,   349,   308,    -1,   350,   308,
-      -1,   118,    -1,   118,   225,    -1,   118,   347,    -1,   118,
-     225,   347,    -1,   108,   348,   109,    -1,   351,    -1,   108,
-     348,   109,   351,    -1,   108,   349,   109,   346,    -1,   108,
-     349,   109,    -1,   108,   133,   260,   134,   109,    -1,   108,
-     348,   109,   108,   133,   260,   134,   109,    -1,   108,   350,
-     109,    -1,   352,    -1,   352,   346,    -1,   346,    -1,   110,
-     111,    -1,   110,   133,   225,   118,   134,   111,    -1,   110,
-     133,   225,   134,   111,    -1,   110,   133,   225,   162,   134,
-     111,    -1,   110,   133,     7,   224,   162,   134,   111,    -1,
-     110,   133,   225,     7,   162,   134,   111,    -1,   354,    -1,
-     355,   308,    -1,   356,   308,    -1,   118,    -1,   118,   225,
-      -1,   118,   353,    -1,   118,   225,   353,    -1,   108,   354,
-     109,    -1,   345,    -1,   108,   354,   109,   345,    -1,   108,
-     355,   109,   346,    -1,   108,   355,   109,    -1,   108,   354,
-     109,   108,   133,   260,   134,   109,    -1,   108,   356,   109,
-      -1,   358,    -1,   366,    -1,   225,   366,    -1,   359,    -1,
-     360,    -1,   118,   223,    -1,   225,   118,   223,    -1,   118,
-     367,    -1,   225,   118,   367,    -1,   118,   357,    -1,   225,
-     118,   357,    -1,   110,   111,   223,    -1,   361,   223,    -1,
-     110,   111,   346,   223,    -1,   361,   346,   223,    -1,   346,
-     223,    -1,   110,   111,   359,    -1,   361,   359,    -1,   110,
-     111,   346,   359,    -1,   361,   346,   359,    -1,   346,   359,
-      -1,   110,   133,   225,   118,   134,   111,    -1,   110,   133,
-     225,   162,   134,   111,    -1,   110,   133,   229,   162,   134,
-     111,    -1,   110,   133,   229,   225,   162,   134,   111,    -1,
-     366,    -1,   225,   366,    -1,   363,    -1,   364,    -1,   365,
-      -1,   118,   223,    -1,   225,   118,   223,    -1,   118,   367,
-      -1,   225,   118,   367,    -1,   118,   362,    -1,   225,   118,
-     362,    -1,   110,   111,   223,    -1,   110,   111,   346,   223,
-      -1,   346,   223,    -1,   110,   111,   364,    -1,   110,   111,
-     346,   364,    -1,   346,   364,    -1,   110,   133,   259,   134,
-     111,    -1,   110,   111,   108,   256,   109,    -1,   366,   108,
-     133,   256,   134,   109,    -1,   216,   108,   133,   256,   134,
-     109,    -1,    -1,   115,    -1,    -1,   130,   162,    -1
+      -1,    22,    -1,    23,    -1,    15,    -1,    25,    -1,    26,
+      -1,    27,    -1,    24,    -1,   236,    -1,   230,   236,    -1,
+     235,   232,    -1,   235,   232,   226,    -1,   235,   232,   236,
+      -1,   237,    -1,   225,   238,   225,    -1,   234,    -1,   226,
+     234,    -1,   237,   227,    -1,   237,   234,    -1,    28,   109,
+     275,   110,    -1,    28,   109,   168,   110,    -1,    78,   109,
+     275,   110,    -1,    78,   109,   168,   110,    -1,   240,    -1,
+     230,   240,    -1,   239,   232,    -1,   239,   232,   226,    -1,
+     243,    -1,   226,   243,    -1,   240,   227,    -1,   242,    -1,
+     230,   242,    -1,   241,   232,    -1,   241,   232,   226,    -1,
+      74,    -1,   226,    74,    -1,   242,   227,    -1,   244,    -1,
+     255,    -1,   246,   114,   247,   115,    -1,   246,   273,    -1,
+      -1,   246,   273,   245,   114,   247,   115,    -1,   246,   109,
+     291,   110,   114,   247,   115,    -1,   246,   284,    -1,    31,
+     311,    -1,    32,   311,    -1,   248,    -1,   247,   248,    -1,
+     249,   132,    -1,    40,   249,   132,    -1,   250,   132,    -1,
+      40,   250,   132,    -1,   365,    -1,   365,   273,    -1,   249,
+     116,   273,    -1,   249,   116,    -1,   224,   251,    -1,   250,
+     116,   311,   251,    -1,    -1,   253,    -1,   317,   252,    -1,
+     330,   252,    -1,   356,    -1,    -1,   253,    -1,   117,   162,
+      -1,    30,   311,    -1,   254,   114,   257,   371,   115,    -1,
+     254,   273,    -1,    -1,   254,   273,   256,   114,   257,   371,
+     115,    -1,   273,   258,    -1,   257,   116,   273,   258,    -1,
+      -1,   131,   162,    -1,    -1,   260,    -1,   262,    -1,   261,
+      -1,   261,   135,   116,   134,   262,    -1,   262,   135,   116,
+     134,    96,    -1,   261,   135,   116,   134,    96,    -1,   266,
+      -1,   262,   135,   116,   134,   266,    -1,   261,   135,   116,
+     134,   266,    -1,   261,   135,   116,   134,   262,   135,   116,
+     134,   266,    -1,   267,    -1,   262,   135,   116,   134,   267,
+      -1,    -1,   264,    -1,   265,    -1,   265,   135,   116,   134,
+      96,    -1,   269,    -1,   268,    -1,   265,   135,   116,   134,
+     269,    -1,   265,   135,   116,   134,   268,    -1,   268,    -1,
+     361,   271,   372,    -1,   369,   271,   372,    -1,   226,   369,
+     271,   372,    -1,   216,    -1,   269,    -1,   361,    -1,   369,
+      -1,   226,   369,    -1,   370,    -1,   223,   335,   372,    -1,
+     223,   339,   372,    -1,   223,    -1,   223,   350,    -1,   139,
+      -1,   270,   116,   139,    -1,   137,    -1,    74,    -1,    75,
+      -1,   138,    -1,    74,    -1,    75,    -1,   139,    -1,    74,
+      -1,    75,    -1,   365,    -1,   224,    -1,   224,   356,    -1,
+     365,    -1,   370,    -1,   224,    -1,   224,   344,    -1,    -1,
+     131,   277,    -1,   107,   277,    -1,   163,    -1,   114,   278,
+     371,   115,    -1,    -1,   277,    -1,   279,   277,    -1,   278,
+     116,   277,    -1,   278,   116,   279,   277,    -1,   280,   117,
+      -1,   273,   117,    -1,   281,    -1,   280,   281,    -1,    80,
+      -1,   113,   273,    -1,   111,   134,   163,   135,   112,    -1,
+     111,   134,   309,   135,   112,    -1,   111,   134,   162,    96,
+     162,   135,   112,    -1,   113,   111,   134,   146,   135,   112,
+      -1,   283,    -1,   230,   283,    -1,   282,   232,    -1,   282,
+     232,   226,    -1,   284,    -1,   226,   284,    -1,   283,   227,
+      -1,    75,   109,   291,   110,    -1,   286,   372,    -1,   285,
+     116,   286,   372,    -1,    -1,   288,   273,   287,   289,    -1,
+     224,   335,    -1,    33,    -1,    35,    -1,    34,    -1,    -1,
+     289,   290,    -1,   129,   273,   109,   291,   110,    -1,   129,
+     114,   134,   297,   115,    -1,   129,   109,   134,   285,   135,
+     110,   114,   134,   297,   115,   109,   291,   110,    -1,   275,
+      -1,   163,    -1,   291,   116,   275,    -1,   291,   116,   163,
+      -1,    33,   293,    -1,   231,    33,   293,    -1,   292,   116,
+     293,    -1,   294,   289,    -1,   294,   289,   131,   275,    -1,
+     273,    -1,   272,   109,   134,   285,   135,   110,    -1,    36,
+     273,   109,   134,   285,   135,   110,   114,   115,    -1,    -1,
+      36,   273,   109,   134,   285,   135,   110,   114,   296,   297,
+     115,    -1,   298,    -1,   297,   134,   298,    -1,   299,   135,
+     132,    -1,   300,   135,   132,    -1,   214,    -1,   216,    -1,
+     299,   135,   116,   134,   271,    -1,   224,   308,    -1,   300,
+     135,   116,   134,   308,    -1,    -1,   302,    -1,   304,    -1,
+     302,   134,   304,    -1,    -1,   302,    -1,   211,    -1,   306,
+      -1,   197,    -1,    -1,     5,    82,   305,   114,   303,   115,
+      -1,    40,   304,    -1,   307,    -1,   322,   172,    -1,   326,
+     134,   206,   172,    -1,   215,   172,    -1,   223,   322,   172,
+      -1,   226,   322,   172,    -1,   230,   322,   172,    -1,   230,
+     226,   322,   172,    -1,   223,   326,   134,   206,   172,    -1,
+     226,   326,   134,   206,   172,    -1,   230,   326,   134,   206,
+     172,    -1,   230,   226,   326,   134,   206,   172,    -1,   317,
+      -1,   322,    -1,   330,    -1,   162,   123,   162,    -1,    -1,
+      64,   109,   141,   110,   311,    -1,    -1,   312,    -1,   313,
+      -1,   312,   313,    -1,    39,   109,   109,   314,   110,   110,
+      -1,   315,    -1,   314,   116,   315,    -1,    -1,   316,    -1,
+     316,   109,   169,   110,    -1,   271,    -1,   233,    -1,   234,
+      -1,   227,    -1,   318,   311,    -1,   319,    -1,   320,   311,
+      -1,   321,   311,    -1,   137,    -1,   109,   318,   110,    -1,
+     119,   317,    -1,   119,   226,   317,    -1,   109,   319,   110,
+      -1,   318,   348,    -1,   109,   319,   110,   348,    -1,   109,
+     320,   110,   349,    -1,   109,   320,   110,    -1,   109,   319,
+     110,   109,   134,   263,   135,   110,    -1,   109,   321,   110,
+      -1,   323,   311,    -1,   324,    -1,   325,   311,    -1,   318,
+     109,   134,   263,   135,   110,    -1,   109,   324,   110,   109,
+     134,   263,   135,   110,    -1,   109,   323,   110,    -1,   119,
+     322,    -1,   119,   226,   322,    -1,   109,   324,   110,    -1,
+     109,   324,   110,   348,    -1,   109,   325,   110,   349,    -1,
+     109,   325,   110,    -1,   327,    -1,   328,    -1,   329,    -1,
+     318,   109,   270,   110,    -1,   109,   328,   110,   109,   270,
+     110,    -1,   109,   327,   110,    -1,   119,   326,    -1,   119,
+     226,   326,    -1,   109,   328,   110,    -1,   109,   328,   110,
+     348,    -1,   109,   329,   110,   349,    -1,   109,   329,   110,
+      -1,   331,   311,    -1,   332,    -1,   333,   311,    -1,   334,
+     311,    -1,   340,    -1,   109,   331,   110,    -1,   119,   330,
+      -1,   119,   226,   330,    -1,   109,   332,   110,    -1,   331,
+     348,    -1,   109,   332,   110,   348,    -1,   109,   333,   110,
+     349,    -1,   109,   333,   110,    -1,   331,   109,   134,   263,
+     135,   110,    -1,   109,   332,   110,   109,   134,   263,   135,
+     110,    -1,   109,   334,   110,    -1,   318,   311,    -1,   336,
+      -1,   337,   311,    -1,   338,   311,    -1,   119,   335,    -1,
+     119,   226,   335,    -1,   109,   336,   110,    -1,   318,   354,
+      -1,   109,   336,   110,   348,    -1,   109,   337,   110,   349,
+      -1,   109,   337,   110,    -1,   318,   109,   134,   263,   135,
+     110,    -1,   109,   336,   110,   109,   134,   263,   135,   110,
+      -1,   109,   338,   110,    -1,   340,   311,    -1,   341,    -1,
+     342,   311,    -1,   343,   311,    -1,    74,    -1,    75,    -1,
+     119,   339,    -1,   119,   226,   339,    -1,   109,   341,   110,
+      -1,   340,   354,    -1,   109,   341,   110,   354,    -1,   340,
+     109,   134,   263,   135,   110,    -1,   109,   341,   110,   109,
+     134,   263,   135,   110,    -1,   345,    -1,   346,   311,    -1,
+     347,   311,    -1,   119,    -1,   119,   226,    -1,   119,   344,
+      -1,   119,   226,   344,    -1,   109,   345,   110,    -1,   348,
+      -1,   109,   345,   110,   348,    -1,   109,   346,   110,   349,
+      -1,   109,   346,   110,    -1,   109,   134,   263,   135,   110,
+      -1,   109,   345,   110,   109,   134,   263,   135,   110,    -1,
+     109,   347,   110,    -1,   111,   112,    -1,   111,   112,   349,
+      -1,   349,    -1,   111,   134,   163,   135,   112,    -1,   111,
+     134,   119,   135,   112,    -1,   349,   111,   134,   163,   135,
+     112,    -1,   349,   111,   134,   119,   135,   112,    -1,   351,
+      -1,   352,   311,    -1,   353,   311,    -1,   119,    -1,   119,
+     226,    -1,   119,   350,    -1,   119,   226,   350,    -1,   109,
+     351,   110,    -1,   354,    -1,   109,   351,   110,   354,    -1,
+     109,   352,   110,   349,    -1,   109,   352,   110,    -1,   109,
+     134,   263,   135,   110,    -1,   109,   351,   110,   109,   134,
+     263,   135,   110,    -1,   109,   353,   110,    -1,   355,    -1,
+     355,   349,    -1,   349,    -1,   111,   112,    -1,   111,   134,
+     226,   119,   135,   112,    -1,   111,   134,   226,   135,   112,
+      -1,   111,   134,   226,   163,   135,   112,    -1,   111,   134,
+       7,   225,   163,   135,   112,    -1,   111,   134,   226,     7,
+     163,   135,   112,    -1,   357,    -1,   358,   311,    -1,   359,
+     311,    -1,   119,    -1,   119,   226,    -1,   119,   356,    -1,
+     119,   226,   356,    -1,   109,   357,   110,    -1,   348,    -1,
+     109,   357,   110,   348,    -1,   109,   358,   110,   349,    -1,
+     109,   358,   110,    -1,   109,   357,   110,   109,   134,   263,
+     135,   110,    -1,   109,   359,   110,    -1,   361,    -1,   369,
+      -1,   226,   369,    -1,   362,    -1,   363,    -1,   119,   224,
+      -1,   226,   119,   224,    -1,   119,   370,    -1,   226,   119,
+     370,    -1,   119,   360,    -1,   226,   119,   360,    -1,   111,
+     112,   224,    -1,   364,   224,    -1,   111,   112,   349,   224,
+      -1,   364,   349,   224,    -1,   349,   224,    -1,   111,   112,
+     362,    -1,   364,   362,    -1,   111,   112,   349,   362,    -1,
+     364,   349,   362,    -1,   349,   362,    -1,   111,   134,   226,
+     119,   135,   112,    -1,   111,   134,   226,   163,   135,   112,
+      -1,   111,   134,   230,   163,   135,   112,    -1,   111,   134,
+     230,   226,   163,   135,   112,    -1,   369,    -1,   226,   369,
+      -1,   366,    -1,   367,    -1,   368,    -1,   119,   224,    -1,
+     226,   119,   224,    -1,   119,   370,    -1,   226,   119,   370,
+      -1,   119,   365,    -1,   226,   119,   365,    -1,   111,   112,
+     224,    -1,   111,   112,   349,   224,    -1,   349,   224,    -1,
+     111,   112,   367,    -1,   111,   112,   349,   367,    -1,   349,
+     367,    -1,   111,   134,   262,   135,   112,    -1,   111,   112,
+     109,   259,   110,    -1,   369,   109,   134,   259,   135,   110,
+      -1,   217,   109,   134,   259,   135,   110,    -1,    -1,   116,
+      -1,    -1,   131,   163,    -1
 };
 
@@ -1012,80 +1016,80 @@
 static const yytype_uint16 yyrline[] =
 {
-       0,   290,   290,   296,   305,   306,   307,   311,   312,   313,
-     317,   318,   322,   323,   327,   328,   332,   333,   339,   341,
-     343,   345,   350,   351,   357,   361,   363,   364,   366,   367,
-     369,   371,   373,   381,   382,   388,   389,   390,   395,   397,
-     402,   403,   407,   411,   413,   415,   417,   422,   425,   427,
-     429,   431,   433,   435,   437,   439,   445,   447,   449,   451,
-     453,   455,   457,   459,   461,   466,   467,   468,   469,   473,
-     474,   476,   481,   482,   484,   486,   491,   492,   494,   499,
-     500,   502,   507,   508,   510,   512,   514,   519,   520,   522,
-     527,   528,   533,   534,   539,   540,   545,   546,   551,   552,
-     557,   558,   560,   562,   567,   572,   573,   575,   577,   583,
-     584,   590,   592,   594,   596,   601,   602,   607,   608,   609,
-     610,   611,   612,   613,   614,   615,   616,   620,   621,   627,
-     628,   634,   635,   636,   637,   638,   639,   640,   641,   642,
-     651,   658,   660,   670,   671,   676,   678,   680,   682,   686,
-     687,   692,   697,   700,   702,   704,   709,   711,   719,   720,
-     722,   726,   727,   732,   733,   738,   739,   743,   748,   749,
-     753,   755,   761,   762,   766,   768,   770,   772,   778,   779,
-     783,   784,   788,   790,   792,   797,   799,   804,   806,   810,
-     813,   817,   820,   824,   826,   830,   832,   839,   841,   843,
-     852,   854,   856,   858,   860,   865,   867,   869,   871,   876,
-     889,   890,   895,   897,   902,   906,   908,   910,   912,   914,
-     920,   921,   927,   928,   932,   933,   938,   940,   946,   947,
-     949,   954,   956,   963,   965,   969,   970,   975,   977,   981,
-     982,   986,   988,   992,   993,   997,   998,  1002,  1003,  1018,
-    1019,  1020,  1021,  1022,  1026,  1031,  1038,  1048,  1053,  1058,
-    1066,  1071,  1076,  1081,  1086,  1094,  1116,  1121,  1128,  1130,
-    1137,  1142,  1147,  1158,  1163,  1168,  1173,  1178,  1187,  1192,
-    1200,  1201,  1202,  1203,  1209,  1214,  1222,  1223,  1224,  1225,
-    1229,  1230,  1231,  1232,  1237,  1238,  1247,  1248,  1253,  1254,
-    1259,  1261,  1263,  1265,  1267,  1270,  1269,  1281,  1282,  1284,
-    1294,  1295,  1300,  1304,  1306,  1308,  1310,  1312,  1314,  1316,
-    1318,  1323,  1325,  1327,  1329,  1331,  1333,  1335,  1337,  1339,
-    1341,  1343,  1345,  1351,  1352,  1354,  1356,  1358,  1363,  1364,
-    1370,  1371,  1373,  1375,  1380,  1382,  1384,  1386,  1391,  1392,
-    1394,  1396,  1401,  1402,  1404,  1409,  1410,  1412,  1414,  1419,
-    1421,  1423,  1428,  1429,  1433,  1435,  1437,  1439,  1441,  1446,
-    1448,  1453,  1455,  1460,  1461,  1463,  1464,  1469,  1470,  1472,
-    1474,  1479,  1481,  1487,  1488,  1490,  1493,  1496,  1501,  1502,
-    1507,  1512,  1516,  1518,  1520,  1525,  1527,  1533,  1534,  1542,
-    1543,  1547,  1548,  1549,  1551,  1553,  1560,  1561,  1563,  1565,
-    1570,  1571,  1577,  1578,  1582,  1583,  1588,  1589,  1590,  1592,
-    1600,  1601,  1603,  1606,  1608,  1612,  1613,  1614,  1616,  1618,
-    1622,  1627,  1635,  1636,  1645,  1647,  1652,  1653,  1654,  1658,
-    1659,  1660,  1664,  1665,  1666,  1670,  1671,  1672,  1677,  1678,
-    1679,  1680,  1686,  1687,  1689,  1694,  1695,  1700,  1701,  1702,
-    1703,  1704,  1719,  1720,  1725,  1726,  1734,  1736,  1738,  1741,
-    1743,  1745,  1768,  1769,  1771,  1773,  1778,  1779,  1781,  1786,
-    1791,  1792,  1798,  1797,  1801,  1805,  1807,  1809,  1815,  1816,
-    1821,  1826,  1828,  1833,  1835,  1836,  1838,  1843,  1845,  1847,
-    1852,  1854,  1859,  1864,  1872,  1878,  1877,  1891,  1892,  1897,
-    1898,  1902,  1907,  1912,  1920,  1925,  1936,  1937,  1948,  1949,
-    1955,  1956,  1960,  1961,  1962,  1965,  1964,  1975,  1980,  1985,
-    1991,  2000,  2006,  2012,  2018,  2024,  2032,  2038,  2046,  2052,
-    2061,  2062,  2063,  2067,  2071,  2073,  2078,  2079,  2083,  2084,
-    2089,  2095,  2096,  2099,  2101,  2102,  2106,  2107,  2108,  2109,
-    2143,  2145,  2146,  2148,  2153,  2158,  2163,  2165,  2167,  2172,
-    2174,  2176,  2178,  2183,  2185,  2195,  2197,  2198,  2203,  2205,
-    2207,  2212,  2214,  2216,  2221,  2223,  2225,  2234,  2235,  2236,
-    2240,  2242,  2244,  2249,  2251,  2253,  2258,  2260,  2262,  2277,
-    2279,  2280,  2282,  2287,  2288,  2293,  2295,  2297,  2302,  2304,
-    2306,  2308,  2313,  2315,  2317,  2327,  2329,  2330,  2332,  2337,
-    2339,  2341,  2346,  2348,  2350,  2352,  2357,  2359,  2361,  2392,
-    2394,  2395,  2397,  2402,  2407,  2415,  2417,  2419,  2424,  2426,
-    2431,  2433,  2447,  2448,  2450,  2455,  2457,  2459,  2461,  2463,
-    2468,  2469,  2471,  2473,  2478,  2480,  2482,  2488,  2490,  2492,
-    2496,  2498,  2500,  2502,  2516,  2517,  2519,  2524,  2526,  2528,
-    2530,  2532,  2537,  2538,  2540,  2542,  2547,  2549,  2551,  2557,
-    2558,  2560,  2569,  2572,  2574,  2577,  2579,  2581,  2594,  2595,
-    2597,  2602,  2604,  2606,  2608,  2610,  2615,  2616,  2618,  2620,
-    2625,  2627,  2635,  2636,  2637,  2642,  2643,  2647,  2649,  2651,
-    2653,  2655,  2657,  2664,  2666,  2668,  2670,  2672,  2674,  2676,
-    2678,  2680,  2682,  2687,  2689,  2691,  2696,  2722,  2723,  2725,
-    2729,  2730,  2734,  2736,  2738,  2740,  2742,  2744,  2751,  2753,
-    2755,  2757,  2759,  2761,  2766,  2771,  2773,  2775,  2793,  2795,
-    2800,  2801
+       0,   292,   292,   298,   307,   308,   309,   313,   314,   315,
+     319,   320,   324,   325,   329,   330,   334,   335,   341,   343,
+     345,   347,   352,   353,   359,   363,   365,   366,   368,   369,
+     371,   373,   375,   383,   384,   390,   391,   392,   397,   399,
+     404,   405,   409,   413,   415,   417,   419,   424,   427,   429,
+     431,   433,   435,   437,   439,   441,   447,   449,   451,   453,
+     455,   457,   459,   461,   463,   468,   469,   470,   471,   475,
+     476,   478,   483,   484,   486,   488,   493,   494,   496,   501,
+     502,   504,   509,   510,   512,   514,   516,   521,   522,   524,
+     529,   530,   535,   536,   541,   542,   547,   548,   553,   554,
+     559,   560,   562,   564,   569,   574,   575,   577,   579,   585,
+     586,   592,   594,   596,   598,   603,   604,   609,   610,   611,
+     612,   613,   614,   615,   616,   617,   618,   622,   623,   629,
+     630,   636,   637,   638,   639,   640,   641,   642,   643,   644,
+     653,   660,   662,   672,   673,   678,   680,   682,   684,   688,
+     689,   694,   699,   702,   704,   706,   711,   713,   721,   722,
+     724,   728,   729,   734,   735,   740,   741,   745,   750,   751,
+     755,   757,   763,   764,   768,   770,   772,   774,   780,   781,
+     785,   786,   790,   792,   794,   799,   801,   806,   808,   812,
+     815,   819,   822,   826,   828,   832,   834,   841,   843,   845,
+     854,   856,   858,   860,   862,   867,   869,   871,   873,   878,
+     891,   892,   897,   899,   904,   908,   910,   912,   914,   916,
+     922,   923,   929,   930,   934,   935,   940,   942,   948,   949,
+     951,   956,   958,   965,   967,   971,   972,   977,   979,   983,
+     984,   988,   990,   994,   995,   999,  1000,  1004,  1005,  1020,
+    1021,  1022,  1023,  1024,  1028,  1033,  1040,  1050,  1055,  1060,
+    1068,  1073,  1078,  1083,  1088,  1096,  1118,  1123,  1130,  1132,
+    1139,  1144,  1149,  1160,  1165,  1170,  1175,  1180,  1189,  1194,
+    1202,  1203,  1204,  1205,  1211,  1216,  1224,  1225,  1226,  1227,
+    1231,  1232,  1233,  1234,  1239,  1240,  1249,  1250,  1255,  1256,
+    1261,  1263,  1265,  1267,  1269,  1272,  1271,  1283,  1284,  1286,
+    1296,  1297,  1302,  1306,  1308,  1310,  1312,  1314,  1316,  1318,
+    1320,  1325,  1327,  1329,  1331,  1333,  1335,  1337,  1339,  1341,
+    1343,  1345,  1347,  1349,  1355,  1356,  1358,  1360,  1362,  1367,
+    1368,  1374,  1375,  1377,  1379,  1384,  1386,  1388,  1390,  1395,
+    1396,  1398,  1400,  1405,  1406,  1408,  1413,  1414,  1416,  1418,
+    1423,  1425,  1427,  1432,  1433,  1437,  1439,  1445,  1444,  1448,
+    1450,  1455,  1457,  1462,  1464,  1469,  1470,  1472,  1473,  1478,
+    1479,  1481,  1483,  1488,  1490,  1496,  1497,  1499,  1502,  1505,
+    1510,  1511,  1516,  1521,  1525,  1527,  1533,  1532,  1539,  1541,
+    1547,  1548,  1556,  1557,  1561,  1562,  1563,  1565,  1567,  1574,
+    1575,  1577,  1579,  1584,  1585,  1591,  1592,  1596,  1597,  1602,
+    1603,  1604,  1606,  1614,  1615,  1617,  1620,  1622,  1626,  1627,
+    1628,  1630,  1632,  1636,  1641,  1649,  1650,  1659,  1661,  1666,
+    1667,  1668,  1672,  1673,  1674,  1678,  1679,  1680,  1684,  1685,
+    1686,  1691,  1692,  1693,  1694,  1700,  1701,  1703,  1708,  1709,
+    1714,  1715,  1716,  1717,  1718,  1733,  1734,  1739,  1740,  1748,
+    1750,  1752,  1755,  1757,  1759,  1782,  1783,  1785,  1787,  1792,
+    1793,  1795,  1800,  1805,  1806,  1812,  1811,  1815,  1819,  1821,
+    1823,  1829,  1830,  1835,  1840,  1842,  1847,  1849,  1850,  1852,
+    1857,  1859,  1861,  1866,  1868,  1873,  1878,  1886,  1892,  1891,
+    1905,  1906,  1911,  1912,  1916,  1921,  1926,  1934,  1939,  1950,
+    1951,  1962,  1963,  1969,  1970,  1974,  1975,  1976,  1979,  1978,
+    1989,  1994,  1999,  2005,  2014,  2020,  2026,  2032,  2038,  2046,
+    2052,  2060,  2066,  2075,  2076,  2077,  2081,  2085,  2087,  2092,
+    2093,  2097,  2098,  2103,  2109,  2110,  2113,  2115,  2116,  2120,
+    2121,  2122,  2123,  2157,  2159,  2160,  2162,  2167,  2172,  2177,
+    2179,  2181,  2186,  2188,  2190,  2192,  2197,  2199,  2209,  2211,
+    2212,  2217,  2219,  2221,  2226,  2228,  2230,  2235,  2237,  2239,
+    2248,  2249,  2250,  2254,  2256,  2258,  2263,  2265,  2267,  2272,
+    2274,  2276,  2291,  2293,  2294,  2296,  2301,  2302,  2307,  2309,
+    2311,  2316,  2318,  2320,  2322,  2327,  2329,  2331,  2341,  2343,
+    2344,  2346,  2351,  2353,  2355,  2360,  2362,  2364,  2366,  2371,
+    2373,  2375,  2406,  2408,  2409,  2411,  2416,  2421,  2429,  2431,
+    2433,  2438,  2440,  2445,  2447,  2461,  2462,  2464,  2469,  2471,
+    2473,  2475,  2477,  2482,  2483,  2485,  2487,  2492,  2494,  2496,
+    2502,  2504,  2506,  2510,  2512,  2514,  2516,  2530,  2531,  2533,
+    2538,  2540,  2542,  2544,  2546,  2551,  2552,  2554,  2556,  2561,
+    2563,  2565,  2571,  2572,  2574,  2583,  2586,  2588,  2591,  2593,
+    2595,  2608,  2609,  2611,  2616,  2618,  2620,  2622,  2624,  2629,
+    2630,  2632,  2634,  2639,  2641,  2649,  2650,  2651,  2656,  2657,
+    2661,  2663,  2665,  2667,  2669,  2671,  2678,  2680,  2682,  2684,
+    2686,  2688,  2690,  2692,  2694,  2696,  2701,  2703,  2705,  2710,
+    2736,  2737,  2739,  2743,  2744,  2748,  2750,  2752,  2754,  2756,
+    2758,  2765,  2767,  2769,  2771,  2773,  2775,  2780,  2785,  2787,
+    2789,  2807,  2809,  2814,  2815
 };
 #endif
@@ -1099,13 +1103,13 @@
   "STATIC", "INLINE", "FORTRAN", "CONST", "VOLATILE", "RESTRICT", "FORALL",
   "LVALUE", "VOID", "CHAR", "SHORT", "INT", "LONG", "FLOAT", "DOUBLE",
-  "SIGNED", "UNSIGNED", "BOOL", "COMPLEX", "IMAGINARY", "TYPEOF", "LABEL",
-  "ENUM", "STRUCT", "UNION", "TYPE", "FTYPE", "DTYPE", "CONTEXT", "SIZEOF",
-  "OFFSETOF", "ATTRIBUTE", "EXTENSION", "IF", "ELSE", "SWITCH", "CASE",
-  "DEFAULT", "DO", "WHILE", "FOR", "BREAK", "CONTINUE", "GOTO", "RETURN",
-  "CHOOSE", "DISABLE", "ENABLE", "FALLTHRU", "TRY", "CATCH", "CATCHRESUME",
-  "FINALLY", "THROW", "THROWRESUME", "AT", "ASM", "ALIGNAS", "ALIGNOF",
-  "ATOMIC", "GENERIC", "NORETURN", "STATICASSERT", "THREADLOCAL",
-  "IDENTIFIER", "QUOTED_IDENTIFIER", "TYPEDEFname", "TYPEGENname",
-  "ATTR_IDENTIFIER", "ATTR_TYPEDEFname", "ATTR_TYPEGENname",
+  "SIGNED", "UNSIGNED", "VALIST", "BOOL", "COMPLEX", "IMAGINARY", "TYPEOF",
+  "LABEL", "ENUM", "STRUCT", "UNION", "OTYPE", "FTYPE", "DTYPE", "TRAIT",
+  "SIZEOF", "OFFSETOF", "ATTRIBUTE", "EXTENSION", "IF", "ELSE", "SWITCH",
+  "CASE", "DEFAULT", "DO", "WHILE", "FOR", "BREAK", "CONTINUE", "GOTO",
+  "RETURN", "CHOOSE", "DISABLE", "ENABLE", "FALLTHRU", "TRY", "CATCH",
+  "CATCHRESUME", "FINALLY", "THROW", "THROWRESUME", "AT", "ASM", "ALIGNAS",
+  "ALIGNOF", "ATOMIC", "GENERIC", "NORETURN", "STATICASSERT",
+  "THREADLOCAL", "IDENTIFIER", "QUOTED_IDENTIFIER", "TYPEDEFname",
+  "TYPEGENname", "ATTR_IDENTIFIER", "ATTR_TYPEDEFname", "ATTR_TYPEGENname",
   "INTEGERconstant", "FLOATINGconstant", "CHARACTERconstant",
   "STRINGliteral", "ZERO", "ONE", "ARROW", "ICR", "DECR", "LS", "RS", "LE",
@@ -1152,35 +1156,35 @@
   "sue_declaration_specifier", "sue_type_specifier",
   "typedef_declaration_specifier", "typedef_type_specifier",
-  "elaborated_type_name", "aggregate_name", "aggregate_key",
+  "elaborated_type_name", "aggregate_name", "$@2", "aggregate_key",
   "field_declaration_list", "field_declaration",
   "new_field_declaring_list", "field_declaring_list", "field_declarator",
   "bit_subrange_size_opt", "bit_subrange_size", "enum_key", "enum_name",
-  "enumerator_list", "enumerator_value_opt", "new_parameter_type_list_opt",
-  "new_parameter_type_list", "new_parameter_list",
-  "new_abstract_parameter_list", "parameter_type_list_opt",
-  "parameter_type_list", "parameter_list", "new_parameter_declaration",
-  "new_abstract_parameter_declaration", "parameter_declaration",
-  "abstract_parameter_declaration", "identifier_list",
-  "identifier_or_type_name", "no_01_identifier_or_type_name",
-  "no_attr_identifier_or_type_name", "type_name_no_function", "type_name",
-  "initializer_opt", "initializer", "initializer_list", "designation",
-  "designator_list", "designator", "typegen_declaration_specifier",
-  "typegen_type_specifier", "typegen_name", "type_parameter_list",
-  "type_parameter", "$@2", "type_class", "assertion_list_opt", "assertion",
-  "type_name_list", "type_declaring_list", "type_declarator",
-  "type_declarator_name", "context_specifier", "$@3",
-  "context_declaration_list", "context_declaration",
-  "new_context_declaring_list", "context_declaring_list",
-  "translation_unit", "external_definition_list",
-  "external_definition_list_opt", "external_definition", "$@4",
-  "external_function_definition", "function_definition", "declarator",
-  "subrange", "asm_name_opt", "attribute_list_opt", "attribute_list",
-  "attribute", "attribute_parameter_list", "attrib", "any_word",
-  "variable_declarator", "paren_identifier", "variable_ptr",
-  "variable_array", "variable_function", "function_declarator",
-  "function_no_ptr", "function_ptr", "function_array",
-  "old_function_declarator", "old_function_no_ptr", "old_function_ptr",
-  "old_function_array", "type_redeclarator", "paren_type", "type_ptr",
-  "type_array", "type_function", "identifier_parameter_declarator",
+  "$@3", "enumerator_list", "enumerator_value_opt",
+  "new_parameter_type_list_opt", "new_parameter_type_list",
+  "new_parameter_list", "new_abstract_parameter_list",
+  "parameter_type_list_opt", "parameter_type_list", "parameter_list",
+  "new_parameter_declaration", "new_abstract_parameter_declaration",
+  "parameter_declaration", "abstract_parameter_declaration",
+  "identifier_list", "identifier_or_type_name",
+  "no_01_identifier_or_type_name", "no_attr_identifier_or_type_name",
+  "type_name_no_function", "type_name", "initializer_opt", "initializer",
+  "initializer_list", "designation", "designator_list", "designator",
+  "typegen_declaration_specifier", "typegen_type_specifier",
+  "typegen_name", "type_parameter_list", "type_parameter", "$@4",
+  "type_class", "assertion_list_opt", "assertion", "type_name_list",
+  "type_declaring_list", "type_declarator", "type_declarator_name",
+  "trait_specifier", "$@5", "trait_declaration_list", "trait_declaration",
+  "new_trait_declaring_list", "trait_declaring_list", "translation_unit",
+  "external_definition_list", "external_definition_list_opt",
+  "external_definition", "$@6", "external_function_definition",
+  "function_definition", "declarator", "subrange", "asm_name_opt",
+  "attribute_list_opt", "attribute_list", "attribute",
+  "attribute_parameter_list", "attrib", "any_word", "variable_declarator",
+  "paren_identifier", "variable_ptr", "variable_array",
+  "variable_function", "function_declarator", "function_no_ptr",
+  "function_ptr", "function_array", "old_function_declarator",
+  "old_function_no_ptr", "old_function_ptr", "old_function_array",
+  "type_redeclarator", "paren_type", "type_ptr", "type_array",
+  "type_function", "identifier_parameter_declarator",
   "identifier_parameter_ptr", "identifier_parameter_array",
   "identifier_parameter_function", "type_parameter_redeclarator",
@@ -1219,8 +1223,8 @@
      335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
      345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   360,   361,   362,    40,    41,
-      91,    93,    46,   123,   125,    44,    58,    33,    42,    38,
-      43,    45,   126,    47,    37,    60,    62,    94,   124,    63,
-      61,    59
+     355,   356,   357,   358,   359,   360,   361,   362,   363,    40,
+      41,    91,    93,    46,   123,   125,    44,    58,    33,    42,
+      38,    43,    45,   126,    47,    37,    60,    62,    94,   124,
+      63,    61,    59
 };
 # endif
@@ -1229,80 +1233,80 @@
 static const yytype_uint16 yyr1[] =
 {
-       0,   132,   133,   134,   135,   135,   135,   136,   136,   136,
-     137,   137,   138,   138,   139,   139,   140,   140,   141,   141,
-     141,   141,   142,   142,   142,   142,   142,   142,   142,   142,
-     142,   142,   142,   143,   143,   144,   144,   144,   144,   144,
-     145,   145,   146,   146,   146,   146,   146,   147,   147,   147,
-     147,   147,   147,   147,   147,   147,   147,   147,   147,   147,
-     147,   147,   147,   147,   147,   148,   148,   148,   148,   149,
-     149,   149,   150,   150,   150,   150,   151,   151,   151,   152,
-     152,   152,   153,   153,   153,   153,   153,   154,   154,   154,
-     155,   155,   156,   156,   157,   157,   158,   158,   159,   159,
-     160,   160,   160,   160,   161,   162,   162,   162,   162,   163,
-     163,   164,   164,   164,   164,   165,   165,   166,   166,   166,
-     166,   166,   166,   166,   166,   166,   166,   167,   167,   168,
-     168,   169,   169,   169,   169,   169,   169,   169,   169,   169,
-     170,   171,   171,   172,   172,   173,   173,   173,   173,   174,
-     174,   175,   176,   176,   176,   176,   176,   176,   177,   177,
-     177,   178,   178,   179,   179,   180,   180,   181,   182,   182,
-     183,   183,   184,   184,   185,   185,   185,   185,   186,   186,
-     187,   187,   188,   188,   188,   189,   189,   190,   190,   190,
-     190,   190,   190,   190,   190,   190,   190,   191,   191,   191,
-     192,   192,   192,   192,   192,   193,   193,   193,   193,   194,
-     195,   195,   195,   195,   195,   196,   196,   196,   196,   196,
-     197,   197,   198,   198,   199,   199,   200,   200,   201,   201,
-     201,   202,   202,   203,   203,   204,   204,   205,   205,   206,
-     206,   207,   207,   208,   208,   209,   209,   210,   210,   211,
-     211,   211,   211,   211,   212,   212,   212,   213,   213,   213,
-     214,   214,   214,   214,   214,   215,   215,   215,   216,   216,
-     217,   217,   217,   218,   218,   218,   218,   218,   219,   219,
-     220,   220,   220,   220,   221,   221,   222,   222,   222,   222,
-     223,   223,   223,   223,   224,   224,   225,   225,   226,   226,
-     227,   227,   227,   227,   227,   228,   227,   229,   229,   229,
-     230,   230,   231,   232,   232,   232,   232,   232,   232,   232,
-     232,   233,   233,   233,   233,   233,   233,   233,   233,   233,
-     233,   233,   233,   234,   234,   234,   234,   234,   235,   235,
-     236,   236,   236,   236,   237,   237,   237,   237,   238,   238,
-     238,   238,   239,   239,   239,   240,   240,   240,   240,   241,
-     241,   241,   242,   242,   243,   243,   243,   243,   243,   244,
-     244,   245,   245,   246,   246,   246,   246,   247,   247,   247,
-     247,   248,   248,   249,   249,   249,   249,   249,   250,   250,
-     251,   252,   253,   253,   253,   254,   254,   255,   255,   256,
-     256,   257,   257,   257,   257,   257,   258,   258,   258,   258,
-     259,   259,   260,   260,   261,   261,   262,   262,   262,   262,
-     263,   263,   263,   263,   263,   264,   264,   264,   264,   264,
-     265,   265,   266,   266,   267,   267,   268,   268,   268,   269,
-     269,   269,   270,   270,   270,   271,   271,   271,   272,   272,
-     272,   272,   273,   273,   273,   274,   274,   275,   275,   275,
-     275,   275,   276,   276,   277,   277,   278,   278,   278,   278,
-     278,   278,   279,   279,   279,   279,   280,   280,   280,   281,
-     282,   282,   284,   283,   283,   285,   285,   285,   286,   286,
-     287,   287,   287,   288,   288,   288,   288,   289,   289,   289,
-     290,   290,   291,   291,   292,   293,   292,   294,   294,   295,
-     295,   296,   296,   296,   297,   297,   298,   298,   299,   299,
-     300,   300,   301,   301,   301,   302,   301,   301,   303,   303,
-     303,   304,   304,   304,   304,   304,   304,   304,   304,   304,
-     305,   305,   305,   306,   307,   307,   308,   308,   309,   309,
-     310,   311,   311,   312,   312,   312,   313,   313,   313,   313,
-     314,   314,   314,   314,   315,   315,   316,   316,   316,   317,
-     317,   317,   317,   318,   318,   319,   319,   319,   320,   320,
-     320,   321,   321,   321,   322,   322,   322,   323,   323,   323,
-     324,   324,   324,   325,   325,   325,   326,   326,   326,   327,
-     327,   327,   327,   328,   328,   329,   329,   329,   330,   330,
-     330,   330,   331,   331,   331,   332,   332,   332,   332,   333,
-     333,   333,   334,   334,   334,   334,   335,   335,   335,   336,
-     336,   336,   336,   337,   337,   338,   338,   338,   339,   339,
-     340,   340,   341,   341,   341,   342,   342,   342,   342,   342,
-     343,   343,   343,   343,   344,   344,   344,   345,   345,   345,
-     346,   346,   346,   346,   347,   347,   347,   348,   348,   348,
-     348,   348,   349,   349,   349,   349,   350,   350,   350,   351,
-     351,   351,   352,   352,   352,   352,   352,   352,   353,   353,
-     353,   354,   354,   354,   354,   354,   355,   355,   355,   355,
-     356,   356,   357,   357,   357,   358,   358,   359,   359,   359,
-     359,   359,   359,   360,   360,   360,   360,   360,   360,   360,
-     360,   360,   360,   361,   361,   361,   361,   362,   362,   362,
-     363,   363,   364,   364,   364,   364,   364,   364,   365,   365,
-     365,   365,   365,   365,   366,   367,   367,   367,   368,   368,
-     369,   369
+       0,   133,   134,   135,   136,   136,   136,   137,   137,   137,
+     138,   138,   139,   139,   140,   140,   141,   141,   142,   142,
+     142,   142,   143,   143,   143,   143,   143,   143,   143,   143,
+     143,   143,   143,   144,   144,   145,   145,   145,   145,   145,
+     146,   146,   147,   147,   147,   147,   147,   148,   148,   148,
+     148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
+     148,   148,   148,   148,   148,   149,   149,   149,   149,   150,
+     150,   150,   151,   151,   151,   151,   152,   152,   152,   153,
+     153,   153,   154,   154,   154,   154,   154,   155,   155,   155,
+     156,   156,   157,   157,   158,   158,   159,   159,   160,   160,
+     161,   161,   161,   161,   162,   163,   163,   163,   163,   164,
+     164,   165,   165,   165,   165,   166,   166,   167,   167,   167,
+     167,   167,   167,   167,   167,   167,   167,   168,   168,   169,
+     169,   170,   170,   170,   170,   170,   170,   170,   170,   170,
+     171,   172,   172,   173,   173,   174,   174,   174,   174,   175,
+     175,   176,   177,   177,   177,   177,   177,   177,   178,   178,
+     178,   179,   179,   180,   180,   181,   181,   182,   183,   183,
+     184,   184,   185,   185,   186,   186,   186,   186,   187,   187,
+     188,   188,   189,   189,   189,   190,   190,   191,   191,   191,
+     191,   191,   191,   191,   191,   191,   191,   192,   192,   192,
+     193,   193,   193,   193,   193,   194,   194,   194,   194,   195,
+     196,   196,   196,   196,   196,   197,   197,   197,   197,   197,
+     198,   198,   199,   199,   200,   200,   201,   201,   202,   202,
+     202,   203,   203,   204,   204,   205,   205,   206,   206,   207,
+     207,   208,   208,   209,   209,   210,   210,   211,   211,   212,
+     212,   212,   212,   212,   213,   213,   213,   214,   214,   214,
+     215,   215,   215,   215,   215,   216,   216,   216,   217,   217,
+     218,   218,   218,   219,   219,   219,   219,   219,   220,   220,
+     221,   221,   221,   221,   222,   222,   223,   223,   223,   223,
+     224,   224,   224,   224,   225,   225,   226,   226,   227,   227,
+     228,   228,   228,   228,   228,   229,   228,   230,   230,   230,
+     231,   231,   232,   233,   233,   233,   233,   233,   233,   233,
+     233,   234,   234,   234,   234,   234,   234,   234,   234,   234,
+     234,   234,   234,   234,   235,   235,   235,   235,   235,   236,
+     236,   237,   237,   237,   237,   238,   238,   238,   238,   239,
+     239,   239,   239,   240,   240,   240,   241,   241,   241,   241,
+     242,   242,   242,   243,   243,   244,   244,   245,   244,   244,
+     244,   246,   246,   247,   247,   248,   248,   248,   248,   249,
+     249,   249,   249,   250,   250,   251,   251,   251,   251,   251,
+     252,   252,   253,   254,   255,   255,   256,   255,   257,   257,
+     258,   258,   259,   259,   260,   260,   260,   260,   260,   261,
+     261,   261,   261,   262,   262,   263,   263,   264,   264,   265,
+     265,   265,   265,   266,   266,   266,   266,   266,   267,   267,
+     267,   267,   267,   268,   268,   269,   269,   270,   270,   271,
+     271,   271,   272,   272,   272,   273,   273,   273,   274,   274,
+     274,   275,   275,   275,   275,   276,   276,   276,   277,   277,
+     278,   278,   278,   278,   278,   279,   279,   280,   280,   281,
+     281,   281,   281,   281,   281,   282,   282,   282,   282,   283,
+     283,   283,   284,   285,   285,   287,   286,   286,   288,   288,
+     288,   289,   289,   290,   290,   290,   291,   291,   291,   291,
+     292,   292,   292,   293,   293,   294,   294,   295,   296,   295,
+     297,   297,   298,   298,   299,   299,   299,   300,   300,   301,
+     301,   302,   302,   303,   303,   304,   304,   304,   305,   304,
+     304,   306,   306,   306,   307,   307,   307,   307,   307,   307,
+     307,   307,   307,   308,   308,   308,   309,   310,   310,   311,
+     311,   312,   312,   313,   314,   314,   315,   315,   315,   316,
+     316,   316,   316,   317,   317,   317,   317,   318,   318,   319,
+     319,   319,   320,   320,   320,   320,   321,   321,   322,   322,
+     322,   323,   323,   323,   324,   324,   324,   325,   325,   325,
+     326,   326,   326,   327,   327,   327,   328,   328,   328,   329,
+     329,   329,   330,   330,   330,   330,   331,   331,   332,   332,
+     332,   333,   333,   333,   333,   334,   334,   334,   335,   335,
+     335,   335,   336,   336,   336,   337,   337,   337,   337,   338,
+     338,   338,   339,   339,   339,   339,   340,   340,   341,   341,
+     341,   342,   342,   343,   343,   344,   344,   344,   345,   345,
+     345,   345,   345,   346,   346,   346,   346,   347,   347,   347,
+     348,   348,   348,   349,   349,   349,   349,   350,   350,   350,
+     351,   351,   351,   351,   351,   352,   352,   352,   352,   353,
+     353,   353,   354,   354,   354,   355,   355,   355,   355,   355,
+     355,   356,   356,   356,   357,   357,   357,   357,   357,   358,
+     358,   358,   358,   359,   359,   360,   360,   360,   361,   361,
+     362,   362,   362,   362,   362,   362,   363,   363,   363,   363,
+     363,   363,   363,   363,   363,   363,   364,   364,   364,   364,
+     365,   365,   365,   366,   366,   367,   367,   367,   367,   367,
+     367,   368,   368,   368,   368,   368,   368,   369,   370,   370,
+     370,   371,   371,   372,   372
 };
 
@@ -1343,47 +1347,47 @@
        1,     2,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     2,     2,     3,     3,     1,     3,
-       1,     2,     2,     2,     4,     4,     4,     4,     1,     2,
-       2,     3,     1,     2,     2,     1,     2,     2,     3,     1,
-       2,     2,     1,     1,     4,     2,     5,     7,     2,     2,
-       2,     1,     2,     2,     3,     2,     3,     1,     2,     3,
-       2,     2,     4,     0,     1,     2,     2,     1,     0,     1,
-       2,     2,     5,     6,     2,     2,     4,     0,     2,     0,
-       1,     1,     1,     5,     5,     5,     1,     5,     5,     9,
-       1,     5,     0,     1,     1,     5,     1,     1,     5,     5,
-       1,     3,     3,     4,     1,     1,     1,     1,     2,     1,
-       3,     3,     1,     2,     1,     3,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     2,     1,     1,
-       1,     2,     0,     2,     2,     1,     4,     0,     1,     2,
-       3,     4,     2,     2,     1,     2,     1,     2,     5,     5,
-       7,     6,     1,     2,     2,     3,     1,     2,     2,     4,
-       2,     4,     0,     4,     2,     1,     1,     1,     0,     2,
-       5,     5,    13,     1,     1,     3,     3,     2,     3,     3,
-       2,     4,     1,     6,     9,     0,    11,     1,     3,     3,
-       3,     1,     1,     5,     2,     5,     0,     1,     1,     3,
-       0,     1,     1,     1,     1,     0,     6,     2,     1,     2,
-       4,     2,     3,     3,     3,     4,     5,     5,     5,     6,
-       1,     1,     1,     3,     0,     5,     0,     1,     1,     2,
-       6,     1,     3,     0,     1,     4,     1,     1,     1,     1,
-       2,     1,     2,     2,     1,     3,     2,     3,     3,     2,
-       4,     4,     3,     8,     3,     2,     1,     2,     6,     8,
-       3,     2,     3,     3,     4,     4,     3,     1,     1,     1,
-       4,     6,     3,     2,     3,     3,     4,     4,     3,     2,
-       1,     2,     2,     1,     3,     2,     3,     3,     2,     4,
-       4,     3,     6,     8,     3,     2,     1,     2,     2,     2,
-       3,     3,     2,     4,     4,     3,     6,     8,     3,     2,
-       1,     2,     2,     1,     1,     2,     3,     3,     2,     4,
-       6,     8,     1,     2,     2,     1,     2,     2,     3,     3,
-       1,     4,     4,     3,     5,     8,     3,     2,     3,     1,
-       5,     5,     6,     6,     1,     2,     2,     1,     2,     2,
-       3,     3,     1,     4,     4,     3,     5,     8,     3,     1,
-       2,     1,     2,     6,     5,     6,     7,     7,     1,     2,
-       2,     1,     2,     2,     3,     3,     1,     4,     4,     3,
-       8,     3,     1,     1,     2,     1,     1,     2,     3,     2,
-       3,     2,     3,     3,     2,     4,     3,     2,     3,     2,
-       4,     3,     2,     6,     6,     6,     7,     1,     2,     1,
-       1,     1,     2,     3,     2,     3,     2,     3,     3,     4,
-       2,     3,     4,     2,     5,     5,     6,     6,     0,     1,
-       0,     2
+       1,     1,     1,     1,     1,     2,     2,     3,     3,     1,
+       3,     1,     2,     2,     2,     4,     4,     4,     4,     1,
+       2,     2,     3,     1,     2,     2,     1,     2,     2,     3,
+       1,     2,     2,     1,     1,     4,     2,     0,     6,     7,
+       2,     2,     2,     1,     2,     2,     3,     2,     3,     1,
+       2,     3,     2,     2,     4,     0,     1,     2,     2,     1,
+       0,     1,     2,     2,     5,     2,     0,     7,     2,     4,
+       0,     2,     0,     1,     1,     1,     5,     5,     5,     1,
+       5,     5,     9,     1,     5,     0,     1,     1,     5,     1,
+       1,     5,     5,     1,     3,     3,     4,     1,     1,     1,
+       1,     2,     1,     3,     3,     1,     2,     1,     3,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     1,     1,     1,     2,     0,     2,     2,     1,     4,
+       0,     1,     2,     3,     4,     2,     2,     1,     2,     1,
+       2,     5,     5,     7,     6,     1,     2,     2,     3,     1,
+       2,     2,     4,     2,     4,     0,     4,     2,     1,     1,
+       1,     0,     2,     5,     5,    13,     1,     1,     3,     3,
+       2,     3,     3,     2,     4,     1,     6,     9,     0,    11,
+       1,     3,     3,     3,     1,     1,     5,     2,     5,     0,
+       1,     1,     3,     0,     1,     1,     1,     1,     0,     6,
+       2,     1,     2,     4,     2,     3,     3,     3,     4,     5,
+       5,     5,     6,     1,     1,     1,     3,     0,     5,     0,
+       1,     1,     2,     6,     1,     3,     0,     1,     4,     1,
+       1,     1,     1,     2,     1,     2,     2,     1,     3,     2,
+       3,     3,     2,     4,     4,     3,     8,     3,     2,     1,
+       2,     6,     8,     3,     2,     3,     3,     4,     4,     3,
+       1,     1,     1,     4,     6,     3,     2,     3,     3,     4,
+       4,     3,     2,     1,     2,     2,     1,     3,     2,     3,
+       3,     2,     4,     4,     3,     6,     8,     3,     2,     1,
+       2,     2,     2,     3,     3,     2,     4,     4,     3,     6,
+       8,     3,     2,     1,     2,     2,     1,     1,     2,     3,
+       3,     2,     4,     6,     8,     1,     2,     2,     1,     2,
+       2,     3,     3,     1,     4,     4,     3,     5,     8,     3,
+       2,     3,     1,     5,     5,     6,     6,     1,     2,     2,
+       1,     2,     2,     3,     3,     1,     4,     4,     3,     5,
+       8,     3,     1,     2,     1,     2,     6,     5,     6,     7,
+       7,     1,     2,     2,     1,     2,     2,     3,     3,     1,
+       4,     4,     3,     8,     3,     1,     1,     2,     1,     1,
+       2,     3,     2,     3,     2,     3,     3,     2,     4,     3,
+       2,     3,     2,     4,     3,     2,     6,     6,     6,     7,
+       1,     2,     1,     1,     1,     2,     3,     2,     3,     2,
+       3,     3,     4,     2,     3,     4,     2,     5,     5,     6,
+       6,     0,     1,     0,     2
 };
 
@@ -1395,160 +1399,161 @@
      294,   294,   315,   313,   316,   314,   317,   318,   300,   302,
      301,     0,   303,   329,   321,   326,   324,   325,   323,   322,
-     327,   328,   330,   331,   332,   546,   546,   546,     0,     0,
-       0,   294,   220,   304,   319,   320,     7,   359,     0,     8,
-      14,    15,     0,     2,   294,   564,     9,   524,   522,   247,
-       3,   452,     3,   260,     0,     3,     3,     3,   248,     3,
-       0,     0,     0,   295,   296,   298,   294,   307,   310,   312,
-     340,   286,   333,   338,   287,   348,   288,   355,   352,   362,
-       0,     0,   363,   289,   472,   476,     3,     3,     0,     2,
-     518,   523,   528,   299,     0,     0,   546,   576,   546,     2,
-     587,   588,   589,   294,     0,   730,   731,     0,    12,   294,
-       0,    13,   270,   271,     0,   295,   290,   291,   292,   293,
-     525,   305,   391,   547,   548,   369,   370,    12,   443,   444,
-      11,   439,   442,     0,   502,   497,   488,   443,   444,     0,
-       0,   527,   221,     0,   294,     0,     0,     0,     0,     0,
-       0,     0,     0,   294,   294,     2,     0,   732,   295,   581,
-     593,   736,   729,   727,   734,     0,     0,     0,   254,     2,
-       0,   531,   437,   438,   436,     0,     0,     0,     0,   546,
-       0,   633,   634,     0,     0,   544,   540,   546,   561,   546,
-     546,   541,     2,   542,   546,   600,   546,   546,   603,     0,
-       0,     0,   294,   294,   313,   360,     2,   294,   261,   297,
-     308,   341,   353,   477,     0,     2,     0,   452,   262,   295,
-     334,   349,   356,   473,     0,     2,     0,   311,   335,   342,
-     343,     0,   350,   354,   357,   361,   444,   294,   294,   365,
-     368,     0,   394,   474,   478,     0,     0,     0,     1,   294,
-       2,   529,   575,   577,   294,     2,   740,   295,   743,   544,
-     544,   295,     0,     0,     0,   273,   546,   541,     2,   294,
-       0,     0,   294,   549,     2,   500,     2,   553,     0,     0,
-       0,     0,     0,     0,    18,    59,     4,     5,     6,    16,
-       0,     0,     0,   294,     2,     0,   294,    65,    66,    67,
-      68,    48,    19,    49,    22,    47,    69,     0,    72,    76,
-      79,    82,    87,    90,    92,    94,    96,    98,   100,   105,
-     494,   750,   450,   493,     0,   448,   449,     0,   565,   580,
-     583,   586,   592,   595,   598,   359,     0,     2,   738,     0,
-     294,   741,     2,   294,     3,   424,     0,   432,   295,   294,
-     307,   333,   287,   348,   355,     3,     3,   406,   410,   420,
-     425,   472,   294,   426,   705,   706,   294,   427,   429,   294,
-       2,   582,   594,   728,     2,     2,   249,     2,   457,     0,
-     455,   454,   453,   141,     2,     2,   251,     2,     2,   250,
-       2,   281,     2,   282,     0,   280,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   566,   605,     0,   452,     2,
-     560,   569,   659,   562,   563,   532,   294,     2,   599,   608,
-     601,   602,     0,   276,   294,   294,   339,   295,     0,   295,
-       0,   294,   733,   737,   735,   533,   294,   544,   255,   263,
-     309,     0,     2,   534,   294,   498,   336,   337,   283,   351,
-     358,     0,   294,     2,   383,   294,   371,     0,     0,   377,
-     727,   294,   748,   397,     0,   475,   499,   252,   253,   519,
-     294,   434,     0,   294,   237,     0,     2,   239,     0,   295,
-       0,   257,     2,   258,   278,     0,     0,     2,   294,   544,
-     294,   485,   487,   486,     0,     0,   750,     0,   294,     0,
-     294,   489,   294,   559,   557,   558,   556,     0,   551,   554,
-       0,     0,   294,    56,   294,    69,    52,   294,    62,   294,
-     294,    50,    51,    64,     2,   127,     0,     0,   446,     0,
-     445,   111,   294,    54,    55,    17,     0,    29,    30,    35,
-       2,     0,    35,   117,   118,   119,   120,   121,   122,   123,
-     124,   125,   126,     0,     0,    53,     0,     0,     0,     0,
+     327,   328,   333,   330,   331,   332,   549,   549,   549,     0,
+       0,     0,   294,   220,   304,   319,   320,     7,   360,     0,
+       8,    14,    15,     0,     2,   294,   567,     9,   527,   525,
+     247,     3,   455,     3,   260,     0,     3,     3,     3,   248,
+       3,     0,     0,     0,   295,   296,   298,   294,   307,   310,
+     312,   341,   286,   334,   339,   287,   349,   288,   356,   353,
+     363,     0,     0,   364,   289,   475,   479,     3,     3,     0,
+       2,   521,   526,   531,   299,     0,     0,   549,   579,   549,
+       2,   590,   591,   592,   294,     0,   733,   734,     0,    12,
+     294,     0,    13,   270,   271,     0,   295,   290,   291,   292,
+     293,   528,   305,   393,   550,   551,   371,   372,    12,   446,
+     447,    11,   442,   445,     0,   505,   500,   491,   446,   447,
+       0,     0,   530,   221,     0,   294,     0,     0,     0,     0,
+       0,     0,     0,     0,   294,   294,     2,     0,   735,   295,
+     584,   596,   739,   732,   730,   737,     0,     0,     0,   254,
+       2,     0,   534,   440,   441,   439,     0,     0,     0,     0,
+     549,     0,   636,   637,     0,     0,   547,   543,   549,   564,
+     549,   549,   544,     2,   545,   549,   603,   549,   549,   606,
+       0,     0,     0,   294,   294,   313,   361,     2,   294,   261,
+     297,   308,   342,   354,   480,     0,     2,     0,   455,   262,
+     295,   335,   350,   357,   476,     0,     2,     0,   311,   336,
+     343,   344,     0,   351,   355,   358,   362,   447,   294,   294,
+     366,   370,     0,   395,   477,   481,     0,     0,     0,     1,
+     294,     2,   532,   578,   580,   294,     2,   743,   295,   746,
+     547,   547,   295,     0,     0,     0,   273,   549,   544,     2,
+     294,     0,     0,   294,   552,     2,   503,     2,   556,     0,
+       0,     0,     0,     0,     0,    18,    59,     4,     5,     6,
+      16,     0,     0,     0,   294,     2,     0,   294,    65,    66,
+      67,    68,    48,    19,    49,    22,    47,    69,     0,    72,
+      76,    79,    82,    87,    90,    92,    94,    96,    98,   100,
+     105,   497,   753,   453,   496,     0,   451,   452,     0,   568,
+     583,   586,   589,   595,   598,   601,   360,     0,     2,   741,
+       0,   294,   744,     2,   294,     3,   427,     0,   435,   295,
+     294,   307,   334,   287,   349,   356,     3,     3,   409,   413,
+     423,   428,   475,   294,   429,   708,   709,   294,   430,   432,
+     294,     2,   585,   597,   731,     2,     2,   249,     2,   460,
+       0,   458,   457,   456,   141,     2,     2,   251,     2,     2,
+     250,     2,   281,     2,   282,     0,   280,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   569,   608,     0,   455,
+       2,   563,   572,   662,   565,   566,   535,   294,     2,   602,
+     611,   604,   605,     0,   276,   294,   294,   340,   295,     0,
+     295,     0,   294,   736,   740,   738,   536,   294,   547,   255,
+     263,   309,     0,     2,   537,   294,   501,   337,   338,   283,
+     352,   359,     0,   294,     2,   385,   294,   373,     0,     0,
+     379,   730,     0,   751,   400,     0,   478,   502,   252,   253,
+     522,   294,   437,     0,   294,   237,     0,     2,   239,     0,
+     295,     0,   257,     2,   258,   278,     0,     0,     2,   294,
+     547,   294,   488,   490,   489,     0,     0,   753,     0,   294,
+       0,   294,   492,   294,   562,   560,   561,   559,     0,   554,
+     557,     0,     0,   294,    56,   294,    69,    52,   294,    62,
+     294,   294,    50,    51,    64,     2,   127,     0,     0,   449,
+       0,   448,   111,   294,    54,    55,    17,     0,    29,    30,
+      35,     2,     0,    35,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,     0,     0,    53,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   108,     2,   645,   451,
-     642,   546,   546,   650,   479,   294,     2,   584,   585,     0,
-     596,   597,     0,     2,   739,   742,   111,   294,     2,   294,
-       0,   707,   295,   711,   702,   703,   709,     0,     2,     2,
-     667,   546,   750,   616,   546,   546,   750,   546,   630,   546,
-     546,   681,   433,   664,   546,   546,   672,   679,   294,   428,
-     295,     0,     0,   294,   717,   295,   722,   750,   714,   294,
-     719,   750,   294,   294,   294,     0,   111,     0,    18,     5,
-       2,     0,    19,     0,   458,   748,     0,     0,   464,   241,
-       0,   294,     0,     0,     0,   544,   568,   572,   574,   604,
-     607,   611,   614,   567,   606,     0,   284,   657,     0,   294,
-     277,     0,     0,     0,     0,   275,     2,     0,   259,   535,
-     294,     0,     0,     0,     0,   294,   294,     0,     0,   691,
-     381,   384,   388,   546,   388,   696,   387,   688,   546,   546,
-     364,   372,   380,   373,   546,   375,   378,   294,   749,     0,
-       0,   395,   748,   295,     3,   413,     3,   417,   416,   590,
-       0,   530,   294,     3,     3,   294,   432,   295,     3,   426,
-     427,     2,     0,     0,     0,   484,   306,   294,   480,   482,
-       3,     2,     2,     0,   501,     3,     0,   553,   129,     0,
-       0,   222,     0,     0,     0,     2,     0,     0,    36,     0,
-       0,   111,   294,    20,     0,    21,     0,   691,   447,     0,
-     109,     3,     2,    27,     2,     0,    33,     0,     2,    25,
-       0,   106,   107,    73,    74,    75,    77,    78,    80,    81,
-      85,    86,    83,    84,    88,    89,    91,    93,    95,    97,
-      99,     0,     0,   751,   294,     0,     0,     0,   646,   647,
-     643,   644,   496,   495,   294,     0,     3,   294,   713,   294,
-     718,   295,   294,   294,   294,   661,   704,   660,     2,   294,
-       0,     0,     0,     0,     0,     0,     0,     0,   682,     0,
-     668,   619,   635,   669,     2,   615,   622,   430,   617,   618,
-     431,     2,   629,   638,   631,   632,   665,   666,   680,   708,
-     712,   710,   750,   268,     2,   744,     2,   421,   716,   721,
-     422,     0,   400,     3,     3,     3,     3,   452,     3,     0,
-       2,   467,   463,   749,     0,   459,   466,     2,   462,   465,
-       0,   294,   242,   264,     3,   272,   274,     0,   452,     2,
-     570,   571,     2,   609,   610,     0,   658,   536,     3,   345,
-     344,   347,   346,   294,   537,     0,   538,   294,   374,   376,
-       2,     0,     0,     0,     0,   104,   390,   692,   693,   385,
-     389,   386,   689,   690,   379,   383,   366,   397,   392,   398,
-       0,     0,     0,   435,   240,     0,     0,     3,     2,   667,
-     428,     0,   526,     0,   750,   488,     0,   294,   294,   294,
-       0,   550,   552,   130,     0,     0,   215,     0,     0,     0,
-     223,   224,    57,     0,    63,   294,     0,    61,    60,     0,
-     128,   692,   457,    70,    71,   110,   115,     3,   109,     0,
-       0,     0,    24,    35,     3,     0,    32,   102,     0,     3,
-     649,   653,   656,   648,     3,   591,     3,   715,   720,     2,
-     294,     3,     3,   295,     0,     3,   621,   625,   628,   637,
-     671,   675,   678,   294,     3,   620,   636,   670,   294,   294,
-     423,   294,   294,   745,     0,     0,     0,     0,   256,     0,
-     104,     0,     3,     3,     0,   460,     0,   456,     0,     0,
-     245,   294,     0,     0,   129,     0,     0,     0,     0,     0,
-     129,     0,     0,   109,   109,     2,     0,     0,     0,     3,
-     131,   132,     2,   143,   133,   134,   135,   136,   137,   138,
-     145,   147,     0,     0,     0,   285,   294,   294,   546,     0,
-     539,   294,   111,   695,   699,   701,   694,   382,   396,   393,
-     578,     2,   663,   662,     0,   668,     2,   481,   483,   503,
-       3,   511,   512,     0,     2,   507,     3,     3,     0,     0,
-     555,   222,     0,     0,     0,   222,     0,     0,     3,    37,
-     748,   109,     0,     3,   660,    42,     3,    40,     3,    34,
-       0,     3,   101,   103,     0,     2,   651,   652,     0,     0,
-     294,     0,     0,     0,     3,   637,     0,     2,   623,   624,
-       2,   639,     2,   673,   674,     0,     0,     3,     0,     3,
-       3,     3,     3,   408,   407,   411,     2,     2,   747,   746,
-     112,     0,     0,     0,     0,     3,   461,     3,     0,   243,
-     146,     3,   295,   294,     0,     0,     0,     0,     2,   191,
-       0,   189,     0,     0,     0,     0,     0,     0,     0,     0,
-     111,     0,   546,   151,   148,   294,     0,     0,   267,   279,
-       3,     3,   545,   612,   367,     2,   697,   698,   294,   266,
-     294,     0,   514,   491,   294,     0,     0,   490,   505,     0,
-       0,     0,   216,     0,   225,    58,   109,     0,     0,   116,
-     113,     0,     0,     0,     0,     0,     0,    23,     0,   654,
-     294,   579,   265,   723,   724,   725,     0,   676,   294,   294,
-     294,     3,     3,     0,   684,     0,     0,     0,     0,   294,
-     294,     3,   543,   468,   469,     0,     0,   246,   295,     0,
-       0,     0,     0,   294,   192,   190,     0,   187,   193,     0,
-       0,     0,     0,   197,   200,   198,   194,     0,   195,    35,
-     129,   144,   142,   244,     0,     0,   294,   415,   419,   418,
-       0,   508,     2,   509,     2,   510,   504,   294,   228,     0,
-     226,     0,   228,     3,   660,    31,   114,     2,    45,     2,
-      43,    41,    28,   112,    26,     3,   726,     3,     3,     3,
-       0,     0,   683,   685,   626,   640,   269,     2,   405,     3,
-     404,     0,   471,   468,   129,     0,     0,   129,     3,     0,
-     129,   188,     0,     2,     2,   209,   199,     0,     0,     0,
-       0,   140,   573,   613,     3,     2,     0,     0,     2,   229,
-       0,     0,   217,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   686,   687,   294,     0,   470,   152,     0,     0,
-       2,   165,   129,   154,     0,   182,     0,   129,     0,     2,
-     156,     0,     2,     0,     2,     2,     2,   196,    32,     0,
-     294,   513,   515,   506,     0,     0,     0,     0,   114,    38,
-       3,     3,   655,   627,   641,   677,   409,   129,   158,   161,
-       0,   160,   164,     3,   167,   166,     0,   129,   184,   129,
-       3,     0,   294,     0,   294,     0,     2,     0,     2,   139,
-     700,     2,   230,   231,     0,   227,   218,     0,     0,     0,
-     153,     0,     0,   163,   233,   168,     2,   235,   183,     0,
-     186,   172,   201,     3,   210,   214,   203,     3,     0,   294,
-       0,   294,     0,     0,     0,    39,    46,    44,   159,   162,
-     129,     0,   169,   294,   129,   129,     0,   173,     0,     0,
-     691,   211,   212,   213,     0,   202,     3,   204,     3,   294,
-     219,   232,   149,   170,   155,   129,   236,   185,   180,   178,
-     174,   157,   129,     0,   692,     0,     0,     0,     0,   150,
-     171,   181,   175,   179,   178,   176,     3,     3,     0,     0,
-     492,   177,   205,   207,     3,     3,   206,   208
+       0,     0,     0,     0,     0,     0,     0,   108,     2,   648,
+     454,   645,   549,   549,   653,   482,   294,     2,   587,   588,
+       0,   599,   600,     0,     2,   742,   745,   111,   294,     2,
+     294,     0,   710,   295,   714,   705,   706,   712,     0,     2,
+       2,   670,   549,   753,   619,   549,   549,   753,   549,   633,
+     549,   549,   684,   436,   667,   549,   549,   675,   682,   294,
+     431,   295,     0,     0,   294,   720,   295,   725,   753,   717,
+     294,   722,   753,   294,   294,   294,     0,   111,     0,    18,
+       5,     2,     0,    19,     0,   461,   751,     0,     0,   467,
+     241,     0,   294,     0,     0,     0,   547,   571,   575,   577,
+     607,   610,   614,   617,   570,   609,     0,   284,   660,     0,
+     294,   277,     0,     0,     0,     0,   275,     2,     0,   259,
+     538,   294,     0,     0,     0,     0,   294,   294,     0,     0,
+     694,   383,   386,   390,   549,   390,   699,   389,   691,   549,
+     549,   365,   374,   382,   375,   549,   377,   380,   294,   752,
+       0,     0,   398,     0,   295,     3,   416,     3,   420,   419,
+     593,     0,   533,   294,     3,     3,   294,   435,   295,     3,
+     429,   430,     2,     0,     0,     0,   487,   306,   294,   483,
+     485,     3,     2,     2,     0,   504,     3,     0,   556,   129,
+       0,     0,   222,     0,     0,     0,     2,     0,     0,    36,
+       0,     0,   111,   294,    20,     0,    21,     0,   694,   450,
+       0,   109,     3,     2,    27,     2,     0,    33,     0,     2,
+      25,     0,   106,   107,    73,    74,    75,    77,    78,    80,
+      81,    85,    86,    83,    84,    88,    89,    91,    93,    95,
+      97,    99,     0,     0,   754,   294,     0,     0,     0,   649,
+     650,   646,   647,   499,   498,   294,     0,     3,   294,   716,
+     294,   721,   295,   294,   294,   294,   664,   707,   663,     2,
+     294,     0,     0,     0,     0,     0,     0,     0,     0,   685,
+       0,   671,   622,   638,   672,     2,   618,   625,   433,   620,
+     621,   434,     2,   632,   641,   634,   635,   668,   669,   683,
+     711,   715,   713,   753,   268,     2,   747,     2,   424,   719,
+     724,   425,     0,   403,     3,     3,     3,     3,   455,     3,
+       0,     2,   470,   466,   752,     0,   462,   469,     2,   465,
+     468,     0,   294,   242,   264,     3,   272,   274,     0,   455,
+       2,   573,   574,     2,   612,   613,     0,   661,   539,     3,
+     346,   345,   348,   347,   294,   540,     0,   541,   294,   376,
+     378,     2,     0,     0,     0,     0,   104,   392,   695,   696,
+     387,   391,   388,   692,   693,   381,   385,   294,   400,   394,
+     401,   751,     0,     0,   438,   240,     0,     0,     3,     2,
+     670,   431,     0,   529,     0,   753,   491,     0,   294,   294,
+     294,     0,   553,   555,   130,     0,     0,   215,     0,     0,
+       0,   223,   224,    57,     0,    63,   294,     0,    61,    60,
+       0,   128,   695,   460,    70,    71,   110,   115,     3,   109,
+       0,     0,     0,    24,    35,     3,     0,    32,   102,     0,
+       3,   652,   656,   659,   651,     3,   594,     3,   718,   723,
+       2,   294,     3,     3,   295,     0,     3,   624,   628,   631,
+     640,   674,   678,   681,   294,     3,   623,   639,   673,   294,
+     294,   426,   294,   294,   748,     0,     0,     0,     0,   256,
+       0,   104,     0,     3,     3,     0,   463,     0,   459,     0,
+       0,   245,   294,     0,     0,   129,     0,     0,     0,     0,
+       0,   129,     0,     0,   109,   109,     2,     0,     0,     0,
+       3,   131,   132,     2,   143,   133,   134,   135,   136,   137,
+     138,   145,   147,     0,     0,     0,   285,   294,   294,   549,
+       0,   542,   294,   111,   698,   702,   704,   697,   384,   368,
+     399,     0,   581,     2,   666,   665,     0,   671,     2,   484,
+     486,   506,     3,   514,   515,     0,     2,   510,     3,     3,
+       0,     0,   558,   222,     0,     0,     0,   222,     0,     0,
+       3,    37,   751,   109,     0,     3,   663,    42,     3,    40,
+       3,    34,     0,     3,   101,   103,     0,     2,   654,   655,
+       0,     0,   294,     0,     0,     0,     3,   640,     0,     2,
+     626,   627,     2,   642,     2,   676,   677,     0,     0,     3,
+       0,     3,     3,     3,     3,   411,   410,   414,     2,     2,
+     750,   749,   112,     0,     0,     0,     0,     3,   464,     3,
+       0,   243,   146,     3,   295,   294,     0,     0,     0,     0,
+       2,   191,     0,   189,     0,     0,     0,     0,     0,     0,
+       0,     0,   111,     0,   549,   151,   148,   294,     0,     0,
+     267,   279,     3,     3,   548,   615,   369,     2,   700,   701,
+     397,   294,   266,   294,     0,   517,   494,   294,     0,     0,
+     493,   508,     0,     0,     0,   216,     0,   225,    58,   109,
+       0,     0,   116,   113,     0,     0,     0,     0,     0,     0,
+      23,     0,   657,   294,   582,   265,   726,   727,   728,     0,
+     679,   294,   294,   294,     3,     3,     0,   687,     0,     0,
+       0,     0,   294,   294,     3,   546,   471,   472,     0,     0,
+     246,   295,     0,     0,     0,     0,   294,   192,   190,     0,
+     187,   193,     0,     0,     0,     0,   197,   200,   198,   194,
+       0,   195,    35,   129,   144,   142,   244,     0,     0,   294,
+     418,   422,   421,     0,   511,     2,   512,     2,   513,   507,
+     294,   228,     0,   226,     0,   228,     3,   663,    31,   114,
+       2,    45,     2,    43,    41,    28,   112,    26,     3,   729,
+       3,     3,     3,     0,     0,   686,   688,   629,   643,   269,
+       2,   408,     3,   407,     0,   474,   471,   129,     0,     0,
+     129,     3,     0,   129,   188,     0,     2,     2,   209,   199,
+       0,     0,     0,     0,   140,   576,   616,     3,     2,     0,
+       0,     2,   229,     0,     0,   217,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   689,   690,   294,     0,   473,
+     152,     0,     0,     2,   165,   129,   154,     0,   182,     0,
+     129,     0,     2,   156,     0,     2,     0,     2,     2,     2,
+     196,    32,     0,   294,   516,   518,   509,     0,     0,     0,
+       0,   114,    38,     3,     3,   658,   630,   644,   680,   412,
+     129,   158,   161,     0,   160,   164,     3,   167,   166,     0,
+     129,   184,   129,     3,     0,   294,     0,   294,     0,     2,
+       0,     2,   139,   703,     2,   230,   231,     0,   227,   218,
+       0,     0,     0,   153,     0,     0,   163,   233,   168,     2,
+     235,   183,     0,   186,   172,   201,     3,   210,   214,   203,
+       3,     0,   294,     0,   294,     0,     0,     0,    39,    46,
+      44,   159,   162,   129,     0,   169,   294,   129,   129,     0,
+     173,     0,     0,   694,   211,   212,   213,     0,   202,     3,
+     204,     3,   294,   219,   232,   149,   170,   155,   129,   236,
+     185,   180,   178,   174,   157,   129,     0,   695,     0,     0,
+       0,     0,   150,   171,   181,   175,   179,   178,   176,     3,
+       3,     0,     0,   495,   177,   205,   207,     3,     3,   206,
+     208
 };
 
@@ -1556,193 +1561,194 @@
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   839,   474,   301,    45,   131,   132,   302,   303,   304,
-     305,   785,   786,  1146,  1147,   306,   307,   308,   309,   310,
-     311,   312,   313,   314,   315,   316,   317,   318,   319,  1051,
-     525,   996,   321,   997,   554,   973,  1078,  1542,  1080,  1081,
-    1082,  1083,  1543,  1084,  1085,  1459,  1460,  1421,  1422,  1423,
-    1521,  1522,  1526,  1527,  1562,  1563,  1086,  1379,  1087,  1088,
-    1313,  1314,  1315,  1503,  1089,   143,   979,   980,   981,  1400,
-    1484,  1495,  1496,   475,   476,   901,   902,  1059,    48,    49,
-      50,    51,    52,   345,   156,    55,    56,    57,    58,    59,
-     347,    61,    62,   261,    64,    65,   272,   349,   350,    68,
-      69,    70,    71,   116,    73,   202,   352,   117,    76,   118,
-      78,    79,    80,   455,   456,   457,   458,   700,   939,   701,
-      81,    82,   462,   721,   881,   882,   355,   356,   724,   725,
-     726,   357,   358,   359,   360,   472,   339,   133,   134,   529,
-     323,   168,   654,   655,   656,   657,   658,    83,   119,    85,
-     495,   496,   965,   497,   275,   501,   324,    86,   135,   136,
-      87,  1337,  1124,  1125,  1126,  1127,    88,    89,   742,    90,
-     271,    91,    92,   185,  1053,   688,   410,   123,    93,   507,
-     508,   509,   186,   266,   188,   189,   190,   267,    96,    97,
-      98,    99,   100,   101,   102,   193,   194,   195,   196,   197,
-     851,   613,   614,   615,   616,   198,   618,   619,   620,   579,
-     580,   581,   582,   705,   103,   622,   623,   624,   625,   626,
-     627,   938,   707,   708,   709,   603,   363,   364,   365,   366,
-     325,   162,   105,   106,   107,   368,   719,   576
+      -1,   840,   475,   302,    46,   132,   133,   303,   304,   305,
+     306,   786,   787,  1148,  1149,   307,   308,   309,   310,   311,
+     312,   313,   314,   315,   316,   317,   318,   319,   320,  1052,
+     526,   997,   322,   998,   555,   974,  1079,  1545,  1081,  1082,
+    1083,  1084,  1546,  1085,  1086,  1462,  1463,  1424,  1425,  1426,
+    1524,  1525,  1529,  1530,  1565,  1566,  1087,  1382,  1088,  1089,
+    1316,  1317,  1318,  1506,  1090,   144,   980,   981,   982,  1403,
+    1487,  1498,  1499,   476,   477,   902,   903,  1060,    49,    50,
+      51,    52,    53,   346,   157,    56,    57,    58,    59,    60,
+     348,    62,    63,   262,    65,    66,   273,   350,   351,    69,
+      70,    71,    72,   117,    74,   203,   353,   118,    77,   119,
+      79,    80,   462,    81,   456,   457,   458,   459,   701,   940,
+     702,    82,    83,   465,   463,   722,   882,   883,   356,   357,
+     725,   726,   727,   358,   359,   360,   361,   473,   340,   134,
+     135,   530,   324,   169,   655,   656,   657,   658,   659,    84,
+     120,    86,   496,   497,   966,   498,   276,   502,   325,    87,
+     136,   137,    88,  1340,  1126,  1127,  1128,  1129,    89,    90,
+     743,    91,   272,    92,    93,   186,  1054,   689,   411,   124,
+      94,   508,   509,   510,   187,   267,   189,   190,   191,   268,
+      97,    98,    99,   100,   101,   102,   103,   194,   195,   196,
+     197,   198,   852,   614,   615,   616,   617,   199,   619,   620,
+     621,   580,   581,   582,   583,   706,   104,   623,   624,   625,
+     626,   627,   628,   939,   708,   709,   710,   604,   364,   365,
+     366,   367,   326,   163,   106,   107,   108,   369,   720,   577
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -1281
+#define YYPACT_NINF -1332
 static const yytype_int16 yypact[] =
 {
-    3705,  8889, -1281,   104, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281,    44, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281, -1281, -1281, -1281,   155,   155,   155,  1205,   815,
-     110,  6006,   222, -1281, -1281, -1281, -1281, -1281,   130, -1281,
-   -1281, -1281,  1267,   189,  3199, -1281, -1281, -1281, -1281, -1281,
-   -1281,    31,   144, -1281,  1338, -1281, -1281, -1281, -1281,   153,
-    1410,   279,    82,  7674, -1281, -1281,  8086,  1234, -1281, -1281,
-   -1281,   981,   359,  7231,   925,   669,   981,  1012, -1281, -1281,
-     738,   575, -1281,   981,  1119, -1281,   242, -1281,   416,   419,
-   -1281, -1281, -1281, -1281,   277,   144,   155, -1281,   155, -1281,
-   -1281, -1281, -1281,  9536,  1338, -1281, -1281,  1338, -1281,  9574,
-     321, -1281, -1281, -1281,  2195,  9607, -1281,   565,   565,   565,
-   -1281, -1281, -1281,   155, -1281, -1281, -1281,   280,   366,   418,
-   -1281, -1281, -1281,   425, -1281, -1281, -1281, -1281, -1281,   443,
-     475, -1281, -1281,   120,  8972,  3739,   375,   387,   486,   496,
-     514,   527,   541,  8273,  7081,   550,   568, -1281,  9460, -1281,
-   -1281, -1281, -1281,   602, -1281,   121,  4456,  4456, -1281,   552,
-     298, -1281, -1281, -1281, -1281,   634,   302,   306,   327,   155,
-     590, -1281, -1281,  1410,  2454,   696, -1281,    90, -1281,   155,
-     155,   144, -1281, -1281,   124, -1281,   155,   155, -1281,  2638,
-     658,   667,   565,  6993, -1281, -1281,   678,  3199, -1281, -1281,
-     981, -1281, -1281, -1281,   144, -1281,  1338,    31, -1281,  8010,
-   -1281,   565,   565,   565,   144, -1281,  1205, -1281,  5198, -1281,
-   -1281,   673,   565, -1281,   565, -1281,   130,  8972,  9002,   686,
-   -1281,   815,   694,   565, -1281,  1205,   728,   736, -1281,  6006,
-     544, -1281, -1281, -1281,  9431, -1281, -1281,  3957, -1281,   696,
-      79,  9607,  6464,  2195,  2638, -1281,   157, -1281, -1281,  9574,
-    1338,   717,  7703, -1281, -1281,   699, -1281, 10744,   783,   831,
-    3925,   787,  6306, 10567, -1281,   827, -1281, -1281, -1281, -1281,
-   10625, 10625,   544,  8633,   829,  6306,  9085, -1281, -1281, -1281,
-   -1281, -1281, -1281,   862, -1281,  1121,  2197,  6306, -1281,   599,
-     388,   472,   354,   593,   830,   867,   873,   970,   245, -1281,
-   -1281,   874,   650, -1281,   325, -1281, -1281,  3739, -1281, -1281,
-     585,   901, -1281,   747,   901,   958,   130, -1281, -1281,   962,
-    9536, -1281,   977,  8746, -1281, -1281,   957,   935,  8355,  6993,
-     981, -1281,   981,   565,   565, -1281, -1281, -1281, -1281, -1281,
-   -1281,   565,  9645,  1338, -1281, -1281,  9683,  1067, -1281,  9123,
-   -1281, -1281, -1281, -1281, -1281, -1281, -1281,   990,  5315,  6306,
-   -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281, -1281, -1281,  2195, -1281,   846,   996,   998,  1002,
-     864,  1005,  1008,  1026,  2454, -1281, -1281,  1031,    31,  1033,
-   -1281, -1281,  1061, -1281, -1281, -1281,  9431, -1281, -1281, -1281,
-   -1281, -1281,  2638, -1281,  8972,  8972, -1281,   565,  2195,  7112,
-    1338,  8426, -1281, -1281, -1281, -1281,  9431,    79, -1281, -1281,
-     981,   144, -1281, -1281,  9431, -1281,  6877, -1281, -1281,   565,
-     565,   376,  9716,  1035,  1868,  2111, -1281,   334,   338,   815,
-   -1281,  9002,  1059,  1047,   815,   565, -1281, -1281, -1281, -1281,
-    9940, -1281,   583,  6755, -1281,   144,  1065, -1281,  2195, 10825,
-   10471, -1281, -1281, -1281, -1281,   889,  2638, -1281,  8497,   696,
-    7558, -1281, -1281, -1281,  1286,   636,   874,   815,  7703,   868,
-    9574, -1281,  7703, -1281, -1281, -1281, -1281,   638, -1281,  1073,
-     831,   207,  8633, -1281,  9716, -1281, -1281,  8633, -1281,  8859,
-    8633, -1281, -1281, -1281,  1071, -1281,   681,  1077,   668,  1078,
-   -1281,  4381,  6724, -1281, -1281, -1281,   328, -1281, -1281, 10490,
-   -1281,   385, 10490, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281, -1281,  6464,  6464, -1281,  6306,  6306,  6306,  6306,
-    6306,  6306,  6306,  6306,  6306,  6306,  6306,  6306,  6306,  6306,
-    6306,  6306,  6306,  6306,  4789,  6464, -1281,   650,  1062, -1281,
-   -1281,   155,   155, -1281, -1281,  8972, -1281, -1281,  1061,   544,
-   -1281,  1061, 10548, -1281, -1281, -1281,  5232,  6724,  1079,  9198,
-    1080, -1281,  9754, -1281, -1281,   602, -1281,  1082,  1185,  1084,
-    1899,   185,   874, -1281,   155,   155,   874,   233, -1281,   155,
-     155,  1061, -1281, -1281,   155,   155, -1281,   901,  9792,  1338,
-   10968,   234,   509,  9792, -1281,  5821, -1281,   874, -1281,  9645,
-   -1281,   293,  5525,  5525,  5525,  1338, -1281,  5054,  1072,   558,
-     990,  1016,  1083,  1086, -1281,  1074,  4456,   592, -1281,  1172,
-    1338,  5525,   544,  2195,   544,   696,   809,   901, -1281, -1281,
-     814,   901, -1281, -1281, -1281,   831, -1281,   901,   144,  9940,
-   -1281,   682,  1095,   691,  1099, -1281,  1098,   144, -1281, -1281,
-    9431,   144,  1103,   362,   407,  9825,  7200,  1999,  6306,  1917,
-   -1281, -1281,  1101,    94,  1101, -1281, -1281, -1281,   155,   155,
-   -1281, -1281,   815, -1281,   155, -1281, -1281,  3122,   815,  1107,
-    6306, -1281,  1059, 10968, -1281, -1281,  1102, -1281, -1281, -1281,
-     544, -1281, 10897,  6306, -1281,  5525,   675,  8355, -1281, -1281,
-     602,  1108,  1109,  1286,  3745, -1281, -1281,  7703, -1281, -1281,
-    1111, -1281, -1281,  1116, -1281,  1111,  1128, 10744,  6464,   146,
-    1113,    53,  1136,  1115,  1137,   829,  1131,  1139, -1281,  1142,
-    1143,  1696,  6843, -1281,  6464, -1281,   668,  1691, -1281,  6022,
-    6464,  1138, -1281, -1281,   990,   708, -1281,  6464, -1281, -1281,
-     727, -1281, -1281, -1281, -1281, -1281,   599,   599,   388,   388,
-     472,   472,   472,   472,   354,   354,   593,   830,   867,   873,
-     970,  6306,   755, -1281,  9940,  1148,  1149,  1152,  1062, -1281,
-   -1281, -1281, -1281, -1281,  9940,   713,  6306,  5525, -1281,  9645,
-   -1281,  7319,  9311,  9236,  7081, -1281, -1281, -1281,  1185,  9940,
-     951,  1160,  1163,  1165,  1166,  1175,  1176,  1182, -1281,  3532,
-    1899, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281,  1061, -1281,
-   -1281, -1281,   874, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281,  1183, -1281,  1187,  1189, -1281, -1281,    31,  1138,  5054,
-   -1281, -1281, -1281,  5315,  1180, -1281, -1281, -1281, -1281, -1281,
-     815,  6243,  1272, -1281, -1281, -1281, -1281,  1188,    31, -1281,
-   -1281,  1061, -1281, -1281,  1061,    70,  1061, -1281, -1281, -1281,
-   -1281, -1281, -1281,  9498, -1281,   144, -1281,  9002, -1281, -1281,
-    1201,   818,  1208,  1212,  1213, -1281, -1281,  1917, -1281, -1281,
-   -1281, -1281, -1281, -1281, -1281,  1868, -1281,  1047, -1281, -1281,
-    1210,  1216,  1211, -1281, -1281,  1218,  1223, -1281,   675,  1777,
-   -1281,   562, -1281,  3745,   874, -1281,  1226,  7703,  9863,  8972,
-    1230, -1281, -1281,  1225,  1235,  1238, -1281,  6306,   252,    40,
-    1231, -1281,  1242,   544,  1242,  6724,  6464, -1281, -1281,  1242,
-   -1281,  1691,  5315, -1281, -1281, -1281, -1281,  1236,  6464,  1245,
-     544,  5054, -1281, 10490, -1281,   544, -1281, -1281,  6464, -1281,
-     850,   901, -1281, -1281, -1281, -1281, -1281, -1281, -1281,   990,
-    8746, -1281, -1281,  7438,  1249, -1281,   856,   901, -1281,   872,
-     904,   901, -1281,   565,  4646, -1281, -1281, -1281,  9940,  9940,
-   -1281,  8426,  8426, -1281,  1252,  1255,  1264,  1271, -1281,  1253,
-     594,   247,  1138, -1281,   544, -1281,  4456, -1281,  6464,   459,
-   -1281,  6603,  1274,  1279, 10343,  1281,  1283,   301,   308,   344,
-    6464,  1285,   144,  6464,  6464,  1284,   498,  1282,  1268, -1281,
-   -1281, -1281,  1289, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281,   815,  1296,  6464, -1281,  9940,  9940,   155,  1301,
-   -1281,  9349,  4935,   934,   901, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281, -1281, -1281,  1305,  1777, -1281, -1281,  1290, -1281,
-    1111, -1281, -1281,  2195,  1309, -1281, -1281, -1281,   734,  1312,
-   -1281,    53,  1317,  6306,  1303,    53,    53,  1327,  1323, -1281,
-    1074,  6464,  1328,  1236,  1036,   113,  1326, -1281,  1323, -1281,
-    1331,  1326, -1281, -1281,  1337, -1281, -1281,  1061,  1340,  1343,
-    6962,  1342,  1344,  1350, -1281, -1281,  1353, -1281, -1281,  1061,
-   -1281, -1281, -1281, -1281,  1061,  6464,  6464,  6306,  1355, -1281,
-   -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281,
-   -1281,  6306,  6306,  1356,  1357,  1326, -1281, -1281,   815, -1281,
-   -1281, -1281,  7939,  9863,  6464,  6464,  1423,  6464, -1281, -1281,
-    1341, -1281,  1345,  6464,  1347,  1358,  6464,  1097,  1360,    74,
-    8776,  1197,   155, -1281, -1281,  6243,  1361,   467, -1281, -1281,
-   -1281, -1281, -1281, -1281, -1281, -1281, -1281,  1061, 10467, -1281,
-    8497,  1362, -1281, -1281,  9863,   482,   494, -1281,  1372,  1383,
-     831,  1394, -1281,    66, -1281, -1281,  6464,  1395,  1393, -1281,
-   -1281,  1399,   430,   657,   544,  1400,  1401, -1281,  1406, -1281,
-    9940, -1281, -1281, -1281, -1281, -1281,  1412, -1281,  9940,  9940,
-    9940, -1281, -1281,  1413, -1281,  1415,  1425,  1427,   623,  8125,
-    8240, -1281, -1281,   278, -1281,  1426,  1429, -1281,  8568,   745,
-     759,  1430,   769,  6445, -1281, -1281,   502, -1281, -1281,   770,
-    1434,  1436,   144,  1487,   911, -1281, -1281,  6464, -1281, 10490,
-   10343, -1281, -1281, -1281,  1442,  1444,  9940, -1281, -1281, -1281,
-    1437, -1281, -1281, -1281, -1281, -1281, -1281,  9863,   831,   269,
-   -1281,  1424,   831,  1236,   373, -1281, -1281, -1281, -1281, -1281,
-   -1281, -1281, -1281,  1443, -1281, -1281, -1281, -1281, -1281, -1281,
-    1452,  1454, -1281, -1281, -1281, -1281, -1281, -1281, -1281,  1458,
-   -1281,  1457, -1281, -1281, 10343,   148,  6464, 10343, -1281,  1462,
-    6464, -1281,   171,  1484,  1486, -1281, -1281,  1465,  1476,  1455,
-     905, -1281, -1281, -1281, -1281, -1281,  1338,  2195,  1471,   862,
-     918,  6306, -1281,   772,  1477,  6464,   544,   544,  1480,  1482,
-    1483,  1485, -1281, -1281,  8426,  1472, -1281,  1555,  6306,  1493,
-   -1281, -1281, 10254, -1281,   790, -1281,  1467, 10343,  1468, -1281,
-   -1281,  1511, -1281,  1513, -1281,  1507,  1529, -1281,  1496,  1519,
-    9863, -1281, -1281, -1281,   831,   544,  1520,  1499,  1515, -1281,
-    1326,  1326, -1281, -1281, -1281, -1281, -1281, 10343,   258, -1281,
-     922, -1281, -1281,  7790, -1281, -1281,  1501,  6464, -1281,  6464,
-    7790,   144,  9716,   144,  9716,  1528, -1281,  1530, -1281, -1281,
-   -1281,  1524,   862, -1281,   794, -1281, -1281,  6464,  1540,  1542,
-   -1281,  6306,  6306, -1281, -1281,  1051,   133, -1281, -1281,  1510,
-   -1281,  1051, -1281, -1281,  2099,   544, -1281, -1281,   144,  9716,
-     144,  9716,  1546,  1525,   544, -1281, -1281, -1281, -1281, -1281,
-   10254,  1541,  1051,  7866,  6464, 10165,  1543,  1051,  1551,  2099,
-    2338, -1281, -1281, -1281,  1552, -1281, -1281, -1281, -1281,  8972,
-   -1281, -1281, -1281, 10072, -1281, 10254, -1281, -1281,  1531,  9979,
-   -1281, -1281, 10165,   144,  2338,   144,  1557,  1559,   795, -1281,
-   10072, -1281, -1281, -1281,  9979, -1281, -1281, -1281,   144,   144,
-   -1281, -1281, -1281, -1281, -1281, -1281, -1281, -1281
+    3506,  8076, -1332,    12, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332,    61, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332, -1332, -1332, -1332, -1332,   102,   102,   102,  1011,
+    1062,    86,  5961,   228, -1332, -1332, -1332, -1332, -1332,   138,
+   -1332, -1332, -1332,   684,   144,  9470, -1332, -1332, -1332, -1332,
+   -1332, -1332,   190,   182, -1332,  1658, -1332, -1332, -1332, -1332,
+     201,  1834,   303,    32,  4928, -1332, -1332,  9508,  1650, -1332,
+   -1332, -1332,   615,   401,  4443,   184,   589,   615,  1225, -1332,
+   -1332,   848,   938, -1332,   615,  1259, -1332,   301, -1332,   486,
+     503, -1332, -1332, -1332, -1332,   316,   182,   102, -1332,   102,
+   -1332, -1332, -1332, -1332,  9240,  1658, -1332, -1332,  1658, -1332,
+    9354,   391, -1332, -1332, -1332,  1948,  9876, -1332,   810,   810,
+     810, -1332, -1332, -1332,   102, -1332, -1332, -1332,   426,   447,
+     456, -1332, -1332, -1332,   477, -1332, -1332, -1332, -1332, -1332,
+     485,   495, -1332, -1332,    36,  8974,  2459,   272,   545,   579,
+     623,   632,   671,   733,  8777,  7372,   596,   719, -1332,  9546,
+   -1332, -1332, -1332, -1332,   739, -1332,   209,  3245,  3245, -1332,
+     760,   213, -1332, -1332, -1332, -1332,   770,   237,   353,   362,
+     102,   755, -1332, -1332,  1834,  1803,   846, -1332,    70, -1332,
+     102,   102,   182, -1332, -1332,    98, -1332,   102,   102, -1332,
+    2479,   820,   843,   810,  5405, -1332, -1332,   844,  9470, -1332,
+   -1332,   615, -1332, -1332, -1332,   182, -1332,  1658,   190, -1332,
+    7926, -1332,   810,   810,   810,   182, -1332,  1011, -1332,  2880,
+   -1332, -1332,   827,   810, -1332,   810, -1332,   138,  8974,  8891,
+     857, -1332,  1062,   864,   810, -1332,  1011,   870,   879, -1332,
+    5961,   735, -1332, -1332, -1332,  9437, -1332, -1332,  3894, -1332,
+     846,    69,  9876,  6310,  1948,  2479, -1332,   114, -1332, -1332,
+    9354,  1658,   875, 11374, -1332, -1332,   546, -1332, 11116,   886,
+     926, 10861,   905, 10919, 10938, -1332,   919, -1332, -1332, -1332,
+   -1332, 10996, 10996,   735,  8632,   928, 10919,  9088, -1332, -1332,
+   -1332, -1332, -1332, -1332,   949, -1332,   840,  2531, 10919, -1332,
+     516,   336,   425,   270,   704,   934,   936,   960,   997,    52,
+   -1332, -1332,   974,   356, -1332,   290, -1332, -1332,  2459, -1332,
+   -1332,   600,   996, -1332,   701,   996,  1007,   138, -1332, -1332,
+    1010,  9240, -1332,  1018,  8746, -1332, -1332,  1849,  1084,  8347,
+    5405,   615, -1332,   615,   810,   810, -1332, -1332, -1332, -1332,
+   -1332, -1332,   810,  9914,  1658, -1332, -1332,  9987,  1975, -1332,
+    9012, -1332, -1332, -1332, -1332, -1332, -1332, -1332,  1030,  3059,
+   10919, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332, -1332, -1332, -1332,  1948, -1332,   773,  1012,  1034,
+    1040,   889,  1045,  1051,  1053,  1803, -1332, -1332,  1063,   190,
+    1064, -1332, -1332,  1066, -1332, -1332, -1332,  9437, -1332, -1332,
+   -1332, -1332, -1332,  2479, -1332,  8974,  8974, -1332,   810,  1948,
+    6923,  1658,  8420, -1332, -1332, -1332, -1332,  9437,    69, -1332,
+   -1332,   615,   182, -1332, -1332,  9437, -1332,  3625, -1332, -1332,
+     810,   810,   464, 10025,  1068,   907,  9695, -1332,   437,   475,
+    1062, -1332,  1067,  1069,  1047,  1070,   810, -1332, -1332, -1332,
+   -1332, 10283, -1332,   522,  6793, -1332,   182,  1074, -1332,  1948,
+   11198,  6368, -1332, -1332, -1332, -1332,   939,  2479, -1332,  8493,
+     846,  5374, -1332, -1332, -1332,   828,   610,   974,  1062, 11374,
+     861,  9354, -1332, 11374, -1332, -1332, -1332, -1332,   618, -1332,
+    1073,   926,   326,  8632, -1332, 10025, -1332, -1332,  8632, -1332,
+    8860,  8632, -1332, -1332, -1332,  1077, -1332,   619,  1082,   630,
+    1087, -1332,  5066,  7012, -1332, -1332, -1332,    47, -1332, -1332,
+   10784, -1332,   474, 10784, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332, -1332, -1332,  6310,  6310, -1332, 10919, 10919, 10919,
+   10919, 10919, 10919, 10919, 10919, 10919, 10919, 10919, 10919, 10919,
+   10919, 10919, 10919, 10919, 10919,  4001,  6310, -1332,   356,   777,
+   -1332, -1332,   102,   102, -1332, -1332,  8974, -1332, -1332,  1066,
+     735, -1332,  1066, 10842, -1332, -1332, -1332,  6075,  7012,  1086,
+    9202,  1093, -1332, 10055, -1332, -1332,   739, -1332,  1094,   690,
+    1096,  1090,   157,   974, -1332,   102,   102,   974,   166, -1332,
+     102,   102,  1066, -1332, -1332,   102,   102, -1332,   996, 10137,
+    1658, 11343,   372,   531, 10137, -1332,  6678, -1332,   974, -1332,
+    9914, -1332,   285,  8042,  8042,  8042,  1658, -1332,  5183,  1085,
+     453,  1030,   955,  1095,  1097, -1332,  1099,  3245,   590, -1332,
+    1182,  1658,  8042,   735,  1948,   735,   846,   706,   996, -1332,
+   -1332,   806,   996, -1332, -1332, -1332,   926, -1332,   996,   182,
+   10283, -1332,   647,  1107,   688,  1108, -1332,  1109,   182, -1332,
+   -1332,  9437,   182,  1105,   497,   502, 10167,  7492,  1400, 10919,
+    1678, -1332, -1332,  1103,    62,  1103, -1332, -1332, -1332,   102,
+     102, -1332, -1332,  1062, -1332,   102, -1332, -1332,  8891,  1062,
+    1110, 10919, -1332,  1062, 11343, -1332, -1332,  1113, -1332, -1332,
+   -1332,   735, -1332, 11271, 10919, -1332,  8042,   718,  8347, -1332,
+   -1332,   739,  1114,  1115,   828,  2655, -1332, -1332, 11374, -1332,
+   -1332,  1116, -1332, -1332,  1122, -1332,  1116,  1123, 11116,  6310,
+     163,  1092,    54,  1131,  1128,  1135,   928,  1130,  1138, -1332,
+    1140,  1141,  9733,  7132, -1332,  6310, -1332,   630,  1274, -1332,
+    5523,  6310,  1139, -1332, -1332,  1030,   695, -1332,  6310, -1332,
+   -1332,   741, -1332, -1332, -1332, -1332, -1332,   516,   516,   336,
+     336,   425,   425,   425,   425,   270,   270,   704,   934,   936,
+     960,   997, 10919,   754, -1332, 10283,  1150,  1151,  1153,   777,
+   -1332, -1332, -1332, -1332, -1332, 10283,   748, 10919,  8042, -1332,
+    9914, -1332,  7612,  9316,  9126,  7372, -1332, -1332, -1332,   690,
+   10283,   950,  1164,  1165,  1171,  1172,  1179,  1180,  1181, -1332,
+    3591,  1090, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332,  1066,
+   -1332, -1332, -1332,   974, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332,  1183, -1332,  1184,  1187, -1332, -1332,   190,  1139,
+    5183, -1332, -1332, -1332,  3059,  1185, -1332, -1332, -1332, -1332,
+   -1332,  1062,  6532,  1270, -1332, -1332, -1332, -1332,  1173,   190,
+   -1332, -1332,  1066, -1332, -1332,  1066,   152,  1066, -1332, -1332,
+   -1332, -1332, -1332, -1332,  9584, -1332,   182, -1332,  8891, -1332,
+   -1332,  1193,   795,  1199,  1200,  1204, -1332, -1332,  1678, -1332,
+   -1332, -1332, -1332, -1332, -1332, -1332,   907,  9763,  1047, -1332,
+   -1332,  1069,  1205,  1201, -1332, -1332,  1206,  1207, -1332,   718,
+    1989, -1332,   634, -1332,  2655,   974, -1332,  1211, 11374, 10205,
+    8974,  1214, -1332, -1332,  1212,  1217,  1213, -1332, 10919,   229,
+     205,  1215, -1332,  1202,   735,  1202,  7012,  6310, -1332, -1332,
+    1202, -1332,  1274,  3059, -1332, -1332, -1332, -1332,  1220,  6310,
+    1228,   735,  5183, -1332, 10784, -1332,   735, -1332, -1332,  6310,
+   -1332,   863,   996, -1332, -1332, -1332, -1332, -1332, -1332, -1332,
+    1030,  8746, -1332, -1332,  7732,  1219, -1332,   876,   996, -1332,
+     883,   896,   996, -1332,   810,  4775, -1332, -1332, -1332, 10283,
+   10283, -1332,  8420,  8420, -1332,  1221,  1226,  1233,  1235, -1332,
+    1234,   643,   137,  1139, -1332,   735, -1332,  3245, -1332,  6310,
+     517, -1332,  6892,  1245,  1249, 10726,  1253,  1258,   330,   380,
+     387,  6310,  1265,   182,  6310,  6310,  1256,   294,  1269,  1250,
+   -1332, -1332, -1332,  1277, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332, -1332,  1062,  1285,  6310, -1332, 10283, 10283,   102,
+    1287, -1332,  9845,  9622,   932,   996, -1332, -1332, -1332, -1332,
+   -1332,  1286, -1332, -1332, -1332, -1332,  1293,  1989, -1332, -1332,
+    1275, -1332,  1116, -1332, -1332,  1948,  1290, -1332, -1332, -1332,
+     749,  1292, -1332,    54,  1295, 10919,  1279,    54,    54,  1305,
+    1301, -1332,  1099,  6310,  1308,  1220,   605,    89,  1306, -1332,
+    1301, -1332,  1312,  1306, -1332, -1332,  1317, -1332, -1332,  1066,
+    1319,  1322,  7252,  1323,  1325,  1326, -1332, -1332,  1329, -1332,
+   -1332,  1066, -1332, -1332, -1332, -1332,  1066,  6310,  6310, 10919,
+    1330, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332, -1332, 10919, 10919,  1332,  1335,  1306, -1332, -1332,
+    1062, -1332, -1332, -1332,  7853, 10205,  6310,  6310,  1394,  6310,
+   -1332, -1332,  1321, -1332,  1324,  6310,  1327,  1331,  6310,  1013,
+    1333,    97,  8265,  1262,   102, -1332, -1332,  6532,  1334,   537,
+   -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332, -1332,  1066,
+   -1332, 10544, -1332,  8493,  1345, -1332, -1332, 10205,   562,   563,
+   -1332,  1343,  1344,   926,  1352, -1332,   450, -1332, -1332,  6310,
+    1355,  1349, -1332, -1332,  1356,   543,   613,   735,  1357,  1358,
+   -1332,  1361, -1332, 10283, -1332, -1332, -1332, -1332, -1332,  1365,
+   -1332, 10283, 10283, 10283, -1332, -1332,  1367, -1332,  1368,  1371,
+    1372,   668,  8115,  8231, -1332, -1332,   457, -1332,  1376,  1378,
+   -1332,  8566,   750,   782,  1387,   793,  6762, -1332, -1332,   598,
+   -1332, -1332,   803,  1388,  1393,   182,  1445,   882, -1332, -1332,
+    6310, -1332, 10784, 10726, -1332, -1332, -1332,  1396,  1404, 10283,
+   -1332, -1332, -1332,  1401, -1332, -1332, -1332, -1332, -1332, -1332,
+   10205,   926,   254, -1332,  1384,   926,  1220,   366, -1332, -1332,
+   -1332, -1332, -1332, -1332, -1332, -1332,  1405, -1332, -1332, -1332,
+   -1332, -1332, -1332,  1406,  1409, -1332, -1332, -1332, -1332, -1332,
+   -1332, -1332,  1414, -1332,  1413, -1332, -1332, 10726,    84,  6310,
+   10726, -1332,  1417,  6310, -1332,    99,  1433,  1434, -1332, -1332,
+    1422,  1425,  1408,   852, -1332, -1332, -1332, -1332, -1332,  1658,
+    1948,  1421,   949,   918, 10919, -1332,   832,  1426,  6310,   735,
+     735,  1427,  1431,  1440,  1441, -1332, -1332,  8420,  1428, -1332,
+    1501, 10919,  1437, -1332, -1332, 10637, -1332,   845, -1332,  1424,
+   10726,  1436, -1332, -1332,  1460, -1332,  1461, -1332,  1476,  1481,
+   -1332,  1446,  1471, 10205, -1332, -1332, -1332,   926,   735,  1472,
+    1452,  1468, -1332,  1306,  1306, -1332, -1332, -1332, -1332, -1332,
+   10726,   295, -1332,   940, -1332, -1332,  5671, -1332, -1332,  1454,
+    6310, -1332,  6310,  5671,   182, 10025,   182, 10025,  1478, -1332,
+    1482, -1332, -1332, -1332,  1480,   949, -1332,   850, -1332, -1332,
+    6310,  1479,  1487, -1332, 10919, 10919, -1332, -1332,  1054,   123,
+   -1332, -1332,  1465, -1332,  1054, -1332, -1332,  1818,   735, -1332,
+   -1332,   182, 10025,   182, 10025,  1492,  1474,   735, -1332, -1332,
+   -1332, -1332, -1332, 10637,  1488,  1054,  6242,  6310, 10548,  1495,
+    1054,  1502,  1818,  2347, -1332, -1332, -1332,  1505, -1332, -1332,
+   -1332, -1332,  8974, -1332, -1332, -1332, 10415, -1332, 10637, -1332,
+   -1332,  1484, 10322, -1332, -1332, 10548,   182,  2347,   182,  1509,
+    1510,   853, -1332, 10415, -1332, -1332, -1332, 10322, -1332, -1332,
+   -1332,   182,   182, -1332, -1332, -1332, -1332, -1332, -1332, -1332,
+   -1332
 };
 
@@ -1750,28 +1756,28 @@
 static const yytype_int16 yypgoto[] =
 {
-   -1281,  4254,  1590, -1281,  1409, -1281,    52,     0,  -229, -1281,
-     596,  -527,  -497,  -931,   -99,  4508, -1281,   358,   609,   563,
-     518,   591,  1104,  1105,  1110,  1117,  1112, -1281,   613,  -339,
-    5346,  -893,  -690,  -919, -1281,   401,  -634,   444, -1281,   753,
-   -1281,   449, -1224, -1281, -1281,   191, -1281, -1265,  -724,   305,
-   -1281, -1281, -1281, -1281,   129, -1170, -1281, -1281, -1281, -1281,
-   -1281, -1281,   382, -1175,    71, -1281,  -381, -1281,   560,   356,
-   -1281,   229, -1281,  -338, -1281, -1281, -1281,   632,  -691, -1281,
-   -1281,    11, -1000,    10,  2865, -1281, -1281, -1281,  -125, -1281,
-     275,   363,  -194,  1416,  4157, -1281, -1281,    24,    25,   374,
-    -202,  1621, -1281,  2138, -1281, -1281,   112,  2165, -1281,  2832,
-     139, -1281, -1281,  -416,  -434,  1276,  1278,   786,  1028,   400,
-   -1281, -1281,  1269,   793,  -513, -1281,  -522,   -57,  -636, -1281,
-   -1281,  -959,  -994,   122,   819,  1153,   135, -1281,  1441,   296,
-    -299,  -212,  -109,   749,   844, -1281,  1087, -1281,  2859,  1478,
-    -462,  1000, -1281, -1281,   778, -1281,  -233, -1281,   -72, -1281,
-   -1281, -1281, -1232,   504, -1281, -1281, -1281,  1259, -1281,    68,
-   -1281, -1281,  -850,   -96, -1280,   -93,  1665, -1281,  2401, -1281,
-     993, -1281,  -164,   689,  -177,  -176,  -170,     2,   -39,   -33,
-     -28,  1052,    48,    75,    93,  -100,  -167,  -166,  -153,  -148,
-    -277,  -569,  -500,  -490,  -543,  -300,  -514, -1281, -1281,  -506,
-    1174,  1177,  1181,  2149,  5126,  -572,  -549,  -544,  -523,  -484,
-   -1281,  -427,  -665,  -663,  -660,  -602,  -320,  -271, -1281, -1281,
-     102,   140,   -84, -1281,  3728,   128,  -603,  -447
+   -1332,  4383,  1919, -1332,  1457, -1332,    41,     0,  -257, -1332,
+     544,  -527,  -514,  -956,  -190,  3713, -1332,  1485,   580,   585,
+     548,   602,  1055,  1052,  1056,  1059,  1061, -1332,  -217,  -341,
+    5350,  -699,  -697,  -922, -1332,   -83,  -701,  -678, -1332,   561,
+   -1332,   399, -1087, -1332, -1332,   141, -1332, -1329,  -838,   252,
+   -1332, -1332, -1332, -1332,    71, -1078, -1332, -1332, -1332, -1332,
+   -1332, -1332,   325, -1308,    57, -1332,  -297, -1332,   504,   305,
+   -1332,   173, -1332,  -305, -1332, -1332, -1332,   558,  -799, -1332,
+   -1332,    11, -1027,   151,   658, -1332, -1332, -1332,   -52, -1332,
+     117,   913,  -200,  1494,  4071, -1332, -1332,    19,   107,   365,
+    -232,  1565, -1332,  2150, -1332, -1332,   134,  2571, -1332,  3063,
+    1550, -1332, -1332, -1332,  -643,  -431,  1210,  1216,   707,   947,
+     188, -1332, -1332, -1332,   945,   723,  -404, -1332,  -520,  -362,
+     293, -1332, -1332,  -990,  -995,   965,  1194,  1083,   304, -1332,
+     150,   317,   -75,  -197,  -129,   679,   781, -1332,  1020, -1332,
+    3338,  1566,  -427,   948, -1332, -1332,   710, -1332,  -230, -1332,
+     -89, -1332, -1332, -1332, -1266,   433, -1332, -1332, -1332,  1195,
+   -1332,    22, -1332, -1332,  -865,  -105, -1331,   -98,  1750, -1332,
+    2253, -1332,   929, -1332,  -168,   288,  -180,  -179,  -173,     2,
+     -34,   -29,   -28,   687,    75,    77,    92,  -161,  -162,  -153,
+    -151,  -148,  -320,  -530,  -516,  -495,  -552,  -307,  -529, -1332,
+   -1332,  -506,  1106,  1117,  1121,  2218,  5180,  -562,  -569,  -544,
+    -538,  -550, -1332,  -429,  -691,  -685,  -671,  -611,  -246,  -241,
+   -1332, -1332,  1149,   273,   -84, -1332,  3714,    76,  -612,  -441
 };
 
@@ -1779,2227 +1785,2307 @@
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -522
+#define YYTABLE_NINF -525
 static const yytype_int16 yytable[] =
 {
-      46,   111,    95,   147,   451,   438,   397,   398,   426,   148,
-      53,   113,   112,   399,   149,   790,   400,   401,   265,   258,
-     405,   711,   767,   604,    66,    67,   870,   706,   111,   111,
-     402,    46,   932,    95,   933,   403,   750,   934,   853,   841,
-     755,    53,    46,   918,    46,   717,   159,   617,  1185,   748,
-     511,  1091,   894,   110,    46,    66,    67,   381,   382,   845,
-      46,  1201,   191,    46,   846,   214,    46,   852,   224,   341,
-     612,    47,   819,   208,  1151,   504,   218,   217,   678,  1143,
-     111,   111,  1183,  1184,   406,   847,   397,   398,   210,   994,
-     150,   636,   408,   399,   844,   640,   400,   401,   687,   141,
-     405,   778,    47,   423,    46,  1398,   691,    46,   842,   200,
-     402,   932,    74,   933,    46,   403,   934,   151,   843,   950,
-     883,   883,   883,  1195,   974,   682,   684,   856,    30,   477,
-     885,   886,    30,   863,   289,   152,  1317,   166,  1461,   883,
-     104,   104,   407,    74,   147,    46,   161,   159,   904,  1134,
-     148,   535,   121,    46,   445,   149,  1135,  1465,    46,   201,
-     371,   167,    30,   977,   406,   857,   481,   483,   739,   860,
-     278,   104,   164,   466,   841,  1341,  -234,  -234,  1009,  1098,
-    1218,  1219,  1342,    46,    46,   120,   159,   482,  1014,   175,
-     877,  1418,  1419,    30,   880,    30,   676,  1262,   250,    46,
-     409,   754,   212,  1025,   409,  1318,   104,    46,  1481,   159,
-    1090,   161,  1461,   883,  1418,  1419,    46,   745,   140,    46,
-     769,   441,   957,    30,   147,  1263,   111,   535,   279,   439,
-     148,   150,   417,   142,   409,   149,   375,   164,   144,   259,
-     673,   111,   260,   842,   440,   111,  1185,  -234,  1259,    46,
-     111,    95,   376,   843,   212,  1465,   595,   169,   151,    53,
-    1465,  1420,   975,    46,    46,   487,   159,   409,   179,   841,
-      46,    30,   326,    66,    67,    60,   152,    46,  1037,   604,
-    1465,   759,   199,   711,  1429,   341,   823,  1465,   535,   845,
-     702,   477,   111,   854,   846,   609,  1185,   212,   665,  1507,
-     153,  1549,   471,  1201,   674,   883,    60,  1036,   604,   433,
-     617,   477,  1013,   604,  1016,   847,   760,   469,  1153,   477,
-      47,  1560,   673,   761,  1024,   830,   680,    46,  1564,   371,
-    1183,  1184,   685,   535,  1536,   434,  1538,  1343,   842,   573,
-     459,   861,  1191,   609,   523,   873,    46,    46,   843,   874,
-     535,   437,   925,  1491,   704,  1550,   856,   245,   212,   936,
-    1133,    74,  -290,    46,   114,   326,    74,    46,   879,  1192,
-    1200,   433,   108,   210,   574,  1091,   739,  1401,   652,   108,
-    1192,   949,  1565,    40,    41,   250,   674,   853,   -10,   104,
-      40,    41,  -112,  -112,    46,   530,   212,   434,   161,   108,
-     212,   482,  1180,  1181,    46,   489,   371,   157,  -112,   845,
-      40,    41,   506,   385,   846,   108,   248,   388,   870,  -517,
-    1185,   390,    46,   575,   164,  1040,    40,    41,    46,   386,
-      46,   738,  1209,   389,   584,   847,  1215,   391,   782,  1211,
-     585,   227,   392,   563,   564,   228,   915,   341,   232,   712,
-     234,   262,   739,   714,    46,  1456,   108,   243,   393,   111,
-    1230,  1231,  1213,  1201,   111,   713,   256,    40,    41,   715,
-    1201,   606,   157,   111,  -440,  1450,  1451,   712,    46,   565,
-     566,   175,  -112,   250,   328,   692,    46,   212,   371,  1405,
-      46,   585,    95,   928,    46,   788,   329,   111,   637,   111,
-      53,   108,   641,  -112,   210,  1120,  1149,   322,   559,   560,
-    1106,  1101,    40,    41,    66,    67,   338,  1117,   706,   652,
-     397,   398,   714,  1201,    60,   110,  -441,   399,    74,   478,
-     400,   401,   978,   274,  1090,   405,   111,  1258,   929,   652,
-    1347,   111,   652,  1037,   402,  1171,  1173,   895,    74,   403,
-     617,   276,   326,   326,   459,   504,    74,   459,  1018,   561,
-     562,    47,   830,   459,  1106,   477,   428,   906,   212,   284,
-     432,   766,   908,  1035,  1198,     8,     9,    10,    11,    12,
-      40,    41,  1198,   277,   227,   884,   884,   884,   783,   111,
-    1199,   766,   727,   789,   766,   330,    46,  1332,  1323,   406,
-     322,   454,    74,    30,   884,   331,   520,   954,    46,  1334,
-      46,   341,  1380,  1333,   530,   108,   530,   774,   212,   530,
-     875,   832,   530,   332,   876,  1335,    40,    41,   326,    46,
-     104,    33,   432,  1381,  1355,   494,   333,  -466,  1132,   738,
-     516,   471,  1357,  1358,  1359,    46,   108,   326,   137,   138,
-     334,   111,   830,   533,   534,   440,   528,    40,    41,   157,
-      46,   369,   111,    46,   111,   555,   383,   711,  -466,  1378,
-    -466,   896,  -291,   875,  -466,  1048,   370,  1116,   884,     8,
-       9,    10,    11,    12,   567,   568,  1035,   341,   241,    94,
-    1394,   478,   729,   586,   526,   409,  1095,    46,   730,    46,
-     604,   534,   897,   594,   651,  -105,   601,    30,   898,  -105,
-     374,   478,   111,   326,   905,   738,   907,   556,   111,   478,
-      94,   395,   557,   558,   227,   634,   232,   606,   108,   638,
-     111,   146,   338,    94,  1366,    33,  1128,   534,  1367,    40,
-      41,   212,   387,    46,    46,   746,  1428,   756,   210,   187,
-    1249,   747,    94,   757,  1253,    94,   871,    46,   577,   407,
-     409,   606,   210,   736,   872,    60,   424,  1349,   578,   212,
-     884,  1520,  1497,   673,   212,   425,   776,  1525,   409,  1497,
-     887,   702,   953,   958,  1055,   609,   777,   322,   322,   430,
-     773,   919,  1390,   959,  1251,   903,   774,   774,  1545,   461,
-     921,   727,    74,  1552,   448,   171,   774,   464,   762,   108,
-     763,   137,   236,   764,   227,   454,   770,  1002,   454,   459,
-      40,    41,  1015,  1003,   454,   681,   683,   499,   730,   500,
-     490,   830,  1546,  1499,    94,  1500,   114,   674,    46,  1175,
-     739,  1006,  1003,  1247,    74,   704,   237,    94,   251,   585,
-      46,   238,  1291,  1292,  1374,   589,   210,   409,   832,   467,
-     774,   494,   212,   322,   932,   494,   933,   468,  1375,   934,
-     774,  1008,   396,   187,   774,   528,   212,   528,  1377,  1382,
-     528,  1447,   322,   528,   774,   774,   108,  1444,   137,   138,
-    1547,   510,   506,   652,   338,   514,    94,    40,    41,  1466,
-     111,   652,   978,  1513,  1570,   774,   978,   978,    94,  1514,
-     585,    53,   289,   526,   793,   794,   795,   909,   526,   409,
-     739,   526,   912,    46,   409,    66,    67,   328,   409,     2,
-     204,     4,     5,     6,     7,   519,   727,    46,    94,   108,
-     531,   137,   138,   535,   415,    46,   727,  1196,   322,   569,
-      40,    41,   485,  1077,   250,   328,   409,   534,  1155,   828,
-     409,   727,   601,    46,  1167,   478,   409,   435,  1387,  1388,
-     212,   736,   417,   669,   409,   812,   751,   443,  1122,  1121,
-    1170,   752,   609,   111,  1182,     2,   204,     4,     5,     6,
-       7,   869,   652,    34,   570,    35,   601,   487,   328,   409,
-     111,   571,   878,   652,   575,   111,    36,   478,   181,   182,
-      39,   337,  1172,    74,   609,  -292,    94,    40,    41,  1438,
-    1003,  1339,     8,     9,    10,    11,    12,  1242,    36,   459,
-     172,   173,    39,  1444,  1445,  1137,   611,  1492,  1493,    40,
-      41,   104,  1235,   608,   409,   609,   527,   736,   440,    34,
-      30,    35,  1145,   610,   111,   766,    -3,  1145,   338,   854,
-     328,   609,  1446,   572,   652,   370,  -437,   111,   111,   111,
-     593,    53,     8,     9,    10,    11,    12,  1532,    33,  1458,
-     454,   800,   801,   802,   803,  1203,    67,   108,   596,   137,
-     138,   534,   111,   187,  1418,  1419,   160,   326,    40,    41,
-      30,   646,   940,   738,   940,   666,  1145,   667,   104,  1399,
-     494,   668,   192,  1399,   670,   215,  1077,   671,   225,  1210,
-    1212,  1214,  -293,    46,   798,   799,   890,  1106,    33,     8,
-       9,    10,    11,    12,   338,   672,   341,   993,    36,   675,
-     172,   173,    39,   703,   677,  -112,   695,  -112,   871,    40,
-      41,  -112,  1518,  1458,  1310,  1311,  1312,    30,   804,   805,
-     727,   727,   212,  1348,  1350,  1351,  -112,  -112,   796,   797,
-     577,   255,   409,    74,   718,   374,    60,   720,  -238,    94,
-     578,   758,   771,   611,   534,    33,   775,   779,   -12,   893,
-     833,   835,  1017,   837,   689,   848,   828,   160,   111,   -13,
-     900,   104,   892,   459,   920,   536,   537,   538,   922,   923,
-     372,  -414,   208,   218,   217,  1482,   927,   698,   727,   727,
-      46,   948,  -521,   962,   969,   652,   747,   210,   731,   539,
-     983,   540,  1369,   541,   542,    53,   160,   971,     2,   204,
-       4,     5,     6,     7,   976,   982,   984,   986,   987,    66,
-      67,   988,   989,   998,  1122,  1121,    36,  1010,  1011,   160,
-      39,  1012,   111,   111,   111,   527,   226,    40,    41,  1026,
-     527,   442,  1027,   527,  1028,  1029,   127,  1077,   128,   129,
-     130,   536,   537,   538,  1030,  1031,   828,    40,    41,   728,
-     454,  1032,  1043,   838,  1057,   609,  -402,   840,  -401,   611,
-    1092,  1442,    34,   610,    35,   539,  1558,   540,   439,   541,
-    1319,   935,  1102,    53,  1145,  1145,  1145,  1103,  1094,   652,
-     652,  1104,  1105,   440,  1109,  1110,  1111,  1203,    67,  1112,
-     494,  1123,   322,   935,  1113,  1119,   478,    74,    36,  1129,
-     774,   212,    39,   104,  1130,  1079,  1136,  1122,  1121,    40,
-      41,  1141,   397,   398,  1131,   992,  1144,    36,  1165,   399,
-    1328,    39,   400,   401,  1190,   104,   405,  1186,    40,    41,
-    1187,   766,  1077,  1188,   652,    42,   402,   652,   534,   372,
-    1189,   403,  1204,   869,   104,   145,   931,  1205,   703,  1207,
-     673,  1208,   727,  1216,   743,  1220,    46,    46,  1222,  1223,
-     727,   727,   727,    -3,   744,  1228,   111,   111,  1531,    36,
-    1233,   172,   173,    39,  1239,    74,    63,   115,   499,   516,
-      40,    41,   652,  1243,  1007,  1248,  1077,   652,  1250,  1077,
-     406,   917,   840,   611,  1252,   736,  1255,   212,  1256,  1260,
-     924,  1264,  1267,   104,   926,   111,  1269,    63,   727,  1271,
-    1122,  1121,  1272,  1273,   674,  1274,   372,   652,  1145,  1145,
-     158,  1275,  1277,   174,   454,   828,  1284,  1293,  1294,  1301,
-     139,  1330,  1304,    53,  1077,  1322,  1305,   104,  1307,  1077,
-      53,    36,   219,   181,   182,    39,  1336,  1203,    67,  1308,
-     147,  1316,    40,    41,  1203,    67,   148,  1483,   728,  1338,
-      60,   149,  1050,  1340,    46,   111,  1344,  1345,  1206,  1077,
-    1346,  1352,  1353,   174,   111,   736,   174,  1354,   183,   257,
-     652,   239,   242,  1356,  1362,   652,  1363,   840,   184,    46,
-      46,  1441,   159,    53,  1364,   534,  1365,  1372,  1376,   611,
-    1373,   213,  1383,   652,  1384,   652,  1312,  1203,    67,   652,
-    1395,  1392,   652,  1393,    46,  1402,   371,  1533,   240,  1405,
-     652,   327,   174,  1412,   652,  1413,  1541,  -403,  1416,   257,
-     348,  1427,  1077,  1435,  1505,    74,  1505,  1077,   478,  1431,
-     104,  1433,    74,   338,  1436,  1443,  1437,  1367,  1448,  1452,
-     935,  1453,  1454,   213,  1455,  1077,  1457,  1077,  1467,  1469,
-     404,  1077,  1475,   104,  1077,  1299,  1300,  1123,  1302,  1462,
-     104,  1505,  1077,  1505,  1306,   422,  1077,  1309,   427,   429,
-    1471,  1152,  1473,   158,  1477,   174,   703,  1479,  1480,  1485,
-    1486,  1487,  1498,   728,   703,    74,   213,  1508,  1512,  1510,
-     165,  1524,   170,   728,   446,   176,   177,   178,   449,   180,
-     450,  1516,   611,  1517,  1539,  1544,  1540,  1551,   728,   465,
-    1553,  1555,  1561,   104,   231,    63,  1568,   326,  1569,  1079,
-     479,  1050,  1221,   806,  1321,   807,   246,   247,  1100,   174,
-     486,   808,   463,  1519,   211,   810,   174,  1430,   429,   809,
-     122,   125,   126,  1571,   230,  1386,  1254,   213,  1403,  1501,
-    1123,     8,     9,    10,    11,    12,     8,     9,    10,    11,
+      47,   112,    96,   427,   398,   399,   768,   933,   452,   148,
+     266,   400,   113,   934,   149,   150,   791,   406,   871,    67,
+     259,   439,   401,   512,   407,   712,   707,   935,   613,   112,
+     112,   402,    47,   403,    96,  1203,   404,  1092,   382,   383,
+     846,   618,   111,    47,   895,    47,   505,   160,  1187,   854,
+    1153,    67,  1185,  1186,   142,    47,   749,    48,   975,   853,
+     201,    47,   857,   192,    47,   847,   215,    47,   864,   225,
+     342,   848,   751,   820,  1401,   947,   756,  1145,   218,   842,
+     845,   112,   112,   995,   398,   399,   933,   279,   409,    48,
+    1464,   400,   934,   843,   121,   424,  1468,   406,   605,  1197,
+     779,    31,   401,  1091,   407,    47,   935,    68,    47,    31,
+     202,   402,   679,   403,   844,    47,   404,    61,   151,   109,
+     152,   165,   637,   884,   884,   884,   641,   739,  1421,  1422,
+      41,    42,   688,   408,    75,   153,   290,    31,   446,    68,
+     692,    31,   884,  1421,  1422,   280,    47,   574,   160,    61,
+     148,    54,   114,    31,    47,   149,   150,   467,   783,    47,
+    1320,   372,   482,   484,  1464,   978,    75,  -234,  -234,  1510,
+     122,   211,   858,   410,  1265,   746,   861,  1484,   483,   251,
+     140,   410,   575,    54,    47,    47,   165,   160,     2,   205,
+       4,     5,     6,     7,  1468,   141,    31,   878,  1423,  1468,
+      47,   881,  1266,   478,  1539,    31,  1541,   418,    47,   410,
+     160,   527,   677,  1432,   842,   209,   884,    47,   219,  1468,
+      47,   327,   442,   488,  1080,   410,  1468,   112,   843,  1321,
+     148,   240,   243,  1193,   536,   149,   150,   674,  -234,   143,
+     886,   887,   112,   740,   675,   536,   112,   145,  1187,   844,
+      47,   112,    96,    35,   760,    36,   154,   596,   905,   151,
+    1194,   152,  1099,  1202,    47,    47,   855,   160,   610,    67,
+     846,    47,   470,   105,   105,   862,   153,   610,    47,  1203,
+     976,   885,   885,   885,   435,  1102,   342,   703,    95,  1038,
+     666,   857,   472,   112,   705,   847,   170,   167,  1187,  1037,
+     885,   848,  1185,  1186,   618,   105,   200,    48,   884,   842,
+    1025,   536,  1155,  1014,   327,  1136,    -3,   180,   681,   674,
+      95,   168,  1137,   843,   686,   376,   675,   441,    47,   386,
+     372,   147,   958,    95,   524,   739,   536,  1346,  1135,  1111,
+     105,   377,   682,   684,   844,   387,   435,    47,    47,   188,
+     683,   685,    95,   389,   605,    95,   831,    68,   937,   176,
+     564,   565,  1092,  1404,    47,   478,   285,    61,    47,   390,
+    1217,   440,   479,   165,   885,  1220,  1221,    41,    42,   653,
+     950,   251,   329,   605,    75,   478,   926,  1208,   605,    75,
+     846,  1494,   464,   478,   483,    47,   566,   567,   854,   880,
+     585,    54,   109,   521,  -290,    47,   586,   372,   536,   260,
+     871,   739,   261,    41,    42,   847,   576,   246,  1194,   916,
+     607,   848,  1187,    47,  1017,   251,   755,  1459,  1091,    47,
+     527,    47,  1041,   228,    95,   527,   761,   229,   527,  1203,
+     233,  1552,   235,   762,  1262,   770,  1203,    95,   342,   244,
+    1553,   740,   109,  1453,  1454,    47,   211,   560,   561,   109,
+     112,  1563,  1211,    41,    42,   578,   885,   410,  1567,   391,
+      41,    42,   397,   188,   112,   579,  -112,  1568,   393,    47,
+    1173,  1175,   936,  1408,   874,   392,   249,    47,   875,   372,
+    1151,    47,   813,    96,   394,    47,    95,  -112,   112,  1203,
+     112,   327,   327,  -520,   936,   979,  1215,  1383,    95,  1107,
+      67,   824,  1213,   562,   563,   111,   712,   707,   398,   399,
+     653,   438,   263,   105,  1119,   400,   505,   740,   896,   654,
+    1261,  1036,   406,  -469,   479,   -10,   401,   112,    95,   407,
+     653,  1122,   112,   653,   618,   402,   109,   403,    48,  1080,
+     404,    75,   486,   713,   479,  1038,  -443,    41,    42,   907,
+    1344,   767,   479,  1107,  -469,  -444,  -469,  1345,   909,   714,
+    -469,    75,  -112,  -112,   693,   490,   228,   327,   784,    75,
+     586,   767,   507,   790,   767,   789,   275,   211,  -112,  1019,
+     112,   715,  -291,   831,   277,  1008,   327,    47,    68,     8,
+       9,    10,    11,    12,   278,  1381,   737,   716,    61,    47,
+     717,    47,   342,   713,   172,   109,    95,   833,   715,     2,
+     205,     4,     5,     6,     7,    75,    41,    42,    31,   929,
+      47,   472,   730,  1200,   930,   557,   612,  1134,   731,   478,
+     558,   559,    54,   876,  1036,  1394,    47,   877,   750,  1201,
+     754,   176,   112,  1200,  1350,   330,    34,   252,    55,    55,
+    1523,    47,   327,   112,    47,   112,  1528,  1500,   638,  1326,
+     897,   712,   642,  1051,  1500,   500,   607,   501,  1335,  1337,
+    1184,   955,  1431,   831,    35,   109,    36,  1548,   342,   331,
+      55,  1049,  1555,   188,  1336,  1338,    41,    42,    47,  1420,
+      47,   898,  1428,   652,   906,   872,   908,   899,   370,   587,
+     607,   410,  1096,   112,   775,  -112,   228,  -112,   233,   112,
+     747,  -112,    55,   112,  1352,    55,   748,  1549,   757,   774,
+    1384,   112,   161,   332,   758,   775,  -112,  -112,   441,   777,
+    1130,   410,   333,   704,    47,    47,   876,  1467,   193,   778,
+    1118,   216,  1471,   416,   226,  -105,    37,   920,    47,  -105,
+      40,   936,    37,   775,   105,  1056,    40,    41,    42,  1502,
+     674,  1503,   954,    41,    42,   605,   436,   675,   703,    95,
+    1369,   334,  1493,   612,  1370,   705,   444,     8,     9,    10,
+      11,    12,  1154,    43,  1254,  1393,   568,   569,   922,   839,
+     739,   610,   892,   146,   775,  1003,   228,   109,   479,   611,
+     590,  1004,   410,   347,   737,   910,    31,   410,    41,    42,
+       8,     9,    10,    11,    12,    75,  1550,   959,   371,   610,
+     763,   211,   764,   161,  1177,   765,  1252,   960,   771,    47,
+    1256,   933,  1051,   335,    34,   211,   373,   934,   375,    31,
+     479,    47,  1294,  1295,   833,   528,  1007,  1004,  1016,  1250,
+    1377,   935,   831,   945,   731,   586,   775,    75,  1562,   948,
+     775,  1009,   161,   464,  1562,   384,   979,    34,    55,   388,
+     979,   979,   251,   329,   410,  1562,   578,   396,   410,  1562,
+     737,   941,  1378,   941,   653,   161,   579,   841,   775,   612,
+      37,   112,   653,  1380,    40,   329,   410,   443,    55,   775,
+     408,    41,    42,  1385,   115,   913,   740,   410,   936,   775,
+     109,    67,   138,   237,    47,   537,   538,   539,  1198,   425,
+    1372,    41,    42,   109,   873,   138,   139,   744,    47,   211,
+    1390,  1391,  1450,  1078,    41,    42,    47,   745,  1447,   540,
+     888,   541,   426,   542,   543,  1469,   431,   238,   158,   449,
+    1516,   775,   239,  1573,    47,   904,  1517,  1441,  1004,   586,
+     752,  -367,  1157,   919,   410,   753,   936,   936,  -396,    37,
+    1123,   182,   183,    40,   112,  1169,   932,   410,   704,   491,
+      41,    42,  1172,   653,   610,   511,  1342,   740,   418,   670,
+     410,   112,   468,   690,   653,  1174,   112,   610,   290,    68,
+     109,   469,   138,   139,   515,   373,   698,   257,   410,    61,
+    1245,    41,    42,   158,   699,  1139,   700,   109,   520,   138,
+     139,   536,   841,   612,  1447,  1448,    75,   732,    41,    42,
+     532,  1237,  1147,   410,   654,   767,   327,  1147,   488,   329,
+     410,  1061,   242,    54,   570,   112,  1495,  1496,   323,   855,
+     329,   610,   507,  1449,   571,   653,   891,   339,   112,   112,
+     112,  1313,  1314,  1315,   528,  1351,  1353,  1354,  1535,   528,
+    1461,  1205,   528,   128,  1402,   129,   130,   131,  1402,   572,
+     347,   573,   373,   112,    41,    42,  1147,   872,  1421,  1422,
+       8,     9,    10,    11,    12,   576,  1078,   338,  1010,  1212,
+    1214,  1216,   801,   802,   803,   804,  -440,   429,  1015,   594,
+    1124,   433,   667,  1302,  1303,    47,  1305,   841,  1107,    31,
+     597,   441,  1309,  1026,   109,  1312,   138,   139,   342,   612,
+     797,   798,   647,   654,   668,    41,    42,   799,   800,    55,
+     669,   323,   455,  1521,  1461,   671,    37,    34,   182,   183,
+      40,   672,    37,   673,   182,   183,    40,    41,    42,    68,
+     805,   806,   676,    41,    42,   105,   678,   256,   721,   479,
+     696,   718,   759,   433,   723,   719,   495,   936,  -238,   772,
+    1485,   347,   776,   609,   162,   610,    75,   780,   834,   609,
+     112,   610,   -12,   611,   936,   836,   838,   529,   849,   611,
+     158,   901,   -13,    54,   893,   894,   218,   921,   923,   928,
+     699,   924,    47,  -417,   977,   949,   704,   653,  -292,  -524,
+     963,   970,   748,   972,   704,     8,     9,    10,    11,    12,
+     918,   983,   105,  1061,   984,   985,    67,   987,   988,   925,
+     989,   990,   612,   927,   595,   999,   347,   602,  1123,   162,
+    1011,  1012,  -293,  1013,    31,   112,   112,   112,  1078,     8,
+       9,    10,    11,    12,  1027,  1028,   635,   936,   936,   737,
+     639,  1029,  1030,   339,     8,     9,    10,    11,    12,  1031,
+    1032,  1033,    34,  1044,  -405,  1445,  1427,  -404,    31,  1093,
+    1058,   347,   347,   347,  1095,  1103,  1147,  1147,  1147,  1104,
+    1105,   211,  1561,    31,  1106,  1112,   993,  1113,  1114,  1115,
+     347,  1121,   653,   653,  1131,  1205,    34,  1132,   775,  1167,
+    1133,  1138,  1182,  1183,    68,   105,  1143,  1188,   323,   323,
+    1146,    34,  1189,  1190,    61,  1191,  1192,   537,   538,   539,
+    1300,  1123,   398,   399,  1206,   209,   219,   434,  1207,   400,
+     737,    75,  1209,   767,  1078,   406,   455,  1210,  1222,   455,
+     401,   540,   407,   541,  1218,   542,  1322,   653,    54,   402,
+     653,   403,  1225,   777,   404,   410,  1224,   115,   460,   674,
+    1232,  1233,    -3,   778,   347,  1230,   675,  1235,  1124,    47,
+      47,  1240,  1534,  1242,   500,  1246,  1251,  1253,   441,   112,
+     112,  1255,   495,    68,   323,  1258,   495,  1259,  1078,   434,
+    1263,  1078,  1267,   479,  1270,   653,   529,  1272,   529,  1274,
+     653,   529,  1275,   323,   529,  1276,   728,  1277,  1278,  1280,
+      75,  1304,  1287,   531,  1296,   339,   162,  1297,   112,  1325,
+    1147,  1147,   440,  1307,  1123,  1333,  1308,    54,  1339,  1310,
+     653,  1341,  1343,  1311,  1348,  1319,  1078,  1347,  1349,  1355,
+    1356,  1078,    37,  1357,   182,   183,    40,  1359,   105,  1365,
+    1366,  1367,  1368,    41,    42,  1205,   347,  1101,  1375,  1486,
+    1376,  1124,  1205,   347,    64,   116,  1379,  1386,   148,   323,
+     105,  1078,  1387,   149,   150,  1315,  1395,    47,   112,   698,
+     829,   410,   175,   602,  1396,  1398,  1405,   112,  1415,   700,
+     105,  1416,  1408,   653,  -406,  1419,    64,  1430,   653,  1434,
+    1436,  1438,    47,    47,  1439,   160,  1446,  1455,  1451,   159,
+    1440,  1456,   870,  1460,  1370,  1205,   653,   602,   653,  1536,
+    1457,  1458,   653,   879,  1465,   653,  1470,    47,  1544,   372,
+      55,   220,   175,   653,  1078,   175,  1358,   653,  1472,  1078,
+    1474,  1476,  1478,    68,  1360,  1361,  1362,  1480,  1482,   105,
+      68,  1483,  1488,   479,  1489,  1490,  1501,  1078,  1511,  1078,
+     479,  1519,  1513,  1078,  1124,  1515,  1078,  1527,   258,  1520,
+      75,  1542,   460,  1547,  1078,   460,  1543,    75,  1078,   339,
+    1554,   175,  1556,   105,   213,  1558,  1564,    54,   327,  1571,
+    1572,  1223,  1397,   808,    54,   807,  1324,    55,   809,   212,
+     214,   455,   810,    68,  1219,   811,  1522,  1433,  1574,   231,
+     328,  1389,  1257,   479,   347,   728,  1504,   241,   258,   349,
+    1406,  1229,   942,  1108,     2,   205,     4,     5,     6,     7,
+      75,   495,   531,   694,   531,   729,   213,   531,   951,   695,
+     531,  1110,  1142,   826,   175,  1057,  1120,    54,   900,   405,
+    1334,   212,   214,   227,   816,   339,   742,   973,     8,     9,
+      10,    11,    12,     0,   423,   817,   965,   428,   430,   818,
+     347,   347,   159,  1444,     0,     0,     0,     0,     0,   213,
+       0,     0,     0,     0,     0,     0,   105,    31,     0,    35,
+      55,    36,     0,   447,   212,   214,     0,   450,   175,   451,
+      37,     0,   173,   174,    40,   175,     0,     0,   466,   105,
+       0,    41,    42,  1018,    64,    34,   105,   829,     0,   480,
+      37,     0,   182,   183,    40,     0,     0,     0,     0,   487,
+       0,    41,    42,     0,     0,     0,     0,   430,   517,     0,
+     213,     0,     0,     0,     0,     0,   123,   126,   127,     0,
+     728,   534,   535,     0,     0,   212,   214,   698,     0,   410,
+     728,     0,     0,   556,     0,     0,     0,   700,     0,   105,
+       0,     0,     0,     0,   175,   728,     0,     0,   213,     0,
+       0,     0,   213,     8,     9,    10,    11,    12,     0,     0,
+     486,   175,     0,   212,   214,   175,     0,   212,   214,   535,
+       0,     0,     0,     0,     0,   258,     0,   829,   603,     0,
+       0,   455,    31,   506,   631,     0,     0,   253,     0,   254,
+       0,     0,     0,     0,     0,     0,     0,   636,     0,     0,
+     455,   636,    55,    55,   258,   535,     0,   460,     0,     0,
+      34,     0,     0,     0,   729,    37,  1388,   182,   183,    40,
+       0,   495,  1125,   323,     0,    55,    41,    42,   175,     0,
+      37,     0,   182,   183,    40,     0,     0,     0,     0,   213,
+       0,    41,    42,     0,     0,    55,    37,     0,   182,   183,
+      40,   480,   184,     0,   212,   214,     0,    41,    42,     0,
+       0,    37,   185,   173,   174,    40,   349,  1532,     0,   410,
+     395,   480,    41,    42,   870,     0,     0,  1533,     0,   480,
+     414,   415,     0,   184,     0,   419,     0,   421,   422,     0,
+     347,   347,     0,   185,     0,     0,     0,     0,   371,    55,
+       0,     0,     0,     0,    55,   724,     0,     0,   430,     0,
+     166,     0,   171,     0,     0,   177,   178,   179,     0,   181,
+     213,     0,     0,   738,     0,    64,     0,     0,     0,     0,
+       0,     0,     0,   430,   232,   212,   214,   430,    55,     8,
+       9,    10,    11,    12,   728,   728,   247,   248,     0,   729,
+       0,     0,   212,     0,     0,   455,   829,     0,     0,   729,
+      37,     0,   182,   183,    40,     0,   258,   349,    31,     0,
+     213,    41,    42,     0,   729,  1505,     0,  1509,     0,     0,
+       0,     0,   794,   795,   796,   212,   214,    37,     0,   173,
+     174,    40,     0,     0,   175,     0,    34,   264,    41,    42,
+       0,     0,   728,   728,     0,     0,     0,   265,     0,     0,
+       0,     0,  1538,   819,  1540,   347,     0,   460,     0,     0,
+       0,     0,     0,     0,   375,   535,     0,   175,     0,     0,
+       0,   636,   832,     0,   603,     0,   460,     0,   959,     0,
+     610,    55,     0,   175,     0,   851,     0,     0,   960,     0,
+       0,     0,     0,     0,     0,     0,     0,  1569,   175,  1570,
+       0,     0,     0,   603,    55,     0,     0,     0,   603,     0,
+       0,    55,  1577,  1578,   636,   339,     0,   349,   349,   349,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      73,     0,     0,   213,     0,     0,   349,     0,     0,     0,
+    1125,     0,     0,     0,     0,     0,     0,     0,   212,   214,
+       0,     0,     0,     0,   724,     0,     0,     0,     0,     0,
+       0,   213,    73,     0,    55,   480,   213,     0,     0,     0,
+     258,   738,     0,     0,   938,     0,   212,   214,     0,     0,
+       0,   212,   214,     0,     0,     0,  1331,     0,     0,     0,
+       0,     0,     0,     0,     0,   175,     0,   221,     0,   535,
+       0,     0,     0,     0,     0,     0,     0,   480,     0,     0,
+     349,     0,     0,   729,   729,     0,     0,     0,   728,   964,
+       0,     0,   430,     0,     0,     0,   728,   728,   728,     0,
+       0,   460,     0,  1125,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   601,   608,   994,   258,   738,     0,     0,
+       0,     0,   992,     0,   213,   632,   633,     0,     0,   125,
+     125,   125,     0,     0,     0,     0,     0,     0,   213,   212,
+     214,   729,   729,     0,   728,     0,     0,     0,     0,     0,
+       0,     0,     0,   212,   214,   352,     0,     0,     0,   724,
+       0,     0,   535,     0,     0,     0,     0,     0,     0,   724,
+       0,     0,   349,   506,   636,     0,     0,  1024,   636,   832,
+       0,     0,   821,   822,   724,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1035,     0,     0,     0,     0,     0,
+     125,     0,   125,     0,     0,     0,  1125,     8,     9,    10,
+      11,    12,   856,     0,     0,   859,   860,     0,   863,     0,
+     865,   866,     0,     0,     0,   867,   868,   274,     0,   448,
+       0,   175,   213,     0,     0,     0,    31,     0,  1507,     0,
+    1507,     0,     0,     0,     0,     0,    64,   212,   214,     0,
+      73,     0,     0,     0,     0,    73,   412,     0,     0,     0,
+       0,     0,     0,   420,    34,     0,     0,     0,   636,    37,
+       0,   182,   183,    40,     0,  1507,     0,  1507,     0,     0,
+      41,    42,     0,   125,     0,  1332,     0,     0,     0,     0,
+       0,   125,     0,   125,   125,     0,     0,     0,   125,     0,
+     125,   125,     0,     0,  1117,   323,  1532,     0,   410,   943,
+     944,     0,   430,   116,     0,   946,  1533,   729,     0,     8,
+       9,    10,    11,    12,     0,   729,   729,   729,     0,     0,
+     349,     0,     0,     0,     0,   412,     0,     0,     0,     8,
+       9,    10,    11,    12,     0,     0,     0,     0,    31,     0,
+     221,     0,     0,     0,     0,     0,   535,     0,     0,     0,
+       0,     0,     0,     0,     0,   603,     0,     0,    31,     0,
+     125,     0,     0,   729,     0,     0,    34,     0,   428,     0,
+       0,    37,     0,   724,   724,    40,   349,   349,     0,     0,
+       0,   584,    41,    42,     0,     0,    34,   517,     0,   588,
+       0,    37,   591,   182,   183,    40,  1204,     0,     0,     0,
+       0,     0,    41,    42,     0,     0,     0,    73,    43,     0,
+       0,    76,     0,     0,   213,     0,     0,     0,   146,     0,
+       0,     0,   352,     0,     0,     0,     0,    73,   264,   212,
+     214,   724,   724,     0,     0,    73,     0,   636,   265,     0,
+       0,     0,     0,    76,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   412,     0,     0,     0,   420,
+       0,   352,     0,     0,  1508,     0,  1508,     0,   544,   545,
+     546,   547,   548,   549,   550,   551,   552,   553,   222,   352,
+       0,    73,     0,     0,   952,     0,   953,     0,     0,     0,
+       0,     0,     0,   956,   957,     0,   738,     0,   962,     0,
+       0,  1508,   554,  1508,   535,     8,     9,    10,    11,    12,
+     967,     0,     0,     0,     0,   971,     0,     0,     0,   175,
+       0,     0,     0,   352,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    31,     0,     0,     0,     0,  1301,
+       0,  1000,     0,     0,   412,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   258,     0,     0,     0,
+       0,    64,    34,     0,     0,     0,   354,    37,     0,     0,
+       0,    40,     0,     0,     0,   724,     0,   738,    41,    42,
+       0,   116,     0,     0,     0,     0,   601,     0,   352,     0,
+       0,     0,     0,     0,   213,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   744,     0,     0,   724,     0,   212,
+     214,     0,     0,     0,   745,   724,   724,   724,     0,     0,
+       0,     0,     0,     0,     0,     0,   349,   349,     0,     0,
+       0,     0,     0,   352,   352,   352,   584,   584,     0,     0,
+    1204,     0,     0,  1045,  1046,  1047,  1048,     0,  1050,     0,
+       0,     0,   352,     0,     0,     0,     0,     0,     0,     0,
+       0,    76,     0,   724,  1094,     0,    76,     0,     0,     0,
+     352,     0,     0,     0,   116,   125,   125,     0,  1100,     0,
+       0,    73,     0,     0,     0,     0,     0,   352,     0,  1234,
+       0,   213,     0,     0,     0,     0,   175,     0,     0,     0,
+       0,     0,     0,     0,     0,   125,   212,   214,   125,   125,
+       0,   125,     0,   125,   125,     0,     0,  1116,   125,   125,
+       0,     0,     0,    73,     0,   911,   352,     0,     0,   914,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,  -294,     0,
+       0,   349,     0,     0,     0,     0,     0,  1144,     0,    31,
+       0,   222,   412,   352,  1152,     0,     0,     0,     0,  1156,
+       0,     0,     0,     0,  1160,     0,  1161,   116,     0,     0,
+    1163,  1164,  1165,     0,     0,  1168,     0,    34,     0,     0,
+       0,     0,     0,     0,  1180,     0,     0,   125,  -294,     0,
+    1204,     0,   125,   125,     0,   352,     0,  1204,   125,     0,
+       0,     0,  1195,  1196,  1323,   352,     0,     0,   352,     0,
+       0,     0,     0,   221,     0,   352,     0,     0,    76,     0,
+     352,     0,     0,     0,     0,     0,     0,     0,     0,  1226,
+       0,     0,  1228,   354,     0,     0,     0,     0,    76,     0,
+       0,     0,     0,     0,     0,     0,    76,     0,     0,     0,
+    1204,     0,     0,     0,     0,     0,     0,  1557,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   584,     0,     0,
+       0,  1244,   354,     0,     0,     0,     0,  1248,  1249,     0,
+       0,     0,    73,     0,     0,     0,     0,     0,     0,  1260,
+     354,     0,    76,    78,  1264,     0,     0,  1268,     0,  1269,
+       0,     0,  1271,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1279,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    78,   281,   282,  1286,   283,
+    1288,  1289,  1290,  1291,   354,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1298,     0,  1299,     0,
+       0,     0,   171,     0,     0,   284,     0,     0,     0,     0,
+     223,   649,     0,   138,   139,   286,   352,     0,   287,   650,
+     289,   290,    41,    42,     0,   291,   292,     0,     0,     0,
+     412,  1327,  1328,   293,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   294,   354,
+     651,     0,   652,   379,     0,     0,     0,   296,   380,   298,
+     299,   300,   301,     0,     0,     0,     0,     0,     0,   352,
+     352,     0,   352,   352,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1363,  1364,     0,     0,     0,     0,     0,
+       0,     0,    73,  1374,   354,   354,   354,     0,   355,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  1158,
+       0,     0,     0,   354,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  1170,     0,   352,   352,     0,
+       0,   354,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    76,     0,     0,  1407,     0,     0,   354,     0,
+       0,     0,     0,     0,     0,     0,     0,  1411,     0,  1412,
+    1413,  1414,   281,   282,     0,   283,     0,     0,     0,     0,
+       0,  1418,     0,     0,     0,     0,     0,     0,     0,     0,
+    1429,     0,     0,     0,    76,     0,     0,   354,     0,     0,
+       0,   284,   352,    78,     0,     0,  1442,   285,    78,     0,
+       0,   286,  1238,     0,   287,   288,   289,   290,    41,    42,
+       0,   291,   292,     0,     0,     0,     0,     0,    85,   293,
+       0,     0,     0,     0,   354,     0,     0,     0,     0,     0,
+       0,     0,   125,     0,   294,   221,   378,     0,     0,   379,
+       0,     0,     0,   296,   380,   298,   299,   300,   301,     0,
+      85,     0,  1491,  1492,     0,     0,     0,    73,     0,     0,
+       0,     0,     0,     0,     0,  1497,   354,     0,     0,     0,
+       0,   352,  1497,   352,     0,     0,   354,     0,     0,   354,
+       0,     0,     0,     0,   222,   224,   354,     0,     0,     0,
+       0,   354,     0,   223,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   352,     0,  1531,     0,     0,     0,  1537,
+       0,   352,   352,   352,     0,     0,     0,     0,     0,     0,
+       0,     0,   352,   352,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    73,     0,  1559,     0,
+    1560,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    76,     0,     0,     0,   125,     0,   352,
+      78,     0,     0,     0,     0,     0,     0,     0,  1575,  1576,
+       0,     0,     0,   362,     0,   355,  1579,  1580,     0,     0,
+      78,     0,     0,     0,     0,     0,  -519,     0,    78,     1,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,  -294,  1227,    25,    26,    27,   693,    30,
-     694,  1107,   941,   722,    30,   213,   211,  1056,   478,   213,
-    1108,  1140,   825,  1118,   899,   478,   935,   964,  1331,   741,
-     972,   815,     0,     0,   816,   174,   257,    33,   817,   602,
-       0,   252,    33,   253,  1391,   630,     0,     0,     0,    37,
-      38,     0,   174,  -294,     0,     0,   174,  1424,   635,   211,
-       0,     0,   635,     0,     0,   257,     0,     8,     9,    10,
-      11,    12,     0,     0,     0,     0,     0,     0,   478,   776,
-       0,   409,     0,  1123,   935,   935,   337,     0,     0,   777,
-       0,     0,     0,     0,   109,    30,     0,     0,  1417,   653,
-       0,  1425,     0,     0,     0,  1217,   213,     0,     0,     0,
-       0,     0,   479,     0,     0,  1504,     0,  1504,     0,   174,
-     211,     0,     0,    33,   394,     0,     0,   348,     0,     0,
-       0,     0,   479,     0,   413,   414,     0,   728,   728,   418,
-     479,   420,   421,     0,     0,     0,  1464,     0,     0,     0,
-       0,  1468,  1504,     0,  1504,     0,     0,     0,   211,     0,
-       0,     0,   211,     0,     0,   958,   723,   609,     0,   429,
-       0,     0,     0,     0,     0,   959,     0,     0,   505,     0,
-     716,  1490,   322,     0,   737,   463,    63,   213,     0,     8,
-       9,    10,    11,    12,   429,   728,   728,     0,   429,     0,
-       0,     0,     0,     0,     0,     0,     0,     8,     9,    10,
-      11,    12,     0,   600,   607,     0,     0,    30,   749,    36,
-     753,   181,   182,    39,     0,   631,   632,   257,   348,     0,
-      40,    41,     0,     0,     0,    30,     0,   213,     0,     0,
-       0,     0,     0,     0,     0,    33,     0,     0,     0,   211,
-      36,     0,   181,   182,    39,     0,   697,     0,   409,     0,
-       0,    40,    41,    33,   698,     0,   699,  1559,    36,     0,
-     181,   182,    39,  1559,   818,     0,     0,     0,     0,    40,
-      41,     0,     0,     0,  1559,   174,     0,   608,  1559,   609,
-       0,     0,   635,   831,   935,   602,     0,   610,     0,     0,
-       0,     0,     0,     0,     0,   697,   850,   409,     0,     0,
-       0,   935,     0,     0,     0,   699,     0,     0,   174,     0,
-       0,     0,     0,     0,   602,     0,     0,     0,     0,   602,
-     211,     0,     0,     0,   174,   635,     0,  1329,   348,   348,
-     348,     0,     0,     0,     0,  1385,     0,   211,     0,   174,
-      36,     0,   181,   182,    39,     0,     0,   348,     0,     0,
-     213,    40,    41,     0,     0,     0,     0,     0,     0,   728,
-       0,     0,   891,     0,     0,   723,     0,   728,   728,   728,
-     211,     0,     0,     0,   935,   935,   479,   697,   213,   409,
-       0,   257,   737,   213,     0,   937,     0,   699,     0,     0,
-       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    72,     0,
-      25,    26,    27,     0,     0,   728,     0,     0,   479,    30,
-     452,   348,     0,   944,     0,     0,     0,     0,     0,   947,
-     963,     0,     0,   429,     0,    75,   174,     0,     0,    72,
-      36,     0,   181,   182,    39,     0,     0,    33,     0,     0,
-       0,    40,    41,     0,    37,    38,     0,   257,   737,     0,
-       0,     0,     0,   991,     0,     0,    75,     0,     0,     0,
-       0,   213,     0,     0,   220,     0,     0,  1529,     0,   409,
-       0,     0,     0,     0,     0,   213,     0,  1530,   485,     0,
-       0,   453,     0,   211,  1502,   710,  1506,     0,     0,   109,
-     723,   221,     0,     0,     0,     0,     0,     0,     0,     0,
-     723,     0,     0,   348,     0,   635,   820,   821,  1023,   635,
-     831,   211,     0,     0,     0,   723,   211,     0,     0,     0,
-       0,  1535,     0,  1537,     0,  1034,    36,     0,   181,   182,
-      39,     0,     0,     0,     0,     0,   855,    40,    41,   858,
-     859,     0,   862,     0,   864,   865,     0,     0,     0,   866,
-     867,     0,   351,   543,   544,   545,   546,   547,   548,   549,
-     550,   551,   552,   263,     0,     0,  1566,     0,  1567,   213,
-       0,     0,     0,   264,   951,     0,   952,    63,     0,   353,
-       0,  1574,  1575,   955,   956,     0,     0,   553,   961,     0,
-       0,     0,   174,     0,   653,     0,   411,     0,     0,   635,
-     966,  1060,     0,   419,   211,   970,     0,     0,     8,     9,
-      10,    11,    12,     0,     0,     0,     0,     0,   211,     0,
-       0,     0,     0,     0,     0,     0,   447,     0,     0,     0,
-       0,   999,     0,   942,   943,  1115,    30,     0,   505,   945,
-       0,     0,     0,   429,   115,     0,     0,    72,     0,     0,
-       0,     0,    72,     0,     0,     0,     0,     0,     0,     0,
-       0,   348,     0,     0,    33,     0,     0,     0,     0,    36,
-       0,   181,   182,    39,    75,   411,   600,     0,     0,    75,
-      40,    41,     0,     0,     0,     0,   124,   124,   124,     0,
-       0,     0,     0,   653,     0,     0,   602,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1529,     0,   409,   427,
-       0,     0,   211,     0,   723,   723,  1530,   348,   348,     0,
-       0,     0,     0,     0,     8,     9,    10,    11,    12,     0,
-       0,   583,     0,  1044,  1045,  1046,  1047,  1202,  1049,   587,
-       0,     0,   590,     0,     0,     0,     0,   220,     0,     0,
-       0,     0,    30,     0,  1093,     0,     0,   124,     0,   124,
-       0,   213,     0,     0,     0,     0,     0,     0,  1099,     0,
-       0,     0,   723,   723,   221,     0,     0,     0,   635,     0,
-      33,     0,     0,     0,   273,    36,     0,   181,   182,    39,
-       0,     0,     0,  1060,     0,     0,    40,    41,     0,     0,
-       0,     0,     0,     0,     0,   411,     0,  1114,     0,   419,
-       0,     0,     0,     0,    72,     0,     0,     0,     0,     0,
-       0,     0,   183,     0,     0,     0,     0,     0,     0,   351,
-       0,     0,   184,     0,    72,     0,   737,     0,     0,     0,
-     124,    75,    72,     0,     0,     0,     0,  1142,   124,     0,
-     124,   124,     0,     0,  1150,   124,   353,   124,   124,  1154,
-       0,    75,     0,     0,  1158,     0,  1159,     0,   351,    75,
-    1161,  1162,  1163,     0,     0,  1166,     0,     0,     0,  1298,
-       0,     0,     0,     0,  1178,     0,   351,     0,    72,   174,
-       0,     0,     0,     0,   411,   353,   257,     0,     0,  1297,
-       0,    63,  1193,  1194,   211,     0,     0,     0,     8,     9,
-      10,    11,    12,   353,   723,    75,   737,     0,     0,     0,
-     115,     0,     0,     0,     0,     0,     0,   124,     0,  1224,
-     351,     0,  1226,     0,     0,     0,    30,     0,     0,     0,
-     213,     0,     0,     0,     0,     0,   723,     0,     0,     0,
-       0,     0,     0,     0,   723,   723,   723,   353,     0,     0,
-       0,     0,     0,     0,    33,   348,   348,     0,     0,    36,
-    1241,   181,   182,    39,     0,     0,  1245,  1246,     0,  1202,
-      40,    41,     0,     0,     0,     0,   583,   583,  1257,     0,
-       0,     0,     0,  1261,     0,   351,  1265,     0,  1266,     0,
-       0,  1268,   723,     0,     0,     0,   263,     0,     0,     0,
-       0,     0,     0,   115,  1276,     0,   264,     0,     0,     0,
-       0,     0,   353,  1232,     0,     0,     0,  1283,     0,  1285,
-    1286,  1287,  1288,     0,     0,     0,   213,     0,     0,     0,
-     351,   351,   351,     0,     0,  1295,     0,  1296,     0,     0,
-       0,   170,     0,     0,     0,     0,     0,     0,     0,   351,
-       0,     0,     0,     0,     0,   174,     0,   353,   353,   353,
-       0,     0,     0,     0,     0,   910,     0,   351,     0,   913,
-    1324,  1325,     0,   211,     0,     0,   353,     0,    72,     0,
-     348,     0,    77,     0,   351,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   353,     0,     0,     0,     0,     0,
-       0,     0,   411,     0,     0,    75,   115,     0,     0,    84,
-       0,   353,     0,    77,     0,    54,    54,     0,     0,     0,
-      72,  1360,  1361,   351,     0,     0,     0,     0,     0,  1202,
-       0,  1371,     0,     0,     0,     0,  1202,  1320,     0,     0,
-      84,     0,     0,     0,     0,     0,    54,    75,   222,     0,
-     353,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     351,     0,     0,     0,     0,     0,     0,     0,     0,   211,
-       0,     0,     0,     0,     0,   223,     0,     0,    54,     0,
-       0,    54,     0,  1404,     0,     0,     0,   353,     0,  1202,
-       0,     0,     0,     0,     0,  1408,  1554,  1409,  1410,  1411,
-       0,     0,   351,     0,     0,     0,     0,     0,     0,  1415,
-       0,     0,   351,     0,     0,   351,     0,   583,  1426,     0,
-     220,     0,   351,     0,     0,     0,     0,   351,     0,   353,
-       0,     0,   124,   124,  1439,     0,   354,     0,     0,   353,
-       0,     0,   353,     0,     0,     0,     0,   221,     0,   353,
-       0,     0,     0,     0,   353,     0,     0,     0,     0,     0,
-       0,     0,   124,   361,     0,   124,   124,     0,   124,   346,
-     124,   124,     0,     0,     0,   124,   124,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    72,
-    1488,  1489,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1494,     0,     0,     0,     0,     0,     0,
-    1494,     0,     0,     0,     0,     0,    75,     0,     0,     0,
+      22,    23,    24,    25,   355,     0,    26,    27,    28,    29,
+       0,     0,    30,     0,     0,    31,    32,     0,     0,     0,
+       0,     0,   355,     0,    78,     0,     0,   354,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   352,     0,     0,
+      33,     0,     0,    34,     0,    35,     0,    36,    37,     0,
+      38,    39,    40,     0,     0,     0,     0,     0,    85,    41,
+      42,     0,     0,    85,     0,     0,   355,     0,  1034,     0,
+       0,     8,     9,    10,    11,    12,     0,     0,     0,     0,
+     354,   354,     0,   354,   354,    43,    73,    44,     0,     0,
+       0,     0,     0,    73,     0,    45,     0,     0,   281,   282,
+      31,   283,     0,    76,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,  -295,     0,     0,     0,   284,    34,     0,
+       0,   355,     0,   285,    31,     0,     0,   286,   354,   354,
+     287,   288,   289,   290,    41,    42,    73,   291,   292,     0,
+       0,     0,     0,     0,     0,   293,     0,     0,   224,     0,
+       0,     0,    34,     0,     0,     0,     0,     0,     0,     0,
+     294,     0,   378,  -295,     0,     0,   355,   355,   355,   296,
+     827,   298,   299,   300,   301,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   355,     0,     0,     0,     0,
+       0,     0,     0,   354,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   355,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    78,    85,     0,     0,     0,   164,
+     355,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     362,     0,     0,     0,     0,    85,   222,     0,   217,     0,
+       0,     0,     0,    85,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    78,     0,    76,   355,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   362,
+       0,     0,   354,     0,   354,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   164,     0,     0,   362,     0,    85,
+     271,     0,     0,     0,     0,     0,   355,     0,     0,     0,
+       0,     0,     0,     0,   354,     0,     0,     0,     0,     0,
+       0,     0,   354,   354,   354,     0,     0,     0,     0,   164,
+       0,     0,     0,   354,   354,     0,     0,     0,     0,   368,
+       0,   362,     0,   374,     0,     0,     0,    76,   355,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   355,     0,
+       0,   355,     0,     0,     0,     0,   223,     0,   355,     0,
+     354,     0,     0,   355,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,   164,     0,    26,    27,    28,     0,     0,     0,
+       0,     0,     0,    31,   217,     0,   362,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     411,    77,     0,     0,    54,     0,    77,     0,     0,     0,
-       0,     0,     0,  1528,     0,     0,     0,  1534,     0,     0,
-       0,     0,     0,     0,   124,     0,     0,     0,    84,   124,
-     124,     0,     0,    84,    54,   124,     0,     0,     0,     0,
-       0,     0,     0,   351,     0,     0,  1556,     0,  1557,     0,
+       0,     0,   164,   461,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,     0,     0,    78,     0,     0,   206,    39,
+       0,     0,     0,     0,     0,     0,   374,     0,     0,     0,
+       0,   362,   362,   362,   164,     0,     0,     0,   354,     0,
+       0,     0,     0,     0,   514,     0,   516,   519,     0,     0,
+     362,     0,     0,     0,   522,   523,     0,     0,   461,   516,
+     516,   164,     0,   270,     0,     0,     0,     0,   362,     0,
+       0,   516,     0,     0,     0,     0,     0,     0,     0,    85,
+       0,     0,     0,     0,     0,   362,     0,    76,   281,   282,
+       0,   283,     0,     0,    76,     0,     0,     0,     0,   355,
+       0,     0,     0,     0,     0,     0,     0,   516,   606,     0,
+       0,     0,     0,   630,     0,     0,     0,   284,     0,     0,
+       0,    85,     0,   285,   362,     0,     0,   286,     0,     0,
+     287,   288,   289,   290,    41,    42,     0,   291,   292,     0,
+       0,     0,     0,   516,     0,   293,     0,    76,     0,     0,
+       0,     0,   355,   355,     0,   355,   355,     0,     0,     0,
+     294,   362,   378,     0,     0,     0,     0,     0,   812,   296,
+     380,   298,   299,   300,   301,    78,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   210,     0,     0,     0,   164,
+     164,     0,     0,     0,     0,   230,   368,   234,     0,   236,
+       0,     0,     0,   362,     0,     0,   245,     0,     0,     0,
+     355,   355,     0,   362,     0,     0,   362,   461,     0,     0,
+     461,   224,     0,   362,     0,     0,     0,     0,   362,     0,
+       0,     0,     0,     0,     0,     0,     0,   210,     0,   234,
+     236,   245,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   741,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   164,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   355,     0,   461,     0,   461,
+     210,     0,   461,     0,   164,   461,     0,     0,     0,     0,
+      85,     0,     0,     0,     0,     0,     0,   368,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   223,     0,
+     516,   516,   516,   516,   516,   516,   516,   516,   516,   516,
+     516,   516,   516,   516,   516,   516,   516,   516,     0,     0,
+      78,   210,     0,   234,   236,   245,     0,     0,     0,     0,
+     164,     0,     0,     0,   355,     0,   355,     0,     0,     0,
+       0,     0,   368,   516,   606,     0,     0,   837,     0,     0,
+       0,     0,     0,     0,   362,     0,     0,     0,     0,   210,
+       0,     0,     0,   210,     0,     0,   355,     0,     0,     0,
+       0,     0,     0,   606,   355,   355,   355,     0,   606,   504,
+       0,     0,     0,     0,     0,   355,   355,   368,   368,   368,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    78,
+       0,     0,     0,     0,     0,     0,   368,   362,   362,     0,
+     362,   362,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   355,     0,     0,     0,     0,     0,     0,   210,
+      85,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   741,   516,     0,     0,     0,     0,     0,     0,     0,
+     210,     0,     0,     0,     0,   234,   236,   155,     0,     0,
+       0,     0,   461,   245,   516,   362,   362,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   516,     0,     0,
+     368,     0,   961,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,   250,     0,     0,   210,     0,     0,     0,
+     355,     0,    31,   255,     0,     0,     0,   741,     0,     0,
+       0,     0,     0,   516,   210,     0,     0,     0,     0,   210,
+     362,   210,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,     0,     0,     0,     0,     0,     0,   210,     0,
+       0,   210,   210,     0,     0,   516,     0,     0,     0,    78,
+       0,     0,     0,     0,     0,     0,    78,   210,     0,   155,
+     516,     0,   368,   224,     0,     0,   630,     0,     0,   368,
+       0,   210,     0,   385,     0,     0,     0,     0,   210,     0,
+       0,     0,     0,     0,     0,    85,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   417,     0,     0,   362,
+       0,   362,     0,     0,     0,     0,     0,     0,     0,    78,
+     432,     0,     0,     0,     0,     0,     0,     0,     0,   437,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   445,
+       0,   362,     0,     0,     0,     0,     0,     0,     0,   362,
+     362,   362,     0,     0,     0,     0,     0,     0,     0,     0,
+     362,   362,     0,     0,   471,     0,     0,     0,     0,   481,
+       0,     0,   461,     0,    85,     0,     0,     0,     0,     0,
+       0,     0,   489,     0,     0,     0,     0,     0,   499,     0,
+     503,   461,     0,     0,     0,     0,     0,   362,     0,     0,
+       0,     0,     0,     0,   210,     0,     0,     0,   533,     0,
+       0,     0,     0,     0,   164,     0,     0,     0,     0,     0,
+       0,   516,     0,     0,     0,     0,     0,     0,     0,     0,
+     368,     0,   210,     0,     0,     0,     0,   210,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   593,   516,     0,     0,     0,   598,     0,     0,     0,
+       0,     0,     0,     0,   516,   606,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   644,   362,   368,   368,   645,   646,
+       0,   648,     0,     0,     0,     0,     0,     0,   660,   661,
+       0,   662,   663,     0,   664,   516,   665,     0,     0,     0,
+       0,     0,  1178,     0,     0,     8,     9,    10,    11,    12,
+       0,     0,     0,   593,     0,   210,     0,     0,     0,     0,
+       0,   680,     0,     0,    85,     0,     0,     0,     0,   210,
+       0,    85,   281,   282,    31,   283,   461,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   691,     0,     0,   504,
+       0,     0,     0,     0,     0,     0,     0,   697,     0,     0,
+       0,   284,    34,     0,     0,     0,     0,   285,   516,     0,
+       0,   286,     0,     0,   287,   288,   289,   290,    41,    42,
+     733,   291,   292,     0,    85,     0,   736,     0,     0,   293,
+       0,   471,     0,     0,     0,     0,   741,     0,     0,     0,
+       0,     0,     0,     0,   294,     0,   378,     0,     0,     0,
+     210,     0,   516,   296,  1179,   298,   299,   300,   301,     0,
+       0,     0,     0,   210,     0,     0,   516,   516,   773,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   217,     0,
+       0,     0,   210,     0,   788,     0,     0,     0,     0,     0,
+       0,   204,     2,   205,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,   741,    26,    27,
+      28,   815,     0,     0,     0,     0,     0,    31,     0,     0,
+     825,     0,     0,     0,     0,     0,     0,   828,     0,     0,
+       0,     0,   835,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   850,     0,    34,     0,    35,     0,    36,
+      37,     0,   206,    39,    40,     0,   368,   368,     0,   210,
+       0,    41,    42,     0,     0,   217,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   890,   210,     0,    43,     0,   207,
+       0,     0,     0,     0,     0,     0,     0,   208,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   210,     0,     0,     0,     0,     0,     0,
+     835,     0,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,  -294,   210,    26,    27,    28,     0,
+       0,     0,     0,     0,     0,    31,   210,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   516,     0,     0,
+       0,     0,     0,     0,     0,   250,     0,     0,     0,     0,
+       0,   368,     0,    34,   516,   968,   969,     0,     0,     0,
+      38,    39,     0,     0,  -294,     0,     0,     0,     0,   986,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1001,     0,  1002,     0,
+       0,     0,  1006,     0,     0,   643,     0,   338,     0,     0,
+       0,     0,     0,     0,     0,   110,     0,     0,   210,   461,
+       0,   461,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   516,   516,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     281,   282,     0,   283,     0,     0,   461,     0,   461,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  1039,     0,
+       0,     0,     0,     0,     0,  1040,     0,     0,     0,   284,
+       0,     0,     0,     0,     0,   285,   164,     0,  1042,   286,
+    1043,     0,   287,   288,   289,   290,    41,    42,     0,   291,
+     292,     0,     0,     0,  1055,   210,     0,   293,     0,     0,
+       0,  1059,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   294,  1097,   378,     0,  1098,     0,     0,   781,
+       0,   296,   380,   298,   299,   300,   301,     0,     0,     0,
+       0,     0,     0,     0,   598,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   341,   363,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   413,     0,
+       0,     0,   210,     0,     0,   413,     0,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,  1162,    26,    27,    28,    29,     0,     0,
+      30,     0,     0,    31,    32,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,    26,    27,    28,    33,     0,
+       0,    34,     0,    35,    31,    36,    37,   413,    38,    39,
+      40,     0,     0,     0,     0,     0,     0,    41,    42,   533,
+       0,     0,     0,     0,     0,     0,  1227,     0,     0,     0,
+       0,     0,    34,     0,     0,     0,     0,     0,     0,    38,
+      39,     0,     0,    43,     0,    44,     0,     0,     0,  -523,
+       0,     0,     0,    45,     0,   321,  1241,     0,     0,     0,
+       0,  1243,     0,   413,     0,   345,     0,     0,     0,  1247,
+       0,   413,   589,     0,   413,   592,     0,   381,   381,     0,
+       0,     0,     0,     0,   363,     0,     0,     0,   622,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1273,     0,     0,     0,     0,     0,     0,   640,     0,     0,
+     341,     0,  1281,     0,     0,  1282,     0,  1283,     0,     0,
+     281,   282,     0,   283,     0,     0,     0,     0,     0,     0,
+       0,  1292,  1293,     0,     0,     0,     0,   413,     0,     0,
+       0,   413,     0,     0,     0,     0,     0,     0,   321,   284,
+       0,     0,     0,  1306,     0,   285,     0,     0,     0,   286,
+       0,     0,   287,   288,   289,   290,    41,    42,     0,   291,
+     292,     0,   363,   485,     0,     0,     0,   293,     0,     0,
+    1329,     0,     0,     0,     0,     0,     0,     0,   210,     0,
+       0,     0,   294,     0,   378,   413,     0,   993,     0,     0,
+       0,   296,   380,   298,   299,   300,   301,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   413,     0,     0,   363,
+       0,     0,     0,     0,     1,     2,   205,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,  -294,
+       0,    26,    27,    28,    29,     0,     0,    30,     0,   413,
+      31,     0,   341,   363,     0,     0,     0,     0,  1399,     0,
+    1400,     0,     0,     0,     0,     0,     0,     0,     0,   381,
+       0,     0,     0,  1409,     0,  1410,     0,     0,    34,     0,
+      35,     0,    36,     0,     0,    38,    39,     0,     0,  -294,
+       0,     0,     0,  1417,     0,     0,     0,     0,   413,   413,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  1435,
+    1437,     0,     0,     0,     0,     0,     0,   830,   363,     0,
+     363,  1443,    44,     0,  1247,     0,     0,     0,     0,   622,
+     110,   622,   622,     0,     0,     0,     0,     0,   622,     0,
+       0,     0,     0,     0,     0,     0,  1466,     0,   869,   363,
+       0,     0,     0,     0,   363,  1473,     0,     0,  1475,     0,
+    1477,  1479,  1481,   363,   363,   363,     0,     0,     0,     0,
+       0,   735,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   363,     0,     0,     0,     0,   413,   912,     0,
+       0,   413,   915,     0,     0,     0,     0,     0,   917,     0,
+       0,     0,  1512,     0,  1514,     0,     0,  1247,     0,     0,
+     769,     0,     0,     0,     0,     0,   341,   363,   413,     0,
+     413,     0,  1526,   782,   413,     0,     0,     0,     0,     0,
+     769,     0,     0,   769,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   792,   793,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   363,   622,     0,     0,
+       0,     0,     0,     0,     0,     0,   814,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   823,     0,     0,     0,
+       0,     0,     0,   345,     0,     0,     0,     0,   782,     0,
+       0,     0,   341,   363,     0,     0,     0,   413,   413,     0,
+       0,     0,     0,     0,     1,     2,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,    29,     0,     0,    30,   889,   413,
+      31,    32,     0,     0,     0,     0,     0,   381,   363,     0,
+       0,     0,     0,     0,   830,   363,     0,     0,     0,   622,
+       0,   622,     0,     0,     0,    33,     0,     0,    34,     0,
+      35,   622,    36,    37,     0,    38,    39,    40,     0,     0,
+       0,     0,     0,     0,    41,    42,     0,   345,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      43,     0,    44,     0,     0,     0,     0,     0,     0,     0,
+      45,     0,     0,     0,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,  -294,   830,    26,    27,    28,     0,     0,
+       0,     0,   413,     0,    31,     0,     0,     0,   413,     0,
+       0,     0,     0,   782,     0,   991,   413,     0,     0,     0,
+       0,   996,     0,     0,     0,     0,     0,     0,  1005,   622,
+     622,     0,    34,     0,     0,     0,     0,    37,     0,   336,
+     337,    40,     0,  -294,     0,     0,     0,     0,    41,    42,
+       0,     0,     0,     0,     0,     0,   363,     0,     0,     0,
+       0,     0,   413,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  1022,  1023,   643,   345,   338,     0,     0,     0,
+       0,   413,  1159,     0,   634,     0,     0,     0,     0,     0,
+     345,   363,     0,     0,     0,     0,     0,   413,  1171,     0,
+     622,   622,  1176,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   363,   363,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1053,     0,     0,     0,   381,     1,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,    29,     0,     0,    30,     0,
+       0,    31,     0,   830,   413,  1239,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   622,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
+       0,    35,     0,    36,     0,     0,    38,    39,     0,     0,
+     321,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1140,  1141,     0,     0,
+       0,     0,   363,   381,     0,     0,     0,   281,   282,   996,
+     283,     0,  1150,    44,   769,     0,     0,     0,     0,     0,
+       0,   110,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  1166,     0,   284,     0,     0,     0,
+       0,     0,   285,     0,     0,  1181,   286,     0,     0,   287,
+     288,   289,   290,    41,    42,     0,   291,   292,     0,     0,
+       0,     0,   341,     0,   293,   281,   282,   381,   283,  1199,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   294,
+       0,   378,     0,   363,   996,   996,     0,     0,   296,   380,
+     298,   299,   300,   301,   284,     0,     0,     0,     0,     0,
+     285,     0,     0,     0,   286,  1231,     0,   287,   288,   289,
+     290,    41,    42,     0,   291,   292,     0,     0,     0,     0,
+       0,     0,   293,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   363,   363,     0,     0,     0,   294,     0,   378,
+       0,     0,     0,     0,     0,     0,   296,   734,   298,   299,
+     300,   301,     0,   996,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   889,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1284,  1285,     0,
+       0,     0,     0,     0,     0,     1,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,    29,     0,     0,    30,   281,
+     282,    31,  1062,  1063,     0,  1064,     0,     0,  1065,  1066,
+    1067,  1068,  1069,  1070,  1071,  1072,     0,     0,     0,  1073,
+       0,     0,     0,  1074,  1075,     0,    33,   363,   284,    34,
+       0,    35,     0,    36,   649,     0,    38,    39,   286,   996,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,  1076,     0,     0,   170,     0,     0,     0,
+     296,   297,   298,   299,   300,   301,     0,     0,     0,     0,
+    1077,     0,     0,     0,  -129,     0,     0,     0,     0,     0,
+    1392,     0,   769,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   413,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,   413,   413,     0,     0,     0,    31,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   413,     0,     0,
+       0,     0,     0,     0,     0,    34,     0,     0,     0,     0,
+       0,     0,   206,    39,     0,     0,     0,     0,  1452,     0,
+       0,     0,     0,     0,     0,     1,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,    29,     0,   629,    30,   281,
+     282,    31,   283,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,   284,    34,
+       0,    35,    31,    36,   285,     0,    38,    39,   286,     0,
+    1518,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+      34,     0,     0,     0,     0,   109,     0,    38,    39,     0,
+       0,   294,     0,  1076,     0,     0,    41,    42,     0,     0,
+     296,   297,   298,   299,   300,   301,     0,     0,     0,     0,
+       0,     0,   321,     0,  -129,     1,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,    29,     0,     0,    30,   281,
+     282,    31,   283,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,   284,    34,
+       0,    35,    31,    36,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+      34,     0,     0,     0,     0,     0,     0,   206,    39,     0,
+       0,   294,     0,    44,     0,     0,     0,     0,     0,     0,
+     296,   297,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   343,     0,     0,     0,     0,   781,     0,
+     296,   344,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   931,     0,     0,     0,     0,   781,     0,
+     296,   344,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   931,     0,     0,     0,     0,   781,     0,
+     296,   600,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   343,     0,     0,     0,     0,     0,     0,
+     296,   344,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   931,     0,     0,     0,     0,     0,     0,
+     296,   344,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,   206,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,  1020,     0,     0,     0,     0,     0,     0,
+     296,  1021,   298,   299,   300,   301,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,    35,     0,    36,   285,     0,   206,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   378,     0,     0,     0,     0,     0,     0,
+     296,   380,   298,   299,   300,   301,   204,     2,   205,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+       0,     0,    31,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,    35,     0,    36,     0,     0,   206,    39,     0,
+       2,   205,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,     0,     0,   207,    31,     0,     0,     0,     0,
+       0,     0,   270,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,    35,     0,    36,    37,     0,
+     206,    39,    40,     0,     0,     0,     0,     0,     0,    41,
+      42,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    43,     0,   207,     0,     0,
+       0,     0,     0,     0,     0,   208,     2,   205,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,     0,
+       0,    31,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,    34,
+       0,    35,     0,    36,     0,    31,    38,    39,     0,     2,
+     205,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    34,     0,    26,    27,    28,   109,     0,
+      38,    39,  -402,   687,    31,     0,     0,     0,     0,    41,
+      42,   634,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,    35,     0,    36,    44,     0,    38,
+      39,     0,     0,     0,     0,   110,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1371,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   687,     0,     0,     0,
+       0,     0,     0,     0,   634,     2,   205,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
+      31,     0,     0,     0,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,  -294,     0,    26,    27,    28,    34,     0,
+      35,     0,    36,     0,    31,    38,    39,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1373,     0,     0,
+       0,     0,    34,     0,     0,     0,     0,    37,     0,   336,
+     337,    40,   687,  -294,     0,     0,     0,     0,    41,    42,
+     634,     2,   205,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,   338,    26,    27,    28,
+       0,     0,     0,     0,   110,     0,    31,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    34,     0,    35,     0,    36,     0,
+       0,   206,    39,     0,     2,   205,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,     0,     0,     0,   269,    31,
+       0,     0,     0,     0,     0,     0,   629,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    34,     0,    35,
+       0,    36,     0,     0,    38,    39,     0,     2,   205,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+       0,   687,    31,     0,     0,     0,     0,     0,     0,   634,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,    35,     0,    36,     0,     0,    38,    39,     0,
+       2,   205,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,     0,     0,   599,    31,     0,     0,     0,     0,
+       0,     0,   634,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,    35,     0,    36,     0,     0,
+     206,    39,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,   281,
+     282,    31,   283,     0,     0,     0,     0,   207,     0,     0,
+       0,     0,     0,     0,     0,   270,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   284,    34,
+       0,     0,     0,     0,   285,     0,    38,    39,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   525,     0,     0,   170,     0,     0,     0,
+     296,   297,   298,   299,   300,   301,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,     0,   281,   282,    31,   283,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,   284,    34,     0,     0,    31,     0,   285,     0,
+      38,    39,   286,     0,     0,   287,   288,   289,   290,    41,
+      42,     0,   291,   292,     0,     0,     0,     0,     0,     0,
+     293,     0,     0,     0,    34,     0,     0,     0,     0,    37,
+       0,   336,   337,    40,     0,   294,     0,   599,    -3,     0,
+      41,    42,     0,     0,   296,   600,   298,   299,   300,   301,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,   338,     0,
+      26,    27,    28,     0,     0,     0,   110,   281,   282,    31,
+     283,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,     0,   284,    34,     0,     0,
+      31,   453,   649,     0,    38,    39,   286,     0,     0,   287,
+     288,   289,   290,    41,    42,     0,   291,   292,     0,     0,
+       0,     0,     0,     0,   293,     0,     0,     0,    34,     0,
+       0,     0,     0,     0,     0,    38,    39,     0,     0,   294,
+     -35,   766,     0,     0,     0,     0,     0,     0,   296,   297,
+     298,   299,   300,   301,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,   454,     0,    26,    27,    28,     0,     0,     0,
+     110,   281,   282,    31,   283,     0,     0,     0,     0,     0,
        0,     0,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,     0,
-     353,    25,    26,    27,     0,     0,  1572,  1573,     0,  1156,
-      30,   452,     0,     0,  1576,  1577,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1168,   351,   351,     0,   351,
-     351,   222,     0,     0,     0,     0,     0,     0,    33,     0,
-       0,     0,     0,     0,     0,    37,    38,     0,     0,    72,
-       0,     0,     0,   353,   353,     0,   353,   353,   223,     8,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+     284,    34,    26,    27,    28,     0,   285,     0,    38,    39,
+     286,    31,     0,   287,   288,   289,   290,    41,    42,     0,
+     291,   292,     0,     0,     0,     0,     0,     0,   293,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
+       0,     0,     0,   294,     0,   295,    38,    39,     0,     0,
+       0,     0,   296,   297,   298,   299,   300,   301,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,   643,     0,   338,     0,   281,   282,    31,   283,     0,
+       0,   110,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,   284,    34,    26,    27,    28,     0,
+     285,     0,    38,    39,   286,    31,     0,   287,   288,   289,
+     290,    41,    42,     0,   291,   292,     0,     0,     0,     0,
+       0,     0,   293,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,     0,     0,   294,     0,   156,
+      38,    39,     0,     0,     0,     0,   296,   297,   298,   299,
+     300,   301,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,   643,     0,   338,     0,   281,
+     282,    31,   283,     0,     0,   634,     0,     0,     0,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,   284,    34,
+      26,    27,    28,     0,   285,     0,    38,    39,   286,    31,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    34,     0,     0,
+       0,   294,     0,   599,    38,    39,     0,     0,     0,     0,
+     296,   600,   298,   299,   300,   301,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,   256,     0,   281,   282,    31,   283,     0,     0,   110,
+       0,     0,     0,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,   284,    34,    26,    27,    28,     0,   285,     0,
+      38,    39,   286,    31,     0,   287,   288,   289,   290,    41,
+      42,     0,   291,   292,     0,     0,     0,     0,     0,     0,
+     293,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,     0,     0,   294,     0,   378,    38,    39,
+       0,     0,     0,     0,   296,   380,   298,   299,   300,   301,
+     474,     2,   205,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,   156,     0,    26,    27,    28,
+       0,     0,     0,   110,     0,     0,    31,     0,     0,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,    34,     0,    35,     0,    36,    31,
+       0,    38,    39,     0,     0,     0,     0,     0,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,    34,    26,    27,
+      28,     0,    37,     0,    38,    39,    40,    31,     0,     0,
+       0,    -3,     0,    41,    42,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,    34,    26,    27,    28,    43,
+      37,   156,    38,    39,    40,    31,     0,     0,     0,    45,
+       0,    41,    42,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,    34,    26,    27,    28,    43,    37,    44,
+     206,    39,    40,    31,     0,     0,     0,    45,     0,    41,
+      42,     0,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    -294,    34,    26,    27,    28,    43,    37,   269,   336,   337,
+      40,    31,     0,     0,     0,   208,     0,    41,    42,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
+       0,     0,     0,   643,     0,   338,    38,    39,     0,     0,
+    -294,     0,     0,   634,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
+       0,   643,     0,   338,    31,   453,     0,     0,     0,     0,
+       0,   634,     0,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,  -294,    34,    26,    27,    28,     0,     0,     0,    38,
+      39,     0,    31,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+      34,     0,    31,   453,     0,     0,   454,    38,    39,     0,
+     711,  -294,     0,     0,   110,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,     0,     0,     0,     0,     0,    38,    39,     0,
+       0,     0,     0,     0,   338,     0,     0,     0,     0,     0,
+       0,     0,   110,     0,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,   454,    26,    27,    28,  1109,     0,
+       0,     0,   110,     0,    31,   453,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
+       0,     0,    34,     0,     0,    31,     0,     0,     0,    38,
+      39,     0,     0,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,    34,    26,    27,    28,     0,     0,     0,
+     206,    39,     0,    31,     0,     0,   454,     0,     0,     0,
+    1236,     0,     0,     0,   110,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,     0,     0,     0,     0,   269,    38,    39,
+       0,     0,     0,     0,     0,   270,     0,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,     0,     0,     0,   256,    31,     0,     0,     0,
+       0,     0,     0,   634,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,    34,    26,    27,    28,     0,     0,
+       0,    38,    39,     0,    31,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
+       0,     0,    34,     0,    31,     0,     0,     0,   338,    38,
+      39,     0,     0,     0,     0,     0,   634,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,     0,     0,     0,     0,     0,   206,
+      39,     0,     0,     0,     0,     0,   454,     0,     0,     0,
+       0,     0,     0,     0,   110,     0,     0,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,   269,    26,    27,    28,
+       0,     0,     0,     0,   629,     0,    31,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,     0,     0,    34,     0,    31,     0,     0,     0,
+       0,    38,    39,     0,     0,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,    34,    26,    27,    28,     0,     0,
+       0,    38,    39,     0,    31,     0,     0,     0,   599,     0,
+       0,     0,     0,     0,     0,     0,   634,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,     0,     0,     0,     0,   338,    38,
+      39,     0,     0,     0,     0,     0,   110,     2,   205,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,    44,     0,     0,     0,
+       0,     0,    31,     0,   110,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,    35,     0,    36,     0,     0,    38,    39,   281,
+     282,     0,   283,  1063,     0,  1064,     0,     0,  1065,  1066,
+    1067,  1068,  1069,  1070,  1071,  1072,     0,     0,  1551,  1073,
+       0,     0,     0,  1074,  1075,     0,    33,     0,   284,     0,
+       0,     0,     0,  -415,   649,     0,     0,     0,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,     0,   291,   292,
+       0,     0,     0,     0,     0,     0,   293,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   294,     0,   378,     0,     0,   170,     0,     0,     0,
+     296,   380,   298,   299,   300,   301,     0,     0,     0,     0,
+    1077,     0,   281,   282,  -129,   283,  1063,     0,  1064,     0,
+       0,  1065,  1066,  1067,  1068,  1069,  1070,  1071,  1072,     0,
+       0,     0,  1073,     0,     0,     0,  1074,  1075,     0,    33,
+       0,   284,     0,     0,     0,     0,     0,   649,     0,     0,
+       0,   286,     0,     0,   287,   288,   289,   290,    41,    42,
+       0,   291,   292,     0,     0,     0,     0,     0,     0,   293,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   294,     0,   378,     0,     0,   170,
+       0,     0,     0,   296,   380,   298,   299,   300,   301,     0,
+       0,     0,     0,  1077,     0,     0,     0,  -129,     2,   205,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
+       0,     0,     0,    31,     0,   281,   282,     0,   283,  1063,
+       0,  1064,  1421,  1422,  1065,  1066,  1067,  1068,  1069,  1070,
+    1071,  1072,     0,     0,  1551,  1073,     0,     0,     0,  1074,
+    1075,    34,    33,    35,   284,    36,     0,     0,    38,    39,
+     649,     0,     0,     0,   286,     0,     0,   287,   288,   289,
+     290,    41,    42,     0,   291,   292,     0,     0,     0,     0,
+    1330,     0,   293,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   294,     0,   378,
+       0,     0,   170,     0,     0,     0,   296,   380,   298,   299,
+     300,   301,     0,     0,   281,   282,  1077,   283,  1063,     0,
+    1064,  1421,  1422,  1065,  1066,  1067,  1068,  1069,  1070,  1071,
+    1072,     0,     0,     0,  1073,     0,     0,     0,  1074,  1075,
+       0,    33,     0,   284,     0,     0,     0,     0,     0,   649,
+       0,     0,     0,   286,     0,     0,   287,   288,   289,   290,
+      41,    42,     0,   291,   292,     0,     0,     0,     0,     0,
+       0,   293,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   294,     0,   378,     0,
+       0,   170,     0,     0,     0,   296,   380,   298,   299,   300,
+     301,     0,     0,   281,   282,  1077,   283,  1063,     0,  1064,
+       0,     0,  1065,  1066,  1067,  1068,  1069,  1070,  1071,  1072,
+       0,     0,     0,  1073,     0,     0,     0,  1074,  1075,     0,
+      33,     0,   284,     0,     0,     0,     0,     0,   649,     0,
+       0,     0,   286,     0,     0,   287,   288,   289,   290,    41,
+      42,     0,   291,   292,     0,     0,     0,     0,     0,     0,
+     293,   281,   282,     0,   283,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   294,     0,   378,     0,     0,
+     170,     0,     0,     0,   296,   380,   298,   299,   300,   301,
+     284,     0,     0,     0,  1077,     0,   649,     0,     0,     0,
+     286,     0,     0,   287,   288,   289,   290,    41,    42,     0,
+     291,   292,     0,     0,     0,     0,     0,     0,   293,   281,
+     282,     0,   283,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   294,     0,   785,     0,     0,   281,   282,
+       0,   283,   296,   380,   298,   299,   300,   301,   284,     0,
+       0,     0,     0,     0,   285,     0,     0,     0,   286,     0,
+       0,   287,   288,   289,   290,    41,    42,   284,   291,   292,
+       0,     0,     0,   285,     0,     0,   293,   286,     0,     0,
+     287,   288,   289,   290,    41,    42,     0,   291,   292,     0,
+       0,   294,     0,   378,     0,   293,   281,   282,     0,   283,
+     296,   827,   298,   299,   300,   301,     0,     0,     0,     0,
+     513,     0,     0,     0,     0,   281,   282,     0,   283,   296,
+     380,   298,   299,   300,   301,   284,     0,     0,     0,     0,
+       0,   285,     0,     0,     0,   286,     0,     0,   287,   288,
+     289,   290,    41,    42,   284,   291,   292,     0,     0,     0,
+     285,     0,     0,   293,   286,     0,     0,   287,   288,   289,
+     290,    41,    42,     0,   291,   292,     0,     0,   294,     0,
+       0,     0,   293,   281,   282,     0,   283,   296,   380,   298,
+     299,   300,   301,     0,     0,     0,     0,   518,     0,     0,
+       0,     0,     0,     0,     0,     0,   296,   380,   298,   299,
+     300,   301,   284,     0,     0,     0,     0,     0,   285,     0,
+       0,     0,   286,     0,     0,   287,   288,   289,   290,    41,
+      42,     0,   291,   292,     0,     0,     0,     0,     0,     0,
+     293,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   521,     0,     0,     0,     0,
+       0,     0,     0,     0,   296,   380,   298,   299,   300,   301,
+       2,   205,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    34,     0,    35,     0,    36,    37,     0,
+     173,   174,    40,     0,     0,     0,     0,     0,     0,    41,
+      42,   204,     2,   205,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,     0,     0,     0,     0,    31,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
+       0,     0,   206,    39,   474,     2,   205,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
+      31,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
+      35,     0,    36,     0,     0,    38,    39,     2,   205,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+       0,     0,    31,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,   492,   493,   494,
+      34,     0,    35,    31,    36,     0,     0,   206,    39,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,     0,     0,     0,     0,     0,    38,    39
+};
+
+#define yypact_value_is_default(yystate) \
+  ((yystate) == (-1332))
+
+#define yytable_value_is_error(yytable_value) \
+  YYID (0)
+
+static const yytype_int16 yycheck[] =
+{
+       0,     1,     0,   203,   184,   184,   520,   698,   238,    43,
+     115,   184,     1,   698,    43,    43,   543,   185,   629,     0,
+     104,   218,   184,   280,   185,   456,   455,   698,   348,    29,
+      30,   184,    32,   184,    32,  1062,   184,   902,   167,   168,
+     609,   348,     1,    43,   656,    45,   278,    45,  1043,   611,
+    1006,    32,  1042,  1043,    32,    55,   497,     0,   759,   611,
+      28,    61,   612,    61,    64,   609,    64,    67,   618,    67,
+     154,   609,   499,   579,  1340,   718,   503,   999,    67,   609,
+     609,    81,    82,   780,   264,   264,   777,    51,   186,    32,
+    1421,   264,   777,   609,    82,   200,  1425,   265,   344,  1055,
+     529,    39,   264,   902,   265,   105,   777,     0,   108,    39,
+      78,   264,   417,   264,   609,   115,   264,     0,    43,    72,
+      43,    45,   363,   643,   644,   645,   367,   489,    44,    45,
+      83,    84,   437,    64,     0,    43,    82,    39,   227,    32,
+     445,    39,   662,    44,    45,   109,   146,    95,   146,    32,
+     184,     0,     1,    39,   154,   184,   184,   246,   111,   159,
+      63,   159,   260,   261,  1495,   111,    32,    44,    45,  1477,
+     109,    64,   613,   111,    85,   495,   617,  1443,   109,   109,
+      30,   111,   130,    32,   184,   185,   110,   185,     4,     5,
+       6,     7,     8,     9,  1523,   109,    39,   638,   114,  1528,
+     200,   642,   113,   255,  1512,    39,  1514,   109,   208,   111,
+     208,   294,   409,   114,   744,    64,   736,   217,    67,  1548,
+     220,   145,   220,   109,   902,   111,  1555,   227,   744,   132,
+     264,    81,    82,    96,    82,   264,   264,   405,   115,    11,
+     644,   645,   242,   489,   405,    82,   246,   109,  1243,   744,
+     250,   251,   250,    69,   511,    71,   112,   341,   662,   184,
+     123,   184,   110,  1062,   264,   265,   109,   265,   111,   250,
+     839,   271,   250,     0,     1,   109,   184,   111,   278,  1306,
+     117,   643,   644,   645,   208,   928,   370,   455,     0,   851,
+     395,   841,   251,   293,   455,   839,   114,   107,  1293,   851,
+     662,   839,  1292,  1293,   611,    32,     3,   250,   828,   839,
+     839,    82,  1009,   819,   238,   110,   132,   116,   423,   487,
+      32,   131,   117,   839,   429,   116,   487,   220,   328,   116,
+     328,    43,   736,    45,   293,   697,    82,  1259,   109,   951,
+      67,   132,   425,   426,   839,   132,   270,   347,   348,    61,
+     425,   426,    64,   116,   600,    67,   597,   250,   699,    55,
+      90,    91,  1227,   109,   364,   417,    72,   250,   368,   132,
+    1071,   220,   255,   297,   736,  1074,  1075,    83,    84,   379,
+     721,   109,   110,   629,   250,   437,   691,  1065,   634,   255,
+     959,    96,   242,   445,   109,   395,   126,   127,   960,   640,
+     110,   250,    72,   109,     3,   405,   116,   405,    82,   105,
+    1021,   773,   108,    83,    84,   959,   131,   116,   123,   676,
+     344,   959,  1417,   423,   828,   109,   501,  1417,  1227,   429,
+     513,   431,   873,    68,   146,   518,   110,    72,   521,  1466,
+      75,  1528,    77,   117,  1143,   520,  1473,   159,   532,    84,
+    1528,   697,    72,  1409,  1410,   455,   349,   121,   122,    72,
+     460,  1548,   132,    83,    84,   109,   828,   111,  1555,   116,
+      83,    84,   184,   185,   474,   119,   110,  1555,   116,   479,
+    1030,  1031,   699,   117,   112,   132,     0,   487,   116,   487,
+    1004,   491,   575,   491,   132,   495,   208,   131,   498,  1526,
+     500,   425,   426,     0,   721,   762,   119,  1306,   220,   938,
+     491,   586,   132,    88,    89,   474,   947,   946,   698,   698,
+     520,   217,   131,   250,   965,   698,   758,   773,   657,   379,
+    1142,   851,   700,    80,   417,   109,   698,   537,   250,   700,
+     540,   968,   542,   543,   851,   698,    72,   698,   491,  1227,
+     698,   417,   264,   116,   437,  1117,   109,    83,    84,   664,
+     110,   520,   445,   992,   111,   109,   113,   117,   666,   132,
+     117,   437,   115,   116,   110,   271,   211,   501,   537,   445,
+     116,   540,   278,   542,   543,   111,   109,   480,   131,   830,
+     590,   116,     3,   834,   109,   812,   520,   597,   491,    10,
+      11,    12,    13,    14,   109,  1306,   489,   132,   491,   609,
+     460,   611,   696,   116,    53,    72,   328,   598,   116,     4,
+       5,     6,     7,     8,     9,   491,    83,    84,    39,   132,
+     630,   590,   110,   116,   132,   119,   348,   978,   116,   691,
+     124,   125,   491,   112,   964,  1323,   646,   116,   498,   132,
+     500,   347,   652,   116,   111,   110,    67,    96,     0,     1,
+    1498,   661,   586,   663,   664,   665,  1504,  1466,   364,   132,
+      80,  1102,   368,   890,  1473,   129,   600,   131,   116,   116,
+    1042,   733,  1383,   924,    69,    72,    71,  1525,   772,   110,
+      32,   888,  1530,   405,   132,   132,    83,    84,   698,  1377,
+     700,   111,  1380,   113,   663,   629,   665,   117,   112,   109,
+     634,   111,   909,   713,   116,   110,   351,   112,   353,   719,
+     110,   116,    64,   723,   111,    67,   116,  1526,   110,   110,
+     132,   731,    45,   110,   116,   116,   131,   132,   631,   109,
+     970,   111,   110,   455,   744,   745,   112,  1425,    61,   119,
+     116,    64,  1430,   192,    67,   112,    72,   110,   758,   116,
+      76,   978,    72,   116,   491,   894,    76,    83,    84,  1470,
+     938,  1472,   731,    83,    84,  1021,   215,   938,   946,   491,
+     112,   110,  1460,   495,   116,   946,   225,    10,    11,    12,
+      13,    14,  1009,   109,  1135,  1322,    92,    93,   110,   109,
+    1162,   111,   652,   119,   116,   110,   441,    72,   691,   119,
+     109,   116,   111,   155,   697,   109,    39,   111,    83,    84,
+      10,    11,    12,    13,    14,   691,  1527,   109,   109,   111,
+     513,   724,   515,   146,  1034,   518,  1133,   119,   521,   839,
+    1137,  1532,  1059,   110,    67,   738,   159,  1532,   109,    39,
+     733,   851,  1193,  1194,   835,   294,   115,   116,   110,   110,
+     110,  1532,  1103,   713,   116,   116,   116,   733,  1546,   719,
+     116,   117,   185,   723,  1552,   115,  1133,    67,   220,   109,
+    1137,  1138,   109,   110,   111,  1563,   109,   132,   111,  1567,
+     773,   703,   110,   705,   894,   208,   119,   609,   116,   611,
+      72,   901,   902,   110,    76,   110,   111,   220,   250,   116,
+      64,    83,    84,   110,     1,   109,  1162,   111,  1135,   116,
+      72,   902,    74,    75,   924,    85,    86,    87,  1057,   109,
+    1292,    83,    84,    72,   630,    74,    75,   109,   938,   832,
+      58,    59,   110,   902,    83,    84,   946,   119,   116,   109,
+     646,   111,   109,   113,   114,   110,   112,   109,    45,   132,
+     110,   116,   114,   110,   964,   661,   116,   115,   116,   116,
+     109,   114,   109,   680,   111,   114,  1193,  1194,   114,    72,
+     969,    74,    75,    76,   984,   109,   698,   111,   700,   114,
+      83,    84,   109,   993,   111,   109,  1253,  1243,   109,   110,
+     111,  1001,   132,   442,  1004,   109,  1006,   111,    82,   902,
+      72,   132,    74,    75,   109,   328,   109,   104,   111,   902,
+    1125,    83,    84,   110,   117,   984,   119,    72,   109,    74,
+      75,    82,   744,   745,   116,   117,   902,   476,    83,    84,
+     112,   109,  1001,   111,   894,  1004,   970,  1006,   109,   110,
+     111,   901,   114,   902,   120,  1055,   116,   117,   145,   109,
+     110,   111,   758,  1404,   128,  1065,   111,   154,  1068,  1069,
+    1070,    58,    59,    60,   513,  1265,  1266,  1267,  1507,   518,
+    1421,  1062,   521,    72,  1341,    74,    75,    76,  1345,   129,
+     432,    94,   405,  1093,    83,    84,  1055,  1021,    44,    45,
+      10,    11,    12,    13,    14,   131,  1065,   111,   815,  1068,
+    1069,  1070,   564,   565,   566,   567,   109,   204,   825,   109,
+     969,   208,   110,  1206,  1207,  1125,  1209,   839,  1557,    39,
+     112,  1024,  1215,   840,    72,  1218,    74,    75,  1222,   851,
+     560,   561,   112,   993,   110,    83,    84,   562,   563,   491,
+     110,   238,   239,  1494,  1495,   110,    72,    67,    74,    75,
+      76,   110,    72,   110,    74,    75,    76,    83,    84,  1062,
+     568,   569,   109,    83,    84,   902,   112,   111,   131,  1062,
+     112,   114,   109,   270,   114,   116,   273,  1404,   114,   112,
+    1447,   533,   110,   109,    45,   111,  1062,   110,   112,   109,
+    1200,   111,   117,   119,  1421,   112,   112,   294,   112,   119,
+     297,    29,   117,  1062,   117,   116,  1205,   110,   110,   114,
+     117,   112,  1222,   110,   132,   115,   938,  1227,     3,   115,
+     115,   109,   116,   110,   946,    10,    11,    12,    13,    14,
+     679,   110,   969,  1093,   116,   110,  1227,   117,   110,   688,
+     110,   110,   964,   692,   341,   116,   598,   344,  1247,   110,
+     110,   110,     3,   110,    39,  1265,  1266,  1267,  1227,    10,
+      11,    12,    13,    14,   110,   110,   363,  1494,  1495,  1162,
+     367,   110,   110,   370,    10,    11,    12,    13,    14,   110,
+     110,   110,    67,   110,   110,  1400,  1379,   110,    39,    29,
+     115,   643,   644,   645,   131,   112,  1265,  1266,  1267,   110,
+     110,  1204,  1542,    39,   110,   110,   114,   116,   112,   112,
+     662,   110,  1322,  1323,   110,  1306,    67,   110,   116,   110,
+     117,   116,  1039,  1040,  1227,  1062,   116,   116,   425,   426,
+     112,    67,   116,   110,  1227,   110,   112,    85,    86,    87,
+    1200,  1340,  1532,  1532,   109,  1204,  1205,   208,   109,  1532,
+    1243,  1227,   109,  1322,  1323,  1533,   453,   109,   112,   456,
+    1532,   109,  1533,   111,   109,   113,   114,  1377,  1227,  1532,
+    1380,  1532,   132,   109,  1532,   111,   117,   474,   239,  1557,
+    1097,  1098,   115,   119,   736,   110,  1557,   110,  1247,  1399,
+    1400,   115,  1507,   110,   129,   115,   114,   112,  1301,  1409,
+    1410,   132,   499,  1306,   501,   110,   503,   116,  1377,   270,
+     112,  1380,   116,  1306,   112,  1425,   513,   110,   515,   110,
+    1430,   518,   110,   520,   521,   112,   471,   112,   112,   110,
+    1306,    47,   112,   294,   112,   532,   297,   112,  1448,   115,
+    1409,  1410,  1301,   132,  1443,   110,   132,  1306,   115,   132,
+    1460,   117,   110,   132,   115,   132,  1425,   112,   112,   112,
+     112,  1430,    72,   112,    74,    75,    76,   112,  1205,   112,
+     112,   110,   110,    83,    84,  1466,   828,   926,   112,  1448,
+     112,  1340,  1473,   835,     0,     1,   109,   109,  1532,   586,
+    1227,  1460,   109,  1532,  1532,    60,   110,  1507,  1508,   109,
+     597,   111,    55,   600,   110,   114,   132,  1517,   112,   119,
+    1247,   112,   117,  1523,   110,   112,    32,   110,  1528,    96,
+      96,   109,  1532,  1533,   109,  1533,   115,   110,   112,    45,
+     132,   110,   629,    42,   116,  1526,  1546,   634,  1548,  1508,
+     110,   110,  1552,   640,   117,  1555,   132,  1557,  1517,  1557,
+     902,    67,   105,  1563,  1523,   108,  1273,  1567,   132,  1528,
+     110,   110,    96,  1466,  1281,  1282,  1283,    96,   132,  1306,
+    1473,   110,   110,  1466,   132,   117,   132,  1546,   110,  1548,
+    1473,   112,   110,  1552,  1443,   115,  1555,   132,   104,   112,
+    1466,   109,   453,   115,  1563,   456,   132,  1473,  1567,   696,
+     115,   154,   110,  1340,    64,   110,   132,  1466,  1542,   110,
+     110,  1077,  1329,   571,  1473,   570,  1227,   969,   572,    64,
+      64,   718,   573,  1526,  1073,   574,  1495,  1385,  1567,    74,
+     146,  1316,  1138,  1526,   986,   680,  1473,    81,   154,   155,
+    1345,  1093,   705,   946,     4,     5,     6,     7,     8,     9,
+    1526,   748,   513,   453,   515,   471,   116,   518,   723,   453,
+     521,   948,   993,   590,   217,   894,   966,  1526,   658,   185,
+    1247,   116,   116,    33,   578,   772,   491,   758,    10,    11,
+      12,    13,    14,    -1,   200,   578,   748,   203,   204,   578,
+    1042,  1043,   208,  1399,    -1,    -1,    -1,    -1,    -1,   159,
+      -1,    -1,    -1,    -1,    -1,    -1,  1443,    39,    -1,    69,
+    1062,    71,    -1,   229,   159,   159,    -1,   233,   271,   235,
+      72,    -1,    74,    75,    76,   278,    -1,    -1,   244,  1466,
+      -1,    83,    84,   830,   250,    67,  1473,   834,    -1,   255,
+      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,   265,
+      -1,    83,    84,    -1,    -1,    -1,    -1,   273,   283,    -1,
+     220,    -1,    -1,    -1,    -1,    -1,    26,    27,    28,    -1,
+     815,   296,   297,    -1,    -1,   220,   220,   109,    -1,   111,
+     825,    -1,    -1,   308,    -1,    -1,    -1,   119,    -1,  1526,
+      -1,    -1,    -1,    -1,   347,   840,    -1,    -1,   258,    -1,
+      -1,    -1,   262,    10,    11,    12,    13,    14,    -1,    -1,
+    1532,   364,    -1,   258,   258,   368,    -1,   262,   262,   344,
+      -1,    -1,    -1,    -1,    -1,   341,    -1,   924,   344,    -1,
+      -1,   928,    39,   278,   350,    -1,    -1,    97,    -1,    99,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   363,    -1,    -1,
+     947,   367,  1204,  1205,   370,   380,    -1,   718,    -1,    -1,
+      67,    -1,    -1,    -1,   680,    72,  1315,    74,    75,    76,
+      -1,   968,   969,   970,    -1,  1227,    83,    84,   431,    -1,
+      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,   349,
+      -1,    83,    84,    -1,    -1,  1247,    72,    -1,    74,    75,
+      76,   417,   109,    -1,   349,   349,    -1,    83,    84,    -1,
+      -1,    72,   119,    74,    75,    76,   432,   109,    -1,   111,
+     180,   437,    83,    84,  1021,    -1,    -1,   119,    -1,   445,
+     190,   191,    -1,   109,    -1,   195,    -1,   197,   198,    -1,
+    1292,  1293,    -1,   119,    -1,    -1,    -1,    -1,   109,  1301,
+      -1,    -1,    -1,    -1,  1306,   471,    -1,    -1,   474,    -1,
+      51,    -1,    53,    -1,    -1,    56,    57,    58,    -1,    60,
+     430,    -1,    -1,   489,    -1,   491,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   499,    75,   430,   430,   503,  1340,    10,
+      11,    12,    13,    14,  1039,  1040,    87,    88,    -1,   815,
+      -1,    -1,   447,    -1,    -1,  1102,  1103,    -1,    -1,   825,
+      72,    -1,    74,    75,    76,    -1,   532,   533,    39,    -1,
+     480,    83,    84,    -1,   840,  1474,    -1,  1476,    -1,    -1,
+      -1,    -1,   557,   558,   559,   480,   480,    72,    -1,    74,
+      75,    76,    -1,    -1,   597,    -1,    67,   109,    83,    84,
+      -1,    -1,  1097,  1098,    -1,    -1,    -1,   119,    -1,    -1,
+      -1,    -1,  1511,   579,  1513,  1417,    -1,   928,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,   600,    -1,   630,    -1,    -1,
+      -1,   597,   598,    -1,   600,    -1,   947,    -1,   109,    -1,
+     111,  1443,    -1,   646,    -1,   611,    -1,    -1,   119,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1556,   661,  1558,
+      -1,    -1,    -1,   629,  1466,    -1,    -1,    -1,   634,    -1,
+      -1,  1473,  1571,  1572,   640,  1222,    -1,   643,   644,   645,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       0,    -1,    -1,   603,    -1,    -1,   662,    -1,    -1,    -1,
+    1247,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   603,   603,
+      -1,    -1,    -1,    -1,   680,    -1,    -1,    -1,    -1,    -1,
+      -1,   631,    32,    -1,  1526,   691,   636,    -1,    -1,    -1,
+     696,   697,    -1,    -1,   700,    -1,   631,   631,    -1,    -1,
+      -1,   636,   636,    -1,    -1,    -1,  1241,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   758,    -1,    67,    -1,   734,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   733,    -1,    -1,
+     736,    -1,    -1,  1039,  1040,    -1,    -1,    -1,  1273,   745,
+      -1,    -1,   748,    -1,    -1,    -1,  1281,  1282,  1283,    -1,
+      -1,  1102,    -1,  1340,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   344,   345,   780,   772,   773,    -1,    -1,
+      -1,    -1,   778,    -1,   724,   356,   357,    -1,    -1,    26,
+      27,    28,    -1,    -1,    -1,    -1,    -1,    -1,   738,   724,
+     724,  1097,  1098,    -1,  1329,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   738,   738,   155,    -1,    -1,    -1,   815,
+      -1,    -1,   827,    -1,    -1,    -1,    -1,    -1,    -1,   825,
+      -1,    -1,   828,   758,   830,    -1,    -1,   833,   834,   835,
+      -1,    -1,   582,   583,   840,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   850,    -1,    -1,    -1,    -1,    -1,
+      97,    -1,    99,    -1,    -1,    -1,  1443,    10,    11,    12,
+      13,    14,   612,    -1,    -1,   615,   616,    -1,   618,    -1,
+     620,   621,    -1,    -1,    -1,   625,   626,   124,    -1,   229,
+      -1,   924,   832,    -1,    -1,    -1,    39,    -1,  1475,    -1,
+    1477,    -1,    -1,    -1,    -1,    -1,   902,   832,   832,    -1,
+     250,    -1,    -1,    -1,    -1,   255,   188,    -1,    -1,    -1,
+      -1,    -1,    -1,   195,    67,    -1,    -1,    -1,   924,    72,
+      -1,    74,    75,    76,    -1,  1512,    -1,  1514,    -1,    -1,
+      83,    84,    -1,   180,    -1,  1241,    -1,    -1,    -1,    -1,
+      -1,   188,    -1,   190,   191,    -1,    -1,    -1,   195,    -1,
+     197,   198,    -1,    -1,   960,  1542,   109,    -1,   111,   709,
+     710,    -1,   968,   969,    -1,   715,   119,  1273,    -1,    10,
+      11,    12,    13,    14,    -1,  1281,  1282,  1283,    -1,    -1,
+     986,    -1,    -1,    -1,    -1,   267,    -1,    -1,    -1,    10,
+      11,    12,    13,    14,    -1,    -1,    -1,    -1,    39,    -1,
+     350,    -1,    -1,    -1,    -1,    -1,  1021,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1021,    -1,    -1,    39,    -1,
+     267,    -1,    -1,  1329,    -1,    -1,    67,    -1,  1034,    -1,
+      -1,    72,    -1,  1039,  1040,    76,  1042,  1043,    -1,    -1,
+      -1,   323,    83,    84,    -1,    -1,    67,  1062,    -1,   331,
+      -1,    72,   334,    74,    75,    76,  1062,    -1,    -1,    -1,
+      -1,    -1,    83,    84,    -1,    -1,    -1,   417,   109,    -1,
+      -1,     0,    -1,    -1,  1024,    -1,    -1,    -1,   119,    -1,
+      -1,    -1,   432,    -1,    -1,    -1,    -1,   437,   109,  1024,
+    1024,  1097,  1098,    -1,    -1,   445,    -1,  1103,   119,    -1,
+      -1,    -1,    -1,    32,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   397,    -1,    -1,    -1,   401,
+      -1,   471,    -1,    -1,  1475,    -1,  1477,    -1,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,    67,   489,
+      -1,   491,    -1,    -1,   725,    -1,   727,    -1,    -1,    -1,
+      -1,    -1,    -1,   734,   735,    -1,  1162,    -1,   739,    -1,
+      -1,  1512,   131,  1514,  1179,    10,    11,    12,    13,    14,
+     751,    -1,    -1,    -1,    -1,   756,    -1,    -1,    -1,  1222,
+      -1,    -1,    -1,   533,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,  1205,
+      -1,   782,    -1,    -1,   486,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1222,    -1,    -1,    -1,
+      -1,  1227,    67,    -1,    -1,    -1,   155,    72,    -1,    -1,
+      -1,    76,    -1,    -1,    -1,  1241,    -1,  1243,    83,    84,
+      -1,  1247,    -1,    -1,    -1,    -1,   827,    -1,   598,    -1,
+      -1,    -1,    -1,    -1,  1204,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,    -1,  1273,    -1,  1204,
+    1204,    -1,    -1,    -1,   119,  1281,  1282,  1283,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1292,  1293,    -1,    -1,
+      -1,    -1,    -1,   643,   644,   645,   578,   579,    -1,    -1,
+    1306,    -1,    -1,   884,   885,   886,   887,    -1,   889,    -1,
+      -1,    -1,   662,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   250,    -1,  1329,   905,    -1,   255,    -1,    -1,    -1,
+     680,    -1,    -1,    -1,  1340,   582,   583,    -1,   919,    -1,
+      -1,   691,    -1,    -1,    -1,    -1,    -1,   697,    -1,  1099,
+      -1,  1301,    -1,    -1,    -1,    -1,  1399,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   612,  1301,  1301,   615,   616,
+      -1,   618,    -1,   620,   621,    -1,    -1,   958,   625,   626,
+      -1,    -1,    -1,   733,    -1,   667,   736,    -1,    -1,   671,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    -1,
+      -1,  1417,    -1,    -1,    -1,    -1,    -1,   998,    -1,    39,
+      -1,   350,   704,   773,  1005,    -1,    -1,    -1,    -1,  1010,
+      -1,    -1,    -1,    -1,  1015,    -1,  1017,  1443,    -1,    -1,
+    1021,  1022,  1023,    -1,    -1,  1026,    -1,    67,    -1,    -1,
+      -1,    -1,    -1,    -1,  1035,    -1,    -1,   704,    78,    -1,
+    1466,    -1,   709,   710,    -1,   815,    -1,  1473,   715,    -1,
+      -1,    -1,  1053,  1054,  1224,   825,    -1,    -1,   828,    -1,
+      -1,    -1,    -1,   833,    -1,   835,    -1,    -1,   417,    -1,
+     840,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1080,
+      -1,    -1,  1083,   432,    -1,    -1,    -1,    -1,   437,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   445,    -1,    -1,    -1,
+    1526,    -1,    -1,    -1,    -1,    -1,    -1,  1533,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   819,    -1,    -1,
+      -1,  1122,   471,    -1,    -1,    -1,    -1,  1128,  1129,    -1,
+      -1,    -1,   902,    -1,    -1,    -1,    -1,    -1,    -1,  1140,
+     489,    -1,   491,     0,  1145,    -1,    -1,  1148,    -1,  1150,
+      -1,    -1,  1153,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1166,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    32,    37,    38,  1179,    40,
+    1181,  1182,  1183,  1184,   533,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1197,    -1,  1199,    -1,
+      -1,    -1,  1203,    -1,    -1,    66,    -1,    -1,    -1,    -1,
+      67,    72,    -1,    74,    75,    76,   986,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+     932,  1232,  1233,    94,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,   598,
+     111,    -1,   113,   114,    -1,    -1,    -1,   118,   119,   120,
+     121,   122,   123,    -1,    -1,    -1,    -1,    -1,    -1,  1039,
+    1040,    -1,  1042,  1043,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1284,  1285,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1062,  1294,   643,   644,   645,    -1,   155,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1011,
+      -1,    -1,    -1,   662,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1027,    -1,  1097,  1098,    -1,
+      -1,   680,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   691,    -1,    -1,  1346,    -1,    -1,   697,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1358,    -1,  1360,
+    1361,  1362,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
+      -1,  1372,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1381,    -1,    -1,    -1,   733,    -1,    -1,   736,    -1,    -1,
+      -1,    66,  1162,   250,    -1,    -1,  1397,    72,   255,    -1,
+      -1,    76,  1104,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,     0,    94,
+      -1,    -1,    -1,    -1,   773,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1099,    -1,   109,  1205,   111,    -1,    -1,   114,
+      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,    -1,
+      32,    -1,  1453,  1454,    -1,    -1,    -1,  1227,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1466,   815,    -1,    -1,    -1,
+      -1,  1241,  1473,  1243,    -1,    -1,   825,    -1,    -1,   828,
+      -1,    -1,    -1,    -1,   833,    67,   835,    -1,    -1,    -1,
+      -1,   840,    -1,   350,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1273,    -1,  1506,    -1,    -1,    -1,  1510,
+      -1,  1281,  1282,  1283,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1292,  1293,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1306,    -1,  1539,    -1,
+    1541,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   902,    -1,    -1,    -1,  1224,    -1,  1329,
+     417,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1569,  1570,
+      -1,    -1,    -1,   155,    -1,   432,  1577,  1578,    -1,    -1,
+     437,    -1,    -1,    -1,    -1,    -1,     0,    -1,   445,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,   471,    -1,    30,    31,    32,    33,
+      -1,    -1,    36,    -1,    -1,    39,    40,    -1,    -1,    -1,
+      -1,    -1,   489,    -1,   491,    -1,    -1,   986,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1417,    -1,    -1,
+      64,    -1,    -1,    67,    -1,    69,    -1,    71,    72,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,   250,    83,
+      84,    -1,    -1,   255,    -1,    -1,   533,    -1,     7,    -1,
+      -1,    10,    11,    12,    13,    14,    -1,    -1,    -1,    -1,
+    1039,  1040,    -1,  1042,  1043,   109,  1466,   111,    -1,    -1,
+      -1,    -1,    -1,  1473,    -1,   119,    -1,    -1,    37,    38,
+      39,    40,    -1,  1062,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    -1,    -1,    -1,    66,    67,    -1,
+      -1,   598,    -1,    72,    39,    -1,    -1,    76,  1097,  1098,
+      79,    80,    81,    82,    83,    84,  1526,    86,    87,    -1,
+      -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,   350,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     109,    -1,   111,    78,    -1,    -1,   643,   644,   645,   118,
+     119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   662,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1162,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   680,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   691,   417,    -1,    -1,    -1,    45,
+     697,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     432,    -1,    -1,    -1,    -1,   437,  1205,    -1,    64,    -1,
+      -1,    -1,    -1,   445,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   733,    -1,  1227,   736,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   471,
+      -1,    -1,  1241,    -1,  1243,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   110,    -1,    -1,   489,    -1,   491,
+     116,    -1,    -1,    -1,    -1,    -1,   773,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1273,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1281,  1282,  1283,    -1,    -1,    -1,    -1,   145,
+      -1,    -1,    -1,  1292,  1293,    -1,    -1,    -1,    -1,   155,
+      -1,   533,    -1,   159,    -1,    -1,    -1,  1306,   815,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   825,    -1,
+      -1,   828,    -1,    -1,    -1,    -1,   833,    -1,   835,    -1,
+    1329,    -1,    -1,   840,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,   208,    -1,    30,    31,    32,    -1,    -1,    -1,
+      -1,    -1,    -1,    39,   220,    -1,   598,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   238,   239,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    67,    -1,    -1,    -1,   902,    -1,    -1,    74,    75,
+      -1,    -1,    -1,    -1,    -1,    -1,   262,    -1,    -1,    -1,
+      -1,   643,   644,   645,   270,    -1,    -1,    -1,  1417,    -1,
+      -1,    -1,    -1,    -1,   281,    -1,   283,   284,    -1,    -1,
+     662,    -1,    -1,    -1,   291,   292,    -1,    -1,   294,   296,
+     297,   297,    -1,   119,    -1,    -1,    -1,    -1,   680,    -1,
+      -1,   308,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   691,
+      -1,    -1,    -1,    -1,    -1,   697,    -1,  1466,    37,    38,
+      -1,    40,    -1,    -1,  1473,    -1,    -1,    -1,    -1,   986,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   344,   344,    -1,
+      -1,    -1,    -1,   349,    -1,    -1,    -1,    66,    -1,    -1,
+      -1,   733,    -1,    72,   736,    -1,    -1,    76,    -1,    -1,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
+      -1,    -1,    -1,   380,    -1,    94,    -1,  1526,    -1,    -1,
+      -1,    -1,  1039,  1040,    -1,  1042,  1043,    -1,    -1,    -1,
+     109,   773,   111,    -1,    -1,    -1,    -1,    -1,   117,   118,
+     119,   120,   121,   122,   123,  1062,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    64,    -1,    -1,    -1,   425,
+     426,    -1,    -1,    -1,    -1,    74,   432,    76,    -1,    78,
+      -1,    -1,    -1,   815,    -1,    -1,    85,    -1,    -1,    -1,
+    1097,  1098,    -1,   825,    -1,    -1,   828,   453,    -1,    -1,
+     456,   833,    -1,   835,    -1,    -1,    -1,    -1,   840,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   116,    -1,   118,
+     119,   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   489,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   501,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1162,    -1,   513,    -1,   515,
+     159,    -1,   518,    -1,   520,   521,    -1,    -1,    -1,    -1,
+     902,    -1,    -1,    -1,    -1,    -1,    -1,   533,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1205,    -1,
+     557,   558,   559,   560,   561,   562,   563,   564,   565,   566,
+     567,   568,   569,   570,   571,   572,   573,   574,    -1,    -1,
+    1227,   220,    -1,   222,   223,   224,    -1,    -1,    -1,    -1,
+     586,    -1,    -1,    -1,  1241,    -1,  1243,    -1,    -1,    -1,
+      -1,    -1,   598,   600,   600,    -1,    -1,   603,    -1,    -1,
+      -1,    -1,    -1,    -1,   986,    -1,    -1,    -1,    -1,   258,
+      -1,    -1,    -1,   262,    -1,    -1,  1273,    -1,    -1,    -1,
+      -1,    -1,    -1,   629,  1281,  1282,  1283,    -1,   634,   278,
+      -1,    -1,    -1,    -1,    -1,  1292,  1293,   643,   644,   645,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1306,
+      -1,    -1,    -1,    -1,    -1,    -1,   662,  1039,  1040,    -1,
+    1042,  1043,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1329,    -1,    -1,    -1,    -1,    -1,    -1,   328,
+    1062,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   697,   699,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     349,    -1,    -1,    -1,    -1,   354,   355,    44,    -1,    -1,
+      -1,    -1,   718,   362,   721,  1097,  1098,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   734,    -1,    -1,
+     736,    -1,   738,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    90,    -1,    -1,   405,    -1,    -1,    -1,
+    1417,    -1,    39,   100,    -1,    -1,    -1,   773,    -1,    -1,
+      -1,    -1,    -1,   780,   423,    -1,    -1,    -1,    -1,   428,
+    1162,   430,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   447,    -1,
+      -1,   450,   451,    -1,    -1,   812,    -1,    -1,    -1,  1466,
+      -1,    -1,    -1,    -1,    -1,    -1,  1473,   466,    -1,   156,
+     827,    -1,   828,  1205,    -1,    -1,   832,    -1,    -1,   835,
+      -1,   480,    -1,   170,    -1,    -1,    -1,    -1,   487,    -1,
+      -1,    -1,    -1,    -1,    -1,  1227,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   193,    -1,    -1,  1241,
+      -1,  1243,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1526,
+     207,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   216,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   226,
+      -1,  1273,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1281,
+    1282,  1283,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1292,  1293,    -1,    -1,   251,    -1,    -1,    -1,    -1,   256,
+      -1,    -1,   928,    -1,  1306,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   269,    -1,    -1,    -1,    -1,    -1,   275,    -1,
+     277,   947,    -1,    -1,    -1,    -1,    -1,  1329,    -1,    -1,
+      -1,    -1,    -1,    -1,   603,    -1,    -1,    -1,   295,    -1,
+      -1,    -1,    -1,    -1,   970,    -1,    -1,    -1,    -1,    -1,
+      -1,   978,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     986,    -1,   631,    -1,    -1,    -1,    -1,   636,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   338,  1009,    -1,    -1,    -1,   343,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1021,  1021,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   371,  1417,  1042,  1043,   375,   376,
+      -1,   378,    -1,    -1,    -1,    -1,    -1,    -1,   385,   386,
+      -1,   388,   389,    -1,   391,  1062,   393,    -1,    -1,    -1,
+      -1,    -1,     7,    -1,    -1,    10,    11,    12,    13,    14,
+      -1,    -1,    -1,   410,    -1,   724,    -1,    -1,    -1,    -1,
+      -1,   418,    -1,    -1,  1466,    -1,    -1,    -1,    -1,   738,
+      -1,  1473,    37,    38,    39,    40,  1102,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   443,    -1,    -1,   758,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   454,    -1,    -1,
+      -1,    66,    67,    -1,    -1,    -1,    -1,    72,  1135,    -1,
+      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
+     477,    86,    87,    -1,  1526,    -1,   483,    -1,    -1,    94,
+      -1,   488,    -1,    -1,    -1,    -1,  1162,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
+     819,    -1,  1179,   118,   119,   120,   121,   122,   123,    -1,
+      -1,    -1,    -1,   832,    -1,    -1,  1193,  1194,   525,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1204,    -1,
+      -1,    -1,   851,    -1,   541,    -1,    -1,    -1,    -1,    -1,
+      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,  1243,    30,    31,
+      32,   578,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,
+     587,    -1,    -1,    -1,    -1,    -1,    -1,   594,    -1,    -1,
+      -1,    -1,   599,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   610,    -1,    67,    -1,    69,    -1,    71,
+      72,    -1,    74,    75,    76,    -1,  1292,  1293,    -1,   938,
+      -1,    83,    84,    -1,    -1,  1301,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   651,   964,    -1,   109,    -1,   111,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   992,    -1,    -1,    -1,    -1,    -1,    -1,
+     687,    -1,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,  1024,    30,    31,    32,    -1,
+      -1,    -1,    -1,    -1,    -1,    39,  1035,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1404,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   742,    -1,    -1,    -1,    -1,
+      -1,  1417,    -1,    67,  1421,   752,   753,    -1,    -1,    -1,
+      74,    75,    -1,    -1,    78,    -1,    -1,    -1,    -1,   766,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   783,    -1,   785,    -1,
+      -1,    -1,   789,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,  1117,  1475,
+      -1,  1477,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1494,  1495,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      37,    38,    -1,    40,    -1,    -1,  1512,    -1,  1514,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   855,    -1,
+      -1,    -1,    -1,    -1,    -1,   862,    -1,    -1,    -1,    66,
+      -1,    -1,    -1,    -1,    -1,    72,  1542,    -1,   875,    76,
+     877,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,    -1,    -1,   891,  1204,    -1,    94,    -1,    -1,
+      -1,   898,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   109,   910,   111,    -1,   913,    -1,    -1,   116,
+      -1,   118,   119,   120,   121,   122,   123,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   931,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   154,   155,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   188,    -1,
+      -1,    -1,  1301,    -1,    -1,   195,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,  1020,    30,    31,    32,    33,    -1,    -1,
+      36,    -1,    -1,    39,    40,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    30,    31,    32,    64,    -1,
+      -1,    67,    -1,    69,    39,    71,    72,   267,    74,    75,
+      76,    -1,    -1,    -1,    -1,    -1,    -1,    83,    84,  1076,
+      -1,    -1,    -1,    -1,    -1,    -1,  1083,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,   115,
+      -1,    -1,    -1,   119,    -1,   145,  1113,    -1,    -1,    -1,
+      -1,  1118,    -1,   323,    -1,   155,    -1,    -1,    -1,  1126,
+      -1,   331,   332,    -1,   334,   335,    -1,   167,   168,    -1,
+      -1,    -1,    -1,    -1,   344,    -1,    -1,    -1,   348,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1157,    -1,    -1,    -1,    -1,    -1,    -1,   367,    -1,    -1,
+     370,    -1,  1169,    -1,    -1,  1172,    -1,  1174,    -1,    -1,
+      37,    38,    -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1188,  1189,    -1,    -1,    -1,    -1,   397,    -1,    -1,
+      -1,   401,    -1,    -1,    -1,    -1,    -1,    -1,   238,    66,
+      -1,    -1,    -1,  1210,    -1,    72,    -1,    -1,    -1,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,   432,   263,    -1,    -1,    -1,    94,    -1,    -1,
+    1237,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1557,    -1,
+      -1,    -1,   109,    -1,   111,   455,    -1,   114,    -1,    -1,
+      -1,   118,   119,   120,   121,   122,   123,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   486,    -1,    -1,   489,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    75,     0,    25,    26,
-      27,     0,   453,     0,   351,   351,   946,    30,     0,     0,
-     109,     0,     0,     0,     0,     0,     0,     0,    77,     0,
-       0,     0,  1236,     0,     0,     0,     0,     0,     0,     0,
-       0,   353,   353,   354,     0,    33,     0,     0,    77,     0,
-      36,     0,    37,    38,    39,    84,    77,     0,     0,     0,
-       0,    40,    41,     0,     0,     0,     0,     0,     0,     0,
-     361,     0,     0,     0,     0,    84,   346,     0,   351,     0,
-       0,     0,   354,    84,     0,     0,     0,    42,     0,   155,
-       0,     0,     0,     0,     0,     0,     0,    44,     0,     0,
-     354,     0,    77,     0,     0,   353,     0,     0,     0,   361,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   220,     0,     0,     0,     0,     0,   361,     0,    84,
-       0,     0,     0,     0,     0,    54,     0,     0,     0,     0,
-       0,     0,     0,    72,   354,     0,     0,     0,   221,     0,
-       0,     0,     0,     0,     0,     0,   351,     0,   351,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      75,   361,     0,     0,     0,     0,     0,   346,     0,     0,
-       0,     0,     0,   353,     0,   353,     0,     0,   351,     0,
-       0,     0,     0,     0,     0,     0,   351,   351,   351,     0,
-       0,     0,     0,     0,     0,     0,     0,   351,   351,   354,
-       0,     0,     0,     0,     0,   353,     0,     0,     0,     0,
-       0,    72,     0,   353,   353,   353,     0,     0,     0,     0,
-       0,     0,     0,     0,   353,   353,   361,     0,     0,     0,
-       0,     0,   346,     0,   351,     0,     0,     0,    75,     0,
-       0,     0,     0,     0,   354,   354,   354,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   353,     0,   354,     0,     0,     0,     0,     0,   124,
-       0,   361,   361,   361,     0,     0,     0,   346,   346,   346,
-       0,   354,     0,     0,     0,     0,     0,     0,     0,     0,
-     361,     0,    77,     0,     0,     0,   346,     0,   354,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   361,  1033,
-       0,     0,     8,     9,    10,    11,    12,     0,     0,    84,
-       0,     0,   351,     0,     0,   361,     0,     0,     0,     0,
-       0,     0,     0,     0,    77,     0,     0,   354,   280,   281,
-      30,   282,     0,     0,     0,     0,     0,     0,     0,   353,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    84,     0,     0,   361,     0,     0,   283,    33,     0,
-     346,    72,     0,   284,   354,     0,     0,   285,    72,     0,
-     286,   287,   288,   289,    40,    41,     0,   290,   291,     0,
-       0,     0,     0,   124,     0,   292,     0,     0,    75,     0,
-       0,   361,     0,     0,     0,    75,     0,     0,     0,     0,
-     293,     0,   377,     0,     0,     0,   354,     0,     0,   295,
-     826,   297,   298,   299,   300,     0,   354,     0,     0,   354,
-       0,    72,     0,     0,   222,     0,   354,     0,     0,     0,
-       0,   354,     0,   361,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   361,     0,     0,   361,     0,    75,     0,
-       0,   223,   346,   361,     0,     0,     0,     0,   361,   346,
-       0,     0,     0,     0,     0,  -516,     0,     0,     1,     2,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      -1,    30,    31,    32,    33,    -1,    -1,    36,    -1,   529,
+      39,    -1,   532,   533,    -1,    -1,    -1,    -1,  1335,    -1,
+    1337,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   379,
+      -1,    -1,    -1,  1350,    -1,  1352,    -1,    -1,    67,    -1,
+      69,    -1,    71,    -1,    -1,    74,    75,    -1,    -1,    78,
+      -1,    -1,    -1,  1370,    -1,    -1,    -1,    -1,   578,   579,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1386,
+    1387,    -1,    -1,    -1,    -1,    -1,    -1,   597,   598,    -1,
+     600,  1398,   111,    -1,  1401,    -1,    -1,    -1,    -1,   609,
+     119,   611,   612,    -1,    -1,    -1,    -1,    -1,   618,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1423,    -1,   628,   629,
+      -1,    -1,    -1,    -1,   634,  1432,    -1,    -1,  1435,    -1,
+    1437,  1438,  1439,   643,   644,   645,    -1,    -1,    -1,    -1,
+      -1,   481,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   662,    -1,    -1,    -1,    -1,   667,   668,    -1,
+      -1,   671,   672,    -1,    -1,    -1,    -1,    -1,   678,    -1,
+      -1,    -1,  1479,    -1,  1481,    -1,    -1,  1484,    -1,    -1,
+     520,    -1,    -1,    -1,    -1,    -1,   696,   697,   698,    -1,
+     700,    -1,  1499,   533,   704,    -1,    -1,    -1,    -1,    -1,
+     540,    -1,    -1,   543,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   554,   555,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   736,   737,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   576,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   586,    -1,    -1,    -1,
+      -1,    -1,    -1,   593,    -1,    -1,    -1,    -1,   598,    -1,
+      -1,    -1,   772,   773,    -1,    -1,    -1,   777,   778,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    33,    -1,    -1,    36,   648,   819,
+      39,    40,    -1,    -1,    -1,    -1,    -1,   657,   828,    -1,
+      -1,    -1,    -1,    -1,   834,   835,    -1,    -1,    -1,   839,
+      -1,   841,    -1,    -1,    -1,    64,    -1,    -1,    67,    -1,
+      69,   851,    71,    72,    -1,    74,    75,    76,    -1,    -1,
+      -1,    -1,    -1,    -1,    83,    84,    -1,   697,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     119,    -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,   924,    30,    31,    32,    -1,    -1,
+      -1,    -1,   932,    -1,    39,    -1,    -1,    -1,   938,    -1,
+      -1,    -1,    -1,   773,    -1,   775,   946,    -1,    -1,    -1,
+      -1,   781,    -1,    -1,    -1,    -1,    -1,    -1,   788,   959,
+     960,    -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,
+      75,    76,    -1,    78,    -1,    -1,    -1,    -1,    83,    84,
+      -1,    -1,    -1,    -1,    -1,    -1,   986,    -1,    -1,    -1,
+      -1,    -1,   992,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   832,   833,   109,   835,   111,    -1,    -1,    -1,
+      -1,  1011,  1012,    -1,   119,    -1,    -1,    -1,    -1,    -1,
+     850,  1021,    -1,    -1,    -1,    -1,    -1,  1027,  1028,    -1,
+    1030,  1031,  1032,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1042,  1043,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     890,    -1,    -1,    -1,   894,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    33,    -1,    -1,    36,    -1,
+      -1,    39,    -1,  1103,  1104,  1105,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1117,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,
+      -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,    -1,
+     970,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   986,   987,    -1,    -1,
+      -1,    -1,  1162,   993,    -1,    -1,    -1,    37,    38,   999,
+      40,    -1,  1002,   111,  1004,    -1,    -1,    -1,    -1,    -1,
+      -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1024,    -1,    66,    -1,    -1,    -1,
+      -1,    -1,    72,    -1,    -1,  1035,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
+      -1,    -1,  1222,    -1,    94,    37,    38,  1057,    40,  1059,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,
+      -1,   111,    -1,  1243,  1074,  1075,    -1,    -1,   118,   119,
+     120,   121,   122,   123,    66,    -1,    -1,    -1,    -1,    -1,
+      72,    -1,    -1,    -1,    76,  1095,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1292,  1293,    -1,    -1,    -1,   109,    -1,   111,
+      -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,   121,
+     122,   123,    -1,  1143,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1162,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1177,  1178,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    33,    -1,    -1,    36,    37,
+      38,    39,    40,    41,    -1,    43,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    -1,    -1,    -1,    57,
+      -1,    -1,    -1,    61,    62,    -1,    64,  1417,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,  1259,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
+     128,    -1,    -1,    -1,   132,    -1,    -1,    -1,    -1,    -1,
+    1320,    -1,  1322,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1507,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,  1532,  1533,    -1,    -1,    -1,    39,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1557,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    -1,    -1,    -1,    -1,  1408,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    33,    -1,   119,    36,    37,
+      38,    39,    40,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    66,    67,
+      -1,    69,    39,    71,    72,    -1,    74,    75,    76,    -1,
+    1490,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    83,    84,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
+      -1,    -1,  1542,    -1,   132,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    33,    -1,    -1,    36,    37,
+      38,    39,    40,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    66,    67,
+      -1,    69,    39,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,   116,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,   116,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,   116,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,    -1,    -1,    -1,   111,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    69,    -1,    71,    72,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
+      84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   119,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    67,
+      -1,    69,    -1,    71,    -1,    39,    74,    75,    -1,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    67,    -1,    30,    31,    32,    72,    -1,
+      74,    75,   110,   111,    39,    -1,    -1,    -1,    -1,    83,
+      84,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    69,    -1,    71,   111,    -1,    74,
+      75,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   119,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    -1,    30,    31,    32,    67,    -1,
+      69,    -1,    71,    -1,    39,    74,    75,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,
+      75,    76,   111,    78,    -1,    -1,    -1,    -1,    83,    84,
+     119,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,   111,    30,    31,    32,
+      -1,    -1,    -1,    -1,   119,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,    -1,
+      -1,    74,    75,    -1,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,   111,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,
+      -1,    71,    -1,    -1,    74,    75,    -1,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,   111,    39,    -1,    -1,    -1,    -1,    -1,    -1,   119,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,    -1,    -1,    -1,   111,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,
+      74,    75,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,
+      38,    39,    40,    -1,    -1,    -1,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
+      -1,    -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,    -1,    -1,    37,    38,    39,    40,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    66,    67,    -1,    -1,    39,    -1,    72,    -1,
+      74,    75,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    72,
+      -1,    74,    75,    76,    -1,   109,    -1,   111,   112,    -1,
+      83,    84,    -1,    -1,   118,   119,   120,   121,   122,   123,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,   111,    -1,
+      30,    31,    32,    -1,    -1,    -1,   119,    37,    38,    39,
+      40,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    66,    67,    -1,    -1,
+      39,    40,    72,    -1,    74,    75,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
+      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    -1,   109,
+     110,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,
+     120,   121,   122,   123,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,   111,    -1,    30,    31,    32,    -1,    -1,    -1,
+     119,    37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      66,    67,    30,    31,    32,    -1,    72,    -1,    74,    75,
+      76,    39,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,
+      -1,    -1,    -1,   109,    -1,   111,    74,    75,    -1,    -1,
+      -1,    -1,   118,   119,   120,   121,   122,   123,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,   109,    -1,   111,    -1,    37,    38,    39,    40,    -1,
+      -1,   119,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    66,    67,    30,    31,    32,    -1,
+      72,    -1,    74,    75,    76,    39,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    67,    -1,    -1,    -1,   109,    -1,   111,
+      74,    75,    -1,    -1,    -1,    -1,   118,   119,   120,   121,
+     122,   123,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,   109,    -1,   111,    -1,    37,
+      38,    39,    40,    -1,    -1,   119,    -1,    -1,    -1,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    66,    67,
+      30,    31,    32,    -1,    72,    -1,    74,    75,    76,    39,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,
+      -1,   109,    -1,   111,    74,    75,    -1,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,   111,    -1,    37,    38,    39,    40,    -1,    -1,   119,
+      -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    66,    67,    30,    31,    32,    -1,    72,    -1,
+      74,    75,    76,    39,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    67,    -1,    -1,    -1,   109,    -1,   111,    74,    75,
+      -1,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
        3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,    77,    25,    26,    27,    28,     0,     0,
-      29,     0,     0,    30,    31,     0,     0,     0,     0,     8,
-       9,    10,    11,    12,     0,     8,     9,    10,    11,    12,
-      84,     0,     0,     0,     0,     0,    54,     0,    32,     0,
-       0,    33,   163,    34,     0,    35,    36,    30,    37,    38,
-      39,     0,     0,    30,     0,     0,     0,    40,    41,     0,
-       0,   216,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    33,     0,     0,     0,     0,
-      36,    33,     0,    42,    39,    43,    36,   354,     0,     0,
-      39,    40,    41,    44,     0,     0,     0,    40,    41,     0,
-       0,     0,     0,    54,     0,     0,     0,   163,     0,     0,
-       0,     0,     0,   270,   361,     0,     0,    42,     0,     0,
-     346,     0,     0,   743,     0,     0,     0,   145,     0,     0,
-       0,     0,     0,   744,     0,     0,     0,     0,     0,     0,
-     354,   354,   163,   354,   354,     0,     0,     0,     0,     0,
-       0,     0,   367,     0,     0,     0,   373,     0,     0,     0,
-       0,     0,     0,    77,     0,     0,     0,   361,   361,     0,
-     361,   361,     0,     0,     0,     0,   346,   346,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      84,     0,     0,     0,     0,     0,    54,     0,   354,   354,
-       0,     0,     0,     0,     0,   163,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   216,     0,     0,
-       0,     0,     0,     0,     0,   361,   361,     0,     0,     0,
-       0,   280,   281,     0,   282,   163,   460,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,     0,     0,    25,    26,    27,   373,
-     283,     0,   354,     0,     0,    30,   284,   163,     0,     0,
-     285,     0,     0,   286,   287,   288,   289,    40,    41,     0,
-     290,   291,     0,     0,     0,     0,     0,     0,   292,   361,
-       0,   460,     0,    33,   163,     0,     0,     0,     0,     0,
-     205,    38,     0,   512,     0,   222,     0,     0,     0,     0,
-       0,     0,   295,   379,   297,   298,   299,   300,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    77,     0,     0,
-       0,     0,   223,     0,     0,     0,     0,    54,    54,     0,
-     354,   605,   354,     0,     0,   269,   629,     0,     0,     0,
-       0,     0,     0,     0,    84,     0,     0,     0,     0,     0,
-      54,     0,     0,     0,     0,     0,     0,   361,     0,   361,
-       0,     0,   354,     0,     0,     0,     0,     0,     0,    54,
-     354,   354,   354,     0,     0,     0,     0,     0,     0,     0,
-       0,   354,   354,     0,     0,     0,     0,     0,     0,   361,
-       0,     0,     0,     0,     0,    77,     0,   361,   361,   361,
-       0,     0,     0,     0,     0,     0,     0,     0,   361,   361,
-       0,     0,   163,   163,   346,   346,     0,     0,   354,   367,
-       0,     0,    84,    54,     0,     0,     0,     0,    54,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     460,     0,     0,   460,     0,   361,     0,     0,     0,   460,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    54,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   740,     0,     0,     0,
-     209,     0,     0,     0,     0,     0,     0,     0,   163,     0,
-     229,     0,   233,     0,   235,     0,     0,     0,     0,     0,
-     460,   244,   460,     0,     0,   460,   354,   163,   460,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     367,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   209,   361,   233,   235,   244,     0,     0,   346,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    77,     0,   154,     0,     0,
-       0,     0,    77,     0,     0,    54,     0,     0,     0,     0,
-       0,     0,     0,   163,     0,   209,     0,     0,     0,     0,
-       0,     0,    84,     0,     0,   367,     0,   605,    54,    84,
-     836,     0,     0,     0,     0,    54,     0,     0,     0,     0,
-       0,     0,     0,   249,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   254,     0,    77,   605,     0,     0,     0,
-       0,   605,     0,     0,     0,     0,     0,     0,     0,     0,
-     367,   367,   367,     0,     0,     0,   209,     0,   233,   235,
-     244,     0,    84,     0,     0,     0,     0,     0,    54,   367,
-       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,  -294,   154,
-      25,    26,    27,     0,   209,     0,     0,     0,   209,    30,
-       0,     0,     0,   384,   740,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   503,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   460,   416,    33,     0,     0,
-       0,     0,     0,     0,    37,    38,     0,     0,  -294,     0,
-     431,     0,     0,   367,     0,   960,     0,     0,     0,   436,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   444,
-       0,     0,     0,     0,   209,     0,     0,     0,     0,   642,
-       0,   337,   280,   281,     0,   282,     0,     0,     0,   109,
-     740,     0,     0,     0,   470,   209,     0,     0,     0,   480,
-     233,   235,     0,     0,     0,     0,     0,     0,   244,     0,
-       0,   283,   488,     0,     0,     0,     0,   284,   498,     0,
-     502,   285,     0,     0,   286,   287,   288,   289,    40,    41,
-       0,   290,   291,     0,     0,     0,     0,     0,   532,   292,
-       0,     0,     0,     0,     0,   367,     0,     0,     0,   629,
-       0,   209,   367,     0,   293,     0,   377,     0,     0,   378,
-       0,     0,     0,   295,   379,   297,   298,   299,   300,   209,
-       0,     0,     0,     0,   209,     0,   209,     0,     0,     0,
-       0,   592,     0,     0,     0,     0,   597,     0,     0,     0,
-       0,     0,     0,   209,     0,     0,   209,   209,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   209,     0,   643,     0,     0,     0,   644,   645,
-       0,   647,     0,     0,     0,     0,   209,     0,   659,   660,
-       0,   661,   662,   209,   663,     0,   664,     0,     0,     0,
-       0,     0,     0,  1176,     0,   460,     8,     9,    10,    11,
-      12,     0,     0,   592,     0,     0,     0,     0,     0,     0,
-       0,   679,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   280,   281,    30,   282,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   690,   163,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   696,     0,     0,
-       0,   283,    33,   367,     0,     0,     0,   284,     0,     0,
-       0,   285,     0,     0,   286,   287,   288,   289,    40,    41,
-     732,   290,   291,     0,     0,     0,   735,     0,     0,   292,
-       0,   470,     0,     0,     0,     0,     0,     0,   605,     0,
-       0,     0,     0,     0,   293,     0,   377,     0,     0,   209,
-       0,     0,     0,   295,  1177,   297,   298,   299,   300,   367,
-     367,     0,     0,     0,     0,     0,     0,     0,   772,     0,
-       0,     0,     0,     0,     0,     0,     0,   209,   513,     0,
-     515,   518,   209,     0,   787,     0,     0,     0,   521,   522,
-       0,     0,     0,   515,   515,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   515,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   280,   281,     0,   282,   460,
-       0,   814,     0,     0,     0,     0,     0,     0,     0,     0,
-     824,     0,     0,     0,     0,     0,     0,   827,     0,     0,
-       0,   515,   834,     0,   283,     0,     0,     0,     0,     0,
-     284,     0,     0,   849,   285,     0,     0,   286,   287,   288,
-     289,    40,    41,     0,   290,   291,     0,     0,     0,     0,
-     209,     0,   292,     0,     0,     0,     0,   515,   740,     0,
-       0,     0,     0,     0,   209,     0,     0,   293,     0,   377,
-       0,     0,     0,     0,   889,   811,   295,   379,   297,   298,
-     299,   300,     0,     0,   503,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     216,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     834,     0,     0,     0,     0,     8,     9,    10,    11,    12,
+      23,    24,    25,    26,    27,   111,    -1,    30,    31,    32,
+      -1,    -1,    -1,   119,    -1,    -1,    39,    -1,    -1,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    67,    -1,    69,    -1,    71,    39,
+      -1,    74,    75,    -1,    -1,    -1,    -1,    -1,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    67,    30,    31,
+      32,    -1,    72,    -1,    74,    75,    76,    39,    -1,    -1,
+      -1,   114,    -1,    83,    84,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    67,    30,    31,    32,   109,
+      72,   111,    74,    75,    76,    39,    -1,    -1,    -1,   119,
+      -1,    83,    84,    -1,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    67,    30,    31,    32,   109,    72,   111,
+      74,    75,    76,    39,    -1,    -1,    -1,   119,    -1,    83,
+      84,    -1,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    67,    30,    31,    32,   109,    72,   111,    74,    75,
+      76,    39,    -1,    -1,    -1,   119,    -1,    83,    84,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,
+      -1,    -1,    -1,   109,    -1,   111,    74,    75,    -1,    -1,
+      78,    -1,    -1,   119,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
+      -1,   109,    -1,   111,    39,    40,    -1,    -1,    -1,    -1,
+      -1,   119,    -1,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    67,    30,    31,    32,    -1,    -1,    -1,    74,
+      75,    -1,    39,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      67,    -1,    39,    40,    -1,    -1,   111,    74,    75,    -1,
+     115,    78,    -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
+      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,    -1,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,   111,    30,    31,    32,   115,    -1,
+      -1,    -1,   119,    -1,    39,    40,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
+      -1,    -1,    67,    -1,    -1,    39,    -1,    -1,    -1,    74,
+      75,    -1,    -1,    -1,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    67,    30,    31,    32,    -1,    -1,    -1,
+      74,    75,    -1,    39,    -1,    -1,   111,    -1,    -1,    -1,
+     115,    -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    67,    -1,    -1,    -1,    -1,    -1,   111,    74,    75,
+      -1,    -1,    -1,    -1,    -1,   119,    -1,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,  -294,     0,    25,    26,    27,     0,   740,     0,
-       0,     0,     0,    30,     0,   209,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   209,     0,
-       0,     0,     0,     0,     0,   249,     0,     0,     0,     0,
-       0,    33,     0,     0,     0,   967,   968,   209,    37,    38,
-       0,     0,  -294,     0,     0,     0,     0,   367,   367,   985,
-       0,     0,     0,     0,     0,     0,   216,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,  1000,     0,  1001,     0,
-       0,     0,  1005,   642,     0,   337,     0,     0,     0,     0,
-       0,     0,     0,   633,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   515,   515,   515,   515,   515,   515,
-     515,   515,   515,   515,   515,   515,   515,   515,   515,   515,
-     515,   515,     0,     0,     0,     0,     0,     0,     0,     0,
-     280,   281,     0,   282,   209,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   515,  1038,     0,
-       0,     0,     0,     0,     0,  1039,     0,     0,     0,   283,
-     209,     0,     0,     0,     0,   284,     0,     0,  1041,   285,
-    1042,     0,   286,   287,   288,   289,    40,    41,     0,   290,
-     291,     0,   367,     0,  1054,     0,     0,   292,   209,     0,
-       0,  1058,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   293,  1096,   377,     0,  1097,     0,     0,   780,
-       0,   295,   379,   297,   298,   299,   300,     0,     0,     0,
-     209,     0,     0,     0,   597,     0,     0,     0,     0,     0,
-       0,   209,     0,     0,     0,     0,     0,     0,     0,     0,
-     460,     0,   460,     0,     0,     0,   515,     0,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,  -294,     0,     0,   515,     0,
-       0,     0,     0,     0,     0,     0,    30,   460,     0,   460,
-       0,   515,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,  -294,
-       0,    25,    26,    27,    33,     0,     0,   163,     0,     0,
-      30,     0,   209,  1160,     0,  -294,     0,     0,     0,   340,
-     362,     0,     0,     0,     0,     0,     0,   515,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    33,     0,
-       0,     0,     0,    36,     0,   335,   336,    39,     0,  -294,
-       0,     0,     0,   412,    40,    41,     0,     0,     0,   515,
-     412,     0,     0,     0,     0,     0,     0,     0,     0,   532,
-       0,     0,     0,     0,   515,     0,  1225,     0,     0,     0,
-     642,     0,   337,     0,     0,     0,     0,     0,     0,     0,
-     633,   280,   281,     0,   282,     0,     0,     0,     0,   209,
-       0,     0,     0,     0,     0,  1238,     0,     0,     0,     0,
-    1240,     0,     0,     0,     0,     0,     0,     0,  1244,     0,
-     283,     0,     0,     0,     0,     0,   648,     0,   137,   138,
-     285,     0,   412,   286,   649,   288,   289,    40,    41,     0,
-     290,   291,     0,     0,     0,     0,     0,     0,   292,  1270,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1278,     0,   293,  1279,   650,  1280,   651,   378,     0,
-       0,     0,   295,   379,   297,   298,   299,   300,     0,     0,
-    1289,  1290,     0,     0,     0,     0,     0,     0,   412,     0,
-       0,     0,     0,     0,     0,   209,   412,   588,     0,   412,
-     591,     0,  1303,     0,     0,     0,     0,     0,     0,   362,
-       0,     0,     0,   621,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   515,     0,     0,     0,  1326,
-     320,     0,   639,     0,     0,   340,     0,     0,     0,     0,
-     344,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   380,   380,     0,     0,   515,     0,     0,     0,
-       0,     0,   412,     0,     0,     0,   412,     0,   515,     2,
-     204,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    -1,    -1,    -1,   111,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,   119,    -1,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    67,    30,    31,    32,    -1,    -1,
+      -1,    74,    75,    -1,    39,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
+      -1,    -1,    67,    -1,    39,    -1,    -1,    -1,   111,    74,
+      75,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   119,    -1,    -1,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,     0,    25,    26,    27,   362,     0,     0,
-       0,     0,     0,    30,     0,     0,     0,     0,     0,   515,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     412,     0,     0,   320,     0,     0,  1396,     0,  1397,     0,
-       0,    33,     0,    34,     0,    35,     0,     0,    37,    38,
-       0,  1406,     0,  1407,     0,     0,     0,     0,   484,     0,
-       0,   412,     0,     0,   362,     0,     0,     0,     0,     0,
-       0,  1414,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  -399,   686,     0,  1432,  1434,     0,
-       0,   515,     0,   633,     0,     0,     0,     0,     0,  1440,
-       0,     0,  1244,     0,   412,     0,     0,   340,   362,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1463,     0,     0,     0,     0,     0,
-       0,     0,     0,  1470,     0,   515,  1472,     0,  1474,  1476,
-    1478,     0,     0,     0,     0,     0,     0,     0,     0,   515,
-     515,     0,     0,   412,   412,     0,     0,     0,     0,     0,
-       0,   209,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   829,   362,   380,   362,     0,     0,     0,     0,
-    1509,     0,  1511,     0,   621,  1244,   621,   621,     0,     0,
-       0,     0,     0,   621,     0,     0,     0,     0,     0,     0,
-    1523,     0,     0,   868,   362,     0,     0,     0,     0,   362,
-       0,     0,     0,     0,     0,     0,     0,     0,   362,   362,
-     362,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   362,     0,     0,
-       0,     0,   412,   911,     0,     0,   412,   914,     0,     0,
-       0,     0,     0,   916,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   340,   362,   412,     0,   412,   734,     0,     0,   412,
-       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,     0,     0,
-      25,    26,    27,     0,     0,     0,     0,     0,     0,    30,
-       0,   362,   621,     0,     0,   768,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   781,     0,
-       0,     0,     0,     0,     0,   768,     0,    33,   768,     0,
-       0,     0,     0,     0,   205,    38,     0,   340,   362,   791,
-     792,     0,   412,   412,     0,     0,     0,     0,     0,   515,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   813,     0,     0,     0,     0,   515,     0,     0,     0,
-       0,   822,     0,     0,     0,     0,     0,     0,   344,   628,
-       0,     0,     0,   781,   412,     0,     0,     0,     0,     0,
-       0,     0,     0,   362,     0,     0,     0,     0,     0,   829,
-     362,     0,     0,     0,   621,     0,   621,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   621,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   888,     0,     0,     0,     0,     0,   515,
-     515,     0,   380,     0,     0,     0,     0,     0,     0,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,     0,    25,    26,    27,    28,     0,
-       0,    29,   344,     0,    30,    31,     0,     0,     0,   829,
-       0,     0,     0,     0,     0,     0,     0,   412,   280,   281,
-       0,   282,     0,   412,     0,     0,     0,     0,     0,    32,
-       0,   412,    33,     0,    34,     0,    35,    36,     0,    37,
-      38,    39,     0,     0,   621,   621,     0,   283,    40,    41,
-       0,     0,     0,   284,     0,     0,     0,   285,     0,     0,
-     286,   287,   288,   289,    40,    41,     0,   290,   291,     0,
-       0,   362,     0,     0,    42,   292,    43,   412,   781,     0,
-     990,     0,     0,     0,    44,     0,   995,     0,     0,     0,
-     293,     0,   377,  1004,     0,   992,   412,  1157,     0,   295,
-     379,   297,   298,   299,   300,     0,   362,     0,     0,     0,
-       0,     0,   412,  1169,     0,   621,   621,  1174,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   362,   362,     0,
-       0,     0,     0,     0,     0,     0,     0,  1021,  1022,     0,
-     344,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   344,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   829,   412,
-    1237,     0,     0,     0,     0,  1052,     0,     0,     0,   380,
-       0,   621,     0,     0,     0,     0,     1,     2,   204,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      23,    24,    25,    26,    27,    -1,   111,    30,    31,    32,
+      -1,    -1,    -1,    -1,   119,    -1,    39,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    -1,    -1,    67,    -1,    39,    -1,    -1,    -1,
+      -1,    74,    75,    -1,    -1,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,    28,     0,     0,    29,   280,
-     281,    30,  1061,  1062,     0,  1063,   362,     0,  1064,  1065,
-    1066,  1067,  1068,  1069,  1070,  1071,     0,     0,     0,  1072,
-       0,     0,     0,  1073,  1074,     0,    32,     0,   283,    33,
-       0,    34,     0,    35,   648,   320,    37,    38,   285,     0,
-       0,   286,   287,   288,   289,    40,    41,     0,   290,   291,
-       0,  1138,  1139,     0,     0,     0,   292,     0,   380,     0,
-       0,     0,   280,   281,   995,   282,   340,  1148,     0,   768,
-       0,   293,     0,  1075,     0,     0,   169,     0,     0,     0,
-     295,   296,   297,   298,   299,   300,   362,     0,     0,  1164,
-    1076,   283,     0,     0,  -129,     0,     0,   284,     0,     0,
-    1179,   285,     0,     0,   286,   287,   288,   289,    40,    41,
-       0,   290,   291,     0,     0,     0,     0,     0,     0,   292,
-       0,     0,   380,     0,  1197,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   293,   362,   362,     0,     0,   995,
-     995,     0,     0,   295,   379,   297,   298,   299,   300,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1229,     0,     0,     0,     0,     0,     0,     0,     1,     2,
-     204,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,     0,    25,    26,    27,    28,     0,     0,
-      29,   280,   281,    30,   282,     0,     0,   995,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     280,   281,     0,   282,     0,     0,   888,     0,     0,     0,
-     283,    33,     0,    34,     0,    35,   284,     0,    37,    38,
-     285,  1281,  1282,   286,   287,   288,   289,    40,    41,   283,
-     290,   291,     0,     0,     0,   284,     0,     0,   292,   285,
-     362,     0,   286,   287,   288,   289,    40,    41,     0,   290,
-     291,     0,     0,   293,     0,  1075,     0,   292,     0,     0,
-       0,     0,   295,   296,   297,   298,   299,   300,     0,     0,
-       0,     0,   293,     0,   377,     0,  -129,     0,     0,     0,
-       0,   295,   379,   297,   298,   299,   300,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   995,     0,     0,     0,     1,     2,   204,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-     412,     0,    25,    26,    27,    28,     0,     0,    29,   280,
-     281,    30,   282,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   412,   412,     0,     0,     0,
-       0,     0,     0,  1389,     0,   768,     0,     0,   283,    33,
-       0,    34,     0,    35,   284,     0,    37,    38,   285,     0,
-     412,   286,   287,   288,   289,    40,    41,     0,   290,   291,
-       0,     0,     0,     0,     0,     0,   292,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   293,     0,    43,     0,     0,     0,     0,     0,     0,
-     295,   296,   297,   298,   299,   300,     0,     0,     2,   204,
+      25,    26,    27,    -1,    67,    30,    31,    32,    -1,    -1,
+      -1,    74,    75,    -1,    39,    -1,    -1,    -1,   111,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,   111,    74,
+      75,    -1,    -1,    -1,    -1,    -1,   119,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,   111,    -1,    -1,    -1,
+      -1,    -1,    39,    -1,   119,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    37,
+      38,    -1,    40,    41,    -1,    43,    -1,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    -1,    -1,    56,    57,
+      -1,    -1,    -1,    61,    62,    -1,    64,    -1,    66,    -1,
+      -1,    -1,    -1,   110,    72,    -1,    -1,    -1,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,    -1,
+     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
+     128,    -1,    37,    38,   132,    40,    41,    -1,    43,    -1,
+      -1,    46,    47,    48,    49,    50,    51,    52,    53,    -1,
+      -1,    -1,    57,    -1,    -1,    -1,    61,    62,    -1,    64,
+      -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
+      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,   114,
+      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,    -1,
+      -1,    -1,    -1,   128,    -1,    -1,    -1,   132,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
+      -1,    -1,    -1,    39,    -1,    37,    38,    -1,    40,    41,
+      -1,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    -1,    -1,    56,    57,    -1,    -1,    -1,    61,
+      62,    67,    64,    69,    66,    71,    -1,    -1,    74,    75,
+      72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      96,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,
+      -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,
+     122,   123,    -1,    -1,    37,    38,   128,    40,    41,    -1,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    -1,    -1,    -1,    57,    -1,    -1,    -1,    61,    62,
+      -1,    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,    72,
+      -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,
+      83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
+      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,
+      -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,   122,
+     123,    -1,    -1,    37,    38,   128,    40,    41,    -1,    43,
+      -1,    -1,    46,    47,    48,    49,    50,    51,    52,    53,
+      -1,    -1,    -1,    57,    -1,    -1,    -1,    61,    62,    -1,
+      64,    -1,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,
+      -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
+     114,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
+      66,    -1,    -1,    -1,   128,    -1,    72,    -1,    -1,    -1,
+      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    37,
+      38,    -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    37,    38,
+      -1,    40,   118,   119,   120,   121,   122,   123,    66,    -1,
+      -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    66,    86,    87,
+      -1,    -1,    -1,    72,    -1,    -1,    94,    76,    -1,    -1,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
+      -1,   109,    -1,   111,    -1,    94,    37,    38,    -1,    40,
+     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
+     109,    -1,    -1,    -1,    -1,    37,    38,    -1,    40,   118,
+     119,   120,   121,   122,   123,    66,    -1,    -1,    -1,    -1,
+      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    66,    86,    87,    -1,    -1,    -1,
+      72,    -1,    -1,    94,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,   109,    -1,
+      -1,    -1,    94,    37,    38,    -1,    40,   118,   119,   120,
+     121,   122,   123,    -1,    -1,    -1,    -1,   109,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,   121,
+     122,   123,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,
+      -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,  1449,     0,    25,    26,    27,     0,     0,     0,     0,
-     280,   281,    30,   282,     0,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,     0,    25,    26,    27,     0,     0,   283,
-      33,     0,    34,    30,    35,   284,     0,    37,    38,   285,
-       0,     0,   286,   287,   288,   289,    40,    41,     0,   290,
-     291,     0,     0,     0,     0,     0,     0,   292,     0,     0,
-       0,    33,     0,     0,     0,     0,   108,     0,    37,    38,
-       0,     0,   293,  1515,   342,     0,     0,    40,    41,   780,
-       0,   295,   343,   297,   298,   299,   300,     2,   204,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,     0,     0,     0,     0,   280,
-     281,    30,   282,     0,     0,   320,     0,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,  -295,     0,     0,     0,   283,    33,
-       0,    34,     0,    35,   284,    30,    37,    38,   285,     0,
-       0,   286,   287,   288,   289,    40,    41,     0,   290,   291,
-       0,     0,     0,     0,     0,     0,   292,     0,     0,     0,
-       0,     0,     0,    33,     0,     0,     0,     0,     0,     0,
-       0,   293,     0,   930,  -295,     0,     0,     0,   780,     0,
-     295,   343,   297,   298,   299,   300,     2,   204,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,     0,
-       0,    25,    26,    27,     0,     0,     0,     0,   280,   281,
-      30,   282,     0,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,     0,     0,   283,    33,     0,
-      34,    30,    35,   284,     0,    37,    38,   285,     0,     0,
-     286,   287,   288,   289,    40,    41,     0,   290,   291,     0,
-       0,     0,     0,     0,     0,   292,     0,     0,     0,    33,
-       0,     0,     0,     0,     0,     0,    37,    38,     0,     0,
-     293,     0,   930,     0,     0,     0,     0,   780,     0,   295,
-     599,   297,   298,   299,   300,     2,   204,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,     0,     0,
-      25,    26,    27,     0,     0,     0,     0,   280,   281,    30,
-     282,     0,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,     0,
-       0,    25,    26,    27,     0,     0,   283,    33,     0,    34,
-      30,    35,   284,     0,    37,    38,   285,     0,     0,   286,
-     287,   288,   289,    40,    41,     0,   290,   291,     0,     0,
-       0,     0,     0,     0,   292,     0,     0,     0,    33,     0,
-       0,     0,     0,     0,     0,   205,    38,     0,     0,   293,
-       0,   342,     0,     0,     0,     0,     0,     0,   295,   343,
-     297,   298,   299,   300,     2,   204,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,     0,     0,    25,
-      26,    27,     0,     0,     0,     0,   280,   281,    30,   282,
-       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,     0,     0,
-       0,     0,     0,     0,     0,   283,    33,     0,    34,    30,
-      35,   284,     0,    37,    38,   285,     0,     0,   286,   287,
-     288,   289,    40,    41,     0,   290,   291,     0,     0,     0,
-       0,     0,     0,   292,     0,     0,     0,    33,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   293,     0,
-     930,     0,     0,     0,     0,     0,     0,   295,   343,   297,
-     298,   299,   300,     2,   204,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,     0,     0,    25,    26,
-      27,     0,     0,     0,     0,   280,   281,    30,   282,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   283,    33,     0,    34,     0,    35,
-     284,     0,   205,    38,   285,     0,     0,   286,   287,   288,
-     289,    40,    41,     0,   290,   291,     0,     0,     0,     0,
-       0,     0,   292,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   293,     0,  1019,
-       0,     0,     0,     0,     0,     0,   295,  1020,   297,   298,
-     299,   300,     2,   204,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,     0,     0,    25,    26,    27,
-       0,     0,     0,     0,   280,   281,    30,   282,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   283,    33,     0,    34,     0,    35,   284,
-       0,   205,    38,   285,     0,     0,   286,   287,   288,   289,
-      40,    41,     0,   290,   291,     0,     0,     0,     0,     0,
-       0,   292,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   293,     0,   377,     0,
-       0,     0,     0,     0,     0,   295,   379,   297,   298,   299,
-     300,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,     0,     0,    25,    26,    27,
-      28,     0,     0,    29,     0,     0,    30,    31,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    32,     0,     0,    33,     0,    34,     0,    35,    36,
-       0,    37,    38,    39,     0,     0,     0,     0,     0,     0,
-      40,    41,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    42,     0,    43,     0,
-       0,     0,  -520,     0,     0,     0,    44,   203,     2,   204,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,     0,     0,    25,    26,    27,     0,     0,     0,     0,
-       0,     0,    30,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,   491,   492,   493,     0,     0,
-      33,    30,    34,     0,    35,    36,     0,   205,    38,    39,
-       0,     0,     0,     0,     0,     0,    40,    41,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    33,
-       0,     0,     0,     0,     0,     0,    37,    38,     0,     0,
-       0,     0,    42,     0,   206,     0,     0,     0,     0,     0,
-       0,     0,   207,     1,     2,   204,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,  -294,     0,    25,
-      26,    27,    28,     0,     0,    29,     0,     0,    30,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    33,     0,    34,     0,
-      35,     0,     0,    37,    38,     0,     0,  -294,     0,     1,
-       2,   204,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,     0,    25,    26,    27,    28,     0,
-      43,    29,     0,     0,    30,     0,     0,     0,   109,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    33,     0,    34,     0,    35,     0,     0,    37,
-      38,     0,   203,     2,   204,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,     0,     0,    25,    26,
-      27,     0,     0,     0,     0,     0,    43,    30,     0,     0,
-       0,     0,     0,     0,   109,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    33,     0,    34,     0,    35,
-       0,     0,   205,    38,     2,   204,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,     0,     0,    25,
-      26,    27,     0,     0,     0,     0,     0,     0,    30,   206,
-       0,     0,     0,     0,     0,     0,     0,   269,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    33,     0,    34,     0,
-      35,    36,     0,   205,    38,    39,     0,     0,     0,     0,
-       0,     0,    40,    41,     0,     0,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,     0,    25,    26,    27,    42,     0,
-     206,     0,     0,     0,    30,     0,     0,     0,   207,     2,
-     204,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    33,     0,    25,    26,    27,    36,     0,    37,
-      38,    39,     0,    30,     0,     0,     0,     0,    40,    41,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    33,     0,    34,    42,    35,    43,     0,    37,    38,
-       0,     0,     0,     0,    44,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    1368,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   686,     0,     0,     0,     0,
-       0,     0,     0,   633,     2,   204,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,     0,     0,    25,
-      26,    27,     0,     0,     0,     0,     0,     0,    30,     0,
-       0,     0,     0,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,     0,    33,     0,    34,     0,
-      35,    30,     0,    37,    38,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1370,     0,     0,     0,    33,
-       0,     0,     0,     0,    36,     0,   335,   336,    39,     0,
-     686,     0,     0,     0,     0,    40,    41,     0,   633,     2,
-     204,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,   337,    25,    26,    27,     0,     0,     0,
-       0,   109,     0,    30,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    33,     0,    34,     0,    35,     0,     0,   205,    38,
-       2,   204,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,     0,    25,    26,    27,     0,     0,
-       0,     0,     0,     0,    30,   268,     0,     0,     0,     0,
-       0,     0,     0,   628,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    33,     0,    34,     0,    35,     0,     0,    37,
-      38,     2,   204,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,     0,     0,    25,    26,    27,     0,
-       0,     0,     0,     0,     0,    30,   686,     0,     0,     0,
-       0,     0,     0,     0,   633,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    33,     0,    34,     0,    35,     0,     0,
-      37,    38,     2,   204,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,     0,     0,    25,    26,    27,
-       0,     0,     0,     0,     0,     0,    30,   598,     0,     0,
-       0,     0,     0,     0,     0,   633,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    33,     0,    34,     0,    35,     0,
-       0,   205,    38,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,     0,     0,     0,     0,   280,
-     281,    30,   282,     0,     0,     0,     0,     0,   206,     0,
-       0,     0,     0,     0,     0,     0,   269,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   283,    33,
-       0,     0,     0,     0,   284,     0,    37,    38,   285,     0,
-       0,   286,   287,   288,   289,    40,    41,     0,   290,   291,
-       0,     0,     0,     0,     0,     0,   292,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   293,     0,   524,     0,     0,   169,     0,     0,     0,
-     295,   296,   297,   298,   299,   300,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,     0,    25,    26,    27,     0,     0,
-       0,     0,   280,   281,    30,   282,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,  -294,     0,    25,    26,    27,     0,     0,
-       0,   283,    33,     0,    30,     0,     0,   284,     0,    37,
-      38,   285,     0,     0,   286,   287,   288,   289,    40,    41,
-       0,   290,   291,     0,     0,     0,     0,     0,     0,   292,
-       0,     0,    33,     0,     0,     0,     0,    36,     0,   335,
-     336,    39,     0,  -294,   293,     0,   598,    -3,    40,    41,
-       0,     0,     0,   295,   599,   297,   298,   299,   300,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,   337,     0,    25,    26,
-      27,     0,     0,     0,   109,   280,   281,    30,   282,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,     0,     0,    25,    26,
-      27,     0,     0,     0,   283,    33,     0,    30,     0,     0,
-     648,     0,    37,    38,   285,     0,     0,   286,   287,   288,
-     289,    40,    41,     0,   290,   291,     0,     0,     0,     0,
-       0,     0,   292,     0,     0,    33,     0,     0,     0,     0,
-     108,     0,    37,    38,     0,     0,     0,   293,   -35,   765,
-       0,    40,    41,     0,     0,     0,   295,   296,   297,   298,
-     299,   300,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    43,
-       0,    25,    26,    27,     0,     0,     0,   109,   280,   281,
-      30,   282,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,     0,
-       0,    25,    26,    27,     0,     0,     0,   283,    33,     0,
-      30,   452,     0,   284,     0,    37,    38,   285,     0,     0,
-     286,   287,   288,   289,    40,    41,     0,   290,   291,     0,
-       0,     0,     0,     0,     0,   292,     0,     0,    33,     0,
-       0,     0,     0,     0,     0,    37,    38,     0,     0,     0,
-     293,     0,   294,     0,     0,     0,     0,     0,     0,   295,
-     296,   297,   298,   299,   300,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,   453,     0,    25,    26,    27,     0,     0,     0,
-     109,   280,   281,    30,   282,     0,     0,     0,     0,     0,
-       0,     0,     0,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-     283,    33,    25,    26,    27,     0,   284,     0,    37,    38,
-     285,    30,     0,   286,   287,   288,   289,    40,    41,     0,
-     290,   291,     0,     0,     0,     0,     0,     0,   292,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    33,
-       0,     0,     0,   293,     0,   155,    37,    38,     0,     0,
-       0,     0,   295,   296,   297,   298,   299,   300,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,     0,     0,    25,    26,    27,
-       0,   642,     0,   337,   280,   281,    30,   282,     0,     0,
-       0,   109,     0,     0,     0,     0,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,   283,    33,    25,    26,    27,     0,   284,
-       0,    37,    38,   285,    30,     0,   286,   287,   288,   289,
-      40,    41,     0,   290,   291,     0,     0,     0,     0,     0,
-       0,   292,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    33,     0,     0,     0,   293,     0,   598,    37,
-      38,     0,     0,     0,     0,   295,   599,   297,   298,   299,
-     300,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,     0,     0,
-      25,    26,    27,     0,   642,     0,   337,   280,   281,    30,
-     282,     0,     0,     0,   633,     0,     0,     0,     0,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,   283,    33,    25,    26,
-      27,     0,   284,     0,    37,    38,   285,    30,   452,   286,
-     287,   288,   289,    40,    41,     0,   290,   291,     0,     0,
-       0,     0,     0,     0,   292,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    33,     0,     0,     0,   293,
-       0,   377,    37,    38,     0,     0,     0,     0,   295,   379,
-     297,   298,   299,   300,   473,     2,   204,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,     0,   453,
-      25,    26,    27,  1234,     0,     0,     0,   109,     0,    30,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,     0,     0,    25,
-      26,    27,     0,     0,     0,     0,     0,    33,    30,    34,
-       0,    35,     0,     0,    37,    38,     0,     0,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,     0,    33,    25,    26,    27,
-       0,    36,     0,   205,    38,    39,    30,     0,     0,     0,
-       0,     0,    40,    41,    -3,     0,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,    33,    25,    26,    27,    42,    36,
-     268,   335,   336,    39,    30,     0,     0,     0,   207,     0,
-      40,    41,     0,     0,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,     0,    33,    25,    26,    27,   642,     0,   337,    37,
-      38,     0,    30,     0,     0,     0,   633,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,     0,     0,    25,    26,    27,     0,
-      33,     0,     0,     0,     0,    30,   255,    37,    38,     0,
-       0,     0,     0,     0,   109,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,    33,    25,    26,    27,     0,     0,     0,
-     205,    38,     0,    30,   155,     0,     0,     0,     0,     0,
-       0,     0,   109,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,    33,    25,    26,    27,     0,     0,   268,    37,    38,
-       0,    30,     0,     0,     0,   269,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,     0,     0,    25,    26,    27,     0,    33,
-       0,     0,     0,     0,    30,   255,    37,    38,     0,     0,
-       0,     0,     0,   633,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,     0,    33,    25,    26,    27,     0,     0,     0,    37,
-      38,     0,    30,   337,     0,     0,     0,     0,     0,     0,
-       0,   633,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,     0,
-      33,    25,    26,    27,     0,     0,   453,   205,    38,     0,
-      30,     0,     0,     0,   109,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,     0,    25,    26,    27,     0,    33,     0,
-       0,     0,     0,    30,   268,    37,    38,     0,     0,     0,
-       0,     0,   628,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,    33,    25,    26,    27,     0,     0,     0,    37,    38,
-       0,    30,   598,     0,     0,     0,     0,     0,     0,     0,
-     633,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    33,
-       0,     0,     0,     0,     0,   337,    37,    38,     0,     0,
-       0,     0,     0,   109,     2,   204,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,     0,     0,    25,
-      26,    27,     0,    43,     0,     0,     0,     0,    30,     0,
-       0,   109,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    33,     0,    34,     0,
-      35,     0,     0,    37,    38,   280,   281,     0,   282,  1062,
-       0,  1063,     0,     0,  1064,  1065,  1066,  1067,  1068,  1069,
-    1070,  1071,     0,     0,  1548,  1072,     0,     0,     0,  1073,
-    1074,     0,    32,     0,   283,     0,     0,     0,     0,  -412,
-     648,     0,     0,     0,   285,     0,     0,   286,   287,   288,
-     289,    40,    41,     0,   290,   291,     0,     0,     0,     0,
-       0,     0,   292,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   293,     0,   377,
-       0,     0,   169,     0,     0,     0,   295,   379,   297,   298,
-     299,   300,     0,     0,     0,     0,  1076,     0,   280,   281,
-    -129,   282,  1062,     0,  1063,     0,     0,  1064,  1065,  1066,
-    1067,  1068,  1069,  1070,  1071,     0,     0,     0,  1072,     0,
-       0,     0,  1073,  1074,     0,    32,     0,   283,     0,     0,
-       0,     0,     0,   648,     0,     0,     0,   285,     0,     0,
-     286,   287,   288,   289,    40,    41,     0,   290,   291,     0,
-       0,     0,     0,     0,     0,   292,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     293,     0,   377,     0,     0,   169,     0,     0,     0,   295,
-     379,   297,   298,   299,   300,     0,     0,     0,     0,  1076,
-       0,   280,   281,  -129,   282,  1062,     0,  1063,  1418,  1419,
-    1064,  1065,  1066,  1067,  1068,  1069,  1070,  1071,     0,     0,
-    1548,  1072,     0,     0,     0,  1073,  1074,     0,    32,     0,
-     283,     0,     0,     0,     0,     0,   648,     0,     0,     0,
-     285,     0,     0,   286,   287,   288,   289,    40,    41,     0,
-     290,   291,     0,     0,     0,     0,     0,     0,   292,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   293,     0,   377,     0,     0,   169,     0,
-       0,     0,   295,   379,   297,   298,   299,   300,     0,     0,
-     280,   281,  1076,   282,  1062,     0,  1063,  1418,  1419,  1064,
-    1065,  1066,  1067,  1068,  1069,  1070,  1071,     0,     0,     0,
-    1072,     0,     0,     0,  1073,  1074,     0,    32,     0,   283,
-       0,     0,     0,     0,     0,   648,     0,     0,     0,   285,
-       0,     0,   286,   287,   288,   289,    40,    41,     0,   290,
-     291,     0,     0,     0,     0,     0,     0,   292,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   293,     0,   377,     0,     0,   169,     0,     0,
-       0,   295,   379,   297,   298,   299,   300,     0,     0,   280,
-     281,  1076,   282,  1062,     0,  1063,     0,     0,  1064,  1065,
-    1066,  1067,  1068,  1069,  1070,  1071,     0,     0,     0,  1072,
-       0,     0,     0,  1073,  1074,     0,    32,     0,   283,     0,
-       0,     0,     0,     0,   648,     0,     0,     0,   285,     0,
-       0,   286,   287,   288,   289,    40,    41,     0,   290,   291,
-       0,     0,     0,     0,     0,     0,   292,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   293,     0,   377,     0,     0,   169,     0,     0,     0,
-     295,   379,   297,   298,   299,   300,     0,     0,     0,     0,
-    1076,     2,   204,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,     0,     0,    25,    26,    27,     0,
-       0,     0,     0,     0,     0,    30,     0,   280,   281,     0,
-     282,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   280,   281,     0,   282,
-       0,     0,     0,    33,     0,    34,   283,    35,     0,     0,
-      37,    38,   284,     0,     0,     0,   285,     0,     0,   286,
-     287,   288,   289,    40,    41,   283,   290,   291,     0,     0,
-       0,   648,  1327,     0,   292,   285,     0,     0,   286,   287,
-     288,   289,    40,    41,     0,   290,   291,     0,     0,   293,
-       0,   377,     0,   292,   280,   281,     0,   282,   295,   733,
-     297,   298,   299,   300,     0,     0,     0,     0,   293,     0,
-     784,     0,     0,   280,   281,     0,   282,   295,   379,   297,
-     298,   299,   300,   283,     0,     0,     0,     0,     0,   284,
-       0,     0,     0,   285,     0,     0,   286,   287,   288,   289,
-      40,    41,   283,   290,   291,     0,     0,     0,   284,     0,
-       0,   292,   285,     0,     0,   286,   287,   288,   289,    40,
-      41,     0,   290,   291,     0,     0,   293,     0,   377,     0,
-     292,   280,   281,     0,   282,   295,   826,   297,   298,   299,
-     300,     0,     0,     0,     0,   517,     0,     0,     0,     0,
-       0,     0,     0,     0,   295,   379,   297,   298,   299,   300,
-     283,     0,     0,     0,     0,     0,   284,     0,     0,     0,
-     285,     0,     0,   286,   287,   288,   289,    40,    41,     0,
-     290,   291,     0,     0,     0,     0,     0,     0,   292,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   520,     0,     0,     0,     0,     0,     0,
-       0,     0,   295,   379,   297,   298,   299,   300,     2,   204,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    30,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      33,     0,    34,     0,    35,    36,     0,   172,   173,    39,
-       0,     0,     0,     0,     0,     0,    40,    41,   203,     2,
-     204,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,     0,    25,    26,    27,     0,     0,     0,
-       0,     0,     0,    30,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    33,     0,    34,     0,    35,     0,     0,   205,    38,
-     473,     2,   204,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,     0,     0,    25,    26,    27,     0,
-       0,     0,     0,     0,     0,    30,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    33,     0,    34,     0,    35,     0,     0,
-      37,    38,     2,   204,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,     0,     0,    25,    26,    27,
-       0,     0,     0,     0,     0,     0,    30,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    33,     0,    34,     0,    35,     0,
-       0,   205,    38
-};
-
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-1281))
-
-#define yytable_value_is_error(yytable_value) \
-  YYID (0)
-
-static const yytype_int16 yycheck[] =
-{
-       0,     1,     0,    42,   237,   217,   183,   183,   202,    42,
-       0,     1,     1,   183,    42,   542,   183,   183,   114,   103,
-     184,   455,   519,   343,     0,     0,   628,   454,    28,    29,
-     183,    31,   697,    31,   697,   183,   498,   697,   610,   608,
-     502,    31,    42,   679,    44,   461,    44,   347,  1042,   496,
-     279,   901,   655,     1,    54,    31,    31,   166,   167,   608,
-      60,  1061,    60,    63,   608,    63,    66,   610,    66,   153,
-     347,     0,   578,    63,  1005,   277,    66,    66,   416,   998,
-      80,    81,  1041,  1042,   184,   608,   263,   263,    63,   779,
-      42,   362,   185,   263,   608,   366,   263,   263,   436,    31,
-     264,   528,    31,   199,   104,  1337,   444,   107,   608,    27,
-     263,   776,     0,   776,   114,   263,   776,    42,   608,   722,
-     642,   643,   644,  1054,   758,   424,   425,   611,    38,   254,
-     643,   644,    38,   617,    81,    42,    62,   106,  1418,   661,
-       0,     1,    63,    31,   183,   145,    44,   145,   661,   109,
-     183,    81,   108,   153,   226,   183,   116,  1422,   158,    77,
-     158,   130,    38,   110,   264,   612,   259,   260,   488,   616,
-      50,    31,    44,   245,   743,   109,    43,    44,   814,   109,
-    1073,  1074,   116,   183,   184,    81,   184,   108,   824,    54,
-     637,    43,    44,    38,   641,    38,   408,    84,   108,   199,
-     110,   500,    63,   839,   110,   131,    66,   207,  1440,   207,
-     901,   109,  1492,   735,    43,    44,   216,   494,   108,   219,
-     519,   219,   735,    38,   263,   112,   226,    81,   108,   219,
-     263,   183,   108,    11,   110,   263,   115,   109,   108,   104,
-     404,   241,   107,   743,   219,   245,  1240,   114,  1141,   249,
-     250,   249,   131,   743,   115,  1520,   340,   113,   183,   249,
-    1525,   113,   116,   263,   264,   108,   264,   110,   115,   838,
-     270,    38,   144,   249,   249,     0,   183,   277,   850,   599,
-    1545,   510,     3,   717,   113,   369,   585,  1552,    81,   838,
-     454,   416,   292,   108,   838,   110,  1290,   158,   394,  1474,
-     111,  1525,   250,  1303,   404,   827,    31,   850,   628,   207,
-     610,   436,   818,   633,   827,   838,   109,   249,  1008,   444,
-     249,  1545,   486,   116,   838,   596,   422,   327,  1552,   327,
-    1289,  1290,   428,    81,  1509,   207,  1511,  1256,   838,    94,
-     238,   108,    95,   110,   292,   111,   346,   347,   838,   115,
-      81,   216,   690,    95,   454,  1525,   840,   115,   219,   698,
-     108,   249,     3,   363,     1,   237,   254,   367,   639,   122,
-    1061,   269,    71,   348,   129,  1225,   696,   108,   378,    71,
-     122,   720,  1552,    82,    83,   108,   486,   959,   108,   249,
-      82,    83,   114,   115,   394,   293,   257,   269,   296,    71,
-     261,   108,  1038,  1039,   404,   270,   404,    44,   130,   958,
-      82,    83,   277,   115,   958,    71,     0,   115,  1020,     0,
-    1414,   115,   422,   130,   296,   872,    82,    83,   428,   131,
-     430,   488,   131,   131,   109,   958,  1070,   131,   110,   131,
-     115,    67,   115,    89,    90,    71,   675,   531,    74,   115,
-      76,   130,   772,   115,   454,  1414,    71,    83,   131,   459,
-    1096,  1097,   118,  1463,   464,   131,   103,    82,    83,   131,
-    1470,   343,   109,   473,   108,  1406,  1407,   115,   478,   125,
-     126,   346,   109,   108,   109,   109,   486,   348,   486,   116,
-     490,   115,   490,   131,   494,   110,   109,   497,   363,   499,
-     490,    71,   367,   130,   479,   967,  1003,   144,   120,   121,
-     937,   927,    82,    83,   490,   490,   153,   964,   945,   519,
-     697,   697,   115,  1523,   249,   473,   108,   697,   416,   254,
-     697,   697,   761,   108,  1225,   699,   536,  1140,   131,   539,
-     110,   541,   542,  1115,   697,  1029,  1030,   656,   436,   697,
-     850,   108,   424,   425,   452,   757,   444,   455,   829,    87,
-      88,   490,   833,   461,   991,   690,   203,   663,   429,    71,
-     207,   519,   665,   850,   115,    10,    11,    12,    13,    14,
-      82,    83,   115,   108,   210,   642,   643,   644,   536,   589,
-     131,   539,   470,   541,   542,   109,   596,   115,   131,   699,
-     237,   238,   490,    38,   661,   109,   108,   732,   608,   115,
-     610,   695,  1303,   131,   512,    71,   514,   115,   479,   517,
-     111,   597,   520,   109,   115,   131,    82,    83,   500,   629,
-     490,    66,   269,   131,  1270,   272,   109,    79,   977,   696,
-     282,   589,  1278,  1279,  1280,   645,    71,   519,    73,    74,
-     109,   651,   923,   295,   296,   630,   293,    82,    83,   296,
-     660,   111,   662,   663,   664,   307,   114,  1101,   110,  1303,
-     112,    79,     3,   111,   116,   887,   108,   115,   735,    10,
-      11,    12,    13,    14,    91,    92,   963,   771,   113,     0,
-    1326,   416,   109,   108,   293,   110,   908,   697,   115,   699,
-    1020,   343,   110,   340,   112,   111,   343,    38,   116,   115,
-     108,   436,   712,   585,   662,   772,   664,   118,   718,   444,
-      31,   131,   123,   124,   350,   362,   352,   599,    71,   366,
-     730,    42,   369,    44,   111,    66,   969,   379,   115,    82,
-      83,   602,   108,   743,   744,   109,  1380,   109,   723,    60,
-    1131,   115,    63,   115,  1135,    66,   628,   757,   108,    63,
-     110,   633,   737,   488,   629,   490,   108,   110,   118,   630,
-     827,  1495,  1463,   937,   635,   108,   108,  1501,   110,  1470,
-     645,   945,   730,   108,   893,   110,   118,   424,   425,   111,
-     109,   109,  1319,   118,  1133,   660,   115,   115,  1522,   113,
-     109,   679,   690,  1527,   131,    52,   115,   113,   512,    71,
-     514,    73,    74,   517,   440,   452,   520,   109,   455,   717,
-      82,    83,   109,   115,   461,   424,   425,   128,   115,   130,
-     113,  1102,  1523,  1467,   145,  1469,   473,   937,   838,  1033,
-    1160,   114,   115,   109,   732,   945,   108,   158,    95,   115,
-     850,   113,  1191,  1192,   109,   108,   831,   110,   834,   131,
-     115,   498,   723,   500,  1529,   502,  1529,   131,   109,  1529,
-     115,   116,   183,   184,   115,   512,   737,   514,   109,   109,
-     517,   109,   519,   520,   115,   115,    71,   115,    73,    74,
-    1524,   108,   757,   893,   531,   108,   207,    82,    83,   109,
-     900,   901,  1131,   109,   109,   115,  1135,  1136,   219,   115,
-     115,   901,    81,   512,   556,   557,   558,   108,   517,   110,
-    1240,   520,   108,   923,   110,   901,   901,   109,   110,     4,
-       5,     6,     7,     8,     9,   108,   814,   937,   249,    71,
-     111,    73,    74,    81,   191,   945,   824,  1056,   585,   119,
-      82,    83,   263,   901,   108,   109,   110,   599,   108,   596,
-     110,   839,   599,   963,   108,   690,   110,   214,    57,    58,
-     831,   696,   108,   109,   110,   574,   108,   224,   968,   968,
-     108,   113,   110,   983,  1041,     4,     5,     6,     7,     8,
-       9,   628,   992,    68,   127,    70,   633,   108,   109,   110,
-    1000,   128,   639,  1003,   130,  1005,    71,   732,    73,    74,
-      75,   110,   108,   901,   110,     3,   327,    82,    83,   114,
-     115,  1250,    10,    11,    12,    13,    14,  1123,    71,   927,
-      73,    74,    75,   115,   116,   983,   347,   115,   116,    82,
-      83,   901,   108,   108,   110,   110,   293,   772,  1023,    68,
-      38,    70,  1000,   118,  1054,  1003,   131,  1005,   695,   108,
-     109,   110,  1401,    93,  1064,   108,   108,  1067,  1068,  1069,
-     108,  1061,    10,    11,    12,    13,    14,  1504,    66,  1418,
-     717,   563,   564,   565,   566,  1061,  1061,    71,   111,    73,
-      74,   733,  1092,   404,    43,    44,    44,   969,    82,    83,
-      38,   111,   702,  1160,   704,   109,  1054,   109,   968,  1338,
-     747,   109,    60,  1342,   109,    63,  1064,   109,    66,  1067,
-    1068,  1069,     3,  1123,   561,   562,   110,  1554,    66,    10,
-      11,    12,    13,    14,   771,   109,  1220,   779,    71,   108,
-      73,    74,    75,   454,   111,   109,   111,   111,  1020,    82,
-      83,   115,  1491,  1492,    57,    58,    59,    38,   567,   568,
-    1038,  1039,  1023,  1262,  1263,  1264,   130,   131,   559,   560,
-     108,   110,   110,  1061,   115,   108,   901,   130,   113,   490,
-     118,   108,   111,   494,   826,    66,   109,   109,   116,   115,
-     111,   111,   829,   111,   441,   111,   833,   145,  1198,   116,
-      28,  1061,   116,  1101,   109,    84,    85,    86,   109,   111,
-     158,   109,  1202,  1203,  1203,  1444,   113,   116,  1096,  1097,
-    1220,   114,   114,   114,   108,  1225,   115,  1202,   475,   108,
-     115,   110,  1289,   112,   113,  1225,   184,   109,     4,     5,
-       6,     7,     8,     9,   131,   109,   109,   116,   109,  1225,
-    1225,   109,   109,   115,  1244,  1244,    71,   109,   109,   207,
-      75,   109,  1262,  1263,  1264,   512,    32,    82,    83,   109,
-     517,   219,   109,   520,   109,   109,    71,  1225,    73,    74,
-      75,    84,    85,    86,   109,   109,   923,    82,    83,   470,
-     927,   109,   109,   108,   114,   110,   109,   608,   109,   610,
-      28,  1397,    68,   118,    70,   108,  1539,   110,  1298,   112,
-     113,   698,   111,  1303,  1262,  1263,  1264,   109,   130,  1319,
-    1320,   109,   109,  1298,   114,   109,   115,  1303,  1303,   111,
-     967,   968,   969,   720,   111,   109,  1061,  1225,    71,   109,
-     115,  1202,    75,  1203,   109,   901,   115,  1337,  1337,    82,
-      83,   115,  1529,  1529,   116,   113,   111,    71,   109,  1529,
-    1238,    75,  1529,  1529,   111,  1225,  1530,   115,    82,    83,
-     115,  1319,  1320,   109,  1374,   108,  1529,  1377,  1020,   327,
-     109,  1529,   108,  1020,  1244,   118,   697,   108,   699,   108,
-    1554,   108,  1270,   108,   108,   111,  1396,  1397,   116,   131,
-    1278,  1279,  1280,   114,   118,   109,  1406,  1407,  1504,    71,
-     109,    73,    74,    75,   109,  1303,     0,     1,   128,  1061,
-      82,    83,  1422,   114,   811,   113,  1374,  1427,   111,  1377,
-    1530,   678,   743,   744,   131,  1160,   109,  1298,   115,   111,
-     687,   115,   111,  1303,   691,  1445,   109,    31,  1326,   109,
-    1440,  1440,   109,   111,  1554,   111,   404,  1457,  1406,  1407,
-      44,   111,   109,    54,  1101,  1102,   111,   111,   111,    46,
-      29,   109,   131,  1463,  1422,   114,   131,  1337,   131,  1427,
-    1470,    71,    66,    73,    74,    75,   114,  1463,  1463,   131,
-    1529,   131,    82,    83,  1470,  1470,  1529,  1445,   679,   116,
-    1225,  1529,   889,   109,  1504,  1505,   111,   114,  1064,  1457,
-     111,   111,   111,   104,  1514,  1240,   107,   111,   108,   103,
-    1520,    80,    81,   111,   111,  1525,   111,   838,   118,  1529,
-    1530,  1396,  1530,  1523,   109,  1177,   109,   111,   108,   850,
-     111,    63,   108,  1543,   108,  1545,    59,  1523,  1523,  1549,
-     113,   109,  1552,   109,  1554,   131,  1554,  1505,    80,   116,
-    1560,   145,   153,   111,  1564,   111,  1514,   109,   111,   153,
-     154,   109,  1520,   108,  1472,  1463,  1474,  1525,  1303,    95,
-    1440,    95,  1470,  1220,   108,   114,   131,   115,   111,   109,
-     977,   109,   109,   115,   109,  1543,    41,  1545,   131,   131,
-     184,  1549,    95,  1463,  1552,  1204,  1205,  1244,  1207,   116,
-    1470,  1509,  1560,  1511,  1213,   199,  1564,  1216,   202,   203,
-     109,  1008,   109,   207,    95,   216,   937,   131,   109,   109,
-     131,   116,   131,   814,   945,  1523,   158,   109,   114,   109,
-      50,   131,    52,   824,   228,    55,    56,    57,   232,    59,
-     234,   111,   963,   111,   108,   114,   131,   114,   839,   243,
-     109,   109,   131,  1523,    74,   249,   109,  1539,   109,  1225,
-     254,  1058,  1076,   569,  1225,   570,    86,    87,   925,   270,
-     264,   571,   241,  1492,    63,   573,   277,  1382,   272,   572,
-      25,    26,    27,  1564,    73,  1313,  1136,   219,  1342,  1470,
-    1337,    10,    11,    12,    13,    14,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,  1092,    29,    30,    31,   452,    38,
-     452,   945,   704,   464,    38,   257,   115,   893,  1463,   261,
-     947,   992,   589,   965,   657,  1470,  1133,   747,  1244,   490,
-     757,   577,    -1,    -1,   577,   346,   340,    66,   577,   343,
-      -1,    96,    66,    98,  1320,   349,    -1,    -1,    -1,    73,
-      74,    -1,   363,    77,    -1,    -1,   367,  1376,   362,   158,
-      -1,    -1,   366,    -1,    -1,   369,    -1,    10,    11,    12,
-      13,    14,    -1,    -1,    -1,    -1,    -1,    -1,  1523,   108,
-      -1,   110,    -1,  1440,  1191,  1192,   110,    -1,    -1,   118,
-      -1,    -1,    -1,    -1,   118,    38,    -1,    -1,  1374,   378,
-      -1,  1377,    -1,    -1,    -1,  1072,   348,    -1,    -1,    -1,
-      -1,    -1,   416,    -1,    -1,  1472,    -1,  1474,    -1,   430,
-     219,    -1,    -1,    66,   179,    -1,    -1,   431,    -1,    -1,
-      -1,    -1,   436,    -1,   189,   190,    -1,  1038,  1039,   194,
-     444,   196,   197,    -1,    -1,    -1,  1422,    -1,    -1,    -1,
-      -1,  1427,  1509,    -1,  1511,    -1,    -1,    -1,   257,    -1,
-      -1,    -1,   261,    -1,    -1,   108,   470,   110,    -1,   473,
-      -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,   277,    -1,
-     459,  1457,  1539,    -1,   488,   464,   490,   429,    -1,    10,
-      11,    12,    13,    14,   498,  1096,  1097,    -1,   502,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    10,    11,    12,
-      13,    14,    -1,   343,   344,    -1,    -1,    38,   497,    71,
-     499,    73,    74,    75,    -1,   355,   356,   531,   532,    -1,
-      82,    83,    -1,    -1,    -1,    38,    -1,   479,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    66,    -1,    -1,    -1,   348,
-      71,    -1,    73,    74,    75,    -1,   108,    -1,   110,    -1,
-      -1,    82,    83,    66,   116,    -1,   118,  1543,    71,    -1,
-      73,    74,    75,  1549,   578,    -1,    -1,    -1,    -1,    82,
-      83,    -1,    -1,    -1,  1560,   596,    -1,   108,  1564,   110,
-      -1,    -1,   596,   597,  1401,   599,    -1,   118,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   108,   610,   110,    -1,    -1,
-      -1,  1418,    -1,    -1,    -1,   118,    -1,    -1,   629,    -1,
-      -1,    -1,    -1,    -1,   628,    -1,    -1,    -1,    -1,   633,
-     429,    -1,    -1,    -1,   645,   639,    -1,  1238,   642,   643,
-     644,    -1,    -1,    -1,    -1,  1312,    -1,   446,    -1,   660,
-      71,    -1,    73,    74,    75,    -1,    -1,   661,    -1,    -1,
-     602,    82,    83,    -1,    -1,    -1,    -1,    -1,    -1,  1270,
-      -1,    -1,   651,    -1,    -1,   679,    -1,  1278,  1279,  1280,
-     479,    -1,    -1,    -1,  1491,  1492,   690,   108,   630,   110,
-      -1,   695,   696,   635,    -1,   699,    -1,   118,    -1,    -1,
-      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,     0,    -1,
-      29,    30,    31,    -1,    -1,  1326,    -1,    -1,   732,    38,
-      39,   735,    -1,   712,    -1,    -1,    -1,    -1,    -1,   718,
-     744,    -1,    -1,   747,    -1,     0,   757,    -1,    -1,    31,
-      71,    -1,    73,    74,    75,    -1,    -1,    66,    -1,    -1,
-      -1,    82,    83,    -1,    73,    74,    -1,   771,   772,    -1,
-      -1,    -1,    -1,   777,    -1,    -1,    31,    -1,    -1,    -1,
-      -1,   723,    -1,    -1,    66,    -1,    -1,   108,    -1,   110,
-      -1,    -1,    -1,    -1,    -1,   737,    -1,   118,  1529,    -1,
-      -1,   110,    -1,   602,  1471,   114,  1473,    -1,    -1,   118,
-     814,    66,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     824,    -1,    -1,   827,    -1,   829,   581,   582,   832,   833,
-     834,   630,    -1,    -1,    -1,   839,   635,    -1,    -1,    -1,
-      -1,  1508,    -1,  1510,    -1,   849,    71,    -1,    73,    74,
-      75,    -1,    -1,    -1,    -1,    -1,   611,    82,    83,   614,
-     615,    -1,   617,    -1,   619,   620,    -1,    -1,    -1,   624,
-     625,    -1,   154,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   108,    -1,    -1,  1553,    -1,  1555,   831,
-      -1,    -1,    -1,   118,   724,    -1,   726,   901,    -1,   154,
-      -1,  1568,  1569,   733,   734,    -1,    -1,   130,   738,    -1,
-      -1,    -1,   923,    -1,   893,    -1,   187,    -1,    -1,   923,
-     750,   900,    -1,   194,   723,   755,    -1,    -1,    10,    11,
-      12,    13,    14,    -1,    -1,    -1,    -1,    -1,   737,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   228,    -1,    -1,    -1,
-      -1,   781,    -1,   708,   709,   959,    38,    -1,   757,   714,
-      -1,    -1,    -1,   967,   968,    -1,    -1,   249,    -1,    -1,
-      -1,    -1,   254,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   985,    -1,    -1,    66,    -1,    -1,    -1,    -1,    71,
-      -1,    73,    74,    75,   249,   266,   826,    -1,    -1,   254,
-      82,    83,    -1,    -1,    -1,    -1,    25,    26,    27,    -1,
-      -1,    -1,    -1,   992,    -1,    -1,  1020,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   108,    -1,   110,  1033,
-      -1,    -1,   831,    -1,  1038,  1039,   118,  1041,  1042,    -1,
-      -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,    -1,
-      -1,   322,    -1,   883,   884,   885,   886,  1061,   888,   330,
-      -1,    -1,   333,    -1,    -1,    -1,    -1,   349,    -1,    -1,
-      -1,    -1,    38,    -1,   904,    -1,    -1,    96,    -1,    98,
-      -1,  1023,    -1,    -1,    -1,    -1,    -1,    -1,   918,    -1,
-      -1,    -1,  1096,  1097,   349,    -1,    -1,    -1,  1102,    -1,
-      66,    -1,    -1,    -1,   123,    71,    -1,    73,    74,    75,
-      -1,    -1,    -1,  1092,    -1,    -1,    82,    83,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   396,    -1,   957,    -1,   400,
-      -1,    -1,    -1,    -1,   416,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,    -1,   431,
-      -1,    -1,   118,    -1,   436,    -1,  1160,    -1,    -1,    -1,
-     179,   416,   444,    -1,    -1,    -1,    -1,   997,   187,    -1,
-     189,   190,    -1,    -1,  1004,   194,   431,   196,   197,  1009,
-      -1,   436,    -1,    -1,  1014,    -1,  1016,    -1,   470,   444,
-    1020,  1021,  1022,    -1,    -1,  1025,    -1,    -1,    -1,  1203,
-      -1,    -1,    -1,    -1,  1034,    -1,   488,    -1,   490,  1220,
-      -1,    -1,    -1,    -1,   485,   470,  1220,    -1,    -1,  1198,
-      -1,  1225,  1052,  1053,  1023,    -1,    -1,    -1,    10,    11,
-      12,    13,    14,   488,  1238,   490,  1240,    -1,    -1,    -1,
-    1244,    -1,    -1,    -1,    -1,    -1,    -1,   266,    -1,  1079,
-     532,    -1,  1082,    -1,    -1,    -1,    38,    -1,    -1,    -1,
-    1202,    -1,    -1,    -1,    -1,    -1,  1270,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1278,  1279,  1280,   532,    -1,    -1,
-      -1,    -1,    -1,    -1,    66,  1289,  1290,    -1,    -1,    71,
-    1120,    73,    74,    75,    -1,    -1,  1126,  1127,    -1,  1303,
-      82,    83,    -1,    -1,    -1,    -1,   577,   578,  1138,    -1,
-      -1,    -1,    -1,  1143,    -1,   597,  1146,    -1,  1148,    -1,
-      -1,  1151,  1326,    -1,    -1,    -1,   108,    -1,    -1,    -1,
-      -1,    -1,    -1,  1337,  1164,    -1,   118,    -1,    -1,    -1,
-      -1,    -1,   597,  1098,    -1,    -1,    -1,  1177,    -1,  1179,
-    1180,  1181,  1182,    -1,    -1,    -1,  1298,    -1,    -1,    -1,
-     642,   643,   644,    -1,    -1,  1195,    -1,  1197,    -1,    -1,
-      -1,  1201,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   661,
-      -1,    -1,    -1,    -1,    -1,  1396,    -1,   642,   643,   644,
-      -1,    -1,    -1,    -1,    -1,   666,    -1,   679,    -1,   670,
-    1230,  1231,    -1,  1202,    -1,    -1,   661,    -1,   690,    -1,
-    1414,    -1,     0,    -1,   696,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   679,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   703,    -1,    -1,   690,  1440,    -1,    -1,     0,
-      -1,   696,    -1,    31,    -1,     0,     1,    -1,    -1,    -1,
-     732,  1281,  1282,   735,    -1,    -1,    -1,    -1,    -1,  1463,
-      -1,  1291,    -1,    -1,    -1,    -1,  1470,  1222,    -1,    -1,
-      31,    -1,    -1,    -1,    -1,    -1,    31,   732,    66,    -1,
-     735,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     772,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1298,
-      -1,    -1,    -1,    -1,    -1,    66,    -1,    -1,    63,    -1,
-      -1,    66,    -1,  1343,    -1,    -1,    -1,   772,    -1,  1523,
-      -1,    -1,    -1,    -1,    -1,  1355,  1530,  1357,  1358,  1359,
-      -1,    -1,   814,    -1,    -1,    -1,    -1,    -1,    -1,  1369,
-      -1,    -1,   824,    -1,    -1,   827,    -1,   818,  1378,    -1,
-     832,    -1,   834,    -1,    -1,    -1,    -1,   839,    -1,   814,
-      -1,    -1,   581,   582,  1394,    -1,   154,    -1,    -1,   824,
-      -1,    -1,   827,    -1,    -1,    -1,    -1,   832,    -1,   834,
-      -1,    -1,    -1,    -1,   839,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   611,   154,    -1,   614,   615,    -1,   617,   154,
-     619,   620,    -1,    -1,    -1,   624,   625,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   901,
-    1450,  1451,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1463,    -1,    -1,    -1,    -1,    -1,    -1,
-    1470,    -1,    -1,    -1,    -1,    -1,   901,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     931,   249,    -1,    -1,   219,    -1,   254,    -1,    -1,    -1,
-      -1,    -1,    -1,  1503,    -1,    -1,    -1,  1507,    -1,    -1,
-      -1,    -1,    -1,    -1,   703,    -1,    -1,    -1,   249,   708,
-     709,    -1,    -1,   254,   249,   714,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   985,    -1,    -1,  1536,    -1,  1538,    -1,
-      -1,    -1,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
-     985,    29,    30,    31,    -1,    -1,  1566,  1567,    -1,  1010,
-      38,    39,    -1,    -1,  1574,  1575,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1026,  1038,  1039,    -1,  1041,
-    1042,   349,    -1,    -1,    -1,    -1,    -1,    -1,    66,    -1,
-      -1,    -1,    -1,    -1,    -1,    73,    74,    -1,    -1,  1061,
-      -1,    -1,    -1,  1038,  1039,    -1,  1041,  1042,   349,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,  1061,    -1,    29,    30,
-      31,    -1,   110,    -1,  1096,  1097,   114,    38,    -1,    -1,
-     118,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   416,    -1,
-      -1,    -1,  1103,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1096,  1097,   431,    -1,    66,    -1,    -1,   436,    -1,
-      71,    -1,    73,    74,    75,   416,   444,    -1,    -1,    -1,
-      -1,    82,    83,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     431,    -1,    -1,    -1,    -1,   436,   431,    -1,  1160,    -1,
-      -1,    -1,   470,   444,    -1,    -1,    -1,   108,    -1,   110,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,
-     488,    -1,   490,    -1,    -1,  1160,    -1,    -1,    -1,   470,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1203,    -1,    -1,    -1,    -1,    -1,   488,    -1,   490,
-      -1,    -1,    -1,    -1,    -1,   490,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1225,   532,    -1,    -1,    -1,  1203,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1238,    -1,  1240,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1225,   532,    -1,    -1,    -1,    -1,    -1,   532,    -1,    -1,
-      -1,    -1,    -1,  1238,    -1,  1240,    -1,    -1,  1270,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1278,  1279,  1280,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1289,  1290,   597,
-      -1,    -1,    -1,    -1,    -1,  1270,    -1,    -1,    -1,    -1,
-      -1,  1303,    -1,  1278,  1279,  1280,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1289,  1290,   597,    -1,    -1,    -1,
-      -1,    -1,   597,    -1,  1326,    -1,    -1,    -1,  1303,    -1,
-      -1,    -1,    -1,    -1,   642,   643,   644,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1326,    -1,   661,    -1,    -1,    -1,    -1,    -1,  1098,
-      -1,   642,   643,   644,    -1,    -1,    -1,   642,   643,   644,
-      -1,   679,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     661,    -1,   690,    -1,    -1,    -1,   661,    -1,   696,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   679,     7,
-      -1,    -1,    10,    11,    12,    13,    14,    -1,    -1,   690,
-      -1,    -1,  1414,    -1,    -1,   696,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   732,    -1,    -1,   735,    36,    37,
-      38,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1414,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   732,    -1,    -1,   735,    -1,    -1,    65,    66,    -1,
-     735,  1463,    -1,    71,   772,    -1,    -1,    75,  1470,    -1,
-      78,    79,    80,    81,    82,    83,    -1,    85,    86,    -1,
-      -1,    -1,    -1,  1222,    -1,    93,    -1,    -1,  1463,    -1,
-      -1,   772,    -1,    -1,    -1,  1470,    -1,    -1,    -1,    -1,
-     108,    -1,   110,    -1,    -1,    -1,   814,    -1,    -1,   117,
-     118,   119,   120,   121,   122,    -1,   824,    -1,    -1,   827,
-      -1,  1523,    -1,    -1,   832,    -1,   834,    -1,    -1,    -1,
-      -1,   839,    -1,   814,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   824,    -1,    -1,   827,    -1,  1523,    -1,
-      -1,   832,   827,   834,    -1,    -1,    -1,    -1,   839,   834,
-      -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,   901,    29,    30,    31,    32,    -1,    -1,
-      35,    -1,    -1,    38,    39,    -1,    -1,    -1,    -1,    10,
-      11,    12,    13,    14,    -1,    10,    11,    12,    13,    14,
-     901,    -1,    -1,    -1,    -1,    -1,   901,    -1,    63,    -1,
-      -1,    66,    44,    68,    -1,    70,    71,    38,    73,    74,
-      75,    -1,    -1,    38,    -1,    -1,    -1,    82,    83,    -1,
-      -1,    63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    66,    -1,    -1,    -1,    -1,
-      71,    66,    -1,   108,    75,   110,    71,   985,    -1,    -1,
-      75,    82,    83,   118,    -1,    -1,    -1,    82,    83,    -1,
-      -1,    -1,    -1,   968,    -1,    -1,    -1,   109,    -1,    -1,
-      -1,    -1,    -1,   115,   985,    -1,    -1,   108,    -1,    -1,
-     985,    -1,    -1,   108,    -1,    -1,    -1,   118,    -1,    -1,
-      -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    -1,    -1,
-    1038,  1039,   144,  1041,  1042,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   154,    -1,    -1,    -1,   158,    -1,    -1,    -1,
-      -1,    -1,    -1,  1061,    -1,    -1,    -1,  1038,  1039,    -1,
-    1041,  1042,    -1,    -1,    -1,    -1,  1041,  1042,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1061,    -1,    -1,    -1,    -1,    -1,  1061,    -1,  1096,  1097,
-      -1,    -1,    -1,    -1,    -1,   207,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   219,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1096,  1097,    -1,    -1,    -1,
-      -1,    36,    37,    -1,    39,   237,   238,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    -1,    -1,    29,    30,    31,   261,
-      65,    -1,  1160,    -1,    -1,    38,    71,   269,    -1,    -1,
-      75,    -1,    -1,    78,    79,    80,    81,    82,    83,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,  1160,
-      -1,   293,    -1,    66,   296,    -1,    -1,    -1,    -1,    -1,
-      73,    74,    -1,   108,    -1,  1203,    -1,    -1,    -1,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1225,    -1,    -1,
-      -1,    -1,  1203,    -1,    -1,    -1,    -1,  1202,  1203,    -1,
-    1238,   343,  1240,    -1,    -1,   118,   348,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1225,    -1,    -1,    -1,    -1,    -1,
-    1225,    -1,    -1,    -1,    -1,    -1,    -1,  1238,    -1,  1240,
-      -1,    -1,  1270,    -1,    -1,    -1,    -1,    -1,    -1,  1244,
-    1278,  1279,  1280,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1289,  1290,    -1,    -1,    -1,    -1,    -1,    -1,  1270,
-      -1,    -1,    -1,    -1,    -1,  1303,    -1,  1278,  1279,  1280,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1289,  1290,
-      -1,    -1,   424,   425,  1289,  1290,    -1,    -1,  1326,   431,
-      -1,    -1,  1303,  1298,    -1,    -1,    -1,    -1,  1303,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     452,    -1,    -1,   455,    -1,  1326,    -1,    -1,    -1,   461,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1337,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   488,    -1,    -1,    -1,
-      63,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   500,    -1,
-      73,    -1,    75,    -1,    77,    -1,    -1,    -1,    -1,    -1,
-     512,    84,   514,    -1,    -1,   517,  1414,   519,   520,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     532,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   115,  1414,   117,   118,   119,    -1,    -1,  1414,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1463,    -1,    43,    -1,    -1,
-      -1,    -1,  1470,    -1,    -1,  1440,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   585,    -1,   158,    -1,    -1,    -1,    -1,
-      -1,    -1,  1463,    -1,    -1,   597,    -1,   599,  1463,  1470,
-     602,    -1,    -1,    -1,    -1,  1470,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    99,    -1,  1523,   628,    -1,    -1,    -1,
-      -1,   633,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     642,   643,   644,    -1,    -1,    -1,   219,    -1,   221,   222,
-     223,    -1,  1523,    -1,    -1,    -1,    -1,    -1,  1523,   661,
-      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,   155,
-      29,    30,    31,    -1,   257,    -1,    -1,    -1,   261,    38,
-      -1,    -1,    -1,   169,   696,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   277,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   717,   192,    66,    -1,    -1,
-      -1,    -1,    -1,    -1,    73,    74,    -1,    -1,    77,    -1,
-     206,    -1,    -1,   735,    -1,   737,    -1,    -1,    -1,   215,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   225,
-      -1,    -1,    -1,    -1,   327,    -1,    -1,    -1,    -1,   108,
-      -1,   110,    36,    37,    -1,    39,    -1,    -1,    -1,   118,
-     772,    -1,    -1,    -1,   250,   348,    -1,    -1,    -1,   255,
-     353,   354,    -1,    -1,    -1,    -1,    -1,    -1,   361,    -1,
-      -1,    65,   268,    -1,    -1,    -1,    -1,    71,   274,    -1,
-     276,    75,    -1,    -1,    78,    79,    80,    81,    82,    83,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,   294,    93,
-      -1,    -1,    -1,    -1,    -1,   827,    -1,    -1,    -1,   831,
-      -1,   404,   834,    -1,   108,    -1,   110,    -1,    -1,   113,
-      -1,    -1,    -1,   117,   118,   119,   120,   121,   122,   422,
-      -1,    -1,    -1,    -1,   427,    -1,   429,    -1,    -1,    -1,
-      -1,   337,    -1,    -1,    -1,    -1,   342,    -1,    -1,    -1,
-      -1,    -1,    -1,   446,    -1,    -1,   449,   450,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   465,    -1,   370,    -1,    -1,    -1,   374,   375,
-      -1,   377,    -1,    -1,    -1,    -1,   479,    -1,   384,   385,
-      -1,   387,   388,   486,   390,    -1,   392,    -1,    -1,    -1,
-      -1,    -1,    -1,     7,    -1,   927,    10,    11,    12,    13,
-      14,    -1,    -1,   409,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   417,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    36,    37,    38,    39,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   442,   969,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   453,    -1,    -1,
-      -1,    65,    66,   985,    -1,    -1,    -1,    71,    -1,    -1,
-      -1,    75,    -1,    -1,    78,    79,    80,    81,    82,    83,
-     476,    85,    86,    -1,    -1,    -1,   482,    -1,    -1,    93,
-      -1,   487,    -1,    -1,    -1,    -1,    -1,    -1,  1020,    -1,
-      -1,    -1,    -1,    -1,   108,    -1,   110,    -1,    -1,   602,
-      -1,    -1,    -1,   117,   118,   119,   120,   121,   122,  1041,
-    1042,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   524,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   630,   280,    -1,
-     282,   283,   635,    -1,   540,    -1,    -1,    -1,   290,   291,
-      -1,    -1,    -1,   295,   296,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   307,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    36,    37,    -1,    39,  1101,
-      -1,   577,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     586,    -1,    -1,    -1,    -1,    -1,    -1,   593,    -1,    -1,
-      -1,   343,   598,    -1,    65,    -1,    -1,    -1,    -1,    -1,
-      71,    -1,    -1,   609,    75,    -1,    -1,    78,    79,    80,
-      81,    82,    83,    -1,    85,    86,    -1,    -1,    -1,    -1,
-     723,    -1,    93,    -1,    -1,    -1,    -1,   379,  1160,    -1,
-      -1,    -1,    -1,    -1,   737,    -1,    -1,   108,    -1,   110,
-      -1,    -1,    -1,    -1,   650,   116,   117,   118,   119,   120,
-     121,   122,    -1,    -1,   757,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1202,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     686,    -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    29,    30,    31,    -1,  1240,    -1,
-      -1,    -1,    -1,    38,    -1,   818,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   831,    -1,
-      -1,    -1,    -1,    -1,    -1,   741,    -1,    -1,    -1,    -1,
-      -1,    66,    -1,    -1,    -1,   751,   752,   850,    73,    74,
-      -1,    -1,    77,    -1,    -1,    -1,    -1,  1289,  1290,   765,
-      -1,    -1,    -1,    -1,    -1,    -1,  1298,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   782,    -1,   784,    -1,
-      -1,    -1,   788,   108,    -1,   110,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   556,   557,   558,   559,   560,   561,
-     562,   563,   564,   565,   566,   567,   568,   569,   570,   571,
-     572,   573,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      36,    37,    -1,    39,   937,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   599,   854,    -1,
-      -1,    -1,    -1,    -1,    -1,   861,    -1,    -1,    -1,    65,
-     963,    -1,    -1,    -1,    -1,    71,    -1,    -1,   874,    75,
-     876,    -1,    78,    79,    80,    81,    82,    83,    -1,    85,
-      86,    -1,  1414,    -1,   890,    -1,    -1,    93,   991,    -1,
-      -1,   897,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   108,   909,   110,    -1,   912,    -1,    -1,   115,
-      -1,   117,   118,   119,   120,   121,   122,    -1,    -1,    -1,
-    1023,    -1,    -1,    -1,   930,    -1,    -1,    -1,    -1,    -1,
-      -1,  1034,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1472,    -1,  1474,    -1,    -1,    -1,   698,    -1,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    -1,    -1,   720,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    38,  1509,    -1,  1511,
-      -1,   733,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      -1,    29,    30,    31,    66,    -1,    -1,  1539,    -1,    -1,
-      38,    -1,  1115,  1019,    -1,    77,    -1,    -1,    -1,   153,
-     154,    -1,    -1,    -1,    -1,    -1,    -1,   779,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    -1,
-      -1,    -1,    -1,    71,    -1,    73,    74,    75,    -1,    77,
-      -1,    -1,    -1,   187,    82,    83,    -1,    -1,    -1,   811,
-     194,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1075,
-      -1,    -1,    -1,    -1,   826,    -1,  1082,    -1,    -1,    -1,
-     108,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     118,    36,    37,    -1,    39,    -1,    -1,    -1,    -1,  1202,
-      -1,    -1,    -1,    -1,    -1,  1111,    -1,    -1,    -1,    -1,
-    1116,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1124,    -1,
-      65,    -1,    -1,    -1,    -1,    -1,    71,    -1,    73,    74,
-      75,    -1,   266,    78,    79,    80,    81,    82,    83,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,  1155,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1167,    -1,   108,  1170,   110,  1172,   112,   113,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,    -1,    -1,
-    1186,  1187,    -1,    -1,    -1,    -1,    -1,    -1,   322,    -1,
-      -1,    -1,    -1,    -1,    -1,  1298,   330,   331,    -1,   333,
-     334,    -1,  1208,    -1,    -1,    -1,    -1,    -1,    -1,   343,
-      -1,    -1,    -1,   347,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   977,    -1,    -1,    -1,  1235,
-     144,    -1,   366,    -1,    -1,   369,    -1,    -1,    -1,    -1,
-     154,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   166,   167,    -1,    -1,  1008,    -1,    -1,    -1,
-      -1,    -1,   396,    -1,    -1,    -1,   400,    -1,  1020,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,    -1,    29,    30,    31,   431,    -1,    -1,
-      -1,    -1,    -1,    38,    -1,    -1,    -1,    -1,    -1,  1061,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     454,    -1,    -1,   237,    -1,    -1,  1332,    -1,  1334,    -1,
-      -1,    66,    -1,    68,    -1,    70,    -1,    -1,    73,    74,
-      -1,  1347,    -1,  1349,    -1,    -1,    -1,    -1,   262,    -1,
-      -1,   485,    -1,    -1,   488,    -1,    -1,    -1,    -1,    -1,
-      -1,  1367,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,   110,    -1,  1383,  1384,    -1,
-      -1,  1133,    -1,   118,    -1,    -1,    -1,    -1,    -1,  1395,
-      -1,    -1,  1398,    -1,   528,    -1,    -1,   531,   532,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1420,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1429,    -1,  1177,  1432,    -1,  1434,  1435,
-    1436,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1191,
-    1192,    -1,    -1,   577,   578,    -1,    -1,    -1,    -1,    -1,
-      -1,  1554,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   596,   597,   378,   599,    -1,    -1,    -1,    -1,
-    1476,    -1,  1478,    -1,   608,  1481,   610,   611,    -1,    -1,
-      -1,    -1,    -1,   617,    -1,    -1,    -1,    -1,    -1,    -1,
-    1496,    -1,    -1,   627,   628,    -1,    -1,    -1,    -1,   633,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   642,   643,
-     644,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   661,    -1,    -1,
-      -1,    -1,   666,   667,    -1,    -1,   670,   671,    -1,    -1,
-      -1,    -1,    -1,   677,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   695,   696,   697,    -1,   699,   480,    -1,    -1,   703,
-      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    -1,    -1,
-      29,    30,    31,    -1,    -1,    -1,    -1,    -1,    -1,    38,
-      -1,   735,   736,    -1,    -1,   519,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   532,    -1,
-      -1,    -1,    -1,    -1,    -1,   539,    -1,    66,   542,    -1,
-      -1,    -1,    -1,    -1,    73,    74,    -1,   771,   772,   553,
-     554,    -1,   776,   777,    -1,    -1,    -1,    -1,    -1,  1401,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   575,    -1,    -1,    -1,    -1,  1418,    -1,    -1,    -1,
-      -1,   585,    -1,    -1,    -1,    -1,    -1,    -1,   592,   118,
-      -1,    -1,    -1,   597,   818,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   827,    -1,    -1,    -1,    -1,    -1,   833,
-     834,    -1,    -1,    -1,   838,    -1,   840,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   850,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   647,    -1,    -1,    -1,    -1,    -1,  1491,
-    1492,    -1,   656,    -1,    -1,    -1,    -1,    -1,    -1,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    -1,    29,    30,    31,    32,    -1,
-      -1,    35,   696,    -1,    38,    39,    -1,    -1,    -1,   923,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   931,    36,    37,
-      -1,    39,    -1,   937,    -1,    -1,    -1,    -1,    -1,    63,
-      -1,   945,    66,    -1,    68,    -1,    70,    71,    -1,    73,
-      74,    75,    -1,    -1,   958,   959,    -1,    65,    82,    83,
-      -1,    -1,    -1,    71,    -1,    -1,    -1,    75,    -1,    -1,
-      78,    79,    80,    81,    82,    83,    -1,    85,    86,    -1,
-      -1,   985,    -1,    -1,   108,    93,   110,   991,   772,    -1,
-     774,    -1,    -1,    -1,   118,    -1,   780,    -1,    -1,    -1,
-     108,    -1,   110,   787,    -1,   113,  1010,  1011,    -1,   117,
-     118,   119,   120,   121,   122,    -1,  1020,    -1,    -1,    -1,
-      -1,    -1,  1026,  1027,    -1,  1029,  1030,  1031,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1041,  1042,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   831,   832,    -1,
-     834,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   849,    -1,    -1,    -1,    -1,
+      24,    25,    26,    27,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1102,  1103,
-    1104,    -1,    -1,    -1,    -1,   889,    -1,    -1,    -1,   893,
-      -1,  1115,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
+      -1,    -1,    -1,    67,    -1,    69,    -1,    71,    72,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
+      84,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,
+      -1,    -1,    74,    75,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
+      69,    -1,    71,    -1,    -1,    74,    75,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    -1,    29,    30,    31,    32,    -1,    -1,    35,    36,
-      37,    38,    39,    40,    -1,    42,  1160,    -1,    45,    46,
-      47,    48,    49,    50,    51,    52,    -1,    -1,    -1,    56,
-      -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,    66,
-      -1,    68,    -1,    70,    71,   969,    73,    74,    75,    -1,
-      -1,    78,    79,    80,    81,    82,    83,    -1,    85,    86,
-      -1,   985,   986,    -1,    -1,    -1,    93,    -1,   992,    -1,
-      -1,    -1,    36,    37,   998,    39,  1220,  1001,    -1,  1003,
-      -1,   108,    -1,   110,    -1,    -1,   113,    -1,    -1,    -1,
-     117,   118,   119,   120,   121,   122,  1240,    -1,    -1,  1023,
-     127,    65,    -1,    -1,   131,    -1,    -1,    71,    -1,    -1,
-    1034,    75,    -1,    -1,    78,    79,    80,    81,    82,    83,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,
-      -1,    -1,  1056,    -1,  1058,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   108,  1289,  1290,    -1,    -1,  1073,
-    1074,    -1,    -1,   117,   118,   119,   120,   121,   122,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1094,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,    -1,    29,    30,    31,    32,    -1,    -1,
-      35,    36,    37,    38,    39,    -1,    -1,  1141,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      36,    37,    -1,    39,    -1,    -1,  1160,    -1,    -1,    -1,
-      65,    66,    -1,    68,    -1,    70,    71,    -1,    73,    74,
-      75,  1175,  1176,    78,    79,    80,    81,    82,    83,    65,
-      85,    86,    -1,    -1,    -1,    71,    -1,    -1,    93,    75,
-    1414,    -1,    78,    79,    80,    81,    82,    83,    -1,    85,
-      86,    -1,    -1,   108,    -1,   110,    -1,    93,    -1,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,    -1,    -1,
-      -1,    -1,   108,    -1,   110,    -1,   131,    -1,    -1,    -1,
-      -1,   117,   118,   119,   120,   121,   122,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1256,    -1,    -1,    -1,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-    1504,    -1,    29,    30,    31,    32,    -1,    -1,    35,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1529,  1530,    -1,    -1,    -1,
-      -1,    -1,    -1,  1317,    -1,  1319,    -1,    -1,    65,    66,
-      -1,    68,    -1,    70,    71,    -1,    73,    74,    75,    -1,
-    1554,    78,    79,    80,    81,    82,    83,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   108,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,
-     117,   118,   119,   120,   121,   122,    -1,    -1,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    -1,    39,    -1,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,  1405,    -1,    29,    30,    31,    -1,    -1,    -1,    -1,
-      36,    37,    38,    39,    -1,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,    -1,    29,    30,    31,    -1,    -1,    65,
-      66,    -1,    68,    38,    70,    71,    -1,    73,    74,    75,
-      -1,    -1,    78,    79,    80,    81,    82,    83,    -1,    85,
-      86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,
-      -1,    66,    -1,    -1,    -1,    -1,    71,    -1,    73,    74,
-      -1,    -1,   108,  1487,   110,    -1,    -1,    82,    83,   115,
-      -1,   117,   118,   119,   120,   121,   122,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    -1,    29,    30,    31,    -1,    -1,    -1,    -1,    36,
-      37,    38,    39,    -1,    -1,  1539,    -1,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    -1,    65,    66,
-      -1,    68,    -1,    70,    71,    38,    73,    74,    75,    -1,
-      -1,    78,    79,    80,    81,    82,    83,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,
-      -1,    -1,    -1,    66,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   108,    -1,   110,    77,    -1,    -1,    -1,   115,    -1,
-     117,   118,   119,   120,   121,   122,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
-      -1,    29,    30,    31,    -1,    -1,    -1,    -1,    36,    37,
-      38,    39,    -1,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    -1,    29,    30,    31,    -1,    -1,    65,    66,    -1,
-      68,    38,    70,    71,    -1,    73,    74,    75,    -1,    -1,
-      78,    79,    80,    81,    82,    83,    -1,    85,    86,    -1,
-      -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,    66,
-      -1,    -1,    -1,    -1,    -1,    -1,    73,    74,    -1,    -1,
-     108,    -1,   110,    -1,    -1,    -1,    -1,   115,    -1,   117,
-     118,   119,   120,   121,   122,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    -1,    -1,
-      29,    30,    31,    -1,    -1,    -1,    -1,    36,    37,    38,
-      39,    -1,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
-      -1,    29,    30,    31,    -1,    -1,    65,    66,    -1,    68,
-      38,    70,    71,    -1,    73,    74,    75,    -1,    -1,    78,
-      79,    80,    81,    82,    83,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,    66,    -1,
-      -1,    -1,    -1,    -1,    -1,    73,    74,    -1,    -1,   108,
-      -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,
-     119,   120,   121,   122,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    29,
-      30,    31,    -1,    -1,    -1,    -1,    36,    37,    38,    39,
-      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    65,    66,    -1,    68,    38,
-      70,    71,    -1,    73,    74,    75,    -1,    -1,    78,    79,
-      80,    81,    82,    83,    -1,    85,    86,    -1,    -1,    -1,
-      -1,    -1,    -1,    93,    -1,    -1,    -1,    66,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   108,    -1,
-     110,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,   119,
-     120,   121,   122,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    -1,    -1,    29,    30,
-      31,    -1,    -1,    -1,    -1,    36,    37,    38,    39,    -1,
+      26,    27,    -1,    -1,    30,    31,    32,    33,    34,    35,
+      67,    -1,    69,    39,    71,    -1,    -1,    74,    75,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    65,    66,    -1,    68,    -1,    70,
-      71,    -1,    73,    74,    75,    -1,    -1,    78,    79,    80,
-      81,    82,    83,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   108,    -1,   110,
-      -1,    -1,    -1,    -1,    -1,    -1,   117,   118,   119,   120,
-     121,   122,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    -1,    29,    30,    31,
-      -1,    -1,    -1,    -1,    36,    37,    38,    39,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    65,    66,    -1,    68,    -1,    70,    71,
-      -1,    73,    74,    75,    -1,    -1,    78,    79,    80,    81,
-      82,    83,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
-      -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   108,    -1,   110,    -1,
-      -1,    -1,    -1,    -1,    -1,   117,   118,   119,   120,   121,
-     122,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    -1,    29,    30,    31,
-      32,    -1,    -1,    35,    -1,    -1,    38,    39,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    63,    -1,    -1,    66,    -1,    68,    -1,    70,    71,
-      -1,    73,    74,    75,    -1,    -1,    -1,    -1,    -1,    -1,
-      82,    83,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   108,    -1,   110,    -1,
-      -1,    -1,   114,    -1,    -1,    -1,   118,     3,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    -1,    -1,    29,    30,    31,    -1,    -1,    -1,    -1,
-      -1,    -1,    38,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    -1,    29,    30,    31,    32,    33,    34,    -1,    -1,
-      66,    38,    68,    -1,    70,    71,    -1,    73,    74,    75,
-      -1,    -1,    -1,    -1,    -1,    -1,    82,    83,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      -1,    -1,    -1,    -1,    -1,    -1,    73,    74,    -1,    -1,
-      -1,    -1,   108,    -1,   110,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
-      30,    31,    32,    -1,    -1,    35,    -1,    -1,    38,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    66,    -1,    68,    -1,
-      70,    -1,    -1,    73,    74,    -1,    -1,    77,    -1,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    -1,    29,    30,    31,    32,    -1,
-     110,    35,    -1,    -1,    38,    -1,    -1,    -1,   118,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    66,    -1,    68,    -1,    70,    -1,    -1,    73,
-      74,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    -1,    -1,    29,    30,
-      31,    -1,    -1,    -1,    -1,    -1,   110,    38,    -1,    -1,
-      -1,    -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    66,    -1,    68,    -1,    70,
-      -1,    -1,    73,    74,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    29,
-      30,    31,    -1,    -1,    -1,    -1,    -1,    -1,    38,   110,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    66,    -1,    68,    -1,
-      70,    71,    -1,    73,    74,    75,    -1,    -1,    -1,    -1,
-      -1,    -1,    82,    83,    -1,    -1,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    -1,    29,    30,    31,   108,    -1,
-     110,    -1,    -1,    -1,    38,    -1,    -1,    -1,   118,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    66,    -1,    29,    30,    31,    71,    -1,    73,
-      74,    75,    -1,    38,    -1,    -1,    -1,    -1,    82,    83,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    -1,    68,   108,    70,   110,    -1,    73,    74,
-      -1,    -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      95,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   110,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    29,
-      30,    31,    -1,    -1,    -1,    -1,    -1,    -1,    38,    -1,
-      -1,    -1,    -1,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    -1,    29,    30,    31,    -1,    66,    -1,    68,    -1,
-      70,    38,    -1,    73,    74,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    95,    -1,    -1,    -1,    66,
-      -1,    -1,    -1,    -1,    71,    -1,    73,    74,    75,    -1,
-     110,    -1,    -1,    -1,    -1,    82,    83,    -1,   118,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,   110,    29,    30,    31,    -1,    -1,    -1,
-      -1,   118,    -1,    38,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    -1,    68,    -1,    70,    -1,    -1,    73,    74,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    -1,    29,    30,    31,    -1,    -1,
-      -1,    -1,    -1,    -1,    38,   110,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    66,    -1,    68,    -1,    70,    -1,    -1,    73,
-      74,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    -1,    -1,    29,    30,    31,    -1,
-      -1,    -1,    -1,    -1,    -1,    38,   110,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    66,    -1,    68,    -1,    70,    -1,    -1,
-      73,    74,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    -1,    29,    30,    31,
-      -1,    -1,    -1,    -1,    -1,    -1,    38,   110,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    66,    -1,    68,    -1,    70,    -1,
-      -1,    73,    74,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    -1,    29,    30,    31,    -1,    -1,    -1,    -1,    36,
-      37,    38,    39,    -1,    -1,    -1,    -1,    -1,   110,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   118,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    65,    66,
-      -1,    -1,    -1,    -1,    71,    -1,    73,    74,    75,    -1,
-      -1,    78,    79,    80,    81,    82,    83,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   108,    -1,   110,    -1,    -1,   113,    -1,    -1,    -1,
-     117,   118,   119,   120,   121,   122,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    -1,    29,    30,    31,    -1,    -1,
-      -1,    -1,    36,    37,    38,    39,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    29,    30,    31,    -1,    -1,
-      -1,    65,    66,    -1,    38,    -1,    -1,    71,    -1,    73,
-      74,    75,    -1,    -1,    78,    79,    80,    81,    82,    83,
-      -1,    85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,
-      -1,    -1,    66,    -1,    -1,    -1,    -1,    71,    -1,    73,
-      74,    75,    -1,    77,   108,    -1,   110,   111,    82,    83,
-      -1,    -1,    -1,   117,   118,   119,   120,   121,   122,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,   110,    -1,    29,    30,
-      31,    -1,    -1,    -1,   118,    36,    37,    38,    39,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    -1,    -1,    29,    30,
-      31,    -1,    -1,    -1,    65,    66,    -1,    38,    -1,    -1,
-      71,    -1,    73,    74,    75,    -1,    -1,    78,    79,    80,
-      81,    82,    83,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    93,    -1,    -1,    66,    -1,    -1,    -1,    -1,
-      71,    -1,    73,    74,    -1,    -1,    -1,   108,   109,   110,
-      -1,    82,    83,    -1,    -1,    -1,   117,   118,   119,   120,
-     121,   122,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,   110,
-      -1,    29,    30,    31,    -1,    -1,    -1,   118,    36,    37,
-      38,    39,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
-      -1,    29,    30,    31,    -1,    -1,    -1,    65,    66,    -1,
-      38,    39,    -1,    71,    -1,    73,    74,    75,    -1,    -1,
-      78,    79,    80,    81,    82,    83,    -1,    85,    86,    -1,
-      -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    66,    -1,
-      -1,    -1,    -1,    -1,    -1,    73,    74,    -1,    -1,    -1,
-     108,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,   117,
-     118,   119,   120,   121,   122,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,   110,    -1,    29,    30,    31,    -1,    -1,    -1,
-     118,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      65,    66,    29,    30,    31,    -1,    71,    -1,    73,    74,
-      75,    38,    -1,    78,    79,    80,    81,    82,    83,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      -1,    -1,    -1,   108,    -1,   110,    73,    74,    -1,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    -1,    29,    30,    31,
-      -1,   108,    -1,   110,    36,    37,    38,    39,    -1,    -1,
-      -1,   118,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    65,    66,    29,    30,    31,    -1,    71,
-      -1,    73,    74,    75,    38,    -1,    78,    79,    80,    81,
-      82,    83,    -1,    85,    86,    -1,    -1,    -1,    -1,    -1,
-      -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    66,    -1,    -1,    -1,   108,    -1,   110,    73,
-      74,    -1,    -1,    -1,    -1,   117,   118,   119,   120,   121,
-     122,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    -1,    -1,
-      29,    30,    31,    -1,   108,    -1,   110,    36,    37,    38,
-      39,    -1,    -1,    -1,   118,    -1,    -1,    -1,    -1,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    65,    66,    29,    30,
-      31,    -1,    71,    -1,    73,    74,    75,    38,    39,    78,
-      79,    80,    81,    82,    83,    -1,    85,    86,    -1,    -1,
-      -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    66,    -1,    -1,    -1,   108,
-      -1,   110,    73,    74,    -1,    -1,    -1,    -1,   117,   118,
-     119,   120,   121,   122,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    -1,   110,
-      29,    30,    31,   114,    -1,    -1,    -1,   118,    -1,    38,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    29,
-      30,    31,    -1,    -1,    -1,    -1,    -1,    66,    38,    68,
-      -1,    70,    -1,    -1,    73,    74,    -1,    -1,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    66,    29,    30,    31,
-      -1,    71,    -1,    73,    74,    75,    38,    -1,    -1,    -1,
-      -1,    -1,    82,    83,   113,    -1,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    66,    29,    30,    31,   108,    71,
-     110,    73,    74,    75,    38,    -1,    -1,    -1,   118,    -1,
-      82,    83,    -1,    -1,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    -1,    66,    29,    30,    31,   108,    -1,   110,    73,
-      74,    -1,    38,    -1,    -1,    -1,   118,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    -1,    -1,    29,    30,    31,    -1,
-      66,    -1,    -1,    -1,    -1,    38,   110,    73,    74,    -1,
-      -1,    -1,    -1,    -1,   118,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,    66,    29,    30,    31,    -1,    -1,    -1,
-      73,    74,    -1,    38,   110,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    66,    29,    30,    31,    -1,    -1,   110,    73,    74,
-      -1,    38,    -1,    -1,    -1,   118,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    -1,    29,    30,    31,    -1,    66,
-      -1,    -1,    -1,    -1,    38,   110,    73,    74,    -1,    -1,
-      -1,    -1,    -1,   118,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    -1,    66,    29,    30,    31,    -1,    -1,    -1,    73,
-      74,    -1,    38,   110,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
-      66,    29,    30,    31,    -1,    -1,   110,    73,    74,    -1,
-      38,    -1,    -1,    -1,   118,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,    -1,    29,    30,    31,    -1,    66,    -1,
-      -1,    -1,    -1,    38,   110,    73,    74,    -1,    -1,    -1,
-      -1,    -1,   118,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      -1,    66,    29,    30,    31,    -1,    -1,    -1,    73,    74,
-      -1,    38,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     118,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      -1,    -1,    -1,    -1,    -1,   110,    73,    74,    -1,    -1,
-      -1,    -1,    -1,   118,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    -1,    29,
-      30,    31,    -1,   110,    -1,    -1,    -1,    -1,    38,    -1,
-      -1,   118,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    66,    -1,    68,    -1,
-      70,    -1,    -1,    73,    74,    36,    37,    -1,    39,    40,
-      -1,    42,    -1,    -1,    45,    46,    47,    48,    49,    50,
-      51,    52,    -1,    -1,    55,    56,    -1,    -1,    -1,    60,
-      61,    -1,    63,    -1,    65,    -1,    -1,    -1,    -1,   109,
-      71,    -1,    -1,    -1,    75,    -1,    -1,    78,    79,    80,
-      81,    82,    83,    -1,    85,    86,    -1,    -1,    -1,    -1,
-      -1,    -1,    93,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   108,    -1,   110,
-      -1,    -1,   113,    -1,    -1,    -1,   117,   118,   119,   120,
-     121,   122,    -1,    -1,    -1,    -1,   127,    -1,    36,    37,
-     131,    39,    40,    -1,    42,    -1,    -1,    45,    46,    47,
-      48,    49,    50,    51,    52,    -1,    -1,    -1,    56,    -1,
-      -1,    -1,    60,    61,    -1,    63,    -1,    65,    -1,    -1,
-      -1,    -1,    -1,    71,    -1,    -1,    -1,    75,    -1,    -1,
-      78,    79,    80,    81,    82,    83,    -1,    85,    86,    -1,
-      -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     108,    -1,   110,    -1,    -1,   113,    -1,    -1,    -1,   117,
-     118,   119,   120,   121,   122,    -1,    -1,    -1,    -1,   127,
-      -1,    36,    37,   131,    39,    40,    -1,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    -1,    -1,
-      55,    56,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,
-      65,    -1,    -1,    -1,    -1,    -1,    71,    -1,    -1,    -1,
-      75,    -1,    -1,    78,    79,    80,    81,    82,    83,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   108,    -1,   110,    -1,    -1,   113,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,    -1,    -1,
-      36,    37,   127,    39,    40,    -1,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    -1,    -1,    -1,
-      56,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,
-      -1,    -1,    -1,    -1,    -1,    71,    -1,    -1,    -1,    75,
-      -1,    -1,    78,    79,    80,    81,    82,    83,    -1,    85,
-      86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   108,    -1,   110,    -1,    -1,   113,    -1,    -1,
-      -1,   117,   118,   119,   120,   121,   122,    -1,    -1,    36,
-      37,   127,    39,    40,    -1,    42,    -1,    -1,    45,    46,
-      47,    48,    49,    50,    51,    52,    -1,    -1,    -1,    56,
-      -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,    -1,
-      -1,    -1,    -1,    -1,    71,    -1,    -1,    -1,    75,    -1,
-      -1,    78,    79,    80,    81,    82,    83,    -1,    85,    86,
-      -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   108,    -1,   110,    -1,    -1,   113,    -1,    -1,    -1,
-     117,   118,   119,   120,   121,   122,    -1,    -1,    -1,    -1,
-     127,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    -1,    -1,    29,    30,    31,    -1,
-      -1,    -1,    -1,    -1,    -1,    38,    -1,    36,    37,    -1,
-      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    36,    37,    -1,    39,
-      -1,    -1,    -1,    66,    -1,    68,    65,    70,    -1,    -1,
-      73,    74,    71,    -1,    -1,    -1,    75,    -1,    -1,    78,
-      79,    80,    81,    82,    83,    65,    85,    86,    -1,    -1,
-      -1,    71,    95,    -1,    93,    75,    -1,    -1,    78,    79,
-      80,    81,    82,    83,    -1,    85,    86,    -1,    -1,   108,
-      -1,   110,    -1,    93,    36,    37,    -1,    39,   117,   118,
-     119,   120,   121,   122,    -1,    -1,    -1,    -1,   108,    -1,
-     110,    -1,    -1,    36,    37,    -1,    39,   117,   118,   119,
-     120,   121,   122,    65,    -1,    -1,    -1,    -1,    -1,    71,
-      -1,    -1,    -1,    75,    -1,    -1,    78,    79,    80,    81,
-      82,    83,    65,    85,    86,    -1,    -1,    -1,    71,    -1,
-      -1,    93,    75,    -1,    -1,    78,    79,    80,    81,    82,
-      83,    -1,    85,    86,    -1,    -1,   108,    -1,   110,    -1,
-      93,    36,    37,    -1,    39,   117,   118,   119,   120,   121,
-     122,    -1,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   117,   118,   119,   120,   121,   122,
-      65,    -1,    -1,    -1,    -1,    -1,    71,    -1,    -1,    -1,
-      75,    -1,    -1,    78,    79,    80,    81,    82,    83,    -1,
-      85,    86,    -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    38,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      66,    -1,    68,    -1,    70,    71,    -1,    73,    74,    75,
-      -1,    -1,    -1,    -1,    -1,    -1,    82,    83,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    -1,    -1,    29,    30,    31,    -1,    -1,    -1,
-      -1,    -1,    -1,    38,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    -1,    68,    -1,    70,    -1,    -1,    73,    74,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    -1,    -1,    29,    30,    31,    -1,
-      -1,    -1,    -1,    -1,    -1,    38,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    66,    -1,    68,    -1,    70,    -1,    -1,
-      73,    74,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    -1,    29,    30,    31,
-      -1,    -1,    -1,    -1,    -1,    -1,    38,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    66,    -1,    68,    -1,    70,    -1,
-      -1,    73,    74
+      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75
 };
 
@@ -4010,160 +4096,161 @@
        0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    29,    30,    31,    32,    35,
-      38,    39,    63,    66,    68,    70,    71,    73,    74,    75,
-      82,    83,   108,   110,   118,   136,   139,   196,   210,   211,
+      22,    23,    24,    25,    26,    27,    30,    31,    32,    33,
+      36,    39,    40,    64,    67,    69,    71,    72,    74,    75,
+      76,    83,    84,   109,   111,   119,   137,   140,   197,   211,
      212,   213,   214,   215,   216,   217,   218,   219,   220,   221,
-     222,   223,   224,   225,   226,   227,   229,   230,   231,   232,
-     233,   234,   235,   236,   238,   239,   240,   241,   242,   243,
-     244,   252,   253,   279,   280,   281,   289,   292,   298,   299,
-     301,   303,   304,   310,   315,   319,   320,   321,   322,   323,
-     324,   325,   326,   346,   363,   364,   365,   366,    71,   118,
-     138,   139,   213,   215,   223,   225,   235,   239,   241,   280,
-      81,   108,   308,   309,   310,   308,   308,    71,    73,    74,
-      75,   137,   138,   269,   270,   290,   291,    73,    74,   270,
-     108,   301,    11,   197,   108,   118,   315,   320,   321,   322,
-     324,   325,   326,   111,   133,   110,   216,   223,   225,   319,
-     323,   362,   363,   366,   367,   134,   106,   130,   273,   113,
-     134,   171,    73,    74,   136,   268,   134,   134,   134,   115,
-     134,    73,    74,   108,   118,   305,   314,   315,   316,   317,
-     318,   319,   323,   327,   328,   329,   330,   331,   337,     3,
-      27,    77,   237,     3,     5,    73,   110,   118,   215,   226,
-     230,   233,   242,   281,   319,   323,   366,   213,   215,   225,
-     235,   239,   241,   280,   319,   323,    32,   231,   231,   226,
-     233,   134,   231,   226,   231,   226,    74,   108,   113,   270,
-     281,   113,   270,   231,   226,   115,   134,   134,     0,   133,
-     108,   171,   308,   308,   133,   110,   223,   225,   364,   268,
-     268,   225,   130,   108,   118,   305,   315,   319,   110,   118,
-     366,   302,   228,   310,   108,   286,   108,   108,    50,   108,
-      36,    37,    39,    65,    71,    75,    78,    79,    80,    81,
-      85,    86,    93,   108,   110,   117,   118,   119,   120,   121,
-     122,   135,   139,   140,   141,   142,   147,   148,   149,   150,
+     222,   223,   224,   225,   226,   227,   228,   230,   231,   232,
+     233,   234,   235,   236,   237,   239,   240,   241,   242,   243,
+     244,   246,   254,   255,   282,   283,   284,   292,   295,   301,
+     302,   304,   306,   307,   313,   318,   322,   323,   324,   325,
+     326,   327,   328,   329,   349,   366,   367,   368,   369,    72,
+     119,   139,   140,   214,   216,   224,   226,   236,   240,   242,
+     283,    82,   109,   311,   312,   313,   311,   311,    72,    74,
+      75,    76,   138,   139,   272,   273,   293,   294,    74,    75,
+     273,   109,   304,    11,   198,   109,   119,   318,   323,   324,
+     325,   327,   328,   329,   112,   134,   111,   217,   224,   226,
+     322,   326,   365,   366,   369,   370,   135,   107,   131,   276,
+     114,   135,   172,    74,    75,   137,   271,   135,   135,   135,
+     116,   135,    74,    75,   109,   119,   308,   317,   318,   319,
+     320,   321,   322,   326,   330,   331,   332,   333,   334,   340,
+       3,    28,    78,   238,     3,     5,    74,   111,   119,   216,
+     227,   231,   234,   243,   284,   322,   326,   369,   214,   216,
+     226,   236,   240,   242,   283,   322,   326,    33,   232,   232,
+     227,   234,   135,   232,   227,   232,   227,    75,   109,   114,
+     273,   284,   114,   273,   232,   227,   116,   135,   135,     0,
+     134,   109,   172,   311,   311,   134,   111,   224,   226,   367,
+     271,   271,   226,   131,   109,   119,   308,   318,   322,   111,
+     119,   369,   305,   229,   313,   109,   289,   109,   109,    51,
+     109,    37,    38,    40,    66,    72,    76,    79,    80,    81,
+      82,    86,    87,    94,   109,   111,   118,   119,   120,   121,
+     122,   123,   136,   140,   141,   142,   143,   148,   149,   150,
      151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     162,   164,   223,   272,   288,   362,   367,   225,   109,   109,
-     109,   109,   109,   109,   109,    73,    74,   110,   223,   268,
-     346,   364,   110,   118,   162,   215,   216,   222,   225,   229,
-     230,   235,   238,   239,   241,   258,   259,   263,   264,   265,
-     266,   280,   346,   358,   359,   360,   361,   366,   367,   111,
-     108,   319,   323,   366,   108,   115,   131,   110,   113,   118,
-     162,   274,   274,   114,   133,   115,   131,   108,   115,   131,
-     115,   131,   115,   131,   308,   131,   315,   316,   317,   318,
-     328,   329,   330,   331,   225,   314,   327,    63,   307,   110,
-     308,   345,   346,   308,   308,   171,   133,   108,   308,   345,
-     308,   308,   225,   305,   108,   108,   224,   225,   223,   225,
-     111,   133,   223,   362,   367,   171,   133,   268,   273,   215,
-     230,   319,   323,   171,   133,   290,   225,   235,   131,   225,
-     225,   288,    39,   110,   223,   245,   246,   247,   248,   362,
-     366,   113,   254,   270,   113,   225,   290,   131,   131,   301,
-     133,   138,   267,     3,   134,   205,   206,   220,   222,   225,
-     133,   307,   108,   307,   162,   315,   225,   108,   133,   268,
-     113,    32,    33,    34,   223,   282,   283,   285,   133,   128,
-     130,   287,   133,   226,   232,   233,   268,   311,   312,   313,
-     108,   140,   108,   147,   108,   147,   149,   108,   147,   108,
-     108,   147,   147,   138,   110,   162,   167,   171,   223,   271,
-     362,   111,   133,   149,   149,    81,    84,    85,    86,   108,
-     110,   112,   113,    96,    97,    98,    99,   100,   101,   102,
-     103,   104,   105,   130,   166,   149,   118,   123,   124,   120,
-     121,    87,    88,    89,    90,   125,   126,    91,    92,   119,
-     127,   128,    93,    94,   129,   130,   369,   108,   118,   341,
-     342,   343,   344,   345,   109,   115,   108,   345,   346,   108,
-     345,   346,   133,   108,   223,   364,   111,   133,   110,   118,
-     134,   223,   225,   357,   358,   366,   367,   134,   108,   110,
-     118,   315,   332,   333,   334,   335,   336,   337,   338,   339,
-     340,   346,   347,   348,   349,   350,   351,   352,   118,   366,
-     225,   134,   134,   118,   223,   225,   359,   268,   223,   346,
-     359,   268,   108,   133,   133,   133,   111,   133,    71,    79,
-     110,   112,   139,   270,   274,   275,   276,   277,   278,   133,
-     133,   133,   133,   133,   133,   305,   109,   109,   109,   109,
-     109,   109,   109,   314,   327,   108,   273,   111,   205,   133,
-     305,   167,   272,   167,   272,   305,   110,   205,   307,   171,
-     133,   205,   109,   247,   248,   111,   133,   108,   116,   118,
-     249,   251,   314,   315,   327,   345,   353,   354,   355,   356,
-     114,   246,   115,   131,   115,   131,   270,   245,   115,   368,
-     130,   255,   254,   225,   260,   261,   262,   265,   266,   109,
-     115,   171,   133,   118,   162,   133,   222,   225,   259,   358,
-     366,   299,   300,   108,   118,   332,   109,   115,   369,   270,
-     282,   108,   113,   270,   272,   282,   109,   115,   108,   140,
-     109,   116,   271,   271,   271,   110,   138,   144,   162,   272,
-     271,   111,   133,   109,   115,   109,   108,   118,   353,   109,
-     115,   162,   110,   138,   110,   143,   144,   133,   110,   138,
-     143,   162,   162,   149,   149,   149,   150,   150,   151,   151,
-     152,   152,   152,   152,   153,   153,   154,   155,   156,   157,
-     158,   116,   167,   162,   133,   342,   343,   344,   225,   341,
-     308,   308,   162,   272,   133,   267,   118,   133,   223,   346,
-     359,   225,   229,   111,   133,   111,   366,   111,   108,   133,
-     315,   333,   334,   335,   338,   348,   349,   350,   111,   133,
-     225,   332,   336,   347,   108,   308,   351,   369,   308,   308,
-     369,   108,   308,   351,   308,   308,   308,   308,   346,   223,
-     357,   367,   268,   111,   115,   111,   115,   369,   223,   359,
-     369,   256,   257,   258,   259,   256,   256,   268,   162,   133,
-     110,   270,   116,   115,   368,   274,    79,   110,   116,   278,
-      28,   207,   208,   268,   256,   138,   305,   138,   307,   108,
-     345,   346,   108,   345,   346,   140,   346,   171,   260,   109,
-     109,   109,   109,   111,   171,   205,   171,   113,   131,   131,
-     110,   315,   354,   355,   356,   160,   161,   225,   353,   250,
-     251,   250,   308,   308,   270,   308,   114,   270,   114,   161,
-     368,   134,   134,   138,   220,   134,   134,   256,   108,   118,
-     366,   134,   114,   225,   283,   284,   134,   133,   133,   108,
-     134,   109,   312,   167,   168,   116,   131,   110,   140,   198,
-     199,   200,   109,   115,   109,   133,   116,   109,   109,   109,
-     162,   225,   113,   149,   164,   162,   163,   165,   115,   134,
-     133,   133,   109,   115,   162,   133,   114,   160,   116,   260,
-     109,   109,   109,   341,   260,   109,   256,   223,   359,   110,
-     118,   162,   162,   225,   338,   260,   109,   109,   109,   109,
-     109,   109,   109,     7,   225,   332,   336,   347,   133,   133,
-     369,   133,   133,   109,   134,   134,   134,   134,   273,   134,
-     160,   161,   162,   306,   133,   274,   276,   114,   133,   209,
-     270,    39,    40,    42,    45,    46,    47,    48,    49,    50,
-      51,    52,    56,    60,    61,   110,   127,   138,   168,   169,
-     170,   171,   172,   173,   175,   176,   188,   190,   191,   196,
-     210,   304,    28,   134,   130,   273,   133,   133,   109,   134,
-     171,   245,   111,   109,   109,   109,   353,   249,   255,   114,
-     109,   115,   111,   111,   134,   225,   115,   369,   286,   109,
-     282,   213,   215,   223,   294,   295,   296,   297,   288,   109,
-     109,   116,   161,   108,   109,   116,   115,   138,   162,   162,
-     275,   115,   134,   165,   111,   138,   145,   146,   162,   144,
-     134,   145,   160,   164,   134,   108,   345,   346,   134,   134,
-     133,   134,   134,   134,   162,   109,   134,   108,   345,   346,
-     108,   351,   108,   351,   346,   224,     7,   118,   134,   162,
-     260,   260,   259,   263,   263,   264,   115,   115,   109,   109,
-     111,    95,   122,   134,   134,   145,   274,   162,   115,   131,
-     210,   214,   225,   229,   108,   108,   169,   108,   108,   131,
-     138,   131,   138,   118,   138,   168,   108,   171,   163,   163,
-     111,   142,   116,   131,   134,   133,   134,   209,   109,   162,
-     260,   260,   308,   109,   114,   108,   345,   346,   133,   109,
-     133,   134,   305,   114,   133,   134,   134,   109,   113,   198,
-     111,   161,   131,   198,   200,   109,   115,   134,   368,   163,
-     111,   134,    84,   112,   115,   134,   134,   111,   134,   109,
-     133,   109,   109,   111,   111,   111,   134,   109,   133,   133,
-     133,   162,   162,   134,   111,   134,   134,   134,   134,   133,
-     133,   161,   161,   111,   111,   134,   134,   270,   225,   167,
-     167,    46,   167,   133,   131,   131,   167,   131,   131,   167,
-      57,    58,    59,   192,   193,   194,   131,    62,   131,   113,
-     308,   173,   114,   131,   134,   134,   133,    95,   265,   266,
-     109,   295,   115,   131,   115,   131,   114,   293,   116,   140,
-     109,   109,   116,   165,   111,   114,   111,   110,   146,   110,
-     146,   146,   111,   111,   111,   260,   111,   260,   260,   260,
-     134,   134,   111,   111,   109,   109,   111,   115,    95,   259,
-      95,   134,   111,   111,   109,   109,   108,   109,   168,   189,
-     210,   131,   109,   108,   108,   171,   194,    57,    58,   162,
-     143,   169,   109,   109,   260,   113,   133,   133,   294,   140,
-     201,   108,   131,   201,   134,   116,   133,   133,   134,   134,
-     134,   134,   111,   111,   133,   134,   111,   169,    43,    44,
-     113,   179,   180,   181,   167,   169,   134,   109,   168,   113,
-     181,    95,   133,    95,   133,   108,   108,   131,   114,   134,
-     133,   268,   305,   114,   115,   116,   161,   109,   111,   162,
-     145,   145,   109,   109,   109,   109,   263,    41,   161,   177,
-     178,   306,   116,   133,   169,   179,   109,   131,   169,   131,
-     133,   109,   133,   109,   133,    95,   133,    95,   133,   131,
-     109,   294,   140,   138,   202,   109,   131,   116,   134,   134,
-     169,    95,   115,   116,   134,   203,   204,   210,   131,   168,
-     168,   203,   171,   195,   223,   362,   171,   195,   109,   133,
-     109,   133,   114,   109,   115,   162,   111,   111,   161,   177,
-     180,   182,   183,   133,   131,   180,   184,   185,   134,   108,
-     118,   305,   353,   138,   134,   171,   195,   171,   195,   108,
-     131,   138,   169,   174,   114,   180,   210,   168,    55,   174,
-     187,   114,   180,   109,   225,   109,   134,   134,   288,   169,
-     174,   131,   186,   187,   174,   187,   171,   171,   109,   109,
-     109,   186,   134,   134,   171,   171,   134,   134
+     161,   163,   165,   224,   275,   291,   365,   370,   226,   110,
+     110,   110,   110,   110,   110,   110,    74,    75,   111,   224,
+     271,   349,   367,   111,   119,   163,   216,   217,   223,   226,
+     230,   231,   236,   239,   240,   242,   261,   262,   266,   267,
+     268,   269,   283,   349,   361,   362,   363,   364,   369,   370,
+     112,   109,   322,   326,   369,   109,   116,   132,   111,   114,
+     119,   163,   277,   277,   115,   134,   116,   132,   109,   116,
+     132,   116,   132,   116,   132,   311,   132,   318,   319,   320,
+     321,   331,   332,   333,   334,   226,   317,   330,    64,   310,
+     111,   311,   348,   349,   311,   311,   172,   134,   109,   311,
+     348,   311,   311,   226,   308,   109,   109,   225,   226,   224,
+     226,   112,   134,   224,   365,   370,   172,   134,   271,   276,
+     216,   231,   322,   326,   172,   134,   293,   226,   236,   132,
+     226,   226,   291,    40,   111,   224,   247,   248,   249,   250,
+     365,   369,   245,   257,   273,   256,   226,   293,   132,   132,
+     304,   134,   139,   270,     3,   135,   206,   207,   221,   223,
+     226,   134,   310,   109,   310,   163,   318,   226,   109,   134,
+     271,   114,    33,    34,    35,   224,   285,   286,   288,   134,
+     129,   131,   290,   134,   227,   233,   234,   271,   314,   315,
+     316,   109,   141,   109,   148,   109,   148,   150,   109,   148,
+     109,   109,   148,   148,   139,   111,   163,   168,   172,   224,
+     274,   365,   112,   134,   150,   150,    82,    85,    86,    87,
+     109,   111,   113,   114,    97,    98,    99,   100,   101,   102,
+     103,   104,   105,   106,   131,   167,   150,   119,   124,   125,
+     121,   122,    88,    89,    90,    91,   126,   127,    92,    93,
+     120,   128,   129,    94,    95,   130,   131,   372,   109,   119,
+     344,   345,   346,   347,   348,   110,   116,   109,   348,   349,
+     109,   348,   349,   134,   109,   224,   367,   112,   134,   111,
+     119,   135,   224,   226,   360,   361,   369,   370,   135,   109,
+     111,   119,   318,   335,   336,   337,   338,   339,   340,   341,
+     342,   343,   349,   350,   351,   352,   353,   354,   355,   119,
+     369,   226,   135,   135,   119,   224,   226,   362,   271,   224,
+     349,   362,   271,   109,   134,   134,   134,   112,   134,    72,
+      80,   111,   113,   140,   273,   277,   278,   279,   280,   281,
+     134,   134,   134,   134,   134,   134,   308,   110,   110,   110,
+     110,   110,   110,   110,   317,   330,   109,   276,   112,   206,
+     134,   308,   168,   275,   168,   275,   308,   111,   206,   310,
+     172,   134,   206,   110,   249,   250,   112,   134,   109,   117,
+     119,   251,   253,   317,   318,   330,   348,   356,   357,   358,
+     359,   115,   248,   116,   132,   116,   132,   273,   114,   116,
+     371,   131,   258,   114,   226,   263,   264,   265,   268,   269,
+     110,   116,   172,   134,   119,   163,   134,   223,   226,   262,
+     361,   369,   302,   303,   109,   119,   335,   110,   116,   372,
+     273,   285,   109,   114,   273,   275,   285,   110,   116,   109,
+     141,   110,   117,   274,   274,   274,   111,   139,   145,   163,
+     275,   274,   112,   134,   110,   116,   110,   109,   119,   356,
+     110,   116,   163,   111,   139,   111,   144,   145,   134,   111,
+     139,   144,   163,   163,   150,   150,   150,   151,   151,   152,
+     152,   153,   153,   153,   153,   154,   154,   155,   156,   157,
+     158,   159,   117,   168,   163,   134,   345,   346,   347,   226,
+     344,   311,   311,   163,   275,   134,   270,   119,   134,   224,
+     349,   362,   226,   230,   112,   134,   112,   369,   112,   109,
+     134,   318,   336,   337,   338,   341,   351,   352,   353,   112,
+     134,   226,   335,   339,   350,   109,   311,   354,   372,   311,
+     311,   372,   109,   311,   354,   311,   311,   311,   311,   349,
+     224,   360,   370,   271,   112,   116,   112,   116,   372,   224,
+     362,   372,   259,   260,   261,   262,   259,   259,   271,   163,
+     134,   111,   273,   117,   116,   371,   277,    80,   111,   117,
+     281,    29,   208,   209,   271,   259,   139,   308,   139,   310,
+     109,   348,   349,   109,   348,   349,   141,   349,   172,   263,
+     110,   110,   110,   110,   112,   172,   206,   172,   114,   132,
+     132,   111,   318,   357,   358,   359,   161,   162,   226,   356,
+     252,   253,   252,   311,   311,   273,   311,   247,   273,   115,
+     162,   257,   135,   135,   139,   221,   135,   135,   259,   109,
+     119,   369,   135,   115,   226,   286,   287,   135,   134,   134,
+     109,   135,   110,   315,   168,   169,   117,   132,   111,   141,
+     199,   200,   201,   110,   116,   110,   134,   117,   110,   110,
+     110,   163,   226,   114,   150,   165,   163,   164,   166,   116,
+     135,   134,   134,   110,   116,   163,   134,   115,   161,   117,
+     263,   110,   110,   110,   344,   263,   110,   259,   224,   362,
+     111,   119,   163,   163,   226,   341,   263,   110,   110,   110,
+     110,   110,   110,   110,     7,   226,   335,   339,   350,   134,
+     134,   372,   134,   134,   110,   135,   135,   135,   135,   276,
+     135,   161,   162,   163,   309,   134,   277,   279,   115,   134,
+     210,   273,    40,    41,    43,    46,    47,    48,    49,    50,
+      51,    52,    53,    57,    61,    62,   111,   128,   139,   169,
+     170,   171,   172,   173,   174,   176,   177,   189,   191,   192,
+     197,   211,   307,    29,   135,   131,   276,   134,   134,   110,
+     135,   172,   247,   112,   110,   110,   110,   356,   251,   115,
+     258,   371,   110,   116,   112,   112,   135,   226,   116,   372,
+     289,   110,   285,   214,   216,   224,   297,   298,   299,   300,
+     291,   110,   110,   117,   162,   109,   110,   117,   116,   139,
+     163,   163,   278,   116,   135,   166,   112,   139,   146,   147,
+     163,   145,   135,   146,   161,   165,   135,   109,   348,   349,
+     135,   135,   134,   135,   135,   135,   163,   110,   135,   109,
+     348,   349,   109,   354,   109,   354,   349,   225,     7,   119,
+     135,   163,   263,   263,   262,   266,   266,   267,   116,   116,
+     110,   110,   112,    96,   123,   135,   135,   146,   277,   163,
+     116,   132,   211,   215,   226,   230,   109,   109,   170,   109,
+     109,   132,   139,   132,   139,   119,   139,   169,   109,   172,
+     164,   164,   112,   143,   117,   132,   135,   134,   135,   210,
+     110,   163,   263,   263,   311,   110,   115,   109,   348,   349,
+     115,   134,   110,   134,   135,   308,   115,   134,   135,   135,
+     110,   114,   199,   112,   162,   132,   199,   201,   110,   116,
+     135,   371,   164,   112,   135,    85,   113,   116,   135,   135,
+     112,   135,   110,   134,   110,   110,   112,   112,   112,   135,
+     110,   134,   134,   134,   163,   163,   135,   112,   135,   135,
+     135,   135,   134,   134,   162,   162,   112,   112,   135,   135,
+     273,   226,   168,   168,    47,   168,   134,   132,   132,   168,
+     132,   132,   168,    58,    59,    60,   193,   194,   195,   132,
+      63,   132,   114,   311,   174,   115,   132,   135,   135,   134,
+      96,   268,   269,   110,   298,   116,   132,   116,   132,   115,
+     296,   117,   141,   110,   110,   117,   166,   112,   115,   112,
+     111,   147,   111,   147,   147,   112,   112,   112,   263,   112,
+     263,   263,   263,   135,   135,   112,   112,   110,   110,   112,
+     116,    96,   262,    96,   135,   112,   112,   110,   110,   109,
+     110,   169,   190,   211,   132,   110,   109,   109,   172,   195,
+      58,    59,   163,   144,   170,   110,   110,   263,   114,   134,
+     134,   297,   141,   202,   109,   132,   202,   135,   117,   134,
+     134,   135,   135,   135,   135,   112,   112,   134,   135,   112,
+     170,    44,    45,   114,   180,   181,   182,   168,   170,   135,
+     110,   169,   114,   182,    96,   134,    96,   134,   109,   109,
+     132,   115,   135,   134,   271,   308,   115,   116,   117,   162,
+     110,   112,   163,   146,   146,   110,   110,   110,   110,   266,
+      42,   162,   178,   179,   309,   117,   134,   170,   180,   110,
+     132,   170,   132,   134,   110,   134,   110,   134,    96,   134,
+      96,   134,   132,   110,   297,   141,   139,   203,   110,   132,
+     117,   135,   135,   170,    96,   116,   117,   135,   204,   205,
+     211,   132,   169,   169,   204,   172,   196,   224,   365,   172,
+     196,   110,   134,   110,   134,   115,   110,   116,   163,   112,
+     112,   162,   178,   181,   183,   184,   134,   132,   181,   185,
+     186,   135,   109,   119,   308,   356,   139,   135,   172,   196,
+     172,   196,   109,   132,   139,   170,   175,   115,   181,   211,
+     169,    56,   175,   188,   115,   181,   110,   226,   110,   135,
+     135,   291,   170,   175,   132,   187,   188,   175,   188,   172,
+     172,   110,   110,   110,   187,   135,   135,   172,   172,   135,
+     135
 };
 
@@ -5002,5 +5089,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 290 "parser.yy"
+#line 292 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -5011,5 +5098,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 296 "parser.yy"
+#line 298 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -5020,5 +5107,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 305 "parser.yy"
+#line 307 "parser.yy"
     { (yyval.constant) = new ConstantNode( ConstantNode::Integer, (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5027,5 +5114,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 306 "parser.yy"
+#line 308 "parser.yy"
     { (yyval.constant) = new ConstantNode( ConstantNode::Float, (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5034,5 +5121,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 307 "parser.yy"
+#line 309 "parser.yy"
     { (yyval.constant) = new ConstantNode( ConstantNode::Character, (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5041,5 +5128,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 332 "parser.yy"
+#line 334 "parser.yy"
     { (yyval.constant) = new ConstantNode( ConstantNode::String, (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5048,16 +5135,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 333 "parser.yy"
+#line 335 "parser.yy"
     { (yyval.constant) = (yyvsp[(1) - (2)].constant)->appendstr( (yyvsp[(2) - (2)].tok) ); }
     break;
 
   case 18:
-
-/* Line 1806 of yacc.c  */
-#line 340 "parser.yy"
-    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
-    break;
-
-  case 19:
 
 /* Line 1806 of yacc.c  */
@@ -5066,8 +5146,15 @@
     break;
 
+  case 19:
+
+/* Line 1806 of yacc.c  */
+#line 344 "parser.yy"
+    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
+    break;
+
   case 20:
 
 /* Line 1806 of yacc.c  */
-#line 344 "parser.yy"
+#line 346 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (3)].en); }
     break;
@@ -5076,5 +5163,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 346 "parser.yy"
+#line 348 "parser.yy"
     { (yyval.en) = new ValofExprNode( (yyvsp[(2) - (3)].sn) ); }
     break;
@@ -5083,5 +5170,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 356 "parser.yy"
+#line 358 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ); }
     break;
@@ -5090,5 +5177,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 358 "parser.yy"
+#line 360 "parser.yy"
     { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -5097,5 +5184,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 362 "parser.yy"
+#line 364 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), (yyvsp[(1) - (3)].en), new VarRefNode( (yyvsp[(3) - (3)].tok) )); }
     break;
@@ -5104,5 +5191,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 365 "parser.yy"
+#line 367 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), (yyvsp[(1) - (3)].en), new VarRefNode( (yyvsp[(3) - (3)].tok) )); }
     break;
@@ -5111,5 +5198,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 368 "parser.yy"
+#line 370 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), (yyvsp[(1) - (2)].en) ); }
     break;
@@ -5118,5 +5205,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 370 "parser.yy"
+#line 372 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), (yyvsp[(1) - (2)].en) ); }
     break;
@@ -5125,6 +5212,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 372 "parser.yy"
-    { (yyval.en) = 0; }
+#line 374 "parser.yy"
+    { (yyval.en) = new CompoundLiteralNode( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ); }
     break;
 
@@ -5132,5 +5219,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 374 "parser.yy"
+#line 376 "parser.yy"
     {
 			Token fn; fn.str = new std::string( "?{}" ); // location undefined
@@ -5142,5 +5229,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 383 "parser.yy"
+#line 385 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
     break;
@@ -5149,5 +5236,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 388 "parser.yy"
+#line 390 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -5156,5 +5243,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 391 "parser.yy"
+#line 393 "parser.yy"
     { (yyval.en) = (yyvsp[(3) - (3)].en)->set_argName( (yyvsp[(1) - (3)].tok) ); }
     break;
@@ -5163,5 +5250,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 396 "parser.yy"
+#line 398 "parser.yy"
     { (yyval.en) = (yyvsp[(7) - (7)].en)->set_argName( (yyvsp[(3) - (7)].en) ); }
     break;
@@ -5170,5 +5257,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 398 "parser.yy"
+#line 400 "parser.yy"
     { (yyval.en) = (yyvsp[(9) - (9)].en)->set_argName( new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (9)].en)->set_link( flattenCommas( (yyvsp[(5) - (9)].en) )))); }
     break;
@@ -5177,5 +5264,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 403 "parser.yy"
+#line 405 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5184,5 +5271,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 408 "parser.yy"
+#line 410 "parser.yy"
     { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -5191,5 +5278,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 412 "parser.yy"
+#line 414 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5198,5 +5285,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 414 "parser.yy"
+#line 416 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
     break;
@@ -5205,5 +5292,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 416 "parser.yy"
+#line 418 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5212,16 +5299,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 418 "parser.yy"
+#line 420 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
     break;
 
   case 48:
-
-/* Line 1806 of yacc.c  */
-#line 426 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].constant); }
-    break;
-
-  case 49:
 
 /* Line 1806 of yacc.c  */
@@ -5230,8 +5310,15 @@
     break;
 
+  case 49:
+
+/* Line 1806 of yacc.c  */
+#line 430 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].constant); }
+    break;
+
   case 50:
 
 /* Line 1806 of yacc.c  */
-#line 430 "parser.yy"
+#line 432 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5240,5 +5327,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 432 "parser.yy"
+#line 434 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5247,5 +5334,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 434 "parser.yy"
+#line 436 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -5254,5 +5341,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 436 "parser.yy"
+#line 438 "parser.yy"
     { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5261,5 +5348,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 438 "parser.yy"
+#line 440 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Neg ), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5268,5 +5355,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 440 "parser.yy"
+#line 442 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PointTo ), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5275,5 +5362,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 446 "parser.yy"
+#line 448 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5282,5 +5369,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 448 "parser.yy"
+#line 450 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
     break;
@@ -5289,5 +5376,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 450 "parser.yy"
+#line 452 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( (yyvsp[(3) - (6)].decl) ), new VarRefNode( (yyvsp[(5) - (6)].tok) )); }
     break;
@@ -5296,5 +5383,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 452 "parser.yy"
+#line 454 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (1)].tok) )); }
     break;
@@ -5303,5 +5390,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 454 "parser.yy"
+#line 456 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
     break;
@@ -5310,5 +5397,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 456 "parser.yy"
+#line 458 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -5317,5 +5404,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 458 "parser.yy"
+#line 460 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5324,5 +5411,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 460 "parser.yy"
+#line 462 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ); }
     break;
@@ -5331,5 +5418,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 462 "parser.yy"
+#line 464 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( (yyvsp[(2) - (2)].tok), true ) ); }
     break;
@@ -5338,5 +5425,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 466 "parser.yy"
+#line 468 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::AddressOf ); }
     break;
@@ -5345,5 +5432,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 467 "parser.yy"
+#line 469 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::UnPlus ); }
     break;
@@ -5352,5 +5439,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 468 "parser.yy"
+#line 470 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::UnMinus ); }
     break;
@@ -5359,16 +5446,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 469 "parser.yy"
+#line 471 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::BitNeg ); }
     break;
 
   case 70:
-
-/* Line 1806 of yacc.c  */
-#line 475 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ); }
-    break;
-
-  case 71:
 
 /* Line 1806 of yacc.c  */
@@ -5377,8 +5457,15 @@
     break;
 
+  case 71:
+
+/* Line 1806 of yacc.c  */
+#line 479 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ); }
+    break;
+
   case 73:
 
 /* Line 1806 of yacc.c  */
-#line 483 "parser.yy"
+#line 485 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5387,5 +5474,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 485 "parser.yy"
+#line 487 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5394,5 +5481,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 487 "parser.yy"
+#line 489 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mod ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5401,5 +5488,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 493 "parser.yy"
+#line 495 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5408,5 +5495,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 495 "parser.yy"
+#line 497 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Minus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5415,5 +5502,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 501 "parser.yy"
+#line 503 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5422,5 +5509,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 503 "parser.yy"
+#line 505 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::RShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5429,5 +5516,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 509 "parser.yy"
+#line 511 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5436,5 +5523,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 511 "parser.yy"
+#line 513 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5443,5 +5530,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 513 "parser.yy"
+#line 515 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5450,5 +5537,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 515 "parser.yy"
+#line 517 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5457,5 +5544,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 521 "parser.yy"
+#line 523 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5464,5 +5551,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 523 "parser.yy"
+#line 525 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Neq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5471,5 +5558,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 529 "parser.yy"
+#line 531 "parser.yy"
     { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::BitAnd ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5478,5 +5565,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 535 "parser.yy"
+#line 537 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Xor ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5485,5 +5572,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 541 "parser.yy"
+#line 543 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::BitOr ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5492,5 +5579,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 547 "parser.yy"
+#line 549 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::And ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5499,5 +5586,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 553 "parser.yy"
+#line 555 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Or ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5506,5 +5593,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 559 "parser.yy"
+#line 561 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
     break;
@@ -5513,5 +5600,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 561 "parser.yy"
+#line 563 "parser.yy"
     { (yyval.en)=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ); }
     break;
@@ -5520,5 +5607,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 563 "parser.yy"
+#line 565 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
     break;
@@ -5527,5 +5614,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 574 "parser.yy"
+#line 576 "parser.yy"
     { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5534,5 +5621,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 576 "parser.yy"
+#line 578 "parser.yy"
     { (yyval.en) =new CompositeExprNode( (yyvsp[(2) - (3)].en), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5541,5 +5628,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 578 "parser.yy"
+#line 580 "parser.yy"
     { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5548,5 +5635,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 583 "parser.yy"
+#line 585 "parser.yy"
     { (yyval.en) = new NullExprNode; }
     break;
@@ -5555,5 +5642,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 591 "parser.yy"
+#line 593 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
     break;
@@ -5562,5 +5649,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 593 "parser.yy"
+#line 595 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (yyvsp[(3) - (5)].en) ); }
     break;
@@ -5569,5 +5656,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 595 "parser.yy"
+#line 597 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( (yyvsp[(4) - (6)].en) ) ); }
     break;
@@ -5576,5 +5663,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 597 "parser.yy"
+#line 599 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_link( flattenCommas( (yyvsp[(5) - (7)].en) ) ) ); }
     break;
@@ -5583,5 +5670,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 603 "parser.yy"
+#line 605 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5590,5 +5677,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 607 "parser.yy"
+#line 609 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::MulAssn ); }
     break;
@@ -5597,5 +5684,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 608 "parser.yy"
+#line 610 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::DivAssn ); }
     break;
@@ -5604,5 +5691,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 609 "parser.yy"
+#line 611 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::ModAssn ); }
     break;
@@ -5611,5 +5698,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 610 "parser.yy"
+#line 612 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::PlusAssn ); }
     break;
@@ -5618,5 +5705,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 611 "parser.yy"
+#line 613 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::MinusAssn ); }
     break;
@@ -5625,5 +5712,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 612 "parser.yy"
+#line 614 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::LSAssn ); }
     break;
@@ -5632,5 +5719,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 613 "parser.yy"
+#line 615 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::RSAssn ); }
     break;
@@ -5639,5 +5726,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 614 "parser.yy"
+#line 616 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::AndAssn ); }
     break;
@@ -5646,5 +5733,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 615 "parser.yy"
+#line 617 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::ERAssn ); }
     break;
@@ -5653,5 +5740,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 616 "parser.yy"
+#line 618 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::OrAssn ); }
     break;
@@ -5660,5 +5747,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 622 "parser.yy"
+#line 624 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5667,5 +5754,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 627 "parser.yy"
+#line 629 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -5674,5 +5761,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 636 "parser.yy"
+#line 638 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (1)].sn); }
     break;
@@ -5681,5 +5768,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 643 "parser.yy"
+#line 645 "parser.yy"
     {
 			Token fn; fn.str = new std::string( "^?{}" ); // location undefined
@@ -5692,5 +5779,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 652 "parser.yy"
+#line 654 "parser.yy"
     {
 			(yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) );
@@ -5701,5 +5788,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 659 "parser.yy"
+#line 661 "parser.yy"
     { (yyval.sn) = new CompoundStmtNode( (StatementNode *)0 ); }
     break;
@@ -5708,5 +5795,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 666 "parser.yy"
+#line 668 "parser.yy"
     { (yyval.sn) = new CompoundStmtNode( (yyvsp[(5) - (7)].sn) ); }
     break;
@@ -5715,5 +5802,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 672 "parser.yy"
+#line 674 "parser.yy"
     { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
     break;
@@ -5722,5 +5809,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 677 "parser.yy"
+#line 679 "parser.yy"
     { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
@@ -5729,5 +5816,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 679 "parser.yy"
+#line 681 "parser.yy"
     { (yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -5736,5 +5823,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 681 "parser.yy"
+#line 683 "parser.yy"
     { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
@@ -5743,5 +5830,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 688 "parser.yy"
+#line 690 "parser.yy"
     { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
     break;
@@ -5750,5 +5837,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 693 "parser.yy"
+#line 695 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Exp, (yyvsp[(1) - (2)].en), 0 ); }
     break;
@@ -5757,5 +5844,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 699 "parser.yy"
+#line 701 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -5764,5 +5851,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 701 "parser.yy"
+#line 703 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (7)].en), (StatementNode *)mkList((*(yyvsp[(5) - (7)].sn), *(yyvsp[(7) - (7)].sn) )) ); }
     break;
@@ -5771,5 +5858,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 703 "parser.yy"
+#line 705 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -5778,5 +5865,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 705 "parser.yy"
+#line 707 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ); /* xxx */ }
     break;
@@ -5785,5 +5872,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 710 "parser.yy"
+#line 712 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Choose, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -5792,5 +5879,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 712 "parser.yy"
+#line 714 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Choose, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ); }
     break;
@@ -5799,5 +5886,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 719 "parser.yy"
+#line 721 "parser.yy"
     { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
@@ -5806,5 +5893,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 721 "parser.yy"
+#line 723 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5813,5 +5900,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 728 "parser.yy"
+#line 730 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(tupleContents( (yyvsp[(1) - (3)].en) ))->set_link( (yyvsp[(3) - (3)].en) ) ); }
     break;
@@ -5820,5 +5907,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 732 "parser.yy"
+#line 734 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Case, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -5827,5 +5914,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 733 "parser.yy"
+#line 735 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Default ); }
     break;
@@ -5834,5 +5921,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 739 "parser.yy"
+#line 741 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) )); }
     break;
@@ -5841,5 +5928,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 743 "parser.yy"
+#line 745 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
@@ -5848,5 +5935,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 748 "parser.yy"
+#line 750 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -5855,5 +5942,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 754 "parser.yy"
+#line 756 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
@@ -5862,5 +5949,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 756 "parser.yy"
+#line 758 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
     break;
@@ -5869,5 +5956,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 761 "parser.yy"
+#line 763 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -5876,5 +5963,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 767 "parser.yy"
+#line 769 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
@@ -5883,5 +5970,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 769 "parser.yy"
+#line 771 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case((StatementNode *)mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].sn) ))); }
     break;
@@ -5890,5 +5977,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 771 "parser.yy"
+#line 773 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
     break;
@@ -5897,5 +5984,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 773 "parser.yy"
+#line 775 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_link( (yyvsp[(2) - (4)].sn)->append_last_case((StatementNode *)mkList((*(yyvsp[(3) - (4)].sn),*(yyvsp[(4) - (4)].sn) ))))); }
     break;
@@ -5904,5 +5991,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 778 "parser.yy"
+#line 780 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -5911,5 +5998,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 783 "parser.yy"
+#line 785 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Fallthru ); }
     break;
@@ -5918,5 +6005,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 784 "parser.yy"
+#line 786 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Fallthru ); }
     break;
@@ -5925,5 +6012,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 789 "parser.yy"
+#line 791 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::While, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -5932,5 +6019,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 791 "parser.yy"
+#line 793 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Do, (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ); }
     break;
@@ -5939,5 +6026,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 793 "parser.yy"
+#line 795 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::For, (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].sn) ); }
     break;
@@ -5946,5 +6033,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 798 "parser.yy"
+#line 800 "parser.yy"
     { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
     break;
@@ -5953,5 +6040,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 800 "parser.yy"
+#line 802 "parser.yy"
     { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
     break;
@@ -5960,5 +6047,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 805 "parser.yy"
+#line 807 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -5967,5 +6054,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 809 "parser.yy"
+#line 811 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(3) - (4)].en) ); }
     break;
@@ -5974,5 +6061,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 812 "parser.yy"
+#line 814 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Continue ); }
     break;
@@ -5981,5 +6068,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 816 "parser.yy"
+#line 818 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Continue, (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -5988,5 +6075,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 819 "parser.yy"
+#line 821 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Break ); }
     break;
@@ -5995,5 +6082,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 823 "parser.yy"
+#line 825 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Break, (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -6002,5 +6089,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 825 "parser.yy"
+#line 827 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Return, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -6009,5 +6096,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 827 "parser.yy"
+#line 829 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -6016,5 +6103,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 831 "parser.yy"
+#line 833 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -6023,16 +6110,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 833 "parser.yy"
+#line 835 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (5)].en), 0 ); }
     break;
 
   case 197:
-
-/* Line 1806 of yacc.c  */
-#line 840 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
-    break;
-
-  case 198:
 
 /* Line 1806 of yacc.c  */
@@ -6041,8 +6121,15 @@
     break;
 
+  case 198:
+
+/* Line 1806 of yacc.c  */
+#line 844 "parser.yy"
+    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
+    break;
+
   case 199:
 
 /* Line 1806 of yacc.c  */
-#line 844 "parser.yy"
+#line 846 "parser.yy"
     {
 			(yyvsp[(3) - (4)].pn)->set_link( (yyvsp[(4) - (4)].pn) );
@@ -6054,5 +6141,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 855 "parser.yy"
+#line 857 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
     break;
@@ -6061,5 +6148,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 857 "parser.yy"
+#line 859 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
     break;
@@ -6068,5 +6155,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 859 "parser.yy"
+#line 861 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
     break;
@@ -6075,5 +6162,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 861 "parser.yy"
+#line 863 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
     break;
@@ -6082,5 +6169,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 866 "parser.yy"
+#line 868 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
     break;
@@ -6089,5 +6176,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 868 "parser.yy"
+#line 870 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
     break;
@@ -6096,5 +6183,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 870 "parser.yy"
+#line 872 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
     break;
@@ -6103,5 +6190,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 872 "parser.yy"
+#line 874 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
     break;
@@ -6110,5 +6197,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 877 "parser.yy"
+#line 879 "parser.yy"
     {
 			(yyval.pn) = new StatementNode( StatementNode::Finally, 0, (yyvsp[(2) - (2)].sn) );
@@ -6120,5 +6207,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 891 "parser.yy"
+#line 893 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6130,5 +6217,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 896 "parser.yy"
+#line 898 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -6137,5 +6224,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 898 "parser.yy"
+#line 900 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6147,5 +6234,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 907 "parser.yy"
+#line 909 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ); }
     break;
@@ -6154,5 +6241,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 909 "parser.yy"
+#line 911 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ); }
     break;
@@ -6161,5 +6248,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 911 "parser.yy"
+#line 913 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ); }
     break;
@@ -6168,5 +6255,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 913 "parser.yy"
+#line 915 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].constant) ); }
     break;
@@ -6175,5 +6262,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 915 "parser.yy"
+#line 917 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].constant), (yyvsp[(12) - (14)].label) ); }
     break;
@@ -6182,5 +6269,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 920 "parser.yy"
+#line 922 "parser.yy"
     { (yyval.flag) = false; }
     break;
@@ -6189,5 +6276,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 922 "parser.yy"
+#line 924 "parser.yy"
     { (yyval.flag) = true; }
     break;
@@ -6196,5 +6283,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 927 "parser.yy"
+#line 929 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -6203,5 +6290,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 934 "parser.yy"
+#line 936 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
     break;
@@ -6210,5 +6297,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 939 "parser.yy"
+#line 941 "parser.yy"
     { (yyval.en) = new AsmExprNode( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -6217,5 +6304,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 941 "parser.yy"
+#line 943 "parser.yy"
     { (yyval.en) = new AsmExprNode( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ); }
     break;
@@ -6224,5 +6311,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 946 "parser.yy"
+#line 948 "parser.yy"
     { (yyval.constant) = 0; }
     break;
@@ -6231,5 +6318,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 948 "parser.yy"
+#line 950 "parser.yy"
     { (yyval.constant) = (yyvsp[(1) - (1)].constant); }
     break;
@@ -6238,5 +6325,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 950 "parser.yy"
+#line 952 "parser.yy"
     { (yyval.constant) = (ConstantNode *)(yyvsp[(1) - (3)].constant)->set_link( (yyvsp[(3) - (3)].constant) ); }
     break;
@@ -6245,5 +6332,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 955 "parser.yy"
+#line 957 "parser.yy"
     { (yyval.label) = new LabelNode(); (yyval.label)->append_label( (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -6252,5 +6339,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 957 "parser.yy"
+#line 959 "parser.yy"
     { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->append_label( (yyvsp[(3) - (3)].tok) ); }
     break;
@@ -6259,5 +6346,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 964 "parser.yy"
+#line 966 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6266,5 +6353,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 971 "parser.yy"
+#line 973 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -6273,5 +6360,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 976 "parser.yy"
+#line 978 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6280,5 +6367,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 983 "parser.yy"
+#line 985 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -6287,5 +6374,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 997 "parser.yy"
+#line 999 "parser.yy"
     {}
     break;
@@ -6294,5 +6381,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 998 "parser.yy"
+#line 1000 "parser.yy"
     {}
     break;
@@ -6301,8 +6388,8 @@
 
 /* Line 1806 of yacc.c  */
-#line 1027 "parser.yy"
+#line 1029 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
-			(yyval.decl) = (yyvsp[(1) - (2)].decl);
+			(yyval.decl) = (yyvsp[(1) - (2)].decl)->addInitializer( (yyvsp[(2) - (2)].in) );
 		}
     break;
@@ -6311,8 +6398,8 @@
 
 /* Line 1806 of yacc.c  */
-#line 1034 "parser.yy"
+#line 1036 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
-			(yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) );
+			(yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addInitializer( (yyvsp[(3) - (3)].in) );;
 		}
     break;
@@ -6321,8 +6408,8 @@
 
 /* Line 1806 of yacc.c  */
-#line 1039 "parser.yy"
+#line 1041 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID );
-			(yyval.decl) = (yyvsp[(1) - (6)].decl)->appendList( (yyvsp[(1) - (6)].decl)->cloneType( (yyvsp[(5) - (6)].tok) ) );
+			(yyval.decl) = (yyvsp[(1) - (6)].decl)->appendList( (yyvsp[(1) - (6)].decl)->cloneType( (yyvsp[(5) - (6)].tok) )->addInitializer( (yyvsp[(6) - (6)].in) ) );
 		}
     break;
@@ -6331,5 +6418,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1049 "parser.yy"
+#line 1051 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6341,5 +6428,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1054 "parser.yy"
+#line 1056 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6351,5 +6438,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1059 "parser.yy"
+#line 1061 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) );
@@ -6361,5 +6448,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1067 "parser.yy"
+#line 1069 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6371,5 +6458,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1072 "parser.yy"
+#line 1074 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6381,5 +6468,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1077 "parser.yy"
+#line 1079 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6391,5 +6478,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1082 "parser.yy"
+#line 1084 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6401,5 +6488,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1087 "parser.yy"
+#line 1089 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -6411,5 +6498,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1095 "parser.yy"
+#line 1097 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true );
@@ -6420,5 +6507,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1118 "parser.yy"
+#line 1120 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
@@ -6429,5 +6516,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1122 "parser.yy"
+#line 1124 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
@@ -6438,5 +6525,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1129 "parser.yy"
+#line 1131 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
@@ -6445,5 +6532,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1133 "parser.yy"
+#line 1135 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); }
     break;
@@ -6452,5 +6539,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1138 "parser.yy"
+#line 1140 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6462,5 +6549,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1143 "parser.yy"
+#line 1145 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6472,5 +6559,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1148 "parser.yy"
+#line 1150 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD );
@@ -6482,5 +6569,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1159 "parser.yy"
+#line 1161 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6492,5 +6579,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1164 "parser.yy"
+#line 1166 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6502,5 +6589,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1169 "parser.yy"
+#line 1171 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6512,5 +6599,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1174 "parser.yy"
+#line 1176 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6522,5 +6609,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1179 "parser.yy"
+#line 1181 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6532,5 +6619,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1188 "parser.yy"
+#line 1190 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD );
@@ -6542,5 +6629,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1193 "parser.yy"
+#line 1195 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD );
@@ -6552,5 +6639,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1210 "parser.yy"
+#line 1212 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6562,5 +6649,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1215 "parser.yy"
+#line 1217 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6572,5 +6659,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1237 "parser.yy"
+#line 1239 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6579,5 +6666,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1249 "parser.yy"
+#line 1251 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -6586,5 +6673,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1260 "parser.yy"
+#line 1262 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
     break;
@@ -6593,5 +6680,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1262 "parser.yy"
+#line 1264 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
     break;
@@ -6600,5 +6687,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1264 "parser.yy"
+#line 1266 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
     break;
@@ -6607,5 +6694,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1266 "parser.yy"
+#line 1268 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
     break;
@@ -6614,5 +6701,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1268 "parser.yy"
+#line 1270 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
     break;
@@ -6621,5 +6708,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1270 "parser.yy"
+#line 1272 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -6630,5 +6717,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1274 "parser.yy"
+#line 1276 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -6640,5 +6727,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1283 "parser.yy"
+#line 1285 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -6647,5 +6734,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1285 "parser.yy"
+#line 1287 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -6654,5 +6741,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1296 "parser.yy"
+#line 1298 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -6661,5 +6748,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1305 "parser.yy"
+#line 1307 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
     break;
@@ -6668,5 +6755,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1307 "parser.yy"
+#line 1309 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
     break;
@@ -6675,5 +6762,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1309 "parser.yy"
+#line 1311 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
     break;
@@ -6682,5 +6769,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1311 "parser.yy"
+#line 1313 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
     break;
@@ -6689,5 +6776,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1313 "parser.yy"
+#line 1315 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
     break;
@@ -6696,5 +6783,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1315 "parser.yy"
+#line 1317 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
     break;
@@ -6703,5 +6790,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1317 "parser.yy"
+#line 1319 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
     break;
@@ -6710,5 +6797,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1319 "parser.yy"
+#line 1321 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
     break;
@@ -6717,5 +6804,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1324 "parser.yy"
+#line 1326 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
     break;
@@ -6724,5 +6811,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1326 "parser.yy"
+#line 1328 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
     break;
@@ -6731,5 +6818,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1328 "parser.yy"
+#line 1330 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
     break;
@@ -6738,5 +6825,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1330 "parser.yy"
+#line 1332 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
     break;
@@ -6745,5 +6832,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1332 "parser.yy"
+#line 1334 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
     break;
@@ -6752,5 +6839,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1334 "parser.yy"
+#line 1336 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
     break;
@@ -6759,5 +6846,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1336 "parser.yy"
+#line 1338 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
     break;
@@ -6766,5 +6853,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1338 "parser.yy"
+#line 1340 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
     break;
@@ -6773,5 +6860,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1340 "parser.yy"
+#line 1342 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
     break;
@@ -6780,5 +6867,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1342 "parser.yy"
+#line 1344 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
     break;
@@ -6787,5 +6874,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1344 "parser.yy"
+#line 1346 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
     break;
@@ -6794,188 +6881,191 @@
 
 /* Line 1806 of yacc.c  */
-#line 1346 "parser.yy"
+#line 1348 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
     break;
 
-  case 334:
-
-/* Line 1806 of yacc.c  */
-#line 1353 "parser.yy"
+  case 333:
+
+/* Line 1806 of yacc.c  */
+#line 1350 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
+    break;
+
+  case 335:
+
+/* Line 1806 of yacc.c  */
+#line 1357 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 335:
-
-/* Line 1806 of yacc.c  */
-#line 1355 "parser.yy"
+  case 336:
+
+/* Line 1806 of yacc.c  */
+#line 1359 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 336:
-
-/* Line 1806 of yacc.c  */
-#line 1357 "parser.yy"
+  case 337:
+
+/* Line 1806 of yacc.c  */
+#line 1361 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 337:
-
-/* Line 1806 of yacc.c  */
-#line 1359 "parser.yy"
+  case 338:
+
+/* Line 1806 of yacc.c  */
+#line 1363 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
     break;
 
-  case 339:
-
-/* Line 1806 of yacc.c  */
-#line 1365 "parser.yy"
+  case 340:
+
+/* Line 1806 of yacc.c  */
+#line 1369 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 341:
-
-/* Line 1806 of yacc.c  */
-#line 1372 "parser.yy"
+  case 342:
+
+/* Line 1806 of yacc.c  */
+#line 1376 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 342:
-
-/* Line 1806 of yacc.c  */
-#line 1374 "parser.yy"
+  case 343:
+
+/* Line 1806 of yacc.c  */
+#line 1378 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 343:
-
-/* Line 1806 of yacc.c  */
-#line 1376 "parser.yy"
+  case 344:
+
+/* Line 1806 of yacc.c  */
+#line 1380 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 344:
-
-/* Line 1806 of yacc.c  */
-#line 1381 "parser.yy"
+  case 345:
+
+/* Line 1806 of yacc.c  */
+#line 1385 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
     break;
 
-  case 345:
-
-/* Line 1806 of yacc.c  */
-#line 1383 "parser.yy"
+  case 346:
+
+/* Line 1806 of yacc.c  */
+#line 1387 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
     break;
 
-  case 346:
-
-/* Line 1806 of yacc.c  */
-#line 1385 "parser.yy"
+  case 347:
+
+/* Line 1806 of yacc.c  */
+#line 1389 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
     break;
 
-  case 347:
-
-/* Line 1806 of yacc.c  */
-#line 1387 "parser.yy"
+  case 348:
+
+/* Line 1806 of yacc.c  */
+#line 1391 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
     break;
 
-  case 349:
-
-/* Line 1806 of yacc.c  */
-#line 1393 "parser.yy"
+  case 350:
+
+/* Line 1806 of yacc.c  */
+#line 1397 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 350:
-
-/* Line 1806 of yacc.c  */
-#line 1395 "parser.yy"
+  case 351:
+
+/* Line 1806 of yacc.c  */
+#line 1399 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 351:
-
-/* Line 1806 of yacc.c  */
-#line 1397 "parser.yy"
+  case 352:
+
+/* Line 1806 of yacc.c  */
+#line 1401 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 353:
-
-/* Line 1806 of yacc.c  */
-#line 1403 "parser.yy"
+  case 354:
+
+/* Line 1806 of yacc.c  */
+#line 1407 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 354:
-
-/* Line 1806 of yacc.c  */
-#line 1405 "parser.yy"
+  case 355:
+
+/* Line 1806 of yacc.c  */
+#line 1409 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 356:
-
-/* Line 1806 of yacc.c  */
-#line 1411 "parser.yy"
+  case 357:
+
+/* Line 1806 of yacc.c  */
+#line 1415 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 357:
-
-/* Line 1806 of yacc.c  */
-#line 1413 "parser.yy"
+  case 358:
+
+/* Line 1806 of yacc.c  */
+#line 1417 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 358:
-
-/* Line 1806 of yacc.c  */
-#line 1415 "parser.yy"
+  case 359:
+
+/* Line 1806 of yacc.c  */
+#line 1419 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 359:
-
-/* Line 1806 of yacc.c  */
-#line 1420 "parser.yy"
+  case 360:
+
+/* Line 1806 of yacc.c  */
+#line 1424 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); }
     break;
 
-  case 360:
-
-/* Line 1806 of yacc.c  */
-#line 1422 "parser.yy"
+  case 361:
+
+/* Line 1806 of yacc.c  */
+#line 1426 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 361:
-
-/* Line 1806 of yacc.c  */
-#line 1424 "parser.yy"
+  case 362:
+
+/* Line 1806 of yacc.c  */
+#line 1428 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 364:
-
-/* Line 1806 of yacc.c  */
-#line 1434 "parser.yy"
+  case 365:
+
+/* Line 1806 of yacc.c  */
+#line 1438 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl) ); }
     break;
 
-  case 365:
-
-/* Line 1806 of yacc.c  */
-#line 1436 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (2)].aggKey), (yyvsp[(2) - (2)].tok), 0, 0 ); }
-    break;
-
   case 366:
 
 /* Line 1806 of yacc.c  */
-#line 1438 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (5)].aggKey), (yyvsp[(2) - (5)].tok), 0, (yyvsp[(4) - (5)].decl) ); }
+#line 1440 "parser.yy"
+    {
+			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
+			(yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (2)].aggKey), (yyvsp[(2) - (2)].tok), 0, 0 );
+		}
     break;
 
@@ -6983,226 +7073,222 @@
 
 /* Line 1806 of yacc.c  */
-#line 1440 "parser.yy"
+#line 1445 "parser.yy"
+    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+    break;
+
+  case 368:
+
+/* Line 1806 of yacc.c  */
+#line 1447 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl)); }
+    break;
+
+  case 369:
+
+/* Line 1806 of yacc.c  */
+#line 1449 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl) ); }
     break;
 
-  case 368:
-
-/* Line 1806 of yacc.c  */
-#line 1442 "parser.yy"
+  case 370:
+
+/* Line 1806 of yacc.c  */
+#line 1451 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
 
-  case 369:
-
-/* Line 1806 of yacc.c  */
-#line 1447 "parser.yy"
+  case 371:
+
+/* Line 1806 of yacc.c  */
+#line 1456 "parser.yy"
     { (yyval.aggKey) = DeclarationNode::Struct; }
     break;
 
-  case 370:
-
-/* Line 1806 of yacc.c  */
-#line 1449 "parser.yy"
+  case 372:
+
+/* Line 1806 of yacc.c  */
+#line 1458 "parser.yy"
     { (yyval.aggKey) = DeclarationNode::Union; }
     break;
 
-  case 371:
-
-/* Line 1806 of yacc.c  */
-#line 1454 "parser.yy"
+  case 373:
+
+/* Line 1806 of yacc.c  */
+#line 1463 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (1)].decl); }
     break;
 
-  case 372:
-
-/* Line 1806 of yacc.c  */
-#line 1456 "parser.yy"
+  case 374:
+
+/* Line 1806 of yacc.c  */
+#line 1465 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 374:
-
-/* Line 1806 of yacc.c  */
-#line 1462 "parser.yy"
+  case 376:
+
+/* Line 1806 of yacc.c  */
+#line 1471 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 376:
-
-/* Line 1806 of yacc.c  */
-#line 1465 "parser.yy"
+  case 378:
+
+/* Line 1806 of yacc.c  */
+#line 1474 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 378:
-
-/* Line 1806 of yacc.c  */
-#line 1471 "parser.yy"
+  case 380:
+
+/* Line 1806 of yacc.c  */
+#line 1480 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
     break;
 
-  case 379:
-
-/* Line 1806 of yacc.c  */
-#line 1473 "parser.yy"
+  case 381:
+
+/* Line 1806 of yacc.c  */
+#line 1482 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
     break;
 
-  case 380:
-
-/* Line 1806 of yacc.c  */
-#line 1475 "parser.yy"
+  case 382:
+
+/* Line 1806 of yacc.c  */
+#line 1484 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
     break;
 
-  case 381:
-
-/* Line 1806 of yacc.c  */
-#line 1480 "parser.yy"
+  case 383:
+
+/* Line 1806 of yacc.c  */
+#line 1489 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 382:
-
-/* Line 1806 of yacc.c  */
-#line 1482 "parser.yy"
+  case 384:
+
+/* Line 1806 of yacc.c  */
+#line 1491 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
     break;
 
-  case 383:
-
-/* Line 1806 of yacc.c  */
-#line 1487 "parser.yy"
+  case 385:
+
+/* Line 1806 of yacc.c  */
+#line 1496 "parser.yy"
     { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
     break;
 
-  case 384:
-
-/* Line 1806 of yacc.c  */
-#line 1489 "parser.yy"
+  case 386:
+
+/* Line 1806 of yacc.c  */
+#line 1498 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
     break;
 
-  case 385:
-
-/* Line 1806 of yacc.c  */
-#line 1492 "parser.yy"
+  case 387:
+
+/* Line 1806 of yacc.c  */
+#line 1501 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
     break;
 
-  case 386:
-
-/* Line 1806 of yacc.c  */
-#line 1495 "parser.yy"
+  case 388:
+
+/* Line 1806 of yacc.c  */
+#line 1504 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
     break;
 
-  case 388:
-
-/* Line 1806 of yacc.c  */
-#line 1501 "parser.yy"
+  case 390:
+
+/* Line 1806 of yacc.c  */
+#line 1510 "parser.yy"
     { (yyval.en) = 0; }
     break;
 
-  case 389:
-
-/* Line 1806 of yacc.c  */
-#line 1503 "parser.yy"
+  case 391:
+
+/* Line 1806 of yacc.c  */
+#line 1512 "parser.yy"
     { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
 
-  case 390:
-
-/* Line 1806 of yacc.c  */
-#line 1508 "parser.yy"
+  case 392:
+
+/* Line 1806 of yacc.c  */
+#line 1517 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
 
-  case 392:
-
-/* Line 1806 of yacc.c  */
-#line 1517 "parser.yy"
+  case 394:
+
+/* Line 1806 of yacc.c  */
+#line 1526 "parser.yy"
     { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
     break;
 
-  case 393:
-
-/* Line 1806 of yacc.c  */
-#line 1519 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (6)].tok), (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 394:
-
-/* Line 1806 of yacc.c  */
-#line 1521 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (2)].tok), 0 ); }
-    break;
-
   case 395:
 
 /* Line 1806 of yacc.c  */
-#line 1526 "parser.yy"
+#line 1528 "parser.yy"
+    {
+			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
+			(yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (2)].tok), 0 );
+		}
+    break;
+
+  case 396:
+
+/* Line 1806 of yacc.c  */
+#line 1533 "parser.yy"
+    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+    break;
+
+  case 397:
+
+/* Line 1806 of yacc.c  */
+#line 1535 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
+    break;
+
+  case 398:
+
+/* Line 1806 of yacc.c  */
+#line 1540 "parser.yy"
     { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
     break;
 
-  case 396:
-
-/* Line 1806 of yacc.c  */
-#line 1528 "parser.yy"
+  case 399:
+
+/* Line 1806 of yacc.c  */
+#line 1542 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
     break;
 
-  case 397:
-
-/* Line 1806 of yacc.c  */
-#line 1533 "parser.yy"
+  case 400:
+
+/* Line 1806 of yacc.c  */
+#line 1547 "parser.yy"
     { (yyval.en) = 0; }
     break;
 
-  case 398:
-
-/* Line 1806 of yacc.c  */
-#line 1535 "parser.yy"
+  case 401:
+
+/* Line 1806 of yacc.c  */
+#line 1549 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
 
-  case 399:
-
-/* Line 1806 of yacc.c  */
-#line 1542 "parser.yy"
+  case 402:
+
+/* Line 1806 of yacc.c  */
+#line 1556 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 403:
-
-/* Line 1806 of yacc.c  */
-#line 1550 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 404:
-
-/* Line 1806 of yacc.c  */
-#line 1552 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
-    break;
-
-  case 405:
-
-/* Line 1806 of yacc.c  */
-#line 1554 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
-    break;
-
-  case 407:
-
-/* Line 1806 of yacc.c  */
-#line 1562 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 408:
+  case 406:
 
 /* Line 1806 of yacc.c  */
@@ -7211,78 +7297,106 @@
     break;
 
-  case 409:
+  case 407:
 
 /* Line 1806 of yacc.c  */
 #line 1566 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+    break;
+
+  case 408:
+
+/* Line 1806 of yacc.c  */
+#line 1568 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+    break;
+
+  case 410:
+
+/* Line 1806 of yacc.c  */
+#line 1576 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 411:
+
+/* Line 1806 of yacc.c  */
+#line 1578 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 412:
+
+/* Line 1806 of yacc.c  */
+#line 1580 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
     break;
 
-  case 411:
-
-/* Line 1806 of yacc.c  */
-#line 1572 "parser.yy"
+  case 414:
+
+/* Line 1806 of yacc.c  */
+#line 1586 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
-  case 412:
-
-/* Line 1806 of yacc.c  */
-#line 1577 "parser.yy"
+  case 415:
+
+/* Line 1806 of yacc.c  */
+#line 1591 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 415:
-
-/* Line 1806 of yacc.c  */
-#line 1584 "parser.yy"
+  case 418:
+
+/* Line 1806 of yacc.c  */
+#line 1598 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     break;
 
-  case 418:
-
-/* Line 1806 of yacc.c  */
-#line 1591 "parser.yy"
+  case 421:
+
+/* Line 1806 of yacc.c  */
+#line 1605 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
-  case 419:
-
-/* Line 1806 of yacc.c  */
-#line 1593 "parser.yy"
+  case 422:
+
+/* Line 1806 of yacc.c  */
+#line 1607 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
-  case 421:
-
-/* Line 1806 of yacc.c  */
-#line 1602 "parser.yy"
+  case 424:
+
+/* Line 1806 of yacc.c  */
+#line 1616 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
     break;
 
-  case 422:
-
-/* Line 1806 of yacc.c  */
-#line 1605 "parser.yy"
+  case 425:
+
+/* Line 1806 of yacc.c  */
+#line 1619 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
     break;
 
-  case 423:
-
-/* Line 1806 of yacc.c  */
-#line 1607 "parser.yy"
+  case 426:
+
+/* Line 1806 of yacc.c  */
+#line 1621 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); }
     break;
 
-  case 428:
-
-/* Line 1806 of yacc.c  */
-#line 1617 "parser.yy"
+  case 431:
+
+/* Line 1806 of yacc.c  */
+#line 1631 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 430:
-
-/* Line 1806 of yacc.c  */
-#line 1623 "parser.yy"
+  case 433:
+
+/* Line 1806 of yacc.c  */
+#line 1637 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7291,8 +7405,8 @@
     break;
 
-  case 431:
-
-/* Line 1806 of yacc.c  */
-#line 1628 "parser.yy"
+  case 434:
+
+/* Line 1806 of yacc.c  */
+#line 1642 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7301,75 +7415,40 @@
     break;
 
-  case 433:
-
-/* Line 1806 of yacc.c  */
-#line 1637 "parser.yy"
+  case 436:
+
+/* Line 1806 of yacc.c  */
+#line 1651 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 434:
-
-/* Line 1806 of yacc.c  */
-#line 1646 "parser.yy"
+  case 437:
+
+/* Line 1806 of yacc.c  */
+#line 1660 "parser.yy"
     { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); }
     break;
 
-  case 435:
-
-/* Line 1806 of yacc.c  */
-#line 1648 "parser.yy"
+  case 438:
+
+/* Line 1806 of yacc.c  */
+#line 1662 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); }
     break;
 
-  case 447:
-
-/* Line 1806 of yacc.c  */
-#line 1673 "parser.yy"
+  case 450:
+
+/* Line 1806 of yacc.c  */
+#line 1687 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 451:
-
-/* Line 1806 of yacc.c  */
-#line 1681 "parser.yy"
+  case 454:
+
+/* Line 1806 of yacc.c  */
+#line 1695 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 452:
-
-/* Line 1806 of yacc.c  */
-#line 1686 "parser.yy"
-    { (yyval.in) = 0; }
-    break;
-
-  case 453:
-
-/* Line 1806 of yacc.c  */
-#line 1688 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in); }
-    break;
-
-  case 454:
-
-/* Line 1806 of yacc.c  */
-#line 1690 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in); }
-    break;
-
   case 455:
-
-/* Line 1806 of yacc.c  */
-#line 1694 "parser.yy"
-    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
-    break;
-
-  case 456:
-
-/* Line 1806 of yacc.c  */
-#line 1695 "parser.yy"
-    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
-    break;
-
-  case 457:
 
 /* Line 1806 of yacc.c  */
@@ -7378,197 +7457,201 @@
     break;
 
+  case 456:
+
+/* Line 1806 of yacc.c  */
+#line 1702 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in); }
+    break;
+
+  case 457:
+
+/* Line 1806 of yacc.c  */
+#line 1704 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in); }
+    break;
+
+  case 458:
+
+/* Line 1806 of yacc.c  */
+#line 1708 "parser.yy"
+    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
+    break;
+
   case 459:
 
 /* Line 1806 of yacc.c  */
-#line 1702 "parser.yy"
+#line 1709 "parser.yy"
+    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
+    break;
+
+  case 460:
+
+/* Line 1806 of yacc.c  */
+#line 1714 "parser.yy"
+    { (yyval.in) = 0; }
+    break;
+
+  case 462:
+
+/* Line 1806 of yacc.c  */
+#line 1716 "parser.yy"
     { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
     break;
 
-  case 460:
-
-/* Line 1806 of yacc.c  */
-#line 1703 "parser.yy"
+  case 463:
+
+/* Line 1806 of yacc.c  */
+#line 1717 "parser.yy"
     { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_link( (yyvsp[(3) - (3)].in) ) ); }
     break;
 
-  case 461:
-
-/* Line 1806 of yacc.c  */
-#line 1705 "parser.yy"
+  case 464:
+
+/* Line 1806 of yacc.c  */
+#line 1719 "parser.yy"
     { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_link( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); }
     break;
 
-  case 463:
-
-/* Line 1806 of yacc.c  */
-#line 1721 "parser.yy"
+  case 466:
+
+/* Line 1806 of yacc.c  */
+#line 1735 "parser.yy"
     { (yyval.en) = new VarRefNode( (yyvsp[(1) - (2)].tok) ); }
     break;
 
-  case 465:
-
-/* Line 1806 of yacc.c  */
-#line 1727 "parser.yy"
+  case 468:
+
+/* Line 1806 of yacc.c  */
+#line 1741 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_link( (yyvsp[(2) - (2)].en) )); }
     break;
 
-  case 466:
-
-/* Line 1806 of yacc.c  */
-#line 1735 "parser.yy"
+  case 469:
+
+/* Line 1806 of yacc.c  */
+#line 1749 "parser.yy"
     { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(1) - (1)].tok) ) ); }
     break;
 
-  case 467:
-
-/* Line 1806 of yacc.c  */
-#line 1737 "parser.yy"
+  case 470:
+
+/* Line 1806 of yacc.c  */
+#line 1751 "parser.yy"
     { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(2) - (2)].tok) ) ); }
     break;
 
-  case 468:
-
-/* Line 1806 of yacc.c  */
-#line 1740 "parser.yy"
+  case 471:
+
+/* Line 1806 of yacc.c  */
+#line 1754 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
     break;
 
-  case 469:
-
-/* Line 1806 of yacc.c  */
-#line 1742 "parser.yy"
+  case 472:
+
+/* Line 1806 of yacc.c  */
+#line 1756 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
     break;
 
-  case 470:
-
-/* Line 1806 of yacc.c  */
-#line 1744 "parser.yy"
+  case 473:
+
+/* Line 1806 of yacc.c  */
+#line 1758 "parser.yy"
     { (yyval.en) = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ), true ); }
     break;
 
-  case 471:
-
-/* Line 1806 of yacc.c  */
-#line 1746 "parser.yy"
+  case 474:
+
+/* Line 1806 of yacc.c  */
+#line 1760 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(4) - (6)].en) ); }
     break;
 
-  case 473:
-
-/* Line 1806 of yacc.c  */
-#line 1770 "parser.yy"
+  case 476:
+
+/* Line 1806 of yacc.c  */
+#line 1784 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 474:
-
-/* Line 1806 of yacc.c  */
-#line 1772 "parser.yy"
+  case 477:
+
+/* Line 1806 of yacc.c  */
+#line 1786 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 475:
-
-/* Line 1806 of yacc.c  */
-#line 1774 "parser.yy"
+  case 478:
+
+/* Line 1806 of yacc.c  */
+#line 1788 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 477:
-
-/* Line 1806 of yacc.c  */
-#line 1780 "parser.yy"
+  case 480:
+
+/* Line 1806 of yacc.c  */
+#line 1794 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 478:
-
-/* Line 1806 of yacc.c  */
-#line 1782 "parser.yy"
+  case 481:
+
+/* Line 1806 of yacc.c  */
+#line 1796 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 479:
-
-/* Line 1806 of yacc.c  */
-#line 1787 "parser.yy"
+  case 482:
+
+/* Line 1806 of yacc.c  */
+#line 1801 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
     break;
 
-  case 481:
-
-/* Line 1806 of yacc.c  */
-#line 1793 "parser.yy"
+  case 484:
+
+/* Line 1806 of yacc.c  */
+#line 1807 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
     break;
 
-  case 482:
-
-/* Line 1806 of yacc.c  */
-#line 1798 "parser.yy"
+  case 485:
+
+/* Line 1806 of yacc.c  */
+#line 1812 "parser.yy"
     { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
     break;
 
-  case 483:
-
-/* Line 1806 of yacc.c  */
-#line 1800 "parser.yy"
+  case 486:
+
+/* Line 1806 of yacc.c  */
+#line 1814 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 485:
-
-/* Line 1806 of yacc.c  */
-#line 1806 "parser.yy"
+  case 488:
+
+/* Line 1806 of yacc.c  */
+#line 1820 "parser.yy"
     { (yyval.tclass) = DeclarationNode::Type; }
     break;
 
-  case 486:
-
-/* Line 1806 of yacc.c  */
-#line 1808 "parser.yy"
+  case 489:
+
+/* Line 1806 of yacc.c  */
+#line 1822 "parser.yy"
     { (yyval.tclass) = DeclarationNode::Ftype; }
     break;
 
-  case 487:
-
-/* Line 1806 of yacc.c  */
-#line 1810 "parser.yy"
+  case 490:
+
+/* Line 1806 of yacc.c  */
+#line 1824 "parser.yy"
     { (yyval.tclass) = DeclarationNode::Dtype; }
     break;
 
-  case 488:
-
-/* Line 1806 of yacc.c  */
-#line 1815 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 489:
-
-/* Line 1806 of yacc.c  */
-#line 1817 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl) == 0 ? (yyvsp[(2) - (2)].decl) : (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 490:
-
-/* Line 1806 of yacc.c  */
-#line 1822 "parser.yy"
-    {
-			typedefTable.openContext( *(yyvsp[(2) - (5)].tok) );
-			(yyval.decl) = DeclarationNode::newContextUse( (yyvsp[(2) - (5)].tok), (yyvsp[(4) - (5)].en) );
-		}
-    break;
-
   case 491:
-
-/* Line 1806 of yacc.c  */
-#line 1827 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
-    break;
-
-  case 492:
 
 /* Line 1806 of yacc.c  */
@@ -7577,64 +7660,95 @@
     break;
 
+  case 492:
+
+/* Line 1806 of yacc.c  */
+#line 1831 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl) == 0 ? (yyvsp[(2) - (2)].decl) : (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 493:
 
 /* Line 1806 of yacc.c  */
-#line 1834 "parser.yy"
+#line 1836 "parser.yy"
+    {
+			typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) );
+			(yyval.decl) = DeclarationNode::newTraitUse( (yyvsp[(2) - (5)].tok), (yyvsp[(4) - (5)].en) );
+		}
+    break;
+
+  case 494:
+
+/* Line 1806 of yacc.c  */
+#line 1841 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
+    break;
+
+  case 495:
+
+/* Line 1806 of yacc.c  */
+#line 1843 "parser.yy"
+    { (yyval.decl) = 0; }
+    break;
+
+  case 496:
+
+/* Line 1806 of yacc.c  */
+#line 1848 "parser.yy"
     { (yyval.en) = new TypeValueNode( (yyvsp[(1) - (1)].decl) ); }
     break;
 
-  case 495:
-
-/* Line 1806 of yacc.c  */
-#line 1837 "parser.yy"
+  case 498:
+
+/* Line 1806 of yacc.c  */
+#line 1851 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( new TypeValueNode( (yyvsp[(3) - (3)].decl) ))); }
     break;
 
-  case 496:
-
-/* Line 1806 of yacc.c  */
-#line 1839 "parser.yy"
+  case 499:
+
+/* Line 1806 of yacc.c  */
+#line 1853 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
     break;
 
-  case 497:
-
-/* Line 1806 of yacc.c  */
-#line 1844 "parser.yy"
+  case 500:
+
+/* Line 1806 of yacc.c  */
+#line 1858 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
 
-  case 498:
-
-/* Line 1806 of yacc.c  */
-#line 1846 "parser.yy"
+  case 501:
+
+/* Line 1806 of yacc.c  */
+#line 1860 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
     break;
 
-  case 499:
-
-/* Line 1806 of yacc.c  */
-#line 1848 "parser.yy"
+  case 502:
+
+/* Line 1806 of yacc.c  */
+#line 1862 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 500:
-
-/* Line 1806 of yacc.c  */
-#line 1853 "parser.yy"
+  case 503:
+
+/* Line 1806 of yacc.c  */
+#line 1867 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 501:
-
-/* Line 1806 of yacc.c  */
-#line 1855 "parser.yy"
+  case 504:
+
+/* Line 1806 of yacc.c  */
+#line 1869 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 502:
-
-/* Line 1806 of yacc.c  */
-#line 1860 "parser.yy"
+  case 505:
+
+/* Line 1806 of yacc.c  */
+#line 1874 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD );
@@ -7643,8 +7757,8 @@
     break;
 
-  case 503:
-
-/* Line 1806 of yacc.c  */
-#line 1865 "parser.yy"
+  case 506:
+
+/* Line 1806 of yacc.c  */
+#line 1879 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG );
@@ -7653,46 +7767,46 @@
     break;
 
-  case 504:
-
-/* Line 1806 of yacc.c  */
-#line 1873 "parser.yy"
+  case 507:
+
+/* Line 1806 of yacc.c  */
+#line 1887 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID );
-			(yyval.decl) = DeclarationNode::newContext( (yyvsp[(2) - (9)].tok), (yyvsp[(5) - (9)].decl), 0 );
+			(yyval.decl) = DeclarationNode::newTrait( (yyvsp[(2) - (9)].tok), (yyvsp[(5) - (9)].decl), 0 );
 		}
     break;
 
-  case 505:
-
-/* Line 1806 of yacc.c  */
-#line 1878 "parser.yy"
+  case 508:
+
+/* Line 1806 of yacc.c  */
+#line 1892 "parser.yy"
     {
-			typedefTable.enterContext( *(yyvsp[(2) - (8)].tok) );
+			typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) );
 			typedefTable.enterScope();
 		}
     break;
 
-  case 506:
-
-/* Line 1806 of yacc.c  */
-#line 1883 "parser.yy"
+  case 509:
+
+/* Line 1806 of yacc.c  */
+#line 1897 "parser.yy"
     {
-			typedefTable.leaveContext();
+			typedefTable.leaveTrait();
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (11)].tok), TypedefTable::ID );
-			(yyval.decl) = DeclarationNode::newContext( (yyvsp[(2) - (11)].tok), (yyvsp[(5) - (11)].decl), (yyvsp[(10) - (11)].decl) );
+			(yyval.decl) = DeclarationNode::newTrait( (yyvsp[(2) - (11)].tok), (yyvsp[(5) - (11)].decl), (yyvsp[(10) - (11)].decl) );
 		}
     break;
 
-  case 508:
-
-/* Line 1806 of yacc.c  */
-#line 1893 "parser.yy"
+  case 511:
+
+/* Line 1806 of yacc.c  */
+#line 1907 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 511:
-
-/* Line 1806 of yacc.c  */
-#line 1903 "parser.yy"
+  case 514:
+
+/* Line 1806 of yacc.c  */
+#line 1917 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7701,8 +7815,8 @@
     break;
 
-  case 512:
-
-/* Line 1806 of yacc.c  */
-#line 1908 "parser.yy"
+  case 515:
+
+/* Line 1806 of yacc.c  */
+#line 1922 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7711,8 +7825,8 @@
     break;
 
-  case 513:
-
-/* Line 1806 of yacc.c  */
-#line 1913 "parser.yy"
+  case 516:
+
+/* Line 1806 of yacc.c  */
+#line 1927 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -7721,8 +7835,8 @@
     break;
 
-  case 514:
-
-/* Line 1806 of yacc.c  */
-#line 1921 "parser.yy"
+  case 517:
+
+/* Line 1806 of yacc.c  */
+#line 1935 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7731,8 +7845,8 @@
     break;
 
-  case 515:
-
-/* Line 1806 of yacc.c  */
-#line 1926 "parser.yy"
+  case 518:
+
+/* Line 1806 of yacc.c  */
+#line 1940 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7741,15 +7855,15 @@
     break;
 
-  case 516:
-
-/* Line 1806 of yacc.c  */
-#line 1936 "parser.yy"
+  case 519:
+
+/* Line 1806 of yacc.c  */
+#line 1950 "parser.yy"
     {}
     break;
 
-  case 517:
-
-/* Line 1806 of yacc.c  */
-#line 1938 "parser.yy"
+  case 520:
+
+/* Line 1806 of yacc.c  */
+#line 1952 "parser.yy"
     {
 			if ( theTree ) {
@@ -7761,29 +7875,29 @@
     break;
 
-  case 519:
-
-/* Line 1806 of yacc.c  */
-#line 1950 "parser.yy"
+  case 522:
+
+/* Line 1806 of yacc.c  */
+#line 1964 "parser.yy"
     { (yyval.decl) = ( (yyvsp[(1) - (3)].decl) != NULL ) ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
     break;
 
-  case 520:
-
-/* Line 1806 of yacc.c  */
-#line 1955 "parser.yy"
+  case 523:
+
+/* Line 1806 of yacc.c  */
+#line 1969 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 524:
-
-/* Line 1806 of yacc.c  */
-#line 1963 "parser.yy"
+  case 527:
+
+/* Line 1806 of yacc.c  */
+#line 1977 "parser.yy"
     {}
     break;
 
-  case 525:
-
-/* Line 1806 of yacc.c  */
-#line 1965 "parser.yy"
+  case 528:
+
+/* Line 1806 of yacc.c  */
+#line 1979 "parser.yy"
     {
 			linkageStack.push( linkage );
@@ -7792,8 +7906,8 @@
     break;
 
-  case 526:
-
-/* Line 1806 of yacc.c  */
-#line 1970 "parser.yy"
+  case 529:
+
+/* Line 1806 of yacc.c  */
+#line 1984 "parser.yy"
     {
 			linkage = linkageStack.top();
@@ -7803,15 +7917,15 @@
     break;
 
-  case 527:
-
-/* Line 1806 of yacc.c  */
-#line 1976 "parser.yy"
+  case 530:
+
+/* Line 1806 of yacc.c  */
+#line 1990 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
 
-  case 529:
-
-/* Line 1806 of yacc.c  */
-#line 1986 "parser.yy"
+  case 532:
+
+/* Line 1806 of yacc.c  */
+#line 2000 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7821,8 +7935,8 @@
     break;
 
-  case 530:
-
-/* Line 1806 of yacc.c  */
-#line 1992 "parser.yy"
+  case 533:
+
+/* Line 1806 of yacc.c  */
+#line 2006 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7832,8 +7946,8 @@
     break;
 
-  case 531:
-
-/* Line 1806 of yacc.c  */
-#line 2001 "parser.yy"
+  case 534:
+
+/* Line 1806 of yacc.c  */
+#line 2015 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7843,8 +7957,8 @@
     break;
 
-  case 532:
-
-/* Line 1806 of yacc.c  */
-#line 2007 "parser.yy"
+  case 535:
+
+/* Line 1806 of yacc.c  */
+#line 2021 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7854,8 +7968,8 @@
     break;
 
-  case 533:
-
-/* Line 1806 of yacc.c  */
-#line 2013 "parser.yy"
+  case 536:
+
+/* Line 1806 of yacc.c  */
+#line 2027 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7865,8 +7979,8 @@
     break;
 
-  case 534:
-
-/* Line 1806 of yacc.c  */
-#line 2019 "parser.yy"
+  case 537:
+
+/* Line 1806 of yacc.c  */
+#line 2033 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7876,8 +7990,8 @@
     break;
 
-  case 535:
-
-/* Line 1806 of yacc.c  */
-#line 2025 "parser.yy"
+  case 538:
+
+/* Line 1806 of yacc.c  */
+#line 2039 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7887,8 +8001,8 @@
     break;
 
-  case 536:
-
-/* Line 1806 of yacc.c  */
-#line 2033 "parser.yy"
+  case 539:
+
+/* Line 1806 of yacc.c  */
+#line 2047 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7898,8 +8012,8 @@
     break;
 
-  case 537:
-
-/* Line 1806 of yacc.c  */
-#line 2039 "parser.yy"
+  case 540:
+
+/* Line 1806 of yacc.c  */
+#line 2053 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7909,8 +8023,8 @@
     break;
 
-  case 538:
-
-/* Line 1806 of yacc.c  */
-#line 2047 "parser.yy"
+  case 541:
+
+/* Line 1806 of yacc.c  */
+#line 2061 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7920,8 +8034,8 @@
     break;
 
-  case 539:
-
-/* Line 1806 of yacc.c  */
-#line 2053 "parser.yy"
+  case 542:
+
+/* Line 1806 of yacc.c  */
+#line 2067 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7931,85 +8045,85 @@
     break;
 
-  case 543:
-
-/* Line 1806 of yacc.c  */
-#line 2068 "parser.yy"
+  case 546:
+
+/* Line 1806 of yacc.c  */
+#line 2082 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
 
-  case 546:
-
-/* Line 1806 of yacc.c  */
-#line 2078 "parser.yy"
+  case 549:
+
+/* Line 1806 of yacc.c  */
+#line 2092 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 549:
-
-/* Line 1806 of yacc.c  */
-#line 2085 "parser.yy"
+  case 552:
+
+/* Line 1806 of yacc.c  */
+#line 2099 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 550:
-
-/* Line 1806 of yacc.c  */
-#line 2091 "parser.yy"
+  case 553:
+
+/* Line 1806 of yacc.c  */
+#line 2105 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 556:
-
-/* Line 1806 of yacc.c  */
-#line 2106 "parser.yy"
+  case 559:
+
+/* Line 1806 of yacc.c  */
+#line 2120 "parser.yy"
     {}
     break;
 
-  case 557:
-
-/* Line 1806 of yacc.c  */
-#line 2107 "parser.yy"
+  case 560:
+
+/* Line 1806 of yacc.c  */
+#line 2121 "parser.yy"
     {}
     break;
 
-  case 558:
-
-/* Line 1806 of yacc.c  */
-#line 2108 "parser.yy"
+  case 561:
+
+/* Line 1806 of yacc.c  */
+#line 2122 "parser.yy"
     {}
     break;
 
-  case 559:
-
-/* Line 1806 of yacc.c  */
-#line 2109 "parser.yy"
+  case 562:
+
+/* Line 1806 of yacc.c  */
+#line 2123 "parser.yy"
     {}
     break;
 
-  case 560:
-
-/* Line 1806 of yacc.c  */
-#line 2144 "parser.yy"
+  case 563:
+
+/* Line 1806 of yacc.c  */
+#line 2158 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 562:
-
-/* Line 1806 of yacc.c  */
-#line 2147 "parser.yy"
+  case 565:
+
+/* Line 1806 of yacc.c  */
+#line 2161 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 563:
-
-/* Line 1806 of yacc.c  */
-#line 2149 "parser.yy"
+  case 566:
+
+/* Line 1806 of yacc.c  */
+#line 2163 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 564:
-
-/* Line 1806 of yacc.c  */
-#line 2154 "parser.yy"
+  case 567:
+
+/* Line 1806 of yacc.c  */
+#line 2168 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8018,428 +8132,428 @@
     break;
 
-  case 565:
-
-/* Line 1806 of yacc.c  */
-#line 2159 "parser.yy"
+  case 568:
+
+/* Line 1806 of yacc.c  */
+#line 2173 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 566:
-
-/* Line 1806 of yacc.c  */
-#line 2164 "parser.yy"
+  case 569:
+
+/* Line 1806 of yacc.c  */
+#line 2178 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 567:
-
-/* Line 1806 of yacc.c  */
-#line 2166 "parser.yy"
+  case 570:
+
+/* Line 1806 of yacc.c  */
+#line 2180 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 568:
-
-/* Line 1806 of yacc.c  */
-#line 2168 "parser.yy"
+  case 571:
+
+/* Line 1806 of yacc.c  */
+#line 2182 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 569:
-
-/* Line 1806 of yacc.c  */
-#line 2173 "parser.yy"
+  case 572:
+
+/* Line 1806 of yacc.c  */
+#line 2187 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 570:
-
-/* Line 1806 of yacc.c  */
-#line 2175 "parser.yy"
+  case 573:
+
+/* Line 1806 of yacc.c  */
+#line 2189 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 571:
-
-/* Line 1806 of yacc.c  */
-#line 2177 "parser.yy"
+  case 574:
+
+/* Line 1806 of yacc.c  */
+#line 2191 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 572:
-
-/* Line 1806 of yacc.c  */
-#line 2179 "parser.yy"
+  case 575:
+
+/* Line 1806 of yacc.c  */
+#line 2193 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 573:
-
-/* Line 1806 of yacc.c  */
-#line 2184 "parser.yy"
+  case 576:
+
+/* Line 1806 of yacc.c  */
+#line 2198 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 574:
-
-/* Line 1806 of yacc.c  */
-#line 2186 "parser.yy"
+  case 577:
+
+/* Line 1806 of yacc.c  */
+#line 2200 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 575:
-
-/* Line 1806 of yacc.c  */
-#line 2196 "parser.yy"
+  case 578:
+
+/* Line 1806 of yacc.c  */
+#line 2210 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 577:
-
-/* Line 1806 of yacc.c  */
-#line 2199 "parser.yy"
+  case 580:
+
+/* Line 1806 of yacc.c  */
+#line 2213 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 578:
-
-/* Line 1806 of yacc.c  */
-#line 2204 "parser.yy"
+  case 581:
+
+/* Line 1806 of yacc.c  */
+#line 2218 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
 
-  case 579:
-
-/* Line 1806 of yacc.c  */
-#line 2206 "parser.yy"
+  case 582:
+
+/* Line 1806 of yacc.c  */
+#line 2220 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 580:
-
-/* Line 1806 of yacc.c  */
-#line 2208 "parser.yy"
+  case 583:
+
+/* Line 1806 of yacc.c  */
+#line 2222 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 581:
-
-/* Line 1806 of yacc.c  */
-#line 2213 "parser.yy"
+  case 584:
+
+/* Line 1806 of yacc.c  */
+#line 2227 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 582:
-
-/* Line 1806 of yacc.c  */
-#line 2215 "parser.yy"
+  case 585:
+
+/* Line 1806 of yacc.c  */
+#line 2229 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 583:
-
-/* Line 1806 of yacc.c  */
-#line 2217 "parser.yy"
+  case 586:
+
+/* Line 1806 of yacc.c  */
+#line 2231 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 584:
-
-/* Line 1806 of yacc.c  */
-#line 2222 "parser.yy"
+  case 587:
+
+/* Line 1806 of yacc.c  */
+#line 2236 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 585:
-
-/* Line 1806 of yacc.c  */
-#line 2224 "parser.yy"
+  case 588:
+
+/* Line 1806 of yacc.c  */
+#line 2238 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 586:
-
-/* Line 1806 of yacc.c  */
-#line 2226 "parser.yy"
+  case 589:
+
+/* Line 1806 of yacc.c  */
+#line 2240 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 590:
-
-/* Line 1806 of yacc.c  */
-#line 2241 "parser.yy"
+  case 593:
+
+/* Line 1806 of yacc.c  */
+#line 2255 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
     break;
 
-  case 591:
-
-/* Line 1806 of yacc.c  */
-#line 2243 "parser.yy"
+  case 594:
+
+/* Line 1806 of yacc.c  */
+#line 2257 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
     break;
 
-  case 592:
-
-/* Line 1806 of yacc.c  */
-#line 2245 "parser.yy"
+  case 595:
+
+/* Line 1806 of yacc.c  */
+#line 2259 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 593:
-
-/* Line 1806 of yacc.c  */
-#line 2250 "parser.yy"
+  case 596:
+
+/* Line 1806 of yacc.c  */
+#line 2264 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 594:
-
-/* Line 1806 of yacc.c  */
-#line 2252 "parser.yy"
+  case 597:
+
+/* Line 1806 of yacc.c  */
+#line 2266 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 595:
-
-/* Line 1806 of yacc.c  */
-#line 2254 "parser.yy"
+  case 598:
+
+/* Line 1806 of yacc.c  */
+#line 2268 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 596:
-
-/* Line 1806 of yacc.c  */
-#line 2259 "parser.yy"
+  case 599:
+
+/* Line 1806 of yacc.c  */
+#line 2273 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 597:
-
-/* Line 1806 of yacc.c  */
-#line 2261 "parser.yy"
+  case 600:
+
+/* Line 1806 of yacc.c  */
+#line 2275 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 598:
-
-/* Line 1806 of yacc.c  */
-#line 2263 "parser.yy"
+  case 601:
+
+/* Line 1806 of yacc.c  */
+#line 2277 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 599:
-
-/* Line 1806 of yacc.c  */
-#line 2278 "parser.yy"
+  case 602:
+
+/* Line 1806 of yacc.c  */
+#line 2292 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 601:
-
-/* Line 1806 of yacc.c  */
-#line 2281 "parser.yy"
+  case 604:
+
+/* Line 1806 of yacc.c  */
+#line 2295 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 602:
-
-/* Line 1806 of yacc.c  */
-#line 2283 "parser.yy"
+  case 605:
+
+/* Line 1806 of yacc.c  */
+#line 2297 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 604:
-
-/* Line 1806 of yacc.c  */
-#line 2289 "parser.yy"
+  case 607:
+
+/* Line 1806 of yacc.c  */
+#line 2303 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 605:
-
-/* Line 1806 of yacc.c  */
-#line 2294 "parser.yy"
+  case 608:
+
+/* Line 1806 of yacc.c  */
+#line 2308 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 606:
-
-/* Line 1806 of yacc.c  */
-#line 2296 "parser.yy"
+  case 609:
+
+/* Line 1806 of yacc.c  */
+#line 2310 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 607:
-
-/* Line 1806 of yacc.c  */
-#line 2298 "parser.yy"
+  case 610:
+
+/* Line 1806 of yacc.c  */
+#line 2312 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 608:
-
-/* Line 1806 of yacc.c  */
-#line 2303 "parser.yy"
+  case 611:
+
+/* Line 1806 of yacc.c  */
+#line 2317 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 609:
-
-/* Line 1806 of yacc.c  */
-#line 2305 "parser.yy"
+  case 612:
+
+/* Line 1806 of yacc.c  */
+#line 2319 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 610:
-
-/* Line 1806 of yacc.c  */
-#line 2307 "parser.yy"
+  case 613:
+
+/* Line 1806 of yacc.c  */
+#line 2321 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 611:
-
-/* Line 1806 of yacc.c  */
-#line 2309 "parser.yy"
+  case 614:
+
+/* Line 1806 of yacc.c  */
+#line 2323 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 612:
-
-/* Line 1806 of yacc.c  */
-#line 2314 "parser.yy"
+  case 615:
+
+/* Line 1806 of yacc.c  */
+#line 2328 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
 
-  case 613:
-
-/* Line 1806 of yacc.c  */
-#line 2316 "parser.yy"
+  case 616:
+
+/* Line 1806 of yacc.c  */
+#line 2330 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 614:
-
-/* Line 1806 of yacc.c  */
-#line 2318 "parser.yy"
+  case 617:
+
+/* Line 1806 of yacc.c  */
+#line 2332 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 615:
-
-/* Line 1806 of yacc.c  */
-#line 2328 "parser.yy"
+  case 618:
+
+/* Line 1806 of yacc.c  */
+#line 2342 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 617:
-
-/* Line 1806 of yacc.c  */
-#line 2331 "parser.yy"
+  case 620:
+
+/* Line 1806 of yacc.c  */
+#line 2345 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 618:
-
-/* Line 1806 of yacc.c  */
-#line 2333 "parser.yy"
+  case 621:
+
+/* Line 1806 of yacc.c  */
+#line 2347 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 619:
-
-/* Line 1806 of yacc.c  */
-#line 2338 "parser.yy"
+  case 622:
+
+/* Line 1806 of yacc.c  */
+#line 2352 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 620:
-
-/* Line 1806 of yacc.c  */
-#line 2340 "parser.yy"
+  case 623:
+
+/* Line 1806 of yacc.c  */
+#line 2354 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 621:
-
-/* Line 1806 of yacc.c  */
-#line 2342 "parser.yy"
+  case 624:
+
+/* Line 1806 of yacc.c  */
+#line 2356 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 622:
-
-/* Line 1806 of yacc.c  */
-#line 2347 "parser.yy"
+  case 625:
+
+/* Line 1806 of yacc.c  */
+#line 2361 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 623:
-
-/* Line 1806 of yacc.c  */
-#line 2349 "parser.yy"
+  case 626:
+
+/* Line 1806 of yacc.c  */
+#line 2363 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 624:
-
-/* Line 1806 of yacc.c  */
-#line 2351 "parser.yy"
+  case 627:
+
+/* Line 1806 of yacc.c  */
+#line 2365 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 625:
-
-/* Line 1806 of yacc.c  */
-#line 2353 "parser.yy"
+  case 628:
+
+/* Line 1806 of yacc.c  */
+#line 2367 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 626:
-
-/* Line 1806 of yacc.c  */
-#line 2358 "parser.yy"
+  case 629:
+
+/* Line 1806 of yacc.c  */
+#line 2372 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
 
-  case 627:
-
-/* Line 1806 of yacc.c  */
-#line 2360 "parser.yy"
+  case 630:
+
+/* Line 1806 of yacc.c  */
+#line 2374 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 628:
-
-/* Line 1806 of yacc.c  */
-#line 2362 "parser.yy"
+  case 631:
+
+/* Line 1806 of yacc.c  */
+#line 2376 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 629:
-
-/* Line 1806 of yacc.c  */
-#line 2393 "parser.yy"
+  case 632:
+
+/* Line 1806 of yacc.c  */
+#line 2407 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 631:
-
-/* Line 1806 of yacc.c  */
-#line 2396 "parser.yy"
+  case 634:
+
+/* Line 1806 of yacc.c  */
+#line 2410 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 632:
-
-/* Line 1806 of yacc.c  */
-#line 2398 "parser.yy"
+  case 635:
+
+/* Line 1806 of yacc.c  */
+#line 2412 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 633:
-
-/* Line 1806 of yacc.c  */
-#line 2403 "parser.yy"
+  case 636:
+
+/* Line 1806 of yacc.c  */
+#line 2417 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8448,8 +8562,8 @@
     break;
 
-  case 634:
-
-/* Line 1806 of yacc.c  */
-#line 2408 "parser.yy"
+  case 637:
+
+/* Line 1806 of yacc.c  */
+#line 2422 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8458,687 +8572,687 @@
     break;
 
-  case 635:
-
-/* Line 1806 of yacc.c  */
-#line 2416 "parser.yy"
+  case 638:
+
+/* Line 1806 of yacc.c  */
+#line 2430 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 636:
-
-/* Line 1806 of yacc.c  */
-#line 2418 "parser.yy"
+  case 639:
+
+/* Line 1806 of yacc.c  */
+#line 2432 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 637:
-
-/* Line 1806 of yacc.c  */
-#line 2420 "parser.yy"
+  case 640:
+
+/* Line 1806 of yacc.c  */
+#line 2434 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 638:
-
-/* Line 1806 of yacc.c  */
-#line 2425 "parser.yy"
+  case 641:
+
+/* Line 1806 of yacc.c  */
+#line 2439 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 639:
-
-/* Line 1806 of yacc.c  */
-#line 2427 "parser.yy"
+  case 642:
+
+/* Line 1806 of yacc.c  */
+#line 2441 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 640:
-
-/* Line 1806 of yacc.c  */
-#line 2432 "parser.yy"
+  case 643:
+
+/* Line 1806 of yacc.c  */
+#line 2446 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
 
-  case 641:
-
-/* Line 1806 of yacc.c  */
-#line 2434 "parser.yy"
+  case 644:
+
+/* Line 1806 of yacc.c  */
+#line 2448 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 643:
-
-/* Line 1806 of yacc.c  */
-#line 2449 "parser.yy"
+  case 646:
+
+/* Line 1806 of yacc.c  */
+#line 2463 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 644:
-
-/* Line 1806 of yacc.c  */
-#line 2451 "parser.yy"
+  case 647:
+
+/* Line 1806 of yacc.c  */
+#line 2465 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 645:
-
-/* Line 1806 of yacc.c  */
-#line 2456 "parser.yy"
+  case 648:
+
+/* Line 1806 of yacc.c  */
+#line 2470 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
     break;
 
-  case 646:
-
-/* Line 1806 of yacc.c  */
-#line 2458 "parser.yy"
+  case 649:
+
+/* Line 1806 of yacc.c  */
+#line 2472 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 647:
-
-/* Line 1806 of yacc.c  */
-#line 2460 "parser.yy"
+  case 650:
+
+/* Line 1806 of yacc.c  */
+#line 2474 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 648:
-
-/* Line 1806 of yacc.c  */
-#line 2462 "parser.yy"
+  case 651:
+
+/* Line 1806 of yacc.c  */
+#line 2476 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 649:
-
-/* Line 1806 of yacc.c  */
-#line 2464 "parser.yy"
+  case 652:
+
+/* Line 1806 of yacc.c  */
+#line 2478 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 651:
-
-/* Line 1806 of yacc.c  */
-#line 2470 "parser.yy"
+  case 654:
+
+/* Line 1806 of yacc.c  */
+#line 2484 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 652:
-
-/* Line 1806 of yacc.c  */
-#line 2472 "parser.yy"
+  case 655:
+
+/* Line 1806 of yacc.c  */
+#line 2486 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 653:
-
-/* Line 1806 of yacc.c  */
-#line 2474 "parser.yy"
+  case 656:
+
+/* Line 1806 of yacc.c  */
+#line 2488 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 654:
-
-/* Line 1806 of yacc.c  */
-#line 2479 "parser.yy"
+  case 657:
+
+/* Line 1806 of yacc.c  */
+#line 2493 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
     break;
 
-  case 655:
-
-/* Line 1806 of yacc.c  */
-#line 2481 "parser.yy"
+  case 658:
+
+/* Line 1806 of yacc.c  */
+#line 2495 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 656:
-
-/* Line 1806 of yacc.c  */
-#line 2483 "parser.yy"
+  case 659:
+
+/* Line 1806 of yacc.c  */
+#line 2497 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 657:
-
-/* Line 1806 of yacc.c  */
-#line 2489 "parser.yy"
+  case 660:
+
+/* Line 1806 of yacc.c  */
+#line 2503 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
     break;
 
-  case 658:
-
-/* Line 1806 of yacc.c  */
-#line 2491 "parser.yy"
+  case 661:
+
+/* Line 1806 of yacc.c  */
+#line 2505 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 660:
-
-/* Line 1806 of yacc.c  */
-#line 2497 "parser.yy"
+  case 663:
+
+/* Line 1806 of yacc.c  */
+#line 2511 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
     break;
 
-  case 661:
-
-/* Line 1806 of yacc.c  */
-#line 2499 "parser.yy"
+  case 664:
+
+/* Line 1806 of yacc.c  */
+#line 2513 "parser.yy"
     { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
     break;
 
-  case 662:
-
-/* Line 1806 of yacc.c  */
-#line 2501 "parser.yy"
+  case 665:
+
+/* Line 1806 of yacc.c  */
+#line 2515 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
     break;
 
-  case 663:
-
-/* Line 1806 of yacc.c  */
-#line 2503 "parser.yy"
+  case 666:
+
+/* Line 1806 of yacc.c  */
+#line 2517 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
     break;
 
-  case 665:
-
-/* Line 1806 of yacc.c  */
-#line 2518 "parser.yy"
+  case 668:
+
+/* Line 1806 of yacc.c  */
+#line 2532 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 666:
-
-/* Line 1806 of yacc.c  */
-#line 2520 "parser.yy"
+  case 669:
+
+/* Line 1806 of yacc.c  */
+#line 2534 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 667:
-
-/* Line 1806 of yacc.c  */
-#line 2525 "parser.yy"
+  case 670:
+
+/* Line 1806 of yacc.c  */
+#line 2539 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
     break;
 
-  case 668:
-
-/* Line 1806 of yacc.c  */
-#line 2527 "parser.yy"
+  case 671:
+
+/* Line 1806 of yacc.c  */
+#line 2541 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 669:
-
-/* Line 1806 of yacc.c  */
-#line 2529 "parser.yy"
+  case 672:
+
+/* Line 1806 of yacc.c  */
+#line 2543 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 670:
-
-/* Line 1806 of yacc.c  */
-#line 2531 "parser.yy"
+  case 673:
+
+/* Line 1806 of yacc.c  */
+#line 2545 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 671:
-
-/* Line 1806 of yacc.c  */
-#line 2533 "parser.yy"
+  case 674:
+
+/* Line 1806 of yacc.c  */
+#line 2547 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 673:
-
-/* Line 1806 of yacc.c  */
-#line 2539 "parser.yy"
+  case 676:
+
+/* Line 1806 of yacc.c  */
+#line 2553 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 674:
-
-/* Line 1806 of yacc.c  */
-#line 2541 "parser.yy"
+  case 677:
+
+/* Line 1806 of yacc.c  */
+#line 2555 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 675:
-
-/* Line 1806 of yacc.c  */
-#line 2543 "parser.yy"
+  case 678:
+
+/* Line 1806 of yacc.c  */
+#line 2557 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 676:
-
-/* Line 1806 of yacc.c  */
-#line 2548 "parser.yy"
+  case 679:
+
+/* Line 1806 of yacc.c  */
+#line 2562 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
     break;
 
-  case 677:
-
-/* Line 1806 of yacc.c  */
-#line 2550 "parser.yy"
+  case 680:
+
+/* Line 1806 of yacc.c  */
+#line 2564 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 678:
-
-/* Line 1806 of yacc.c  */
-#line 2552 "parser.yy"
+  case 681:
+
+/* Line 1806 of yacc.c  */
+#line 2566 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 680:
-
-/* Line 1806 of yacc.c  */
-#line 2559 "parser.yy"
+  case 683:
+
+/* Line 1806 of yacc.c  */
+#line 2573 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 682:
-
-/* Line 1806 of yacc.c  */
-#line 2570 "parser.yy"
+  case 685:
+
+/* Line 1806 of yacc.c  */
+#line 2584 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
     break;
 
-  case 683:
-
-/* Line 1806 of yacc.c  */
-#line 2573 "parser.yy"
+  case 686:
+
+/* Line 1806 of yacc.c  */
+#line 2587 "parser.yy"
     { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
     break;
 
-  case 684:
-
-/* Line 1806 of yacc.c  */
-#line 2575 "parser.yy"
+  case 687:
+
+/* Line 1806 of yacc.c  */
+#line 2589 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
     break;
 
-  case 685:
-
-/* Line 1806 of yacc.c  */
-#line 2578 "parser.yy"
+  case 688:
+
+/* Line 1806 of yacc.c  */
+#line 2592 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
     break;
 
-  case 686:
-
-/* Line 1806 of yacc.c  */
-#line 2580 "parser.yy"
+  case 689:
+
+/* Line 1806 of yacc.c  */
+#line 2594 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
     break;
 
-  case 687:
-
-/* Line 1806 of yacc.c  */
-#line 2582 "parser.yy"
+  case 690:
+
+/* Line 1806 of yacc.c  */
+#line 2596 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
     break;
 
-  case 689:
-
-/* Line 1806 of yacc.c  */
-#line 2596 "parser.yy"
+  case 692:
+
+/* Line 1806 of yacc.c  */
+#line 2610 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 690:
-
-/* Line 1806 of yacc.c  */
-#line 2598 "parser.yy"
+  case 693:
+
+/* Line 1806 of yacc.c  */
+#line 2612 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 691:
-
-/* Line 1806 of yacc.c  */
-#line 2603 "parser.yy"
+  case 694:
+
+/* Line 1806 of yacc.c  */
+#line 2617 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
     break;
 
-  case 692:
-
-/* Line 1806 of yacc.c  */
-#line 2605 "parser.yy"
+  case 695:
+
+/* Line 1806 of yacc.c  */
+#line 2619 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 693:
-
-/* Line 1806 of yacc.c  */
-#line 2607 "parser.yy"
+  case 696:
+
+/* Line 1806 of yacc.c  */
+#line 2621 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 694:
-
-/* Line 1806 of yacc.c  */
-#line 2609 "parser.yy"
+  case 697:
+
+/* Line 1806 of yacc.c  */
+#line 2623 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 695:
-
-/* Line 1806 of yacc.c  */
-#line 2611 "parser.yy"
+  case 698:
+
+/* Line 1806 of yacc.c  */
+#line 2625 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 697:
-
-/* Line 1806 of yacc.c  */
-#line 2617 "parser.yy"
+  case 700:
+
+/* Line 1806 of yacc.c  */
+#line 2631 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 698:
-
-/* Line 1806 of yacc.c  */
-#line 2619 "parser.yy"
+  case 701:
+
+/* Line 1806 of yacc.c  */
+#line 2633 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 699:
-
-/* Line 1806 of yacc.c  */
-#line 2621 "parser.yy"
+  case 702:
+
+/* Line 1806 of yacc.c  */
+#line 2635 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 700:
-
-/* Line 1806 of yacc.c  */
-#line 2626 "parser.yy"
+  case 703:
+
+/* Line 1806 of yacc.c  */
+#line 2640 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 701:
-
-/* Line 1806 of yacc.c  */
-#line 2628 "parser.yy"
+  case 704:
+
+/* Line 1806 of yacc.c  */
+#line 2642 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 704:
-
-/* Line 1806 of yacc.c  */
-#line 2638 "parser.yy"
+  case 707:
+
+/* Line 1806 of yacc.c  */
+#line 2652 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 707:
-
-/* Line 1806 of yacc.c  */
-#line 2648 "parser.yy"
+  case 710:
+
+/* Line 1806 of yacc.c  */
+#line 2662 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 708:
-
-/* Line 1806 of yacc.c  */
-#line 2650 "parser.yy"
+  case 711:
+
+/* Line 1806 of yacc.c  */
+#line 2664 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 709:
-
-/* Line 1806 of yacc.c  */
-#line 2652 "parser.yy"
+  case 712:
+
+/* Line 1806 of yacc.c  */
+#line 2666 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 710:
-
-/* Line 1806 of yacc.c  */
-#line 2654 "parser.yy"
+  case 713:
+
+/* Line 1806 of yacc.c  */
+#line 2668 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 711:
-
-/* Line 1806 of yacc.c  */
-#line 2656 "parser.yy"
+  case 714:
+
+/* Line 1806 of yacc.c  */
+#line 2670 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 712:
-
-/* Line 1806 of yacc.c  */
-#line 2658 "parser.yy"
+  case 715:
+
+/* Line 1806 of yacc.c  */
+#line 2672 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 713:
-
-/* Line 1806 of yacc.c  */
-#line 2665 "parser.yy"
+  case 716:
+
+/* Line 1806 of yacc.c  */
+#line 2679 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 714:
-
-/* Line 1806 of yacc.c  */
-#line 2667 "parser.yy"
+  case 717:
+
+/* Line 1806 of yacc.c  */
+#line 2681 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 715:
-
-/* Line 1806 of yacc.c  */
-#line 2669 "parser.yy"
+  case 718:
+
+/* Line 1806 of yacc.c  */
+#line 2683 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 716:
-
-/* Line 1806 of yacc.c  */
-#line 2671 "parser.yy"
+  case 719:
+
+/* Line 1806 of yacc.c  */
+#line 2685 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
     break;
 
-  case 717:
-
-/* Line 1806 of yacc.c  */
-#line 2673 "parser.yy"
+  case 720:
+
+/* Line 1806 of yacc.c  */
+#line 2687 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 718:
-
-/* Line 1806 of yacc.c  */
-#line 2675 "parser.yy"
+  case 721:
+
+/* Line 1806 of yacc.c  */
+#line 2689 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 719:
-
-/* Line 1806 of yacc.c  */
-#line 2677 "parser.yy"
+  case 722:
+
+/* Line 1806 of yacc.c  */
+#line 2691 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 720:
-
-/* Line 1806 of yacc.c  */
-#line 2679 "parser.yy"
+  case 723:
+
+/* Line 1806 of yacc.c  */
+#line 2693 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 721:
-
-/* Line 1806 of yacc.c  */
-#line 2681 "parser.yy"
+  case 724:
+
+/* Line 1806 of yacc.c  */
+#line 2695 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
     break;
 
-  case 722:
-
-/* Line 1806 of yacc.c  */
-#line 2683 "parser.yy"
+  case 725:
+
+/* Line 1806 of yacc.c  */
+#line 2697 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 723:
-
-/* Line 1806 of yacc.c  */
-#line 2688 "parser.yy"
+  case 726:
+
+/* Line 1806 of yacc.c  */
+#line 2702 "parser.yy"
     { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
     break;
 
-  case 724:
-
-/* Line 1806 of yacc.c  */
-#line 2690 "parser.yy"
+  case 727:
+
+/* Line 1806 of yacc.c  */
+#line 2704 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
     break;
 
-  case 725:
-
-/* Line 1806 of yacc.c  */
-#line 2695 "parser.yy"
+  case 728:
+
+/* Line 1806 of yacc.c  */
+#line 2709 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
     break;
 
-  case 726:
-
-/* Line 1806 of yacc.c  */
-#line 2697 "parser.yy"
+  case 729:
+
+/* Line 1806 of yacc.c  */
+#line 2711 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); }
     break;
 
-  case 728:
-
-/* Line 1806 of yacc.c  */
-#line 2724 "parser.yy"
+  case 731:
+
+/* Line 1806 of yacc.c  */
+#line 2738 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 732:
-
-/* Line 1806 of yacc.c  */
-#line 2735 "parser.yy"
+  case 735:
+
+/* Line 1806 of yacc.c  */
+#line 2749 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 733:
-
-/* Line 1806 of yacc.c  */
-#line 2737 "parser.yy"
+  case 736:
+
+/* Line 1806 of yacc.c  */
+#line 2751 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 734:
-
-/* Line 1806 of yacc.c  */
-#line 2739 "parser.yy"
+  case 737:
+
+/* Line 1806 of yacc.c  */
+#line 2753 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 735:
-
-/* Line 1806 of yacc.c  */
-#line 2741 "parser.yy"
+  case 738:
+
+/* Line 1806 of yacc.c  */
+#line 2755 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 736:
-
-/* Line 1806 of yacc.c  */
-#line 2743 "parser.yy"
+  case 739:
+
+/* Line 1806 of yacc.c  */
+#line 2757 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 737:
-
-/* Line 1806 of yacc.c  */
-#line 2745 "parser.yy"
+  case 740:
+
+/* Line 1806 of yacc.c  */
+#line 2759 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
-  case 738:
-
-/* Line 1806 of yacc.c  */
-#line 2752 "parser.yy"
+  case 741:
+
+/* Line 1806 of yacc.c  */
+#line 2766 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 739:
-
-/* Line 1806 of yacc.c  */
-#line 2754 "parser.yy"
+  case 742:
+
+/* Line 1806 of yacc.c  */
+#line 2768 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 740:
-
-/* Line 1806 of yacc.c  */
-#line 2756 "parser.yy"
+  case 743:
+
+/* Line 1806 of yacc.c  */
+#line 2770 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 741:
-
-/* Line 1806 of yacc.c  */
-#line 2758 "parser.yy"
+  case 744:
+
+/* Line 1806 of yacc.c  */
+#line 2772 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 742:
-
-/* Line 1806 of yacc.c  */
-#line 2760 "parser.yy"
+  case 745:
+
+/* Line 1806 of yacc.c  */
+#line 2774 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 743:
-
-/* Line 1806 of yacc.c  */
-#line 2762 "parser.yy"
+  case 746:
+
+/* Line 1806 of yacc.c  */
+#line 2776 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 744:
-
-/* Line 1806 of yacc.c  */
-#line 2767 "parser.yy"
+  case 747:
+
+/* Line 1806 of yacc.c  */
+#line 2781 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
 
-  case 745:
-
-/* Line 1806 of yacc.c  */
-#line 2772 "parser.yy"
+  case 748:
+
+/* Line 1806 of yacc.c  */
+#line 2786 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
     break;
 
-  case 746:
-
-/* Line 1806 of yacc.c  */
-#line 2774 "parser.yy"
+  case 749:
+
+/* Line 1806 of yacc.c  */
+#line 2788 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
 
-  case 747:
-
-/* Line 1806 of yacc.c  */
-#line 2776 "parser.yy"
+  case 750:
+
+/* Line 1806 of yacc.c  */
+#line 2790 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
 
-  case 750:
-
-/* Line 1806 of yacc.c  */
-#line 2800 "parser.yy"
+  case 753:
+
+/* Line 1806 of yacc.c  */
+#line 2814 "parser.yy"
     { (yyval.en) = 0; }
     break;
 
-  case 751:
-
-/* Line 1806 of yacc.c  */
-#line 2802 "parser.yy"
+  case 754:
+
+/* Line 1806 of yacc.c  */
+#line 2816 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -9147,5 +9261,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 9150 "Parser/parser.cc"
+#line 9264 "Parser/parser.cc"
       default: break;
     }
@@ -9378,5 +9492,5 @@
 
 /* Line 2067 of yacc.c  */
-#line 2805 "parser.yy"
+#line 2819 "parser.yy"
 
 // ----end of grammar----
@@ -9385,5 +9499,5 @@
 	std::cout << "Error ";
 	if ( yyfilename ) {
-	    std::cout << "in file " << yyfilename << " ";
+		std::cout << "in file " << yyfilename << " ";
 	} // if
 	std::cout << "at line " << yylineno << " reading token \"" << (yytext[0] == '\0' ? "EOF" : yytext) << "\"" << std::endl;
Index: src/Parser/parser.h
===================================================================
--- src/Parser/parser.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/parser.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -59,88 +59,89 @@
      SIGNED = 277,
      UNSIGNED = 278,
-     BOOL = 279,
-     COMPLEX = 280,
-     IMAGINARY = 281,
-     TYPEOF = 282,
-     LABEL = 283,
-     ENUM = 284,
-     STRUCT = 285,
-     UNION = 286,
-     TYPE = 287,
-     FTYPE = 288,
-     DTYPE = 289,
-     CONTEXT = 290,
-     SIZEOF = 291,
-     OFFSETOF = 292,
-     ATTRIBUTE = 293,
-     EXTENSION = 294,
-     IF = 295,
-     ELSE = 296,
-     SWITCH = 297,
-     CASE = 298,
-     DEFAULT = 299,
-     DO = 300,
-     WHILE = 301,
-     FOR = 302,
-     BREAK = 303,
-     CONTINUE = 304,
-     GOTO = 305,
-     RETURN = 306,
-     CHOOSE = 307,
-     DISABLE = 308,
-     ENABLE = 309,
-     FALLTHRU = 310,
-     TRY = 311,
-     CATCH = 312,
-     CATCHRESUME = 313,
-     FINALLY = 314,
-     THROW = 315,
-     THROWRESUME = 316,
-     AT = 317,
-     ASM = 318,
-     ALIGNAS = 319,
-     ALIGNOF = 320,
-     ATOMIC = 321,
-     GENERIC = 322,
-     NORETURN = 323,
-     STATICASSERT = 324,
-     THREADLOCAL = 325,
-     IDENTIFIER = 326,
-     QUOTED_IDENTIFIER = 327,
-     TYPEDEFname = 328,
-     TYPEGENname = 329,
-     ATTR_IDENTIFIER = 330,
-     ATTR_TYPEDEFname = 331,
-     ATTR_TYPEGENname = 332,
-     INTEGERconstant = 333,
-     FLOATINGconstant = 334,
-     CHARACTERconstant = 335,
-     STRINGliteral = 336,
-     ZERO = 337,
-     ONE = 338,
-     ARROW = 339,
-     ICR = 340,
-     DECR = 341,
-     LS = 342,
-     RS = 343,
-     LE = 344,
-     GE = 345,
-     EQ = 346,
-     NE = 347,
-     ANDAND = 348,
-     OROR = 349,
-     ELLIPSIS = 350,
-     MULTassign = 351,
-     DIVassign = 352,
-     MODassign = 353,
-     PLUSassign = 354,
-     MINUSassign = 355,
-     LSassign = 356,
-     RSassign = 357,
-     ANDassign = 358,
-     ERassign = 359,
-     ORassign = 360,
-     ATassign = 361,
-     THEN = 362
+     VALIST = 279,
+     BOOL = 280,
+     COMPLEX = 281,
+     IMAGINARY = 282,
+     TYPEOF = 283,
+     LABEL = 284,
+     ENUM = 285,
+     STRUCT = 286,
+     UNION = 287,
+     OTYPE = 288,
+     FTYPE = 289,
+     DTYPE = 290,
+     TRAIT = 291,
+     SIZEOF = 292,
+     OFFSETOF = 293,
+     ATTRIBUTE = 294,
+     EXTENSION = 295,
+     IF = 296,
+     ELSE = 297,
+     SWITCH = 298,
+     CASE = 299,
+     DEFAULT = 300,
+     DO = 301,
+     WHILE = 302,
+     FOR = 303,
+     BREAK = 304,
+     CONTINUE = 305,
+     GOTO = 306,
+     RETURN = 307,
+     CHOOSE = 308,
+     DISABLE = 309,
+     ENABLE = 310,
+     FALLTHRU = 311,
+     TRY = 312,
+     CATCH = 313,
+     CATCHRESUME = 314,
+     FINALLY = 315,
+     THROW = 316,
+     THROWRESUME = 317,
+     AT = 318,
+     ASM = 319,
+     ALIGNAS = 320,
+     ALIGNOF = 321,
+     ATOMIC = 322,
+     GENERIC = 323,
+     NORETURN = 324,
+     STATICASSERT = 325,
+     THREADLOCAL = 326,
+     IDENTIFIER = 327,
+     QUOTED_IDENTIFIER = 328,
+     TYPEDEFname = 329,
+     TYPEGENname = 330,
+     ATTR_IDENTIFIER = 331,
+     ATTR_TYPEDEFname = 332,
+     ATTR_TYPEGENname = 333,
+     INTEGERconstant = 334,
+     FLOATINGconstant = 335,
+     CHARACTERconstant = 336,
+     STRINGliteral = 337,
+     ZERO = 338,
+     ONE = 339,
+     ARROW = 340,
+     ICR = 341,
+     DECR = 342,
+     LS = 343,
+     RS = 344,
+     LE = 345,
+     GE = 346,
+     EQ = 347,
+     NE = 348,
+     ANDAND = 349,
+     OROR = 350,
+     ELLIPSIS = 351,
+     MULTassign = 352,
+     DIVassign = 353,
+     MODassign = 354,
+     PLUSassign = 355,
+     MINUSassign = 356,
+     LSassign = 357,
+     RSassign = 358,
+     ANDassign = 359,
+     ERassign = 360,
+     ORassign = 361,
+     ATassign = 362,
+     THEN = 363
    };
 #endif
@@ -167,88 +168,89 @@
 #define SIGNED 277
 #define UNSIGNED 278
-#define BOOL 279
-#define COMPLEX 280
-#define IMAGINARY 281
-#define TYPEOF 282
-#define LABEL 283
-#define ENUM 284
-#define STRUCT 285
-#define UNION 286
-#define TYPE 287
-#define FTYPE 288
-#define DTYPE 289
-#define CONTEXT 290
-#define SIZEOF 291
-#define OFFSETOF 292
-#define ATTRIBUTE 293
-#define EXTENSION 294
-#define IF 295
-#define ELSE 296
-#define SWITCH 297
-#define CASE 298
-#define DEFAULT 299
-#define DO 300
-#define WHILE 301
-#define FOR 302
-#define BREAK 303
-#define CONTINUE 304
-#define GOTO 305
-#define RETURN 306
-#define CHOOSE 307
-#define DISABLE 308
-#define ENABLE 309
-#define FALLTHRU 310
-#define TRY 311
-#define CATCH 312
-#define CATCHRESUME 313
-#define FINALLY 314
-#define THROW 315
-#define THROWRESUME 316
-#define AT 317
-#define ASM 318
-#define ALIGNAS 319
-#define ALIGNOF 320
-#define ATOMIC 321
-#define GENERIC 322
-#define NORETURN 323
-#define STATICASSERT 324
-#define THREADLOCAL 325
-#define IDENTIFIER 326
-#define QUOTED_IDENTIFIER 327
-#define TYPEDEFname 328
-#define TYPEGENname 329
-#define ATTR_IDENTIFIER 330
-#define ATTR_TYPEDEFname 331
-#define ATTR_TYPEGENname 332
-#define INTEGERconstant 333
-#define FLOATINGconstant 334
-#define CHARACTERconstant 335
-#define STRINGliteral 336
-#define ZERO 337
-#define ONE 338
-#define ARROW 339
-#define ICR 340
-#define DECR 341
-#define LS 342
-#define RS 343
-#define LE 344
-#define GE 345
-#define EQ 346
-#define NE 347
-#define ANDAND 348
-#define OROR 349
-#define ELLIPSIS 350
-#define MULTassign 351
-#define DIVassign 352
-#define MODassign 353
-#define PLUSassign 354
-#define MINUSassign 355
-#define LSassign 356
-#define RSassign 357
-#define ANDassign 358
-#define ERassign 359
-#define ORassign 360
-#define ATassign 361
-#define THEN 362
+#define VALIST 279
+#define BOOL 280
+#define COMPLEX 281
+#define IMAGINARY 282
+#define TYPEOF 283
+#define LABEL 284
+#define ENUM 285
+#define STRUCT 286
+#define UNION 287
+#define OTYPE 288
+#define FTYPE 289
+#define DTYPE 290
+#define TRAIT 291
+#define SIZEOF 292
+#define OFFSETOF 293
+#define ATTRIBUTE 294
+#define EXTENSION 295
+#define IF 296
+#define ELSE 297
+#define SWITCH 298
+#define CASE 299
+#define DEFAULT 300
+#define DO 301
+#define WHILE 302
+#define FOR 303
+#define BREAK 304
+#define CONTINUE 305
+#define GOTO 306
+#define RETURN 307
+#define CHOOSE 308
+#define DISABLE 309
+#define ENABLE 310
+#define FALLTHRU 311
+#define TRY 312
+#define CATCH 313
+#define CATCHRESUME 314
+#define FINALLY 315
+#define THROW 316
+#define THROWRESUME 317
+#define AT 318
+#define ASM 319
+#define ALIGNAS 320
+#define ALIGNOF 321
+#define ATOMIC 322
+#define GENERIC 323
+#define NORETURN 324
+#define STATICASSERT 325
+#define THREADLOCAL 326
+#define IDENTIFIER 327
+#define QUOTED_IDENTIFIER 328
+#define TYPEDEFname 329
+#define TYPEGENname 330
+#define ATTR_IDENTIFIER 331
+#define ATTR_TYPEDEFname 332
+#define ATTR_TYPEGENname 333
+#define INTEGERconstant 334
+#define FLOATINGconstant 335
+#define CHARACTERconstant 336
+#define STRINGliteral 337
+#define ZERO 338
+#define ONE 339
+#define ARROW 340
+#define ICR 341
+#define DECR 342
+#define LS 343
+#define RS 344
+#define LE 345
+#define GE 346
+#define EQ 347
+#define NE 348
+#define ANDAND 349
+#define OROR 350
+#define ELLIPSIS 351
+#define MULTassign 352
+#define DIVassign 353
+#define MODassign 354
+#define PLUSassign 355
+#define MINUSassign 356
+#define LSassign 357
+#define RSassign 358
+#define ANDassign 359
+#define ERassign 360
+#define ORassign 361
+#define ATassign 362
+#define THEN 363
 
 
@@ -260,5 +262,5 @@
 
 /* Line 2068 of yacc.c  */
-#line 110 "parser.yy"
+#line 112 "parser.yy"
 
 	Token tok;
@@ -277,5 +279,5 @@
 
 /* Line 2068 of yacc.c  */
-#line 280 "Parser/parser.h"
+#line 282 "Parser/parser.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Parser/parser.yy	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Feb  1 18:22:42 2016
-// Update Count     : 1483
+// Last Modified On : Wed Apr 13 16:58:43 2016
+// Update Count     : 1519
 // 
 
@@ -51,7 +51,8 @@
 #include <cstdio>
 #include <stack>
+#include "lex.h"
+#include "parser.h"
+#include "ParseNode.h"
 #include "TypedefTable.h"
-#include "lex.h"
-#include "ParseNode.h"
 #include "TypeData.h"
 #include "LinkageSpec.h"
@@ -74,8 +75,9 @@
 %token FORALL LVALUE									// CFA
 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
+%token VALIST											// GCC
 %token BOOL COMPLEX IMAGINARY							// C99
 %token TYPEOF LABEL										// GCC
 %token ENUM STRUCT UNION
-%token TYPE FTYPE DTYPE CONTEXT							// CFA
+%token OTYPE FTYPE DTYPE TRAIT						// CFA
 %token SIZEOF OFFSETOF
 %token ATTRIBUTE EXTENSION								// GCC
@@ -171,5 +173,5 @@
 %type<decl> basic_declaration_specifier basic_type_name basic_type_specifier direct_type_name indirect_type_name
 
-%type<decl> context_declaration context_declaration_list context_declaring_list context_specifier
+%type<decl> trait_declaration trait_declaration_list trait_declaring_list trait_specifier
 
 %type<decl> declaration declaration_list declaration_list_opt declaration_qualifier_list
@@ -197,5 +199,5 @@
 %type<decl> new_array_parameter_1st_dimension
 
-%type<decl> new_context_declaring_list new_declaration new_field_declaring_list
+%type<decl> new_trait_declaring_list new_declaration new_field_declaring_list
 %type<decl> new_function_declaration new_function_return new_function_specifier
 
@@ -370,5 +372,5 @@
 		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), $1 ); }
 	| '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99
-		{ $$ = 0; }
+		{ $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); }
 	| postfix_expression '{' argument_expression_list '}' // CFA
 		{
@@ -448,5 +450,5 @@
 		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), new TypeValueNode( $3 )); }
 	| OFFSETOF '(' type_name_no_function ',' no_attr_identifier ')'
-	{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( $3 ), new VarRefNode( $5 )); }
+		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( $3 ), new VarRefNode( $5 )); }
 	| ATTR_IDENTIFIER
 		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 )); }
@@ -1020,5 +1022,5 @@
 	| new_function_declaration pop ';'
 	| type_declaring_list pop ';'
-	| context_specifier pop ';'
+	| trait_specifier pop ';'
 	;
 
@@ -1027,5 +1029,5 @@
 		{
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
-			$$ = $1;
+			$$ = $1->addInitializer( $2 );
 		}
 	| declaration_qualifier_list new_variable_specifier initializer_opt
@@ -1034,10 +1036,10 @@
 		{
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
-			$$ = $2->addQualifiers( $1 );
+			$$ = $2->addQualifiers( $1 )->addInitializer( $3 );;
 		}
 	| new_variable_declaration pop ',' push identifier_or_type_name initializer_opt
 		{
 			typedefTable.addToEnclosingScope( *$5, TypedefTable::ID );
-			$$ = $1->appendList( $1->cloneType( $5 ) );
+			$$ = $1->appendList( $1->cloneType( $5 )->addInitializer( $6 ) );
 		}
 	;
@@ -1345,4 +1347,6 @@
 	| IMAGINARY											// C99
 		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
+	| VALIST											// GCC, __builtin_va_list
+		{ $$ = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
 	;
 
@@ -1434,9 +1438,14 @@
 		{ $$ = DeclarationNode::newAggregate( $1, 0, 0, $3 ); }
 	| aggregate_key no_attr_identifier_or_type_name
-	 	{ $$ = DeclarationNode::newAggregate( $1, $2, 0, 0 ); }
-	| aggregate_key no_attr_identifier_or_type_name '{' field_declaration_list '}'
-	 	{ $$ = DeclarationNode::newAggregate( $1, $2, 0, $4 ); }
+		{
+			typedefTable.makeTypedef( *$2 );
+			$$ = DeclarationNode::newAggregate( $1, $2, 0, 0 );
+		}
+	| aggregate_key no_attr_identifier_or_type_name
+		{ typedefTable.makeTypedef( *$2 ); }
+		'{' field_declaration_list '}'
+		{ $$ = DeclarationNode::newAggregate( $1, $2, 0, $5); }
 	| aggregate_key '(' type_name_list ')' '{' field_declaration_list '}' // CFA
-	 	{ $$ = DeclarationNode::newAggregate( $1, 0, $3, $6 ); }
+		{ $$ = DeclarationNode::newAggregate( $1, 0, $3, $6 ); }
 	| aggregate_key typegen_name						// CFA, S/R conflict
 		{ $$ = $2; }
@@ -1516,8 +1525,13 @@
 	enum_key '{' enumerator_list comma_opt '}'
 		{ $$ = DeclarationNode::newEnum( 0, $3 ); }
-	| enum_key no_attr_identifier_or_type_name '{' enumerator_list comma_opt '}'
-		{ $$ = DeclarationNode::newEnum( $2, $4 ); }
 	| enum_key no_attr_identifier_or_type_name
-		{ $$ = DeclarationNode::newEnum( $2, 0 ); }
+		{
+			typedefTable.makeTypedef( *$2 );
+			$$ = DeclarationNode::newEnum( $2, 0 );
+		}
+	| enum_key no_attr_identifier_or_type_name
+		{ typedefTable.makeTypedef( *$2 ); }
+		'{' enumerator_list comma_opt '}'
+		{ $$ = DeclarationNode::newEnum( $2, $5 ); }
 	;
 
@@ -1803,5 +1817,5 @@
 
 type_class:												// CFA
-	TYPE
+	OTYPE
 		{ $$ = DeclarationNode::Type; }
 	| DTYPE
@@ -1821,10 +1835,10 @@
 	'|' no_attr_identifier_or_type_name '(' type_name_list ')'
 		{
-			typedefTable.openContext( *$2 );
-			$$ = DeclarationNode::newContextUse( $2, $4 );
-		}
-	| '|' '{' push context_declaration_list '}'
+			typedefTable.openTrait( *$2 );
+			$$ = DeclarationNode::newTraitUse( $2, $4 );
+		}
+	| '|' '{' push trait_declaration_list '}'
 		{ $$ = $4; }
-	| '|' '(' push type_parameter_list pop ')' '{' push context_declaration_list '}' '(' type_name_list ')'
+	| '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list '}' '(' type_name_list ')'
 		{ $$ = 0; }
 	;
@@ -1841,7 +1855,7 @@
 
 type_declaring_list:									// CFA
-	TYPE type_declarator
-		{ $$ = $2; }
-	| storage_class_list TYPE type_declarator
+	OTYPE type_declarator
+		{ $$ = $2; }
+	| storage_class_list OTYPE type_declarator
 		{ $$ = $3->addQualifiers( $1 ); }
 	| type_declaring_list ',' type_declarator
@@ -1869,35 +1883,35 @@
 	;
 
-context_specifier:										// CFA
-	CONTEXT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' '}'
+trait_specifier:										// CFA
+	TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' '}'
 		{
 			typedefTable.addToEnclosingScope( *$2, TypedefTable::ID );
-			$$ = DeclarationNode::newContext( $2, $5, 0 );
-		}
-	| CONTEXT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{'
-		{
-			typedefTable.enterContext( *$2 );
+			$$ = DeclarationNode::newTrait( $2, $5, 0 );
+		}
+	| TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{'
+		{
+			typedefTable.enterTrait( *$2 );
 			typedefTable.enterScope();
 		}
-	  context_declaration_list '}'
-		{
-			typedefTable.leaveContext();
+	  trait_declaration_list '}'
+		{
+			typedefTable.leaveTrait();
 			typedefTable.addToEnclosingScope( *$2, TypedefTable::ID );
-			$$ = DeclarationNode::newContext( $2, $5, $10 );
-		}
-	;
-
-context_declaration_list:								// CFA
-	context_declaration
-	| context_declaration_list push context_declaration
+			$$ = DeclarationNode::newTrait( $2, $5, $10 );
+		}
+	;
+
+trait_declaration_list:								// CFA
+	trait_declaration
+	| trait_declaration_list push trait_declaration
 		{ $$ = $1->appendList( $3 ); }
 	;
 
-context_declaration:									// CFA
-	new_context_declaring_list pop ';'
-	| context_declaring_list pop ';'
-	;
-
-new_context_declaring_list:								// CFA
+trait_declaration:									// CFA
+	new_trait_declaring_list pop ';'
+	| trait_declaring_list pop ';'
+	;
+
+new_trait_declaring_list:								// CFA
 	new_variable_specifier
 		{
@@ -1910,5 +1924,5 @@
 			$$ = $1;
 		}
-	| new_context_declaring_list pop ',' push identifier_or_type_name
+	| new_trait_declaring_list pop ',' push identifier_or_type_name
 		{
 			typedefTable.addToEnclosingScope2( *$5, TypedefTable::ID );
@@ -1917,5 +1931,5 @@
 	;
 
-context_declaring_list:									// CFA
+trait_declaring_list:									// CFA
 	type_specifier declarator
 		{
@@ -1923,5 +1937,5 @@
 			$$ = $2->addType( $1 );
 		}
-	| context_declaring_list pop ',' push declarator
+	| trait_declaring_list pop ',' push declarator
 		{
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -2809,5 +2823,5 @@
 	std::cout << "Error ";
 	if ( yyfilename ) {
-	    std::cout << "in file " << yyfilename << " ";
+		std::cout << "in file " << yyfilename << " ";
 	} // if
 	std::cout << "at line " << yylineno << " reading token \"" << (yytext[0] == '\0' ? "EOF" : yytext) << "\"" << std::endl;
Index: src/ResolvExpr/AdjustExprType.cc
===================================================================
--- src/ResolvExpr/AdjustExprType.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/AdjustExprType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 23:41:42 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May 16 23:54:02 2015
-// Update Count     : 3
+// Last Modified On : Wed Mar  2 17:34:53 2016
+// Update Count     : 4
 // 
 
@@ -33,7 +33,8 @@
 		virtual Type* mutate( UnionInstType *aggregateUseType );
 		virtual Type* mutate( EnumInstType *aggregateUseType );
-		virtual Type* mutate( ContextInstType *aggregateUseType );
+		virtual Type* mutate( TraitInstType *aggregateUseType );
 		virtual Type* mutate( TypeInstType *aggregateUseType );
 		virtual Type* mutate( TupleType *tupleType );
+		virtual Type* mutate( VarArgsType *varArgsType );
 
 		const TypeEnvironment &env;
@@ -86,5 +87,5 @@
 	}
 
-	Type *AdjustExprType::mutate( ContextInstType *aggregateUseType ) {
+	Type *AdjustExprType::mutate( TraitInstType *aggregateUseType ) {
 		return aggregateUseType;
 	}
@@ -111,4 +112,8 @@
 		return tupleType;
 	}
+
+	Type *AdjustExprType::mutate( VarArgsType *varArgsType ) {
+		return varArgsType;
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -848,4 +848,8 @@
 	}
 
+	void AlternativeFinder::visit( OffsetPackExpr *offsetPackExpr ) {
+		alternatives.push_back( Alternative( offsetPackExpr->clone(), env, Cost::zero ) );
+	}
+
 	void AlternativeFinder::resolveAttr( DeclarationWithType *funcDecl, FunctionType *function, Type *argType, const TypeEnvironment &env ) {
 		// assume no polymorphism
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/AlternativeFinder.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -59,4 +59,5 @@
 		virtual void visit( UntypedOffsetofExpr *offsetofExpr );
 		virtual void visit( OffsetofExpr *offsetofExpr );
+		virtual void visit( OffsetPackExpr *offsetPackExpr );
 		virtual void visit( AttrExpr *attrExpr );
 		virtual void visit( LogicalExpr *logicalExpr );
Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/CommonType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 06:59:27 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 07:04:50 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:35:34 2016
+// Update Count     : 3
 //
 
@@ -35,7 +35,8 @@
 		virtual void visit( UnionInstType *aggregateUseType );
 		virtual void visit( EnumInstType *aggregateUseType );
-		virtual void visit( ContextInstType *aggregateUseType );
+		virtual void visit( TraitInstType *aggregateUseType );
 		virtual void visit( TypeInstType *aggregateUseType );
 		virtual void visit( TupleType *tupleType );
+		virtual void visit( VarArgsType *varArgsType );
 
 		template< typename RefType > void handleRefType( RefType *inst, Type *other );
@@ -185,5 +186,5 @@
 	}
 
-	void CommonType::visit( ContextInstType *aggregateUseType ) {
+	void CommonType::visit( TraitInstType *aggregateUseType ) {
 	}
 
@@ -213,4 +214,7 @@
 	void CommonType::visit( TupleType *tupleType ) {
 	}
+
+	void CommonType::visit( VarArgsType *varArgsType ) {
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/ConversionCost.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 07:06:19 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 07:22:19 2015
-// Update Count     : 4
+// Last Modified On : Wed Mar  2 17:35:46 2016
+// Update Count     : 6
 //
 
@@ -206,5 +206,5 @@
 	}
 
-	void ConversionCost::visit(ContextInstType *inst) {
+	void ConversionCost::visit(TraitInstType *inst) {
 	}
 
@@ -247,4 +247,10 @@
 		} // if
 	}
+
+	void ConversionCost::visit(VarArgsType *varArgsType) {
+		if ( dynamic_cast< VarArgsType* >( dest ) ) {
+			cost = Cost::zero;
+		}
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/ConversionCost.h
===================================================================
--- src/ResolvExpr/ConversionCost.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/ConversionCost.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 09:37:28 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 09:39:23 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:35:56 2016
+// Update Count     : 3
 //
 
@@ -37,7 +37,8 @@
 		virtual void visit(UnionInstType *aggregateUseType);
 		virtual void visit(EnumInstType *aggregateUseType);
-		virtual void visit(ContextInstType *aggregateUseType);
+		virtual void visit(TraitInstType *aggregateUseType);
 		virtual void visit(TypeInstType *aggregateUseType);
 		virtual void visit(TupleType *tupleType);
+		virtual void visit(VarArgsType *varArgsType);
 	  protected:
 		Type *dest;
Index: src/ResolvExpr/PtrsAssignable.cc
===================================================================
--- src/ResolvExpr/PtrsAssignable.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/PtrsAssignable.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 11:44:11 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Mon Sep 21 14:34:58 2015
-// Update Count     : 7
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:36:05 2016
+// Update Count     : 8
 //
 
@@ -35,7 +35,8 @@
 		virtual void visit( UnionInstType *inst );
 		virtual void visit( EnumInstType *inst );
-		virtual void visit( ContextInstType *inst );
+		virtual void visit( TraitInstType *inst );
 		virtual void visit( TypeInstType *inst );
 		virtual void visit( TupleType *tupleType );
+		virtual void visit( VarArgsType *varArgsType );
 	  private:
 		Type *dest;
@@ -100,5 +101,5 @@
 	}
 
-	void PtrsAssignable::visit( ContextInstType *inst ) {
+	void PtrsAssignable::visit( TraitInstType *inst ) {
 		// I definitely don't think we should be doing anything here
 	}
@@ -137,4 +138,7 @@
 ///   }
 	}
+
+	void PtrsAssignable::visit( VarArgsType *varArgsType ) {
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/PtrsCastable.cc
===================================================================
--- src/ResolvExpr/PtrsCastable.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/PtrsCastable.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 11:48:00 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Mon Oct 05 14:49:12 2015
-// Update Count     : 7
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:36:18 2016
+// Update Count     : 8
 //
 
@@ -36,7 +36,8 @@
 		virtual void visit(UnionInstType *inst);
 		virtual void visit(EnumInstType *inst);
-		virtual void visit(ContextInstType *inst);
+		virtual void visit(TraitInstType *inst);
 		virtual void visit(TypeInstType *inst);
 		virtual void visit(TupleType *tupleType);
+		virtual void visit(VarArgsType *varArgsType);
 	  private:
 		Type *dest;
@@ -115,7 +116,7 @@
 
 	void PtrsCastable::visit(EnumInstType *inst) {
-		if ( dynamic_cast< EnumInstType* >( inst ) ) {
+		if ( dynamic_cast< EnumInstType* >( dest ) ) {
 			result = 1;
-		} else if ( BasicType *bt = dynamic_cast< BasicType* >( inst ) ) {
+		} else if ( BasicType *bt = dynamic_cast< BasicType* >( dest ) ) {
 			if ( bt->get_kind() == BasicType::SignedInt ) {
 				result = 0;
@@ -128,5 +129,5 @@
 	}
 
-	void PtrsCastable::visit(ContextInstType *inst) {
+	void PtrsCastable::visit(TraitInstType *inst) {
 		// I definitely don't think we should be doing anything here
 	}
@@ -139,4 +140,8 @@
 		result = objectCast( dest, env, indexer );
 	}
+
+	void PtrsCastable::visit(VarArgsType *varArgsType) {
+		result = objectCast( dest, env, indexer );
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/RenameVars.cc
===================================================================
--- src/ResolvExpr/RenameVars.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/RenameVars.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 12:05:18 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 14:51:35 2015
-// Update Count     : 4
+// Last Modified On : Wed Mar  2 17:36:32 2016
+// Update Count     : 5
 //
 
@@ -86,5 +86,5 @@
 	}
 
-	void RenameVars::visit( ContextInstType *aggregateUseType ) {
+	void RenameVars::visit( TraitInstType *aggregateUseType ) {
 		typeBefore( aggregateUseType );
 		acceptAll( aggregateUseType->get_parameters(), *this );
@@ -111,4 +111,9 @@
 		acceptAll( tupleType->get_types(), *this );
 		typeAfter( tupleType );
+	}
+
+	void RenameVars::visit( VarArgsType *varArgsType ) {
+		typeBefore( varArgsType );
+		typeAfter( varArgsType );
 	}
 
Index: src/ResolvExpr/RenameVars.h
===================================================================
--- src/ResolvExpr/RenameVars.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/RenameVars.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 12:10:28 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 12:11:53 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:36:39 2016
+// Update Count     : 3
 //
 
@@ -40,7 +40,8 @@
 		virtual void visit( UnionInstType *aggregateUseType );
 		virtual void visit( EnumInstType *aggregateUseType );
-		virtual void visit( ContextInstType *aggregateUseType );
+		virtual void visit( TraitInstType *aggregateUseType );
 		virtual void visit( TypeInstType *aggregateUseType );
 		virtual void visit( TupleType *tupleType );
+		virtual void visit( VarArgsType *varArgsType );
 
 		void typeBefore( Type *type );
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/Resolver.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 12:17:01 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Feb  9 21:57:52 2016
-// Update Count     : 179
+// Last Modified On : Thu Mar 24 16:43:11 2016
+// Update Count     : 181
 //
 
@@ -165,6 +165,13 @@
 		Type *new_type = resolveTypeof( objectDecl->get_type(), *this );
 		objectDecl->set_type( new_type );
+		// To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that class-variable
+		// initContext is changed multiple time because the LHS is analysed twice. The second analysis changes
+		// initContext because of a function type can contain object declarations in the return and parameter types. So
+		// each value of initContext is retained, so the type on the first analysis is preserved and used for selecting
+		// the RHS.
+		Type *temp = initContext;
 		initContext = new_type;
 		SymTab::Indexer::visit( objectDecl );
+		initContext = temp;
 	}
 
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/ResolvExpr/Unify.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -5,11 +5,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Unify.cc -- 
+// Unify.cc --
 //
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:27:10 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Sep 02 14:43:22 2015
-// Update Count     : 36
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:37:05 2016
+// Update Count     : 37
 //
 
@@ -38,5 +38,5 @@
 		WidenMode operator&( const WidenMode &other ) { WidenMode newWM( *this ); newWM &= other; return newWM; }
 		operator bool() { return widenFirst && widenSecond; }
-  
+
 		bool widenFirst : 1, widenSecond : 1;
 	};
@@ -45,5 +45,5 @@
 	  public:
 		Unify( Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer );
-  
+
 		bool get_result() const { return result; }
 	  private:
@@ -56,7 +56,8 @@
 		virtual void visit(UnionInstType *aggregateUseType);
 		virtual void visit(EnumInstType *aggregateUseType);
-		virtual void visit(ContextInstType *aggregateUseType);
+		virtual void visit(TraitInstType *aggregateUseType);
 		virtual void visit(TypeInstType *aggregateUseType);
 		virtual void visit(TupleType *tupleType);
+		virtual void visit(VarArgsType *varArgsType);
 
 		template< typename RefType > void handleRefType( RefType *inst, Type *other );
@@ -78,5 +79,5 @@
 	bool unifyInexact( Type *type1, Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer, Type *&common );
 	bool unifyExact( Type *type1, Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer );
-  
+
 	bool typesCompatible( Type *first, Type *second, const SymTab::Indexer &indexer, const TypeEnvironment &env ) {
 		TypeEnvironment newEnv;
@@ -136,5 +137,5 @@
 		  case TypeDecl::Dtype:
 			return ! isFtype( type, indexer );
-  
+
 		  case TypeDecl::Ftype:
 			return isFtype( type, indexer );
@@ -195,5 +196,5 @@
 		bool widen1 = false, widen2 = false;
 		Type *type1 = 0, *type2 = 0;
-  
+
 		if ( env.lookup( var1->get_name(), class1 ) ) {
 			hasClass1 = true;
@@ -216,5 +217,5 @@
 			widen2 = widenMode.widenSecond && class2.allowWidening;
 		} // if
-  
+
 		if ( type1 && type2 ) {
 //    std::cout << "has type1 && type2" << std::endl;
@@ -435,7 +436,5 @@
 		// to unify, array types must both be VLA or both not VLA
 		// and must both have a dimension expression or not have a dimension
-		if ( otherArray && arrayType->get_isVarLen() == otherArray->get_isVarLen() 
-				&& ((arrayType->get_dimension() != 0 && otherArray->get_dimension() != 0)
-					|| (arrayType->get_dimension() == 0 && otherArray->get_dimension() == 0))) {
+		if ( otherArray && arrayType->get_isVarLen() == otherArray->get_isVarLen() ) {
 
 			// not positive this is correct in all cases, but it's needed for typedefs
@@ -448,12 +447,15 @@
 				ConstantExpr * ce1 = dynamic_cast< ConstantExpr * >( arrayType->get_dimension() );
 				ConstantExpr * ce2 = dynamic_cast< ConstantExpr * >( otherArray->get_dimension() );
-				assert(ce1 && ce2);
-
-				Constant * c1 = ce1->get_constant();
-				Constant * c2 = ce2->get_constant();
-
-				if ( c1->get_value() != c2->get_value() ) {
-					// does not unify if the dimension is different
-					return;
+				// see C11 Reference Manual 6.7.6.2.6
+				// two array types with size specifiers that are integer constant expressions are
+				// compatible if both size specifiers have the same constant value
+				if ( ce1 && ce2 ) {
+					Constant * c1 = ce1->get_constant();
+					Constant * c2 = ce2->get_constant();
+
+					if ( c1->get_value() != c2->get_value() ) {
+						// does not unify if the dimension is different
+						return;
+					}
 				}
 			}
@@ -484,5 +486,5 @@
 
 			if ( unifyDeclList( functionType->get_parameters().begin(), functionType->get_parameters().end(), otherFunction->get_parameters().begin(), otherFunction->get_parameters().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) {
-	
+
 				if ( unifyDeclList( functionType->get_returnVals().begin(), functionType->get_returnVals().end(), otherFunction->get_returnVals().begin(), otherFunction->get_returnVals().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) {
 
@@ -539,5 +541,5 @@
 	}
 
-	void Unify::visit(ContextInstType *contextInst) {
+	void Unify::visit(TraitInstType *contextInst) {
 		handleRefType( contextInst, type2 );
 	}
@@ -582,4 +584,8 @@
 	}
 
+	void Unify::visit(VarArgsType *varArgsType) {
+		result = dynamic_cast< VarArgsType* >( type2 );
+	}
+
 } // namespace ResolvExpr
 
Index: src/SymTab/AddVisit.h
===================================================================
--- src/SymTab/AddVisit.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/AddVisit.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 16:14:32 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Jul 14 12:26:17 2015
-// Update Count     : 4
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Apr  7 14:42:21 2016
+// Update Count     : 5
 //
 
@@ -27,37 +27,6 @@
 
 	template< typename Visitor >
-	inline void addVisitStatement( Statement *stmt, Visitor &visitor ) {
-		maybeAccept( stmt, visitor );
-///   if ( ! declsToAdd.empty() ) {
-///     CompoundStmt *compound = new CompoundStmt( noLabels );
-///     compound->get_kids().push_back( stmt );
-///     addDecls( declsToAdd, compound->get_kids(), compound->get_kids().end() );
-///   }
-	}
-
-	template< typename Visitor >
 	inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) {
 		addVisitStatementList( compoundStmt->get_kids(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(IfStmt *ifStmt, Visitor &visitor) {
-		addVisitStatement( ifStmt->get_thenPart(), visitor );
-		addVisitStatement( ifStmt->get_elsePart(), visitor );
-		maybeAccept( ifStmt->get_condition(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(WhileStmt *whileStmt, Visitor &visitor) {
-		addVisitStatement( whileStmt->get_body(), visitor );
-		maybeAccept( whileStmt->get_condition(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(ForStmt *forStmt, Visitor &visitor) {
-		addVisitStatement( forStmt->get_body(), visitor );
-		acceptAll( forStmt->get_initialization(), visitor );
-		maybeAccept( forStmt->get_condition(), visitor );
-		maybeAccept( forStmt->get_increment(), visitor );
 	}
 
@@ -74,15 +43,9 @@
 	}
 
-	template< typename Visitor >
-	inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) {
-		addVisitStatementList( caseStmt->get_statements(), visitor );
-		maybeAccept( caseStmt->get_condition(), visitor );
-	}
-
-	template< typename Visitor >
-	inline void addVisit(CatchStmt *cathStmt, Visitor &visitor) {
-		addVisitStatement( cathStmt->get_body(), visitor );
-		maybeAccept( cathStmt->get_decl(), visitor );
-	}
+	// template< typename Visitor >
+	// inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) {
+	// 	addVisitStatementList( caseStmt->get_statements(), visitor );
+	// 	maybeAccept( caseStmt->get_condition(), visitor );
+	// }
 } // namespace SymTab
 
Index: c/SymTab/AggregateTable.h
===================================================================
--- src/SymTab/AggregateTable.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,53 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// AggregateTable.h -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Sun May 17 16:17:26 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 16:19:29 2015
-// Update Count     : 4
-//
-
-#ifndef AGGREGATETABLE_H
-#define AGGREGATETABLE_H
-
-#include <map>
-#include <stack>
-#include <string>
-#include <functional>
-
-#include "StackTable.h"
-#include "SynTree/Declaration.h"
-
-namespace SymTab {
-	template< class AggregateDeclClass >
-	class AggregateTableConflictFunction : public std::binary_function< AggregateDeclClass *, AggregateDeclClass *, AggregateDeclClass *> {
-	  public:
-		AggregateDeclClass *operator()( AggregateDeclClass *existing, AggregateDeclClass *added ) {
-			if ( existing->get_members().empty() ) {
-				return added;
-			} else if ( ! added->get_members().empty() ) {
-				throw SemanticError( "redeclaration of ", added );
-			} // if
-			return existing;
-		}
-	};
-
-	typedef StackTable< StructDecl, AggregateTableConflictFunction< StructDecl > > StructTable;
-	typedef StackTable< EnumDecl, AggregateTableConflictFunction< EnumDecl > > EnumTable;
-	typedef StackTable< UnionDecl, AggregateTableConflictFunction< UnionDecl > > UnionTable;
-	typedef StackTable< ContextDecl, AggregateTableConflictFunction< ContextDecl > > ContextTable;
-} // namespace SymTab
-
-#endif // AGGREGATETABLE_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SymTab/FixFunction.cc
===================================================================
--- src/SymTab/FixFunction.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/FixFunction.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 16:19:49 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 16:22:54 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:31:10 2016
+// Update Count     : 3
 //
 
@@ -61,5 +61,5 @@
 	}
 
-	Type * FixFunction::mutate(ContextInstType *aggregateUseType) {
+	Type * FixFunction::mutate(TraitInstType *aggregateUseType) {
 		return aggregateUseType;
 	}
@@ -72,4 +72,8 @@
 		return tupleType;
 	}
+
+	Type * FixFunction::mutate(VarArgsType *varArgsType) {
+		return varArgsType;
+	}
 } // namespace SymTab
 
Index: src/SymTab/FixFunction.h
===================================================================
--- src/SymTab/FixFunction.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/FixFunction.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 17:02:08 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 17:03:43 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:34:06 2016
+// Update Count     : 3
 //
 
@@ -38,7 +38,8 @@
 		virtual Type* mutate(UnionInstType *aggregateUseType);
 		virtual Type* mutate(EnumInstType *aggregateUseType);
-		virtual Type* mutate(ContextInstType *aggregateUseType);
+		virtual Type* mutate(TraitInstType *aggregateUseType);
 		virtual Type* mutate(TypeInstType *aggregateUseType);
 		virtual Type* mutate(TupleType *tupleType);
+		virtual Type* mutate(VarArgsType *varArgsType);
   
 		bool isVoid;
Index: c/SymTab/IdTable.cc
===================================================================
--- src/SymTab/IdTable.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,189 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// IdTable.cc -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Sun May 17 17:04:02 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jan  8 22:59:23 2016
-// Update Count     : 74
-//
-
-#include <cassert>
-
-#include "SynTree/Declaration.h"
-#include "ResolvExpr/typeops.h"
-#include "Indexer.h"
-#include "Mangler.h"
-#include "IdTable.h"
-#include "Common/SemanticError.h"
-
-using std::string;
-
-namespace SymTab {
-	IdTable::IdTable() : scopeLevel( 0 ) {
-	}
-
-	void IdTable::enterScope() {
-		scopeLevel++;
-	}
-
-	void IdTable::leaveScope() {
-		for ( OuterTableType::iterator outer = table.begin(); outer != table.end(); ++outer ) {
-			for ( InnerTableType::iterator inner = outer->second.begin(); inner != outer->second.end(); ++inner ) {
-				std::stack< DeclEntry >& entry = inner->second;
-				// xxx - should be while?
-				if ( ! entry.empty() && entry.top().second == scopeLevel ) {
-					entry.pop();
-				} // if
-			} // for
-		} // for
-
-		scopeLevel--;
-		assert( scopeLevel >= 0 );
-	}
-
-	void IdTable::addDecl( DeclarationWithType *decl ) {
-		const string &name = decl->get_name();
-		string manglename;
-		if ( decl->get_linkage() == LinkageSpec::C ) {
-			manglename = name;
-		} else if ( LinkageSpec::isOverridable( decl->get_linkage() ) ) {
-			// mangle the name without including the appropriate suffix, so overridable routines are placed into the
-			// same "bucket" as their user defined versions.
-			manglename = Mangler::mangle( decl, false );
-		} else {
-			manglename = Mangler::mangle( decl );
-		} // if
-
-		InnerTableType &declTable = table[ name ];
-		InnerTableType::iterator it = declTable.find( manglename );
-
-		if ( it == declTable.end() ) {
-			// first time this name mangling has been defined
-			declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) );
-		} else {
-			std::stack< DeclEntry >& entry = it->second;
-			if ( ! entry.empty() && entry.top().second == scopeLevel ) {
-				// if we're giving the same name mangling to things of different types then there is something wrong
-				Declaration *old = entry.top().first;
-				assert( (dynamic_cast<ObjectDecl*>( decl ) && dynamic_cast<ObjectDecl*>( old ) )
-				  || (dynamic_cast<FunctionDecl*>( decl ) && dynamic_cast<FunctionDecl*>( old ) ) );
-
-				if ( LinkageSpec::isOverridable( old->get_linkage() ) ) {
-					// new definition shadows the autogenerated one, even at the same scope
-					declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) );
-				} else if ( decl->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( decl->get_type(), entry.top().first->get_type(), Indexer() ) ) {
-					// typesCompatible doesn't really do the right thing here. When checking compatibility of function types,
-					// we should ignore outermost pointer qualifiers, except _Atomic?
-					FunctionDecl *newentry = dynamic_cast< FunctionDecl* >( decl );
-					FunctionDecl *oldentry = dynamic_cast< FunctionDecl* >( old );
-					if ( newentry && oldentry ) {
-						if ( newentry->get_statements() && oldentry->get_statements() ) {
-							throw SemanticError( "duplicate function definition for 1 ", decl );
-						} // if
-					} else {
-						// two objects with the same mangled name defined in the same scope.
-						// both objects must be marked extern or both must be intrinsic for this to be okay
-						// xxx - perhaps it's actually if either is intrinsic then this is okay?
-						//       might also need to be same storage class?
-						ObjectDecl *newobj = dynamic_cast< ObjectDecl* >( decl );
-						ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( old );
-						if (newobj->get_storageClass() != DeclarationNode::Extern && oldobj->get_storageClass() != DeclarationNode::Extern ) {
-							throw SemanticError( "duplicate definition for 3 ", decl );
-						} // if
-					} // if
-				} else {
-					throw SemanticError( "duplicate definition for ", decl );
-				} // if
-			} else {
-				// new scope level - shadow existing definition
-				declTable[ manglename ].push( DeclEntry( decl, scopeLevel ) );
-			} // if
-		} // if
-		// this ensures that no two declarations with the same unmangled name both have C linkage
-		for ( InnerTableType::iterator i = declTable.begin(); i != declTable.end(); ++i ) {
-			if ( ! i->second.empty() && i->second.top().first->get_linkage() == LinkageSpec::C && declTable.size() > 1 ) {
-				InnerTableType::iterator j = i;
-				for ( j++; j != declTable.end(); ++j ) {
-					if ( ! j->second.empty() && j->second.top().first->get_linkage() == LinkageSpec::C ) {
-						throw SemanticError( "invalid overload of C function " );
-					} // if
-				} // for
-			} // if
-		} // for
-	}
-
-	void IdTable::lookupId( const std::string &id, std::list< DeclarationWithType* >& decls ) const {
-		OuterTableType::const_iterator outer = table.find( id );
-		if ( outer == table.end() ) return;
-		const InnerTableType &declTable = outer->second;
-		for ( InnerTableType::const_iterator it = declTable.begin(); it != declTable.end(); ++it ) {
-			const std::stack< DeclEntry >& entry = it->second;
-			if ( ! entry.empty() ) {
-				decls.push_back( entry.top().first );
-			} // if
-		} // for
-	}
-
-	DeclarationWithType * IdTable::lookupId( const std::string &id) const {
-		DeclarationWithType* result = 0;
-		int depth = -1;
-
-		OuterTableType::const_iterator outer = table.find( id );
-		if ( outer == table.end() ) return 0;
-		const InnerTableType &declTable = outer->second;
-		for ( InnerTableType::const_iterator it = declTable.begin(); it != declTable.end(); ++it ) {
-			const std::stack< DeclEntry >& entry = it->second;
-			if ( ! entry.empty() && entry.top().second > depth ) {
-				result = entry.top().first;
-				depth = entry.top().second;
-			} // if
-		} // for
-		return result;
-	}
-
-	void IdTable::dump( std::ostream &os ) const {
-		for ( OuterTableType::const_iterator outer = table.begin(); outer != table.end(); ++outer ) {
-			for ( InnerTableType::const_iterator inner = outer->second.begin(); inner != outer->second.end(); ++inner ) {
-#if 0
-				const std::stack< DeclEntry >& entry = inner->second;
-				if ( ! entry.empty() ) { // && entry.top().second == scopeLevel ) {
-					os << outer->first << " (" << inner->first << ") (" << entry.top().second << ")" << std::endl;
-				} else {
-					os << outer->first << " (" << inner->first << ") ( entry-empty)" << std::endl;
-				} // if
-#endif
-#if 0
-				std::stack<DeclEntry> stack = inner->second;
-				os << "dumping a stack" << std::endl;
-				while ( ! stack.empty()) {
-					DeclEntry d = stack.top();
-					os << outer->first << " (" << inner->first << ") (" << d.second << ") " << std::endl;
-					stack.pop();
-				} // while
-#endif
-			} // for
-		} // for
-#if 0
-		for ( OuterTableType::const_iterator outer = table.begin(); outer != table.end(); ++outer ) {
-			for ( InnerTableType::const_iterator inner = outer->second.begin(); inner != outer->second.end(); ++inner ) {
-				const std::stack< DeclEntry >& entry = inner->second;
-				if ( ! entry.empty() && entry.top().second == scopeLevel ) {
-					os << outer->first << " (" << inner->first << ") (" << scopeLevel << ")" << std::endl;
-				} // if
-			} // for
-		} // for
-#endif
-	}
-} // namespace SymTab
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/SymTab/IdTable.h
===================================================================
--- src/SymTab/IdTable.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,54 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// IdTable.h -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Sun May 17 21:30:02 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 16:49:33 2015
-// Update Count     : 4
-//
-
-#ifndef IDTABLE_H
-#define IDTABLE_H
-
-#include <iostream>
-#include <map>
-#include <string>
-#include <stack>
-
-#include "SynTree/SynTree.h"
-
-namespace SymTab {
-	class IdTable {
-	  public:
-		IdTable();
-  
-		void enterScope();
-		void leaveScope();
-		void addDecl( DeclarationWithType *decl );
-		void lookupId( const std::string &id, std::list< DeclarationWithType* >& decls ) const;
-		DeclarationWithType* lookupId( const std::string &id) const;
-  
-		void dump( std::ostream &os ) const;			// debugging
-	  private:
-		typedef std::pair< DeclarationWithType*, int > DeclEntry;
-		typedef std::map< std::string, std::stack< DeclEntry > > InnerTableType;
-		typedef std::map< std::string, InnerTableType > OuterTableType;
-
-		OuterTableType table;
-		int scopeLevel;
-	};
-} // namespace SymTab
-
-#endif // IDTABLE_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SymTab/ImplementationType.cc
===================================================================
--- src/SymTab/ImplementationType.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/ImplementationType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:32:01 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 17 21:34:40 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:31:20 2016
+// Update Count     : 3
 //
 
@@ -37,7 +37,8 @@
 		virtual void visit(UnionInstType *aggregateUseType);
 		virtual void visit(EnumInstType *aggregateUseType);
-		virtual void visit(ContextInstType *aggregateUseType);
+		virtual void visit(TraitInstType *aggregateUseType);
 		virtual void visit(TypeInstType *aggregateUseType);
 		virtual void visit(TupleType *tupleType);
+		virtual void visit(VarArgsType *varArgsType);
 
 		Type *result;			// synthesized
@@ -95,5 +96,5 @@
 	}
 
-	void ImplementationType::visit(ContextInstType *aggregateUseType) {
+	void ImplementationType::visit(TraitInstType *aggregateUseType) {
 	}
 
@@ -116,4 +117,7 @@
 		result = newType;
 	}
+
+	void ImplementationType::visit(VarArgsType *varArgsType) {
+	}
 } // namespace SymTab
 
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/Indexer.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,8 +9,22 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:37:33 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Aug 05 13:52:42 2015
-// Update Count     : 10
-//
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:31:29 2016
+// Update Count     : 11
+//
+
+#include "Indexer.h"
+
+#include <string>
+#include <typeinfo>
+#include <unordered_map>
+#include <unordered_set>
+#include <utility>
+
+#include "Mangler.h"
+
+#include "Common/utility.h"
+
+#include "ResolvExpr/typeops.h"
 
 #include "SynTree/Declaration.h"
@@ -19,7 +33,4 @@
 #include "SynTree/Initializer.h"
 #include "SynTree/Statement.h"
-#include "Indexer.h"
-#include <typeinfo>
-#include "Common/utility.h"
 
 #define debugPrint(x) if ( doDebug ) { std::cout << x; }
@@ -33,7 +44,104 @@
 	}
 
-	Indexer::Indexer( bool useDebug ) : doDebug( useDebug ) {}
-
-	Indexer::~Indexer() {}
+	typedef std::unordered_map< std::string, DeclarationWithType* > MangleTable;
+	typedef std::unordered_map< std::string, MangleTable > IdTable;
+	typedef std::unordered_map< std::string, NamedTypeDecl* > TypeTable;
+	typedef std::unordered_map< std::string, StructDecl* > StructTable;
+	typedef std::unordered_map< std::string, EnumDecl* > EnumTable;
+	typedef std::unordered_map< std::string, UnionDecl* > UnionTable;
+	typedef std::unordered_map< std::string, TraitDecl* > TraitTable;
+
+	void dump( const IdTable &table, std::ostream &os ) {
+		for ( IdTable::const_iterator id = table.begin(); id != table.end(); ++id ) {
+			for ( MangleTable::const_iterator mangle = id->second.begin(); mangle != id->second.end(); ++mangle ) {
+				os << mangle->second << std::endl;
+			}
+		}
+	}
+	
+	template< typename Decl >
+	void dump( const std::unordered_map< std::string, Decl* > &table, std::ostream &os ) {
+		for ( typename std::unordered_map< std::string, Decl* >::const_iterator it = table.begin(); it != table.end(); ++it ) {
+			os << it->second << std::endl;
+		} // for
+	}
+	
+	struct Indexer::Impl {
+		Impl( unsigned long _scope ) : refCount(1), scope( _scope ), size( 0 ), base(),
+				idTable(), typeTable(), structTable(), enumTable(), unionTable(), traitTable() {}
+		Impl( unsigned long _scope, Indexer &&_base ) : refCount(1), scope( _scope ), size( 0 ), base( _base ),
+				idTable(), typeTable(), structTable(), enumTable(), unionTable(), traitTable() {}
+		unsigned long refCount;   ///< Number of references to these tables
+		unsigned long scope;      ///< Scope these tables are associated with
+		unsigned long size;       ///< Number of elements stored in this table
+		const Indexer base;       ///< Base indexer this extends
+		
+		IdTable idTable;          ///< Identifier namespace
+		TypeTable typeTable;      ///< Type namespace
+		StructTable structTable;  ///< Struct namespace
+		EnumTable enumTable;      ///< Enum namespace
+		UnionTable unionTable;    ///< Union namespace
+		TraitTable traitTable;    ///< Trait namespace
+	};
+
+	Indexer::Impl *Indexer::newRef( Indexer::Impl *toClone ) {
+		if ( ! toClone ) return 0;
+
+		// shorten the search chain by skipping empty links
+		Indexer::Impl *ret = toClone->size == 0 ? toClone->base.tables : toClone;
+		if ( ret ) { ++ret->refCount; }
+
+		return ret;
+	}
+
+	void Indexer::deleteRef( Indexer::Impl *toFree ) {
+		if ( ! toFree ) return;
+
+		if ( --toFree->refCount == 0 ) delete toFree;
+	}
+
+	void Indexer::makeWritable() {
+		if ( ! tables ) {
+			// create indexer if not yet set
+			tables = new Indexer::Impl( scope );
+		} else if ( tables->refCount > 1 || tables->scope != scope ) {
+			// make this indexer the base of a fresh indexer at the current scope
+			tables = new Indexer::Impl( scope, std::move( *this ) );
+		}
+	}
+
+	Indexer::Indexer( bool _doDebug ) : tables( 0 ), scope( 0 ), doDebug( _doDebug ) {}
+
+	Indexer::Indexer( const Indexer &that ) : tables( newRef( that.tables ) ), scope( that.scope ), doDebug( that.doDebug ) {}
+
+	Indexer::Indexer( Indexer &&that ) : tables( that.tables ), scope( that.scope ), doDebug( that.doDebug ) {
+		that.tables = 0;
+	}
+
+	Indexer::~Indexer() {
+		deleteRef( tables );
+	}
+
+	Indexer& Indexer::operator= ( const Indexer &that ) {
+		deleteRef( tables );
+
+		tables = newRef( that.tables );
+		scope = that.scope;
+		doDebug = that.doDebug;
+
+		return *this;
+	}
+
+	Indexer& Indexer::operator= ( Indexer &&that ) {
+		deleteRef( tables );
+
+		tables = that.tables;
+		scope = that.scope;
+		doDebug = that.doDebug;
+
+		that.tables = 0;
+
+		return *this;
+	}
 
 	void Indexer::visit( ObjectDecl *objectDecl ) {
@@ -45,5 +153,5 @@
 		if ( objectDecl->get_name() != "" ) {
 			debugPrint( "Adding object " << objectDecl->get_name() << std::endl );
-			idTable.addDecl( objectDecl );
+			addId( objectDecl );
 		} // if
 	}
@@ -52,5 +160,5 @@
 		if ( functionDecl->get_name() == "" ) return;
 		debugPrint( "Adding function " << functionDecl->get_name() << std::endl );
-		idTable.addDecl( functionDecl );
+		addId( functionDecl );
 		enterScope();
 		maybeAccept( functionDecl->get_functionType(), *this );
@@ -90,5 +198,5 @@
 		leaveScope();
 		debugPrint( "Adding type " << typeDecl->get_name() << std::endl );
-		typeTable.add( typeDecl );
+		addType( typeDecl );
 		acceptAll( typeDecl->get_assertions(), *this );
 	}
@@ -100,5 +208,5 @@
 		leaveScope();
 		debugPrint( "Adding typedef " << typeDecl->get_name() << std::endl );
-		typeTable.add( typeDecl );
+		addType( typeDecl );
 	}
 
@@ -108,5 +216,5 @@
 		cloneAll( aggregateDecl->get_parameters(), fwdDecl.get_parameters() );
 		debugPrint( "Adding fwd decl for struct " << fwdDecl.get_name() << std::endl );
-		structTable.add( &fwdDecl );
+		addStruct( &fwdDecl );
   
 		enterScope();
@@ -117,5 +225,5 @@
 		debugPrint( "Adding struct " << aggregateDecl->get_name() << std::endl );
 		// this addition replaces the forward declaration
-		structTable.add( aggregateDecl );
+		addStruct( aggregateDecl );
 	}
 
@@ -125,5 +233,5 @@
 		cloneAll( aggregateDecl->get_parameters(), fwdDecl.get_parameters() );
 		debugPrint( "Adding fwd decl for union " << fwdDecl.get_name() << std::endl );
-		unionTable.add( &fwdDecl );
+		addUnion( &fwdDecl );
   
 		enterScope();
@@ -133,15 +241,15 @@
   
 		debugPrint( "Adding union " << aggregateDecl->get_name() << std::endl );
-		unionTable.add( aggregateDecl );
+		addUnion( aggregateDecl );
 	}
 
 	void Indexer::visit( EnumDecl *aggregateDecl ) {
 		debugPrint( "Adding enum " << aggregateDecl->get_name() << std::endl );
-		enumTable.add( aggregateDecl );
+		addEnum( aggregateDecl );
 		// unlike structs, contexts, and unions, enums inject their members into the global scope
 		acceptAll( aggregateDecl->get_members(), *this );
 	}
 
-	void Indexer::visit( ContextDecl *aggregateDecl ) {
+	void Indexer::visit( TraitDecl *aggregateDecl ) {
 		enterScope();
 		acceptAll( aggregateDecl->get_parameters(), *this );
@@ -150,5 +258,5 @@
   
 		debugPrint( "Adding context " << aggregateDecl->get_name() << std::endl );
-		contextTable.add( aggregateDecl );
+		addTrait( aggregateDecl );
 	}
 
@@ -236,4 +344,9 @@
 		maybeAccept( offsetofExpr->get_type(), *this );
 		maybeAccept( offsetofExpr->get_member(), *this );
+	}
+
+	void Indexer::visit( OffsetPackExpr *offsetPackExpr ) {
+		acceptAllNewScope( offsetPackExpr->get_results(), *this );
+		maybeAccept( offsetPackExpr->get_type(), *this );
 	}
 
@@ -293,5 +406,5 @@
 
 
-	void Indexer::visit( ContextInstType *contextInst ) {
+	void Indexer::visit( TraitInstType *contextInst ) {
 		acceptAll( contextInst->get_parameters(), *this );
 		acceptAll( contextInst->get_members(), *this );
@@ -299,7 +412,7 @@
 
 	void Indexer::visit( StructInstType *structInst ) {
-		if ( ! structTable.lookup( structInst->get_name() ) ) {
+		if ( ! lookupStruct( structInst->get_name() ) ) {
 			debugPrint( "Adding struct " << structInst->get_name() << " from implicit forward declaration" << std::endl );
-			structTable.add( structInst->get_name() );
+			addStruct( structInst->get_name() );
 		}
 		enterScope();
@@ -309,7 +422,7 @@
 
 	void Indexer::visit( UnionInstType *unionInst ) {
-		if ( ! unionTable.lookup( unionInst->get_name() ) ) {
+		if ( ! lookupUnion( unionInst->get_name() ) ) {
 			debugPrint( "Adding union " << unionInst->get_name() << " from implicit forward declaration" << std::endl );
-			unionTable.add( unionInst->get_name() );
+			addUnion( unionInst->get_name() );
 		}
 		enterScope();
@@ -325,90 +438,361 @@
 	}
 
-
-	void Indexer::lookupId( const std::string &id, std::list< DeclarationWithType* > &list ) const {
-		idTable.lookupId( id, list );
-	}
-
-	DeclarationWithType* Indexer::lookupId( const std::string &id) const {
-		return idTable.lookupId(id);
+	
+
+	void Indexer::lookupId( const std::string &id, std::list< DeclarationWithType* > &out ) const {
+		std::unordered_set< std::string > foundMangleNames;
+		
+		Indexer::Impl *searchTables = tables;
+		while ( searchTables ) {
+
+			IdTable::const_iterator decls = searchTables->idTable.find( id );
+			if ( decls != searchTables->idTable.end() ) {
+				const MangleTable &mangleTable = decls->second;
+				for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) {
+					// mark the mangled name as found, skipping this insertion if a declaration for that name has already been found
+					if ( foundMangleNames.insert( decl->first ).second == false ) continue;
+					
+					out.push_back( decl->second );
+				}
+			}
+			
+			// get declarations from base indexers
+			searchTables = searchTables->base.tables;
+		}
 	}
 
 	NamedTypeDecl *Indexer::lookupType( const std::string &id ) const {
-		return typeTable.lookup( id );
+		if ( ! tables ) return 0;
+
+		TypeTable::const_iterator ret = tables->typeTable.find( id );
+		return ret != tables->typeTable.end() ? ret->second : tables->base.lookupType( id );
 	}
 
 	StructDecl *Indexer::lookupStruct( const std::string &id ) const {
-		return structTable.lookup( id );
+		if ( ! tables ) return 0;
+
+		StructTable::const_iterator ret = tables->structTable.find( id );
+		return ret != tables->structTable.end() ? ret->second : tables->base.lookupStruct( id );
 	}
 
 	EnumDecl *Indexer::lookupEnum( const std::string &id ) const {
-		return enumTable.lookup( id );
+		if ( ! tables ) return 0;
+
+		EnumTable::const_iterator ret = tables->enumTable.find( id );
+		return ret != tables->enumTable.end() ? ret->second : tables->base.lookupEnum( id );
 	}
 
 	UnionDecl *Indexer::lookupUnion( const std::string &id ) const {
-		return unionTable.lookup( id );
-	}
-
-	ContextDecl  * Indexer::lookupContext( const std::string &id ) const {
-		return contextTable.lookup( id );
+		if ( ! tables ) return 0;
+
+		UnionTable::const_iterator ret = tables->unionTable.find( id );
+		return ret != tables->unionTable.end() ? ret->second : tables->base.lookupUnion( id );
+	}
+
+	TraitDecl *Indexer::lookupTrait( const std::string &id ) const {
+		if ( ! tables ) return 0;
+
+		TraitTable::const_iterator ret = tables->traitTable.find( id );
+		return ret != tables->traitTable.end() ? ret->second : tables->base.lookupTrait( id );
+	}
+
+	DeclarationWithType *Indexer::lookupIdAtScope( const std::string &id, const std::string &mangleName, unsigned long scope ) const {
+		if ( ! tables ) return 0;
+		if ( tables->scope < scope ) return 0;
+
+		IdTable::const_iterator decls = tables->idTable.find( id );
+		if ( decls != tables->idTable.end() ) {
+			const MangleTable &mangleTable = decls->second;
+			MangleTable::const_iterator decl = mangleTable.find( mangleName );
+			if ( decl != mangleTable.end() ) return decl->second;
+		}
+
+		return tables->base.lookupIdAtScope( id, mangleName, scope );
+	}
+
+	bool Indexer::hasIncompatibleCDecl( const std::string &id, const std::string &mangleName ) const {
+		if ( ! tables ) return false;
+
+		IdTable::const_iterator decls = tables->idTable.find( id );
+		if ( decls != tables->idTable.end() ) {
+			const MangleTable &mangleTable = decls->second;
+			for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) {
+				// check for C decls with the same name, skipping 
+				// those with a compatible type (by mangleName)
+				if ( decl->second->get_linkage() == LinkageSpec::C && decl->first != mangleName ) return true;
+			}
+		}
+
+		return tables->base.hasIncompatibleCDecl( id, mangleName );
+	}
+	
+	NamedTypeDecl *Indexer::lookupTypeAtScope( const std::string &id, unsigned long scope ) const {
+		if ( ! tables ) return 0;
+		if ( tables->scope < scope ) return 0;
+
+		TypeTable::const_iterator ret = tables->typeTable.find( id );
+		return ret != tables->typeTable.end() ? ret->second : tables->base.lookupTypeAtScope( id, scope );
+	}
+	
+	StructDecl *Indexer::lookupStructAtScope( const std::string &id, unsigned long scope ) const {
+		if ( ! tables ) return 0;
+		if ( tables->scope < scope ) return 0;
+
+		StructTable::const_iterator ret = tables->structTable.find( id );
+		return ret != tables->structTable.end() ? ret->second : tables->base.lookupStructAtScope( id, scope );
+	}
+	
+	EnumDecl *Indexer::lookupEnumAtScope( const std::string &id, unsigned long scope ) const {
+		if ( ! tables ) return 0;
+		if ( tables->scope < scope ) return 0;
+
+		EnumTable::const_iterator ret = tables->enumTable.find( id );
+		return ret != tables->enumTable.end() ? ret->second : tables->base.lookupEnumAtScope( id, scope );
+	}
+	
+	UnionDecl *Indexer::lookupUnionAtScope( const std::string &id, unsigned long scope ) const {
+		if ( ! tables ) return 0;
+		if ( tables->scope < scope ) return 0;
+
+		UnionTable::const_iterator ret = tables->unionTable.find( id );
+		return ret != tables->unionTable.end() ? ret->second : tables->base.lookupUnionAtScope( id, scope );
+	}
+	
+	TraitDecl *Indexer::lookupTraitAtScope( const std::string &id, unsigned long scope ) const {
+		if ( ! tables ) return 0;
+		if ( tables->scope < scope ) return 0;
+
+		TraitTable::const_iterator ret = tables->traitTable.find( id );
+		return ret != tables->traitTable.end() ? ret->second : tables->base.lookupTraitAtScope( id, scope );
+	}
+
+	bool addedIdConflicts( DeclarationWithType *existing, DeclarationWithType *added ) {
+		// if we're giving the same name mangling to things of different types then there is something wrong
+		assert( (dynamic_cast<ObjectDecl*>( added ) && dynamic_cast<ObjectDecl*>( existing ) )
+			|| (dynamic_cast<FunctionDecl*>( added ) && dynamic_cast<FunctionDecl*>( existing ) ) );
+
+		if ( LinkageSpec::isOverridable( existing->get_linkage() ) ) {
+			// new definition shadows the autogenerated one, even at the same scope
+			return false;
+		} else if ( added->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( added->get_type(), existing->get_type(), Indexer() ) ) {
+			// typesCompatible doesn't really do the right thing here. When checking compatibility of function types,
+			// we should ignore outermost pointer qualifiers, except _Atomic?
+			FunctionDecl *newentry = dynamic_cast< FunctionDecl* >( added );
+			FunctionDecl *oldentry = dynamic_cast< FunctionDecl* >( existing );
+			if ( newentry && oldentry ) {
+				if ( newentry->get_statements() && oldentry->get_statements() ) {
+					throw SemanticError( "duplicate function definition for ", added );
+				} // if
+			} else {
+				// two objects with the same mangled name defined in the same scope.
+				// both objects must be marked extern or both must be intrinsic for this to be okay
+				// xxx - perhaps it's actually if either is intrinsic then this is okay?
+				//       might also need to be same storage class?
+				ObjectDecl *newobj = dynamic_cast< ObjectDecl* >( added );
+				ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( existing );
+				if ( newobj->get_storageClass() != DeclarationNode::Extern && oldobj->get_storageClass() != DeclarationNode::Extern ) {
+					throw SemanticError( "duplicate object definition for ", added );
+				} // if
+			} // if
+		} else {
+			throw SemanticError( "duplicate definition for ", added );
+		} // if
+
+		return true;
+	}
+	
+	void Indexer::addId( DeclarationWithType *decl ) {
+		makeWritable();
+
+		const std::string &name = decl->get_name();
+		std::string mangleName;
+		if ( LinkageSpec::isOverridable( decl->get_linkage() ) ) {
+			// mangle the name without including the appropriate suffix, so overridable routines are placed into the
+			// same "bucket" as their user defined versions.
+			mangleName = Mangler::mangle( decl, false );
+		} else {
+			mangleName = Mangler::mangle( decl );
+		} // if
+
+		DeclarationWithType *existing = lookupIdAtScope( name, mangleName, scope );
+		if ( ! existing || ! addedIdConflicts( existing, decl ) ) {
+			// this ensures that no two declarations with the same unmangled name both have C linkage
+			if ( decl->get_linkage() == LinkageSpec::C && hasIncompatibleCDecl( name, mangleName ) ) {
+				throw SemanticError( "invalid overload of C function ", decl );
+			} // NOTE this is broken in Richard's original code in such a way that it never triggers (it 
+			  // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 
+			  // have their name as their manglename, hence the error can never trigger).
+			  // The code here is closer to correct, but name mangling would have to be completely 
+			  // isomorphic to C type-compatibility, which it may not be.
+			
+			tables->idTable[ name ][ mangleName ] = decl;
+			++tables->size;
+		}
+	}
+
+	bool addedTypeConflicts( NamedTypeDecl *existing, NamedTypeDecl *added ) {
+		if ( existing->get_base() == 0 ) {
+			return false;
+		} else if ( added->get_base() == 0 ) {
+			return true;
+		} else {
+			throw SemanticError( "redeclaration of ", added );
+		}
+	}
+	
+	void Indexer::addType( NamedTypeDecl *decl ) {
+		makeWritable();
+
+		const std::string &id = decl->get_name();
+		TypeTable::iterator existing = tables->typeTable.find( id );
+		if ( existing == tables->typeTable.end() ) {
+			NamedTypeDecl *parent = tables->base.lookupTypeAtScope( id, scope );
+			if ( ! parent || ! addedTypeConflicts( parent, decl ) ) {
+				tables->typeTable.insert( existing, std::make_pair( id, decl ) );
+				++tables->size;
+			}
+		} else {
+			if ( ! addedTypeConflicts( existing->second, decl ) ) {
+				existing->second = decl;
+			}
+		}
+	}
+
+	bool addedDeclConflicts( AggregateDecl *existing, AggregateDecl *added ) {
+		if ( existing->get_members().empty() ) {
+			return false;
+		} else if ( ! added->get_members().empty() ) {
+			throw SemanticError( "redeclaration of ", added );
+		} // if
+		return true;
+	}
+
+	void Indexer::addStruct( const std::string &id ) {
+		addStruct( new StructDecl( id ) );
+	}
+	
+	void Indexer::addStruct( StructDecl *decl ) {
+		makeWritable();
+
+		const std::string &id = decl->get_name();
+		StructTable::iterator existing = tables->structTable.find( id );
+		if ( existing == tables->structTable.end() ) {
+			StructDecl *parent = tables->base.lookupStructAtScope( id, scope );
+			if ( ! parent || ! addedDeclConflicts( parent, decl ) ) {
+				tables->structTable.insert( existing, std::make_pair( id, decl ) );
+				++tables->size;
+			}
+		} else {
+			if ( ! addedDeclConflicts( existing->second, decl ) ) {
+				existing->second = decl;
+			}
+		}
+	}
+	
+	void Indexer::addEnum( EnumDecl *decl ) {
+		makeWritable();
+
+		const std::string &id = decl->get_name();
+		EnumTable::iterator existing = tables->enumTable.find( id );
+		if ( existing == tables->enumTable.end() ) {
+			EnumDecl *parent = tables->base.lookupEnumAtScope( id, scope );
+			if ( ! parent || ! addedDeclConflicts( parent, decl ) ) {
+				tables->enumTable.insert( existing, std::make_pair( id, decl ) );
+				++tables->size;
+			}
+		} else {
+			if ( ! addedDeclConflicts( existing->second, decl ) ) {
+				existing->second = decl;
+			}
+		}
+	}
+
+	void Indexer::addUnion( const std::string &id ) {
+		addUnion( new UnionDecl( id ) );
+	}
+	
+	void Indexer::addUnion( UnionDecl *decl ) {
+		makeWritable();
+
+		const std::string &id = decl->get_name();
+		UnionTable::iterator existing = tables->unionTable.find( id );
+		if ( existing == tables->unionTable.end() ) {
+			UnionDecl *parent = tables->base.lookupUnionAtScope( id, scope );
+			if ( ! parent || ! addedDeclConflicts( parent, decl ) ) {
+				tables->unionTable.insert( existing, std::make_pair( id, decl ) );
+				++tables->size;
+			}
+		} else {
+			if ( ! addedDeclConflicts( existing->second, decl ) ) {
+				existing->second = decl;
+			}
+		}
+	}
+	
+	void Indexer::addTrait( TraitDecl *decl ) {
+		makeWritable();
+
+		const std::string &id = decl->get_name();
+		TraitTable::iterator existing = tables->traitTable.find( id );
+		if ( existing == tables->traitTable.end() ) {
+			TraitDecl *parent = tables->base.lookupTraitAtScope( id, scope );
+			if ( ! parent || ! addedDeclConflicts( parent, decl ) ) {
+				tables->traitTable.insert( existing, std::make_pair( id, decl ) );
+				++tables->size;
+			}
+		} else {
+			if ( ! addedDeclConflicts( existing->second, decl ) ) {
+				existing->second = decl;
+			}
+		}
 	}
 
 	void Indexer::enterScope() {
+		++scope;
+		
 		if ( doDebug ) {
-			std::cout << "--- Entering scope" << std::endl;
-		}
-		idTable.enterScope();
-		typeTable.enterScope();
-		structTable.enterScope();
-		enumTable.enterScope();
-		unionTable.enterScope();
-		contextTable.enterScope();
+			std::cout << "--- Entering scope " << scope << std::endl;
+		}
 	}
 
 	void Indexer::leaveScope() {
 		using std::cout;
-		using std::endl;
-  
-		if ( doDebug ) {
-			cout << "--- Leaving scope containing" << endl;
-			idTable.dump( cout );
-			typeTable.dump( cout );
-			structTable.dump( cout );
-			enumTable.dump( cout );
-			unionTable.dump( cout );
-			contextTable.dump( cout );
-		}
-		idTable.leaveScope();
-		typeTable.leaveScope();
-		structTable.leaveScope();
-		enumTable.leaveScope();
-		unionTable.leaveScope();
-		contextTable.leaveScope();
+
+		assert( scope > 0 && "cannot leave initial scope" );
+		--scope;
+
+		while ( tables && tables->scope > scope ) {
+			if ( doDebug ) {
+				cout << "--- Leaving scope " << tables->scope << " containing" << std::endl;
+				dump( tables->idTable, cout );
+				dump( tables->typeTable, cout );
+				dump( tables->structTable, cout );
+				dump( tables->enumTable, cout );
+				dump( tables->unionTable, cout );
+				dump( tables->traitTable, cout );
+			}
+
+			// swap tables for base table until we find one at an appropriate scope
+			Indexer::Impl *base = newRef( tables->base.tables );
+			deleteRef( tables );
+			tables = base;
+		}
 	}
 
 	void Indexer::print( std::ostream &os, int indent ) const {
 	    using std::cerr;
-	    using std::endl;
-
-	    cerr << "===idTable===" << endl;
-	    idTable.dump( os );
-	    cerr << "===typeTable===" << endl;
-	    typeTable.dump( os );
-	    cerr << "===structTable===" << endl;
-	    structTable.dump( os );
-	    cerr << "===enumTable===" << endl;
-	    enumTable.dump( os );
-	    cerr << "===unionTable===" << endl;
-	    unionTable.dump( os );
-	    cerr << "===contextTable===" << endl;
-	    contextTable.dump( os );
-#if 0
-		idTable.dump( os );
-		typeTable.dump( os );
-		structTable.dump( os );
-		enumTable.dump( os );
-		unionTable.dump( os );
-		contextTable.dump( os );
-#endif
+
+	    cerr << "===idTable===" << std::endl;
+	    if ( tables ) dump( tables->idTable, os );
+	    cerr << "===typeTable===" << std::endl;
+	    if ( tables ) dump( tables->typeTable, os );
+	    cerr << "===structTable===" << std::endl;
+	    if ( tables ) dump( tables->structTable, os );
+	    cerr << "===enumTable===" << std::endl;
+	    if ( tables ) dump( tables->enumTable, os );
+	    cerr << "===unionTable===" << std::endl;
+	    if ( tables ) dump( tables->unionTable, os );
+	    cerr << "===contextTable===" << std::endl;
+	    if ( tables ) dump( tables->traitTable, os );
 	}
 } // namespace SymTab
Index: src/SymTab/Indexer.h
===================================================================
--- src/SymTab/Indexer.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/Indexer.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:38:55 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Thu Sep 17 16:05:38 2015
-// Update Count     : 5
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:34:14 2016
+// Update Count     : 6
 //
 
@@ -21,7 +21,4 @@
 
 #include "SynTree/Visitor.h"
-#include "IdTable.h"
-#include "AggregateTable.h"
-#include "TypeTable.h"
 
 namespace SymTab {
@@ -29,5 +26,10 @@
 	  public:
 		Indexer( bool useDebug = false );
+
+		Indexer( const Indexer &that );
+		Indexer( Indexer &&that );
 		virtual ~Indexer();
+		Indexer& operator= ( const Indexer &that );
+		Indexer& operator= ( Indexer &&that );
 
 		//using Visitor::visit;
@@ -39,5 +41,5 @@
 		virtual void visit( UnionDecl *aggregateDecl );
 		virtual void visit( EnumDecl *aggregateDecl );
-		virtual void visit( ContextDecl *aggregateDecl );
+		virtual void visit( TraitDecl *aggregateDecl );
 
 		virtual void visit( CompoundStmt *compoundStmt );
@@ -57,4 +59,5 @@
 		virtual void visit( UntypedOffsetofExpr *offsetofExpr );
 		virtual void visit( OffsetofExpr *offsetofExpr );
+		virtual void visit( OffsetPackExpr *offsetPackExpr );
 		virtual void visit( AttrExpr *attrExpr );
 		virtual void visit( LogicalExpr *logicalExpr );
@@ -67,5 +70,5 @@
 		virtual void visit( UntypedValofExpr *valofExpr );
 
-		virtual void visit( ContextInstType *contextInst );
+		virtual void visit( TraitInstType *contextInst );
 		virtual void visit( StructInstType *contextInst );
 		virtual void visit( UnionInstType *contextInst );
@@ -78,22 +81,51 @@
 		void leaveScope();
 
-		void lookupId( const std::string &id, std::list< DeclarationWithType* >& ) const;
-		DeclarationWithType* lookupId( const std::string &id) const;
+		/// Gets all declarations with the given ID
+		void lookupId( const std::string &id, std::list< DeclarationWithType* > &out ) const;
+		/// Gets the top-most type declaration with the given ID
 		NamedTypeDecl *lookupType( const std::string &id ) const;
+		/// Gets the top-most struct declaration with the given ID
 		StructDecl *lookupStruct( const std::string &id ) const;
+		/// Gets the top-most enum declaration with the given ID
 		EnumDecl *lookupEnum( const std::string &id ) const;
+		/// Gets the top-most union declaration with the given ID
 		UnionDecl *lookupUnion( const std::string &id ) const;
-		ContextDecl *lookupContext( const std::string &id ) const;
+		/// Gets the top-most trait declaration with the given ID
+		TraitDecl *lookupTrait( const std::string &id ) const;
   
 		void print( std::ostream &os, int indent = 0 ) const;
 	  private:
-		IdTable idTable;
-		TypeTable typeTable;
-		StructTable structTable;
-		EnumTable enumTable;
-		UnionTable unionTable;
-		ContextTable contextTable;
-  
-		bool doDebug;					// display debugging trace
+		/// looks up a specific mangled ID at the given scope
+		DeclarationWithType *lookupIdAtScope( const std::string &id, const std::string &mangleName, unsigned long scope ) const;
+		/// returns true if there exists a declaration with C linkage and the given name with a different mangled name
+		bool hasIncompatibleCDecl( const std::string &id, const std::string &mangleName ) const;
+		// equivalents to lookup functions that only look at tables at scope `scope` (which should be >= tables->scope)
+		NamedTypeDecl *lookupTypeAtScope( const std::string &id, unsigned long scope ) const;
+		StructDecl *lookupStructAtScope( const std::string &id, unsigned long scope ) const;
+		EnumDecl *lookupEnumAtScope( const std::string &id, unsigned long scope ) const;
+		UnionDecl *lookupUnionAtScope( const std::string &id, unsigned long scope ) const;
+		TraitDecl *lookupTraitAtScope( const std::string &id, unsigned long scope ) const;
+		
+		void addId( DeclarationWithType *decl );
+		void addType( NamedTypeDecl *decl );
+		void addStruct( const std::string &id );
+		void addStruct( StructDecl *decl );
+		void addEnum( EnumDecl *decl );
+		void addUnion( const std::string &id );
+		void addUnion( UnionDecl *decl );
+		void addTrait( TraitDecl *decl );
+		
+		struct Impl;
+		Impl *tables;         ///< Copy-on-write instance of table data structure
+		unsigned long scope;  ///< Scope index of this pointer
+		bool doDebug;         ///< Display debugging trace?
+
+		/// Takes a new ref to a table (returns null if null)
+		static Impl *newRef( Impl *toClone );
+		/// Clears a ref to a table (does nothing if null)
+		static void deleteRef( Impl *toFree );
+
+		/// Ensures that tables variable is writable (i.e. allocated, uniquely owned by this Indexer, and at the current scope)
+		void makeWritable();
 	};
 } // namespace SymTab
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/Mangler.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -224,4 +224,9 @@
 		acceptAll( tupleType->get_types(), *this );
 		mangleName << "_";
+	}
+
+	void Mangler::visit( VarArgsType *varArgsType ) {
+		printQualifiers( varArgsType );
+		mangleName << "VARGS";
 	}
 
Index: src/SymTab/Mangler.h
===================================================================
--- src/SymTab/Mangler.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/Mangler.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -45,4 +45,5 @@
 		virtual void visit( TypeInstType *aggregateUseType );
 		virtual void visit( TupleType *tupleType );
+		virtual void visit( VarArgsType *varArgsType );
   
 		std::string get_mangleName() { return mangleName.str(); }
Index: c/SymTab/StackTable.cc
===================================================================
--- src/SymTab/StackTable.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,84 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// StackTable.cc -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Sun May 17 21:45:15 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 16:51:53 2015
-// Update Count     : 3
-//
-
-#include <cassert>
-
-#include "StackTable.h"
-
-namespace SymTab {
-	template< typename Element, typename ConflictFunction >
-	StackTable< Element, ConflictFunction >::StackTable() : scopeLevel( 0 ) {
-	}
-
-	template< typename Element, typename ConflictFunction >
-	void StackTable< Element, ConflictFunction >::enterScope() {
-		scopeLevel++;
-	}
-
-	template< typename Element, typename ConflictFunction >
-	void StackTable< Element, ConflictFunction >::leaveScope() {
-		for ( typename TableType::iterator it = table.begin(); it != table.end(); ++it ) {
-			std::stack< Entry >& entry = it->second;
-			if ( ! entry.empty() && entry.top().second == scopeLevel ) {
-				entry.pop();
-			} // if
-		} // for
-		scopeLevel--;
-		assert( scopeLevel >= 0 );
-	}
-
-	template< typename Element, typename ConflictFunction >
-	void StackTable< Element, ConflictFunction >::add( Element *type ) {
-		std::stack< Entry >& entry = table[ type->get_name() ];
-		if ( ! entry.empty() && entry.top().second == scopeLevel ) {
-			entry.top().first = conflictFunction( entry.top().first, type );
-		} else {
-			entry.push( Entry( type, scopeLevel ) );
-		} // if
-	}
-
-	template< typename Element, typename ConflictFunction >
-	void StackTable< Element, ConflictFunction >::add( std::string fwdDeclName ) {
-		add( new Element( fwdDeclName ) );
-	}
-
-	template< typename Element, typename ConflictFunction >
-	Element *StackTable< Element, ConflictFunction >::lookup( std::string id ) const {
-		typename TableType::const_iterator it = table.find( id );
-		if ( it == table.end() ) {
-			return 0;
-		} else if ( ! it->second.empty() ) {
-			return it->second.top().first;
-		} else {
-			return 0;
-		} // if
-	}
-
-	template< typename Element, typename ConflictFunction >
-	void StackTable< Element, ConflictFunction >::dump( std::ostream &os ) const {
-		for ( typename TableType::const_iterator it = table.begin(); it != table.end(); ++it ) {
-			const std::stack< Entry >& entry = it->second;
-			if ( ! entry.empty() && entry.top().second == scopeLevel ) {
-				os << it->first << std::endl;
-			} // if
-		} // for
-	}
-} // namespace SymTab
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/SymTab/StackTable.h
===================================================================
--- src/SymTab/StackTable.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,55 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// StackTable.h -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Sun May 17 21:47:10 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 16:50:36 2015
-// Update Count     : 4
-//
-
-#ifndef STACKTABLE_H
-#define STACKTABLE_H
-
-#include <map>
-#include <stack>
-#include <string>
-#include <functional>
-
-namespace SymTab {
-	template< typename Element, typename ConflictFunction >
-	class StackTable {
-	  public:
-		StackTable();
-
-		void enterScope();
-		void leaveScope();
-		void add( Element *type );
-		void add( std::string fwdDeclName );
-		Element *lookup( std::string id ) const;
-
-		void dump( std::ostream &os ) const;			// debugging
-	  private:
-		typedef std::pair< Element*, int > Entry;
-		typedef std::map< std::string, std::stack< Entry > > TableType;
-  
-		ConflictFunction conflictFunction;
-		TableType table;
-		int scopeLevel;
-	};
-} // SymTab
-
-#include "StackTable.cc"
-
-#endif // STACKTABLE_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SymTab/TypeEquality.cc
===================================================================
--- src/SymTab/TypeEquality.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/TypeEquality.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -41,4 +41,5 @@
 		virtual void visit( EnumInstType *enumInst );
 		virtual void visit( TypeInstType *typeInst );
+		virtual void visit( VarArgsType *varArgsType );
 
 		void handleQualifiers( Type * t );
@@ -191,3 +192,10 @@
 		}
 	}
+
+	void TypeEquality::visit( VarArgsType *varArgsType ) {
+		handleQualifiers( varArgsType );
+		if ( ! dynamic_cast< VarArgsType * >( other ) ) {
+			result = false;
+		}
+	}
 } // namespace SymTab
Index: c/SymTab/TypeTable.h
===================================================================
--- src/SymTab/TypeTable.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,53 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// TypeTable.h -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Sun May 17 21:48:32 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue May 19 16:50:25 2015
-// Update Count     : 3
-//
-
-#ifndef TYPETABLE_H
-#define TYPETABLE_H
-
-#include <cassert>
-#include <map>
-#include <stack>
-#include <string>
-#include <functional>
-
-#include "StackTable.h"
-#include "SynTree/Declaration.h"
-
-namespace SymTab {
-	class TypeTableConflictFunction : public std::binary_function< NamedTypeDecl *, NamedTypeDecl *, NamedTypeDecl * > {
-	  public:
-		NamedTypeDecl *operator()( NamedTypeDecl *existing, NamedTypeDecl *added ) {
-			if ( existing->get_base() == 0 ) {
-				return added;
-			} else if ( added->get_base() == 0 ) {
-				return existing;
-			} else {
-				throw SemanticError( "redeclaration of ", added );
-			} // if
-			assert( false );
-			return 0;
-		}
-	};
-
-	typedef StackTable< NamedTypeDecl, TypeTableConflictFunction > TypeTable;
-} // namespace SymTab
-
-#endif // TYPETABLE_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/Validate.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 21:50:04 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 27 22:03:12 2016
-// Update Count     : 225
+// Last Modified On : Wed Apr 13 16:39:30 2016
+// Update Count     : 251
 //
 
@@ -40,8 +40,11 @@
 #include <list>
 #include <iterator>
+#include "Common/utility.h"
+#include "Common/UniqueName.h"
 #include "Validate.h"
 #include "SynTree/Visitor.h"
 #include "SynTree/Mutator.h"
 #include "SynTree/Type.h"
+#include "SynTree/Expression.h"
 #include "SynTree/Statement.h"
 #include "SynTree/TypeSubstitution.h"
@@ -49,6 +52,5 @@
 #include "FixFunction.h"
 // #include "ImplementationType.h"
-#include "Common/utility.h"
-#include "Common/UniqueName.h"
+#include "GenPoly/DeclMutator.h"
 #include "AddVisit.h"
 #include "MakeLibCfa.h"
@@ -70,11 +72,7 @@
 
 		virtual void visit( CompoundStmt *compoundStmt );
-		virtual void visit( IfStmt *ifStmt );
-		virtual void visit( WhileStmt *whileStmt );
-		virtual void visit( ForStmt *forStmt );
 		virtual void visit( SwitchStmt *switchStmt );
 		virtual void visit( ChooseStmt *chooseStmt );
-		virtual void visit( CaseStmt *caseStmt );
-		virtual void visit( CatchStmt *catchStmt );
+		// virtual void visit( CaseStmt *caseStmt );
 	  private:
 		HoistStruct();
@@ -101,5 +99,5 @@
 		virtual void visit( StructInstType *structInst );
 		virtual void visit( UnionInstType *unionInst );
-		virtual void visit( ContextInstType *contextInst );
+		virtual void visit( TraitInstType *contextInst );
 		virtual void visit( StructDecl *structDecl );
 		virtual void visit( UnionDecl *unionDecl );
@@ -137,5 +135,5 @@
 		virtual void visit( UnionDecl *structDecl );
 		virtual void visit( TypeDecl *typeDecl );
-		virtual void visit( ContextDecl *ctxDecl );
+		virtual void visit( TraitDecl *ctxDecl );
 		virtual void visit( FunctionDecl *functionDecl );
 
@@ -144,11 +142,7 @@
 
 		virtual void visit( CompoundStmt *compoundStmt );
-		virtual void visit( IfStmt *ifStmt );
-		virtual void visit( WhileStmt *whileStmt );
-		virtual void visit( ForStmt *forStmt );
 		virtual void visit( SwitchStmt *switchStmt );
 		virtual void visit( ChooseStmt *chooseStmt );
-		virtual void visit( CaseStmt *caseStmt );
-		virtual void visit( CatchStmt *catchStmt );
+		// virtual void visit( CaseStmt *caseStmt );
 
 		AutogenerateRoutines() : functionNesting( 0 ) {}
@@ -166,5 +160,4 @@
 		/// and return something if the return type is non-void.
 		static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
-
 	  private:
 		virtual void visit( FunctionDecl * functionDecl );
@@ -192,9 +185,12 @@
 		virtual Declaration *mutate( UnionDecl * unionDecl );
 		virtual Declaration *mutate( EnumDecl * enumDecl );
-		virtual Declaration *mutate( ContextDecl * contextDecl );
+		virtual Declaration *mutate( TraitDecl * contextDecl );
 
 		template<typename AggDecl>
 		AggDecl *handleAggregate( AggDecl * aggDecl );
 
+		template<typename AggDecl>
+		void addImplicitTypedef( AggDecl * aggDecl );
+		
 		typedef std::map< std::string, std::pair< TypedefDecl *, int > > TypedefMap;
 		TypedefMap typedefNames;
@@ -202,8 +198,17 @@
 	};
 
+	class CompoundLiteral : public GenPoly::DeclMutator {
+		DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass;
+
+		virtual DeclarationWithType * mutate( ObjectDecl *objectDecl );
+		virtual Expression *mutate( CompoundLiteralExpr *compLitExpr );
+	};
+
 	void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
 		Pass1 pass1;
 		Pass2 pass2( doDebug, 0 );
 		Pass3 pass3( 0 );
+		CompoundLiteral compoundliteral;
+
 		EliminateTypedef::eliminateTypedef( translationUnit );
 		HoistStruct::hoistStruct( translationUnit );
@@ -211,4 +216,5 @@
 		acceptAll( translationUnit, pass2 );
 		ReturnChecker::checkFunctionReturns( translationUnit );
+		mutateAll( translationUnit, compoundliteral );
 		AutogenerateRoutines::autogenerateRoutines( translationUnit );
 		acceptAll( translationUnit, pass3 );
@@ -292,16 +298,4 @@
 	}
 
-	void HoistStruct::visit( IfStmt *ifStmt ) {
-		addVisit( ifStmt, *this );
-	}
-
-	void HoistStruct::visit( WhileStmt *whileStmt ) {
-		addVisit( whileStmt, *this );
-	}
-
-	void HoistStruct::visit( ForStmt *forStmt ) {
-		addVisit( forStmt, *this );
-	}
-
 	void HoistStruct::visit( SwitchStmt *switchStmt ) {
 		addVisit( switchStmt, *this );
@@ -312,11 +306,7 @@
 	}
 
-	void HoistStruct::visit( CaseStmt *caseStmt ) {
-		addVisit( caseStmt, *this );
-	}
-
-	void HoistStruct::visit( CatchStmt *cathStmt ) {
-		addVisit( cathStmt, *this );
-	}
+	// void HoistStruct::visit( CaseStmt *caseStmt ) {
+	// 	addVisit( caseStmt, *this );
+	// }
 
 	void Pass1::visit( EnumDecl *enumDecl ) {
@@ -404,7 +394,7 @@
 	}
 
-	void Pass2::visit( ContextInstType *contextInst ) {
+	void Pass2::visit( TraitInstType *contextInst ) {
 		Parent::visit( contextInst );
-		ContextDecl *ctx = indexer->lookupContext( contextInst->get_name() );
+		TraitDecl *ctx = indexer->lookupTrait( contextInst->get_name() );
 		if ( ! ctx ) {
 			throw SemanticError( "use of undeclared context " + contextInst->get_name() );
@@ -412,5 +402,5 @@
 		for ( std::list< TypeDecl * >::const_iterator i = ctx->get_parameters().begin(); i != ctx->get_parameters().end(); ++i ) {
 			for ( std::list< DeclarationWithType * >::const_iterator assert = (*i )->get_assertions().begin(); assert != (*i )->get_assertions().end(); ++assert ) {
-				if ( ContextInstType *otherCtx = dynamic_cast< ContextInstType * >(*assert ) ) {
+				if ( TraitInstType *otherCtx = dynamic_cast< TraitInstType * >(*assert ) ) {
 					cloneAll( otherCtx->get_members(), contextInst->get_members() );
 				} else {
@@ -476,5 +466,5 @@
 			while ( ! toBeDone.empty() ) {
 				for ( std::list< DeclarationWithType * >::iterator assertion = toBeDone.begin(); assertion != toBeDone.end(); ++assertion ) {
-					if ( ContextInstType *ctx = dynamic_cast< ContextInstType * >( (*assertion )->get_type() ) ) {
+					if ( TraitInstType *ctx = dynamic_cast< TraitInstType * >( (*assertion )->get_type() ) ) {
 						for ( std::list< Declaration * >::const_iterator i = ctx->get_members().begin(); i != ctx->get_members().end(); ++i ) {
 							DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *i );
@@ -851,5 +841,5 @@
 	}
 
-	void AutogenerateRoutines::visit( ContextDecl *) {
+	void AutogenerateRoutines::visit( TraitDecl *) {
 		// ensure that we don't add assignment ops for types defined as part of the context
 	}
@@ -874,16 +864,4 @@
 	}
 
-	void AutogenerateRoutines::visit( IfStmt *ifStmt ) {
-		visitStatement( ifStmt );
-	}
-
-	void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {
-		visitStatement( whileStmt );
-	}
-
-	void AutogenerateRoutines::visit( ForStmt *forStmt ) {
-		visitStatement( forStmt );
-	}
-
 	void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {
 		visitStatement( switchStmt );
@@ -894,11 +872,7 @@
 	}
 
-	void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
-		visitStatement( caseStmt );
-	}
-
-	void AutogenerateRoutines::visit( CatchStmt *cathStmt ) {
-		visitStatement( cathStmt );
-	}
+	// void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
+	// 	visitStatement( caseStmt );
+	// }
 
 	void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) {
@@ -1043,7 +1017,6 @@
 	}
 
-	// there may be typedefs nested within aggregates
-	// in order for everything to work properly, these
-	// should be removed as well
+	// there may be typedefs nested within aggregates in order for everything to work properly, these should be removed
+	// as well
 	template<typename AggDecl>
 	AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
@@ -1059,6 +1032,22 @@
 		return aggDecl;
 	}
-
+	
+	template<typename AggDecl>
+	void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) {
+		if ( typedefNames.count( aggDecl->get_name() ) == 0 ) {
+			Type *type;
+			if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) {
+				type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() );
+			} else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( aggDecl ) ) {
+				type = new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() );
+			} else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( aggDecl )  ) {
+				type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
+			} // if
+			TypedefDecl * tyDecl = new TypedefDecl( aggDecl->get_name(), DeclarationNode::NoStorageClass, type );
+			typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
+		} // if
+	}
 	Declaration *EliminateTypedef::mutate( StructDecl * structDecl ) {
+		addImplicitTypedef( structDecl );
 		Mutator::mutate( structDecl );
 		return handleAggregate( structDecl );
@@ -1066,4 +1055,5 @@
 
 	Declaration *EliminateTypedef::mutate( UnionDecl * unionDecl ) {
+		addImplicitTypedef( unionDecl );
 		Mutator::mutate( unionDecl );
 		return handleAggregate( unionDecl );
@@ -1071,13 +1061,34 @@
 
 	Declaration *EliminateTypedef::mutate( EnumDecl * enumDecl ) {
+		addImplicitTypedef( enumDecl );
 		Mutator::mutate( enumDecl );
 		return handleAggregate( enumDecl );
 	}
 
-		Declaration *EliminateTypedef::mutate( ContextDecl * contextDecl ) {
+	Declaration *EliminateTypedef::mutate( TraitDecl * contextDecl ) {
 		Mutator::mutate( contextDecl );
 		return handleAggregate( contextDecl );
 	}
 
+	DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {
+		storageclass = objectDecl->get_storageClass();
+		DeclarationWithType * temp = Mutator::mutate( objectDecl );
+		storageclass = DeclarationNode::NoStorageClass;
+		return temp;
+	}
+
+	Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) {
+		// transform [storage_class] ... (struct S){ 3, ... };
+		// into [storage_class] struct S temp =  { 3, ... };
+		static UniqueName indexName( "_compLit" );
+
+		ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() );
+		compLitExpr->set_type( 0 );
+		compLitExpr->set_initializer( 0 );
+		delete compLitExpr;
+		DeclarationWithType * newtempvar = mutate( tempvar );
+		addDeclaration( newtempvar );					// add modified temporary to current block
+		return new VariableExpr( newtempvar );
+	}
 } // namespace SymTab
 
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SymTab/module.mk	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -15,6 +15,5 @@
 ###############################################################################
 
-SRC += SymTab/IdTable.cc \
-       SymTab/Indexer.cc \
+SRC += SymTab/Indexer.cc \
        SymTab/Mangler.cc \
        SymTab/Validate.cc \
Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/AggregateDecl.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 23:56:39 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 13 08:12:49 2015
-// Update Count     : 6
+// Last Modified On : Wed Mar  2 17:28:00 2016
+// Update Count     : 7
 //
 
@@ -64,5 +64,5 @@
 std::string EnumDecl::typeString() const { return "enum"; }
 
-std::string ContextDecl::typeString() const { return "context"; }
+std::string TraitDecl::typeString() const { return "context"; }
 
 // Local Variables: //
Index: c/SynTree/CodeGenVisitor.cc
===================================================================
--- src/SynTree/CodeGenVisitor.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,59 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// CodeGenVisitor.cc -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 07:57:51 2015
-// Update Count     : 3
-//
-
-#include <iostream>
-#include <list>
-
-#include "Statement.h"
-#include "Expression.h"
-#include "CodeGenVisitor.h"
-using namespace std;
-
-void CodeGenVisitor::visit( Type *type ) { }
-void CodeGenVisitor::visit( BasicType *basicType ) { }
-
-void CodeGenVisitor::visit( Constant *constant ) { 
-	cout << constant->get_value() << endl;
-}
-
-void CodeGenVisitor::visit( Expression *expr ) { }
-
-void CodeGenVisitor::visit( ConstantExpr *cnst ) {
-	if ( cnst != 0 )
-		visit(cnst->get_constant());
-}
-
-void CodeGenVisitor::visit( Statement *stmt ) { }
-
-void CodeGenVisitor::visit( ExprStmt *exprStmt ) {
-	if ( exprStmt != 0 )
-		exprStmt->get_expr()->accept( *this );			// visit(exprStmt->get_expr()) doesn't work
-}
-
-void CodeGenVisitor::visit( SwitchStmt *switchStmt ) {
-	cout << "switch (" << endl;	    
-	// visit(switchStmt->get_condition());   // why doesn't this work?
-	switchStmt->get_condition()->accept(*this);
-
-	cout << ") {" << endl;	
-	// visit(switchStmt->get_body());  // why doesn't this work?
-	cout << "}" << endl;	
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/SynTree/CodeGenVisitor.h
===================================================================
--- src/SynTree/CodeGenVisitor.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,45 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// CodeGenVisitor.h -- 
-//
-// Author           : Richard C. Bilson
-// Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 08:46:47 2015
-// Update Count     : 4
-//
-
-#ifndef CODEGENV_H
-#define CODEGENV_H
-
-#include <typeinfo>
-
-#include "SynTree.h"
-#include "Visitor.h"
-
-class CodeGenVisitor : public Visitor {
-  public:
-	virtual void visit( Type * );
-	virtual void visit( BasicType * );
-
-	virtual void visit( Constant * );
-
-	virtual void visit( Expression * );
-	virtual void visit( ConstantExpr * );
-
-	virtual void visit( Statement * );
-	virtual void visit( ExprStmt * );
-	virtual void visit( SwitchStmt * );
-};
-
-#endif // CODEGENV_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Constant.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -16,4 +16,5 @@
 #include <iostream>
 #include <list>
+#include <string>
 
 #include "Constant.h"
@@ -28,4 +29,16 @@
 
 Constant::~Constant() { delete type; }
+
+Constant Constant::from( int i ) {
+	return Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), std::to_string( i ) );
+}
+
+Constant Constant::from( unsigned long i ) {
+	return Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), std::to_string( i ) );
+}
+
+Constant Constant::from( double d ) {
+	return Constant( new BasicType( Type::Qualifiers(), BasicType::Double ), std::to_string( d ) );
+}
 
 Constant *Constant::clone() const { assert( false ); return 0; }
Index: src/SynTree/Constant.h
===================================================================
--- src/SynTree/Constant.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Constant.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -32,4 +32,11 @@
 	void set_value( std::string newValue ) { value = newValue; }
 
+	/// generates an integer constant of the given int
+	static Constant from( int i );
+	/// generates an integer constant of the given unsigned long int
+	static Constant from( unsigned long i );
+	/// generates a floating point constant of the given double
+	static Constant from( double d );
+
 	virtual Constant *clone() const;
 	virtual void accept( Visitor &v ) { v.visit( this ); }
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Declaration.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Dec 09 14:08:22 2015
-// Update Count     : 32
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:28:11 2016
+// Update Count     : 33
 //
 
@@ -246,11 +246,11 @@
 };
 
-class ContextDecl : public AggregateDecl {
-	typedef AggregateDecl Parent;
-  public:
-	ContextDecl( const std::string &name ) : Parent( name ) {}
-	ContextDecl( const ContextDecl &other ) : Parent( other ) {}
-
-	virtual ContextDecl *clone() const { return new ContextDecl( *this ); }
+class TraitDecl : public AggregateDecl {
+	typedef AggregateDecl Parent;
+  public:
+	TraitDecl( const std::string &name ) : Parent( name ) {}
+	TraitDecl( const TraitDecl &other ) : Parent( other ) {}
+
+	virtual TraitDecl *clone() const { return new TraitDecl( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Declaration *acceptMutator( Mutator &m ) { return m.mutate( this ); }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Expression.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -5,11 +5,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Expression.cc -- 
+// Expression.cc --
 //
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Dec 09 14:10:29 2015
-// Update Count     : 34
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Apr  8 17:16:23 2016
+// Update Count     : 40
 //
 
@@ -22,4 +22,5 @@
 
 #include "Type.h"
+#include "Initializer.h"
 #include "Expression.h"
 #include "Declaration.h"
@@ -211,4 +212,25 @@
 
 	os << " of ";
+
+	if ( type ) {
+		type->print(os, indent + 2);
+	} else {
+		os << "<NULL>";
+	}
+
+	os << std::endl;
+	Expression::print( os, indent );
+}
+
+OffsetPackExpr::OffsetPackExpr( StructInstType *type_, Expression *aname_ ) : Expression( aname_ ), type( type_ ) {
+	add_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) );
+}
+
+OffsetPackExpr::OffsetPackExpr( const OffsetPackExpr &other ) : Expression( other ), type( maybeClone( other.type ) ) {}
+
+OffsetPackExpr::~OffsetPackExpr() { delete type; }
+
+void OffsetPackExpr::print( std::ostream &os, int indent ) const {
+	os << std::string( indent, ' ' ) << "Offset pack expression on ";
 
 	if ( type ) {
@@ -422,4 +444,7 @@
 }
 
+AsmExpr::AsmExpr( const AsmExpr & other ) : inout( maybeClone( other.inout ) ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
+
+
 void AsmExpr::print( std::ostream &os, int indent ) const {
 	os << "Asm Expression: " << std::endl;
@@ -429,4 +454,8 @@
 }
 
+UntypedValofExpr::UntypedValofExpr( const UntypedValofExpr & other ) : Expression( other ), body ( maybeClone( other.body ) ) {}
+
+UntypedValofExpr::~UntypedValofExpr() { delete body; }
+
 void UntypedValofExpr::print( std::ostream &os, int indent ) const {
 	os << std::string( indent, ' ' ) << "Valof Expression: " << std::endl;
@@ -434,4 +463,23 @@
 		get_body()->print( os, indent + 2 );
 }
+
+
+CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
+	add_result( type->clone() );
+}
+
+CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}
+
+CompoundLiteralExpr::~CompoundLiteralExpr() {
+	delete initializer;
+	delete type;
+}
+
+void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {
+	os << "Compound Literal Expression: " << std::endl;
+	if ( type ) type->print( os, indent + 2 );
+	if ( initializer ) initializer->print( os, indent + 2 );
+}
+
 
 std::ostream & operator<<( std::ostream & out, Expression * expr ) {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Expression.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -5,11 +5,11 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Expression.h -- 
+// Expression.h --
 //
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Dec 09 14:10:21 2015
-// Update Count     : 19
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Apr  8 17:18:06 2016
+// Update Count     : 21
 //
 
@@ -155,8 +155,9 @@
 };
 
+// xxx - this doesn't appear to actually be hooked in anywhere. We should use this instead of the "&&"" UntypedExpr hack
 class LabelAddressExpr : public Expression {
   public:
 	LabelAddressExpr( Expression *arg );
-	LabelAddressExpr( const AddressExpr &other );
+	LabelAddressExpr( const LabelAddressExpr &other );
 	virtual ~LabelAddressExpr();
 
@@ -251,5 +252,5 @@
 };
 
-/// ConstantExpr represents an expression that simply refers to the value of a constant 
+/// ConstantExpr represents an expression that simply refers to the value of a constant
 class ConstantExpr : public Expression {
   public:
@@ -359,4 +360,24 @@
 	Type *type;
 	DeclarationWithType *member;
+};
+
+/// Expression representing a pack of field-offsets for a generic type
+class OffsetPackExpr : public Expression {
+public:
+	OffsetPackExpr( StructInstType *type_, Expression *aname_ = 0 );
+	OffsetPackExpr( const OffsetPackExpr &other );
+	virtual ~OffsetPackExpr();
+
+	StructInstType *get_type() const { return type; }
+	void set_type( StructInstType *newValue ) { type = newValue; }
+
+	virtual OffsetPackExpr *clone() const { return new OffsetPackExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+
+private:
+	StructInstType *type;
 };
 
@@ -515,4 +536,5 @@
   public:
 	AsmExpr( Expression *inout, ConstantExpr *constraint, Expression *operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
+	AsmExpr( const AsmExpr & other );
 	virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
 
@@ -541,5 +563,6 @@
   public:
 	UntypedValofExpr( Statement *_body, Expression *_aname = 0 ) : Expression( _aname ), body ( _body ) {}
-	virtual ~UntypedValofExpr() {}
+	UntypedValofExpr( const UntypedValofExpr & other );
+	virtual ~UntypedValofExpr();
 
 	Expression *get_value();
@@ -552,4 +575,26 @@
   private:
 	Statement *body;
+};
+
+/// CompoundLiteralExpr represents a C99 'compound literal'
+class CompoundLiteralExpr : public Expression {
+  public:
+	CompoundLiteralExpr( Type * type, Initializer * initializer );
+	CompoundLiteralExpr( const CompoundLiteralExpr &other );
+	~CompoundLiteralExpr();
+
+	Type * get_type() const { return type; }
+	void set_type( Type * t ) { type = t; }
+
+	Initializer * get_initializer() const { return initializer; }
+	void set_initializer( Initializer * i ) { initializer = i; }
+
+	virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	Type * type;
+	Initializer * initializer;
 };
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Mutator.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 25 19:21:33 2015
-// Update Count     : 11
+// Last Modified On : Fri Apr  1 18:05:16 2016
+// Update Count     : 16
 //
 
@@ -63,5 +63,5 @@
 }
 
-Declaration *Mutator::mutate( ContextDecl *aggregateDecl ) {
+Declaration *Mutator::mutate( TraitDecl *aggregateDecl ) {
 	handleAggregateDecl( aggregateDecl );
 	return aggregateDecl;
@@ -274,4 +274,10 @@
 }
 
+Expression *Mutator::mutate( OffsetPackExpr *offsetPackExpr ) {
+	mutateAll( offsetPackExpr->get_results(), *this );
+	offsetPackExpr->set_type( maybeMutate( offsetPackExpr->get_type(), *this ) );
+	return offsetPackExpr;
+}
+
 Expression *Mutator::mutate( AttrExpr *attrExpr ) {
 	mutateAll( attrExpr->get_results(), *this );
@@ -336,4 +342,11 @@
 }
 
+Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) {
+	mutateAll( compLitExpr->get_results(), *this );
+	compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) );
+	compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );
+	return compLitExpr;
+}
+
 Type *Mutator::mutate( VoidType *voidType ) {
 	mutateAll( voidType->get_forall(), *this );
@@ -387,5 +400,5 @@
 }
 
-Type *Mutator::mutate( ContextInstType *aggregateUseType ) {
+Type *Mutator::mutate( TraitInstType *aggregateUseType ) {
 	handleReferenceToType( aggregateUseType );
 	mutateAll( aggregateUseType->get_members(), *this );
@@ -421,4 +434,9 @@
 }
 
+Type *Mutator::mutate( VarArgsType *varArgsType ) {
+	mutateAll( varArgsType->get_forall(), *this );
+	return varArgsType;
+}
+
 Initializer *Mutator::mutate( SingleInit *singleInit ) {
 	singleInit->set_value( singleInit->get_value()->acceptMutator( *this ) );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Mutator.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov 19 22:26:16 2015
-// Update Count     : 8
+// Last Modified On : Fri Apr  1 17:26:56 2016
+// Update Count     : 10
 //
 #include <cassert>
@@ -31,5 +31,5 @@
 	virtual Declaration* mutate( UnionDecl *aggregateDecl );
 	virtual Declaration* mutate( EnumDecl *aggregateDecl );
-	virtual Declaration* mutate( ContextDecl *aggregateDecl );
+	virtual Declaration* mutate( TraitDecl *aggregateDecl );
 	virtual TypeDecl* mutate( TypeDecl *typeDecl );
 	virtual Declaration* mutate( TypedefDecl *typeDecl );
@@ -67,4 +67,5 @@
 	virtual Expression* mutate( UntypedOffsetofExpr *offsetofExpr );
 	virtual Expression* mutate( OffsetofExpr *offsetofExpr );
+	virtual Expression* mutate( OffsetPackExpr *offsetPackExpr );
 	virtual Expression* mutate( AttrExpr *attrExpr );
 	virtual Expression* mutate( LogicalExpr *logicalExpr );
@@ -76,4 +77,5 @@
 	virtual Expression* mutate( AsmExpr *asmExpr );
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
+	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
 
 	virtual Type* mutate( VoidType *basicType );
@@ -85,9 +87,10 @@
 	virtual Type* mutate( UnionInstType *aggregateUseType );
 	virtual Type* mutate( EnumInstType *aggregateUseType );
-	virtual Type* mutate( ContextInstType *aggregateUseType );
+	virtual Type* mutate( TraitInstType *aggregateUseType );
 	virtual Type* mutate( TypeInstType *aggregateUseType );
 	virtual Type* mutate( TupleType *tupleType );
 	virtual Type* mutate( TypeofType *typeofType );
 	virtual Type* mutate( AttrType *attrType );
+	virtual Type* mutate( VarArgsType *varArgsType );
 
 	virtual Initializer* mutate( SingleInit *singleInit );
Index: src/SynTree/ReferenceToType.cc
===================================================================
--- src/SynTree/ReferenceToType.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/ReferenceToType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jun  7 08:31:48 2015
-// Update Count     : 4
+// Last Modified On : Wed Mar  2 17:28:51 2016
+// Update Count     : 5
 //
 
@@ -83,11 +83,11 @@
 std::string EnumInstType::typeString() const { return "enum"; }
 
-std::string ContextInstType::typeString() const { return "context"; }
+std::string TraitInstType::typeString() const { return "context"; }
 
-ContextInstType::ContextInstType( const ContextInstType &other ) : Parent( other ) {
+TraitInstType::TraitInstType( const TraitInstType &other ) : Parent( other ) {
 	cloneAll( other.members, members );
 }
 
-ContextInstType::~ContextInstType() {
+TraitInstType::~TraitInstType() {
 	deleteAll( members );
 }
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Statement.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Statement.cc -- 
+// Statement.cc --
 //
 // Author           : Richard C. Bilson
@@ -36,13 +36,23 @@
 ExprStmt::ExprStmt( std::list<Label> _labels, Expression *_expr ) : Statement( _labels ), expr( _expr ) {}
 
-ExprStmt::~ExprStmt() {}
+ExprStmt::ExprStmt( const ExprStmt &other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
+
+ExprStmt::~ExprStmt() {
+	delete expr;
+}
 
 void ExprStmt::print( std::ostream &os, int indent ) const {
 	os << string( indent, ' ' ) << "Expression Statement:" << endl;
 	expr->print( os, indent + 2 );
-} 
+}
 
 
 AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
+
+AsmStmt::AsmStmt( const AsmStmt & other ) : Statement( other ), voltile( other.voltile ), instruction( maybeClone( other.instruction ) ), gotolabels( other.gotolabels ) {
+  cloneAll( other.output, output );
+  cloneAll( other.input, input );
+  cloneAll( other.clobber, clobber );
+}
 
 AsmStmt::~AsmStmt() {
@@ -60,5 +70,5 @@
 		os << endl << std::string( indent, ' ' ) << "output: " << endl;
 		printAll( output, os, indent + 2 );
-	} // if 
+	} // if
 	if ( ! input.empty() ) {
 		os << std::string( indent, ' ' ) << "input: " << endl << std::string( indent, ' ' );
@@ -69,5 +79,5 @@
 		printAll( clobber, os, indent + 2 );
 	} // if
-} 
+}
 
 
@@ -93,4 +103,6 @@
 ReturnStmt::ReturnStmt( std::list<Label> labels, Expression *_expr, bool throwP ) : Statement( labels ), expr( _expr ), isThrow( throwP ) {}
 
+ReturnStmt::ReturnStmt( const ReturnStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ), isThrow( other.isThrow ) {}
+
 ReturnStmt::~ReturnStmt() {
 	delete expr;
@@ -106,4 +118,7 @@
 	Statement( _labels ), condition( _condition ), thenPart( _thenPart ), elsePart( _elsePart ) {}
 
+IfStmt::IfStmt( const IfStmt & other ) :
+	Statement( other ), condition( maybeClone( other.condition ) ), thenPart( maybeClone( other.thenPart ) ), elsePart( maybeClone( other.elsePart ) ) {}
+
 IfStmt::~IfStmt() {}
 
@@ -123,4 +138,9 @@
 SwitchStmt::SwitchStmt( std::list<Label> _labels, Expression * _condition, std::list<Statement *> &_branches ):
 	Statement( _labels ), condition( _condition ), branches( _branches ) {
+}
+
+SwitchStmt::SwitchStmt( const SwitchStmt & other ):
+	Statement( other ), condition( maybeClone( other.condition ) ) {
+	cloneAll( other.branches, branches );
 }
 
@@ -145,8 +165,13 @@
 }
 
-CaseStmt::CaseStmt( std::list<Label> _labels, Expression *_condition, std::list<Statement *> &_statements, bool deflt ) throw ( SemanticError ) : 
+CaseStmt::CaseStmt( std::list<Label> _labels, Expression *_condition, std::list<Statement *> &_statements, bool deflt ) throw ( SemanticError ) :
 	Statement( _labels ), condition( _condition ), stmts( _statements ), _isDefault( deflt ) {
 	if ( isDefault() && condition != 0 )
 		throw SemanticError("default with conditions");
+}
+
+CaseStmt::CaseStmt( const CaseStmt & other ) :
+	Statement( other ), condition( maybeClone(other.condition ) ), _isDefault( other._isDefault ) {
+	cloneAll( other.stmts, stmts );
 }
 
@@ -181,4 +206,9 @@
 }
 
+ChooseStmt::ChooseStmt( const ChooseStmt & other ):
+	Statement( other ), condition( maybeClone( other.condition ) ) {
+		cloneAll( other.branches, branches );
+}
+
 ChooseStmt::~ChooseStmt() {
 	delete condition;
@@ -208,4 +238,8 @@
 }
 
+WhileStmt::WhileStmt( const WhileStmt & other ):
+	Statement( other ), condition( maybeClone( other.condition ) ), body( maybeClone( other.body ) ), isDoWhile( other.isDoWhile ) {
+}
+
 WhileStmt::~WhileStmt() {
 	delete body;
@@ -223,4 +257,10 @@
 ForStmt::ForStmt( std::list<Label> labels, std::list<Statement *> initialization_, Expression *condition_, Expression *increment_, Statement *body_ ):
 	Statement( labels ), initialization( initialization_ ), condition( condition_ ), increment( increment_ ), body( body_ ) {
+}
+
+ForStmt::ForStmt( const ForStmt & other ):
+	Statement( other ), condition( maybeClone( other.condition ) ), increment( maybeClone( other.increment ) ), body( maybeClone( other.body ) ) {
+		cloneAll( other.initialization, initialization );
+
 }
 
@@ -241,18 +281,18 @@
 	os << string( indent, ' ' ) << "For Statement" << endl ;
 
-	os << string( indent + 2, ' ' ) << "initialization: \n"; 
+	os << string( indent + 2, ' ' ) << "initialization: \n";
 	for ( std::list<Statement *>::const_iterator it = initialization.begin(); it != initialization.end(); ++it ) {
 		(*it)->print( os, indent + 4 );
 	}
 
-	os << "\n" << string( indent + 2, ' ' ) << "condition: \n"; 
+	os << "\n" << string( indent + 2, ' ' ) << "condition: \n";
 	if ( condition != 0 )
 		condition->print( os, indent + 4 );
 
-	os << "\n" << string( indent + 2, ' ' ) << "increment: \n"; 
+	os << "\n" << string( indent + 2, ' ' ) << "increment: \n";
 	if ( increment != 0 )
 		increment->print( os, indent + 4 );
 
-	os << "\n" << string( indent + 2, ' ' ) << "statement block: \n"; 
+	os << "\n" << string( indent + 2, ' ' ) << "statement block: \n";
 	if ( body != 0 )
 		body->print( os, indent + 4 );
@@ -265,8 +305,6 @@
 }
 
-TryStmt::TryStmt( const TryStmt &other ) : Statement( other.labels ) {
-	block = other.block;
-	std::copy( other.handlers.begin(), other.handlers.end(), back_inserter( handlers ) );
-	finallyBlock = other.finallyBlock;
+TryStmt::TryStmt( const TryStmt &other ) : Statement( other ), block( maybeClone( other.block ) ), finallyBlock( maybeClone( other.finallyBlock ) ) {
+	cloneAll( other.handlers, handlers );
 }
 
@@ -294,4 +332,8 @@
 CatchStmt::CatchStmt( std::list<Label> labels, Declaration *_decl, Statement *_body, bool isCatchRest ) :
 	Statement( labels ), decl ( _decl ), body( _body ), catchRest ( isCatchRest ) {
+}
+
+CatchStmt::CatchStmt( const CatchStmt & other ) :
+	Statement( other ), decl ( maybeClone( other.decl ) ), body( maybeClone( other.body ) ), catchRest ( other.catchRest ) {
 }
 
@@ -319,4 +361,7 @@
 }
 
+FinallyStmt::FinallyStmt( const FinallyStmt & other ) : Statement( other ), block( maybeClone( other.block ) ) {
+}
+
 FinallyStmt::~FinallyStmt() {
 	delete block;
@@ -331,5 +376,4 @@
 NullStmt::NullStmt( std::list<Label> labels ) : CompoundStmt( labels ) {}
 NullStmt::NullStmt() : CompoundStmt( std::list<Label>() ) {}
-NullStmt::~NullStmt() {}
 
 void NullStmt::print( std::ostream &os, int indent ) const {
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Statement.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Statement.h -- 
+// Statement.h --
 //
 // Author           : Richard C. Bilson
@@ -57,4 +57,5 @@
   public:
 	ExprStmt( std::list<Label> labels, Expression *expr );
+	ExprStmt( const ExprStmt &other );
 	virtual ~ExprStmt();
 
@@ -73,4 +74,5 @@
   public:
 	AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> input, std::list<Expression *> output, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );
+	AsmStmt( const AsmStmt &other );
 	virtual ~AsmStmt();
 
@@ -103,4 +105,5 @@
   public:
 	IfStmt( std::list<Label> labels, Expression *condition, Statement *thenPart, Statement *elsePart );
+	IfStmt( const IfStmt &other );
 	virtual ~IfStmt();
 
@@ -111,5 +114,5 @@
 	Statement *get_elsePart() { return elsePart; }
 	void set_elsePart( Statement *newValue ) { elsePart = newValue; }
-	
+
 	virtual IfStmt *clone() const { return new IfStmt( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -125,4 +128,5 @@
   public:
 	SwitchStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &branches );
+	SwitchStmt( const SwitchStmt &other );
 	virtual ~SwitchStmt();
 
@@ -146,4 +150,5 @@
   public:
 	ChooseStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &branches );
+	ChooseStmt( const ChooseStmt &other );
 	virtual ~ChooseStmt();
 
@@ -177,6 +182,7 @@
 class CaseStmt : public Statement {
   public:
-	CaseStmt( std::list<Label> labels, Expression *conditions, 
+	CaseStmt( std::list<Label> labels, Expression *conditions,
 	      std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError);
+	CaseStmt( const CaseStmt &other );
 	virtual ~CaseStmt();
 
@@ -192,5 +198,5 @@
 	std::list<Statement *> &get_statements() { return stmts; }
 	void set_statements( std::list<Statement *> &newValue ) { stmts = newValue; }
-	
+
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
@@ -208,4 +214,5 @@
 	WhileStmt( std::list<Label> labels, Expression *condition,
 	       Statement *body, bool isDoWhile = false );
+	WhileStmt( const WhileStmt &other );
 	virtual ~WhileStmt();
 
@@ -216,5 +223,5 @@
 	bool get_isDoWhile() { return isDoWhile; }
 	void set_isDoWhile( bool newValue ) { isDoWhile = newValue; }
-	
+
 	virtual WhileStmt *clone() const { return new WhileStmt( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -231,4 +238,5 @@
 	ForStmt( std::list<Label> labels, std::list<Statement *> initialization,
 	     Expression *condition = 0, Expression *increment = 0, Statement *body = 0 );
+	ForStmt( const ForStmt &other );
 	virtual ~ForStmt();
 
@@ -241,5 +249,5 @@
 	Statement *get_body() { return body; }
 	void set_body( Statement *newValue ) { body = newValue; }
-	
+
 	virtual ForStmt *clone() const { return new ForStmt( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -259,10 +267,9 @@
 	BranchStmt( std::list<Label> labels, Label target, Type ) throw (SemanticError);
 	BranchStmt( std::list<Label> labels, Expression *computedTarget, Type ) throw (SemanticError);
-	virtual ~BranchStmt() {}
 
 	Label get_originalTarget() { return originalTarget; }
 	Label get_target() { return target; }
 	void set_target( Label newValue ) { target = newValue; }
-	
+
 	Expression *get_computedTarget() { return computedTarget; }
 	void set_target( Expression * newValue ) { computedTarget = newValue; }
@@ -286,9 +293,10 @@
   public:
 	ReturnStmt( std::list<Label> labels, Expression *expr, bool throwP = false );
+	ReturnStmt( const ReturnStmt &other );
 	virtual ~ReturnStmt();
 
 	Expression *get_expr() { return expr; }
 	void set_expr( Expression *newValue ) { expr = newValue; }
-	
+
 	virtual ReturnStmt *clone() const { return new ReturnStmt( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -305,5 +313,4 @@
 	NullStmt();
 	NullStmt( std::list<Label> labels );
-	virtual ~NullStmt();
 
 	virtual NullStmt *clone() const { return new NullStmt( *this ); }
@@ -311,9 +318,9 @@
 	virtual NullStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }
 	virtual void print( std::ostream &os, int indent = 0 ) const;
-	
-  private:
-};
-
-class TryStmt : public Statement { 
+
+  private:
+};
+
+class TryStmt : public Statement {
   public:
 	TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<Statement *> &handlers, FinallyStmt *finallyBlock = 0 );
@@ -332,14 +339,15 @@
 	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
 	virtual void print( std::ostream &os, int indent = 0 ) const;
-	
+
   private:
 	CompoundStmt *block;
 	std::list<Statement *> handlers;
 	FinallyStmt *finallyBlock;
-}; 
+};
 
 class CatchStmt : public Statement {
   public:
 	CatchStmt( std::list<Label> labels, Declaration *decl, Statement *body, bool isCatchRest = false );
+	CatchStmt( const CatchStmt &other );
 	virtual ~CatchStmt();
 
@@ -349,10 +357,10 @@
 	Statement *get_body() { return body; }
 	void set_body( Statement *newValue ) { body = newValue; }
-	
+
 	virtual CatchStmt *clone() const { return new CatchStmt( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
 	virtual void print( std::ostream &os, int indent = 0 ) const;
-	
+
   private:
 	Declaration *decl;
@@ -361,12 +369,13 @@
 };
 
-class FinallyStmt : public Statement { 
+class FinallyStmt : public Statement {
   public:
 	FinallyStmt( std::list<Label> labels, CompoundStmt *block );
+	FinallyStmt( const FinallyStmt &other );
 	virtual ~FinallyStmt();
 
 	CompoundStmt *get_block() const { return block; }
 	void set_block( CompoundStmt *newValue ) { block = newValue; }
-	
+
 	virtual FinallyStmt *clone() const { return new FinallyStmt( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -375,5 +384,5 @@
   private:
 	CompoundStmt *block;
-}; 
+};
 
 
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/SynTree.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 23 23:25:04 2015
-// Update Count     : 3
+// Last Modified On : Fri Apr  1 16:47:44 2016
+// Update Count     : 5
 //
 
@@ -30,5 +30,5 @@
 class UnionDecl;
 class EnumDecl;
-class ContextDecl;
+class TraitDecl;
 class NamedTypeDecl;
 class TypeDecl;
@@ -72,4 +72,5 @@
 class UntypedOffsetofExpr;
 class OffsetofExpr;
+class OffsetPackExpr;
 class AttrExpr;
 class LogicalExpr;
@@ -81,4 +82,5 @@
 class AsmExpr;
 class UntypedValofExpr;
+class CompoundLiteralExpr;
 
 class Type;
@@ -92,9 +94,10 @@
 class UnionInstType;
 class EnumInstType;
-class ContextInstType;
+class TraitInstType;
 class TypeInstType;
 class TupleType;
 class TypeofType;
 class AttrType;
+class VarArgsType;
 
 class Initializer;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Type.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Fri Dec 18 14:46:18 2015
-// Update Count     : 18
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:29:08 2016
+// Update Count     : 21
 //
 
@@ -296,14 +296,14 @@
 };
 
-class ContextInstType : public ReferenceToType {
+class TraitInstType : public ReferenceToType {
 	typedef ReferenceToType Parent;
   public:
-	ContextInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
-	ContextInstType( const ContextInstType &other );
-	~ContextInstType();
+	TraitInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
+	TraitInstType( const TraitInstType &other );
+	~TraitInstType();
 
 	std::list< Declaration* >& get_members() { return members; }
 
-	virtual ContextInstType *clone() const { return new ContextInstType( *this ); }
+	virtual TraitInstType *clone() const { return new TraitInstType( *this ); }
 	virtual void accept( Visitor &v ) { v.visit( this ); }
 	virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
@@ -400,4 +400,16 @@
 };
 
+/// Represents the GCC built-in varargs type
+class VarArgsType : public Type {
+  public:
+	VarArgsType();
+	VarArgsType( Type::Qualifiers tq );
+
+	virtual VarArgsType *clone() const { return new VarArgsType( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+};
+
 inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) {
 	isConst |= other.isConst;
Index: src/SynTree/TypeSubstitution.cc
===================================================================
--- src/SynTree/TypeSubstitution.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/TypeSubstitution.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 11:10:04 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 17:29:15 2016
+// Update Count     : 3
 //
 
@@ -190,5 +190,5 @@
 }
 
-Type * TypeSubstitution::mutate( ContextInstType *aggregateUseType ) {
+Type * TypeSubstitution::mutate( TraitInstType *aggregateUseType ) {
 	return handleType( aggregateUseType );
 }
@@ -196,4 +196,8 @@
 Type * TypeSubstitution::mutate( TupleType *tupleType ) {
 	return handleType( tupleType );
+}
+
+Type * TypeSubstitution::mutate( VarArgsType *varArgsType ) {
+	return handleType( varArgsType );
 }
 
Index: src/SynTree/TypeSubstitution.h
===================================================================
--- src/SynTree/TypeSubstitution.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/TypeSubstitution.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 11:12:30 2015
-// Update Count     : 1
+// Last Modified On : Wed Mar  2 17:33:19 2016
+// Update Count     : 2
 //
 
@@ -72,6 +72,7 @@
 	virtual Type* mutate(UnionInstType *aggregateUseType);
 	virtual Type* mutate(EnumInstType *aggregateUseType);
-	virtual Type* mutate(ContextInstType *aggregateUseType);
+	virtual Type* mutate(TraitInstType *aggregateUseType);
 	virtual Type* mutate(TupleType *tupleType);
+	virtual Type* mutate(VarArgsType *varArgsType);
 	
 	// TODO: worry about traversing into a forall-qualified function type or type decl with assertions
Index: src/SynTree/VarArgsType.cc
===================================================================
--- src/SynTree/VarArgsType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/SynTree/VarArgsType.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,31 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// VarArgsType.cc --
+//
+// Author           : Aaron B. Moss
+// Created On       : Thu Feb 25 16:34:00 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Mar  2 17:10:40 2016
+// Update Count     : 2
+//
+
+#include "Type.h"
+
+VarArgsType::VarArgsType() : Type( Type::Qualifiers() ) {}
+
+VarArgsType::VarArgsType( Type::Qualifiers tq ) : Type( tq ) {}
+
+void VarArgsType::print( std::ostream &os, int indent ) const {
+	Type::print( os, indent );
+	os << "builtin var args pack";
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Visitor.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 24 16:11:05 2015
-// Update Count     : 15
+// Last Modified On : Fri Apr  1 18:05:13 2016
+// Update Count     : 18
 //
 
@@ -56,5 +56,5 @@
 }
 
-void Visitor::visit( ContextDecl *aggregateDecl ) {
+void Visitor::visit( TraitDecl *aggregateDecl ) {
 	visit( static_cast< AggregateDecl* >( aggregateDecl ) );
 }
@@ -230,4 +230,9 @@
 }
 
+void Visitor::visit( OffsetPackExpr *offsetPackExpr ) {
+	acceptAll( offsetPackExpr->get_results(), *this );
+	maybeAccept( offsetPackExpr->get_type(), *this );
+}
+
 void Visitor::visit( AttrExpr *attrExpr ) {
 	acceptAll( attrExpr->get_results(), *this );
@@ -284,4 +289,10 @@
 }
 
+void Visitor::visit( CompoundLiteralExpr *compLitExpr ) {
+	acceptAll( compLitExpr->get_results(), *this );
+	maybeAccept( compLitExpr->get_type(), *this );
+	maybeAccept( compLitExpr->get_initializer(), *this );
+}
+
 void Visitor::visit( VoidType *voidType ) {
 	acceptAll( voidType->get_forall(), *this );
@@ -326,5 +337,5 @@
 }
 
-void Visitor::visit( ContextInstType *aggregateUseType ) {
+void Visitor::visit( TraitInstType *aggregateUseType ) {
 	visit( static_cast< ReferenceToType * >( aggregateUseType ) );
 	acceptAll( aggregateUseType->get_members(), *this );
@@ -355,4 +366,8 @@
 }
 
+void Visitor::visit( VarArgsType *varArgsType ) {
+	acceptAll( varArgsType->get_forall(), *this );
+}
+
 void Visitor::visit( SingleInit *singleInit ) {
 	singleInit->get_value()->accept( *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/Visitor.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan 25 21:20:44 2016
-// Update Count     : 5
+// Last Modified On : Fri Apr  1 17:26:55 2016
+// Update Count     : 7
 //
 
@@ -31,5 +31,5 @@
 	virtual void visit( UnionDecl *aggregateDecl );
 	virtual void visit( EnumDecl *aggregateDecl );
-	virtual void visit( ContextDecl *aggregateDecl );
+	virtual void visit( TraitDecl *aggregateDecl );
 	virtual void visit( TypeDecl *typeDecl );
 	virtual void visit( TypedefDecl *typeDecl );
@@ -67,4 +67,5 @@
 	virtual void visit( UntypedOffsetofExpr *offsetofExpr );
 	virtual void visit( OffsetofExpr *offsetofExpr );
+	virtual void visit( OffsetPackExpr *offsetPackExpr );
 	virtual void visit( AttrExpr *attrExpr );
 	virtual void visit( LogicalExpr *logicalExpr );
@@ -76,4 +77,5 @@
 	virtual void visit( AsmExpr *asmExpr );
 	virtual void visit( UntypedValofExpr *valofExpr );
+	virtual void visit( CompoundLiteralExpr *compLitExpr );
 
 	virtual void visit( VoidType *basicType );
@@ -85,9 +87,10 @@
 	virtual void visit( UnionInstType *aggregateUseType );
 	virtual void visit( EnumInstType *aggregateUseType );
-	virtual void visit( ContextInstType *aggregateUseType );
+	virtual void visit( TraitInstType *aggregateUseType );
 	virtual void visit( TypeInstType *aggregateUseType );
 	virtual void visit( TupleType *tupleType );
 	virtual void visit( TypeofType *typeofType );
 	virtual void visit( AttrType *attrType );
+	virtual void visit( VarArgsType *varArgsType );
 
 	virtual void visit( SingleInit *singleInit );
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/SynTree/module.mk	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -25,4 +25,5 @@
        SynTree/TypeofType.cc \
        SynTree/AttrType.cc \
+       SynTree/VarArgsType.cc \
        SynTree/Constant.cc \
        SynTree/Expression.cc \
@@ -45,5 +46,4 @@
        SynTree/Visitor.cc \
        SynTree/Mutator.cc \
-       SynTree/CodeGenVisitor.cc \
        SynTree/TypeSubstitution.cc
 
Index: src/Tuples/FlattenTuple.cc
===================================================================
--- src/Tuples/FlattenTuple.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Tuples/FlattenTuple.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -49,4 +49,5 @@
 	void FlattenTuple::CollectArgs::visit( UntypedOffsetofExpr *expr )  {  currentArgs.insert( currentArgs.end(), expr );  }
 	void FlattenTuple::CollectArgs::visit( OffsetofExpr        *expr )  {  currentArgs.insert( currentArgs.end(), expr );  }
+	void FlattenTuple::CollectArgs::visit( OffsetPackExpr      *expr )  {  currentArgs.insert( currentArgs.end(), expr );  }
 	void FlattenTuple::CollectArgs::visit( AttrExpr            *expr )  {  currentArgs.insert( currentArgs.end(), expr );  }
 	void FlattenTuple::CollectArgs::visit( LogicalExpr         *expr )  {  currentArgs.insert( currentArgs.end(), expr );  }
Index: src/Tuples/FlattenTuple.h
===================================================================
--- src/Tuples/FlattenTuple.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/Tuples/FlattenTuple.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -45,4 +45,5 @@
 			virtual void visit( UntypedOffsetofExpr * );
 			virtual void visit( OffsetofExpr * );
+			virtual void visit( OffsetPackExpr * );
 			virtual void visit( AttrExpr * );
 			virtual void visit( LogicalExpr * );
Index: src/driver/Makefile.in
===================================================================
--- src/driver/Makefile.in	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/driver/Makefile.in	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -196,7 +196,7 @@
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/driver/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/driver/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu src/driver/Makefile
+	  $(AUTOMAKE) --foreign src/driver/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Index: src/driver/cfa.cc
===================================================================
--- src/driver/cfa.cc	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/driver/cfa.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jan 28 18:24:06 2016
-// Update Count     : 127
+// Last Modified On : Wed Apr  6 14:04:22 2016
+// Update Count     : 132
 //
 
@@ -165,5 +165,5 @@
 				nargs += 1;
 			} else if ( prefix( arg, "-std=" ) ) {
-				std_flag = true;						// std=XX provided
+				std_flag = true;						// -std=XX provided
 				args[nargs] = argv[i];					// pass the argument along
 				nargs += 1;
@@ -307,5 +307,5 @@
 		nargs += 1;
 		if ( ! std_flag ) {								// default c99, if none specified
-			args[nargs] = "-std=c99";
+			args[nargs] = "-std=gnu99";
 			nargs += 1;
 		} // if
Index: src/examples/Makefile.in
===================================================================
--- src/examples/Makefile.in	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/Makefile.in	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -189,7 +189,7 @@
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/examples/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu src/examples/Makefile
+	  $(AUTOMAKE) --foreign src/examples/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Index: src/examples/abs.c
===================================================================
--- src/examples/abs.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/abs.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 18:26:16 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 09:32:04 2016
-// Update Count     : 44
+// Last Modified On : Wed Mar  2 15:07:26 2016
+// Update Count     : 51
 //
 
@@ -20,13 +20,13 @@
 	char ch = -65;
 	sout | "char\t\t\t"					| ch     | "\tabs " | abs( ch ) | endl;
-	sout | "signed int\t\t"				| -65    | "\tabs " | abs( -65 ) | endl;
-	sout | "signed long int\t\t" 		| -65l   | "\tabs " | abs( -65l ) | endl;
-	sout | "signed long long int\t"		| -65ll  | "\tabs " | abs( -65ll ) | endl;
-	sout | "float\t\t\t" 				| -65.0f | "\tabs " | abs( -65.0f ) | endl;
-	sout | "double\t\t\t"				| -65.0  | "\tabs " | abs( -65.0 ) | endl;
-	sout | "long double\t\t"			| -65.0l | "\tabs " | abs( -65.0l ) | endl;
-	sout | "float _Complex\t\t"			| -65.0F-2.0iF | "\tabs " | abs( -65.0F-2.0iF ) | endl;
-	sout | "double _Complex\t\t"		| -65.0D-2.0iD | "\tabs " | abs( -65.0D-2.0iD ) | endl;
-	sout | "long double _Complex\t"		| -65.0L-2.0iL | "\tabs " | abs( -65.0L-2.0iL ) | endl;
+	sout | "signed int\t\t"				| -65    | "\tabs" | abs( -65 ) | endl;
+	sout | "signed long int\t\t" 		| -65l   | "\tabs" | abs( -65l ) | endl;
+	sout | "signed long long int\t"		| -65ll  | "\tabs" | abs( -65ll ) | endl;
+	sout | "float\t\t\t" 				| -65.0f | "\tabs" | abs( -65.0f ) | endl;
+	sout | "double\t\t\t"				| -65.0  | "\tabs" | abs( -65.0 ) | endl;
+	sout | "long double\t\t"			| -65.0l | "\tabs" | abs( -65.0l ) | endl;
+	sout | "float _Complex\t\t"			| -65.0F-2.0iF | "\tabs" | abs( -65.0F-2.0iF ) | endl;
+	sout | "double _Complex\t\t"		| -65.0D-2.0iD | "\tabs" | abs( -65.0D-2.0iD ) | endl;
+	sout | "long double _Complex\t"		| -65.0L-2.0iL | "\tabs" | abs( -65.0L-2.0iL ) | endl;
 } // main
 
Index: src/examples/array.c
===================================================================
--- src/examples/array.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/array.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:10:13 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 18:13:52 2016
+// Update Count     : 3
 //
 
 #include "array.h"
 
-/// forall( type array_type, elt_type | bounded_array( array_type, elt_type ) )
+/// forall( otype array_type, elt_type | bounded_array( array_type, elt_type ) )
 /// [ array_iterator begin, array_iterator end ]
 /// get_iterators( array_type array )
@@ -25,5 +25,5 @@
 
 // The first element is always at index 0.
-forall( type array_type, type elt_type | bounded_array( array_type, elt_type ) )
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
 elt_type * begin( array_type array ) {
 	return &array[ 0 ];
@@ -31,5 +31,5 @@
 
 // The end iterator should point one past the last element.
-forall( type array_type, type elt_type | bounded_array( array_type, elt_type ) )
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
 elt_type * end( array_type array ) {
 	return &array[ last( array ) ] + 1;
Index: src/examples/array.h
===================================================================
--- src/examples/array.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/array.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan 26 17:09:29 2016
-// Update Count     : 3
+// Last Modified On : Wed Mar  2 18:13:35 2016
+// Update Count     : 5
 //
 
@@ -21,10 +21,10 @@
 // An array has contiguous elements accessible in any order using integer indicies. The first
 // element has index 0.
-context array( type array_type, type elt_type ) {
+trait array( otype array_type, otype elt_type ) {
 	lvalue elt_type ?[?]( array_type, int );
 };
 
 // A bounded array is an array that carries its maximum index with it.
-context bounded_array( type array_type, type elt_type | array( array_type, elt_type ) ) {
+trait bounded_array( otype array_type, otype elt_type | array( array_type, elt_type ) ) {
 	int last( array_type );
 };
@@ -34,5 +34,5 @@
 typedef int array_iterator;
 
-/// forall( type array_type, elt_type | bounded_array( array_type, elt_type ) )
+/// forall( otype array_type, elt_type | bounded_array( array_type, elt_type ) )
 /// [ array_iterator begin, array_iterator end ] get_iterators( array_type );
 
@@ -40,8 +40,8 @@
 // A bounded array can be iterated over by using a pointer to the element type. These functions
 // return iterators corresponding to the first element and the one-past-the-end element, STL-style.
-forall( type array_type, type elt_type | bounded_array( array_type, elt_type ) )
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
 elt_type *begin( array_type );
 
-forall( type array_type, type elt_type | bounded_array( array_type, elt_type ) )
+forall( otype array_type, otype elt_type | bounded_array( array_type, elt_type ) )
 elt_type *end( array_type );
 
Index: src/examples/ato.c
===================================================================
--- src/examples/ato.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/ato.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -11,6 +11,6 @@
 // Created On       : Thu Feb  4 08:10:57 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 11:44:03 2016
-// Update Count     : 42
+// Last Modified On : Mon Feb 29 17:57:35 2016
+// Update Count     : 44
 // 
 
@@ -24,29 +24,29 @@
 int main( void ) {
 	int i = ato( "-123" );
-	sout | i | ' ' | "-123" | endl;
+	sout | i | "-123" | endl;
 	unsigned int ui = ato( "123" );
-	sout | ui | ' ' | "123" | endl;
+	sout | ui | "123" | endl;
 	long int li = ato( "-123" );
-	sout | li | ' ' | "-123" | endl;
+	sout | li | "-123" | endl;
 	unsigned long int uli = ato( "123" );
-	sout | uli | ' ' | "123" | endl;
+	sout | uli | "123" | endl;
 	long long int lli = ato( "-123" );
-	sout | lli | ' ' | "-123" | endl;
+	sout | lli | "-123" | endl;
 	unsigned long long int ulli = ato( "123" );
-	sout | ulli | ' ' | "123" | endl;
+	sout | ulli | "123" | endl;
 	float f = ato( "-123.456" );
-	sout | f | ' ' | "-123.456" | endl;
+	sout | f | "-123.456" | endl;
 	double d = ato( "-123.4567890123456" );
-	sout | d | ' ' | "-123.4567890123456" | endl;
+	sout | d | "-123.4567890123456" | endl;
 	long double ld = ato( "-123.45678901234567890123456789" );
-	sout | ld | ' ' | "-123.45678901234567890123456789" | endl;
+	sout | ld | "-123.45678901234567890123456789" | endl;
 	float _Complex fc = ato( "-123.456-123.456i" );
-	sout | fc | ' ' | "-123.456-123.456i" | endl;
+	sout | fc | "-123.456-123.456i" | endl;
 	double _Complex dc = ato( "-123.4567890123456+123.4567890123456i" );
-	sout | dc | ' ' | "-123.4567890123456+123.4567890123456i" | endl;
+	sout | dc | "-123.4567890123456+123.4567890123456i" | endl;
 	long double _Complex ldc = ato( "123.45678901234567890123456789-123.45678901234567890123456789i" );
-	sout | ldc | ' ' | "123.45678901234567890123456789-123.45678901234567890123456789i" | endl;
+	sout | ldc | "123.45678901234567890123456789-123.45678901234567890123456789i" | endl;
 	long double _Complex ldc2 = ato( "123.45678901234-123.4567890i" );
-	sout | ldc2 | ' ' | "123.45678901234567890123456789-123.45678901234567890123456789i" | endl;
+	sout | ldc2 | "123.45678901234-123.4567890i" | endl;
 } // main
 
Index: src/examples/constants.c
===================================================================
--- src/examples/constants.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/constants.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan 25 23:44:12 2016
-// Update Count     : 76
+// Last Modified On : Fri Mar 11 16:27:38 2016
+// Update Count     : 81
 //
 
@@ -44,5 +44,5 @@
 	0x_ff_FF_ff_FF_ff_FF_ff_FF;
 	9_223_372_036_854_775_807;
-	18_446_744_073_709_551_615;
+	18_446_744_073_709_551_615UL;
 	3.141_59f;
 	3.14159;
@@ -53,6 +53,6 @@
 	L'\x_ff_ee';
 	L_"\x_ff_ee";
-	L"a_b\r\Qyc\u_00_40  x_y_z\xff_AA";
-	L_"a_b\r\Qyc\u_00_40\
+	L"a_b\r\vyc\u_00_40  x_y_z\xff_AA";
+	L_"a_b\r\vyc\u_00_40\
   x_y_z\xff_AA";
 	"abc" "def" "ghi";
Index: src/examples/ctxts.c
===================================================================
--- src/examples/ctxts.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/ctxts.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,13 +10,13 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:11:19 2015
-// Update Count     : 2
+// Last Modified On : Wed Mar  2 18:10:21 2016
+// Update Count     : 3
 //
 
-context has_f( type T ) {
+trait has_f( type T ) {
 	T f( T );
 };
 
-context has_g( type U | has_f( U ) ) {
+trait has_g( type U | has_f( U ) ) {
 	U g( U );
 };
Index: src/examples/fstream_test.c
===================================================================
--- src/examples/fstream_test.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/fstream_test.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 11:45:43 2016
-// Update Count     : 43
+// Last Modified On : Sun Mar  6 20:58:29 2016
+// Update Count     : 54
 //
 
@@ -18,18 +18,15 @@
 int main( void ) {
 	int nombre;
-	sout | "Entrez un nombre, s'il vous plaît:\n";
+	sout | "Entrez un nombre, s'il vous plaît:" | endl;
 	sin  | &nombre;
-	sout | "Vous avez entré " | nombre | " stocké à l'adresse " | &nombre | endl;
-	sout | "nombre " | nombre | " est "
-		 | (nombre > 0 ? "plus grand que" :
-		   nombre == 0 ? "égal à" : "moins de")
-		 | " zéro" | endl;
+	sout | "Vous avez entré" | nombre | "stocké à l'adresse" | &nombre | endl;
+	sout | "nombre" | nombre | "est"
+		 | (nombre > 0 ? "plus grand que" : nombre == 0 ? "égal à" : "moins de")
+		 | "zéro" | endl;
 
-	sout | "Entrez trois nombres, s'il vous plaît:\n";
+	sout | "Entrez trois nombres, s'il vous plaît: " | endl;
 	int i, j, k;
 	sin  | &i | &j | &k;
-	sout | "Vous avez entré " | "i:" | i | " j:" | j | " k:" | k | endl;
-
-	sout | 3 | ' ' | 3.5 | ' ' | 'a' | ' ' | "abc" | endl;
+	sout | "Vous avez entré" | "i:" | "" | i | "j:" | "" | j | "k:" | "" | k | endl;
 }
 
Index: src/examples/hello.c
===================================================================
--- src/examples/hello.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/hello.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:11:45 2016
-// Update Count     : 8
+// Last Modified On : Mon Feb 29 18:06:17 2016
+// Update Count     : 10
 //
 
@@ -17,5 +17,5 @@
 
 int main() {
-	sout | "Bonjour au monde!\n";
+	sout | "Bonjour au monde!" | endl;
 }
 
Index: src/examples/huge.c
===================================================================
--- src/examples/huge.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/huge.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,9 +10,9 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:15:34 2015
-// Update Count     : 1
+// Last Modified On : Tue Mar  8 22:16:32 2016
+// Update Count     : 2
 //
 
-int huge( int n, forall( type T ) T (*f)( T ) ) {
+int huge( int n, forall( otype T ) T (*f)( T ) ) {
 	if ( n <= 0 )
 		return f( 0 );
Index: src/examples/identity.c
===================================================================
--- src/examples/identity.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/identity.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:17:32 2016
-// Update Count     : 10
+// Last Modified On : Tue Mar  8 22:15:08 2016
+// Update Count     : 13
 //
 
 #include <fstream>
 
-forall( type T )
+forall( otype T )
 T identity( T t ) {
 	return t;
Index: src/examples/includes.c
===================================================================
--- src/examples/includes.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/includes.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 13:54:09 2015
-// Update Count     : 322
+// Last Modified On : Wed Mar  2 23:28:02 2016
+// Update Count     : 328
 //
 
@@ -43,6 +43,6 @@
 #include <ctype.h>
 #include <curses.h>
-#include <demangle.h>		// enum / contains "type"
-#include <dialog.h>			// enum / contains "type"
+#include <demangle.h>
+#include <dialog.h>
 #include <dirent.h>
 #include <dis-asm.h>
@@ -56,14 +56,16 @@
 #include <err.h>
 #include <errno.h>
+#if 0
 #include <error.h>
+#endif
+#include <eti.h>
+#include <evdns.h>
+#include <event.h>
+#include <evhttp.h>
 #if 0
-#include <eti.h>
-#include <evdns.h>			// subdirectory event2 contains "type"
-#include <event.h>
-#include <evhttp.h>			// enum / subdirectory event2 contains "type"
 #include <evrpc.h>
 #include <evutil.h>
 #include <execinfo.h>
-#include <expat.h>			// enum / contains "type" and "context"
+#include <expat.h>
 #include <expat_config.h>
 #include <expat_external.h>
@@ -74,5 +76,5 @@
 #include <fmtmsg.h>
 #include <fnmatch.h>
-#include <form.h>			// contains "type"
+#include <form.h>
 #include <fpu_control.h>
 #include <fstab.h>
@@ -81,5 +83,5 @@
 #include <ftw.h>
 #include <gconv.h>
-//#include <gcrypt.h>		// enum / contains "type"
+//#include <gcrypt.h>
 //#include <gcrypt-module.h>
 #include <getopt.h>
@@ -107,5 +109,5 @@
 #include <limits.h>
 #include <locale.h>
-#include <math.h>			// contains "type"
+#include <math.h>
 #include <ncurses.h>
 #include <setjmp.h>
Index: src/examples/index.h
===================================================================
--- src/examples/index.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/index.h	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,9 +10,9 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:17:31 2015
-// Update Count     : 1
+// Last Modified On : Wed Mar  2 18:10:46 2016
+// Update Count     : 2
 //
 
-context index( type T ) {
+trait index( type T ) {
 	T ?+?( T, T );
 	T ?-?( T, T );
Index: src/examples/io.c
===================================================================
--- src/examples/io.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/examples/io.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,66 @@
+//                               -*- Mode: C -*- 
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// io.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Mar  2 16:56:02 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Apr  6 14:58:27 2016
+// Update Count     : 15
+// 
+
+#include <fstream>
+
+int main() {
+	char c;														// basic types
+	short int si;
+	unsigned short int usi;
+	int i;
+	unsigned int ui;
+	long int li;
+	unsigned long int uli;
+	long long int lli;
+	unsigned long long int ulli;
+	float f;
+	double d;
+	long double ld;
+	float _Complex fc;
+	double _Complex dc;
+	long double _Complex ldc;
+	char s1[10], s2[10];
+
+	ifstream in;												// create / open file
+	open( &in, "input.data", "r" );
+
+	&in | &c													// character
+		| &si | &usi | &i | &ui | &li | &uli | &lli | &ulli		// integral
+		| &f | &d | &ld											// floating point
+		| &fc | &dc | &ldc										// floating-point complex
+		| cstr( s1 ) | cstr( s2, 10 );							// C string, length unchecked and checked
+
+	sout | c | ' ' | endl										// character
+		 | si | usi | i | ui | li | uli | lli | ulli | endl		// integral
+		 | f | d | ld | endl									// floating point
+		 | fc | dc | ldc | endl;								// complex
+	sout | endl;
+	sout | f | "" | d | "" | ld | endl							// floating point without separator
+		 | sepDisable | fc | dc | ldc | sepEnable | endl		// complex without separator
+		 | sepOn | s1 | sepOff | s2 | endl						// local separator removal
+		 | s1 | "" | s2 | endl;									// C string withou separator
+	sout | endl;
+
+	sepSet( sout, ", $" );										// change separator, maximum of 15 characters
+	sout | f | d | ld | endl									// floating point without separator
+		 | fc | dc | ldc | endl									// complex without separator
+		 | s1 | s2 | endl;
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa io.c" //
+// End: //
Index: src/examples/io.data
===================================================================
--- src/examples/io.data	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/examples/io.data	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,1 @@
+A 1 2 3 4 5 6 7 8 1.1 1.2 1.3 1.1+2.3 1.1-2.3 1.1-2.3 abc xyz
Index: src/examples/it_out.c
===================================================================
--- src/examples/it_out.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/it_out.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,16 +10,16 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:41:23 2015
-// Update Count     : 4
+// Last Modified On : Tue Mar  8 22:14:39 2016
+// Update Count     : 8
 //
 
 typedef unsigned long streamsize_type;
 
-context ostream( dtype os_type ) {
+trait ostream( dtype os_type ) {
 	os_type *write( os_type *, const char *, streamsize_type );
 	int fail( os_type * );
 };
 
-context writeable( type T ) {
+trait writeable( otype T ) {
 	forall( dtype os_type | ostream( os_type ) ) os_type * ?<<?( os_type *, T );
 };
@@ -29,5 +29,5 @@
 forall( dtype os_type | ostream( os_type ) ) os_type * ?<<?( os_type *, const char * );
 
-context istream( dtype is_type ) {
+trait istream( dtype is_type ) {
 	is_type *read( is_type *, char *, streamsize_type );
 	is_type *unread( is_type *, char );
@@ -36,5 +36,5 @@
 };
 
-context readable( type T ) {
+trait readable( otype T ) {
 	forall( dtype is_type | istream( is_type ) ) is_type * ?<<?( is_type *, T );
 };
@@ -43,5 +43,5 @@
 forall( dtype is_type | istream( is_type ) ) is_type * ?>>?( is_type *, int* );
 
-context iterator( type iterator_type, type elt_type ) {
+trait iterator( otype iterator_type, otype elt_type ) {
 	iterator_type ?++( iterator_type* );
 	iterator_type ++?( iterator_type* );
@@ -52,11 +52,11 @@
 };
 
-forall( type elt_type | writeable( elt_type ),
-		type iterator_type | iterator( iterator_type, elt_type ),
+forall( otype elt_type | writeable( elt_type ),
+		otype iterator_type | iterator( iterator_type, elt_type ),
 		dtype os_type | ostream( os_type ) )
 void write_all( iterator_type begin, iterator_type end, os_type *os );
 
-forall( type elt_type | writeable( elt_type ),
-		type iterator_type | iterator( iterator_type, elt_type ),
+forall( otype elt_type | writeable( elt_type ),
+		otype iterator_type | iterator( iterator_type, elt_type ),
 		dtype os_type | ostream( os_type ) )
 void write_all( elt_type begin, iterator_type end, os_type *os ) {
Index: src/examples/limits.c
===================================================================
--- src/examples/limits.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/limits.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -98,4 +98,4 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa min.c" //
+// compile-command: "cfa limits.c" //
 // End: //
Index: src/examples/minmax.c
===================================================================
--- src/examples/minmax.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/minmax.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:17:53 2016
-// Update Count     : 47
+// Last Modified On : Mon Feb 29 23:45:16 2016
+// Update Count     : 49
 //
 
@@ -23,26 +23,26 @@
 
 	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmin " | min( 'z', 'a' ) | endl;
-	sout | "signed int\t\t"				| 4 | ' ' | 3 | "\tmin " | min( 4, 3 ) | endl;
-	sout | "unsigned int\t\t"			| 4u | ' ' | 3u | "\tmin " | min( 4u, 3u ) | endl;
-	sout | "signed long int\t\t" 		| 4l | ' ' | 3l | "\tmin " | min( 4l, 3l ) | endl;
-	sout | "unsigned long int\t" 		| 4ul | ' ' | 3ul | "\tmin " | min( 4ul, 3ul ) | endl;
-	sout | "signed long long int\t"		| 4ll | ' ' | 3ll | "\tmin " | min( 4ll, 3ll ) | endl;
-	sout | "unsigned long long int\t"	| 4ull | ' ' | 3ull | "\tmin " | min( 4ull, 3ull ) | endl;
-	sout | "float\t\t\t" 				| 4.0f | ' ' | 3.1f | "\tmin " | min( 4.0f, 3.1f ) | endl;
-	sout | "double\t\t\t"				| 4.0 | ' ' | 3.1 | "\tmin " | min( 4.0, 3.1 ) | endl;
-	sout | "long double\t\t"			| 4.0l | ' ' | 3.1l | "\tmin " | min( 4.0l, 3.1l ) | endl;
+	sout | "signed int\t\t"				| 4 | 3 | "\tmin" | min( 4, 3 ) | endl;
+	sout | "unsigned int\t\t"			| 4u | 3u | "\tmin" | min( 4u, 3u ) | endl;
+	sout | "signed long int\t\t" 		| 4l | 3l | "\tmin" | min( 4l, 3l ) | endl;
+	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmin" | min( 4ul, 3ul ) | endl;
+	sout | "signed long long int\t"		| 4ll | 3ll | "\tmin" | min( 4ll, 3ll ) | endl;
+	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmin" | min( 4ull, 3ull ) | endl;
+	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmin" | min( 4.0f, 3.1f ) | endl;
+	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmin" | min( 4.0, 3.1 ) | endl;
+	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmin" | min( 4.0l, 3.1l ) | endl;
 
 	sout | endl;
 
 	sout | "char\t\t\t"					| 'z' | ' ' | 'a' | "\tmax " | max( 'z', 'a' ) | endl;
-	sout | "signed int\t\t"				| 4 | ' ' | 3 | "\tmax " | max( 4, 3 ) | endl;
-	sout | "unsigned int\t\t"			| 4u | ' ' | 3u | "\tmax " | max( 4u, 3u ) | endl;
-	sout | "signed long int\t\t" 		| 4l | ' ' | 3l | "\tmax " | max( 4l, 3l ) | endl;
-	sout | "unsigned long int\t" 		| 4ul | ' ' | 3ul | "\tmax " | max( 4ul, 3ul ) | endl;
-	sout | "signed long long int\t"		| 4ll | ' ' | 3ll | "\tmax " | max( 4ll, 3ll ) | endl;
-	sout | "unsigned long long int\t"	| 4ull | ' ' | 3ull | "\tmax " | max( 4ull, 3ull ) | endl;
-	sout | "float\t\t\t" 				| 4.0f | ' ' | 3.1f | "\tmax " | max( 4.0f, 3.1f ) | endl;
-	sout | "double\t\t\t"				| 4.0 | ' ' | 3.1 | "\tmax " | max( 4.0, 3.1 ) | endl;
-	sout | "long double\t\t"			| 4.0l | ' ' | 3.1l | "\tmax " | max( 4.0l, 3.1l ) | endl;
+	sout | "signed int\t\t"				| 4 | 3 | "\tmax" | max( 4, 3 ) | endl;
+	sout | "unsigned int\t\t"			| 4u | 3u | "\tmax" | max( 4u, 3u ) | endl;
+	sout | "signed long int\t\t" 		| 4l | 3l | "\tmax" | max( 4l, 3l ) | endl;
+	sout | "unsigned long int\t" 		| 4ul | 3ul | "\tmax" | max( 4ul, 3ul ) | endl;
+	sout | "signed long long int\t"		| 4ll | 3ll | "\tmax" | max( 4ll, 3ll ) | endl;
+	sout | "unsigned long long int\t"	| 4ull | 3ull | "\tmax" | max( 4ull, 3ull ) | endl;
+	sout | "float\t\t\t" 				| 4.0f | 3.1f | "\tmax" | max( 4.0f, 3.1f ) | endl;
+	sout | "double\t\t\t"				| 4.0 | 3.1 | "\tmax" | max( 4.0, 3.1 ) | endl;
+	sout | "long double\t\t"			| 4.0l | 3.1l | "\tmax" | max( 4.0l, 3.1l ) | endl;
 } // main
 
Index: src/examples/new.c
===================================================================
--- src/examples/new.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/new.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,9 +10,9 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan 25 23:33:55 2016
-// Update Count     : 2
+// Last Modified On : Tue Mar  8 22:13:20 2016
+// Update Count     : 4
 //
 
-forall( type T )
+forall( otype T )
 void f( T *t ) {
 	t--;
Index: src/examples/prolog.c
===================================================================
--- src/examples/prolog.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/prolog.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,13 +10,13 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:25:52 2015
-// Update Count     : 1
+// Last Modified On : Tue Mar  8 22:09:39 2016
+// Update Count     : 5
 //
 
-extern "C" { extern int printf( const char *fmt, ... ); }
+#include <fstream>
 
-void printResult( int x ) { printf( "int\n" ); }
-void printResult( double x ) { printf( "double\n" ); }
-void printResult( char * x ) { printf( "char*\n" ); }
+void printResult( int x ) { sout | "int" | endl; }
+void printResult( double x ) { sout | "double" | endl; }
+void printResult( char * x ) { sout | "char*" | endl; }
 
 void is_arithmetic( int x ) {}
@@ -25,13 +25,13 @@
 void is_integer( int x ) {}
 
-context ArithmeticType( type T ) {
+trait ArithmeticType( otype T ) {
 	void is_arithmetic( T );
 };
 
-context IntegralType( type T | ArithmeticType( T ) ) {
+trait IntegralType( otype T | ArithmeticType( T ) ) {
 	void is_integer( T );
 };
 
-forall( type T | IntegralType( T ) | { void printResult( T ); } )
+forall( otype T | IntegralType( T ) | { void printResult( T ); } )
 void hornclause( T param ) {
 	printResult( param );
Index: src/examples/quad.c
===================================================================
--- src/examples/quad.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/quad.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,16 +10,16 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:19:24 2016
-// Update Count     : 6
+// Last Modified On : Tue Mar  8 22:07:02 2016
+// Update Count     : 8
 //
 
 #include <fstream>
 
-forall( type T | { T ?*?( T, T ); } )
+forall( otype T | { T ?*?( T, T ); } )
 T square( T t ) {
 	return t * t;
 }
 
-forall( type U | { U square( U ); } )
+forall( otype U | { U square( U ); } )
 U quad( U u ) {
 	return square( square( u ) );
@@ -28,5 +28,5 @@
 int main() {
 	int N = 2;
-	sout | "result of quad of " | N | " is " | quad( N ) | endl;
+	sout | "result of quad of" | N | "is" | quad( N ) | endl;
 }
 
Index: src/examples/random.c
===================================================================
--- src/examples/random.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/random.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -7,26 +7,26 @@
 
 int main() {
-	randseed( getpid() );								// set random seed
+	rand48seed( getpid() );								// set random seed
 
 	// test polymorphic calls to random and stream
-	char c = random();
+	char c = rand48();
 	sout | c | endl;
-	int i = random();
+	int i = rand48();
     sout | i | endl;
-	unsigned int ui = random();
+	unsigned int ui = rand48();
     sout | ui | endl;
-	long int li = random();
+	long int li = rand48();
     sout | li | endl;
-	unsigned long int uli = random();
+	unsigned long int uli = rand48();
     sout | uli | endl;
-    float f = random();
+    float f = rand48();
     sout | f | endl;
-    double d = random();
+    double d = rand48();
     sout | d | endl;
-    float _Complex fc = random();
+    float _Complex fc = rand48();
     sout | fc | endl;
-    double _Complex dc = random();
+    double _Complex dc = rand48();
     sout | dc | endl;
-    long double _Complex ldc = random();
+    long double _Complex ldc = rand48();
     sout | ldc | endl;
 } // main
Index: src/examples/rational.c
===================================================================
--- src/examples/rational.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/examples/rational.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,93 @@
+//                               -*- Mode: C -*- 
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// rational.c -- test rational number package
+// 
+// Author           : Peter A. Buhr
+// Created On       : Mon Mar 28 08:43:12 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Apr  8 11:27:48 2016
+// Update Count     : 21
+// 
+
+#include <limits>
+#include <rational>
+#include <fstream>
+
+int main() {
+	Rational a, b, c;
+	sout | "constructor" | endl;
+	a = rational( 3 );
+	b = rational( 4 );
+	c = rational();
+	sout | a | b | c | endl;
+	a = rational( 4, 8 );
+	b = rational( 5, 7 );
+	sout | a | b | endl;
+	a = rational( -2, -3 );
+	b = rational( 3, -2 );
+	sout | a | b | endl;
+	a = rational( -2, 3 );
+	b = rational( 3, 2 );
+	sout | a | b | endl;
+
+	sout | "logical" | endl;
+	a = rational( -2 );
+	b = rational( -3, 2 );
+	sout | a | b | endl;
+	sout | a == 1 | endl;
+	sout | a != b | endl;
+	sout | a <  b | endl;
+	sout | a <= b | endl;
+	sout | a >  b | endl;
+	sout | a >= b | endl;
+
+	sout | "arithmetic" | endl;
+	sout | a | b | endl;
+	sout | a + b | endl;
+	sout | a - b | endl;
+	sout | a * b | endl;
+	sout | a / b | endl;
+
+	sout | "conversion" | endl;
+	a = rational( 3, 4 );
+	sout | widen( a ) | endl;
+	a = rational( 1, 7 );
+	sout | widen( a ) | endl;
+	a = rational( 355, 113 );
+	sout | widen( a ) | endl;
+	sout | narrow( 0.75, 4 ) | endl;
+	sout | narrow( 0.14285714285714, 16 ) | endl;
+	sout | narrow( 3.14159265358979, 256 ) | endl;
+
+	Rational x, y;
+	x = rational( 1, 2 );
+	y = rational( 2 );
+	sout | x - y | endl;
+	sout | x > y | endl;
+	sout | x | numerator( x, 2 ) | x | endl;
+	sout | y | denominator( y, -2 ) | y | endl;
+
+	Rational z;
+	z = rational( 0, 5 );
+	sout | z | endl;
+
+	sout | x | numerator( x, 0 ) | x | endl;
+
+	x = rational( 1, MAX ) + rational( 1, MAX );
+	sout | x | endl;
+	x = rational( 3, MAX ) + rational( 2, MAX );
+	sout | x | endl;
+
+	sin | &a | &b;
+	sout | a | b | endl;
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa rational.c" //
+// End: //
Index: src/examples/rational.cc
===================================================================
--- src/examples/rational.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/examples/rational.cc	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,198 @@
+#include "rationalnumber.h"
+
+#include <iostream>
+#include <cstdlib>					// exit
+using namespace std;
+
+static struct {
+    int gcd, con, copy, des, assn, rel, add, sub, mul, div, in, out;
+} stats;						// implicitly initialized to 0
+
+static int gcd( int a, int b ) {
+    for ( ;; ) {
+	int r = a % b;
+      if ( r == 0 ) break;
+	a = b;
+	b = r;
+    } // for
+    stats.gcd += 1;
+    return b;
+} // gcd
+
+void Rationalnumber::statistics() {
+    cerr
+	<< "gcd:"  << stats.gcd  << '\t'
+	<< "con:"  << stats.con  << '\t'
+	<< "copy:" << stats.copy << '\t'
+	<< "des:"  << stats.des  << '\t'
+	<< "assn:" << stats.assn << '\t'
+	<< "rel:"  << stats.rel  << '\t'
+	<< "add:"  << stats.add  << '\t'
+	<< "sub:"  << stats.sub  << '\t'
+	<< "mul:"  << stats.mul  << '\t'
+	<< "div:"  << stats.div  << '\t'
+	<< "in:"   << stats.in   << '\t'
+	<< "out:"  << stats.out
+	<< endl;
+} // Rationalnumber::statistics
+
+bool Rationalnumber::eq( Rationalnumber &r ) {
+    return num * r.denom == denom * r.num;
+} // Rationalnumber::Rationalnumber::eq
+
+bool Rationalnumber::lt( Rationalnumber &r ) {
+    //int temp1 = denom * r.denom, temp2 = num * r.denom, temp3 = denom * r.num;
+    //return temp1 > 0 && temp2 < temp3 || temp1 < 0 && temp2 > temp3;
+    // if denominator is always > 0, only this check is necessary
+    return num * r.denom < denom * r.num;
+} // Rationalnumber::Rationalnumber::lt
+
+void Rationalnumber::common1( int n, int d ) {
+    num = n;
+    denom = d;
+    stats.con += 1;
+} // Rationalnumber::common1
+
+int Rationalnumber::common2( int &n, int &d ) {
+    if ( d == 0 ) {
+	cerr << "Invalid rational number construction: denominator cannot be equal to 0." << endl;
+	exit( EXIT_FAILURE );
+    } // exit
+    if ( d < 0 ) { d = -d; n = -n; }			// move sign to numerator
+    return gcd( abs( n ), d );				// simplify
+} // Rationalnumber::common2
+
+Rationalnumber::Rationalnumber() {
+    common1( 0, 1 );
+} // Rationalnumber::Rationalnumber
+
+Rationalnumber::Rationalnumber( int n ) {
+    common1( n, 1 );
+} // Rationalnumber::Rationalnumber
+
+Rationalnumber::Rationalnumber( int n, int d ) {
+    int temp = common2( n, d );
+    common1( n / temp, d / temp );
+} // Rationalnumber::Rationalnumber
+
+Rationalnumber::Rationalnumber( const Rationalnumber &c ) {
+    num = c.num;
+    denom = c.denom;
+    stats.copy += 1;
+} // Rationalnumber::Rationalnumber
+
+Rationalnumber::~Rationalnumber() {
+    stats.des += 1;
+} // Rationalnumber::~Rationalnumber
+
+Rationalnumber &Rationalnumber::operator=( const Rationalnumber &r ) {
+    num = r.num;
+    denom = r.denom;
+    stats.assn += 1;
+    return *this;
+} // Rationalnumber::operator=
+
+int Rationalnumber::numerator() const {
+    return num;
+} // Rationalnumber::numerator
+
+int Rationalnumber::numerator( int n ) {
+    int prev = num;
+    int temp = gcd( abs( n ), denom );			// simplify
+    num = n / temp;
+    denom = denom / temp;
+    return prev;
+} // Rationalnumber::numerator
+		   
+int Rationalnumber::denominator() const {
+    return denom;
+} // Rationalnumber::denominator
+
+int Rationalnumber::denominator( int d ) {
+    int prev = denom;
+    int temp = common2( num, d );
+    num = num / temp;
+    denom = d / temp;
+    return prev;
+} // Rationalnumber::denominator
+
+bool operator==( Rationalnumber l, Rationalnumber r ) {
+    stats.rel += 1;
+    return l.eq( r );
+} // operator==
+
+bool operator!=( Rationalnumber l, Rationalnumber r ) {
+    stats.rel += 1;
+    return ! ( l.eq( r ) );
+} // operator!=
+
+bool operator<( Rationalnumber l, Rationalnumber r ) {
+    stats.rel += 1;
+    return l.lt( r );
+} // operator<
+
+bool operator<=( Rationalnumber l, Rationalnumber r ) {
+    stats.rel += 1;
+    return l.lt( r ) || l.eq( r );
+} // operator<=
+
+bool operator>( Rationalnumber l, Rationalnumber r ) {
+    stats.rel += 1;
+    return ! ( l.lt( r ) || l.eq( r ) );
+} // operator>
+
+bool operator>=( Rationalnumber l, Rationalnumber r ) {
+    stats.rel += 1;
+    return ! ( l.lt( r ) );
+} // operator>=
+
+Rationalnumber Rationalnumber::operator-() {
+    return Rationalnumber( -num, denom );
+} // Rationalnumber::operator-
+
+Rationalnumber operator+( Rationalnumber l, Rationalnumber r ) {
+    stats.add += 1;
+    if ( l.denom == r.denom ) {				// special case
+	return Rationalnumber( l.num + r.num, l.denom );
+    } else {
+	return Rationalnumber( l.num * r.denom + l.denom * r.num, l.denom * r.denom );
+    } // if
+} // operator+
+
+Rationalnumber operator-( Rationalnumber l, Rationalnumber r ) {
+    stats.sub += 1;
+    if ( l.denom == r.denom ) {				// special case
+	return Rationalnumber( l.num - r.num, l.denom );
+    } else {
+	return Rationalnumber( l.num * r.denom - l.denom * r.num, l.denom * r.denom );
+    } // if
+} // operator-
+
+Rationalnumber operator*( Rationalnumber l, Rationalnumber r ) {
+    stats.mul += 1;
+    return Rationalnumber( l.num * r.num, l.denom * r.denom );
+} // operator*
+
+Rationalnumber operator/( Rationalnumber l, Rationalnumber r ) {
+    stats.div += 1;
+    if ( r.num < 0 ) { r.num = -r.num; r.denom = -r.denom; }
+    return Rationalnumber( l.num * r.denom, l.denom * r.num );
+} // operator/
+
+istream &operator>>( istream &is, Rationalnumber &r ) {
+    stats.in += 1;
+    is >> r.num >> r.denom;
+    int temp = Rationalnumber::common2( r.num, r.denom );
+    r.num /= temp;
+    r.denom /= temp;
+    return is;
+} // operator>>
+
+ostream &operator<<( ostream &os, Rationalnumber r ) {
+    stats.out += 1;
+    return os << r.num << "/" << r.denom;
+} // operator<<
+
+// Local Variables: //
+// compile-command: "make rationalnumber" //
+// End: //
Index: src/examples/searchsort.c
===================================================================
--- src/examples/searchsort.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/searchsort.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -11,6 +11,6 @@
 // Created On       : Thu Feb  4 18:17:50 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:21:04 2016
-// Update Count     : 46
+// Last Modified On : Tue Mar 22 22:16:46 2016
+// Update Count     : 55
 // 
 
@@ -36,4 +36,24 @@
 		sout | *v | ", ";
 	} // for
+	sout | endl | endl;
+
+	// descending sort/search by changing < to >
+	for ( unsigned int i = 0; i < size; i += 1 ) {
+		iarr[i] = i + 1;
+		sout | iarr[i] | ", ";
+	} // for
+	sout | endl;
+	{
+		int ?<?( int x, int y ) { return x > y; }
+		qsort( iarr, size );
+		for ( unsigned int i = 0; i < size; i += 1 ) {
+			sout | iarr[i] | ", ";
+		} // for
+		sout | endl;
+		for ( unsigned int i = 0; i < size; i += 1 ) {
+			int *v = bsearch( size - i, iarr, size );
+			sout | *v | ", ";
+		} // for
+	}
 	sout | endl | endl;
 
Index: src/examples/simplePoly.c
===================================================================
--- src/examples/simplePoly.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/simplePoly.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,9 +10,9 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:31:17 2015
-// Update Count     : 2
+// Last Modified On : Tue Mar  8 22:06:41 2016
+// Update Count     : 3
 //
 
-forall( type T, type U | { T f( T, U ); } )
+forall( otype T, otype U | { T f( T, U ); } )
 T q( T t, U u ) {
 	return f( t, u );
Index: src/examples/simpler.c
===================================================================
--- src/examples/simpler.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/simpler.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,9 +10,9 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:31:48 2015
-// Update Count     : 1
+// Last Modified On : Tue Mar  8 22:06:30 2016
+// Update Count     : 2
 //
 
-forall( type T ) T id( T, T );
+forall( otype T ) T id( T, T );
 
 int main() {
Index: src/examples/specialize.c
===================================================================
--- src/examples/specialize.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/specialize.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed May 27 18:32:26 2015
-// Update Count     : 2
+// Last Modified On : Tue Mar  8 22:06:17 2016
+// Update Count     : 3
 //
 
@@ -39,5 +39,5 @@
 }
 
-forall( type T ) T f( T t )
+forall( otype T ) T f( T t )
 {
 	printf( "in f; sizeof T is %d\n", sizeof( T ) );
Index: src/examples/square.c
===================================================================
--- src/examples/square.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/square.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:21:58 2016
-// Update Count     : 26
+// Last Modified On : Tue Mar  8 22:05:48 2016
+// Update Count     : 27
 //
 
 #include <fstream>
 
-forall( type T | { T ?*?( T, T ); } )
+forall( otype T | { T ?*?( T, T ); } )
 T square( T t ) {
 	return t * t;
Index: src/examples/sum.c
===================================================================
--- src/examples/sum.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/sum.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Feb 16 23:49:31 2016
-// Update Count     : 189
+// Last Modified On : Fri Mar  4 15:06:47 2016
+// Update Count     : 196
 //
 
 #include <fstream>
 
-context sumable( type T ) {
+trait sumable( otype T ) {
 	const T 0;
 	T ?+?( T, T );
@@ -24,5 +24,5 @@
 }; // sumable
 
-forall( type T | sumable( T ) )
+forall( otype T | sumable( T ) )
 T sum( unsigned int n, T a[] ) {
 	T total = 0;										// instantiate T, select 0
@@ -47,6 +47,6 @@
 		a[i] = v;
 	} // for
-	sout | "sum from " | low | " to " | High | " is "
-		 | (int)sum( size, a ) | ", check " | (int)s | endl;
+	sout | "sum from" | low | "to" | High | "is"
+		 | (int)sum( size, a ) | "" | ", check" | (int)s | endl;
 
 	int s = 0, a[size], v = low;
@@ -55,6 +55,6 @@
 		a[i] = (int)v;
 	} // for
-	sout | "sum from " | low | " to " | High | " is "
-		 | sum( size, (int *)a ) | ", check " | (int)s | endl;
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (int *)a ) | "" | ", check" | (int)s | endl;
 
 	float s = 0.0, a[size], v = low / 10.0;
@@ -63,6 +63,6 @@
 		a[i] = (float)v;
 	} // for
-	sout | "sum from " | low / 10.0 | " to " | High / 10.0 | " is "
-		 | sum( size, (float *)a ) | ", check " | (float)s | endl;
+	sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is"
+		 | sum( size, (float *)a ) | "" | ", check" | (float)s | endl;
 
 	double s = 0, a[size], v = low / 10.0;
@@ -71,6 +71,6 @@
 		a[i] = (double)v;
 	} // for
-	sout | "sum from " | low / 10.0 | " to " | High / 10.0 | " is "
-		 | sum( size, (double *)a ) | ", check " | (double)s | endl;
+	sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is"
+		 | sum( size, (double *)a ) | "" | ", check" | (double)s | endl;
 
 	struct S { int i, j; } 0 = { 0, 0 }, 1 = { 1, 1 };
@@ -79,5 +79,5 @@
 	S ++?( S *t ) { *t += 1; return *t; }
 	S ?++( S *t ) { S temp = *t; *t += 1; return temp; }
-	ofstream * ?|?( ofstream * os, S v ) { return os | v.i | ' ' | v.j; }
+	ofstream * ?|?( ofstream * os, S v ) { return os | v.i | v.j; }
 
 	S s = 0, a[size], v = { low, low };
@@ -86,6 +86,6 @@
 		a[i] = (S)v;
 	} // for
-	sout | "sum from " | low | " to " | High | " is "
-		 | sum( size, (S *)a ) | ", check " | (S)s | endl;
+	sout | "sum from" | low | "to" | High | "is"
+		 | sum( size, (S *)a ) | "" | ", check" | (S)s | endl;
 } // main
 
Index: src/examples/swap.c
===================================================================
--- src/examples/swap.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/swap.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:22:12 2016
-// Update Count     : 64
+// Last Modified On : Wed Mar  2 16:15:11 2016
+// Update Count     : 65
 //
 
@@ -54,15 +54,15 @@
 
 	float f1 = 1.5, f2 = 2.5;
-	sout | "float\t\t\t" | f1 | ' ' | f2 | "\t\t\tswap ";
+	sout | "float\t\t\t" | f1 | ' ' | f2 | "\t\tswap ";
 	swap( &f1, &f2 );
 	sout | '\t' | f1 | ' ' | f2 | endl;
 
 	double d1 = 1.5, d2 = 2.5;
-	sout | "double\t\t\t" | d1 | ' ' | d2 | "\t\t\tswap ";
+	sout | "double\t\t\t" | d1 | ' ' | d2 | "\t\tswap ";
 	swap( &d1, &d2 );
 	sout | '\t' | d1 | ' ' | d2 | endl;
 
 	long double ld1 = 1.5, ld2 = 2.5;
-	sout | "long double\t\t" | ld1 | ' ' | ld2 | "\t\t\tswap ";
+	sout | "long double\t\t" | ld1 | ' ' | ld2 | "\t\tswap ";
 	swap( &ld1, &ld2 );
 	sout | '\t' | ld1 | ' ' | ld2 | endl;
Index: src/examples/tests/vector_test.out.txt
===================================================================
--- src/examples/tests/vector_test.out.txt	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/tests/vector_test.out.txt	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -1,5 +1,5 @@
 enter N elements and C-d on a separate line:
 Array elements:
-1 2 3 4 5 
+1 2 3 4 5
 Array elements reversed:
-5 4 3 2 1 
+5 4 3 2 1
Index: src/examples/twice.c
===================================================================
--- src/examples/twice.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/examples/twice.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 12:23:25 2016
-// Update Count     : 13
+// Last Modified On : Tue Mar  8 22:04:58 2016
+// Update Count     : 16
 //
 
 #include <fstream>
 
-forall( type T | { T ?+?( T, T ); T ?++( T * ); [T] ?+=?( T *, T ); } )
+forall( otype T | { T ?+?( T, T ); T ?++( T * ); [T] ?+=?( T *, T ); } )
 T twice( const T t ) {
 	return t + t;
@@ -27,5 +27,5 @@
 	char ?++( char *op ) { char temp = *op; *op += 1; return temp; }
 
-	sout | twice( 'a' ) | ' ' | twice( 1 ) | ' ' | twice( 3.2 ) | endl;
+	sout | twice( 'a' ) | ' ' | twice( 1 ) | twice( 3.2 ) | endl;
 }
 
Index: src/libcfa/Makefile.am
===================================================================
--- src/libcfa/Makefile.am	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/Makefile.am	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:54:01 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Wed Feb  3 11:19:35 2016
-## Update Count     : 117
+## Last Modified On : Wed Apr  6 21:10:44 2016
+## Update Count     : 123
 ###############################################################################
 
@@ -60,9 +60,9 @@
 	${CC} ${CFLAGS} -c -o $@ $<
 
-libs = stdlib iostream fstream iterator
+libs = limits stdlib iostream fstream iterator rational
 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c}
 
-cheaders = bfd bfdlink demangle dialog evdns evhttp evrpc expat fcntl form gcrypt math
-cfaheaders = limits
+cheaders = # expat
+cfaheaders = # limits
 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders}
 
Index: src/libcfa/Makefile.in
===================================================================
--- src/libcfa/Makefile.in	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/Makefile.in	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -83,6 +83,6 @@
 libcfa_a_AR = $(AR) $(ARFLAGS)
 libcfa_a_LIBADD =
-am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \
-	iterator.$(OBJEXT)
+am__objects_1 = limits.$(OBJEXT) stdlib.$(OBJEXT) iostream.$(OBJEXT) \
+	fstream.$(OBJEXT) iterator.$(OBJEXT) rational.$(OBJEXT)
 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1)
 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
@@ -213,8 +213,8 @@
 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \
 	${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/*
-libs = stdlib iostream fstream iterator
+libs = limits stdlib iostream fstream iterator rational
 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c}
-cheaders = bfd bfdlink demangle dialog evdns evhttp evrpc expat fcntl form gcrypt math
-cfaheaders = limits
+cheaders = # expat
+cfaheaders = # limits
 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders}
 all: all-am
@@ -231,7 +231,7 @@
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/libcfa/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libcfa/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu src/libcfa/Makefile
+	  $(AUTOMAKE) --foreign src/libcfa/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@@ -297,4 +297,6 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rational.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@
 
Index: c/libcfa/bfd.h
===================================================================
--- src/libcfa/bfd.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// bfd.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Thu Jan  8 15:50:56 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:44:41 2015
-// Update Count     : 9
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_BFD_H__
-#endif // ! type
-
-#include_next <bfd.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_BFD_H__ )			// reset only if set
-#undef type
-#undef __CFA_BFD_H__
-#endif // type && __CFA_BFD_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/bfdlink.h
===================================================================
--- src/libcfa/bfdlink.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// bfdlink.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sat Jun 27 09:14:00 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:47:03 2015
-// Update Count     : 4
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_BFDLINK_H__
-#endif // ! type
-
-#include_next <bfdlink.h>								// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_BFDLINK_H__ )		// reset only if set
-#undef type
-#undef __CFA_BFDLINK_H__
-#endif // type && __CFA_BFDLINK_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/libcfa/builtins.cf
===================================================================
--- src/libcfa/builtins.cf	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/builtins.cf	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -390,11 +390,11 @@
 int __builtin_sprintf(char *, const char *, ...);
 int __builtin_sscanf(const char *, const char *, ...);
-int __builtin_vfprintf(struct _IO_FILE *, const char *, void **);
-int __builtin_vfscanf(struct _IO_FILE *, const char *, void **);
-int __builtin_vprintf(const char *, void **);
-int __builtin_vscanf(const char *, void **);
-int __builtin_vsnprintf(char *, unsigned long, const char *, void **);
-int __builtin_vsprintf(char *, const char *, void **);
-int __builtin_vsscanf(const char *, const char *, void **);
+int __builtin_vfprintf(struct _IO_FILE *, const char *, __builtin_va_list);
+int __builtin_vfscanf(struct _IO_FILE *, const char *, __builtin_va_list);
+int __builtin_vprintf(const char *, __builtin_va_list);
+int __builtin_vscanf(const char *, __builtin_va_list);
+int __builtin_vsnprintf(char *, unsigned long, const char *, __builtin_va_list);
+int __builtin_vsprintf(char *, const char *, __builtin_va_list);
+int __builtin_vsscanf(const char *, const char *, __builtin_va_list);
 int __builtin_isalnum(int);
 int __builtin_isalpha(int);
@@ -534,7 +534,7 @@
 void __builtin_unwind_init();
 void __builtin_update_setjmp_buf(void *, int);
-void __builtin_va_copy(void **, void **);
-void __builtin_va_end(void **);
-void __builtin_va_start(void **, ...);
+void __builtin_va_copy(__builtin_va_list, __builtin_va_list);
+void __builtin_va_end(__builtin_va_list);
+void __builtin_va_start(__builtin_va_list, ...);
 int __builtin_va_arg_pack();
 int __builtin_va_arg_pack_len();
@@ -563,10 +563,10 @@
 int __builtin___snprintf_chk(char *, unsigned long, int, unsigned long, const char *, ...);
 int __builtin___sprintf_chk(char *, int, unsigned long, const char *, ...);
-int __builtin___vsnprintf_chk(char *, unsigned long, int, unsigned long, const char *, void **);
-int __builtin___vsprintf_chk(char *, int, unsigned long, const char *, void **);
+int __builtin___vsnprintf_chk(char *, unsigned long, int, unsigned long, const char *, __builtin_va_list);
+int __builtin___vsprintf_chk(char *, int, unsigned long, const char *, __builtin_va_list);
 int __builtin___fprintf_chk(struct _IO_FILE *, int, const char *, ...);
 int __builtin___printf_chk(int, const char *, ...);
-int __builtin___vfprintf_chk(struct _IO_FILE *, int, const char *, void **);
-int __builtin___vprintf_chk(int, const char *, void **);
+int __builtin___vfprintf_chk(struct _IO_FILE *, int, const char *, __builtin_va_list);
+int __builtin___vprintf_chk(int, const char *, __builtin_va_list);
 void __cyg_profile_func_enter(void *, void *);
 void __cyg_profile_func_exit(void *, void *);
@@ -583,5 +583,3 @@
 const char * __builtin_FUNCTION();
 int __builtin_LINE();
-typedef void ** __builtin_va_list;
 extern const char *__PRETTY_FUNCTION__;
-typedef int wchar_t;
Index: c/libcfa/demangle.h
===================================================================
--- src/libcfa/demangle.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// demangle.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sat Jun 27 16:45:01 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:48:30 2015
-// Update Count     : 9
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_DEMANGLE_H__
-#endif // ! type
-
-#include_next <demangle.h>								// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_DEMANGLE_H__ )		// reset only if set
-#undef type
-#undef __CFA_DEMANGLE_H__
-#endif // type && __CFA_DEMANGLE_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/dialog.h
===================================================================
--- src/libcfa/dialog.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// dialog.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 08:34:16 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:38:21 2015
-// Update Count     : 11
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_DIALOG_H__
-#endif // ! type
-
-#include_next <dialog.h>								// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_DIALOG_H__ )		// reset only if set
-#undef type
-#undef __CFA_DIALOG_H__
-#endif // type && __CFA_DIALOG_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/evdns.h
===================================================================
--- src/libcfa/evdns.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// evdns.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 10:09:23 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:51:06 2015
-// Update Count     : 3
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_EVDNS_H__
-#endif // ! type
-
-#include_next <evdns.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_EVDNS_H__ )		// reset only if set
-#undef type
-#undef __CFA_EVDNS_H__
-#endif // type && __CFA_EVDNS_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/evhttp.h
===================================================================
--- src/libcfa/evhttp.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// evhttp.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 10:59:02 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:52:19 2015
-// Update Count     : 2
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_EVHTTP_H__
-#endif // ! type
-
-#include_next <evhttp.h>								// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_EVHTTP_H__ )		// reset only if set
-#undef type
-#undef __CFA_EVHTTP_H__
-#endif // type && __CFA_EVHTTP_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/evrpc.h
===================================================================
--- src/libcfa/evrpc.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// evrpc.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 11:01:31 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:53:14 2015
-// Update Count     : 2
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_EVRPC_H__
-#endif // ! type
-
-#include_next <evrpc.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_EVRPC_H__ )		// reset only if set
-#undef type
-#undef __CFA_EVRPC_H__
-#endif // type && __CFA_EVRPC_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/fcntl.h
===================================================================
--- src/libcfa/fcntl.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// fcntl.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 23:03:14 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:38:39 2015
-// Update Count     : 14
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_FCNTL_H__
-#endif // ! type
-
-#include_next <fcntl.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_FCNTL_H__ )		// reset only if set
-#undef type
-#undef __CFA_FCNTL_H__
-#endif // type && __CFA_FCNTL_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/libcfa/form.h
===================================================================
--- src/libcfa/form.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// form.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 11:23:56 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:59:46 2015
-// Update Count     : 2
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_FORM_H__
-#endif // ! type
-
-#include_next <form.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_FORM_H__ )		// reset only if set
-#undef type
-#undef __CFA_FORM_H__
-#endif // type && __CFA_FORM_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/libcfa/fstream
===================================================================
--- src/libcfa/fstream	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/fstream	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -7,9 +7,9 @@
 // fstream -- 
 //
-// Author           : Richard C. Bilson
+// Author           : Peter A. Buhr
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 14:02:01 2016
-// Update Count     : 22
+// Last Modified On : Tue Apr  5 22:37:12 2016
+// Update Count     : 82
 //
 
@@ -19,25 +19,42 @@
 #include "iostream"
 
-// implement context ostream
-struct ofstream;
+enum { separateSize = 16 };
+struct ofstream {
+	void *file;
+	_Bool sepDefault;
+	_Bool sepOnOff;
+	char separator[separateSize];
+}; // ofstream
 
-int fail( ofstream * os );
-int flush( ofstream * os );
-void open( ofstream ** os, const char * name, const char * mode );
-void close( ofstream * os );
-ofstream * write( ofstream * os, const char * data, streamsize_type size );
+_Bool sepPrt( ofstream * );
+void sepOn( ofstream * );
+void sepOff( ofstream * );
+void sepReset( ofstream * );
+void sepReset( ofstream *, _Bool );
+void sepSet( ofstream *, const char * );
+const char * sepGet( ofstream * );
+_Bool sepDisable( ofstream * );
+_Bool sepEnable( ofstream * );
+int fail( ofstream * );
+int flush( ofstream * );
+void open( ofstream *, const char * name, const char * mode );
+void close( ofstream * );
+ofstream * write( ofstream *, const char * data, unsigned long int size );
+int prtfmt( ofstream *, const char fmt[], ... );
 
 extern ofstream * sout, * serr;
 
 // implement context istream
-struct ifstream;
+struct ifstream {
+	void *file;
+}; // ifstream
 
 int fail( ifstream * is );
 int eof( ifstream * is );
-void open( ifstream ** is, const char * name, const char * mode );
+void open( ifstream * is, const char * name, const char * mode );
 void close( ifstream * is );
-ifstream * get( ifstream * is, int * data );
-ifstream * read( ifstream * is, char * data, streamsize_type size );
+ifstream * read( ifstream * is, char * data, unsigned long int size );
 ifstream * ungetc( ifstream * is, char c );
+int scanfmt( ifstream *, const char fmt[], ... );
 
 extern ifstream *sin;
@@ -49,2 +66,3 @@
 // tab-width: 4 //
 // End: //
+
Index: src/libcfa/fstream.c
===================================================================
--- src/libcfa/fstream.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/fstream.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -7,9 +7,9 @@
 // fstream.c -- 
 //
-// Author           : Richard C. Bilson
+// Author           : Peter A. Buhr
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 14:03:05 2016
-// Update Count     : 76
+// Last Modified On : Wed Apr  6 17:55:27 2016
+// Update Count     : 176
 //
 
@@ -17,40 +17,66 @@
 
 extern "C" {
-#include <stdio.h>
-#include <stdlib.h>
+#include <stdio.h>										// vfprintf, vfscanf
+#include <stdlib.h>										// exit
+#include <stdarg.h>										// varargs
+#include <string.h>										// strlen
+#include <float.h>										// DBL_DIG, LDBL_DIG
+#include <complex.h>									// creal, cimag
 }
 
-struct ofstream {
-	FILE *file;
-};
+#define IO_MSG "I/O error: "
 
-#define IO_MSG "I/O error "
+_Bool sepPrt( ofstream * os ) { return os->sepOnOff; }
+void sepOn( ofstream * os ) { os->sepOnOff = 1; }
+void sepOff( ofstream * os ) { os->sepOnOff = 0; }
+void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; }
+void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; }
+void sepSet( ofstream * os, const char * s ) {
+	strncpy( &(os->separator[0]), s, separateSize - 1 );
+	os->separator[separateSize - 1] = '\0';
+} // sepSet
+const char * sepGet( ofstream * os ) { return &(os->separator[0]); }
+_Bool sepDisable( ofstream *os ) {
+	_Bool temp = os->sepDefault;
+	os->sepDefault = 0;
+	sepReset( os );
+	return temp;
+} // sepDisable
+_Bool sepEnable( ofstream *os ) {
+	_Bool temp = os->sepDefault;
+	os->sepDefault = 1;
+	sepReset( os );
+	return temp;
+} // sepEnable
 
 int fail( ofstream * os ) {
-	return ferror( os->file );
+	return ferror( (FILE *)(os->file) );
 } // fail
 
 int flush( ofstream * os ) {
-	return fflush( os->file );
+	return fflush( (FILE *)(os->file) );
 } // flush
 
-void open( ofstream ** os, const char * name, const char * mode ) {
-	FILE *t = fopen( name, mode );
-	if ( t == 0 ) {										// do not change unless successful
-		perror( IO_MSG "open output" );
+void open( ofstream * os, const char * name, const char * mode ) {
+	FILE *file = fopen( name, mode );
+	if ( file == 0 ) {									// do not change unless successful
+		fprintf( stderr, IO_MSG "open output file \"%s\", ", name );
+		perror( 0 );
 		exit( EXIT_FAILURE );
 	} // if
-	(*os)->file = t;
+	os->file = file;
+	sepOff( os );
+	sepSet( os, " " );
 } // open
 
 void close( ofstream * os ) {
-	if ( os->file == stdout || os->file == stderr ) return;
+	if ( (FILE *)(os->file) == stdout || (FILE *)(os->file) == stderr ) return;
 
-	if ( fclose( os->file ) == EOF ) {
+	if ( fclose( (FILE *)(os->file) ) == EOF ) {
 		perror( IO_MSG "close output" );
 	} // if 
 } // close
 
-ofstream * write( ofstream * os, const char * data, streamsize_type size ) {
+ofstream * write( ofstream * os, const char * data, unsigned long int size ) {
 	if ( fail( os ) ) {
 		fprintf( stderr, "attempt write I/O on failed stream\n" );
@@ -58,5 +84,5 @@
 	} // if
 
-	if ( fwrite( data, 1, size, os->file ) != size ) {
+	if ( fwrite( data, 1, size, (FILE *)(os->file) ) != size ) {
 		perror( IO_MSG "write" );
 		exit( EXIT_FAILURE );
@@ -65,34 +91,56 @@
 } // write
 
-static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_) };
+int prtfmt( ofstream * os, const char fmt[], ... ) {
+    va_list args;
+
+    va_start( args, fmt );
+    int len = vfprintf( (FILE *)(os->file), fmt, args );
+	if ( len == EOF ) {
+		if ( ferror( (FILE *)(os->file) ) ) {
+			fprintf( stderr, "invalid write\n" );
+			exit( EXIT_FAILURE );
+		} // if
+	} // if
+    va_end( args );
+	return len;
+} // prtfmt
+
+
+static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, { ' ', '\0' } };
 ofstream *sout = &soutFile;
-static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_) };
+static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, { ' ', '\0' } };
 ofstream *serr = &serrFile;
+
 
 //---------------------------------------
 
-struct ifstream {
-	FILE *file;
-};
 
 int fail( ifstream * is ) {
-	return ferror( is->file );
+	return ferror( (FILE *)(is->file) );
 } // fail
 
 int eof( ifstream * is ) {
-	return feof( is->file );
+	return feof( (FILE *)(is->file) );
 } // eof
 
-ifstream * get( ifstream * is, int * data ) {
-	if ( fscanf( is->file, "%d", data ) == EOF ) {
-		if ( ferror( is->file ) ) {
-			fprintf( stderr, "invalid int read\n" );
-			exit( EXIT_FAILURE );
-		} // if
+void open( ifstream * is, const char * name, const char * mode ) {
+	FILE *t = fopen( name, mode );
+	if ( t == 0 ) {										// do not change unless successful
+		fprintf( stderr, IO_MSG "open input file \"%s\", ", name );
+		perror( 0 );
+		exit( EXIT_FAILURE );
 	} // if
-	return is;
-} // read
+	is->file = t;
+} // open
 
-ifstream * read( ifstream * is, char * data, streamsize_type size ) {
+void close( ifstream * is ) {
+	if ( (FILE *)(is->file) == stdin ) return;
+
+	if ( fclose( (FILE *)(is->file) ) == EOF ) {
+		perror( IO_MSG "close input" );
+	} // if 
+} // close
+
+ifstream * read( ifstream * is, char * data, unsigned long int size ) {
 	if ( fail( is ) ) {
 		fprintf( stderr, "attempt read I/O on failed stream\n" );
@@ -100,5 +148,5 @@
 	} // if
 
-	if ( fread( data, size, 1, is->file ) == 0 ) {
+	if ( fread( data, size, 1, (FILE *)(is->file) ) == 0 ) {
 		perror( IO_MSG "read" );
 		exit( EXIT_FAILURE );
@@ -113,5 +161,5 @@
 	} // if
 
-	if ( ungetc( c, is->file ) == EOF ) {
+	if ( ungetc( c, (FILE *)(is->file) ) == EOF ) {
 		perror( IO_MSG "ungetc" );
 		exit( EXIT_FAILURE );
@@ -120,20 +168,19 @@
 } // ungetc
 
-void open( ifstream ** is, const char * name, const char * mode ) {
-	FILE *t = fopen( name, mode );
-	if ( t == 0 ) {										// do not change unless successful
-		perror( IO_MSG "open input" );
-		exit( EXIT_FAILURE );
+int scanfmt( ifstream * is, const char fmt[], ... ) {
+    va_list args;
+
+    va_start( args, fmt );
+    int len = vfscanf( (FILE *)(is->file), fmt, args );
+	if ( len == EOF ) {
+		if ( ferror( (FILE *)(is->file) ) ) {
+			fprintf( stderr, "invalid read\n" );
+			exit( EXIT_FAILURE );
+		} // if
 	} // if
-	(*is)->file = t;
-} // open
+    va_end( args );
+	return len;
+} // prtfmt
 
-void close( ifstream * is ) {
-	if ( is->file == stdin ) return;
-
-	if ( fclose( is->file ) == EOF ) {
-		perror( IO_MSG "close input" );
-	} // if 
-} // close
 
 static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) };
@@ -142,4 +189,3 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa fstream.c" //
 // End: //
Index: c/libcfa/gcrypt.h
===================================================================
--- src/libcfa/gcrypt.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// gcrypt.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Sun Jun 28 11:36:26 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 09:01:25 2015
-// Update Count     : 8
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_GCRYPT_H__
-#endif // ! type
-
-#include_next <gcrypt.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_GCRYPT_H__ )		// reset only if set
-#undef type
-#undef __CFA_GCRYPT_H__
-#endif // type && __CFA_GCRYPT_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/libcfa/iostream
===================================================================
--- src/libcfa/iostream	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/iostream	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -7,24 +7,36 @@
 // iostream -- 
 //
-// Author           : Richard C. Bilson
+// Author           : Peter A. Buhr
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 14:04:24 2016
-// Update Count     : 32
+// Last Modified On : Sun Apr 10 23:00:12 2016
+// Update Count     : 92
 //
 
-#ifndef IOSTREAM_H
-#define IOSTREAM_H
+#ifndef __IOSTREAM_H__
+#define __IOSTREAM_H__
 
 #include "iterator"
 
-typedef unsigned long streamsize_type;
+trait ostream( dtype ostype ) {
+	_Bool sepPrt( ostype * );							// return separator state (on/off)
+	void sepOn( ostype * );								// turn separator state on
+	void sepOff( ostype * );							// turn separator state off
+	void sepReset( ostype * );							// set separator state to default state
+	void sepReset( ostype *, _Bool );					// set separator and default state
+	void sepSet( ostype *, const char * );				// set separator to string (15 character maximum)
+	const char * sepGet( ostype * );					// get separator string 
+	_Bool sepDisable( ostype * );						// set default state to off, and return previous state
+	_Bool sepEnable( ostype * );						// set default state to on, and return previous state
 
-context ostream( dtype ostype ) {
 	int fail( ostype * );
 	int flush( ostype * );
-	ostype * write( ostype *, const char *, streamsize_type );
+	void open( ostype * os, const char * name, const char * mode );
+	void close( ostype * os );
+	ostype * write( ostype *, const char *, unsigned long int );
+	int prtfmt( ostype *, const char fmt[], ... );
 };
-context writeable( type T ) {
+
+trait writeable( otype T ) {
 	forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
 };
@@ -33,4 +45,7 @@
 
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, char );
+
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, short int );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned short int );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, int );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned int );
@@ -39,44 +54,74 @@
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned long int );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned long long int );
+
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, float ); // FIX ME: should not be required
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, double );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, long double );
+
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, float _Complex );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, double _Complex );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, long double _Complex );
+
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char * );
 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const void * );
 
-forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) retostype * ?|?( ostype *os, retostype * (* manip)(ostype*) );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, ostype * (*)( ostype * ) );
 forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * );
+forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * );
+forall( dtype ostype | ostream( ostype ) ) ostype * sepOff( ostype * );
+forall( dtype ostype | ostream( ostype ) ) ostype * sepDisable( ostype * );
+forall( dtype ostype | ostream( ostype ) ) ostype * sepEnable( ostype * );
 
 // writes the range [begin, end) to the given stream
-forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) )
+forall( otype elt_type | writeable( elt_type ), otype iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) )
 void write( iterator_type begin, iterator_type end, os_type *os );
 
-forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) )
+forall( otype elt_type | writeable( elt_type ), otype iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) )
 void write_reverse( iterator_type begin, iterator_type end, os_type *os );
 
 //---------------------------------------
 
-context istream( dtype istype ) {
+trait istream( dtype istype ) {
 	int fail( istype * );
 	int eof( istype * );
-	istype * get( istype *, int * );
-	istype * read( istype *, char *, streamsize_type );
+	void open( istype * is, const char * name, const char * mode );
+	void close( istype * is );
+	istype * read( istype *, char *, unsigned long int );
 	istype * ungetc( istype *, char );
+	int scanfmt( istype *, const char fmt[], ... );
 };
 
-context readable( type T ) {
+trait readable( otype T ) {
 	forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, T );
 };
 
-forall( dtype istype | istream( istype ) )
-istype * ?|?( istype *, char * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, char * );
 
-forall( dtype istype | istream( istype ) )
-istype * ?|?( istype *, int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, short int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned short int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long long int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned long int * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, unsigned long long int * );
 
-#endif // IOSTREAM_H
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, float * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, double * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double * );
+
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, float _Complex * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, double _Complex * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double _Complex * );
+
+struct _Istream_cstrUC { char * s; };
+_Istream_cstrUC cstr( char * );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrUC );
+
+struct _Istream_cstrC { char * s; int size; };
+_Istream_cstrC cstr( char *, int size );
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrC );
+
+#endif // __IOSTREAM_H__
 
 // Local Variables: //
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/iostream.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -7,9 +7,9 @@
 // iostream.c -- 
 //
-// Author           : Richard C. Bilson
+// Author           : Peter A. Buhr
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 17 14:19:56 2016
-// Update Count     : 76
+// Last Modified On : Wed Apr  6 16:13:29 2016
+// Update Count     : 278
 //
 
@@ -21,117 +21,224 @@
 #include <float.h>										// DBL_DIG, LDBL_DIG
 #include <complex.h>									// creal, cimag
+#include <ctype.h>										// isspace, ispunct
 }
 
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype *os, char c ) {
-	return write( os, &c, 1 );
+	prtfmt( os, "%c", c );
+	sepOff( os );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, short int si ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%hd", si );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, unsigned short int usi ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%hu", usi );
+	return os;
 } // ?|?
 
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype *os, int i ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%d", i ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned int i ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%u", i ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long int i ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%ld", i ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long long int i ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%lld", i ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned long int i ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%lu", i ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, unsigned long long int i ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%llu", i ) );
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%d", i );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, unsigned int ui ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%u", ui );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, long int li ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%ld", li );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, unsigned long int uli ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%lu", uli );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, long long int lli ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%lld", lli );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, unsigned long long int ulli ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%llu", ulli );
+	return os;
 } // ?|?
 
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype *os, float f ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%g", f ) );
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%g", f );
+	return os;
 } // ?|?
 
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype *os, double d ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%.*lg", DBL_DIG, d ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long double d ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%.*Lg", LDBL_DIG, d ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, float _Complex c ) {
-	return os | crealf( c ) | (cimagf( c ) < 0 ? "" : "+") | cimagf( c ) | 'i';
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, double _Complex c ) {
-	return os | creal( c ) | (cimag( c ) < 0 ? "" : "+") | cimag( c ) | 'i';
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, long double _Complex c ) {
-	return os | creall( c ) | (cimagl( c ) < 0 ? "" : "+") | cimagl( c ) | 'i';
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%.*lg", DBL_DIG, d );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, long double ld ) {
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%.*Lg", LDBL_DIG, ld );
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, float _Complex fc ) {
+	os | crealf( fc );
+	_Bool temp = sepDisable( os );						// disable separators within complex value
+	if ( cimagf( fc ) >= 0 ) os | '+';					// negative value prints '-'
+	os | cimagf( fc ) | 'i';
+	sepReset( os, temp );								// reset separator
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, double _Complex dc ) {
+	os | creal( dc );
+	_Bool temp = sepDisable( os );						// disable separators within complex value
+	if ( cimag( dc ) >= 0 ) os | '+';					// negative value prints '-'
+	os | cimag( dc ) | 'i';
+	sepReset( os, temp );								// reset separator
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, long double _Complex ldc ) {
+	os | creall( ldc );
+	_Bool temp = sepDisable( os );						// disable separators within complex value
+	if ( cimagl( ldc ) >= 0 ) os | '+';					// negative value prints '-'
+	os | cimagl( ldc ) | 'i';
+	sepReset( os, temp );								// reset separator
+	return os;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, const char *cp ) {
+	enum { Open = 1, Close, OpenClose };
+	static const unsigned char mask[256] = {
+		// opening delimiters
+		['('] : Open, ['['] : Open, ['{'] : Open,
+		['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
+		// closing delimiters
+		[','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close,
+		[')'] : Close, [']'] : Close, ['}'] : Close,
+		['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close,
+		// opening-closing delimiters
+		['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose,
+		['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
+	}; // mask
+
+	int len = strlen( cp );
+	// null string => no separator
+  if ( len == 0 ) { sepOff( os ); return os; }
+	// first character IS NOT spacing or closing punctuation => add left separator
+	unsigned char ch = cp[0];							// must make unsigned
+	if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
+		prtfmt( os, "%s", sepGet( os ) );
+	} // if
+	// last character IS spacing or opening punctuation => turn off separator for next item
+	unsigned int posn = len - 1;
+	ch = cp[posn];										// must make unsigned
+	if ( mask[ ch ] == Open || mask[ ch ] == OpenClose ) {
+		sepOff( os );
+	} else {
+		sepOn( os );
+	} // if
+	return write( os, cp, len );
 } // ?|?
 
 forall( dtype ostype | ostream( ostype ) )
 ostype * ?|?( ostype *os, const void *p ) {
-	char buffer[32];
-	return write( os, buffer, sprintf( buffer, "%p", p ) );
-} // ?|?
-
-forall( dtype ostype | ostream( ostype ) )
-ostype * ?|?( ostype *os, const char *cp ) {
-	return write( os, cp, strlen( cp ) );
-} // ?|?
-
-
-forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) 
-retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) {
-  return manip( os );
-}
+	if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
+	sepReset( os );
+	prtfmt( os, "%p", p );
+	return os;
+} // ?|?
+
+
+forall( dtype ostype | ostream( ostype ) ) 
+ostype * ?|?( ostype *os, ostype * (* manip)( ostype * ) ) {
+	return manip( os );
+} // ?|?
 
 forall( dtype ostype | ostream( ostype ) ) 
 ostype * endl( ostype * os ) {
-	os | "\n";
+	os | '\n';
 	flush( os );
+	sepOff( os );
 	return os;
 } // endl
 
+forall( dtype ostype | ostream( ostype ) ) 
+ostype * sepOn( ostype * os ) {
+	sepOn( os );
+	return os;
+} // sepOn
+
+forall( dtype ostype | ostream( ostype ) ) 
+ostype * sepOff( ostype * os ) {
+	sepOff( os );
+	return os;
+} // sepOff
+
+forall( dtype ostype | ostream( ostype ) ) 
+ostype * sepEnable( ostype * os ) {
+	sepEnable( os );
+	return os;
+} // sepEnable
+
+forall( dtype ostype | ostream( ostype ) ) 
+ostype * sepDisable( ostype * os ) {
+	sepDisable( os );
+	return os;
+} // sepDisable
+
 //---------------------------------------
 
-forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ),
-		dtype os_type | ostream( os_type ) )
-void write( iterator_type begin, iterator_type end, os_type *os ) {
-	void print( elt_type i ) { os | i | ' '; }
+forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) )
+void write( iteratortype begin, iteratortype end, ostype *os ) {
+	void print( elttype i ) { os | i; }
 	for_each( begin, end, print );
 } // ?|?
 
-forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ),
-		dtype os_type | ostream( os_type ) )
-void write_reverse( iterator_type begin, iterator_type end, os_type *os ) {
-	void print( elt_type i ) { os | i | ' '; }
+forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) )
+void write_reverse( iteratortype begin, iteratortype end, ostype *os ) {
+	void print( elttype i ) { os | i; }
 	for_each_reverse( begin, end, print );
 } // ?|?
@@ -140,12 +247,116 @@
 
 forall( dtype istype | istream( istype ) )
-istype * ?|?( istype *is, char *cp ) {
-	return read( is, cp, 1 );
-} // ?|?
-
-forall( dtype istype | istream( istype ) )
-istype * ?|?( istype *is, int *ip ) {
-	return get( is, ip );
-} // ?|?
+istype * ?|?( istype * is, char * c ) {
+	scanfmt( is, "%c", c );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, short int * si ) {
+	scanfmt( is, "%hd", si );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, unsigned short int * usi ) {
+	scanfmt( is, "%hu", usi );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, int * i ) {
+	scanfmt( is, "%d", i );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, unsigned int * ui ) {
+	scanfmt( is, "%u", ui );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, long int * li ) {
+	scanfmt( is, "%ld", li );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, unsigned long int * ulli ) {
+	scanfmt( is, "%lu", ulli );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, long long int * lli ) {
+	scanfmt( is, "%lld", lli );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, unsigned long long int * ulli ) {
+	scanfmt( is, "%llu", ulli );
+	return is;
+} // ?|?
+
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, float * f ) {
+	scanfmt( is, "%f", f );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, double * d ) {
+	scanfmt( is, "%lf", d );
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, long double * ld ) {
+	scanfmt( is, "%Lf", ld );
+	return is;
+} // ?|?
+
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, float _Complex * fc ) {
+	float re, im;
+	scanfmt( is, "%g%gi", &re, &im );
+	*fc = re + im * _Complex_I;
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, double _Complex * dc ) {
+	double re, im;
+	scanfmt( is, "%lf%lfi", &re, &im );
+	*dc = re + im * _Complex_I;
+	return is;
+} // ?|?
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, long double _Complex * ldc ) {
+	long double re, im;
+	scanfmt( is, "%Lf%Lfi", &re, &im );
+	*ldc = re + im * _Complex_I;
+	return is;
+} // ?|?
+
+_Istream_cstrUC cstr( char * s ) { _Istream_cstrUC s = { s }; return s; }
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, _Istream_cstrUC cstr ) {
+	scanfmt( is, "%s", cstr.s );
+	return is;
+} // cstr
+
+_Istream_cstrC cstr( char * s, int size ) { _Istream_cstrC s = { s, size }; return s; }
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype * is, _Istream_cstrC cstr ) {
+	char buf[16];
+	sprintf( buf, "%%%ds", cstr.size );
+	scanfmt( is, buf, cstr.s );
+	return is;
+} // cstr
 
 // Local Variables: //
Index: src/libcfa/iterator
===================================================================
--- src/libcfa/iterator	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/iterator	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 27 23:49:13 2016
-// Update Count     : 7
+// Last Modified On : Wed Mar  2 18:06:05 2016
+// Update Count     : 9
 //
 
@@ -18,5 +18,5 @@
 
 // An iterator can be used to traverse a data structure.
-context iterator( type iterator_type, type elt_type ) {
+trait iterator( otype iterator_type, otype elt_type ) {
 	// point to the next element
 //	iterator_type ?++( iterator_type * );
@@ -32,5 +32,5 @@
 };
 
-context iterator_for( type iterator_type, type collection_type, type elt_type | iterator( iterator_type, elt_type ) ) {
+trait iterator_for( otype iterator_type, otype collection_type, otype elt_type | iterator( iterator_type, elt_type ) ) {
 //	[ iterator_type begin, iterator_type end ] get_iterators( collection_type );
 	iterator_type begin( collection_type );
@@ -38,8 +38,8 @@
 };
 
-forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) )
+forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
 void for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) );
 
-forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) )
+forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
 void for_each_reverse( iterator_type begin, iterator_type end, void (*func)( elt_type ) );
 
Index: src/libcfa/iterator.c
===================================================================
--- src/libcfa/iterator.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/iterator.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,11 +10,11 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan 26 17:16:07 2016
-// Update Count     : 26
+// Last Modified On : Wed Mar  2 18:08:11 2016
+// Update Count     : 27
 //
 
 #include "iterator"
 
-forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) )
+forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
 void for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) {
 	for ( iterator_type i = begin; i != end; ++i ) {
@@ -23,5 +23,5 @@
 }
 
-forall( type iterator_type, type elt_type | iterator( iterator_type, elt_type ) )
+forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
 void for_each_reverse( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) {
 	for ( iterator_type i = end; i != begin; ) {
Index: src/libcfa/limits
===================================================================
--- src/libcfa/limits	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/limits	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -1,92 +1,112 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// limits -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Apr  6 18:06:52 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Apr  6 21:08:16 2016
+// Update Count     : 6
+// 
+
 // Integral Constants
 
-const short int MIN = -32768;
-const int MIN = -2147483648;
-const long int MIN = -9223372036854775807L - 1L;
-const long long int MIN = -9223372036854775807LL - 1LL;
+extern const short int MIN;
+extern const int MIN;
+extern const long int MIN;
+extern const long long int MIN;
 
-const short int MAX = 32767;
-const unsigned short int MAX = 65535;
-const int MAX = 2147483647;
-const unsigned int MAX = 4294967295_U;
-const long int MAX = 9223372036854775807_L;
-const unsigned long int MAX = 4294967295_U;
-const long long int MAX = 9223372036854775807_LL;
-const unsigned long long int MAX = 18446744073709551615_ULL;
+extern const short int MAX;
+extern const unsigned short int MAX;
+extern const int MAX;
+extern const unsigned int MAX;
+extern const long int MAX;
+extern const unsigned long int MAX;
+extern const long long int MAX;
+extern const unsigned long long int MAX;
 
 // Floating-Point Constants
 
-const float PI = 3.141592_F;				// pi
-const float PI_2 = 1.570796_F;				// pi / 2
-const float PI_4 = 0.7853981_F;				// pi / 4
-const float _1_PI = 0.3183098_F;			// 1 / pi
-const float _2_PI = 0.6366197_F;			// 2 / pi
-const float _2_SQRT_PI = 1.128379_F;			// 2 / sqrt(pi)
+extern const float PI;									// pi
+extern const float PI_2;								// pi / 2
+extern const float PI_4;								// pi / 4
+extern const float _1_PI;								// 1 / pi
+extern const float _2_PI;								// 2 / pi
+extern const float _2_SQRT_PI;							// 2 / sqrt(pi)
 
-const double PI = 3.14159265358979323846_D;		// pi
-const double PI_2 = 1.57079632679489661923_D;		// pi / 2
-const double PI_4 = 0.78539816339744830962_D;		// pi / 4
-const double _1_PI = 0.31830988618379067154_D;		// 1 / pi
-const double _2_PI = 0.63661977236758134308_D;		// 2 / pi
-const double _2_SQRT_PI = 1.12837916709551257390_D;	// 2 / sqrt(pi)
+extern const double PI;									// pi
+extern const double PI_2;								// pi / 2
+extern const double PI_4;								// pi / 4
+extern const double _1_PI;								// 1 / pi
+extern const double _2_PI;								// 2 / pi
+extern const double _2_SQRT_PI;							// 2 / sqrt(pi)
 
-const long double PI = 3.1415926535897932384626433832795029_DL; // pi
-const long double PI_2 = 1.5707963267948966192313216916397514_DL; // pi / 2
-const long double PI_4 = 0.7853981633974483096156608458198757_DL; // pi / 4
-const long double _1_PI = 0.3183098861837906715377675267450287_DL; // 1 / pi
-const long double _2_PI = 0.6366197723675813430755350534900574_DL; // 2 / pi
-const long double _2_SQRT_PI = 1.1283791670955125738961589031215452_DL; // 2 / sqrt(pi)
+extern const long double PI;							// pi
+extern const long double PI_2;							// pi / 2
+extern const long double PI_4;							// pi / 4
+extern const long double _1_PI;							// 1 / pi
+extern const long double _2_PI;							// 2 / pi
+extern const long double _2_SQRT_PI;					// 2 / sqrt(pi)
 
-const _Complex PI = 3.14159265358979323846_D+0.0_iD;	// pi
-const _Complex PI_2 = 1.57079632679489661923_D+0.0_iD;	// pi / 2
-const _Complex PI_4 = 0.78539816339744830962_D+0.0_iD;	// pi / 4
-const _Complex _1_PI = 0.31830988618379067154_D+0.0_iD;	// 1 / pi
-const _Complex _2_PI = 0.63661977236758134308_D+0.0_iD;	// 2 / pi
-const _Complex _2_SQRT_PI = 1.12837916709551257390_D+0.0_iD; // 2 / sqrt(pi)
+extern const _Complex PI;								// pi
+extern const _Complex PI_2;								// pi / 2
+extern const _Complex PI_4;								// pi / 4
+extern const _Complex _1_PI;							// 1 / pi
+extern const _Complex _2_PI;							// 2 / pi
+extern const _Complex _2_SQRT_PI;						// 2 / sqrt(pi)
 
-const long _Complex PI = 3.1415926535897932384626433832795029_L+0.0iL; // pi
-const long _Complex PI_2 = 1.5707963267948966192313216916397514_L+0.0iL; // pi / 2
-const long _Complex PI_4 = 0.7853981633974483096156608458198757_L+0.0iL; // pi / 4
-const long _Complex _1_PI = 0.3183098861837906715377675267450287_L+0.0iL; // 1 / pi
-const long _Complex _2_PI = 0.6366197723675813430755350534900574_L+0.0iL; // 2 / pi
-const long _Complex _2_SQRT_PI = 1.1283791670955125738961589031215452_L+0.0iL; // 2 / sqrt(pi)
+extern const long _Complex PI;							// pi
+extern const long _Complex PI_2;						// pi / 2
+extern const long _Complex PI_4;						// pi / 4
+extern const long _Complex _1_PI;						// 1 / pi
+extern const long _Complex _2_PI;						// 2 / pi
+extern const long _Complex _2_SQRT_PI;					// 2 / sqrt(pi)
 
-const float E = 2.718281;				// e
-const float LOG2_E = 1.442695;				// log_2(e)
-const float LOG10_E = 0.4342944;			// log_10(e)
-const float LN_2 = 0.6931471;				// log_e(2)
-const float LN_10 = 2.302585;				// log_e(10)
-const float SQRT_2 = 1.414213;				// sqrt(2)
-const float _1_SQRT_2 = 0.7071067;			// 1 / sqrt(2)
+extern const float E;									// e
+extern const float LOG2_E;								// log_2(e)
+extern const float LOG10_E;								// log_10(e)
+extern const float LN_2;								// log_e(2)
+extern const float LN_10;								// log_e(10)
+extern const float SQRT_2;								// sqrt(2)
+extern const float _1_SQRT_2;							// 1 / sqrt(2)
 
-const double E = 2.7182818284590452354_D;		// e
-const double LOG2_E = 1.4426950408889634074_D;		// log_2(e)
-const double LOG10_E = 0.43429448190325182765_D;	// log_10(e)
-const double LN_2 = 0.69314718055994530942_D;		// log_e(2)
-const double LN_10 = 2.30258509299404568402_D;		// log_e(10)
-const double SQRT_2 = 1.41421356237309504880_D;		// sqrt(2)
-const double _1_SQRT_2 = 0.70710678118654752440_D;	// 1 / sqrt(2)
+extern const double E;									// e
+extern const double LOG2_E;								// log_2(e)
+extern const double LOG10_E;							// log_10(e)
+extern const double LN_2;								// log_e(2)
+extern const double LN_10;								// log_e(10)
+extern const double SQRT_2;								// sqrt(2)
+extern const double _1_SQRT_2;							// 1 / sqrt(2)
 
-const long double E = 2.7182818284590452353602874713526625_DL; // e
-const long double LOG2_E = 1.4426950408889634073599246810018921_DL; // log_2(e)
-const long double LOG10_E = 0.4342944819032518276511289189166051_DL; // log_10(e)
-const long double LN_2 = 0.6931471805599453094172321214581766_DL; // log_e(2)
-const long double LN_10 = 2.3025850929940456840179914546843642_DL; // log_e(10)
-const long double SQRT_2 = 1.4142135623730950488016887242096981_DL; // sqrt(2)
-const long double _1_SQRT_2 = 0.7071067811865475244008443621048490_DL; // 1/sqrt(2)
+extern const long double E;								// e
+extern const long double LOG2_E;						// log_2(e)
+extern const long double LOG10_E;						// log_10(e)
+extern const long double LN_2;							// log_e(2)
+extern const long double LN_10;							// log_e(10)
+extern const long double SQRT_2;						// sqrt(2)
+extern const long double _1_SQRT_2;						// 1/sqrt(2)
 
-const _Complex E = 2.7182818284590452354_D+0.0_iD;	// e
-const _Complex LOG2_E = 1.4426950408889634074_D+0.0_iD;	// log_2(e)
-const _Complex LOG10_E = 0.43429448190325182765_D+0.0_iD; // log_10(e)
-const _Complex LN_2 = 0.69314718055994530942_D+0.0_iD;	// log_e(2)
-const _Complex LN_10 = 2.30258509299404568402_D+0.0_iD;	// log_e(10)
-const _Complex SQRT_2 = 1.41421356237309504880_D+0.0_iD;	// sqrt(2)
-const _Complex _1_SQRT_2 = 0.70710678118654752440_D+0.0_iD; // 1 / sqrt(2)
+extern const _Complex E;								// e
+extern const _Complex LOG2_E;							// log_2(e)
+extern const _Complex LOG10_E;							// log_10(e)
+extern const _Complex LN_2;								// log_e(2)
+extern const _Complex LN_10;							// log_e(10)
+extern const _Complex SQRT_2;							// sqrt(2)
+extern const _Complex _1_SQRT_2;						// 1 / sqrt(2)
 
-const long _Complex E = 2.7182818284590452353602874713526625_L+0.0_iL; // e
-const long _Complex LOG2_E = 1.4426950408889634073599246810018921_L+0.0_iL; // log_2(e)
-const long _Complex LOG10_E = 0.4342944819032518276511289189166051_L+0.0_iL; // log_10(e)
-const long _Complex LN_2 = 0.6931471805599453094172321214581766_L+0.0_iL; // log_e(2)
-const long _Complex LN_10 = 2.3025850929940456840179914546843642_L+0.0_iL; // log_e(10)
-const long _Complex SQRT_2 = 1.4142135623730950488016887242096981_L+0.0_iL; // sqrt(2)
-const long _Complex _1_SQRT_2 = 0.7071067811865475244008443621048490_L+0.0_iL; // 1 / sqrt(2)
+extern const long _Complex E;							// e
+extern const long _Complex LOG2_E;						// log_2(e)
+extern const long _Complex LOG10_E;						// log_10(e)
+extern const long _Complex LN_2;						// log_e(2)
+extern const long _Complex LN_10;						// log_e(10)
+extern const long _Complex SQRT_2;						// sqrt(2)
+extern const long _Complex _1_SQRT_2;					// 1 / sqrt(2)
+
+// Local Variables: //
+// mode: c //
+// tab-width: 4 //
+// End: //
Index: src/libcfa/limits.c
===================================================================
--- src/libcfa/limits.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/libcfa/limits.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,114 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// limits.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Apr  6 18:06:52 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Apr  7 17:18:45 2016
+// Update Count     : 11
+// 
+
+#include "limits"
+
+// Integral Constants
+
+const short int MIN = -32768;
+const int MIN = -2147483648;
+const long int MIN = -9223372036854775807L - 1L;
+const long long int MIN = -9223372036854775807LL - 1LL;
+
+const short int MAX = 32767;
+const unsigned short int MAX = 65535;
+const int MAX = 2147483647;
+const unsigned int MAX = 4294967295_U;
+const long int MAX = 9223372036854775807_L;
+const unsigned long int MAX = 4294967295_U;
+const long long int MAX = 9223372036854775807_LL;
+const unsigned long long int MAX = 18446744073709551615_ULL;
+
+// Floating-Point Constants
+
+const float PI = 3.141592_F;							// pi
+const float PI_2 = 1.570796_F;							// pi / 2
+const float PI_4 = 0.7853981_F;							// pi / 4
+const float _1_PI = 0.3183098_F;						// 1 / pi
+const float _2_PI = 0.6366197_F;						// 2 / pi
+const float _2_SQRT_PI = 1.128379_F;					// 2 / sqrt(pi)
+
+const double PI = 3.14159265358979323846_D;				// pi
+const double PI_2 = 1.57079632679489661923_D;			// pi / 2
+const double PI_4 = 0.78539816339744830962_D;			// pi / 4
+const double _1_PI = 0.31830988618379067154_D;			// 1 / pi
+const double _2_PI = 0.63661977236758134308_D;			// 2 / pi
+const double _2_SQRT_PI = 1.12837916709551257390_D;		// 2 / sqrt(pi)
+
+const long double PI = 3.1415926535897932384626433832795029_DL; // pi
+const long double PI_2 = 1.5707963267948966192313216916397514_DL; // pi / 2
+const long double PI_4 = 0.7853981633974483096156608458198757_DL; // pi / 4
+const long double _1_PI = 0.3183098861837906715377675267450287_DL; // 1 / pi
+const long double _2_PI = 0.6366197723675813430755350534900574_DL; // 2 / pi
+const long double _2_SQRT_PI = 1.1283791670955125738961589031215452_DL; // 2 / sqrt(pi)
+
+const _Complex PI = 3.14159265358979323846_D+0.0_iD;	// pi
+const _Complex PI_2 = 1.57079632679489661923_D+0.0_iD;	// pi / 2
+const _Complex PI_4 = 0.78539816339744830962_D+0.0_iD;	// pi / 4
+const _Complex _1_PI = 0.31830988618379067154_D+0.0_iD;	// 1 / pi
+const _Complex _2_PI = 0.63661977236758134308_D+0.0_iD;	// 2 / pi
+const _Complex _2_SQRT_PI = 1.12837916709551257390_D+0.0_iD; // 2 / sqrt(pi)
+
+const long _Complex PI = 3.1415926535897932384626433832795029_L+0.0iL; // pi
+const long _Complex PI_2 = 1.5707963267948966192313216916397514_L+0.0iL; // pi / 2
+const long _Complex PI_4 = 0.7853981633974483096156608458198757_L+0.0iL; // pi / 4
+const long _Complex _1_PI = 0.3183098861837906715377675267450287_L+0.0iL; // 1 / pi
+const long _Complex _2_PI = 0.6366197723675813430755350534900574_L+0.0iL; // 2 / pi
+const long _Complex _2_SQRT_PI = 1.1283791670955125738961589031215452_L+0.0iL; // 2 / sqrt(pi)
+
+const float E = 2.718281;								// e
+const float LOG2_E = 1.442695;							// log_2(e)
+const float LOG10_E = 0.4342944;						// log_10(e)
+const float LN_2 = 0.6931471;							// log_e(2)
+const float LN_10 = 2.302585;							// log_e(10)
+const float SQRT_2 = 1.414213;							// sqrt(2)
+const float _1_SQRT_2 = 0.7071067;						// 1 / sqrt(2)
+
+const double E = 2.7182818284590452354_D;				// e
+const double LOG2_E = 1.4426950408889634074_D;			// log_2(e)
+const double LOG10_E = 0.43429448190325182765_D;		// log_10(e)
+const double LN_2 = 0.69314718055994530942_D;			// log_e(2)
+const double LN_10 = 2.30258509299404568402_D;			// log_e(10)
+const double SQRT_2 = 1.41421356237309504880_D;			// sqrt(2)
+const double _1_SQRT_2 = 0.70710678118654752440_D;		// 1 / sqrt(2)
+
+const long double E = 2.7182818284590452353602874713526625_DL; // e
+const long double LOG2_E = 1.4426950408889634073599246810018921_DL; // log_2(e)
+const long double LOG10_E = 0.4342944819032518276511289189166051_DL; // log_10(e)
+const long double LN_2 = 0.6931471805599453094172321214581766_DL; // log_e(2)
+const long double LN_10 = 2.3025850929940456840179914546843642_DL; // log_e(10)
+const long double SQRT_2 = 1.4142135623730950488016887242096981_DL; // sqrt(2)
+const long double _1_SQRT_2 = 0.7071067811865475244008443621048490_DL; // 1/sqrt(2)
+
+const _Complex E = 2.7182818284590452354_D+0.0_iD;		// e
+const _Complex LOG2_E = 1.4426950408889634074_D+0.0_iD;	// log_2(e)
+const _Complex LOG10_E = 0.43429448190325182765_D+0.0_iD; // log_10(e)
+const _Complex LN_2 = 0.69314718055994530942_D+0.0_iD;	// log_e(2)
+const _Complex LN_10 = 2.30258509299404568402_D+0.0_iD;	// log_e(10)
+const _Complex SQRT_2 = 1.41421356237309504880_D+0.0_iD; // sqrt(2)
+const _Complex _1_SQRT_2 = 0.70710678118654752440_D+0.0_iD; // 1 / sqrt(2)
+
+const long _Complex E = 2.7182818284590452353602874713526625_L+0.0_iL; // e
+const long _Complex LOG2_E = 1.4426950408889634073599246810018921_L+0.0_iL; // log_2(e)
+const long _Complex LOG10_E = 0.4342944819032518276511289189166051_L+0.0_iL; // log_10(e)
+const long _Complex LN_2 = 0.6931471805599453094172321214581766_L+0.0_iL; // log_e(2)
+const long _Complex LN_10 = 2.3025850929940456840179914546843642_L+0.0_iL; // log_e(10)
+const long _Complex SQRT_2 = 1.4142135623730950488016887242096981_L+0.0_iL; // sqrt(2)
+const long _Complex _1_SQRT_2 = 0.7071067811865475244008443621048490_L+0.0_iL; // 1 / sqrt(2)
+
+// Local Variables: //
+// mode: c //
+// tab-width: 4 //
+// End: //
Index: c/libcfa/math.h
===================================================================
--- src/libcfa/math.h	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ 	(revision )
@@ -1,33 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// math.h -- 
-//
-// Author           : Peter A. Buhr
-// Created On       : Mon Nov 10 23:41:29 2014
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 21 08:37:57 2015
-// Update Count     : 12
-
-// This include file uses the CFA keyword "type" as a field name of a structure.
-
-#if ! defined( type )									// nesting ?
-#define type `type`
-#define __CFA_MATH_H__
-#endif // ! type
-
-#include_next <math.h>									// has internal check for multiple expansion
-
-#if defined( type ) && defined( __CFA_MATH_H__ )		// reset only if set
-#undef type
-#undef __CFA_MATH_H__
-#endif // type && __CFA_MATH_H__
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/libcfa/prelude.cf
===================================================================
--- src/libcfa/prelude.cf	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/prelude.cf	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -1,2 +1,3 @@
+# 2 "prelude.cf"  // needed for error messages from this file
 //                               -*- Mode: C -*- 
 // 
@@ -8,6 +9,6 @@
 // Created On       : Sat Nov 29 07:23:41 2014
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan  4 11:13:26 2016
-// Update Count     : 81
+// Last Modified On : Wed Mar  2 18:03:41 2016
+// Update Count     : 89
 //
 
@@ -63,21 +64,21 @@
 long double _Complex	?--( long double _Complex * ),		?--( volatile long double _Complex * );
 
-forall( type T ) T *			 ?++(		     T ** );
-forall( type T ) const T *		 ?++( const	     T ** );
-forall( type T ) volatile T *		 ?++(	    volatile T ** );
-forall( type T ) const volatile T *	 ?++( const volatile T ** );
-forall( type T ) T *			 ?--(		     T ** );
-forall( type T ) const T *		 ?--( const	     T ** );
-forall( type T ) volatile T *		 ?--(	    volatile T ** );
-forall( type T ) const volatile T *	 ?--( const volatile T ** );
-
-forall( type T ) lvalue T		 ?[?](		      T *,	    ptrdiff_t );
-forall( type T ) const lvalue T		 ?[?]( const	      T *,	    ptrdiff_t );
-forall( type T ) volatile lvalue T	 ?[?](       volatile T *,	    ptrdiff_t );
-forall( type T ) const volatile lvalue T ?[?]( const volatile T *,	    ptrdiff_t );
-forall( type T ) lvalue T		 ?[?](		ptrdiff_t,		  T * );
-forall( type T ) const lvalue T		 ?[?](		ptrdiff_t, const	  T * );
-forall( type T ) volatile lvalue T	 ?[?](		ptrdiff_t,	 volatile T * );
-forall( type T ) const volatile lvalue T ?[?](		ptrdiff_t, const volatile T * );
+forall( otype T ) T *			 ?++(		     T ** );
+forall( otype T ) const T *		 ?++( const	     T ** );
+forall( otype T ) volatile T *		 ?++(	    volatile T ** );
+forall( otype T ) const volatile T *	 ?++( const volatile T ** );
+forall( otype T ) T *			 ?--(		     T ** );
+forall( otype T ) const T *		 ?--( const	     T ** );
+forall( otype T ) volatile T *		 ?--(	    volatile T ** );
+forall( otype T ) const volatile T *	 ?--( const volatile T ** );
+
+forall( otype T ) lvalue T		 ?[?](		      T *,	    ptrdiff_t );
+forall( otype T ) const lvalue T	 ?[?]( const	      T *,	    ptrdiff_t );
+forall( otype T ) volatile lvalue T	 ?[?](       volatile T *,	    ptrdiff_t );
+forall( otype T ) const volatile lvalue T ?[?]( const volatile T *,	    ptrdiff_t );
+forall( otype T ) lvalue T		 ?[?](		ptrdiff_t,		  T * );
+forall( otype T ) const lvalue T	 ?[?](		ptrdiff_t, const	  T * );
+forall( otype T ) volatile lvalue T	 ?[?](		ptrdiff_t,	 volatile T * );
+forall( otype T ) const volatile lvalue T ?[?](		ptrdiff_t, const volatile T * );
 
 // ------------------------------------------------------------
@@ -101,17 +102,17 @@
 long double _Complex	++?( long double _Complex * ),		--?( long double _Complex * );
 
-forall( type T ) T *			 ++?(		     T ** );
-forall( type T ) const T *		 ++?( const	     T ** );
-forall( type T ) volatile T *		 ++?(	    volatile T ** );
-forall( type T ) const volatile T *	 ++?( const volatile T ** );
-forall( type T ) T *			 --?(		     T ** );
-forall( type T ) const T *		 --?( const	     T ** );
-forall( type T ) volatile T *		 --?(	    volatile T ** );
-forall( type T ) const volatile T *	 --?( const volatile T ** );
-
-forall( type T ) lvalue T		 *?(		     T * );
-forall( type T ) const lvalue T		 *?( const	     T * );
-forall( type T ) volatile lvalue T	 *?(       volatile  T * );
-forall( type T ) const volatile lvalue T *?( const volatile  T * );
+forall( otype T ) T *			 ++?(		     T ** );
+forall( otype T ) const T *		 ++?( const	     T ** );
+forall( otype T ) volatile T *		 ++?(	    volatile T ** );
+forall( otype T ) const volatile T *	 ++?( const volatile T ** );
+forall( otype T ) T *			 --?(		     T ** );
+forall( otype T ) const T *		 --?( const	     T ** );
+forall( otype T ) volatile T *		 --?(	    volatile T ** );
+forall( otype T ) const volatile T *	 --?( const volatile T ** );
+
+forall( otype T ) lvalue T		 *?(		     T * );
+forall( otype T ) const lvalue T		 *?( const	     T * );
+forall( otype T ) volatile lvalue T	 *?(       volatile  T * );
+forall( otype T ) const volatile lvalue T *?( const volatile  T * );
 forall( ftype FT ) lvalue FT		 *?( FT * );
 
@@ -183,17 +184,17 @@
 long double _Complex	?+?( long double _Complex, long double _Complex ),	?-?( long double _Complex, long double _Complex );
 
-forall( type T ) T *			?+?(		    T *,	  ptrdiff_t );
-forall( type T ) T *			?+?(	      ptrdiff_t,		T * );
-forall( type T ) const T *		?+?( const	    T *,	  ptrdiff_t );
-forall( type T ) const T *		?+?(	      ptrdiff_t, const		T * );
-forall( type T ) volatile T *		?+?(	   volatile T *,	  ptrdiff_t );
-forall( type T ) volatile T *		?+?(	      ptrdiff_t,       volatile T * );
-forall( type T ) const volatile T *	?+?( const volatile T *,	  ptrdiff_t );
-forall( type T ) const volatile T *	?+?(	      ptrdiff_t, const volatile T * );
-forall( type T ) T *			?-?(		    T *,	  ptrdiff_t );
-forall( type T ) const T *		?-?( const	    T *,	  ptrdiff_t );
-forall( type T ) volatile T *		?-?(	   volatile T *,	  ptrdiff_t );
-forall( type T ) const volatile T *	?-?( const volatile T *,	  ptrdiff_t );
-forall( type T ) ptrdiff_t		?-?( const volatile T *, const volatile T * );
+forall( otype T ) T *			?+?(		    T *,	  ptrdiff_t );
+forall( otype T ) T *			?+?(	      ptrdiff_t,		T * );
+forall( otype T ) const T *		?+?( const	    T *,	  ptrdiff_t );
+forall( otype T ) const T *		?+?(	      ptrdiff_t, const		T * );
+forall( otype T ) volatile T *		?+?(	   volatile T *,	  ptrdiff_t );
+forall( otype T ) volatile T *		?+?(	      ptrdiff_t,       volatile T * );
+forall( otype T ) const volatile T *	?+?( const volatile T *,	  ptrdiff_t );
+forall( otype T ) const volatile T *	?+?(	      ptrdiff_t, const volatile T * );
+forall( otype T ) T *			?-?(		    T *,	  ptrdiff_t );
+forall( otype T ) const T *		?-?( const	    T *,	  ptrdiff_t );
+forall( otype T ) volatile T *		?-?(	   volatile T *,	  ptrdiff_t );
+forall( otype T ) const volatile T *	?-?( const volatile T *,	  ptrdiff_t );
+forall( otype T ) ptrdiff_t		?-?( const volatile T *, const volatile T * );
 
 // ------------------------------------------------------------
@@ -431,20 +432,20 @@
 forall( ftype FT ) FT *			?=?( FT * volatile *, forall( ftype FT2 ) FT2 * );
 
-forall( type T ) T *			?+=?(		     T *	  *, ptrdiff_t );
-forall( type T ) T *			?+=?(		     T * volatile *, ptrdiff_t );
-forall( type T ) const T *		?+=?( const	     T *	  *, ptrdiff_t );
-forall( type T ) const T *		?+=?( const	     T * volatile *, ptrdiff_t );
-forall( type T ) volatile T *		?+=?(	    volatile T *	  *, ptrdiff_t );
-forall( type T ) volatile T *		?+=?(	    volatile T * volatile *, ptrdiff_t );
-forall( type T ) const volatile T *	?+=?( const volatile T *	  *, ptrdiff_t );
-forall( type T ) const volatile T *	?+=?( const volatile T * volatile *, ptrdiff_t );
-forall( type T ) T *			?-=?(		     T *	  *, ptrdiff_t );
-forall( type T ) T *			?-=?(		     T * volatile *, ptrdiff_t );
-forall( type T ) const T *		?-=?( const	     T *	  *, ptrdiff_t );
-forall( type T ) const T *		?-=?( const	     T * volatile *, ptrdiff_t );
-forall( type T ) volatile T *		?-=?(	    volatile T *	  *, ptrdiff_t );
-forall( type T ) volatile T *		?-=?(	    volatile T * volatile *, ptrdiff_t );
-forall( type T ) const volatile T *	?-=?( const volatile T *	  *, ptrdiff_t );
-forall( type T ) const volatile T *	?-=?( const volatile T * volatile *, ptrdiff_t );
+forall( otype T ) T *			?+=?(		     T *	  *, ptrdiff_t );
+forall( otype T ) T *			?+=?(		     T * volatile *, ptrdiff_t );
+forall( otype T ) const T *		?+=?( const	     T *	  *, ptrdiff_t );
+forall( otype T ) const T *		?+=?( const	     T * volatile *, ptrdiff_t );
+forall( otype T ) volatile T *		?+=?(	    volatile T *	  *, ptrdiff_t );
+forall( otype T ) volatile T *		?+=?(	    volatile T * volatile *, ptrdiff_t );
+forall( otype T ) const volatile T *	?+=?( const volatile T *	  *, ptrdiff_t );
+forall( otype T ) const volatile T *	?+=?( const volatile T * volatile *, ptrdiff_t );
+forall( otype T ) T *			?-=?(		     T *	  *, ptrdiff_t );
+forall( otype T ) T *			?-=?(		     T * volatile *, ptrdiff_t );
+forall( otype T ) const T *		?-=?( const	     T *	  *, ptrdiff_t );
+forall( otype T ) const T *		?-=?( const	     T * volatile *, ptrdiff_t );
+forall( otype T ) volatile T *		?-=?(	    volatile T *	  *, ptrdiff_t );
+forall( otype T ) volatile T *		?-=?(	    volatile T * volatile *, ptrdiff_t );
+forall( otype T ) const volatile T *	?-=?( const volatile T *	  *, ptrdiff_t );
+forall( otype T ) const volatile T *	?-=?( const volatile T * volatile *, ptrdiff_t );
 
 _Bool			?=?( _Bool *, _Bool ),					?=?( volatile _Bool *, _Bool );
Index: src/libcfa/rational
===================================================================
--- src/libcfa/rational	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/libcfa/rational	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,66 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// rational -- Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number)
+//     and the denominator (bottom number) are whole numbers. When creating and computing with rational numbers, results
+//     are constantly reduced to keep the numerator and denominator as small as possible.
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Apr  6 17:56:25 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Apr  8 11:38:27 2016
+// Update Count     : 15
+// 
+
+#include "iostream"
+
+// implementation
+struct Rational {
+	long int numerator, denominator;					// invariant: denominator > 0
+}; // Rational
+
+// constants
+extern struct Rational 0;
+extern struct Rational 1;
+
+// constructors
+Rational rational();
+Rational rational( long int n );
+Rational rational( long int n, long int d );
+
+// getter/setter for numerator/denominator
+long int numerator( Rational r );
+long int numerator( Rational r, long int n );
+long int denominator( Rational r );
+long int denominator( Rational r, long int d );
+
+// comparison
+int ?==?( Rational l, Rational r );
+int ?!=?( Rational l, Rational r );
+int ?<?( Rational l, Rational r );
+int ?<=?( Rational l, Rational r );
+int ?>?( Rational l, Rational r );
+int ?>=?( Rational l, Rational r );
+
+// arithmetic
+Rational -?( Rational r );
+Rational ?+?( Rational l, Rational r );
+Rational ?-?( Rational l, Rational r );
+Rational ?*?( Rational l, Rational r );
+Rational ?/?( Rational l, Rational r );
+
+// conversion
+double widen( Rational r );
+Rational narrow( double f, long int md );
+
+// I/O
+forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, Rational * );
+forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, Rational );
+
+// Local Variables: //
+// mode: c //
+// tab-width: 4 //
+// End: //
Index: src/libcfa/rational.c
===================================================================
--- src/libcfa/rational.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
+++ src/libcfa/rational.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -0,0 +1,224 @@
+//                               -*- Mode: C -*- 
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// rational.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Apr  6 17:54:28 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Apr 12 21:26:42 2016
+// Update Count     : 21
+// 
+
+#include "rational"
+#include "fstream"
+#include "stdlib"
+
+
+// constants
+
+struct Rational 0 = {0, 1};
+struct Rational 1 = {1, 1};
+
+
+// helper routines
+
+// Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals.
+// alternative: https://en.wikipedia.org/wiki/Binary_GCD_algorithm
+static long int gcd( long int a, long int b ) {
+    for ( ;; ) {										// Euclid's algorithm
+		long int r = a % b;
+	  if ( r == 0 ) break;
+		a = b;
+		b = r;
+    } // for
+	return b;
+} // gcd
+
+static long int simplify( long int *n, long int *d ) {
+    if ( *d == 0 ) {
+		serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl;
+		exit( EXIT_FAILURE );
+    } // exit
+    if ( *d < 0 ) { *d = -*d; *n = -*n; }				// move sign to numerator
+    return gcd( abs( *n ), *d );						// simplify
+} // Rationalnumber::simplify
+
+
+// constructors
+
+Rational rational() {
+    return (Rational){ 0, 1 };
+} // rational
+
+Rational rational( long int n ) {
+    return (Rational){ n, 1 };
+} // rational
+
+Rational rational( long int n, long int d ) {
+    long int t = simplify( &n, &d );					// simplify
+    return (Rational){ n / t, d / t };
+} // rational
+
+
+// getter/setter for numerator/denominator
+
+long int numerator( Rational r ) {
+    return r.numerator;
+} // numerator
+
+long int numerator( Rational r, long int n ) {
+    long int prev = r.numerator;
+    long int t = gcd( abs( n ), r.denominator );		// simplify
+    r.numerator = n / t;
+    r.denominator = r.denominator / t;
+    return prev;
+} // numerator
+
+long int denominator( Rational r ) {
+    return r.denominator;
+} // denominator
+
+long int denominator( Rational r, long int d ) {
+    long int prev = r.denominator;
+    long int t = simplify( &r.numerator, &d );			// simplify
+    r.numerator = r.numerator / t;
+    r.denominator = d / t;
+    return prev;
+} // denominator
+
+
+// comparison
+
+int ?==?( Rational l, Rational r ) {
+    return l.numerator * r.denominator == l.denominator * r.numerator;
+} // ?==?
+
+int ?!=?( Rational l, Rational r ) {
+    return ! ( l == r );
+} // ?!=?
+
+int ?<?( Rational l, Rational r ) {
+    return l.numerator * r.denominator < l.denominator * r.numerator;
+} // ?<?
+
+int ?<=?( Rational l, Rational r ) {
+    return l < r || l == r;
+} // ?<=?
+
+int ?>?( Rational l, Rational r ) {
+    return ! ( l <= r );
+} // ?>?
+
+int ?>=?( Rational l, Rational r ) {
+    return ! ( l < r );
+} // ?>=?
+
+
+// arithmetic
+
+Rational -?( Rational r ) {
+	Rational t = { -r.numerator, r.denominator };
+    return t;
+} // -?
+
+Rational ?+?( Rational l, Rational r ) {
+    if ( l.denominator == r.denominator ) {				// special case
+		Rational t = { l.numerator + r.numerator, l.denominator };
+		return t;
+    } else {
+		Rational t = { l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator };
+		return t;
+    } // if
+} // ?+?
+
+Rational ?-?( Rational l, Rational r ) {
+    if ( l.denominator == r.denominator ) {				// special case
+		Rational t = { l.numerator - r.numerator, l.denominator };
+		return t;
+    } else {
+		Rational t = { l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator };
+		return t;
+    } // if
+} // ?-?
+
+Rational ?*?( Rational l, Rational r ) {
+    Rational t = { l.numerator * r.numerator, l.denominator * r.denominator };
+	return t;
+} // ?*?
+
+Rational ?/?( Rational l, Rational r ) {
+    if ( r.numerator < 0 ) {
+		r.numerator = -r.numerator;
+		r.denominator = -r.denominator;
+	} // if
+	Rational t = { l.numerator * r.denominator, l.denominator * r.numerator };
+    return t;
+} // ?/?
+
+
+// conversion
+
+double widen( Rational r ) {
+	return (double)r.numerator / (double)r.denominator;
+} // widen
+
+// https://rosettacode.org/wiki/Convert_decimal_number_to_rational#C
+Rational narrow( double f, long int md ) {
+	if ( md <= 1 ) {									// maximum fractional digits too small?
+		Rational t = rational( f, 1 );					// truncate fraction
+		return t;
+	} // if
+
+	// continued fraction coefficients
+	long int a, h[3] = { 0, 1, 0 }, k[3] = { 1, 0, 0 };
+	long int x, d, n = 1;
+	int i, neg = 0;
+ 
+	if ( f < 0 ) { neg = 1; f = -f; }
+	while ( f != floor( f ) ) { n <<= 1; f *= 2; }
+	d = f;
+ 
+	// continued fraction and check denominator each step
+	for (i = 0; i < 64; i++) {
+		a = n ? d / n : 0;
+	  if (i && !a) break;
+		x = d; d = n; n = x % n;
+		x = a;
+		if (k[1] * a + k[0] >= md) {
+			x = (md - k[0]) / k[1];
+		  if ( ! (x * 2 >= a || k[1] >= md) ) break;
+			i = 65;
+		} // if
+		h[2] = x * h[1] + h[0]; h[0] = h[1]; h[1] = h[2];
+		k[2] = x * k[1] + k[0]; k[0] = k[1]; k[1] = k[2];
+	} // for
+	Rational t = rational( neg ? -h[1] : h[1], k[1] );
+	return t;
+} // narrow
+
+
+// I/O
+
+forall( dtype istype | istream( istype ) )
+istype * ?|?( istype *is, Rational *r ) {
+	long int t;
+    is | &(r->numerator) | &(r->denominator);
+	t = simplify( &(r->numerator), &(r->denominator) );
+    r->numerator /= t;
+    r->denominator /= t;
+    return is;
+} // ?|?
+
+forall( dtype ostype | ostream( ostype ) )
+ostype * ?|?( ostype *os, Rational r ) {
+    return os | r.numerator | '/' | r.denominator;
+} // ?|?
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: src/libcfa/stdlib
===================================================================
--- src/libcfa/stdlib	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/stdlib	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:12:35 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb  5 15:21:18 2016
-// Update Count     : 61
+// Last Modified On : Wed Apr 13 14:45:53 2016
+// Update Count     : 85
 //
 
@@ -20,19 +20,39 @@
 } // extern "C"
 
-forall( type T ) T * memset( T * ptr, unsigned char fill ); // use default value '\0' for fill
-forall( type T ) T * memset( T * ptr );					// remove when default value available
+//---------------------------------------
 
-forall( type T ) T * malloc( void );
-forall( type T ) T * malloc( char fill );
-forall( type T ) T * malloc( size_t size );
-forall( type T ) T * malloc( T * ptr, size_t size );
-forall( type T ) T * malloc( T * ptr, size_t size, unsigned char fill );
-forall( type T ) T * calloc( size_t size );
-forall( type T ) T * realloc( T * ptr, size_t size );
-forall( type T ) T * realloc( T * ptr, size_t size, unsigned char fill );
+extern "C" {
+#ifndef EXIT_FAILURE
+#define	EXIT_FAILURE	1								// failing exit status
+#define	EXIT_SUCCESS	0								// successful exit status
+#endif // ! EXIT_FAILURE
+void exit( int rc );
+} // extern "C"
 
-forall( type T ) T * aligned_alloc( size_t alignment );
-forall( type T ) T * memalign( size_t alignment );		// deprecated
-forall( type T ) int posix_memalign( T ** ptr, size_t alignment );
+//---------------------------------------
+
+extern "C" {
+void * malloc( size_t );								// use default C routine for void *
+} // extern "C"
+forall( otype T ) T * malloc( void );
+forall( otype T ) T * malloc( char fill );
+forall( otype T ) T * malloc( T * ptr, size_t size );
+forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill );
+extern "C" {
+void * calloc( size_t nmemb, size_t size );				// use default C routine for void *
+} // extern "C"
+forall( otype T ) T * calloc( size_t nmemb );
+extern "C" {
+void * realloc( void * ptr, size_t size );				// use default C routine for void *
+} // extern "C"
+forall( otype T ) T * realloc( T * ptr, size_t size );
+forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill );
+
+forall( otype T ) T * aligned_alloc( size_t alignment );
+forall( otype T ) T * memalign( size_t alignment );		// deprecated
+forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
+
+forall( otype T ) T * memset( T * ptr, unsigned char fill ); // use default value '\0' for fill
+forall( otype T ) T * memset( T * ptr );				// remove when default value available
 
 //---------------------------------------
@@ -66,13 +86,13 @@
 //---------------------------------------
 
-forall( type T | { int ?<?( T, T ); } )
+forall( otype T | { int ?<?( T, T ); } )
 T * bsearch( const T key, const T * arr, size_t dimension );
 
-forall( type T | { int ?<?( T, T ); } )
+forall( otype T | { int ?<?( T, T ); } )
 void qsort( const T * arr, size_t dimension );
 
 //---------------------------------------
 
-forall( type T | { T ?/?( T, T ); T ?%?( T, T ); } )
+forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
 [ T, T ] div( T t1, T t2 );
 
@@ -81,6 +101,6 @@
 char abs( char );
 extern "C" {
-int abs( int );		// use default C routine for int
-} // extern
+int abs( int );											// use default C routine for int
+} // extern "C"
 long int abs( long int );
 long long int abs( long long int );
@@ -94,25 +114,39 @@
 //---------------------------------------
 
-void randseed( long int s );
-char random();
-int random();
-unsigned int random();
-long int random();
-unsigned long int random();
-float random();
-double random();
-float _Complex random();
-double _Complex random();
-long double _Complex random();
+float floor( float );
+extern "C" {
+double floor( double );									// use C routine for double
+} // extern "C"
+long double floor( long double );
+
+float ceil( float );
+extern "C" {
+double ceil( double );									// use C routine for double
+} // extern "C"
+long double ceil( long double );
 
 //---------------------------------------
 
-forall( type T | { int ?<?( T, T ); } )
+void rand48seed( long int s );
+char rand48();
+int rand48();
+unsigned int rand48();
+long int rand48();
+unsigned long int rand48();
+float rand48();
+double rand48();
+float _Complex rand48();
+double _Complex rand48();
+long double _Complex rand48();
+
+//---------------------------------------
+
+forall( otype T | { int ?<?( T, T ); } )
 T min( const T t1, const T t2 );
 
-forall( type T | { int ?>?( T, T ); } )
+forall( otype T | { int ?>?( T, T ); } )
 T max( const T t1, const T t2 );
 
-forall( type T )
+forall( otype T )
 void swap( T * t1, T * t2 );
 
Index: src/libcfa/stdlib.c
===================================================================
--- src/libcfa/stdlib.c	(revision c5833e8112dc702a276c3752677503416c1c0b38)
+++ src/libcfa/stdlib.c	(revision 0f9e4403ea9f501a7993ba07c5badb03d4c58742)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:10:29 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 10 15:45:56 2016
-// Update Count     : 140
+// Last Modified On : Wed Apr 13 14:49:58 2016
+// Update Count     : 155
 //
 
@@ -27,38 +27,25 @@
 } // extern "C"
 
-forall( type T ) T * memset( T * ptr, unsigned char fill ) { // use default value '\0' for fill
-	printf( "memset1\n" );
-    return (T *)memset( ptr, (int)fill, malloc_usable_size( ptr ) );
-} // memset
-forall( type T ) T * memset( T * ptr ) {				// remove when default value available
-	printf( "memset2\n" );
-    return (T *)memset( ptr, 0, malloc_usable_size( ptr ) );
-} // memset
-
-forall( type T ) T * malloc( void ) {
-	printf( "malloc1\n" );
+forall( otype T ) T * malloc( void ) {
+	//printf( "malloc1\n" );
     return (T *)malloc( sizeof(T) );
 } // malloc
-forall( type T ) T * malloc( size_t size ) {
-	printf( "malloc2\n" );
-    return (T *)(void *)malloc( size );
-} // malloc
-forall( type T ) T * malloc( char fill ) {
-	printf( "malloc3\n" );
+forall( otype T ) T * malloc( char fill ) {
+	//printf( "malloc3\n" );
 	T * ptr = (T *)malloc( sizeof(T) );
     return memset( ptr );
 } // malloc
 
-forall( type T ) T * calloc( size_t size ) {
-	printf( "calloc\n" );
-    return (T *)calloc( size, sizeof(T) );
+forall( otype T ) T * calloc( size_t nmemb ) {
+	//printf( "calloc\n" );
+    return (T *)calloc( nmemb, sizeof(T) );
 } // calloc
 
-forall( type T ) T * realloc( T * ptr, size_t size ) {
-	printf( "realloc1\n" );
+forall( otype T ) T * realloc( T * ptr, size_t size ) {
+	//printf( "realloc1\n" );
     return (T *)(void *)realloc( (void *)ptr, size );
 } // realloc
-forall( type T ) T * realloc( T * ptr, size_t size, unsigned char fill ) {
-	printf( "realloc2\n" );
+forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill ) {
+	//printf( "realloc2\n" );
     char * nptr = (T *)(void *)realloc( (void *)ptr, size );
     size_t unused = malloc_usable_size( nptr );
@@ -67,27 +54,36 @@
 } // realloc
 
-forall( type T ) T * malloc( T * ptr, size_t size ) {
-	printf( "malloc4\n" );
+forall( otype T ) T * malloc( T * ptr, size_t size ) {
+	//printf( "malloc4\n" );
     return (T *)realloc( ptr, size );
 } // malloc
-forall( type T ) T * malloc( T * ptr, size_t size, unsigned char fill ) {
-	printf( "malloc5\n" );
+forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill ) {
+	//printf( "malloc5\n" );
     return (T *)realloc( ptr, size, fill );
 } // malloc
 
-forall( type T ) T * aligned_alloc( size_t alignment ) {
-	printf( "aligned_alloc\n" );
+forall( otype T ) T * aligned_alloc( size_t alignment ) {
+	//printf( "aligned_alloc\n" );
     return (T *)memalign( alignment, sizeof(T) );
 } // aligned_alloc
 
-forall( type T ) T * memalign( size_t alignment ) {
-	printf( "memalign\n" );
+forall( otype T ) T * memalign( size_t alignment ) {
+	//printf( "memalign\n" );
     return (T *)memalign( alignment, sizeof(T) );
 } // memalign
 
-forall( type T ) int posix_memalign( T ** ptr, size_t alignment ) {
-	printf( "posix_memalign\n" );
+forall( otype T ) int posix_memalign( T ** ptr, size_t alignment ) {
+	//printf( "posix_memalign\n" );
     return posix_memalign( (void **)ptr, alignment, sizeof(T) );
 } // posix_memalign
+
+forall( otype T ) T * memset( T * ptr, unsigned char fill ) { // use default value '\0' for fill
+	//printf( "memset1\n" );
+    return (T *)memset( ptr, (int)fill, malloc_usable_size( ptr ) );
+} // memset
+forall( otype T ) T * memset( T * ptr ) {				// remove when default value available
+	//printf( "memset2\n" );
+    return (T *)memset( ptr, 0, malloc_usable_size( ptr ) );
+} // memset
 
 //---------------------------------------
@@ -123,4 +119,5 @@
 	return ulli;
 }
+
 float ato( const char * ptr ) {
 	float f;
@@ -138,4 +135,5 @@
 	return ld;
 }
+
 float _Complex ato( const char * ptr ) {
 	float re, im;
@@ -172,4 +170,5 @@
 	return strtoull( sptr, eptr, base );
 }
+
 float strto( const char * sptr, char ** eptr ) {
 	return strtof( sptr, eptr );
@@ -181,4 +180,5 @@
 	return strtold( sptr, eptr );
 }
+
 float _Complex strto( const char * sptr, char ** eptr ) {
 	float re, im;
@@ -208,5 +208,5 @@
 //---------------------------------------
 
-forall( type T | { int ?<?( T, T ); } )
+forall( otype T | { int ?<?( T, T ); } )
 T * bsearch( const T key, const T * arr, size_t dimension ) {
 	int comp( const void * t1, const void * t2 ) { return *(T *)t1 < *(T *)t2 ? -1 : *(T *)t2 < *(T *)t1 ? 1 : 0; }
@@ -214,5 +214,5 @@
 } // bsearch
 
-forall( type T | { int ?<?( T, T ); } )
+forall( otype T | { int ?<?( T, T ); } )
 void qsort( const T * arr, size_t dimension ) {
 	int comp( const void * t1, const void * t2 ) { return *(T *)t1 < *(T *)t2 ? -1 : *(T *)t2 < *(T *)t1 ? 1 : 0; }
@@ -222,5 +222,5 @@
 //---------------------------------------
 
-forall( type T | { T ?/?( T, T ); T ?%?( T, T ); } )
+forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
 [ T, T ] div( T t1, T t2 ) { /* return [ t1 / t2, t1 % t2 ]; */ }
 
@@ -239,29 +239,37 @@
 //---------------------------------------
 
-void randseed( long int s ) { srand48( s ); }
-char random() { return lrand48(); }
-int random() { return mrand48(); }
-unsigned int random() { return lrand48(); }
-long int random() { return mrand48(); }
-unsigned long int random() { return lrand48(); }
-float random() { return (float)drand48(); }				// otherwise float uses lrand48
-double random() { return drand48(); }
-float _Complex random() { return (float)drand48() + (float _Complex)(drand48() * _Complex_I); }
-double _Complex random() { return drand48() + (double _Complex)(drand48() * _Complex_I); }
-long double _Complex random() { return (long double)drand48() + (long double _Complex)(drand48() * _Complex_I); }
-
-//---------------------------------------
-
-forall( type T | { int ?<?( T, T ); } )
+float floor( float v ) { return floorf( v ); }
+long double floor( long double v ) { return floorl( v ); }
+
+float ceil( float v ) { return ceilf( v ); }
+long double ceil( long double v ) { return ceill( v ); }
+
+//---------------------------------------
+
+void rand48seed( long int s ) { srand48( s ); }
+char rand48() { return mrand48(); }
+int rand48() { return mrand48(); }
+unsigned int rand48() { return lrand48(); }
+long int rand48() { return mrand48(); }
+unsigned long int rand48() { return lrand48(); }
+float rand48() { return (float)drand48(); }				// otherwise float uses lrand48
+double rand48() { return drand48(); }
+float _Complex rand48() { return (float)drand48() + (float _Complex)(drand48() * _Complex_I); }
+double _Complex rand48() { return drand48() + (double _Complex)(drand48() * _Complex_I); }
+long double _Complex rand48() { return (long double)drand48() + (long double _Complex)(drand48() * _Complex_I); }
+
+//---------------------------------------
+
+forall( otype T | { int ?<?( T, T ); } )
 T min( const T t1, const T t2 ) {
 	return t1 < t2 ? t1 : t2;
 } // min
 
-forall( type T | { int ?>?( T, T ); } )
+forall( otype T | { int ?>?( T, T ); } )
 T max( const T t1, const T t2 ) {
 	return t1 > t2 ? t1 : t2;
 } // max
 
-forall( type T )
+forall( otype T )
 void swap( T * t1, T * t2 ) {
 	T temp = *t1;
